@@ -562,7 +562,7 @@ def default_tablespace
562
562
def column_definitions ( table_name )
563
563
( owner , desc_table_name ) = @connection . describe ( table_name )
564
564
565
- select_all ( <<~SQL . squish , "SCHEMA" )
565
+ select_all ( <<~SQL . squish , "SCHEMA" , [ bind_string ( "owner" , owner ) , bind_string ( "table_name" , desc_table_name ) ] )
566
566
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ cols.column_name AS name, cols.data_type AS sql_type,
567
567
cols.data_default, cols.nullable, cols.virtual_column, cols.hidden_column,
568
568
cols.data_type_owner AS sql_type_owner,
@@ -575,8 +575,8 @@ def column_definitions(table_name)
575
575
DECODE(data_type, 'NUMBER', data_scale, NULL) AS scale,
576
576
comments.comments as column_comment
577
577
FROM all_tab_cols cols, all_col_comments comments
578
- WHERE cols.owner = ' #{ owner } '
579
- AND cols.table_name = #{ quote ( desc_table_name ) }
578
+ WHERE cols.owner = : owner
579
+ AND cols.table_name = :table_name
580
580
AND cols.hidden_column = 'NO'
581
581
AND cols.owner = comments.owner
582
582
AND cols.table_name = comments.table_name
@@ -594,19 +594,19 @@ def clear_table_columns_cache(table_name)
594
594
def pk_and_sequence_for ( table_name , owner = nil , desc_table_name = nil ) #:nodoc:
595
595
( owner , desc_table_name ) = @connection . describe ( table_name )
596
596
597
- seqs = select_values ( <<~SQL . squish , "SCHEMA" )
597
+ seqs = select_values_forcing_binds ( <<~SQL . squish , "SCHEMA" , [ bind_string ( "owner" , owner ) , bind_string ( "sequence_name" , default_sequence_name ( desc_table_name ) ) ] )
598
598
select /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ us.sequence_name
599
599
from all_sequences us
600
- where us.sequence_owner = ' #{ owner } '
601
- and us.sequence_name = upper(#{ quote ( default_sequence_name ( desc_table_name ) ) } )
600
+ where us.sequence_owner = : owner
601
+ and us.sequence_name = upper(:sequence_name )
602
602
SQL
603
603
604
604
# changed back from user_constraints to all_constraints for consistency
605
- pks = select_values ( <<~SQL . squish , "SCHEMA" )
605
+ pks = select_values_forcing_binds ( <<~SQL . squish , "SCHEMA" , [ bind_string ( "owner" , owner ) , bind_string ( "table_name" , desc_table_name ) ] )
606
606
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ cc.column_name
607
607
FROM all_constraints c, all_cons_columns cc
608
- WHERE c.owner = ' #{ owner } '
609
- AND c.table_name = #{ quote ( desc_table_name ) }
608
+ WHERE c.owner = : owner
609
+ AND c.table_name = :table_name
610
610
AND c.constraint_type = 'P'
611
611
AND cc.owner = c.owner
612
612
AND cc.constraint_name = c.constraint_name
@@ -636,7 +636,7 @@ def has_primary_key?(table_name, owner = nil, desc_table_name = nil) #:nodoc:
636
636
def primary_keys ( table_name ) # :nodoc:
637
637
( _owner , desc_table_name ) = @connection . describe ( table_name )
638
638
639
- pks = select_values ( <<~SQL . squish , "SCHEMA" , [ bind_string ( "table_name" , desc_table_name ) ] )
639
+ pks = select_values_forcing_binds ( <<~SQL . squish , "SCHEMA" , [ bind_string ( "table_name" , desc_table_name ) ] )
640
640
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ cc.column_name
641
641
FROM all_constraints c, all_cons_columns cc
642
642
WHERE c.owner = SYS_CONTEXT('userenv', 'current_schema')
@@ -666,7 +666,7 @@ def columns_for_distinct(columns, orders) #:nodoc:
666
666
end
667
667
668
668
def temporary_table? ( table_name ) #:nodoc:
669
- select_value ( <<~SQL . squish , "SCHEMA" , [ bind_string ( "table_name" , table_name . upcase ) ] ) == "Y"
669
+ select_value_forcing_binds ( <<~SQL . squish , "SCHEMA" , [ bind_string ( "table_name" , table_name . upcase ) ] ) == "Y"
670
670
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */
671
671
temporary FROM all_tables WHERE table_name = :table_name and owner = SYS_CONTEXT('userenv', 'current_schema')
672
672
SQL
@@ -764,6 +764,22 @@ def bind_string(name, value)
764
764
ActiveRecord ::Relation ::QueryAttribute . new ( name , value , Type ::OracleEnhanced ::String . new )
765
765
end
766
766
767
+ # call select_values using binds even if surrounding SQL preparation/execution is done + # with conn.unprepared_statement (like AR.to_sql)
768
+ def select_values_forcing_binds ( arel , name , binds )
769
+ # remove possible force of unprepared SQL during dictionary access
770
+ unprepared_statement_forced = prepared_statements_disabled_cache . include? ( object_id )
771
+ prepared_statements_disabled_cache . delete ( object_id ) if unprepared_statement_forced
772
+
773
+ select_values ( arel , name , binds )
774
+ ensure
775
+ # Restore unprepared_statement setting for surrounding SQL
776
+ prepared_statements_disabled_cache . add ( object_id ) if unprepared_statement_forced
777
+ end
778
+
779
+ def select_value_forcing_binds ( arel , name , binds )
780
+ single_value_from_rows ( select_values_forcing_binds ( arel , name , binds ) )
781
+ end
782
+
767
783
ActiveRecord ::Type . register ( :boolean , Type ::OracleEnhanced ::Boolean , adapter : :oracleenhanced )
768
784
ActiveRecord ::Type . register ( :json , Type ::OracleEnhanced ::Json , adapter : :oracleenhanced )
769
785
end
0 commit comments