sequel 4.45.0 → 4.46.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (173) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +108 -0
  3. data/doc/release_notes/4.46.0.txt +404 -0
  4. data/doc/security.rdoc +9 -0
  5. data/doc/sql.rdoc +2 -2
  6. data/doc/testing.rdoc +1 -1
  7. data/doc/validations.rdoc +1 -2
  8. data/lib/sequel/adapters/ado.rb +8 -3
  9. data/lib/sequel/adapters/ado/access.rb +8 -4
  10. data/lib/sequel/adapters/ado/mssql.rb +3 -1
  11. data/lib/sequel/adapters/amalgalite.rb +5 -0
  12. data/lib/sequel/adapters/cubrid.rb +16 -7
  13. data/lib/sequel/adapters/do.rb +7 -1
  14. data/lib/sequel/adapters/do/mysql.rb +8 -4
  15. data/lib/sequel/adapters/ibmdb.rb +10 -5
  16. data/lib/sequel/adapters/jdbc.rb +8 -2
  17. data/lib/sequel/adapters/jdbc/as400.rb +10 -3
  18. data/lib/sequel/adapters/jdbc/db2.rb +27 -16
  19. data/lib/sequel/adapters/jdbc/derby.rb +47 -20
  20. data/lib/sequel/adapters/jdbc/h2.rb +13 -7
  21. data/lib/sequel/adapters/jdbc/hsqldb.rb +18 -9
  22. data/lib/sequel/adapters/jdbc/mssql.rb +5 -2
  23. data/lib/sequel/adapters/jdbc/mysql.rb +3 -2
  24. data/lib/sequel/adapters/jdbc/oracle.rb +3 -2
  25. data/lib/sequel/adapters/jdbc/postgresql.rb +4 -3
  26. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +2 -1
  27. data/lib/sequel/adapters/jdbc/sqlite.rb +10 -3
  28. data/lib/sequel/adapters/jdbc/sqlserver.rb +23 -0
  29. data/lib/sequel/adapters/jdbc/transactions.rb +16 -10
  30. data/lib/sequel/adapters/mock.rb +5 -0
  31. data/lib/sequel/adapters/mysql.rb +8 -1
  32. data/lib/sequel/adapters/mysql2.rb +6 -1
  33. data/lib/sequel/adapters/odbc.rb +20 -8
  34. data/lib/sequel/adapters/odbc/mssql.rb +6 -3
  35. data/lib/sequel/adapters/oracle.rb +12 -6
  36. data/lib/sequel/adapters/postgres.rb +20 -8
  37. data/lib/sequel/adapters/shared/access.rb +76 -47
  38. data/lib/sequel/adapters/shared/cubrid.rb +16 -11
  39. data/lib/sequel/adapters/shared/db2.rb +46 -19
  40. data/lib/sequel/adapters/shared/firebird.rb +20 -8
  41. data/lib/sequel/adapters/shared/informix.rb +6 -3
  42. data/lib/sequel/adapters/shared/mssql.rb +132 -72
  43. data/lib/sequel/adapters/shared/mysql.rb +112 -65
  44. data/lib/sequel/adapters/shared/oracle.rb +36 -21
  45. data/lib/sequel/adapters/shared/postgres.rb +91 -56
  46. data/lib/sequel/adapters/shared/sqlanywhere.rb +65 -37
  47. data/lib/sequel/adapters/shared/sqlite.rb +67 -32
  48. data/lib/sequel/adapters/sqlanywhere.rb +9 -1
  49. data/lib/sequel/adapters/sqlite.rb +8 -1
  50. data/lib/sequel/adapters/swift.rb +5 -0
  51. data/lib/sequel/adapters/swift/mysql.rb +4 -2
  52. data/lib/sequel/adapters/swift/sqlite.rb +1 -1
  53. data/lib/sequel/adapters/tinytds.rb +10 -3
  54. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +1 -1
  55. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  56. data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -0
  57. data/lib/sequel/adapters/utils/pg_types.rb +14 -6
  58. data/lib/sequel/adapters/utils/replace.rb +4 -2
  59. data/lib/sequel/connection_pool/single.rb +2 -2
  60. data/lib/sequel/core.rb +24 -11
  61. data/lib/sequel/database/connecting.rb +9 -3
  62. data/lib/sequel/database/dataset_defaults.rb +7 -1
  63. data/lib/sequel/database/logging.rb +1 -0
  64. data/lib/sequel/database/misc.rb +5 -2
  65. data/lib/sequel/database/query.rb +7 -5
  66. data/lib/sequel/database/schema_generator.rb +1 -0
  67. data/lib/sequel/database/schema_methods.rb +50 -27
  68. data/lib/sequel/database/transactions.rb +19 -9
  69. data/lib/sequel/dataset/actions.rb +15 -6
  70. data/lib/sequel/dataset/graph.rb +15 -5
  71. data/lib/sequel/dataset/misc.rb +12 -4
  72. data/lib/sequel/dataset/mutation.rb +17 -8
  73. data/lib/sequel/dataset/prepared_statements.rb +3 -2
  74. data/lib/sequel/dataset/query.rb +84 -38
  75. data/lib/sequel/dataset/sql.rb +302 -191
  76. data/lib/sequel/deprecated.rb +26 -17
  77. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +2 -2
  78. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  79. data/lib/sequel/extensions/from_block.rb +1 -0
  80. data/lib/sequel/extensions/graph_each.rb +1 -1
  81. data/lib/sequel/extensions/identifier_mangling.rb +2 -2
  82. data/lib/sequel/extensions/migration.rb +28 -4
  83. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -0
  84. data/lib/sequel/extensions/schema_dumper.rb +4 -4
  85. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +5 -3
  86. data/lib/sequel/extensions/set_overrides.rb +2 -0
  87. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  88. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  89. data/lib/sequel/model.rb +11 -7
  90. data/lib/sequel/model/associations.rb +5 -7
  91. data/lib/sequel/model/base.rb +47 -45
  92. data/lib/sequel/model/dataset_module.rb +9 -14
  93. data/lib/sequel/model/plugins.rb +3 -0
  94. data/lib/sequel/no_core_ext.rb +1 -0
  95. data/lib/sequel/plugins/blacklist_security.rb +1 -1
  96. data/lib/sequel/plugins/boolean_subsets.rb +7 -5
  97. data/lib/sequel/plugins/class_table_inheritance.rb +47 -10
  98. data/lib/sequel/plugins/dataset_associations.rb +1 -1
  99. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  100. data/lib/sequel/plugins/finder.rb +240 -0
  101. data/lib/sequel/plugins/inverted_subsets.rb +19 -12
  102. data/lib/sequel/plugins/many_through_many.rb +1 -1
  103. data/lib/sequel/plugins/nested_attributes.rb +1 -1
  104. data/lib/sequel/plugins/schema.rb +1 -1
  105. data/lib/sequel/plugins/single_table_inheritance.rb +7 -1
  106. data/lib/sequel/plugins/subset_conditions.rb +11 -3
  107. data/lib/sequel/plugins/whitelist_security.rb +118 -0
  108. data/lib/sequel/sql.rb +80 -36
  109. data/lib/sequel/timezones.rb +2 -0
  110. data/lib/sequel/version.rb +1 -1
  111. data/spec/adapters/mssql_spec.rb +20 -0
  112. data/spec/adapters/mysql_spec.rb +1 -1
  113. data/spec/adapters/oracle_spec.rb +12 -8
  114. data/spec/adapters/postgres_spec.rb +1 -1
  115. data/spec/adapters/spec_helper.rb +1 -1
  116. data/spec/adapters/sqlite_spec.rb +36 -34
  117. data/spec/core/connection_pool_spec.rb +2 -1
  118. data/spec/core/database_spec.rb +87 -9
  119. data/spec/core/dataset_spec.rb +501 -129
  120. data/spec/core/deprecated_spec.rb +1 -1
  121. data/spec/core/expression_filters_spec.rb +146 -60
  122. data/spec/core/mock_adapter_spec.rb +1 -1
  123. data/spec/core/object_graph_spec.rb +61 -9
  124. data/spec/core/placeholder_literalizer_spec.rb +20 -2
  125. data/spec/core/schema_generator_spec.rb +6 -6
  126. data/spec/core/schema_spec.rb +54 -5
  127. data/spec/core_extensions_spec.rb +122 -18
  128. data/spec/deprecation_helper.rb +27 -2
  129. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +6 -6
  130. data/spec/extensions/association_proxies_spec.rb +2 -2
  131. data/spec/extensions/auto_literal_strings_spec.rb +212 -0
  132. data/spec/extensions/blacklist_security_spec.rb +1 -0
  133. data/spec/extensions/class_table_inheritance_spec.rb +1037 -39
  134. data/spec/extensions/column_select_spec.rb +20 -8
  135. data/spec/extensions/columns_introspection_spec.rb +3 -3
  136. data/spec/extensions/core_refinements_spec.rb +29 -12
  137. data/spec/extensions/dataset_associations_spec.rb +12 -12
  138. data/spec/extensions/def_dataset_method_spec.rb +100 -0
  139. data/spec/extensions/error_sql_spec.rb +1 -1
  140. data/spec/extensions/finder_spec.rb +260 -0
  141. data/spec/extensions/graph_each_spec.rb +2 -2
  142. data/spec/extensions/identifier_mangling_spec.rb +14 -8
  143. data/spec/extensions/inverted_subsets_spec.rb +4 -4
  144. data/spec/extensions/lazy_attributes_spec.rb +7 -0
  145. data/spec/extensions/many_through_many_spec.rb +38 -14
  146. data/spec/extensions/nested_attributes_spec.rb +18 -6
  147. data/spec/extensions/no_auto_literal_strings_spec.rb +1 -1
  148. data/spec/extensions/pg_enum_spec.rb +16 -1
  149. data/spec/extensions/pg_interval_spec.rb +11 -2
  150. data/spec/extensions/pg_loose_count_spec.rb +5 -0
  151. data/spec/extensions/pg_row_spec.rb +25 -0
  152. data/spec/extensions/prepared_statements_spec.rb +10 -1
  153. data/spec/extensions/query_spec.rb +2 -2
  154. data/spec/extensions/schema_dumper_spec.rb +2 -2
  155. data/spec/extensions/schema_spec.rb +2 -2
  156. data/spec/extensions/set_overrides_spec.rb +7 -3
  157. data/spec/extensions/sql_expr_spec.rb +0 -1
  158. data/spec/extensions/subset_conditions_spec.rb +6 -6
  159. data/spec/extensions/table_select_spec.rb +24 -12
  160. data/spec/extensions/to_dot_spec.rb +4 -4
  161. data/spec/extensions/whitelist_security_spec.rb +131 -0
  162. data/spec/integration/dataset_test.rb +9 -5
  163. data/spec/integration/model_test.rb +2 -0
  164. data/spec/integration/plugin_test.rb +2 -2
  165. data/spec/integration/spec_helper.rb +1 -1
  166. data/spec/model/associations_spec.rb +39 -11
  167. data/spec/model/base_spec.rb +44 -24
  168. data/spec/model/class_dataset_methods_spec.rb +18 -16
  169. data/spec/model/dataset_methods_spec.rb +4 -4
  170. data/spec/model/eager_loading_spec.rb +84 -24
  171. data/spec/model/model_spec.rb +97 -63
  172. data/spec/model/record_spec.rb +21 -13
  173. metadata +13 -2
@@ -40,10 +40,14 @@ module Sequel
40
40
  include UnmodifiedIdentifiers::DatabaseMethods
41
41
 
42
42
  AUTO_INCREMENT = 'AUTO_INCREMENT'.freeze
43
- CAST_TYPES = {String=>:CHAR, Integer=>:SIGNED, Time=>:DATETIME, DateTime=>:DATETIME, Numeric=>:DECIMAL, BigDecimal=>:DECIMAL, File=>:BINARY}
44
- COLUMN_DEFINITION_ORDER = [:collate, :null, :default, :unique, :primary_key, :auto_increment, :references]
43
+ Sequel::Deprecation.deprecate_constant(self, :AUTO_INCREMENT)
45
44
  PRIMARY = 'PRIMARY'.freeze
45
+ Sequel::Deprecation.deprecate_constant(self, :PRIMARY)
46
46
  MYSQL_TIMESTAMP_RE = /\ACURRENT_(?:DATE|TIMESTAMP)?\z/
47
+ Sequel::Deprecation.deprecate_constant(self, :MYSQL_TIMESTAMP_RE)
48
+
49
+ CAST_TYPES = {String=>:CHAR, Integer=>:SIGNED, Time=>:DATETIME, DateTime=>:DATETIME, Numeric=>:DECIMAL, BigDecimal=>:DECIMAL, File=>:BINARY}#.freeze # SEQUEL5
50
+ COLUMN_DEFINITION_ORDER = [:collate, :null, :default, :unique, :primary_key, :auto_increment, :references]#.freeze # SEQUEL5
47
51
 
48
52
  include Sequel::Database::SplitAlterTable
49
53
 
@@ -121,7 +125,7 @@ module Sequel
121
125
 
122
126
  metadata_dataset.with_sql(sql).each do |r|
123
127
  name = r[:Key_name]
124
- next if name == PRIMARY
128
+ next if name == 'PRIMARY'
125
129
  name = m.call(name)
126
130
  remove_indexes << name if r[:Sub_part] && ! opts[:partial]
127
131
  i = indexes[name] ||= {:columns=>[], :unique=>r[:Non_unique] != 1}
@@ -290,7 +294,7 @@ module Sequel
290
294
  # Handle MySQL specific default format.
291
295
  def column_schema_normalize_default(default, type)
292
296
  if column_schema_default_string_type?(type)
293
- return if [:date, :datetime, :time].include?(type) && MYSQL_TIMESTAMP_RE.match(default)
297
+ return if [:date, :datetime, :time].include?(type) && /\ACURRENT_(?:DATE|TIMESTAMP)?\z/.match(default)
294
298
  default = "'#{default.gsub("'", "''").gsub('\\', '\\\\')}'"
295
299
  end
296
300
  super(default, type)
@@ -327,7 +331,7 @@ module Sequel
327
331
 
328
332
  # Use MySQL specific AUTO_INCREMENT text.
329
333
  def auto_increment_sql
330
- AUTO_INCREMENT
334
+ 'AUTO_INCREMENT'
331
335
  end
332
336
 
333
337
  # MySQL needs to set transaction isolation before begining a transaction
@@ -576,55 +580,98 @@ module Sequel
576
580
  # Dataset methods shared by datasets that use MySQL databases.
577
581
  module DatasetMethods
578
582
  BOOL_TRUE = '1'.freeze
583
+ Sequel::Deprecation.deprecate_constant(self, :BOOL_TRUE)
579
584
  BOOL_FALSE = '0'.freeze
585
+ Sequel::Deprecation.deprecate_constant(self, :BOOL_FALSE)
580
586
  COMMA_SEPARATOR = ', '.freeze
587
+ Sequel::Deprecation.deprecate_constant(self, :COMMA_SEPARATOR)
581
588
  FOR_SHARE = ' LOCK IN SHARE MODE'.freeze
589
+ Sequel::Deprecation.deprecate_constant(self, :FOR_SHARE)
582
590
  SQL_CALC_FOUND_ROWS = ' SQL_CALC_FOUND_ROWS'.freeze
583
- APOS = Dataset::APOS
584
- APOS_RE = Dataset::APOS_RE
585
- DOUBLE_APOS = Dataset::DOUBLE_APOS
586
- SPACE = Dataset::SPACE
587
- PAREN_OPEN = Dataset::PAREN_OPEN
588
- PAREN_CLOSE = Dataset::PAREN_CLOSE
589
- NOT_SPACE = Dataset::NOT_SPACE
590
- FROM = Dataset::FROM
591
- COMMA = Dataset::COMMA
592
- LIMIT = Dataset::LIMIT
593
- GROUP_BY = Dataset::GROUP_BY
594
- ESCAPE = Dataset::ESCAPE
595
- BACKSLASH = Dataset::BACKSLASH
591
+ Sequel::Deprecation.deprecate_constant(self, :SQL_CALC_FOUND_ROWS)
592
+ APOS = "'".freeze
593
+ Sequel::Deprecation.deprecate_constant(self, :APOS)
594
+ APOS_RE = /'/.freeze
595
+ Sequel::Deprecation.deprecate_constant(self, :APOS_RE)
596
+ DOUBLE_APOS = "''".freeze
597
+ Sequel::Deprecation.deprecate_constant(self, :DOUBLE_APOS)
598
+ SPACE = ' '.freeze
599
+ Sequel::Deprecation.deprecate_constant(self, :SPACE)
600
+ PAREN_CLOSE = ')'.freeze
601
+ Sequel::Deprecation.deprecate_constant(self, :PAREN_CLOSE)
602
+ PAREN_OPEN = '('.freeze
603
+ Sequel::Deprecation.deprecate_constant(self, :PAREN_OPEN)
604
+ NOT_SPACE = 'NOT '.freeze
605
+ Sequel::Deprecation.deprecate_constant(self, :NOT_SPACE)
606
+ FROM = ' FROM '.freeze
607
+ Sequel::Deprecation.deprecate_constant(self, :FROM)
608
+ COMMA = ', '.freeze
609
+ Sequel::Deprecation.deprecate_constant(self, :COMMA)
610
+ LIMIT = " LIMIT ".freeze
611
+ Sequel::Deprecation.deprecate_constant(self, :LIMIT)
612
+ GROUP_BY = " GROUP BY ".freeze
613
+ Sequel::Deprecation.deprecate_constant(self, :GROUP_BY)
614
+ ESCAPE = " ESCAPE ".freeze
615
+ Sequel::Deprecation.deprecate_constant(self, :ESCAPE)
616
+ BACKSLASH = "\\".freeze
617
+ Sequel::Deprecation.deprecate_constant(self, :BACKSLASH)
596
618
  REGEXP = 'REGEXP'.freeze
619
+ Sequel::Deprecation.deprecate_constant(self, :REGEXP)
597
620
  LIKE = 'LIKE'.freeze
621
+ Sequel::Deprecation.deprecate_constant(self, :LIKE)
598
622
  BINARY = 'BINARY '.freeze
623
+ Sequel::Deprecation.deprecate_constant(self, :BINARY)
599
624
  CONCAT = "CONCAT".freeze
625
+ Sequel::Deprecation.deprecate_constant(self, :CONCAT)
600
626
  CAST_BITCOMP_OPEN = "CAST(~".freeze
627
+ Sequel::Deprecation.deprecate_constant(self, :CAST_BITCOMP_OPEN)
601
628
  CAST_BITCOMP_CLOSE = " AS SIGNED INTEGER)".freeze
629
+ Sequel::Deprecation.deprecate_constant(self, :CAST_BITCOMP_CLOSE)
602
630
  STRAIGHT_JOIN = 'STRAIGHT_JOIN'.freeze
631
+ Sequel::Deprecation.deprecate_constant(self, :STRAIGHT_JOIN)
603
632
  NATURAL_LEFT_JOIN = 'NATURAL LEFT JOIN'.freeze
633
+ Sequel::Deprecation.deprecate_constant(self, :NATURAL_LEFT_JOIN)
604
634
  BACKTICK = '`'.freeze
635
+ Sequel::Deprecation.deprecate_constant(self, :BACKTICK)
605
636
  BACKTICK_RE = /`/.freeze
637
+ Sequel::Deprecation.deprecate_constant(self, :BACKTICK_RE)
606
638
  DOUBLE_BACKTICK = '``'.freeze
639
+ Sequel::Deprecation.deprecate_constant(self, :DOUBLE_BACKTICK)
607
640
  EMPTY_COLUMNS = " ()".freeze
641
+ Sequel::Deprecation.deprecate_constant(self, :EMPTY_COLUMNS)
608
642
  EMPTY_VALUES = " VALUES ()".freeze
643
+ Sequel::Deprecation.deprecate_constant(self, :EMPTY_VALUES)
609
644
  IGNORE = " IGNORE".freeze
645
+ Sequel::Deprecation.deprecate_constant(self, :IGNORE)
610
646
  ON_DUPLICATE_KEY_UPDATE = " ON DUPLICATE KEY UPDATE ".freeze
647
+ Sequel::Deprecation.deprecate_constant(self, :ON_DUPLICATE_KEY_UPDATE)
611
648
  EQ_VALUES = '=VALUES('.freeze
649
+ Sequel::Deprecation.deprecate_constant(self, :EQ_VALUES)
612
650
  EQ = '='.freeze
651
+ Sequel::Deprecation.deprecate_constant(self, :EQ)
613
652
  WITH_ROLLUP = ' WITH ROLLUP'.freeze
614
- MATCH_AGAINST = ["(MATCH ".freeze, " AGAINST (".freeze, "))".freeze].freeze
615
- MATCH_AGAINST_BOOLEAN = ["(MATCH ".freeze, " AGAINST (".freeze, " IN BOOLEAN MODE))".freeze].freeze
653
+ Sequel::Deprecation.deprecate_constant(self, :WITH_ROLLUP)
616
654
  EXPLAIN = 'EXPLAIN '.freeze
655
+ Sequel::Deprecation.deprecate_constant(self, :EXPLAIN)
617
656
  EXPLAIN_EXTENDED = 'EXPLAIN EXTENDED '.freeze
657
+ Sequel::Deprecation.deprecate_constant(self, :EXPLAIN_EXTENDED)
618
658
  BACKSLASH_RE = /\\/.freeze
659
+ Sequel::Deprecation.deprecate_constant(self, :BACKSLASH_RE)
619
660
  QUAD_BACKSLASH = "\\\\\\\\".freeze
661
+ Sequel::Deprecation.deprecate_constant(self, :QUAD_BACKSLASH)
620
662
  BLOB_START = "0x".freeze
663
+ Sequel::Deprecation.deprecate_constant(self, :BLOB_START)
621
664
  EMPTY_BLOB = "''".freeze
665
+ Sequel::Deprecation.deprecate_constant(self, :EMPTY_BLOB)
622
666
  HSTAR = "H*".freeze
667
+ Sequel::Deprecation.deprecate_constant(self, :HSTAR)
623
668
  CURRENT_TIMESTAMP_56 = 'CURRENT_TIMESTAMP(6)'.freeze
624
-
625
- # Comes directly from MySQL's documentation, used for queries with limits without offsets
669
+ Sequel::Deprecation.deprecate_constant(self, :CURRENT_TIMESTAMP_56)
626
670
  ONLY_OFFSET = ",18446744073709551615".freeze
671
+ Sequel::Deprecation.deprecate_constant(self, :ONLY_OFFSET)
627
672
 
673
+ MATCH_AGAINST = ["MATCH ".freeze, " AGAINST (".freeze, ")".freeze].freeze
674
+ MATCH_AGAINST_BOOLEAN = ["MATCH ".freeze, " AGAINST (".freeze, " IN BOOLEAN MODE)".freeze].freeze
628
675
  NON_SQL_OPTIONS = (Dataset::NON_SQL_OPTIONS + [:insert_ignore, :update_ignore, :on_duplicate_key_update]).freeze
629
676
 
630
677
  Dataset.def_sql_method(self, :delete, %w'delete from where order limit')
@@ -640,37 +687,37 @@ module Sequel
640
687
  def complex_expression_sql_append(sql, op, args)
641
688
  case op
642
689
  when :IN, :"NOT IN"
643
- ds = args.at(1)
690
+ ds = args[1]
644
691
  if ds.is_a?(Sequel::Dataset) && ds.opts[:limit]
645
- super(sql, op, [args.at(0), ds.from_self])
692
+ super(sql, op, [args[0], ds.from_self])
646
693
  else
647
694
  super
648
695
  end
649
696
  when :~, :'!~', :'~*', :'!~*', :LIKE, :'NOT LIKE', :ILIKE, :'NOT ILIKE'
650
- sql << PAREN_OPEN
651
- literal_append(sql, args.at(0))
652
- sql << SPACE
697
+ sql << '('
698
+ literal_append(sql, args[0])
699
+ sql << ' '
653
700
  sql << 'NOT ' if [:'NOT LIKE', :'NOT ILIKE', :'!~', :'!~*'].include?(op)
654
- sql << ([:~, :'!~', :'~*', :'!~*'].include?(op) ? REGEXP : LIKE)
655
- sql << SPACE
656
- sql << BINARY if [:~, :'!~', :LIKE, :'NOT LIKE'].include?(op)
657
- literal_append(sql, args.at(1))
701
+ sql << ([:~, :'!~', :'~*', :'!~*'].include?(op) ? 'REGEXP' : 'LIKE')
702
+ sql << ' '
703
+ sql << 'BINARY ' if [:~, :'!~', :LIKE, :'NOT LIKE'].include?(op)
704
+ literal_append(sql, args[1])
658
705
  if [:LIKE, :'NOT LIKE', :ILIKE, :'NOT ILIKE'].include?(op)
659
- sql << ESCAPE
660
- literal_append(sql, BACKSLASH)
706
+ sql << " ESCAPE "
707
+ literal_append(sql, "\\")
661
708
  end
662
- sql << PAREN_CLOSE
709
+ sql << ')'
663
710
  when :'||'
664
711
  if args.length > 1
665
- sql << CONCAT
712
+ sql << "CONCAT"
666
713
  array_sql_append(sql, args)
667
714
  else
668
- literal_append(sql, args.at(0))
715
+ literal_append(sql, args[0])
669
716
  end
670
717
  when :'B~'
671
- sql << CAST_BITCOMP_OPEN
672
- literal_append(sql, args.at(0))
673
- sql << CAST_BITCOMP_CLOSE
718
+ sql << "CAST(~"
719
+ literal_append(sql, args[0])
720
+ sql << " AS SIGNED INTEGER)"
674
721
  else
675
722
  super
676
723
  end
@@ -682,7 +729,7 @@ module Sequel
682
729
  # fractional seconds.
683
730
  def constant_sql_append(sql, constant)
684
731
  if constant == :CURRENT_TIMESTAMP && supports_timestamp_usecs?
685
- sql << CURRENT_TIMESTAMP_56
732
+ sql << 'CURRENT_TIMESTAMP(6)'
686
733
  else
687
734
  super
688
735
  end
@@ -719,7 +766,7 @@ module Sequel
719
766
  # Load the PrettyTable class, needed for explain output
720
767
  Sequel.extension(:_pretty_table) unless defined?(Sequel::PrettyTable)
721
768
 
722
- ds = db.send(:metadata_dataset).with_sql((opts[:extended] ? EXPLAIN_EXTENDED : EXPLAIN) + select_sql).naked
769
+ ds = db.send(:metadata_dataset).with_sql((opts[:extended] ? 'EXPLAIN EXTENDED ' : 'EXPLAIN ') + select_sql).naked
723
770
  rows = ds.all
724
771
  Sequel::PrettyTable.string(rows, ds.columns)
725
772
  end
@@ -753,9 +800,9 @@ module Sequel
753
800
  def join_type_sql(join_type)
754
801
  case join_type
755
802
  when :straight
756
- STRAIGHT_JOIN
803
+ 'STRAIGHT_JOIN'
757
804
  when :natural_inner
758
- NATURAL_LEFT_JOIN
805
+ 'NATURAL LEFT JOIN'
759
806
  else
760
807
  super
761
808
  end
@@ -808,7 +855,7 @@ module Sequel
808
855
 
809
856
  # MySQL uses the nonstandard ` (backtick) for quoting identifiers.
810
857
  def quoted_identifier_append(sql, c)
811
- sql << BACKTICK << c.to_s.gsub(BACKTICK_RE, DOUBLE_BACKTICK) << BACKTICK
858
+ sql << '`' << c.to_s.gsub('`', '``') << '`'
812
859
  end
813
860
 
814
861
  # MySQL does not support derived column lists
@@ -881,10 +928,10 @@ module Sequel
881
928
  # from, but include the others for the purposes of selecting rows.
882
929
  def delete_from_sql(sql)
883
930
  if joined_dataset?
884
- sql << SPACE
931
+ sql << ' '
885
932
  tables = @opts[:delete_from] || @opts[:from][0..0]
886
933
  source_list_append(sql, tables)
887
- sql << FROM
934
+ sql << ' FROM '
888
935
  source_list_append(sql, @opts[:from])
889
936
  select_join_sql(sql)
890
937
  else
@@ -896,7 +943,7 @@ module Sequel
896
943
  def insert_columns_sql(sql)
897
944
  values = opts[:values]
898
945
  if values.is_a?(Array) && values.empty?
899
- sql << EMPTY_COLUMNS
946
+ sql << " ()"
900
947
  else
901
948
  super
902
949
  end
@@ -904,12 +951,12 @@ module Sequel
904
951
 
905
952
  # MySQL supports INSERT IGNORE INTO
906
953
  def insert_ignore_sql(sql)
907
- sql << IGNORE if opts[:insert_ignore]
954
+ sql << " IGNORE" if opts[:insert_ignore]
908
955
  end
909
956
 
910
957
  # MySQL supports UPDATE IGNORE
911
958
  def update_ignore_sql(sql)
912
- sql << IGNORE if opts[:update_ignore]
959
+ sql << " IGNORE" if opts[:update_ignore]
913
960
  end
914
961
 
915
962
  # MySQL supports INSERT ... ON DUPLICATE KEY UPDATE
@@ -924,11 +971,11 @@ module Sequel
924
971
  update_cols = update_cols[0..-2]
925
972
  end
926
973
 
927
- sql << ON_DUPLICATE_KEY_UPDATE
974
+ sql << " ON DUPLICATE KEY UPDATE "
928
975
  c = false
929
- co = COMMA
930
- values = EQ_VALUES
931
- endp = PAREN_CLOSE
976
+ co = ', '
977
+ values = '=VALUES('
978
+ endp = ')'
932
979
  update_cols.each do |col|
933
980
  sql << co if c
934
981
  quote_identifier_append(sql, col)
@@ -938,7 +985,7 @@ module Sequel
938
985
  c ||= true
939
986
  end
940
987
  if update_vals
941
- eq = EQ
988
+ eq = '='
942
989
  update_vals.map do |col,v|
943
990
  sql << co if c
944
991
  quote_identifier_append(sql, col)
@@ -954,7 +1001,7 @@ module Sequel
954
1001
  def insert_values_sql(sql)
955
1002
  values = opts[:values]
956
1003
  if values.is_a?(Array) && values.empty?
957
- sql << EMPTY_VALUES
1004
+ sql << " VALUES ()"
958
1005
  else
959
1006
  super
960
1007
  end
@@ -963,7 +1010,7 @@ module Sequel
963
1010
  # MySQL allows a LIMIT in DELETE and UPDATE statements.
964
1011
  def limit_sql(sql)
965
1012
  if l = @opts[:limit]
966
- sql << LIMIT
1013
+ sql << " LIMIT "
967
1014
  literal_append(sql, l)
968
1015
  end
969
1016
  end
@@ -973,15 +1020,15 @@ module Sequel
973
1020
  # MySQL uses a preceding X for hex escaping strings
974
1021
  def literal_blob_append(sql, v)
975
1022
  if v.empty?
976
- sql << EMPTY_BLOB
1023
+ sql << "''"
977
1024
  else
978
- sql << BLOB_START << v.unpack(HSTAR).first
1025
+ sql << "0x" << v.unpack("H*").first
979
1026
  end
980
1027
  end
981
1028
 
982
1029
  # Use 0 for false on MySQL
983
1030
  def literal_false
984
- BOOL_FALSE
1031
+ '0'
985
1032
  end
986
1033
 
987
1034
  # Raise error for infinitate and NaN values
@@ -995,12 +1042,12 @@ module Sequel
995
1042
 
996
1043
  # SQL fragment for String. Doubles \ and ' by default.
997
1044
  def literal_string_append(sql, v)
998
- sql << APOS << v.gsub(BACKSLASH_RE, QUAD_BACKSLASH).gsub(APOS_RE, DOUBLE_APOS) << APOS
1045
+ sql << "'" << v.gsub("\\", "\\\\\\\\").gsub("'", "''") << "'"
999
1046
  end
1000
1047
 
1001
1048
  # Use 1 for true on MySQL
1002
1049
  def literal_true
1003
- BOOL_TRUE
1050
+ '1'
1004
1051
  end
1005
1052
 
1006
1053
  # MySQL supports multiple rows in INSERT.
@@ -1014,19 +1061,19 @@ module Sequel
1014
1061
  end
1015
1062
 
1016
1063
  def select_only_offset_sql(sql)
1017
- sql << LIMIT
1064
+ sql << " LIMIT "
1018
1065
  literal_append(sql, @opts[:offset])
1019
- sql << ONLY_OFFSET
1066
+ sql << ",18446744073709551615"
1020
1067
  end
1021
1068
 
1022
1069
  # Support FOR SHARE locking when using the :share lock style.
1023
1070
  def select_lock_sql(sql)
1024
- @opts[:lock] == :share ? (sql << FOR_SHARE) : super
1071
+ @opts[:lock] == :share ? (sql << ' LOCK IN SHARE MODE') : super
1025
1072
  end
1026
1073
 
1027
1074
  # MySQL specific SQL_CALC_FOUND_ROWS option
1028
1075
  def select_calc_found_rows_sql(sql)
1029
- sql << SQL_CALC_FOUND_ROWS if opts[:calc_found_rows]
1076
+ sql << ' SQL_CALC_FOUND_ROWS' if opts[:calc_found_rows]
1030
1077
  end
1031
1078
 
1032
1079
  # MySQL uses WITH ROLLUP syntax.
@@ -15,7 +15,9 @@ module Sequel
15
15
 
16
16
  module DatabaseMethods
17
17
  TEMPORARY = 'GLOBAL TEMPORARY '.freeze
18
+ Sequel::Deprecation.deprecate_constant(self, :TEMPORARY)
18
19
  AUTOINCREMENT = ''.freeze
20
+ Sequel::Deprecation.deprecate_constant(self, :AUTOINCREMENT)
19
21
 
20
22
  attr_accessor :autosequence
21
23
 
@@ -86,7 +88,7 @@ module Sequel
86
88
  false
87
89
  end
88
90
 
89
- IGNORE_OWNERS = %w'APEX_040000 CTXSYS EXFSYS MDSYS OLAPSYS ORDDATA ORDSYS SYS SYSTEM XDB XDBMETADATA XDBPM XFILES WMSYS'
91
+ IGNORE_OWNERS = %w'APEX_040000 CTXSYS EXFSYS MDSYS OLAPSYS ORDDATA ORDSYS SYS SYSTEM XDB XDBMETADATA XDBPM XFILES WMSYS'#.freeze # SEQUEL5
90
92
 
91
93
  def tables(opts=OPTS)
92
94
  m = output_identifier_meth
@@ -174,7 +176,7 @@ module Sequel
174
176
  end
175
177
 
176
178
  def auto_increment_sql
177
- AUTOINCREMENT
179
+ ''
178
180
  end
179
181
 
180
182
  def create_sequence_sql(name, opts=OPTS)
@@ -251,7 +253,7 @@ module Sequel
251
253
  TRANSACTION_ISOLATION_LEVELS = {:uncommitted=>'READ COMMITTED'.freeze,
252
254
  :committed=>'READ COMMITTED'.freeze,
253
255
  :repeatable=>'SERIALIZABLE'.freeze,
254
- :serializable=>'SERIALIZABLE'.freeze}
256
+ :serializable=>'SERIALIZABLE'.freeze}#.freeze # SEQUEL5
255
257
  # Oracle doesn't support READ UNCOMMITTED OR REPEATABLE READ transaction
256
258
  # isolation levels, so upgrade to the next highest level in those cases.
257
259
  def set_transaction_isolation_sql(level)
@@ -302,7 +304,7 @@ module Sequel
302
304
 
303
305
  # SQL fragment for showing a table is temporary
304
306
  def temporary_table_sql
305
- TEMPORARY
307
+ 'GLOBAL TEMPORARY '
306
308
  end
307
309
 
308
310
  # Oracle uses clob for text types.
@@ -318,19 +320,32 @@ module Sequel
318
320
 
319
321
  module DatasetMethods
320
322
  ROW_NUMBER_EXPRESSION = LiteralString.new('ROWNUM').freeze
321
- SPACE = Dataset::SPACE
322
- APOS = Dataset::APOS
323
- APOS_RE = Dataset::APOS_RE
324
- DOUBLE_APOS = Dataset::DOUBLE_APOS
325
- FROM = Dataset::FROM
323
+ BITAND_PROC = lambda{|a, b| Sequel.lit(["CAST(BITAND(", ", ", ") AS INTEGER)"], a, b)}
324
+
325
+ SPACE = ' '.freeze
326
+ Sequel::Deprecation.deprecate_constant(self, :SPACE)
327
+ APOS = "'".freeze
328
+ Sequel::Deprecation.deprecate_constant(self, :APOS)
329
+ APOS_RE = /'/.freeze
330
+ Sequel::Deprecation.deprecate_constant(self, :APOS_RE)
331
+ DOUBLE_APOS = "''".freeze
332
+ Sequel::Deprecation.deprecate_constant(self, :DOUBLE_APOS)
333
+ FROM = ' FROM '.freeze
334
+ Sequel::Deprecation.deprecate_constant(self, :FROM)
326
335
  TIMESTAMP_FORMAT = "TIMESTAMP '%Y-%m-%d %H:%M:%S%N %z'".freeze
336
+ Sequel::Deprecation.deprecate_constant(self, :TIMESTAMP_FORMAT)
327
337
  TIMESTAMP_OFFSET_FORMAT = "%+03i:%02i".freeze
338
+ Sequel::Deprecation.deprecate_constant(self, :TIMESTAMP_OFFSET_FORMAT)
328
339
  BOOL_FALSE = "'N'".freeze
340
+ Sequel::Deprecation.deprecate_constant(self, :BOOL_FALSE)
329
341
  BOOL_TRUE = "'Y'".freeze
342
+ Sequel::Deprecation.deprecate_constant(self, :BOOL_TRUE)
330
343
  HSTAR = "H*".freeze
344
+ Sequel::Deprecation.deprecate_constant(self, :HSTAR)
331
345
  DUAL = ' FROM DUAL'.freeze
332
- BITAND_PROC = lambda{|a, b| Sequel.lit(["CAST(BITAND(", ", ", ") AS INTEGER)"], a, b)}
346
+ Sequel::Deprecation.deprecate_constant(self, :DUAL)
333
347
  SKIP_LOCKED = " SKIP LOCKED".freeze
348
+ Sequel::Deprecation.deprecate_constant(self, :SKIP_LOCKED)
334
349
 
335
350
  include(Module.new do
336
351
  Dataset.def_sql_method(self, :select, %w'with select distinct columns from join where group having compounds order lock')
@@ -354,9 +369,9 @@ module Sequel
354
369
  sql << 'NOT '
355
370
  end
356
371
  sql << 'REGEXP_LIKE('
357
- literal_append(sql, args.at(0))
372
+ literal_append(sql, args[0])
358
373
  sql << ','
359
- literal_append(sql, args.at(1))
374
+ literal_append(sql, args[1])
360
375
  if op == :'~*' || op == :'!~*'
361
376
  sql << ", 'i'"
362
377
  end
@@ -530,17 +545,17 @@ module Sequel
530
545
  # the use of AS anywhere, so this disables it in all cases.
531
546
  def as_sql_append(sql, aliaz, column_aliases=nil)
532
547
  raise Error, "oracle does not support derived column lists" if column_aliases
533
- sql << SPACE
548
+ sql << ' '
534
549
  quote_identifier_append(sql, aliaz)
535
550
  end
536
551
 
537
552
  # The strftime format to use when literalizing the time.
538
553
  def default_timestamp_format
539
- TIMESTAMP_FORMAT
554
+ "TIMESTAMP '%Y-%m-%d %H:%M:%S%N %z'"
540
555
  end
541
556
 
542
557
  def empty_from_sql
543
- DUAL
558
+ ' FROM DUAL'
544
559
  end
545
560
 
546
561
  # There is no function on Microsoft SQL Server that does character length
@@ -575,7 +590,7 @@ module Sequel
575
590
 
576
591
  # Use a colon for the timestamp offset, since Oracle appears to require it.
577
592
  def format_timestamp_offset(hour, minute)
578
- sprintf(TIMESTAMP_OFFSET_FORMAT, hour, minute)
593
+ sprintf("%+03i:%02i", hour, minute)
579
594
  end
580
595
 
581
596
  # Oracle doesn't support empty values when inserting.
@@ -585,22 +600,22 @@ module Sequel
585
600
 
586
601
  # Use string in hex format for blob data.
587
602
  def literal_blob_append(sql, v)
588
- sql << APOS << v.unpack(HSTAR).first << APOS
603
+ sql << "'" << v.unpack("H*").first << "'"
589
604
  end
590
605
 
591
606
  # Oracle uses 'N' for false values.
592
607
  def literal_false
593
- BOOL_FALSE
608
+ "'N'"
594
609
  end
595
610
 
596
611
  # Oracle uses the SQL standard of only doubling ' inside strings.
597
612
  def literal_string_append(sql, v)
598
- sql << APOS << v.gsub(APOS_RE, DOUBLE_APOS) << APOS
613
+ sql << "'" << v.gsub("'", "''") << "'"
599
614
  end
600
615
 
601
616
  # Oracle uses 'Y' for true values.
602
617
  def literal_true
603
- BOOL_TRUE
618
+ "'Y'"
604
619
  end
605
620
 
606
621
  # Oracle can insert multiple rows using a UNION
@@ -613,7 +628,7 @@ module Sequel
613
628
  super
614
629
 
615
630
  if @opts[:skip_locked]
616
- sql << SKIP_LOCKED
631
+ sql << " SKIP LOCKED"
617
632
  end
618
633
  end
619
634