sequel 4.41.0 → 4.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +98 -0
  3. data/README.rdoc +23 -10
  4. data/doc/active_record.rdoc +4 -4
  5. data/doc/advanced_associations.rdoc +2 -2
  6. data/doc/association_basics.rdoc +5 -2
  7. data/doc/cheat_sheet.rdoc +3 -3
  8. data/doc/core_extensions.rdoc +2 -2
  9. data/doc/dataset_basics.rdoc +4 -4
  10. data/doc/dataset_filtering.rdoc +1 -1
  11. data/doc/migration.rdoc +19 -1
  12. data/doc/prepared_statements.rdoc +2 -2
  13. data/doc/release_notes/4.42.0.txt +221 -0
  14. data/doc/testing.rdoc +3 -1
  15. data/lib/sequel/adapters/ado/access.rb +0 -1
  16. data/lib/sequel/adapters/ado/mssql.rb +0 -1
  17. data/lib/sequel/adapters/do/mysql.rb +0 -1
  18. data/lib/sequel/adapters/do/postgres.rb +0 -1
  19. data/lib/sequel/adapters/do/sqlite3.rb +0 -1
  20. data/lib/sequel/adapters/ibmdb.rb +21 -25
  21. data/lib/sequel/adapters/jdbc.rb +8 -16
  22. data/lib/sequel/adapters/jdbc/as400.rb +0 -1
  23. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -1
  24. data/lib/sequel/adapters/jdbc/db2.rb +0 -1
  25. data/lib/sequel/adapters/jdbc/derby.rb +0 -1
  26. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -1
  27. data/lib/sequel/adapters/jdbc/h2.rb +0 -1
  28. data/lib/sequel/adapters/jdbc/hsqldb.rb +0 -1
  29. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -1
  30. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -1
  31. data/lib/sequel/adapters/jdbc/jtds.rb +0 -1
  32. data/lib/sequel/adapters/jdbc/mssql.rb +0 -1
  33. data/lib/sequel/adapters/jdbc/mysql.rb +0 -1
  34. data/lib/sequel/adapters/jdbc/oracle.rb +0 -1
  35. data/lib/sequel/adapters/jdbc/postgresql.rb +0 -13
  36. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +0 -1
  37. data/lib/sequel/adapters/jdbc/sqlite.rb +0 -1
  38. data/lib/sequel/adapters/jdbc/sqlserver.rb +3 -4
  39. data/lib/sequel/adapters/mock.rb +54 -12
  40. data/lib/sequel/adapters/mysql.rb +1 -1
  41. data/lib/sequel/adapters/mysql2.rb +11 -17
  42. data/lib/sequel/adapters/odbc/mssql.rb +0 -1
  43. data/lib/sequel/adapters/oracle.rb +8 -20
  44. data/lib/sequel/adapters/postgres.rb +11 -29
  45. data/lib/sequel/adapters/shared/access.rb +5 -12
  46. data/lib/sequel/adapters/shared/cubrid.rb +4 -13
  47. data/lib/sequel/adapters/shared/db2.rb +4 -2
  48. data/lib/sequel/adapters/shared/firebird.rb +2 -4
  49. data/lib/sequel/adapters/shared/informix.rb +4 -2
  50. data/lib/sequel/adapters/shared/mssql.rb +3 -5
  51. data/lib/sequel/adapters/shared/mysql.rb +4 -14
  52. data/lib/sequel/adapters/shared/oracle.rb +1 -3
  53. data/lib/sequel/adapters/shared/postgres.rb +16 -38
  54. data/lib/sequel/adapters/shared/progress.rb +0 -2
  55. data/lib/sequel/adapters/shared/sqlanywhere.rb +0 -2
  56. data/lib/sequel/adapters/shared/sqlite.rb +20 -16
  57. data/lib/sequel/adapters/sqlite.rb +8 -20
  58. data/lib/sequel/adapters/swift/mysql.rb +0 -1
  59. data/lib/sequel/adapters/swift/postgres.rb +0 -1
  60. data/lib/sequel/adapters/swift/sqlite.rb +0 -1
  61. data/lib/sequel/adapters/tinytds.rb +4 -12
  62. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +1 -1
  63. data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -2
  64. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +11 -34
  65. data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
  66. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +26 -0
  67. data/lib/sequel/ast_transformer.rb +2 -2
  68. data/lib/sequel/database/dataset.rb +1 -1
  69. data/lib/sequel/database/dataset_defaults.rb +0 -66
  70. data/lib/sequel/database/features.rb +6 -0
  71. data/lib/sequel/database/misc.rb +31 -17
  72. data/lib/sequel/database/query.rb +7 -4
  73. data/lib/sequel/database/schema_methods.rb +1 -1
  74. data/lib/sequel/dataset.rb +8 -8
  75. data/lib/sequel/dataset/actions.rb +140 -46
  76. data/lib/sequel/dataset/features.rb +1 -5
  77. data/lib/sequel/dataset/graph.rb +7 -8
  78. data/lib/sequel/dataset/misc.rb +127 -56
  79. data/lib/sequel/dataset/mutation.rb +9 -20
  80. data/lib/sequel/dataset/placeholder_literalizer.rb +10 -1
  81. data/lib/sequel/dataset/prepared_statements.rb +102 -46
  82. data/lib/sequel/dataset/query.rb +155 -72
  83. data/lib/sequel/dataset/sql.rb +26 -9
  84. data/lib/sequel/extensions/columns_introspection.rb +3 -1
  85. data/lib/sequel/extensions/core_extensions.rb +5 -5
  86. data/lib/sequel/extensions/core_refinements.rb +5 -5
  87. data/lib/sequel/extensions/duplicate_columns_handler.rb +4 -2
  88. data/lib/sequel/extensions/freeze_datasets.rb +69 -0
  89. data/lib/sequel/extensions/identifier_mangling.rb +196 -0
  90. data/lib/sequel/extensions/looser_typecasting.rb +11 -7
  91. data/lib/sequel/extensions/migration.rb +1 -1
  92. data/lib/sequel/extensions/null_dataset.rb +5 -2
  93. data/lib/sequel/extensions/pagination.rb +42 -23
  94. data/lib/sequel/extensions/pg_enum.rb +3 -3
  95. data/lib/sequel/extensions/query.rb +3 -3
  96. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +15 -8
  97. data/lib/sequel/model/associations.rb +25 -8
  98. data/lib/sequel/model/base.rb +88 -29
  99. data/lib/sequel/model/dataset_module.rb +37 -0
  100. data/lib/sequel/plugins/association_pks.rb +4 -4
  101. data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
  102. data/lib/sequel/plugins/constraint_validations.rb +1 -2
  103. data/lib/sequel/plugins/csv_serializer.rb +2 -2
  104. data/lib/sequel/plugins/dataset_associations.rb +8 -8
  105. data/lib/sequel/plugins/eager_each.rb +2 -2
  106. data/lib/sequel/plugins/instance_filters.rb +1 -1
  107. data/lib/sequel/plugins/json_serializer.rb +2 -2
  108. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  109. data/lib/sequel/plugins/list.rb +4 -4
  110. data/lib/sequel/plugins/prepared_statements.rb +2 -4
  111. data/lib/sequel/plugins/prepared_statements_associations.rb +1 -3
  112. data/lib/sequel/plugins/prepared_statements_with_pk.rb +1 -1
  113. data/lib/sequel/plugins/rcte_tree.rb +13 -13
  114. data/lib/sequel/plugins/sharding.rb +1 -1
  115. data/lib/sequel/plugins/single_table_inheritance.rb +9 -4
  116. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  117. data/lib/sequel/plugins/validation_class_methods.rb +1 -1
  118. data/lib/sequel/plugins/validation_helpers.rb +1 -1
  119. data/lib/sequel/plugins/xml_serializer.rb +2 -2
  120. data/lib/sequel/sql.rb +69 -36
  121. data/lib/sequel/version.rb +1 -1
  122. data/spec/adapters/db2_spec.rb +10 -0
  123. data/spec/adapters/firebird_spec.rb +1 -1
  124. data/spec/adapters/mssql_spec.rb +4 -5
  125. data/spec/adapters/mysql_spec.rb +9 -9
  126. data/spec/adapters/postgres_spec.rb +67 -68
  127. data/spec/adapters/spec_helper.rb +6 -1
  128. data/spec/adapters/sqlite_spec.rb +29 -15
  129. data/spec/core/connection_pool_spec.rb +14 -14
  130. data/spec/core/database_spec.rb +38 -180
  131. data/spec/core/dataset_mutation_spec.rb +253 -0
  132. data/spec/core/dataset_spec.rb +394 -537
  133. data/spec/core/expression_filters_spec.rb +34 -32
  134. data/spec/core/mock_adapter_spec.rb +27 -35
  135. data/spec/core/placeholder_literalizer_spec.rb +2 -4
  136. data/spec/core/schema_generator_spec.rb +4 -4
  137. data/spec/core/schema_spec.rb +1 -2
  138. data/spec/core_extensions_spec.rb +22 -29
  139. data/spec/extensions/active_model_spec.rb +6 -6
  140. data/spec/extensions/association_dependencies_spec.rb +2 -2
  141. data/spec/extensions/blacklist_security_spec.rb +3 -3
  142. data/spec/extensions/boolean_readers_spec.rb +12 -12
  143. data/spec/extensions/caching_spec.rb +13 -10
  144. data/spec/extensions/class_table_inheritance_spec.rb +38 -43
  145. data/spec/extensions/column_conflicts_spec.rb +1 -3
  146. data/spec/extensions/columns_introspection_spec.rb +2 -3
  147. data/spec/extensions/composition_spec.rb +5 -3
  148. data/spec/extensions/constraint_validations_plugin_spec.rb +5 -5
  149. data/spec/extensions/constraint_validations_spec.rb +14 -8
  150. data/spec/extensions/core_refinements_spec.rb +22 -29
  151. data/spec/extensions/csv_serializer_spec.rb +7 -6
  152. data/spec/extensions/date_arithmetic_spec.rb +15 -15
  153. data/spec/extensions/defaults_setter_spec.rb +2 -2
  154. data/spec/extensions/delay_add_association_spec.rb +1 -1
  155. data/spec/extensions/dirty_spec.rb +19 -10
  156. data/spec/extensions/duplicate_columns_handler_spec.rb +12 -18
  157. data/spec/extensions/eager_each_spec.rb +12 -16
  158. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  159. data/spec/extensions/eval_inspect_spec.rb +4 -3
  160. data/spec/extensions/force_encoding_spec.rb +12 -12
  161. data/spec/extensions/freeze_datasets_spec.rb +31 -0
  162. data/spec/extensions/graph_each_spec.rb +6 -18
  163. data/spec/extensions/hook_class_methods_spec.rb +7 -7
  164. data/spec/extensions/identifier_mangling_spec.rb +307 -0
  165. data/spec/extensions/instance_filters_spec.rb +5 -6
  166. data/spec/extensions/instance_hooks_spec.rb +12 -12
  167. data/spec/extensions/json_serializer_spec.rb +12 -15
  168. data/spec/extensions/lazy_attributes_spec.rb +4 -4
  169. data/spec/extensions/list_spec.rb +19 -21
  170. data/spec/extensions/many_through_many_spec.rb +108 -163
  171. data/spec/extensions/meta_def_spec.rb +7 -2
  172. data/spec/extensions/migration_spec.rb +10 -12
  173. data/spec/extensions/mssql_optimistic_locking_spec.rb +4 -3
  174. data/spec/extensions/named_timezones_spec.rb +4 -3
  175. data/spec/extensions/nested_attributes_spec.rb +2 -2
  176. data/spec/extensions/null_dataset_spec.rb +17 -12
  177. data/spec/extensions/optimistic_locking_spec.rb +4 -5
  178. data/spec/extensions/pagination_spec.rb +8 -10
  179. data/spec/extensions/pg_array_associations_spec.rb +28 -27
  180. data/spec/extensions/pg_array_ops_spec.rb +2 -1
  181. data/spec/extensions/pg_array_spec.rb +6 -2
  182. data/spec/extensions/pg_enum_spec.rb +5 -3
  183. data/spec/extensions/pg_hstore_ops_spec.rb +3 -1
  184. data/spec/extensions/pg_hstore_spec.rb +7 -6
  185. data/spec/extensions/pg_inet_ops_spec.rb +2 -1
  186. data/spec/extensions/pg_inet_spec.rb +2 -1
  187. data/spec/extensions/pg_interval_spec.rb +2 -1
  188. data/spec/extensions/pg_json_ops_spec.rb +2 -1
  189. data/spec/extensions/pg_json_spec.rb +6 -3
  190. data/spec/extensions/pg_loose_count_spec.rb +1 -0
  191. data/spec/extensions/pg_range_ops_spec.rb +3 -1
  192. data/spec/extensions/pg_range_spec.rb +9 -5
  193. data/spec/extensions/pg_row_ops_spec.rb +2 -1
  194. data/spec/extensions/pg_row_plugin_spec.rb +4 -6
  195. data/spec/extensions/pg_row_spec.rb +5 -3
  196. data/spec/extensions/pg_static_cache_updater_spec.rb +2 -1
  197. data/spec/extensions/pg_typecast_on_load_spec.rb +1 -1
  198. data/spec/extensions/prepared_statements_associations_spec.rb +1 -1
  199. data/spec/extensions/prepared_statements_spec.rb +12 -11
  200. data/spec/extensions/pretty_table_spec.rb +1 -1
  201. data/spec/extensions/query_spec.rb +8 -5
  202. data/spec/extensions/rcte_tree_spec.rb +39 -39
  203. data/spec/extensions/round_timestamps_spec.rb +2 -2
  204. data/spec/extensions/schema_dumper_spec.rb +3 -2
  205. data/spec/extensions/schema_spec.rb +2 -2
  206. data/spec/extensions/scissors_spec.rb +1 -2
  207. data/spec/extensions/sequel_3_dataset_methods_spec.rb +30 -17
  208. data/spec/extensions/serialization_modification_detection_spec.rb +2 -2
  209. data/spec/extensions/serialization_spec.rb +15 -13
  210. data/spec/extensions/set_overrides_spec.rb +14 -8
  211. data/spec/extensions/sharding_spec.rb +9 -18
  212. data/spec/extensions/shared_caching_spec.rb +3 -4
  213. data/spec/extensions/single_table_inheritance_spec.rb +11 -11
  214. data/spec/extensions/skip_create_refresh_spec.rb +2 -1
  215. data/spec/extensions/spec_helper.rb +1 -1
  216. data/spec/extensions/split_values_spec.rb +2 -2
  217. data/spec/extensions/sql_comments_spec.rb +6 -0
  218. data/spec/extensions/static_cache_spec.rb +7 -9
  219. data/spec/extensions/string_agg_spec.rb +30 -29
  220. data/spec/extensions/tactical_eager_loading_spec.rb +4 -5
  221. data/spec/extensions/thread_local_timezones_spec.rb +2 -2
  222. data/spec/extensions/timestamps_spec.rb +28 -3
  223. data/spec/extensions/to_dot_spec.rb +1 -2
  224. data/spec/extensions/tree_spec.rb +33 -29
  225. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  226. data/spec/extensions/unlimited_update_spec.rb +1 -0
  227. data/spec/extensions/update_primary_key_spec.rb +11 -7
  228. data/spec/extensions/update_refresh_spec.rb +1 -1
  229. data/spec/extensions/uuid_spec.rb +0 -1
  230. data/spec/extensions/validate_associated_spec.rb +1 -1
  231. data/spec/extensions/validation_class_methods_spec.rb +10 -10
  232. data/spec/extensions/validation_helpers_spec.rb +10 -10
  233. data/spec/extensions/xml_serializer_spec.rb +7 -3
  234. data/spec/integration/associations_test.rb +31 -31
  235. data/spec/integration/dataset_test.rb +17 -19
  236. data/spec/integration/eager_loader_test.rb +24 -24
  237. data/spec/integration/model_test.rb +6 -6
  238. data/spec/integration/plugin_test.rb +43 -43
  239. data/spec/integration/prepared_statement_test.rb +6 -6
  240. data/spec/integration/schema_test.rb +63 -52
  241. data/spec/integration/spec_helper.rb +6 -1
  242. data/spec/integration/transaction_test.rb +13 -13
  243. data/spec/model/association_reflection_spec.rb +17 -17
  244. data/spec/model/associations_spec.rb +101 -96
  245. data/spec/model/base_spec.rb +175 -49
  246. data/spec/model/class_dataset_methods_spec.rb +5 -9
  247. data/spec/model/dataset_methods_spec.rb +5 -5
  248. data/spec/model/eager_loading_spec.rb +209 -235
  249. data/spec/model/hooks_spec.rb +15 -15
  250. data/spec/model/model_spec.rb +28 -21
  251. data/spec/model/plugins_spec.rb +4 -5
  252. data/spec/model/record_spec.rb +59 -57
  253. data/spec/model/spec_helper.rb +1 -1
  254. data/spec/model/validations_spec.rb +6 -6
  255. data/spec/spec_config.rb +1 -1
  256. metadata +10 -2
@@ -3,8 +3,6 @@
3
3
  module Sequel
4
4
  module Progress
5
5
  module DatabaseMethods
6
- extend Sequel::Database::ResetIdentifierMangling
7
-
8
6
  # Progress uses the :progress database type.
9
7
  def database_type
10
8
  :progress
@@ -13,8 +13,6 @@ module Sequel
13
13
  end
14
14
 
15
15
  module DatabaseMethods
16
- extend Sequel::Database::ResetIdentifierMangling
17
-
18
16
  attr_reader :conversion_procs
19
17
 
20
18
  # Override the default SqlAnywhere.convert_smallint_to_bool setting for this database.
@@ -1,6 +1,6 @@
1
1
  # frozen-string-literal: true
2
2
 
3
- Sequel.require 'adapters/utils/replace'
3
+ Sequel.require %w'replace unmodified_identifiers', 'adapters/utils'
4
4
 
5
5
  module Sequel
6
6
  module SQLite
@@ -16,7 +16,7 @@ module Sequel
16
16
  # can be used to set PRAGMAs on connections in a thread-safe manner:
17
17
  # :auto_vacuum, :foreign_keys, :synchronous, and :temp_store.
18
18
  module DatabaseMethods
19
- extend Sequel::Database::ResetIdentifierMangling
19
+ include UnmodifiedIdentifiers::DatabaseMethods
20
20
 
21
21
  AUTO_VACUUM = [:none, :full, :incremental].freeze
22
22
  PRIMARY_KEY_INDEX_RE = /\Asqlite_autoindex_/.freeze
@@ -279,7 +279,7 @@ module Sequel
279
279
  when :drop_constraint
280
280
  case op[:type]
281
281
  when :primary_key
282
- duplicate_table(table){|columns| columns.each{|s| s[:primary_key] = nil}}
282
+ duplicate_table(table){|columns| columns.each{|s| s[:primary_key] = s[:auto_increment] = nil}}
283
283
  when :foreign_key
284
284
  if op[:columns]
285
285
  duplicate_table(table, :skip_foreign_key_columns=>op[:columns])
@@ -365,7 +365,6 @@ module Sequel
365
365
  cols.each do |c|
366
366
  c[:default] = LiteralString.new(c[:default]) if c[:default]
367
367
  c[:type] = c[:db_type]
368
- c.delete(:auto_increment)
369
368
  end
370
369
  cols
371
370
  end
@@ -442,16 +441,6 @@ module Sequel
442
441
  a
443
442
  end
444
443
 
445
- # SQLite folds unquoted identifiers to lowercase, so it shouldn't need to upcase identifiers on input.
446
- def identifier_input_method_default
447
- nil
448
- end
449
-
450
- # SQLite folds unquoted identifiers to lowercase, so it shouldn't need to upcase identifiers on output.
451
- def identifier_output_method_default
452
- nil
453
- end
454
-
455
444
  # Does the reverse of on_delete_clause, eg. converts strings like +'SET NULL'+
456
445
  # to symbols +:set_null+.
457
446
  def on_delete_sql_to_sym str
@@ -471,18 +460,32 @@ module Sequel
471
460
 
472
461
  # Parse the output of the table_info pragma
473
462
  def parse_pragma(table_name, opts)
474
- metadata_dataset.with_sql("PRAGMA table_info(?)", input_identifier_meth(opts[:dataset]).call(table_name)).map do |row|
463
+ pks = 0
464
+ sch = metadata_dataset.with_sql("PRAGMA table_info(?)", input_identifier_meth(opts[:dataset]).call(table_name)).map do |row|
475
465
  row.delete(:cid)
476
466
  row[:allow_null] = row.delete(:notnull).to_i == 0
477
467
  row[:default] = row.delete(:dflt_value)
478
468
  row[:default] = nil if blank_object?(row[:default]) || row[:default] == 'NULL'
479
469
  row[:db_type] = row.delete(:type)
480
470
  if row[:primary_key] = row.delete(:pk).to_i > 0
471
+ pks += 1
472
+ # Guess that an integer primary key uses auto increment,
473
+ # since that is Sequel's default and SQLite does not provide
474
+ # a way to introspect whether it is actually autoincrementing.
481
475
  row[:auto_increment] = row[:db_type].downcase == 'integer'
482
476
  end
483
477
  row[:type] = schema_column_type(row[:db_type])
484
478
  row
485
479
  end
480
+
481
+ if pks > 1
482
+ # SQLite does not allow use of auto increment for tables
483
+ # with composite primary keys, so remove auto_increment
484
+ # if composite primary keys are detected.
485
+ sch.each{|r| r.delete(:auto_increment)}
486
+ end
487
+
488
+ sch
486
489
  end
487
490
 
488
491
  # SQLite supports schema parsing using the table_info PRAGMA, so
@@ -497,7 +500,7 @@ module Sequel
497
500
  # Backbone of the tables and views support.
498
501
  def tables_and_views(filter, opts)
499
502
  m = output_identifier_meth
500
- metadata_dataset.from(:sqlite_master).server(opts[:server]).filter(filter).map{|r| m.call(r[:name])}
503
+ metadata_dataset.from(:sqlite_master).server(opts[:server]).where(filter).map{|r| m.call(r[:name])}
501
504
  end
502
505
 
503
506
  # SQLite only supports AUTOINCREMENT on integer columns, not
@@ -511,6 +514,7 @@ module Sequel
511
514
  # Instance methods for datasets that connect to an SQLite database
512
515
  module DatasetMethods
513
516
  include Dataset::Replace
517
+ include UnmodifiedIdentifiers::DatasetMethods
514
518
 
515
519
  CONSTANT_MAP = {:CURRENT_DATE=>"date(CURRENT_TIMESTAMP, 'localtime')".freeze, :CURRENT_TIMESTAMP=>"datetime(CURRENT_TIMESTAMP, 'localtime')".freeze, :CURRENT_TIME=>"time(CURRENT_TIMESTAMP, 'localtime')".freeze}
516
520
  EMULATED_FUNCTION_MAP = {:char_length=>'length'.freeze}
@@ -310,13 +310,6 @@ module Sequel
310
310
  BindArgumentMethods = prepared_statements_module(:bind, ArgumentMapper)
311
311
  PreparedStatementMethods = prepared_statements_module(:prepare, BindArgumentMethods)
312
312
 
313
- # Execute the given type of statement with the hash of values.
314
- def call(type, bind_vars={}, *values, &block)
315
- ps = to_prepared_statement(type, values)
316
- ps.extend(BindArgumentMethods)
317
- ps.call(bind_vars, &block)
318
- end
319
-
320
313
  # Yield a hash for each row in the dataset.
321
314
  def fetch_rows(sql)
322
315
  execute(sql) do |result|
@@ -339,19 +332,6 @@ module Sequel
339
332
  end
340
333
  end
341
334
 
342
- # Prepare the given type of query with the given name and store
343
- # it in the database. Note that a new native prepared statement is
344
- # created on each call to this prepared statement.
345
- def prepare(type, name=nil, *values)
346
- ps = to_prepared_statement(type, values)
347
- ps.extend(PreparedStatementMethods)
348
- if name
349
- ps.prepared_statement_name = name
350
- db.set_prepared_statement(name, ps)
351
- end
352
- ps
353
- end
354
-
355
335
  private
356
336
 
357
337
  # The base type name for a given type, without any parenthetical part.
@@ -364,6 +344,14 @@ module Sequel
364
344
  sql << "'" << ::SQLite3::Database.quote(v) << "'"
365
345
  end
366
346
 
347
+ def bound_variable_modules
348
+ [BindArgumentMethods]
349
+ end
350
+
351
+ def prepared_statement_modules
352
+ [PreparedStatementMethods]
353
+ end
354
+
367
355
  # SQLite uses a : before the name of the argument as a placeholder.
368
356
  def prepared_arg_placeholder
369
357
  PREPARED_ARG_PLACEHOLDER
@@ -10,7 +10,6 @@ module Sequel
10
10
  module MySQL
11
11
  # Database instance methods for MySQL databases accessed via Swift.
12
12
  module DatabaseMethods
13
- extend Sequel::Database::ResetIdentifierMangling
14
13
  include Sequel::MySQL::DatabaseMethods
15
14
 
16
15
  private
@@ -12,7 +12,6 @@ module Sequel
12
12
  module Postgres
13
13
  # Methods to add to Database instances that access PostgreSQL via Swift.
14
14
  module DatabaseMethods
15
- extend Sequel::Database::ResetIdentifierMangling
16
15
  include Sequel::Postgres::DatabaseMethods
17
16
 
18
17
  # Add the primary_keys and primary_key_sequences instance variables,
@@ -10,7 +10,6 @@ module Sequel
10
10
  module SQLite
11
11
  # Database instance methods for SQLite databases accessed via Swift.
12
12
  module DatabaseMethods
13
- extend Sequel::Database::ResetIdentifierMangling
14
13
  include Sequel::SQLite::DatabaseMethods
15
14
 
16
15
  DATABASE_ERROR_REGEXPS = {
@@ -243,18 +243,6 @@ module Sequel
243
243
  self
244
244
  end
245
245
 
246
- # Create a named prepared statement that is stored in the
247
- # database (and connection) for reuse.
248
- def prepare(type, name=nil, *values)
249
- ps = to_prepared_statement(type, values)
250
- ps.extend(PreparedStatementMethods)
251
- if name
252
- ps.prepared_statement_name = name
253
- db.set_prepared_statement(name, ps)
254
- end
255
- ps
256
- end
257
-
258
246
  private
259
247
 
260
248
  # Properly escape the given string +v+.
@@ -262,6 +250,10 @@ module Sequel
262
250
  sql << (mssql_unicode_strings ? UNICODE_STRING_START : APOS)
263
251
  sql << db.synchronize(@opts[:server]){|c| c.escape(v)}.gsub(BACKSLASH_CRLF_RE, BACKSLASH_CRLF_REPLACE) << APOS
264
252
  end
253
+
254
+ def prepared_statement_modules
255
+ [PreparedStatementMethods]
256
+ end
265
257
  end
266
258
  end
267
259
  end
@@ -45,7 +45,7 @@ module Sequel
45
45
  reverse_offset = row_count - o
46
46
  ds = if reverse_offset > 0
47
47
  ds.limit(reverse_offset).
48
- reverse_order(*order).
48
+ reverse(*order).
49
49
  from_self(:alias=>dsa1).
50
50
  limit(@opts[:limit]).
51
51
  order(*order)
@@ -67,14 +67,14 @@ module Sequel
67
67
  include Sequel::Dataset::StoredProcedures
68
68
 
69
69
  StoredProcedureMethods = Sequel::Dataset.send(:prepared_statements_module,
70
- "sql = @sproc_name; opts = Hash[opts]; opts[:args] = @sproc_args; opts[:sproc] = true",
70
+ "sql = @opts[:sproc_name]; opts = Hash[opts]; opts[:args] = @opts[:sproc_args]; opts[:sproc] = true",
71
71
  Sequel::Dataset::StoredProcedureMethods, %w'execute execute_dui')
72
72
 
73
73
  private
74
74
 
75
75
  # Extend the dataset with the MySQL stored procedure methods.
76
76
  def prepare_extend_sproc(ds)
77
- ds.extend(StoredProcedureMethods)
77
+ ds.with_extend(StoredProcedureMethods)
78
78
  end
79
79
  end
80
80
  end
@@ -36,45 +36,22 @@ module Sequel
36
36
  # Extend given dataset with this module so subselects inside subselects in
37
37
  # prepared statements work.
38
38
  def subselect_sql_append(sql, ds)
39
- ps = ds.to_prepared_statement(:select).clone(:append_sql => sql)
40
- ps.extend(CallableStatementMethods)
41
- ps = ps.bind(@opts[:bind_vars]) if @opts[:bind_vars]
42
- ps.prepared_args = prepared_args
43
- ps.prepared_sql
39
+ ds.clone(:append_sql=>sql, :prepared_args=>prepared_args, :bind_vars=>@opts[:bind_vars]).
40
+ send(:to_prepared_statement, :select, nil, :extend=>bound_variable_modules).
41
+ prepared_sql
44
42
  end
45
43
  end
46
44
 
47
- PreparedStatementMethods = Sequel::Dataset.send(:prepared_statements_module,
48
- :prepare_bind,
49
- Sequel::Dataset::UnnumberedArgumentMapper) do
50
- # Raise a more obvious error if you attempt to call a unnamed prepared statement.
51
- def call(*)
52
- raise Error, "Cannot call prepared statement without a name" if prepared_statement_name.nil?
53
- super
54
- end
55
- end
45
+ PreparedStatementMethods = Sequel::Dataset.send(:prepared_statements_module, :prepare_bind, Sequel::Dataset::UnnumberedArgumentMapper)
56
46
 
57
- # MySQL is different in that it supports prepared statements but not bound
58
- # variables outside of prepared statements. The default implementation
59
- # breaks the use of subselects in prepared statements, so extend the
60
- # temporary prepared statement that this creates with a module that
61
- # fixes it.
62
- def call(type, bind_arguments={}, *values, &block)
63
- ps = to_prepared_statement(type, values)
64
- ps.extend(CallableStatementMethods)
65
- ps.call(bind_arguments, &block)
47
+ private
48
+
49
+ def bound_variable_modules
50
+ [CallableStatementMethods]
66
51
  end
67
-
68
- # Store the given type of prepared statement in the associated database
69
- # with the given name.
70
- def prepare(type, name=nil, *values)
71
- ps = to_prepared_statement(type, values)
72
- ps.extend(PreparedStatementMethods)
73
- if name
74
- ps.prepared_statement_name = name
75
- db.set_prepared_statement(name, ps)
76
- end
77
- ps
52
+
53
+ def prepared_statement_modules
54
+ [PreparedStatementMethods]
78
55
  end
79
56
  end
80
57
  end
@@ -3,17 +3,16 @@
3
3
  module Sequel
4
4
  class Dataset
5
5
  module StoredProcedureMethods
6
+ Dataset.def_deprecated_opts_setter(self, :sproc_type, :sproc_name, :sproc_args)
7
+
6
8
  # The name of the stored procedure to call
7
- attr_accessor :sproc_name
8
-
9
- # The name of the stored procedure to call
10
- attr_writer :sproc_args
9
+ def sproc_name
10
+ @opts[:sproc_name]
11
+ end
11
12
 
12
13
  # Call the stored procedure with the given args
13
14
  def call(*args, &block)
14
- sp = clone
15
- sp.sproc_args = args
16
- sp.run(&block)
15
+ clone(:sproc_args=>args).run(&block)
17
16
  end
18
17
 
19
18
  # Programmer friendly string showing this is a stored procedure,
@@ -24,7 +23,7 @@ module Sequel
24
23
 
25
24
  # Run the stored procedure with the current args on the database
26
25
  def run(&block)
27
- case @sproc_type
26
+ case @opts[:sproc_type]
28
27
  when :select, :all
29
28
  all(&block)
30
29
  when :first
@@ -37,14 +36,6 @@ module Sequel
37
36
  delete
38
37
  end
39
38
  end
40
-
41
- # Set the type of the stored procedure and override the corresponding _sql
42
- # method to return the empty string (since the result will be
43
- # ignored anyway).
44
- def sproc_type=(type)
45
- @sproc_type = type
46
- @opts[:sql] = ''
47
- end
48
39
  end
49
40
 
50
41
  module StoredProcedures
@@ -58,18 +49,14 @@ module Sequel
58
49
  # Transform this dataset into a stored procedure that you can call
59
50
  # multiple times with new arguments.
60
51
  def prepare_sproc(type, name)
61
- sp = clone
62
- prepare_extend_sproc(sp)
63
- sp.sproc_type = type
64
- sp.sproc_name = name
65
- sp
52
+ prepare_extend_sproc(self).clone(:sproc_type=>type, :sproc_name=>name, :sql=>'')
66
53
  end
67
54
 
68
55
  private
69
56
 
70
57
  # Extend the dataset with the stored procedure methods.
71
58
  def prepare_extend_sproc(ds)
72
- ds.extend(StoredProcedureMethods)
59
+ ds.with_extend(StoredProcedureMethods)
73
60
  end
74
61
  end
75
62
  end
@@ -0,0 +1,26 @@
1
+ module Sequel
2
+ module UnmodifiedIdentifiers
3
+ module DatabaseMethods
4
+ private
5
+
6
+ # Databases that use this module for unquoted identifiers to lowercase.
7
+ def folds_unquoted_identifiers_to_uppercase?
8
+ false
9
+ end
10
+ end
11
+
12
+ module DatasetMethods
13
+ private
14
+
15
+ # Turn the given symbol/string into a symbol, keeping the current case.
16
+ def output_identifier(v)
17
+ v == '' ? :untitled : v.to_sym
18
+ end
19
+
20
+ # Turn the given symbol/string into a string, keeping the current case.
21
+ def input_identifier(v)
22
+ v.to_s
23
+ end
24
+ end
25
+ end
26
+ end
@@ -137,11 +137,11 @@ module Sequel
137
137
  #
138
138
  # So it can handle cases like:
139
139
  #
140
- # DB.filter(:a=>1).exclude(:b=>2).where{c > 3}
140
+ # DB.where(:a=>1).exclude(:b=>2).where{c > 3}
141
141
  #
142
142
  # But it cannot handle cases like:
143
143
  #
144
- # DB.filter(:a + 1 < 0)
144
+ # DB.where(:a + 1 < 0)
145
145
  class Unbinder < ASTTransformer
146
146
  # The <tt>SQL::ComplexExpression<tt> operates that will be considered
147
147
  # for transformation.
@@ -56,7 +56,7 @@ module Sequel
56
56
  # DB.from(:items){id > 2} # SELECT * FROM items WHERE (id > 2)
57
57
  def from(*args, &block)
58
58
  ds = @default_dataset.from(*args)
59
- block ? ds.filter(&block) : ds
59
+ block ? ds.where(&block) : ds
60
60
  end
61
61
 
62
62
  # Returns a new dataset with the select method invoked.
@@ -40,12 +40,6 @@ module Sequel
40
40
  # an optional options hash.
41
41
  attr_reader :dataset_class
42
42
 
43
- # The identifier input method to use by default for this database (default: adapter default)
44
- attr_reader :identifier_input_method
45
-
46
- # The identifier output method to use by default for this database (default: adapter default)
47
- attr_reader :identifier_output_method
48
-
49
43
  # If the database has any dataset modules associated with it,
50
44
  # use a subclass of the given class that includes the modules
51
45
  # as the dataset class.
@@ -93,41 +87,6 @@ module Sequel
93
87
  reset_default_dataset
94
88
  end
95
89
 
96
- # Set the method to call on identifiers going into the database:
97
- #
98
- # DB[:items] # SELECT * FROM items
99
- # DB.identifier_input_method = :upcase
100
- # DB[:items] # SELECT * FROM ITEMS
101
- def identifier_input_method=(v)
102
- reset_default_dataset
103
- @identifier_input_method = v
104
- end
105
-
106
- # Set the method to call on identifiers coming from the database:
107
- #
108
- # DB[:items].first # {:id=>1, :name=>'foo'}
109
- # DB.identifier_output_method = :upcase
110
- # DB[:items].first # {:ID=>1, :NAME=>'foo'}
111
- def identifier_output_method=(v)
112
- reset_default_dataset
113
- @identifier_output_method = v
114
- end
115
-
116
- # Set whether to quote identifiers (columns and tables) for this database:
117
- #
118
- # DB[:items] # SELECT * FROM items
119
- # DB.quote_identifiers = true
120
- # DB[:items] # SELECT * FROM "items"
121
- def quote_identifiers=(v)
122
- reset_default_dataset
123
- @quote_identifiers = v
124
- end
125
-
126
- # Returns true if the database quotes identifiers.
127
- def quote_identifiers?
128
- @quote_identifiers
129
- end
130
-
131
90
  private
132
91
 
133
92
  # The default dataset class to use for the database
@@ -143,35 +102,10 @@ module Sequel
143
102
  @default_dataset = dataset
144
103
  end
145
104
 
146
- # The method to apply to identifiers going into the database by default.
147
- # Should be overridden in subclasses for databases that fold unquoted
148
- # identifiers to lower case instead of uppercase, such as
149
- # MySQL, PostgreSQL, and SQLite.
150
- def identifier_input_method_default
151
- :upcase
152
- end
153
-
154
- # The method to apply to identifiers coming the database by default.
155
- # Should be overridden in subclasses for databases that fold unquoted
156
- # identifiers to lower case instead of uppercase, such as
157
- # MySQL, PostgreSQL, and SQLite.
158
- def identifier_output_method_default
159
- :downcase
160
- end
161
-
162
105
  # Whether to quote identifiers by default for this database, true
163
106
  # by default.
164
107
  def quote_identifiers_default
165
108
  true
166
109
  end
167
-
168
- # Reset the identifier mangling options. Overrides any already set on
169
- # the instance. Only for internal use by shared adapters.
170
- def reset_identifier_mangling
171
- @quote_identifiers = @opts.fetch(:quote_identifiers){(qi = Database.quote_identifiers).nil? ? quote_identifiers_default : qi}
172
- @identifier_input_method = @opts.fetch(:identifier_input_method){(iim = Database.identifier_input_method).nil? ? identifier_input_method_default : (iim if iim)}
173
- @identifier_output_method = @opts.fetch(:identifier_output_method){(iom = Database.identifier_output_method).nil? ? identifier_output_method_default : (iom if iom)}
174
- reset_default_dataset
175
- end
176
110
  end
177
111
  end