sequel 4.41.0 → 4.42.0

Sign up to get free protection for your applications and to get access to all the features.
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)}