Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 8126

Show
Ignore:
Timestamp:
11/10/07 21:33:13 (10 months ago)
Author:
nzkoz
Message:

Ensure that column names are quoted. Closes #10134 [wesley.moxam]

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/activerecord/CHANGELOG

    r8120 r8126  
    11*SVN* 
     2 
     3* Ensure that column names are quoted.  Closes #10134 [wesley.moxam] 
    24 
    35* Smattering of grammatical fixes to documentation. Closes #10083 [BobSilva] 
  • trunk/activerecord/lib/active_record/associations.rb

    r8119 r8126  
    12481248        def construct_finder_sql_with_included_associations(options, join_dependency) 
    12491249          scope = scope(:find) 
    1250           sql = "SELECT #{column_aliases(join_dependency)} FROM #{(scope && scope[:from]) || options[:from] || table_name} " 
     1250          sql = "SELECT #{column_aliases(join_dependency)} FROM #{connection.quote_table_name((scope && scope[:from]) || options[:from] || table_name)} " 
    12511251          sql << join_dependency.join_associations.collect{|join| join.association_join }.join 
    12521252  
     
    12651265        def add_limited_ids_condition!(sql, options, join_dependency) 
    12661266          unless (id_list = select_limited_ids_list(options, join_dependency)).empty? 
    1267             sql << "#{condition_word(sql)} #{table_name}.#{primary_key} IN (#{id_list}) " 
     1267            sql << "#{condition_word(sql)} #{connection.quote_table_name table_name}.#{primary_key} IN (#{id_list}) " 
    12681268          else 
    12691269            throw :invalid_query 
     
    12851285          sql = "SELECT " 
    12861286          if is_distinct 
    1287             sql << connection.distinct("#{table_name}.#{primary_key}", options[:order]) 
     1287            sql << connection.distinct("#{connection.quote_table_name table_name}.#{primary_key}", options[:order]) 
    12881288          else 
    12891289            sql << primary_key 
    12901290          end 
    1291           sql << " FROM #{table_name} " 
     1291          sql << " FROM #{connection.quote_table_name table_name} " 
    12921292 
    12931293          if is_distinct 
     
    13411341        def column_aliases(join_dependency) 
    13421342          join_dependency.joins.collect{|join| join.column_names_with_alias.collect{|column_name, aliased_name| 
    1343               "#{join.aliased_table_name}.#{connection.quote_column_name column_name} AS #{aliased_name}"}}.flatten.join(", ") 
     1343              "#{connection.quote_table_name join.aliased_table_name}.#{connection.quote_column_name column_name} AS #{aliased_name}"}}.flatten.join(", ") 
    13441344        end 
    13451345 
     
    15941594 
    15951595            def association_join 
     1596              connection = reflection.active_record.connection 
    15961597              join = case reflection.macro 
    15971598                when :has_and_belongs_to_many 
    15981599                  " #{join_type} %s ON %s.%s = %s.%s " % [ 
    15991600                     table_alias_for(options[:join_table], aliased_join_table_name), 
    1600                      aliased_join_table_name
     1601                     connection.quote_table_name(aliased_join_table_name)
    16011602                     options[:foreign_key] || reflection.active_record.to_s.foreign_key, 
    1602                      parent.aliased_table_name, reflection.active_record.primary_key] + 
     1603                     connection.quote_table_name(parent.aliased_table_name), 
     1604                     reflection.active_record.primary_key] + 
    16031605                  " #{join_type} %s ON %s.%s = %s.%s " % [ 
    1604                      table_name_and_alias, aliased_table_name, klass.primary_key, 
    1605                      aliased_join_table_name, options[:association_foreign_key] || klass.to_s.foreign_key 
     1606                     table_name_and_alias, 
     1607                     connection.quote_table_name(aliased_table_name), 
     1608                     klass.primary_key, 
     1609                     connection.quote_table_name(aliased_join_table_name), 
     1610                     options[:association_foreign_key] || klass.to_s.foreign_key 
    16061611                     ] 
    16071612                when :has_many, :has_one 
     
    16161621                        jt_foreign_key = through_reflection.options[:as].to_s + '_id' 
    16171622                        jt_as_extra = " AND %s.%s = %s" % [ 
    1618                           aliased_join_table_name
    1619                           reflection.active_record.connection.quote_column_name(through_reflection.options[:as].to_s + '_type'), 
     1623                          connection.quote_table_name(aliased_join_table_name)
     1624                          connection.quote_column_name(through_reflection.options[:as].to_s + '_type'), 
    16201625                          klass.quote_value(parent.active_record.base_class.name) 
    16211626                        ] 
     
    16301635                          second_key  = options[:foreign_key] || primary_key  
    16311636                          as_extra    = " AND %s.%s = %s" % [ 
    1632                             aliased_table_name
    1633                             reflection.active_record.connection.quote_column_name("#{source_reflection.options[:as]}_type"),   
     1637                            connection.quote_table_name(aliased_table_name)
     1638                            connection.quote_column_name("#{source_reflection.options[:as]}_type"), 
    16341639                            klass.quote_value(source_reflection.active_record.base_class.name)  
    16351640                          ] 
     
    16411646                        unless through_reflection.klass.descends_from_active_record? 
    16421647                          jt_sti_extra = " AND %s.%s = %s" % [ 
    1643                             aliased_join_table_name
    1644                             reflection.active_record.connection.quote_column_name(through_reflection.active_record.inheritance_column), 
     1648                            connection.quote_table_name(aliased_join_table_name)
     1649                            connection.quote_column_name(through_reflection.active_record.inheritance_column), 
    16451650                            through_reflection.klass.quote_value(through_reflection.klass.name.demodulize)] 
    16461651                        end 
     
    16501655                          second_key = source_reflection.association_foreign_key 
    16511656                          jt_source_extra = " AND %s.%s = %s" % [ 
    1652                             aliased_join_table_name
    1653                             reflection.active_record.connection.quote_column_name(reflection.source_reflection.options[:foreign_type]), 
     1657                            connection.quote_table_name(aliased_join_table_name)
     1658                            connection.quote_column_name(reflection.source_reflection.options[:foreign_type]), 
    16541659                            klass.quote_value(reflection.options[:source_type]) 
    16551660                          ] 
     
    16611666                      " #{join_type} %s ON (%s.%s = %s.%s%s%s%s) " % [ 
    16621667                        table_alias_for(through_reflection.klass.table_name, aliased_join_table_name), 
    1663                         parent.aliased_table_name, reflection.active_record.connection.quote_column_name(parent.primary_key), 
    1664                         aliased_join_table_name, reflection.active_record.connection.quote_column_name(jt_foreign_key),  
     1668                        connection.quote_table_name(parent.aliased_table_name), 
     1669                        connection.quote_column_name(parent.primary_key), 
     1670                        connection.quote_table_name(aliased_join_table_name), 
     1671                        connection.quote_column_name(jt_foreign_key), 
    16651672                        jt_as_extra, jt_source_extra, jt_sti_extra 
    16661673                      ] + 
    16671674                      " #{join_type} %s ON (%s.%s = %s.%s%s) " % [ 
    16681675                        table_name_and_alias,  
    1669                         aliased_table_name, reflection.active_record.connection.quote_column_name(first_key), 
    1670                         aliased_join_table_name, reflection.active_record.connection.quote_column_name(second_key), 
     1676                        connection.quote_table_name(aliased_table_name), 
     1677                        connection.quote_column_name(first_key), 
     1678                        connection.quote_table_name(aliased_join_table_name), 
     1679                        connection.quote_column_name(second_key), 
    16711680                        as_extra 
    16721681                      ] 
     
    16751684                      " #{join_type} %s ON %s.%s = %s.%s AND %s.%s = %s" % [ 
    16761685                        table_name_and_alias, 
    1677                         aliased_table_name, "#{reflection.options[:as]}_id", 
    1678                         parent.aliased_table_name, parent.primary_key, 
    1679                         aliased_table_name, "#{reflection.options[:as]}_type", 
     1686                        connection.quote_table_name(aliased_table_name), 
     1687                        "#{reflection.options[:as]}_id", 
     1688                        connection.quote_table_name(parent.aliased_table_name), 
     1689                        parent.primary_key, 
     1690                        connection.quote_table_name(aliased_table_name), 
     1691                        "#{reflection.options[:as]}_type", 
    16801692                        klass.quote_value(parent.active_record.base_class.name) 
    16811693                      ] 
     
    16841696                      " #{join_type} %s ON %s.%s = %s.%s " % [ 
    16851697                        table_name_and_alias, 
    1686                         aliased_table_name, foreign_key, 
    1687                         parent.aliased_table_name, parent.primary_key 
     1698                        aliased_table_name, 
     1699                        foreign_key, 
     1700                        parent.aliased_table_name, 
     1701                        parent.primary_key 
    16881702                      ] 
    16891703                  end 
    16901704                when :belongs_to 
    16911705                  " #{join_type} %s ON %s.%s = %s.%s " % [ 
    1692                      table_name_and_alias, aliased_table_name, reflection.klass.primary_key, 
    1693                      parent.aliased_table_name, options[:foreign_key] || klass.to_s.foreign_key 
     1706                     table_name_and_alias, 
     1707                     connection.quote_table_name(aliased_table_name), 
     1708                     reflection.klass.primary_key, 
     1709                     connection.quote_table_name(parent.aliased_table_name), 
     1710                     options[:foreign_key] || klass.to_s.foreign_key 
    16941711                    ] 
    16951712                else 
     
    16971714              end || '' 
    16981715              join << %(AND %s.%s = %s ) % [ 
    1699                 aliased_table_name,  
    1700                 reflection.active_record.connection.quote_column_name(klass.inheritance_column),  
     1716                connection.quote_table_name(aliased_table_name), 
     1717                connection.quote_column_name(klass.inheritance_column), 
    17011718                klass.quote_value(klass.name.demodulize)] unless klass.descends_from_active_record? 
    17021719 
     
    17151732               
    17161733              def table_alias_for(table_name, table_alias) 
    1717                 "#{table_name} #{table_alias if table_name != table_alias}".strip 
     1734                "#{reflection.active_record.connection.quote_table_name(table_name)} #{table_alias if table_name != table_alias}".strip 
    17181735              end 
    17191736 
  • trunk/activerecord/test/associations/inner_join_association_test.rb

    r8109 r8126  
    1111  def test_construct_finder_sql_creates_inner_joins 
    1212    sql = Author.send(:construct_finder_sql, :joins => :posts) 
    13     assert_match /INNER JOIN posts ON posts.author_id = authors.id/, sql 
     13    assert_match /INNER JOIN `?posts`? ON `?posts`?.author_id = authors.id/, sql 
    1414  end 
    1515   
    1616  def test_construct_finder_sql_cascades_inner_joins 
    1717    sql = Author.send(:construct_finder_sql, :joins => {:posts => :comments}) 
    18     assert_match /INNER JOIN posts ON posts.author_id = authors.id/, sql 
    19     assert_match /INNER JOIN comments ON comments.post_id = posts.id/, sql 
     18    assert_match /INNER JOIN `?posts`? ON `?posts`?.author_id = authors.id/, sql 
     19    assert_match /INNER JOIN `?comments`? ON `?comments`?.post_id = posts.id/, sql 
    2020  end 
    2121   
    2222  def test_construct_finder_sql_inner_joins_through_associations 
    2323    sql = Author.send(:construct_finder_sql, :joins => :categorized_posts) 
    24     assert_match /INNER JOIN categorizations.*INNER JOIN posts/, sql 
     24    assert_match /INNER JOIN `?categorizations`?.*INNER JOIN `?posts`?/, sql 
    2525  end 
    2626   
    2727  def test_construct_finder_sql_applies_association_conditions 
    2828    sql = Author.send(:construct_finder_sql, :joins => :categories_like_general, :conditions => "TERMINATING_MARKER") 
    29     assert_match /INNER JOIN categories ON.*AND.*'General'.*TERMINATING_MARKER/, sql 
     29    assert_match /INNER JOIN `?categories`? ON.*AND.*`?General`?.*TERMINATING_MARKER/, sql 
    3030  end 
    3131 
     
    3333    sql = Author.send(:construct_finder_sql, :joins => {:posts => [[:comments]]}) 
    3434    assert_no_match /inner join.*inner join.*inner join/i, sql, "only two join clauses should be present" 
    35     assert_match /INNER JOIN posts ON posts.author_id = authors.id/, sql 
    36     assert_match /INNER JOIN comments ON comments.post_id = posts.id/, sql 
     35    assert_match /INNER JOIN `?posts`? ON `?posts`?.author_id = authors.id/, sql 
     36    assert_match /INNER JOIN `?comments`? ON `?comments`?.post_id = `?posts`?.id/, sql 
    3737  end 
    3838 
  • trunk/activerecord/test/reserved_word_test_mysql.rb

    r8061 r8126  
    148148  end 
    149149 
     150  def test_associations_work_with_reserved_words 
     151    assert_nothing_raised { Select.find(:all, :include => [:groups]) } 
     152  end 
     153 
    150154  #the following functions were added to DRY test cases 
    151155