sequel 4.49.0 → 5.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (484) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +130 -0
  3. data/README.rdoc +195 -136
  4. data/Rakefile +26 -42
  5. data/bin/sequel +6 -9
  6. data/doc/advanced_associations.rdoc +91 -168
  7. data/doc/association_basics.rdoc +197 -274
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +66 -43
  10. data/doc/code_order.rdoc +1 -8
  11. data/doc/core_extensions.rdoc +81 -56
  12. data/doc/dataset_basics.rdoc +8 -17
  13. data/doc/dataset_filtering.rdoc +81 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/mass_assignment.rdoc +73 -30
  16. data/doc/migration.rdoc +19 -36
  17. data/doc/model_dataset_method_design.rdoc +14 -17
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +10 -10
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +52 -70
  22. data/doc/opening_databases.rdoc +39 -32
  23. data/doc/postgresql.rdoc +48 -38
  24. data/doc/prepared_statements.rdoc +27 -22
  25. data/doc/querying.rdoc +173 -150
  26. data/doc/reflection.rdoc +5 -6
  27. data/doc/release_notes/5.0.0.txt +159 -0
  28. data/doc/release_notes/5.1.0.txt +31 -0
  29. data/doc/release_notes/5.2.0.txt +33 -0
  30. data/doc/release_notes/5.3.0.txt +121 -0
  31. data/doc/schema_modification.rdoc +78 -64
  32. data/doc/security.rdoc +97 -88
  33. data/doc/sharding.rdoc +43 -30
  34. data/doc/sql.rdoc +53 -65
  35. data/doc/testing.rdoc +4 -5
  36. data/doc/thread_safety.rdoc +2 -4
  37. data/doc/transactions.rdoc +18 -17
  38. data/doc/validations.rdoc +48 -45
  39. data/doc/virtual_rows.rdoc +87 -115
  40. data/lib/sequel/adapters/ado/access.rb +7 -13
  41. data/lib/sequel/adapters/ado/mssql.rb +2 -9
  42. data/lib/sequel/adapters/ado.rb +9 -25
  43. data/lib/sequel/adapters/amalgalite.rb +3 -18
  44. data/lib/sequel/adapters/ibmdb.rb +9 -45
  45. data/lib/sequel/adapters/jdbc/db2.rb +8 -37
  46. data/lib/sequel/adapters/jdbc/derby.rb +4 -50
  47. data/lib/sequel/adapters/jdbc/h2.rb +6 -26
  48. data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -27
  49. data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
  50. data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
  51. data/lib/sequel/adapters/jdbc/mysql.rb +11 -15
  52. data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
  53. data/lib/sequel/adapters/jdbc/postgresql.rb +23 -33
  54. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
  55. data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
  56. data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
  57. data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
  58. data/lib/sequel/adapters/jdbc.rb +18 -74
  59. data/lib/sequel/adapters/mock.rb +4 -30
  60. data/lib/sequel/adapters/mysql.rb +7 -44
  61. data/lib/sequel/adapters/mysql2.rb +5 -23
  62. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  63. data/lib/sequel/adapters/odbc/mssql.rb +4 -12
  64. data/lib/sequel/adapters/odbc/oracle.rb +1 -1
  65. data/lib/sequel/adapters/odbc.rb +0 -19
  66. data/lib/sequel/adapters/oracle.rb +8 -13
  67. data/lib/sequel/adapters/postgres.rb +28 -150
  68. data/lib/sequel/adapters/postgresql.rb +1 -1
  69. data/lib/sequel/adapters/shared/access.rb +11 -51
  70. data/lib/sequel/adapters/shared/db2.rb +3 -61
  71. data/lib/sequel/adapters/shared/mssql.rb +21 -157
  72. data/lib/sequel/adapters/shared/mysql.rb +61 -227
  73. data/lib/sequel/adapters/shared/oracle.rb +13 -41
  74. data/lib/sequel/adapters/shared/postgres.rb +58 -264
  75. data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
  76. data/lib/sequel/adapters/shared/sqlite.rb +22 -101
  77. data/lib/sequel/adapters/sqlanywhere.rb +4 -23
  78. data/lib/sequel/adapters/sqlite.rb +2 -19
  79. data/lib/sequel/adapters/tinytds.rb +5 -15
  80. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  81. data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -4
  82. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
  83. data/lib/sequel/adapters/utils/replace.rb +0 -5
  84. data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
  85. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
  86. data/lib/sequel/ast_transformer.rb +3 -94
  87. data/lib/sequel/connection_pool/sharded_single.rb +1 -4
  88. data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
  89. data/lib/sequel/connection_pool/single.rb +0 -2
  90. data/lib/sequel/connection_pool/threaded.rb +94 -110
  91. data/lib/sequel/connection_pool.rb +38 -28
  92. data/lib/sequel/core.rb +42 -101
  93. data/lib/sequel/database/connecting.rb +23 -60
  94. data/lib/sequel/database/dataset.rb +6 -9
  95. data/lib/sequel/database/dataset_defaults.rb +4 -48
  96. data/lib/sequel/database/features.rb +5 -4
  97. data/lib/sequel/database/logging.rb +2 -9
  98. data/lib/sequel/database/misc.rb +36 -55
  99. data/lib/sequel/database/query.rb +8 -13
  100. data/lib/sequel/database/schema_generator.rb +93 -64
  101. data/lib/sequel/database/schema_methods.rb +61 -79
  102. data/lib/sequel/database/transactions.rb +4 -24
  103. data/lib/sequel/database.rb +12 -2
  104. data/lib/sequel/dataset/actions.rb +57 -107
  105. data/lib/sequel/dataset/dataset_module.rb +4 -16
  106. data/lib/sequel/dataset/features.rb +35 -30
  107. data/lib/sequel/dataset/graph.rb +40 -49
  108. data/lib/sequel/dataset/misc.rb +12 -37
  109. data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
  110. data/lib/sequel/dataset/prepared_statements.rb +23 -51
  111. data/lib/sequel/dataset/query.rb +91 -161
  112. data/lib/sequel/dataset/sql.rb +33 -225
  113. data/lib/sequel/dataset.rb +18 -10
  114. data/lib/sequel/deprecated.rb +18 -27
  115. data/lib/sequel/exceptions.rb +1 -17
  116. data/lib/sequel/extensions/_model_pg_row.rb +0 -7
  117. data/lib/sequel/extensions/_pretty_table.rb +1 -3
  118. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  119. data/lib/sequel/extensions/connection_expiration.rb +1 -1
  120. data/lib/sequel/extensions/connection_validator.rb +1 -1
  121. data/lib/sequel/extensions/constraint_validations.rb +11 -11
  122. data/lib/sequel/extensions/core_extensions.rb +39 -49
  123. data/lib/sequel/extensions/core_refinements.rb +39 -45
  124. data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
  125. data/lib/sequel/extensions/date_arithmetic.rb +7 -7
  126. data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
  127. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  128. data/lib/sequel/extensions/eval_inspect.rb +4 -11
  129. data/lib/sequel/extensions/freeze_datasets.rb +1 -69
  130. data/lib/sequel/extensions/from_block.rb +1 -35
  131. data/lib/sequel/extensions/graph_each.rb +2 -2
  132. data/lib/sequel/extensions/identifier_mangling.rb +9 -19
  133. data/lib/sequel/extensions/implicit_subquery.rb +2 -2
  134. data/lib/sequel/extensions/inflector.rb +4 -4
  135. data/lib/sequel/extensions/migration.rb +27 -43
  136. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
  137. data/lib/sequel/extensions/null_dataset.rb +2 -8
  138. data/lib/sequel/extensions/pagination.rb +1 -17
  139. data/lib/sequel/extensions/pg_array.rb +20 -189
  140. data/lib/sequel/extensions/pg_extended_date_support.rb +230 -0
  141. data/lib/sequel/extensions/pg_hstore.rb +11 -50
  142. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
  143. data/lib/sequel/extensions/pg_inet.rb +3 -16
  144. data/lib/sequel/extensions/pg_interval.rb +1 -20
  145. data/lib/sequel/extensions/pg_json.rb +7 -27
  146. data/lib/sequel/extensions/pg_loose_count.rb +1 -1
  147. data/lib/sequel/extensions/pg_range.rb +6 -121
  148. data/lib/sequel/extensions/pg_range_ops.rb +1 -3
  149. data/lib/sequel/extensions/pg_row.rb +5 -77
  150. data/lib/sequel/extensions/pg_row_ops.rb +2 -13
  151. data/lib/sequel/extensions/query.rb +3 -4
  152. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  153. data/lib/sequel/extensions/schema_dumper.rb +13 -13
  154. data/lib/sequel/extensions/select_remove.rb +3 -3
  155. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  156. data/lib/sequel/extensions/sql_comments.rb +2 -2
  157. data/lib/sequel/extensions/string_agg.rb +11 -8
  158. data/lib/sequel/extensions/symbol_aref.rb +6 -20
  159. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  160. data/lib/sequel/model/associations.rb +129 -131
  161. data/lib/sequel/model/base.rb +133 -731
  162. data/lib/sequel/model/default_inflections.rb +1 -1
  163. data/lib/sequel/model/errors.rb +0 -3
  164. data/lib/sequel/model/exceptions.rb +2 -6
  165. data/lib/sequel/model/inflections.rb +1 -26
  166. data/lib/sequel/model/plugins.rb +1 -0
  167. data/lib/sequel/model.rb +27 -62
  168. data/lib/sequel/plugins/active_model.rb +2 -5
  169. data/lib/sequel/plugins/association_dependencies.rb +15 -15
  170. data/lib/sequel/plugins/association_pks.rb +14 -28
  171. data/lib/sequel/plugins/association_proxies.rb +6 -7
  172. data/lib/sequel/plugins/auto_validations.rb +4 -4
  173. data/lib/sequel/plugins/before_after_save.rb +0 -43
  174. data/lib/sequel/plugins/blacklist_security.rb +9 -8
  175. data/lib/sequel/plugins/boolean_readers.rb +3 -3
  176. data/lib/sequel/plugins/boolean_subsets.rb +2 -2
  177. data/lib/sequel/plugins/caching.rb +5 -5
  178. data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
  179. data/lib/sequel/plugins/column_conflicts.rb +2 -2
  180. data/lib/sequel/plugins/column_select.rb +2 -2
  181. data/lib/sequel/plugins/composition.rb +15 -24
  182. data/lib/sequel/plugins/constraint_validations.rb +4 -3
  183. data/lib/sequel/plugins/csv_serializer.rb +13 -20
  184. data/lib/sequel/plugins/dataset_associations.rb +2 -2
  185. data/lib/sequel/plugins/def_dataset_method.rb +5 -5
  186. data/lib/sequel/plugins/defaults_setter.rb +1 -1
  187. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  188. data/lib/sequel/plugins/finder.rb +16 -10
  189. data/lib/sequel/plugins/force_encoding.rb +1 -7
  190. data/lib/sequel/plugins/hook_class_methods.rb +4 -106
  191. data/lib/sequel/plugins/input_transformer.rb +10 -11
  192. data/lib/sequel/plugins/insert_returning_select.rb +1 -9
  193. data/lib/sequel/plugins/instance_filters.rb +5 -5
  194. data/lib/sequel/plugins/instance_hooks.rb +7 -52
  195. data/lib/sequel/plugins/inverted_subsets.rb +3 -1
  196. data/lib/sequel/plugins/json_serializer.rb +19 -19
  197. data/lib/sequel/plugins/lazy_attributes.rb +1 -10
  198. data/lib/sequel/plugins/list.rb +6 -6
  199. data/lib/sequel/plugins/many_through_many.rb +11 -8
  200. data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
  201. data/lib/sequel/plugins/nested_attributes.rb +18 -31
  202. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  203. data/lib/sequel/plugins/pg_array_associations.rb +8 -2
  204. data/lib/sequel/plugins/pg_row.rb +2 -11
  205. data/lib/sequel/plugins/prepared_statements.rb +13 -66
  206. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
  207. data/lib/sequel/plugins/rcte_tree.rb +7 -7
  208. data/lib/sequel/plugins/serialization.rb +15 -33
  209. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  210. data/lib/sequel/plugins/sharding.rb +2 -8
  211. data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
  212. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  213. data/lib/sequel/plugins/static_cache.rb +8 -9
  214. data/lib/sequel/plugins/string_stripper.rb +3 -3
  215. data/lib/sequel/plugins/subclasses.rb +1 -1
  216. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  217. data/lib/sequel/plugins/table_select.rb +2 -2
  218. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  219. data/lib/sequel/plugins/timestamps.rb +6 -7
  220. data/lib/sequel/plugins/touch.rb +4 -8
  221. data/lib/sequel/plugins/tree.rb +3 -3
  222. data/lib/sequel/plugins/typecast_on_load.rb +2 -2
  223. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  224. data/lib/sequel/plugins/update_or_create.rb +3 -3
  225. data/lib/sequel/plugins/update_refresh.rb +3 -3
  226. data/lib/sequel/plugins/uuid.rb +7 -11
  227. data/lib/sequel/plugins/validation_class_methods.rb +10 -9
  228. data/lib/sequel/plugins/validation_contexts.rb +4 -4
  229. data/lib/sequel/plugins/validation_helpers.rb +26 -25
  230. data/lib/sequel/plugins/whitelist_security.rb +13 -9
  231. data/lib/sequel/plugins/xml_serializer.rb +24 -25
  232. data/lib/sequel/sql.rb +145 -276
  233. data/lib/sequel/timezones.rb +8 -23
  234. data/lib/sequel/version.rb +2 -2
  235. data/lib/sequel.rb +1 -1
  236. data/spec/adapter_spec.rb +1 -1
  237. data/spec/adapters/db2_spec.rb +2 -103
  238. data/spec/adapters/mssql_spec.rb +89 -68
  239. data/spec/adapters/mysql_spec.rb +111 -478
  240. data/spec/adapters/oracle_spec.rb +1 -9
  241. data/spec/adapters/postgres_spec.rb +459 -664
  242. data/spec/adapters/spec_helper.rb +12 -31
  243. data/spec/adapters/sqlanywhere_spec.rb +2 -77
  244. data/spec/adapters/sqlite_spec.rb +8 -146
  245. data/spec/bin_spec.rb +11 -16
  246. data/spec/core/connection_pool_spec.rb +173 -74
  247. data/spec/core/database_spec.rb +96 -244
  248. data/spec/core/dataset_spec.rb +99 -414
  249. data/spec/core/deprecated_spec.rb +3 -3
  250. data/spec/core/expression_filters_spec.rb +37 -144
  251. data/spec/core/mock_adapter_spec.rb +241 -4
  252. data/spec/core/object_graph_spec.rb +11 -60
  253. data/spec/core/placeholder_literalizer_spec.rb +1 -14
  254. data/spec/core/schema_generator_spec.rb +51 -40
  255. data/spec/core/schema_spec.rb +88 -77
  256. data/spec/core/spec_helper.rb +6 -24
  257. data/spec/core/version_spec.rb +1 -1
  258. data/spec/core_extensions_spec.rb +7 -83
  259. data/spec/core_model_spec.rb +2 -2
  260. data/spec/deprecation_helper.rb +2 -14
  261. data/spec/extensions/accessed_columns_spec.rb +1 -1
  262. data/spec/extensions/active_model_spec.rb +3 -3
  263. data/spec/extensions/after_initialize_spec.rb +1 -1
  264. data/spec/extensions/arbitrary_servers_spec.rb +2 -2
  265. data/spec/extensions/association_dependencies_spec.rb +1 -1
  266. data/spec/extensions/association_pks_spec.rb +30 -92
  267. data/spec/extensions/association_proxies_spec.rb +1 -1
  268. data/spec/extensions/auto_literal_strings_spec.rb +1 -12
  269. data/spec/extensions/auto_validations_spec.rb +1 -1
  270. data/spec/extensions/blacklist_security_spec.rb +1 -1
  271. data/spec/extensions/blank_spec.rb +1 -1
  272. data/spec/extensions/boolean_readers_spec.rb +1 -1
  273. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  274. data/spec/extensions/caching_spec.rb +1 -1
  275. data/spec/extensions/class_table_inheritance_spec.rb +53 -1118
  276. data/spec/extensions/column_conflicts_spec.rb +1 -1
  277. data/spec/extensions/column_select_spec.rb +4 -4
  278. data/spec/extensions/columns_introspection_spec.rb +1 -1
  279. data/spec/extensions/columns_updated_spec.rb +1 -1
  280. data/spec/extensions/composition_spec.rb +8 -30
  281. data/spec/extensions/connection_expiration_spec.rb +3 -3
  282. data/spec/extensions/connection_validator_spec.rb +3 -3
  283. data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
  284. data/spec/extensions/constraint_validations_spec.rb +1 -1
  285. data/spec/extensions/core_refinements_spec.rb +1 -3
  286. data/spec/extensions/csv_serializer_spec.rb +4 -9
  287. data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
  288. data/spec/extensions/dataset_associations_spec.rb +2 -1
  289. data/spec/extensions/dataset_source_alias_spec.rb +1 -1
  290. data/spec/extensions/date_arithmetic_spec.rb +3 -3
  291. data/spec/extensions/def_dataset_method_spec.rb +1 -1
  292. data/spec/extensions/defaults_setter_spec.rb +2 -2
  293. data/spec/extensions/delay_add_association_spec.rb +8 -9
  294. data/spec/extensions/dirty_spec.rb +1 -1
  295. data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
  296. data/spec/extensions/eager_each_spec.rb +2 -2
  297. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  298. data/spec/extensions/error_splitter_spec.rb +1 -1
  299. data/spec/extensions/error_sql_spec.rb +1 -1
  300. data/spec/extensions/eval_inspect_spec.rb +1 -1
  301. data/spec/extensions/finder_spec.rb +1 -1
  302. data/spec/extensions/force_encoding_spec.rb +2 -5
  303. data/spec/extensions/freeze_datasets_spec.rb +1 -1
  304. data/spec/extensions/graph_each_spec.rb +5 -5
  305. data/spec/extensions/hook_class_methods_spec.rb +1 -194
  306. data/spec/extensions/identifier_mangling_spec.rb +17 -170
  307. data/spec/extensions/implicit_subquery_spec.rb +1 -5
  308. data/spec/extensions/inflector_spec.rb +1 -1
  309. data/spec/extensions/input_transformer_spec.rb +7 -2
  310. data/spec/extensions/insert_returning_select_spec.rb +1 -1
  311. data/spec/extensions/instance_filters_spec.rb +1 -1
  312. data/spec/extensions/instance_hooks_spec.rb +1 -95
  313. data/spec/extensions/inverted_subsets_spec.rb +1 -1
  314. data/spec/extensions/json_serializer_spec.rb +1 -1
  315. data/spec/extensions/lazy_attributes_spec.rb +1 -7
  316. data/spec/extensions/list_spec.rb +5 -6
  317. data/spec/extensions/looser_typecasting_spec.rb +1 -1
  318. data/spec/extensions/many_through_many_spec.rb +25 -33
  319. data/spec/extensions/migration_spec.rb +12 -2
  320. data/spec/extensions/modification_detection_spec.rb +1 -1
  321. data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
  322. data/spec/extensions/named_timezones_spec.rb +3 -3
  323. data/spec/extensions/nested_attributes_spec.rb +1 -29
  324. data/spec/extensions/null_dataset_spec.rb +1 -11
  325. data/spec/extensions/optimistic_locking_spec.rb +2 -2
  326. data/spec/extensions/pagination_spec.rb +1 -1
  327. data/spec/extensions/pg_array_associations_spec.rb +22 -26
  328. data/spec/extensions/pg_array_ops_spec.rb +1 -1
  329. data/spec/extensions/pg_array_spec.rb +3 -48
  330. data/spec/extensions/pg_enum_spec.rb +1 -1
  331. data/spec/extensions/pg_extended_date_support_spec.rb +122 -0
  332. data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
  333. data/spec/extensions/pg_hstore_spec.rb +22 -31
  334. data/spec/extensions/pg_inet_ops_spec.rb +1 -1
  335. data/spec/extensions/pg_inet_spec.rb +1 -14
  336. data/spec/extensions/pg_interval_spec.rb +3 -13
  337. data/spec/extensions/pg_json_ops_spec.rb +1 -1
  338. data/spec/extensions/pg_json_spec.rb +1 -13
  339. data/spec/extensions/pg_loose_count_spec.rb +1 -1
  340. data/spec/extensions/pg_range_ops_spec.rb +1 -1
  341. data/spec/extensions/pg_range_spec.rb +3 -88
  342. data/spec/extensions/pg_row_ops_spec.rb +1 -1
  343. data/spec/extensions/pg_row_plugin_spec.rb +1 -1
  344. data/spec/extensions/pg_row_spec.rb +1 -44
  345. data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
  346. data/spec/extensions/prepared_statements_safe_spec.rb +7 -7
  347. data/spec/extensions/prepared_statements_spec.rb +13 -48
  348. data/spec/extensions/pretty_table_spec.rb +40 -9
  349. data/spec/extensions/query_spec.rb +1 -12
  350. data/spec/extensions/rcte_tree_spec.rb +23 -34
  351. data/spec/extensions/round_timestamps_spec.rb +1 -5
  352. data/spec/extensions/s_spec.rb +1 -1
  353. data/spec/extensions/schema_caching_spec.rb +1 -1
  354. data/spec/extensions/schema_dumper_spec.rb +43 -32
  355. data/spec/extensions/select_remove_spec.rb +1 -1
  356. data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
  357. data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
  358. data/spec/extensions/serialization_spec.rb +5 -17
  359. data/spec/extensions/server_block_spec.rb +1 -1
  360. data/spec/extensions/server_logging_spec.rb +2 -2
  361. data/spec/extensions/sharding_spec.rb +1 -1
  362. data/spec/extensions/shared_caching_spec.rb +1 -28
  363. data/spec/extensions/single_table_inheritance_spec.rb +2 -5
  364. data/spec/extensions/singular_table_names_spec.rb +1 -1
  365. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  366. data/spec/extensions/spec_helper.rb +5 -27
  367. data/spec/extensions/split_array_nil_spec.rb +1 -1
  368. data/spec/extensions/split_values_spec.rb +1 -1
  369. data/spec/extensions/sql_comments_spec.rb +1 -1
  370. data/spec/extensions/sql_expr_spec.rb +1 -1
  371. data/spec/extensions/static_cache_spec.rb +1 -1
  372. data/spec/extensions/string_agg_spec.rb +2 -2
  373. data/spec/extensions/string_date_time_spec.rb +1 -1
  374. data/spec/extensions/string_stripper_spec.rb +1 -1
  375. data/spec/extensions/subclasses_spec.rb +1 -1
  376. data/spec/extensions/subset_conditions_spec.rb +1 -1
  377. data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
  378. data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
  379. data/spec/extensions/synchronize_sql_spec.rb +124 -0
  380. data/spec/extensions/table_select_spec.rb +4 -4
  381. data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
  382. data/spec/extensions/thread_local_timezones_spec.rb +1 -1
  383. data/spec/extensions/timestamps_spec.rb +5 -7
  384. data/spec/extensions/to_dot_spec.rb +1 -1
  385. data/spec/extensions/touch_spec.rb +1 -1
  386. data/spec/extensions/tree_spec.rb +1 -1
  387. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  388. data/spec/extensions/unlimited_update_spec.rb +1 -1
  389. data/spec/extensions/update_or_create_spec.rb +12 -16
  390. data/spec/extensions/update_primary_key_spec.rb +4 -3
  391. data/spec/extensions/update_refresh_spec.rb +1 -1
  392. data/spec/extensions/uuid_spec.rb +10 -13
  393. data/spec/extensions/validate_associated_spec.rb +1 -1
  394. data/spec/extensions/validation_class_methods_spec.rb +3 -3
  395. data/spec/extensions/validation_contexts_spec.rb +1 -1
  396. data/spec/extensions/validation_helpers_spec.rb +10 -44
  397. data/spec/extensions/whitelist_security_spec.rb +5 -5
  398. data/spec/extensions/xml_serializer_spec.rb +8 -13
  399. data/spec/guards_helper.rb +2 -1
  400. data/spec/integration/associations_test.rb +1 -23
  401. data/spec/integration/database_test.rb +7 -7
  402. data/spec/integration/dataset_test.rb +12 -47
  403. data/spec/integration/eager_loader_test.rb +1 -1
  404. data/spec/integration/migrator_test.rb +1 -1
  405. data/spec/integration/model_test.rb +4 -82
  406. data/spec/integration/plugin_test.rb +7 -23
  407. data/spec/integration/prepared_statement_test.rb +8 -88
  408. data/spec/integration/schema_test.rb +10 -10
  409. data/spec/integration/spec_helper.rb +17 -21
  410. data/spec/integration/timezone_test.rb +5 -5
  411. data/spec/integration/transaction_test.rb +3 -55
  412. data/spec/integration/type_test.rb +9 -9
  413. data/spec/model/association_reflection_spec.rb +24 -9
  414. data/spec/model/associations_spec.rb +124 -303
  415. data/spec/model/base_spec.rb +43 -137
  416. data/spec/model/class_dataset_methods_spec.rb +2 -20
  417. data/spec/model/dataset_methods_spec.rb +1 -20
  418. data/spec/model/eager_loading_spec.rb +48 -17
  419. data/spec/model/hooks_spec.rb +5 -300
  420. data/spec/model/inflector_spec.rb +1 -1
  421. data/spec/model/model_spec.rb +29 -339
  422. data/spec/model/plugins_spec.rb +2 -16
  423. data/spec/model/record_spec.rb +33 -129
  424. data/spec/model/spec_helper.rb +5 -15
  425. data/spec/model/validations_spec.rb +1 -1
  426. data/spec/sequel_warning.rb +1 -12
  427. metadata +19 -65
  428. data/doc/active_record.rdoc +0 -927
  429. data/lib/sequel/adapters/cubrid.rb +0 -160
  430. data/lib/sequel/adapters/do/mysql.rb +0 -69
  431. data/lib/sequel/adapters/do/postgres.rb +0 -46
  432. data/lib/sequel/adapters/do/sqlite3.rb +0 -41
  433. data/lib/sequel/adapters/do.rb +0 -166
  434. data/lib/sequel/adapters/jdbc/as400.rb +0 -92
  435. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
  436. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
  437. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
  438. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
  439. data/lib/sequel/adapters/odbc/progress.rb +0 -12
  440. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  441. data/lib/sequel/adapters/shared/firebird.rb +0 -261
  442. data/lib/sequel/adapters/shared/informix.rb +0 -63
  443. data/lib/sequel/adapters/shared/progress.rb +0 -40
  444. data/lib/sequel/adapters/swift/mysql.rb +0 -50
  445. data/lib/sequel/adapters/swift/postgres.rb +0 -49
  446. data/lib/sequel/adapters/swift/sqlite.rb +0 -48
  447. data/lib/sequel/adapters/swift.rb +0 -169
  448. data/lib/sequel/adapters/utils/pg_types.rb +0 -4
  449. data/lib/sequel/dataset/mutation.rb +0 -98
  450. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
  451. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
  452. data/lib/sequel/extensions/filter_having.rb +0 -65
  453. data/lib/sequel/extensions/hash_aliases.rb +0 -51
  454. data/lib/sequel/extensions/meta_def.rb +0 -37
  455. data/lib/sequel/extensions/query_literals.rb +0 -86
  456. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
  457. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
  458. data/lib/sequel/extensions/set_overrides.rb +0 -82
  459. data/lib/sequel/no_core_ext.rb +0 -4
  460. data/lib/sequel/plugins/association_autoreloading.rb +0 -11
  461. data/lib/sequel/plugins/identifier_columns.rb +0 -49
  462. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
  463. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
  464. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
  465. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
  466. data/lib/sequel/plugins/schema.rb +0 -84
  467. data/lib/sequel/plugins/scissors.rb +0 -37
  468. data/spec/core/dataset_mutation_spec.rb +0 -253
  469. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
  470. data/spec/extensions/before_after_save_spec.rb +0 -40
  471. data/spec/extensions/filter_having_spec.rb +0 -42
  472. data/spec/extensions/from_block_spec.rb +0 -21
  473. data/spec/extensions/hash_aliases_spec.rb +0 -26
  474. data/spec/extensions/identifier_columns_spec.rb +0 -19
  475. data/spec/extensions/meta_def_spec.rb +0 -35
  476. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
  477. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
  478. data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
  479. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
  480. data/spec/extensions/query_literals_spec.rb +0 -185
  481. data/spec/extensions/schema_spec.rb +0 -123
  482. data/spec/extensions/scissors_spec.rb +0 -27
  483. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
  484. data/spec/extensions/set_overrides_spec.rb +0 -75
@@ -14,13 +14,12 @@ module Sequel
14
14
 
15
15
  EMPTY_ARRAY = [].freeze
16
16
 
17
- # The dataset options that require the removal of cached columns
18
- # if changed.
17
+ # The dataset options that require the removal of cached columns if changed.
19
18
  COLUMN_CHANGE_OPTS = [:select, :sql, :from, :join].freeze
20
19
 
21
20
  # Which options don't affect the SQL generation. Used by simple_select_all?
22
21
  # to determine if this is a simple SELECT * FROM table.
23
- NON_SQL_OPTIONS = [:server, :graph, :graph_aliases, :row_proc, :quote_identifiers, :identifier_input_method, :identifier_output_method, :skip_symbol_cache].freeze # SEQUEL5: Remove graph_aliases
22
+ NON_SQL_OPTIONS = [:server, :graph, :row_proc, :quote_identifiers, :skip_symbol_cache].freeze
24
23
 
25
24
  # These symbols have _join methods created (e.g. inner_join) that
26
25
  # call join_table with the symbol, passing along the arguments and
@@ -37,14 +36,13 @@ module Sequel
37
36
 
38
37
  # Methods that return modified datasets
39
38
  QUERY_METHODS = ((<<-METHS).split.map(&:to_sym) + JOIN_METHODS).freeze
40
- add_graph_aliases and distinct except exclude exclude_having exclude_where
39
+ add_graph_aliases distinct except exclude exclude_having
41
40
  filter for_update from from_self graph grep group group_and_count group_append group_by having intersect invert
42
41
  limit lock_style naked offset or order order_append order_by order_more order_prepend qualify
43
42
  reverse reverse_order select select_all select_append select_group select_more server
44
43
  set_graph_aliases unfiltered ungraphed ungrouped union
45
44
  unlimited unordered where with with_recursive with_sql
46
45
  METHS
47
- # SEQUEL5: Remove and, exclude_where
48
46
 
49
47
  # Register an extension callback for Dataset objects. ext should be the
50
48
  # extension name symbol, and mod should either be a Module that the
@@ -67,12 +65,6 @@ module Sequel
67
65
  Sequel.synchronize{EXTENSIONS[ext] = block}
68
66
  end
69
67
 
70
- # Alias for where.
71
- def and(*cond, &block)
72
- Sequel::Deprecation.deprecate("Sequel::Dataset#and", "Use #where, or use the sequel_4_dataset_methods extension")
73
- where(*cond, &block)
74
- end
75
-
76
68
  # On Ruby 2.4+, use clone(:freeze=>false) to create clones, because
77
69
  # we use true freezing in that case, and we need to modify the opts
78
70
  # in the frozen copy.
@@ -89,13 +81,13 @@ module Sequel
89
81
  # If the options changed include options in COLUMN_CHANGE_OPTS, the cached
90
82
  # columns are deleted. This method should generally not be called
91
83
  # directly by user code.
92
- def clone(opts = OPTS)
84
+ def clone(opts = (return self; nil))
93
85
  c = super(:freeze=>false)
94
86
  c.opts.merge!(opts)
95
87
  unless opts.each_key{|o| break if COLUMN_CHANGE_OPTS.include?(o)}
96
88
  c.clear_columns_cache
97
89
  end
98
- c.freeze if frozen? # SEQUEL5: Remove if frozen?
90
+ c.freeze
99
91
  c
100
92
  end
101
93
  else
@@ -106,7 +98,7 @@ module Sequel
106
98
  unless opts.each_key{|o| break if COLUMN_CHANGE_OPTS.include?(o)}
107
99
  c.clear_columns_cache
108
100
  end
109
- c.freeze if frozen? # SEQUEL5: c.opts.freeze
101
+ c.opts.freeze
110
102
  c
111
103
  end
112
104
  # :nocov:
@@ -140,10 +132,10 @@ module Sequel
140
132
  # DB[:items].except(DB[:other_items])
141
133
  # # SELECT * FROM (SELECT * FROM items EXCEPT SELECT * FROM other_items) AS t1
142
134
  #
143
- # DB[:items].except(DB[:other_items], :all=>true, :from_self=>false)
135
+ # DB[:items].except(DB[:other_items], all: true, from_self: false)
144
136
  # # SELECT * FROM items EXCEPT ALL SELECT * FROM other_items
145
137
  #
146
- # DB[:items].except(DB[:other_items], :alias=>:i)
138
+ # DB[:items].except(DB[:other_items], alias: :i)
147
139
  # # SELECT * FROM (SELECT * FROM items EXCEPT SELECT * FROM other_items) AS i
148
140
  def except(dataset, opts=OPTS)
149
141
  raise(InvalidOperation, "EXCEPT not supported") unless supports_intersect_except?
@@ -154,10 +146,10 @@ module Sequel
154
146
  # Performs the inverse of Dataset#where. Note that if you have multiple filter
155
147
  # conditions, this is not the same as a negation of all conditions.
156
148
  #
157
- # DB[:items].exclude(:category => 'software')
149
+ # DB[:items].exclude(category: 'software')
158
150
  # # SELECT * FROM items WHERE (category != 'software')
159
151
  #
160
- # DB[:items].exclude(:category => 'software', :id=>3)
152
+ # DB[:items].exclude(category: 'software', id: 3)
161
153
  # # SELECT * FROM items WHERE ((category != 'software') OR (id != 3))
162
154
  #
163
155
  # Also note that SQL uses 3-valued boolean logic (+true+, +false+, +NULL+), so
@@ -165,7 +157,7 @@ module Sequel
165
157
  # not match rows that were NULL originally. If you take the earlier
166
158
  # example:
167
159
  #
168
- # DB[:items].exclude(:category => 'software')
160
+ # DB[:items].exclude(category: 'software')
169
161
  # # SELECT * FROM items WHERE (category != 'software')
170
162
  #
171
163
  # Note that this does not match rows where +category+ is +NULL+. This
@@ -173,7 +165,7 @@ module Sequel
173
165
  # or not the +NULL+ category is +software+. You can explicitly
174
166
  # specify how to handle +NULL+ values if you want:
175
167
  #
176
- # DB[:items].exclude(Sequel.~(:category=>nil) & {:category => 'software'})
168
+ # DB[:items].exclude(Sequel.~(category: nil) & {category: 'software'})
177
169
  # # SELECT * FROM items WHERE ((category IS NULL) OR (category != 'software'))
178
170
  def exclude(*cond, &block)
179
171
  add_filter(:where, cond, true, &block)
@@ -190,12 +182,6 @@ module Sequel
190
182
  add_filter(:having, cond, true, &block)
191
183
  end
192
184
 
193
- # Alias for exclude.
194
- def exclude_where(*cond, &block)
195
- Sequel::Deprecation.deprecate("Sequel::Dataset#exclude_where", "Use #exclude, or use the sequel_4_dataset_methods extension")
196
- exclude(*cond, &block)
197
- end
198
-
199
185
  if TRUE_FREEZE
200
186
  # Return a clone of the dataset loaded with the given dataset extensions.
201
187
  # If no related extension file exists or the extension does not have
@@ -203,7 +189,7 @@ module Sequel
203
189
  def extension(*a)
204
190
  c = _clone(:freeze=>false)
205
191
  c.send(:_extension!, a)
206
- c.freeze if frozen? # SEQUEL5: Remove if frozen?
192
+ c.freeze
207
193
  c
208
194
  end
209
195
  else
@@ -269,7 +255,10 @@ module Sequel
269
255
  end
270
256
 
271
257
  # Returns a dataset selecting from the current dataset.
272
- # Supplying the :alias option controls the alias of the result.
258
+ # Options:
259
+ # :alias :: Controls the alias of the table
260
+ # :column_aliases :: Also aliases columns, using derived column lists.
261
+ # Only used in conjunction with :alias.
273
262
  #
274
263
  # ds = DB[:items].order(:name).select(:id, :name)
275
264
  # # SELECT id,name FROM items ORDER BY name
@@ -277,10 +266,10 @@ module Sequel
277
266
  # ds.from_self
278
267
  # # SELECT * FROM (SELECT id, name FROM items ORDER BY name) AS t1
279
268
  #
280
- # ds.from_self(:alias=>:foo)
269
+ # ds.from_self(alias: :foo)
281
270
  # # SELECT * FROM (SELECT id, name FROM items ORDER BY name) AS foo
282
271
  #
283
- # ds.from_self(:alias=>:foo, :column_aliases=>[:c1, :c2])
272
+ # ds.from_self(alias: :foo, column_aliases: [:c1, :c2])
284
273
  # # SELECT * FROM (SELECT id, name FROM items ORDER BY name) AS foo(c1, c2)
285
274
  def from_self(opts=OPTS)
286
275
  fs = {}
@@ -293,9 +282,9 @@ module Sequel
293
282
  end
294
283
 
295
284
  # Match any of the columns to any of the patterns. The terms can be
296
- # strings (which use LIKE) or regular expressions (which are only
297
- # supported on MySQL and PostgreSQL). Note that the total number of
298
- # pattern matches will be Array(columns).length * Array(terms).length,
285
+ # strings (which use LIKE) or regular expressions if the database supports that.
286
+ # Note that the total number of pattern matches will be
287
+ # Array(columns).length * Array(terms).length,
299
288
  # which could cause performance issues.
300
289
  #
301
290
  # Options (all are boolean):
@@ -316,15 +305,15 @@ module Sequel
316
305
  # # SELECT * FROM items WHERE ((a LIKE '%test%' ESCAPE '\') OR (a LIKE 'foo' ESCAPE '\')
317
306
  # # OR (b LIKE '%test%' ESCAPE '\') OR (b LIKE 'foo' ESCAPE '\'))
318
307
  #
319
- # dataset.grep([:a, :b], %w'%foo% %bar%', :all_patterns=>true)
308
+ # dataset.grep([:a, :b], %w'%foo% %bar%', all_patterns: true)
320
309
  # # SELECT * FROM a WHERE (((a LIKE '%foo%' ESCAPE '\') OR (b LIKE '%foo%' ESCAPE '\'))
321
310
  # # AND ((a LIKE '%bar%' ESCAPE '\') OR (b LIKE '%bar%' ESCAPE '\')))
322
311
  #
323
- # dataset.grep([:a, :b], %w'%foo% %bar%', :all_columns=>true)
312
+ # dataset.grep([:a, :b], %w'%foo% %bar%', all_columns: true)
324
313
  # # SELECT * FROM a WHERE (((a LIKE '%foo%' ESCAPE '\') OR (a LIKE '%bar%' ESCAPE '\'))
325
314
  # # AND ((b LIKE '%foo%' ESCAPE '\') OR (b LIKE '%bar%' ESCAPE '\')))
326
315
  #
327
- # dataset.grep([:a, :b], %w'%foo% %bar%', :all_patterns=>true, :all_columns=>true)
316
+ # dataset.grep([:a, :b], %w'%foo% %bar%', all_patterns: true, all_columns: true)
328
317
  # # SELECT * FROM a WHERE ((a LIKE '%foo%' ESCAPE '\') AND (b LIKE '%foo%' ESCAPE '\')
329
318
  # # AND (a LIKE '%bar%' ESCAPE '\') AND (b LIKE '%bar%' ESCAPE '\'))
330
319
  def grep(columns, patterns, opts=OPTS)
@@ -372,11 +361,11 @@ module Sequel
372
361
  # # SELECT first_name, last_name, count(*) AS count FROM items GROUP BY first_name, last_name
373
362
  # # => [{:first_name=>'a', :last_name=>'b', :count=>1}, ...]
374
363
  #
375
- # DB[:items].group_and_count(:first_name___name).all
364
+ # DB[:items].group_and_count(Sequel[:first_name].as(:name)).all
376
365
  # # SELECT first_name AS name, count(*) AS count FROM items GROUP BY first_name
377
366
  # # => [{:name=>'a', :count=>1}, ...]
378
367
  #
379
- # DB[:items].group_and_count{substr(first_name, 1, 1).as(initial)}.all
368
+ # DB[:items].group_and_count{substr(:first_name, 1, 1).as(:initial)}.all
380
369
  # # SELECT substr(first_name, 1, 1) AS initial, count(*) AS count FROM items GROUP BY substr(first_name, 1, 1)
381
370
  # # => [{:initial=>'a', :count=>1}, ...]
382
371
  def group_and_count(*columns, &block)
@@ -414,7 +403,7 @@ module Sequel
414
403
 
415
404
  # Returns a copy of the dataset with the HAVING conditions changed. See #where for argument types.
416
405
  #
417
- # DB[:items].group(:sum).having(:sum=>10)
406
+ # DB[:items].group(:sum).having(sum: 10)
418
407
  # # SELECT * FROM items GROUP BY sum HAVING (sum = 10)
419
408
  def having(*cond, &block)
420
409
  add_filter(:having, cond, &block)
@@ -432,10 +421,10 @@ module Sequel
432
421
  # DB[:items].intersect(DB[:other_items])
433
422
  # # SELECT * FROM (SELECT * FROM items INTERSECT SELECT * FROM other_items) AS t1
434
423
  #
435
- # DB[:items].intersect(DB[:other_items], :all=>true, :from_self=>false)
424
+ # DB[:items].intersect(DB[:other_items], all: true, from_self: false)
436
425
  # # SELECT * FROM items INTERSECT ALL SELECT * FROM other_items
437
426
  #
438
- # DB[:items].intersect(DB[:other_items], :alias=>:i)
427
+ # DB[:items].intersect(DB[:other_items], alias: :i)
439
428
  # # SELECT * FROM (SELECT * FROM items INTERSECT SELECT * FROM other_items) AS i
440
429
  def intersect(dataset, opts=OPTS)
441
430
  raise(InvalidOperation, "INTERSECT not supported") unless supports_intersect_except?
@@ -446,10 +435,10 @@ module Sequel
446
435
  # Inverts the current WHERE and HAVING clauses. If there is neither a
447
436
  # WHERE or HAVING clause, adds a WHERE clause that is always false.
448
437
  #
449
- # DB[:items].where(:category => 'software').invert
438
+ # DB[:items].where(category: 'software').invert
450
439
  # # SELECT * FROM items WHERE (category != 'software')
451
440
  #
452
- # DB[:items].where(:category => 'software', :id=>3).invert
441
+ # DB[:items].where(category: 'software', id: 3).invert
453
442
  # # SELECT * FROM items WHERE ((category != 'software') OR (id != 3))
454
443
  #
455
444
  # See documentation for exclude for how inversion is handled in regards
@@ -521,10 +510,10 @@ module Sequel
521
510
  # DB[:a].join_table(:cross, :b)
522
511
  # # SELECT * FROM a CROSS JOIN b
523
512
  #
524
- # DB[:a].join_table(:inner, DB[:b], :c=>d)
513
+ # DB[:a].join_table(:inner, DB[:b], c: d)
525
514
  # # SELECT * FROM a INNER JOIN (SELECT * FROM b) AS t1 ON (t1.c = a.d)
526
515
  #
527
- # DB[:a].join_table(:left, :b___c, [:d])
516
+ # DB[:a].join_table(:left, Sequel[:b].as(:c), [:d])
528
517
  # # SELECT * FROM a LEFT JOIN b AS c USING (d)
529
518
  #
530
519
  # DB[:a].natural_join(:b).join_table(:inner, :c) do |ta, jta, js|
@@ -624,7 +613,7 @@ module Sequel
624
613
  # or JOIN clauses, it will surround the subquery with LATERAL to enable it
625
614
  # to deal with previous tables in the query:
626
615
  #
627
- # DB.from(:a, DB[:b].where(:a__c=>:b__d).lateral)
616
+ # DB.from(:a, DB[:b].where(Sequel[:a][:c]=>Sequel[:b][:d]).lateral)
628
617
  # # SELECT * FROM a, LATERAL (SELECT * FROM b WHERE (a.c = b.d))
629
618
  def lateral
630
619
  clone(:lateral=>true)
@@ -676,8 +665,7 @@ module Sequel
676
665
 
677
666
  # Returns a cloned dataset without a row_proc.
678
667
  #
679
- # ds = DB[:items]
680
- # ds.row_proc = proc(&:invert)
668
+ # ds = DB[:items].with_row_proc(:invert.to_proc)
681
669
  # ds.all # => [{2=>:id}]
682
670
  # ds.naked.all # => [{:id=>2}]
683
671
  def naked
@@ -699,13 +687,13 @@ module Sequel
699
687
 
700
688
  # Adds an alternate filter to an existing WHERE clause using OR. If there
701
689
  # is no WHERE clause, then the default is WHERE true, and OR would be redundant,
702
- # so return an unmodified clone of the dataset in that case.
690
+ # so return the dataset in that case.
703
691
  #
704
692
  # DB[:items].where(:a).or(:b) # SELECT * FROM items WHERE a OR b
705
693
  # DB[:items].or(:b) # SELECT * FROM items
706
694
  def or(*cond, &block)
707
695
  if @opts[:where].nil?
708
- clone
696
+ self
709
697
  else
710
698
  add_filter(:where, cond, false, :OR, &block)
711
699
  end
@@ -720,7 +708,7 @@ module Sequel
720
708
  # DB[:items].order(:name) # SELECT * FROM items ORDER BY name
721
709
  # DB[:items].order(:a, :b) # SELECT * FROM items ORDER BY a, b
722
710
  # DB[:items].order(Sequel.lit('a + b')) # SELECT * FROM items ORDER BY a + b
723
- # DB[:items].order(:a + :b) # SELECT * FROM items ORDER BY (a + b)
711
+ # DB[:items].order(Sequel[:a] + :b) # SELECT * FROM items ORDER BY (a + b)
724
712
  # DB[:items].order(Sequel.desc(:name)) # SELECT * FROM items ORDER BY name DESC
725
713
  # DB[:items].order(Sequel.asc(:name, :nulls=>:last)) # SELECT * FROM items ORDER BY name ASC NULLS LAST
726
714
  # DB[:items].order{sum(name).desc} # SELECT * FROM items ORDER BY sum(name) DESC
@@ -762,14 +750,14 @@ module Sequel
762
750
 
763
751
  # Qualify to the given table, or first source if no table is given.
764
752
  #
765
- # DB[:items].where(:id=>1).qualify
753
+ # DB[:items].where(id: 1).qualify
766
754
  # # SELECT items.* FROM items WHERE (items.id = 1)
767
755
  #
768
- # DB[:items].where(:id=>1).qualify(:i)
756
+ # DB[:items].where(id: 1).qualify(:i)
769
757
  # # SELECT i.* FROM items WHERE (i.id = 1)
770
758
  def qualify(table=first_source)
771
759
  o = @opts
772
- return clone if o[:sql] # SEQUEL5: return self
760
+ return self if o[:sql]
773
761
  h = {}
774
762
  (o.keys & QUALIFY_KEYS).each do |k|
775
763
  h[k] = qualified_expression(o[k], table)
@@ -786,6 +774,16 @@ module Sequel
786
774
  # DB[:items].returning # RETURNING *
787
775
  # DB[:items].returning(nil) # RETURNING NULL
788
776
  # DB[:items].returning(:id, :name) # RETURNING id, name
777
+ #
778
+ # DB[:items].returning.insert(:a=>1) do |hash|
779
+ # # hash for each row inserted, with values for all columns
780
+ # end
781
+ # DB[:items].returning.update(:a=>1) do |hash|
782
+ # # hash for each row updated, with values for all columns
783
+ # end
784
+ # DB[:items].returning.delete(:a=>1) do |hash|
785
+ # # hash for each row deleted, with values for all columns
786
+ # end
789
787
  def returning(*values)
790
788
  raise Error, "RETURNING is not supported on #{db.database_type}" unless supports_returning?(:insert)
791
789
  clone(:returning=>values.freeze)
@@ -864,7 +862,7 @@ module Sequel
864
862
  # DB[:items].select_group(:a, :b)
865
863
  # # SELECT a, b FROM items GROUP BY a, b
866
864
  #
867
- # DB[:items].select_group(:c___a){f(c2)}
865
+ # DB[:items].select_group(Sequel[:c].as(:a)){f(c2)}
868
866
  # # SELECT c AS a, f(c2) FROM items GROUP BY c, f(c2)
869
867
  def select_group(*columns, &block)
870
868
  virtual_row_columns(columns, block)
@@ -915,26 +913,9 @@ module Sequel
915
913
  end
916
914
  end
917
915
 
918
- # Unbind bound variables from this dataset's filter and return an array of two
919
- # objects. The first object is a modified dataset where the filter has been
920
- # replaced with one that uses bound variable placeholders. The second object
921
- # is the hash of unbound variables. You can then prepare and execute (or just
922
- # call) the dataset with the bound variables to get results.
923
- #
924
- # ds, bv = DB[:items].where(:a=>1).unbind
925
- # ds # SELECT * FROM items WHERE (a = $a)
926
- # bv # {:a => 1}
927
- # ds.call(:select, bv)
928
- def unbind
929
- Sequel::Deprecation.deprecate("Dataset#unbind", "Switch to using placeholders manually instead of unbinding them")
930
- u = Unbinder.new
931
- ds = clone(:where=>u.transform(opts[:where]), :join=>u.transform(opts[:join]))
932
- [ds, u.binds]
933
- end
934
-
935
916
  # Returns a copy of the dataset with no filters (HAVING or WHERE clause) applied.
936
917
  #
937
- # DB[:items].group(:a).having(:a=>1).where(:b).unfiltered
918
+ # DB[:items].group(:a).having(a: 1).where(:b).unfiltered
938
919
  # # SELECT * FROM items GROUP BY a
939
920
  def unfiltered
940
921
  cached_dataset(:_unfiltered_ds){clone(:where => nil, :having => nil)}
@@ -942,7 +923,7 @@ module Sequel
942
923
 
943
924
  # Returns a copy of the dataset with no grouping (GROUP or HAVING clause) applied.
944
925
  #
945
- # DB[:items].group(:a).having(:a=>1).where(:b).ungrouped
926
+ # DB[:items].group(:a).having(a: 1).where(:b).ungrouped
946
927
  # # SELECT * FROM items WHERE b
947
928
  def ungrouped
948
929
  cached_dataset(:_ungrouped_ds){clone(:group => nil, :having => nil)}
@@ -959,10 +940,10 @@ module Sequel
959
940
  # DB[:items].union(DB[:other_items])
960
941
  # # SELECT * FROM (SELECT * FROM items UNION SELECT * FROM other_items) AS t1
961
942
  #
962
- # DB[:items].union(DB[:other_items], :all=>true, :from_self=>false)
943
+ # DB[:items].union(DB[:other_items], all: true, from_self: false)
963
944
  # # SELECT * FROM items UNION ALL SELECT * FROM other_items
964
945
  #
965
- # DB[:items].union(DB[:other_items], :alias=>:i)
946
+ # DB[:items].union(DB[:other_items], alias: :i)
966
947
  # # SELECT * FROM (SELECT * FROM items UNION SELECT * FROM other_items) AS i
967
948
  def union(dataset, opts=OPTS)
968
949
  compound_clone(:union, dataset, opts)
@@ -986,18 +967,10 @@ module Sequel
986
967
  #
987
968
  # Accepts the following argument types:
988
969
  #
989
- # Hash :: list of equality/inclusion expressions
990
- # Array :: depends:
991
- # * If first member is a string, assumes the rest of the arguments
992
- # are parameters and interpolates them into the string.
993
- # * If all members are arrays of length two, treats the same way
994
- # as a hash, except it allows for duplicate keys to be
995
- # specified.
996
- # * Otherwise, treats each argument as a separate condition.
997
- # String :: taken literally
970
+ # Hash, Array of pairs :: list of equality/inclusion expressions
998
971
  # Symbol :: taken as a boolean column argument (e.g. WHERE active)
999
- # Sequel::SQL::BooleanExpression :: an existing condition expression,
1000
- # probably created using the Sequel expression filter DSL.
972
+ # Sequel::SQL::BooleanExpression, Sequel::LiteralString :: an existing condition expression, probably created
973
+ # using the Sequel expression filter DSL.
1001
974
  #
1002
975
  # where also accepts a block, which should return one of the above argument
1003
976
  # types, and is treated the same way. This block yields a virtual row object,
@@ -1008,16 +981,16 @@ module Sequel
1008
981
  #
1009
982
  # Examples:
1010
983
  #
1011
- # DB[:items].where(:id => 3)
984
+ # DB[:items].where(id: 3)
1012
985
  # # SELECT * FROM items WHERE (id = 3)
1013
986
  #
1014
- # DB[:items].where('price < ?', 100)
987
+ # DB[:items].where(Sequel.lit('price < ?', 100))
1015
988
  # # SELECT * FROM items WHERE price < 100
1016
989
  #
1017
990
  # DB[:items].where([[:id, [1,2,3]], [:id, 0..10]])
1018
991
  # # SELECT * FROM items WHERE ((id IN (1, 2, 3)) AND ((id >= 0) AND (id <= 10)))
1019
992
  #
1020
- # DB[:items].where('price < 100')
993
+ # DB[:items].where(Sequel.lit('price < 100'))
1021
994
  # # SELECT * FROM items WHERE price < 100
1022
995
  #
1023
996
  # DB[:items].where(:active)
@@ -1028,7 +1001,7 @@ module Sequel
1028
1001
  #
1029
1002
  # Multiple where calls can be chained for scoping:
1030
1003
  #
1031
- # software = dataset.where(:category => 'software').where{price < 100}
1004
+ # software = dataset.where(category: 'software').where{price < 100}
1032
1005
  # # SELECT * FROM items WHERE ((category = 'software') AND (price < 100))
1033
1006
  #
1034
1007
  # See the {"Dataset Filtering" guide}[rdoc-ref:doc/dataset_filtering.rdoc] for more examples and details.
@@ -1042,7 +1015,7 @@ module Sequel
1042
1015
  # :args :: Specify the arguments/columns for the CTE, should be an array of symbols.
1043
1016
  # :recursive :: Specify that this is a recursive CTE
1044
1017
  #
1045
- # DB[:items].with(:items, DB[:syx].where(:name.like('A%')))
1018
+ # DB[:items].with(:items, DB[:syx].where(Sequel[:name].like('A%')))
1046
1019
  # # WITH items AS (SELECT * FROM syx WHERE (name LIKE 'A%' ESCAPE '\')) SELECT * FROM items
1047
1020
  def with(name, dataset, opts=OPTS)
1048
1021
  raise(Error, 'This dataset does not support common table expressions') unless supports_cte?
@@ -1061,15 +1034,15 @@ module Sequel
1061
1034
  # :union_all :: Set to false to use UNION instead of UNION ALL combining the nonrecursive and recursive parts.
1062
1035
  #
1063
1036
  # DB[:t].with_recursive(:t,
1064
- # DB[:i1].select(:id, :parent_id).where(:parent_id=>nil),
1065
- # DB[:i1].join(:t, :id=>:parent_id).select(:i1__id, :i1__parent_id),
1037
+ # DB[:i1].select(:id, :parent_id).where(parent_id: nil),
1038
+ # DB[:i1].join(:t, id: :parent_id).select(Sequel[:i1][:id], Sequel[:i1][:parent_id]),
1066
1039
  # :args=>[:id, :parent_id])
1067
1040
  #
1068
- # # WITH RECURSIVE "t"("id", "parent_id") AS (
1069
- # # SELECT "id", "parent_id" FROM "i1" WHERE ("parent_id" IS NULL)
1041
+ # # WITH RECURSIVE t(id, parent_id) AS (
1042
+ # # SELECT id, parent_id FROM i1 WHERE (parent_id IS NULL)
1070
1043
  # # UNION ALL
1071
- # # SELECT "i1"."id", "i1"."parent_id" FROM "i1" INNER JOIN "t" ON ("t"."id" = "i1"."parent_id")
1072
- # # ) SELECT * FROM "t"
1044
+ # # SELECT i1.id, i1.parent_id FROM i1 INNER JOIN t ON (t.id = i1.parent_id)
1045
+ # # ) SELECT * FROM t
1073
1046
  def with_recursive(name, nonrecursive, recursive, opts=OPTS)
1074
1047
  raise(Error, 'This datatset does not support common table expressions') unless supports_cte?
1075
1048
  if hoist_cte?(nonrecursive)
@@ -1093,7 +1066,7 @@ module Sequel
1093
1066
  c = _clone(:freeze=>false)
1094
1067
  c.extend(*mods) unless mods.empty?
1095
1068
  c.extend(DatasetModule.new(&block)) if block
1096
- c.freeze if frozen? # SEQUEL5: Remove if frozen?
1069
+ c.freeze
1097
1070
  c
1098
1071
  end
1099
1072
  else
@@ -1111,7 +1084,7 @@ module Sequel
1111
1084
  #
1112
1085
  # ds = DB[:items]
1113
1086
  # ds.all # => [{:id=>2}]
1114
- # ds.with_row_proc(proc(&:invert)).all # => [{2=>:id}]
1087
+ # ds.with_row_proc(:invert.to_proc).all # => [{2=>:id}]
1115
1088
  def with_row_proc(callable)
1116
1089
  clone(:row_proc=>callable)
1117
1090
  end
@@ -1132,7 +1105,7 @@ module Sequel
1132
1105
  # Note that datasets that specify custom SQL using this method will generally
1133
1106
  # ignore future dataset methods that modify the SQL used, as specifying custom SQL
1134
1107
  # overrides Sequel's SQL generator. You should probably limit yourself to the following
1135
- # dataset methods when using this method:
1108
+ # dataset methods when using this method, or use the implicit_subquery extension:
1136
1109
  #
1137
1110
  # * each
1138
1111
  # * all
@@ -1146,13 +1119,9 @@ module Sequel
1146
1119
  # * update (if an UPDATE statement, with no arguments)
1147
1120
  # * insert (if an INSERT statement, with no arguments)
1148
1121
  # * truncate (if a TRUNCATE statement, with no arguments)
1149
- #
1150
- # If you want to use arbitrary dataset methods on a dataset that uses custom SQL, call
1151
- # from_self on the dataset, which wraps the custom SQL in a subquery, and allows normal
1152
- # dataset methods that modify the SQL to work.
1153
1122
  def with_sql(sql, *args)
1154
1123
  if sql.is_a?(Symbol)
1155
- sql = send(sql, *args)
1124
+ sql = public_send(sql, *args)
1156
1125
  else
1157
1126
  sql = SQL::PlaceholderLiteralString.new(sql, args) unless args.empty?
1158
1127
  end
@@ -1163,7 +1132,7 @@ module Sequel
1163
1132
 
1164
1133
  # Add the dataset to the list of compounds
1165
1134
  def compound_clone(type, dataset, opts)
1166
- if hoist_cte?(dataset)
1135
+ if dataset.is_a?(Dataset) && dataset.opts[:with] && !supports_cte_in_compounds?
1167
1136
  s, ds = hoist_cte(dataset)
1168
1137
  return s.compound_clone(type, ds, opts)
1169
1138
  end
@@ -1220,30 +1189,18 @@ module Sequel
1220
1189
 
1221
1190
  def add_filter(clause, cond, invert=false, combine=:AND, &block)
1222
1191
  if cond == EMPTY_ARRAY && !block
1223
- Sequel::Deprecation.deprecate("Passing no arguments and no block to a filtering method", "Include at least one argument or a block when calling a filtering method")
1224
- #raise Error, "must provide an argument to a filtering method if not passing a block" # SEQUEL5
1192
+ raise Error, "must provide an argument to a filtering method if not passing a block"
1225
1193
  end
1226
1194
 
1227
1195
  cond = cond.first if cond.size == 1
1228
1196
 
1229
1197
  empty = cond == OPTS || cond == EMPTY_ARRAY
1230
- old_empty = cond.respond_to?(:empty?) && cond.empty?
1231
- if old_empty && !empty
1232
- Sequel::Deprecation.deprecate("Treating #{cond.inspect} as a empty filter expression", "Only {} and [] are considered empty expressions now")
1233
- empty = true
1234
- end
1235
1198
 
1236
1199
  if empty && !block
1237
- clone
1200
+ self
1238
1201
  else
1239
1202
  if cond == nil
1240
- if block
1241
- Sequel::Deprecation.deprecate("Ignoring explicit nil argument when passing a block to a filtering method", "Do not pass an explicit nil argument to the filtering method, only pass the block")
1242
- end
1243
- unless @opts[clause]
1244
- Sequel::Deprecation.deprecate("Ignoring explicit nil argument to a filtering method if dataset has no explicit filter", "Starting in Sequel 5, this will add a NULL condition")
1245
- end
1246
- #cond = Sequel::NULL # SEQUEL5
1203
+ cond = Sequel::NULL
1247
1204
  end
1248
1205
  if empty && block
1249
1206
  cond = nil
@@ -1252,20 +1209,15 @@ module Sequel
1252
1209
  cond = filter_expr(cond, &block)
1253
1210
  cond = SQL::BooleanExpression.invert(cond) if invert
1254
1211
  cond = SQL::BooleanExpression.new(combine, @opts[clause], cond) if @opts[clause]
1255
- clone(clause => cond)
1256
- end
1257
- end
1258
1212
 
1259
- # :nocov:
1260
- def _filter_or_exclude(invert, clause, *cond, &block)
1261
- Sequel::Deprecation.deprecate("Sequel::Dataset#_filter/_filter_or_exclude (private methods)", "Switch to calling a public dataset filtering method directly")
1262
- add_filter(clause, cond, invert, &block)
1263
- end
1213
+ if cond.nil?
1214
+ Sequel::Deprecation.deprecate('Filtering method called on dataset with no existing filter with virtual row block and no argument and virtual row block returned nil. Currently, this results in the filter being ignored instead of using a NULL filter. In Sequel 5.4+, this behavior will change to using a NULL filter, similar to the behavior in all other cases.')
1215
+ #cond = Sequel::NULL
1216
+ end
1264
1217
 
1265
- def _filter(clause, *cond, &block)
1266
- _filter_or_exclude(false, clause, *cond, &block)
1218
+ clone(clause => cond)
1219
+ end
1267
1220
  end
1268
- # :nocov:
1269
1221
 
1270
1222
  # The default :qualify option to use for join tables if one is not specified.
1271
1223
  def default_join_table_qualification
@@ -1277,11 +1229,9 @@ module Sequel
1277
1229
  expr = nil if expr == EMPTY_ARRAY
1278
1230
 
1279
1231
  if block
1280
- if expr
1281
- return SQL::BooleanExpression.new(:AND, filter_expr(expr), filter_expr(Sequel.virtual_row(&block)))
1282
- else
1283
- return filter_expr(Sequel.virtual_row(&block))
1284
- end
1232
+ cond = filter_expr(Sequel.virtual_row(&block))
1233
+ cond = SQL::BooleanExpression.new(:AND, filter_expr(expr), cond) if expr
1234
+ return cond
1285
1235
  end
1286
1236
 
1287
1237
  case expr
@@ -1290,22 +1240,13 @@ module Sequel
1290
1240
  when Array
1291
1241
  if Sequel.condition_specifier?(expr)
1292
1242
  SQL::BooleanExpression.from_value_pairs(expr)
1293
- #else # SEQUEL5
1294
- # raise(Error, "Invalid filter expression: #{expr.inspect}")
1295
- elsif (sexpr = expr[0]).is_a?(String)
1296
- Sequel::Deprecation.deprecate("Calling a dataset filtering method with multiple arguments or an array where the first argument/element is a string", "Use Sequel.lit(#{sexpr.inspect}#{", #{expr[1..-1].map(&:inspect).join(', ')}" if expr.length > 1}) to create an SQL fragment expression and pass that to the dataset filtering method, or use the auto_literal_strings extension")
1297
- SQL::PlaceholderLiteralString.new(sexpr, expr[1..-1], true)
1298
1243
  else
1299
- Sequel::Deprecation.deprecate("Passing multiple arguments as filter arguments when not using a conditions specifier (#{expr.inspect})", "Pass the arguments to separate filter methods or use Sequel.& to combine them")
1300
- SQL::BooleanExpression.new(:AND, *expr.map{|x| filter_expr(x)})
1244
+ raise Error, "Invalid filter expression: #{expr.inspect}"
1301
1245
  end
1302
- when Proc
1303
- Sequel::Deprecation.deprecate("Passing Proc objects as filter arguments", "Pass them as blocks to the filtering methods or to Sequel.expr")
1304
- filter_expr(Sequel.virtual_row(&expr))
1305
1246
  when LiteralString
1306
1247
  LiteralString.new("(#{expr})")
1307
- when Numeric, SQL::NumericExpression, SQL::StringExpression #, Proc, String # SEQUEL5
1308
- raise(Error, "Invalid filter expression: #{expr.inspect}")
1248
+ when Numeric, SQL::NumericExpression, SQL::StringExpression, Proc, String
1249
+ raise Error, "Invalid filter expression: #{expr.inspect}"
1309
1250
  when TrueClass, FalseClass
1310
1251
  if supports_where_true?
1311
1252
  SQL::BooleanExpression.new(:NOOP, expr)
@@ -1314,9 +1255,6 @@ module Sequel
1314
1255
  else
1315
1256
  SQL::Constants::SQLFALSE
1316
1257
  end
1317
- when String
1318
- Sequel::Deprecation.deprecate("Calling a dataset filtering method with a plain string", "Use Sequel.lit(#{expr.inspect}) to create a literal string and pass that to the dataset filtering method, or use the auto_literal_strings extension")
1319
- LiteralString.new("(#{expr})")
1320
1258
  when PlaceholderLiteralizer::Argument
1321
1259
  expr.transform{|v| filter_expr(v)}
1322
1260
  when SQL::PlaceholderLiteralString
@@ -1361,14 +1299,6 @@ module Sequel
1361
1299
  server?(:default)
1362
1300
  end
1363
1301
 
1364
- # SEQUEL5: Remove
1365
- def non_sql_options
1366
- # :nocov:
1367
- Sequel::Deprecation.deprecate("Dataset#non_sql_options (private method)", "Convert the related code to use the non_sql_option? method")
1368
- NON_SQL_OPTIONS
1369
- # :nocov:
1370
- end
1371
-
1372
1302
  # Whether the given option key does not affect the generated SQL.
1373
1303
  def non_sql_option?(key)
1374
1304
  NON_SQL_OPTIONS.include?(key)