From 9073cef8669b9f43dbeb83e306be3445d62566f8 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Fri, 12 Jan 2007 05:44:28 +0000 Subject: SQLServer: handle [quoted] table names. Closes #6635. git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@5891 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activerecord/CHANGELOG | 2 ++ .../connection_adapters/sqlserver_adapter.rb | 1 + .../fixtures/db_definitions/sqlserver.drop.sql | 1 + .../test/fixtures/db_definitions/sqlserver.sql | 8 ++++++++ activerecord/test/table_name_test_sqlserver.rb | 23 ++++++++++++++++++++++ 5 files changed, 35 insertions(+) create mode 100644 activerecord/test/table_name_test_sqlserver.rb (limited to 'activerecord') diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index 513179931a..0291d96a72 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* SQLServer: handle [quoted] table names. #6635 [rrich] + * acts_as_nested_set works with single-table inheritance. #6030 [Josh Susser] * PostgreSQL: use a subselect to correctly perform eager finds with :limit and :order. #4668 [eventualbuddha] diff --git a/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb b/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb index 3ecf26f530..b234239781 100644 --- a/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb @@ -257,6 +257,7 @@ module ActiveRecord return [] if table_name.blank? table_name = table_name.to_s if table_name.is_a?(Symbol) table_name = table_name.split('.')[-1] unless table_name.nil? + table_name = table_name.gsub(/[\[\]]/, '') sql = %Q{ SELECT cols.COLUMN_NAME as ColName, diff --git a/activerecord/test/fixtures/db_definitions/sqlserver.drop.sql b/activerecord/test/fixtures/db_definitions/sqlserver.drop.sql index b157d7c0a7..e8327f0826 100644 --- a/activerecord/test/fixtures/db_definitions/sqlserver.drop.sql +++ b/activerecord/test/fixtures/db_definitions/sqlserver.drop.sql @@ -30,3 +30,4 @@ DROP TABLE fk_test_has_pk; DROP TABLE keyboards; DROP TABLE legacy_things; DROP TABLE numeric_data; +DROP TABLE [order]; diff --git a/activerecord/test/fixtures/db_definitions/sqlserver.sql b/activerecord/test/fixtures/db_definitions/sqlserver.sql index 7b6f1d7afd..50e1938d0a 100644 --- a/activerecord/test/fixtures/db_definitions/sqlserver.sql +++ b/activerecord/test/fixtures/db_definitions/sqlserver.sql @@ -228,3 +228,11 @@ CREATE TABLE numeric_data ( my_house_population decimal(2), decimal_number_with_default decimal(3,2) DEFAULT 2.78 ); + +CREATE TABLE [order] ( + id int NOT NULL IDENTITY(1, 1) PRIMARY KEY, + color varchar(255), + fruit_size varchar(255), + texture varchar(255), + flavor varchar(255) +); diff --git a/activerecord/test/table_name_test_sqlserver.rb b/activerecord/test/table_name_test_sqlserver.rb new file mode 100644 index 0000000000..c2d1711599 --- /dev/null +++ b/activerecord/test/table_name_test_sqlserver.rb @@ -0,0 +1,23 @@ +require 'abstract_unit' +require "#{File.dirname(__FILE__)}/../lib/active_record/schema" + +if ActiveRecord::Base.connection.supports_migrations? + class Order < ActiveRecord::Base + self.table_name = '[order]' + end + + class TableNameTest < Test::Unit::TestCase + self.use_transactional_fixtures = false + + # Ensures Model.columns works when using SQLServer escape characters. + # Enables legacy schemas using SQL reserved words as table names. + # Should work with table names with spaces as well ('table name'). + def test_escaped_table_name + assert_nothing_raised do + ActiveRecord::Base.connection.select_all 'SELECT * FROM [order]' + end + assert_equal '[order]', Order.table_name + assert_equal 5, Order.columns.length + end + end +end -- cgit v1.2.3