Title: [920] trunk/activerecord-jdbc: Fix problem with reserved words coming back pre-quoted from #indexes in postgres
Revision
920
Author
nicksieger
Date
2008-02-29 17:37:55 -0500 (Fri, 29 Feb 2008)

Log Message

Fix problem with reserved words coming back pre-quoted from #indexes in postgres

Modified Paths

Added Paths

Diff

Modified: trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_postgre.rb (919 => 920)


--- trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_postgre.rb	2008-02-29 21:33:56 UTC (rev 919)
+++ trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_postgre.rb	2008-02-29 22:37:55 UTC (rev 920)
@@ -177,7 +177,41 @@
       end
       @connection.columns_internal(table_name, name, schema_name)
     end
-    
+
+    # From postgresql_adapter.rb
+    def indexes(table_name, name = nil)
+      result = select_rows(<<-SQL, name)
+        SELECT i.relname, d.indisunique, a.attname
+          FROM pg_class t, pg_class i, pg_index d, pg_attribute a
+         WHERE i.relkind = 'i'
+           AND d.indexrelid = i.oid
+           AND d.indisprimary = 'f'
+           AND t.oid = d.indrelid
+           AND t.relname = '#{table_name}'
+           AND a.attrelid = t.oid
+           AND ( d.indkey[0]=a.attnum OR d.indkey[1]=a.attnum
+              OR d.indkey[2]=a.attnum OR d.indkey[3]=a.attnum
+              OR d.indkey[4]=a.attnum OR d.indkey[5]=a.attnum
+              OR d.indkey[6]=a.attnum OR d.indkey[7]=a.attnum
+              OR d.indkey[8]=a.attnum OR d.indkey[9]=a.attnum )
+        ORDER BY i.relname
+      SQL
+
+      current_index = nil
+      indexes = []
+
+      result.each do |row|
+        if current_index != row[0]
+          indexes << ::ActiveRecord::ConnectionAdapters::IndexDefinition.new(table_name, row[0], row[1] == "t", [])
+          current_index = row[0]
+        end
+
+        indexes.last.columns << row[2]
+      end
+
+      indexes
+    end
+
     def last_insert_id(table, sequence_name)
       Integer(select_value("SELECT currval('#{sequence_name}')"))
     end

Added: trunk/activerecord-jdbc/test/models/reserved_word.rb (0 => 920)


--- trunk/activerecord-jdbc/test/models/reserved_word.rb	                        (rev 0)
+++ trunk/activerecord-jdbc/test/models/reserved_word.rb	2008-02-29 22:37:55 UTC (rev 920)
@@ -0,0 +1,18 @@
+require 'rubygems'
+require 'active_record'
+
+class CreateReservedWords < ActiveRecord::Migration
+  def self.up
+    create_table "reserved_words", :force => true do |t|
+      t.column :position, :integer
+      t.column :select, :integer
+    end
+  end
+
+  def self.down
+    drop_table "reserved_words"
+  end
+end
+
+class ReservedWord < ActiveRecord::Base
+end
\ No newline at end of file

Added: trunk/activerecord-jdbc/test/postgres_reserved_test.rb (0 => 920)


--- trunk/activerecord-jdbc/test/postgres_reserved_test.rb	                        (rev 0)
+++ trunk/activerecord-jdbc/test/postgres_reserved_test.rb	2008-02-29 22:37:55 UTC (rev 920)
@@ -0,0 +1,22 @@
+require 'jdbc_common'
+require 'db/postgres'
+require 'models/reserved_word'
+
+class PostgresReservedWordsTest < Test::Unit::TestCase
+  def setup
+    CreateReservedWords.up
+  end
+  def teardown
+    CreateReservedWords.down
+  end
+
+  def test_quote_reserved_word_column
+    columns = ReservedWord.column_names - ["id"]
+    ReservedWord.connection.add_index :reserved_words, columns
+    indexes = ReservedWord.connection.indexes("reserved_words")
+    assert_equal 1, indexes.size
+    columns.each do |c|
+      assert indexes[0].columns.include?(c), "#{indexes[0].columns.inspect} does not include #{c.inspect}"
+    end
+  end
+end
\ No newline at end of file

Modified: trunk/activerecord-jdbc/test/simple.rb (919 => 920)


--- trunk/activerecord-jdbc/test/simple.rb	2008-02-29 21:33:56 UTC (rev 919)
+++ trunk/activerecord-jdbc/test/simple.rb	2008-02-29 22:37:55 UTC (rev 920)
@@ -87,7 +87,7 @@
         
       indexes = @connection.indexes(:entries)
       assert_equal(1, indexes.size)
-      assert_equal "entries", indexes.first.table
+      assert_equal "entries", indexes.first.table.to_s
       assert_equal index_name, indexes.first.name
       assert !indexes.first.unique
       assert_equal ["updated_on"], indexes.first.columns
_______________________________________________
Jruby-extras-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/jruby-extras-devel

Reply via email to