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
@@ -337,7 +337,7 @@ module Sequel
337
337
  def split_multiple_result_sets
338
338
  raise(Error, "Can't split multiple statements on a graphed dataset") if opts[:graph]
339
339
  ds = clone(:split_multiple_result_sets=>true)
340
- ds.row_proc = proc{|x| x.map{|h| row_proc.call(h)}} if row_proc
340
+ ds = ds.with_row_proc(proc{|x| x.map{|h| row_proc.call(h)}}) if row_proc
341
341
  ds
342
342
  end
343
343
 
@@ -236,28 +236,12 @@ module Sequel
236
236
  "sql = self; opts = Hash[opts]; opts[:arguments] = bind_arguments",
237
237
  Sequel::Dataset::UnnumberedArgumentMapper,
238
238
  %w"execute execute_dui execute_insert")
239
-
240
- # Create a named prepared statement that is stored in the
241
- # database (and connection) for reuse.
242
- def prepare(type, name=nil, *values)
243
- ps = to_prepared_statement(type, values)
244
- ps.extend(PreparedStatementMethods)
245
- if name
246
- ps.prepared_statement_name = name
247
- db.set_prepared_statement(name, ps)
248
- end
249
- ps
250
- end
251
239
  end
252
240
 
253
241
  # Yield all rows matching this dataset.
254
242
  def fetch_rows(sql)
255
243
  execute(sql) do |r|
256
- self.columns = if identifier_output_method
257
- r.fields.map!{|c| output_identifier(c.to_s)}
258
- else
259
- r.fields
260
- end
244
+ self.columns = r.fields.map!{|c| output_identifier(c.to_s)}
261
245
  r.each(:cast_booleans=>convert_tinyint_to_bool?){|h| yield h}
262
246
  end
263
247
  self
@@ -296,6 +280,16 @@ module Sequel
296
280
  super
297
281
  end
298
282
 
283
+ if NativePreparedStatements
284
+ def bound_variable_modules
285
+ [PreparedStatementMethods]
286
+ end
287
+
288
+ def prepared_statement_modules
289
+ [PreparedStatementMethods]
290
+ end
291
+ end
292
+
299
293
  # Handle correct quoting of strings using ::Mysql2::Client#escape.
300
294
  def literal_string_append(sql, v)
301
295
  s = db.synchronize(@opts[:server]){|c| c.escape(v)}
@@ -16,7 +16,6 @@ module Sequel
16
16
  # support via ODBC.
17
17
  module MSSQL
18
18
  module DatabaseMethods
19
- extend Sequel::Database::ResetIdentifierMangling
20
19
  include Sequel::MSSQL::DatabaseMethods
21
20
  LAST_INSERT_ID_SQL='SELECT SCOPE_IDENTITY()'.freeze
22
21
 
@@ -355,13 +355,6 @@ module Sequel
355
355
  BindArgumentMethods = prepared_statements_module(:bind, ArgumentMapper)
356
356
  PreparedStatementMethods = prepared_statements_module(:prepare, BindArgumentMethods)
357
357
 
358
- # Execute the given type of statement with the hash of values.
359
- def call(type, bind_vars={}, *values, &block)
360
- ps = to_prepared_statement(type, values)
361
- ps.extend(BindArgumentMethods)
362
- ps.call(bind_vars, &block)
363
- end
364
-
365
358
  def fetch_rows(sql)
366
359
  execute(sql) do |cursor|
367
360
  cps = db.conversion_procs
@@ -378,19 +371,6 @@ module Sequel
378
371
  self
379
372
  end
380
373
 
381
- # Prepare the given type of query with the given name and store
382
- # it in the database. Note that a new native prepared statement is
383
- # created on each call to this prepared statement.
384
- def prepare(type, name=nil, *values)
385
- ps = to_prepared_statement(type, values)
386
- ps.extend(PreparedStatementMethods)
387
- if name
388
- ps.prepared_statement_name = name
389
- db.set_prepared_statement(name, ps)
390
- end
391
- ps
392
- end
393
-
394
374
  # Oracle requires type specifiers for placeholders, at least
395
375
  # if you ever want to use a nil/NULL value as the value for
396
376
  # the placeholder.
@@ -415,6 +395,14 @@ module Sequel
415
395
  def prepared_arg_placeholder
416
396
  PREPARED_ARG_PLACEHOLDER
417
397
  end
398
+
399
+ def bound_variable_modules
400
+ [BindArgumentMethods]
401
+ end
402
+
403
+ def prepared_statement_modules
404
+ [PreparedStatementMethods]
405
+ end
418
406
  end
419
407
  end
420
408
  end
@@ -755,37 +755,19 @@ module Sequel
755
755
  end
756
756
  end
757
757
 
758
- BindArgumentMethods = prepared_statements_module(:bind, [ArgumentMapper, ::Sequel::Postgres::DatasetMethods::PreparedStatementMethods], %w'execute execute_dui')
759
-
760
- PreparedStatementMethods = prepared_statements_module(:prepare, BindArgumentMethods, %w'execute execute_dui') do
761
- # Raise a more obvious error if you attempt to call a unnamed prepared statement.
762
- def call(*)
763
- raise Error, "Cannot call prepared statement without a name" if prepared_statement_name.nil?
764
- super
765
- end
766
- end
767
-
768
- # Execute the given type of statement with the hash of values.
769
- def call(type, bind_vars=OPTS, *values, &block)
770
- ps = to_prepared_statement(type, values)
771
- ps.extend(BindArgumentMethods)
772
- ps.call(bind_vars, &block)
773
- end
774
-
775
- # Prepare the given type of statement with the given name, and store
776
- # it in the database to be called later.
777
- def prepare(type, name=nil, *values)
778
- ps = to_prepared_statement(type, values)
779
- ps.extend(PreparedStatementMethods)
780
- if name
781
- ps.prepared_statement_name = name
782
- db.set_prepared_statement(name, ps)
783
- end
784
- ps
785
- end
758
+ BindArgumentMethods = prepared_statements_module(:bind, [ArgumentMapper], %w'execute execute_dui')
759
+ PreparedStatementMethods = prepared_statements_module(:prepare, BindArgumentMethods, %w'execute execute_dui')
786
760
 
787
761
  private
788
762
 
763
+ def bound_variable_modules
764
+ [BindArgumentMethods]
765
+ end
766
+
767
+ def prepared_statement_modules
768
+ [PreparedStatementMethods]
769
+ end
770
+
789
771
  # PostgreSQL uses $N for placeholders instead of ?, so use a $
790
772
  # as the placeholder.
791
773
  def prepared_arg_placeholder
@@ -834,7 +816,7 @@ module Sequel
834
816
  end
835
817
  end
836
818
 
837
- # Set the @columns based on the result set, and return the array of
819
+ # Set the columns based on the result set, and return the array of
838
820
  # field numers, type conversion procs, and name symbol arrays.
839
821
  def fetch_rows_set_cols(res)
840
822
  cols = []
@@ -1,13 +1,13 @@
1
1
  # frozen-string-literal: true
2
2
 
3
- module Sequel
4
- require 'adapters/utils/emulate_offset_with_reverse_and_count'
3
+ Sequel.require %w'emulate_offset_with_reverse_and_count unmodified_identifiers', 'adapters/utils'
5
4
 
5
+ module Sequel
6
6
  module Access
7
7
  Sequel::Database.set_shared_adapter_scheme(:access, self)
8
8
 
9
9
  module DatabaseMethods
10
- extend Sequel::Database::ResetIdentifierMangling
10
+ include UnmodifiedIdentifiers::DatabaseMethods
11
11
 
12
12
  # Access uses type :access as the database_type
13
13
  def database_type
@@ -16,7 +16,7 @@ module Sequel
16
16
 
17
17
  # Doesn't work, due to security restrictions on MSysObjects
18
18
  #def tables
19
- # from(:MSysObjects).filter(:Type=>1, :Flags=>0).select_map(:Name).map(&:to_sym)
19
+ # from(:MSysObjects).where(:Type=>1, :Flags=>0).select_map(:Name).map(&:to_sym)
20
20
  #end
21
21
 
22
22
  # Access doesn't support renaming tables from an SQL query,
@@ -61,14 +61,6 @@ module Sequel
61
61
  "DROP INDEX #{quote_identifier(op[:name] || default_index_name(table, op[:columns]))} ON #{quote_schema_table(table)}"
62
62
  end
63
63
 
64
- def identifier_input_method_default
65
- nil
66
- end
67
-
68
- def identifier_output_method_default
69
- nil
70
- end
71
-
72
64
  # Access doesn't have a 64-bit integer type, so use integer and hope
73
65
  # the user isn't using more than 32 bits.
74
66
  def type_literal_generic_bignum_symbol(column)
@@ -91,6 +83,7 @@ module Sequel
91
83
  Dataset.def_sql_method(self, :select, %w'select distinct limit columns into from join where group order having compounds')
92
84
  end)
93
85
  include EmulateOffsetWithReverseAndCount
86
+ include UnmodifiedIdentifiers::DatasetMethods
94
87
 
95
88
  DATE_FORMAT = '#%Y-%m-%d#'.freeze
96
89
  TIMESTAMP_FORMAT = '#%Y-%m-%d %H:%M:%S#'.freeze
@@ -1,15 +1,14 @@
1
1
  # frozen-string-literal: true
2
2
 
3
- Sequel.require 'adapters/utils/split_alter_table'
3
+ Sequel.require %w'split_alter_table unmodified_identifiers', 'adapters/utils'
4
4
 
5
5
  module Sequel
6
6
  module Cubrid
7
7
  Sequel::Database.set_shared_adapter_scheme(:cubrid, self)
8
8
 
9
9
  module DatabaseMethods
10
- extend Sequel::Database::ResetIdentifierMangling
11
-
12
10
  include Sequel::Database::SplitAlterTable
11
+ include UnmodifiedIdentifiers::DatabaseMethods
13
12
 
14
13
  AUTOINCREMENT = 'AUTO_INCREMENT'.freeze
15
14
  COLUMN_DEFINITION_ORDER = [:auto_increment, :default, :null, :unique, :primary_key, :references]
@@ -143,16 +142,6 @@ module Sequel
143
142
  DATABASE_ERROR_REGEXPS
144
143
  end
145
144
 
146
- # CUBRID is case insensitive, so don't modify identifiers
147
- def identifier_input_method_default
148
- nil
149
- end
150
-
151
- # CUBRID is case insensitive, so don't modify identifiers
152
- def identifier_output_method_default
153
- nil
154
- end
155
-
156
145
  # CUBRID does not support named column constraints.
157
146
  def supports_named_column_constraints?
158
147
  false
@@ -175,6 +164,8 @@ module Sequel
175
164
  end
176
165
 
177
166
  module DatasetMethods
167
+ include UnmodifiedIdentifiers::DatasetMethods
168
+
178
169
  COMMA = Sequel::Dataset::COMMA
179
170
  LIMIT = Sequel::Dataset::LIMIT
180
171
  BOOL_FALSE = '0'.freeze
@@ -14,8 +14,6 @@ module Sequel
14
14
  end
15
15
 
16
16
  module DatabaseMethods
17
- extend Sequel::Database::ResetIdentifierMangling
18
-
19
17
  AUTOINCREMENT = 'GENERATED ALWAYS AS IDENTITY'.freeze
20
18
  NOT_NULL = ' NOT NULL'.freeze
21
19
  NULL = ''.freeze
@@ -322,6 +320,10 @@ module Sequel
322
320
  end
323
321
  end
324
322
 
323
+ def quote_identifiers?
324
+ @opts.fetch(:quote_identifiers, false)
325
+ end
326
+
325
327
  def supports_cte?(type=:select)
326
328
  type == :select
327
329
  end
@@ -5,8 +5,6 @@ module Sequel
5
5
  Sequel::Database.set_shared_adapter_scheme(:firebird, self)
6
6
 
7
7
  module DatabaseMethods
8
- extend Sequel::Database::ResetIdentifierMangling
9
-
10
8
  AUTO_INCREMENT = ''.freeze
11
9
  TEMPORARY = 'GLOBAL TEMPORARY '.freeze
12
10
 
@@ -40,7 +38,7 @@ module Sequel
40
38
  end
41
39
 
42
40
  def sequences(opts=OPTS)
43
- ds = self[:"rdb$generators"].server(opts[:server]).filter(:"rdb$system_flag" => 0).select(:"rdb$generator_name")
41
+ ds = self[:"rdb$generators"].server(opts[:server]).where(:"rdb$system_flag" => 0).select(:"rdb$generator_name")
44
42
  block_given? ? yield(ds) : ds.map{|r| ds.send(:output_identifier, r[:"rdb$generator_name"])}
45
43
  end
46
44
 
@@ -143,7 +141,7 @@ module Sequel
143
141
  end
144
142
 
145
143
  def tables_or_views(type, opts)
146
- ds = self[:"rdb$relations"].server(opts[:server]).filter(:"rdb$relation_type" => type, Sequel::SQL::Function.new(:COALESCE, :"rdb$system_flag", 0) => 0).select(:"rdb$relation_name")
144
+ ds = self[:"rdb$relations"].server(opts[:server]).where(:"rdb$relation_type" => type, Sequel::SQL::Function.new(:COALESCE, :"rdb$system_flag", 0) => 0).select(:"rdb$relation_name")
147
145
  ds.map{|r| ds.send(:output_identifier, r[:"rdb$relation_name"].rstrip)}
148
146
  end
149
147
 
@@ -5,8 +5,6 @@ module Sequel
5
5
  Sequel::Database.set_shared_adapter_scheme(:informix, self)
6
6
 
7
7
  module DatabaseMethods
8
- extend Sequel::Database::ResetIdentifierMangling
9
-
10
8
  TEMPORARY = 'TEMP '.freeze
11
9
 
12
10
  # Informix uses the :informix database type
@@ -34,6 +32,10 @@ module Sequel
34
32
 
35
33
  Dataset.def_sql_method(self, :select, %w'select limit distinct columns from join where having group compounds order')
36
34
 
35
+ def quote_identifiers?
36
+ @opts.fetch(:quote_identifiers, false)
37
+ end
38
+
37
39
  # Informix does not support INTERSECT or EXCEPT
38
40
  def supports_intersect_except?
39
41
  false
@@ -13,8 +13,6 @@ module Sequel
13
13
  end
14
14
 
15
15
  module DatabaseMethods
16
- extend Sequel::Database::ResetIdentifierMangling
17
-
18
16
  AUTO_INCREMENT = 'IDENTITY(1,1)'.freeze
19
17
  SERVER_VERSION_RE = /^(\d+)\.(\d+)\.(\d+)/.freeze
20
18
  SERVER_VERSION_SQL = "SELECT CAST(SERVERPROPERTY('ProductVersion') AS varchar)".freeze
@@ -399,12 +397,12 @@ module Sequel
399
397
  m = output_identifier_meth
400
398
  metadata_dataset.from(Sequel[:information_schema][:tables].as(:t)).
401
399
  select(:table_name).
402
- filter(:table_type=>type, :table_schema=>(opts[:schema]||'dbo').to_s).
400
+ where(:table_type=>type, :table_schema=>(opts[:schema]||'dbo').to_s).
403
401
  map{|x| m.call(x[:table_name])}
404
402
  end
405
403
 
406
404
  # Always quote identifiers in the metadata_dataset, so schema parsing works.
407
- def metadata_dataset
405
+ def _metadata_dataset
408
406
  super.with_quote_identifiers(true)
409
407
  end
410
408
 
@@ -652,7 +650,7 @@ module Sequel
652
650
  # MSSQL uses the CONTAINS keyword for full text search
653
651
  def full_text_search(cols, terms, opts = OPTS)
654
652
  terms = "\"#{terms.join('" OR "')}\"" if terms.is_a?(Array)
655
- filter("CONTAINS (?, ?)", cols, terms)
653
+ where("CONTAINS (?, ?)", cols, terms)
656
654
  end
657
655
 
658
656
  # Use the OUTPUT clause to get the value of all columns for the newly inserted record.
@@ -1,7 +1,6 @@
1
1
  # frozen-string-literal: true
2
2
 
3
- Sequel.require 'adapters/utils/split_alter_table'
4
- Sequel.require 'adapters/utils/replace'
3
+ Sequel.require %w'replace split_alter_table unmodified_identifiers', 'adapters/utils'
5
4
 
6
5
  module Sequel
7
6
  module MySQL
@@ -38,7 +37,7 @@ module Sequel
38
37
  # Methods shared by Database instances that connect to MySQL,
39
38
  # currently supported by the native and JDBC adapters.
40
39
  module DatabaseMethods
41
- extend Sequel::Database::ResetIdentifierMangling
40
+ include UnmodifiedIdentifiers::DatabaseMethods
42
41
 
43
42
  AUTO_INCREMENT = 'AUTO_INCREMENT'.freeze
44
43
  CAST_TYPES = {String=>:CHAR, Integer=>:SIGNED, Time=>:DATETIME, DateTime=>:DATETIME, Numeric=>:DECIMAL, BigDecimal=>:DECIMAL, File=>:BINARY}
@@ -418,16 +417,6 @@ module Sequel
418
417
  metadata_dataset.with_sql('SHOW FULL TABLES').server(opts[:server]).map{|r| m.call(r.values.first) if r.delete(:Table_type) == type}.compact
419
418
  end
420
419
 
421
- # MySQL folds unquoted identifiers to lowercase, so it shouldn't need to upcase identifiers on input.
422
- def identifier_input_method_default
423
- nil
424
- end
425
-
426
- # MySQL folds unquoted identifiers to lowercase, so it shouldn't need to upcase identifiers on output.
427
- def identifier_output_method_default
428
- nil
429
- end
430
-
431
420
  # Handle MySQL specific index SQL syntax
432
421
  def index_definition_sql(table_name, index)
433
422
  index_name = quote_identifier(index[:name] || default_index_name(table_name, index[:columns]))
@@ -627,6 +616,7 @@ module Sequel
627
616
  Dataset.def_sql_method(self, :update, %w'update ignore table set where order limit')
628
617
 
629
618
  include Sequel::Dataset::Replace
619
+ include UnmodifiedIdentifiers::DatasetMethods
630
620
 
631
621
  # MySQL specific syntax for LIKE/REGEXP searches, as well as
632
622
  # string concatenation.
@@ -724,7 +714,7 @@ module Sequel
724
714
 
725
715
  # Adds full text filter
726
716
  def full_text_search(cols, terms, opts = OPTS)
727
- filter(full_text_sql(cols, terms, opts))
717
+ where(full_text_sql(cols, terms, opts))
728
718
  end
729
719
 
730
720
  # MySQL specific full text search syntax.
@@ -14,8 +14,6 @@ module Sequel
14
14
  end
15
15
 
16
16
  module DatabaseMethods
17
- extend Sequel::Database::ResetIdentifierMangling
18
-
19
17
  TEMPORARY = 'GLOBAL TEMPORARY '.freeze
20
18
  AUTOINCREMENT = ''.freeze
21
19
 
@@ -265,7 +263,7 @@ module Sequel
265
263
  pk = sch.select{|k, v| v[:primary_key]}
266
264
  @primary_key_sequences[table] = if pk.length == 1
267
265
  seq = "seq_#{table}_#{pk.first.first}"
268
- seq.to_sym unless from(:user_sequences).filter(:sequence_name=>input_identifier_meth.call(seq)).empty?
266
+ seq.to_sym unless from(:user_sequences).where(:sequence_name=>input_identifier_meth.call(seq)).empty?
269
267
  end
270
268
  end
271
269
  end
@@ -1,6 +1,6 @@
1
1
  # frozen-string-literal: true
2
2
 
3
- Sequel.require 'adapters/utils/pg_types'
3
+ Sequel.require %w'pg_types unmodified_identifiers', 'adapters/utils'
4
4
 
5
5
  module Sequel
6
6
  # Top level module for holding all PostgreSQL-related modules and classes
@@ -109,7 +109,7 @@ module Sequel
109
109
 
110
110
  # Methods shared by Database instances that connect to PostgreSQL.
111
111
  module DatabaseMethods
112
- extend Sequel::Database::ResetIdentifierMangling
112
+ include UnmodifiedIdentifiers::DatabaseMethods
113
113
 
114
114
  PREPARED_ARG_PLACEHOLDER = LiteralString.new('$').freeze
115
115
  RE_CURRVAL_ERROR = /currval of sequence "(.*)" is not yet defined in this session|relation "(.*)" does not exist/.freeze
@@ -352,7 +352,7 @@ module Sequel
352
352
  # entry is schema qualified as well.
353
353
  if schema
354
354
  ref_ds = ref_ds.join(Sequel[:pg_namespace].as(:nsp2), :oid=>Sequel[:cl2][:relnamespace]).
355
- select_more{nsp2[:nspname].as(:schema)}
355
+ select_append{nsp2[:nspname].as(:schema)}
356
356
  end
357
357
 
358
358
  h = {}
@@ -508,7 +508,7 @@ module Sequel
508
508
  0
509
509
  end
510
510
  end
511
- warn 'Sequel no longer supports PostgreSQL <8.2, some things may not work' if @server_version < 80200
511
+ Sequel::Deprecation.deprecate('Sequel no longer supports PostgreSQL <8.2, some things may not work.') if @server_version < 80200
512
512
  @server_version
513
513
  end
514
514
 
@@ -581,7 +581,7 @@ module Sequel
581
581
  # the database.
582
582
  def type_supported?(type)
583
583
  @supported_types ||= {}
584
- @supported_types.fetch(type){@supported_types[type] = (from(:pg_type).filter(:typtype=>'b', :typname=>type.to_s).count > 0)}
584
+ @supported_types.fetch(type){@supported_types[type] = (from(:pg_type).where(:typtype=>'b', :typname=>type.to_s).count > 0)}
585
585
  end
586
586
 
587
587
  # Creates a dataset that uses the VALUES clause:
@@ -1005,16 +1005,6 @@ module Sequel
1005
1005
  procs
1006
1006
  end
1007
1007
 
1008
- # PostgreSQL folds unquoted identifiers to lowercase, so it shouldn't need to upcase identifiers on input.
1009
- def identifier_input_method_default
1010
- nil
1011
- end
1012
-
1013
- # PostgreSQL folds unquoted identifiers to lowercase, so it shouldn't need to upcase identifiers on output.
1014
- def identifier_output_method_default
1015
- nil
1016
- end
1017
-
1018
1008
  # PostgreSQL specific index SQL.
1019
1009
  def index_definition_sql(table_name, index)
1020
1010
  cols = index[:columns]
@@ -1048,7 +1038,7 @@ module Sequel
1048
1038
 
1049
1039
  # Backbone of the tables and views support.
1050
1040
  def pg_class_relname(type, opts)
1051
- ds = metadata_dataset.from(:pg_class).filter(:relkind=>type).select(:relname).server(opts[:server]).join(:pg_namespace, :oid=>:relnamespace)
1041
+ ds = metadata_dataset.from(:pg_class).where(:relkind=>type).select(:relname).server(opts[:server]).join(:pg_namespace, :oid=>:relnamespace)
1052
1042
  ds = filter_schema(ds, opts)
1053
1043
  m = output_identifier_meth
1054
1044
  if block_given?
@@ -1226,6 +1216,8 @@ module Sequel
1226
1216
 
1227
1217
  # Instance methods for datasets that connect to a PostgreSQL database.
1228
1218
  module DatasetMethods
1219
+ include UnmodifiedIdentifiers::DatasetMethods
1220
+
1229
1221
  ACCESS_SHARE = 'ACCESS SHARE'.freeze
1230
1222
  ACCESS_EXCLUSIVE = 'ACCESS EXCLUSIVE'.freeze
1231
1223
  BOOL_FALSE = 'false'.freeze
@@ -1271,28 +1263,6 @@ module Sequel
1271
1263
  Dataset.def_sql_method(self, :select, [['if opts[:values]', %w'values order limit'], ['elsif server_version >= 80400', %w'with select distinct columns from join where group having window compounds order limit lock'], ['else', %w'select distinct columns from join where group having compounds order limit lock']])
1272
1264
  Dataset.def_sql_method(self, :update, [['if server_version >= 90100', %w'with update table set from where returning'], ['else', %w'update table set from where returning']])
1273
1265
 
1274
- # Shared methods for prepared statements when used with PostgreSQL databases.
1275
- module PreparedStatementMethods
1276
- # Override insert action to use RETURNING if the server supports it.
1277
- def run
1278
- if @prepared_type == :insert && (opts[:returning_pk] || !opts[:returning])
1279
- fetch_rows(prepared_sql){|r| return r.values.first}
1280
- else
1281
- super
1282
- end
1283
- end
1284
-
1285
- def prepared_sql
1286
- return @prepared_sql if @prepared_sql
1287
- if @prepared_type == :insert && !opts[:returning]
1288
- @opts[:returning] = insert_pk
1289
- @opts[:returning_pk] = true
1290
- end
1291
- super
1292
- @prepared_sql
1293
- end
1294
- end
1295
-
1296
1266
  # Return the results of an EXPLAIN ANALYZE query as a string
1297
1267
  def analyze
1298
1268
  explain(:analyze=>true)
@@ -1819,6 +1789,14 @@ module Sequel
1819
1789
  true
1820
1790
  end
1821
1791
 
1792
+ def to_prepared_statement(type, *a)
1793
+ if type == :insert && !@opts.has_key?(:returning)
1794
+ returning(insert_pk).send(:to_prepared_statement, :insert_pk, *a)
1795
+ else
1796
+ super
1797
+ end
1798
+ end
1799
+
1822
1800
  # Concatenate the expressions with a space in between
1823
1801
  def full_text_string_join(cols)
1824
1802
  cols = Array(cols).map{|x| SQL::Function.new(:COALESCE, x, EMPTY_STRING)}