sequel 4.49.0 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -12,12 +12,11 @@ module Sequel
12
12
  # Action methods defined by Sequel that execute code on the database.
13
13
  ACTION_METHODS = (<<-METHS).split.map(&:to_sym).freeze
14
14
  << [] all as_hash avg count columns columns! delete each
15
- empty? fetch_rows first first! get import insert interval last
16
- map max min multi_insert paged_each range select_hash select_hash_groups select_map select_order_map
15
+ empty? fetch_rows first first! get import insert last
16
+ map max min multi_insert paged_each select_hash select_hash_groups select_map select_order_map
17
17
  single_record single_record! single_value single_value! sum to_hash to_hash_groups truncate update
18
18
  where_all where_each where_single_value
19
19
  METHS
20
- # SEQUEL5: Remove interval, range
21
20
 
22
21
  # The clone options to use when retriveing columns for a dataset.
23
22
  COLUMNS_CLONE_OPTIONS = {:distinct => nil, :limit => 1, :offset=>nil, :where=>nil, :having=>nil, :order=>nil, :row_proc=>nil, :graph=>nil, :eager_graph=>nil}.freeze
@@ -25,7 +24,7 @@ module Sequel
25
24
  # Inserts the given argument into the database. Returns self so it
26
25
  # can be used safely when chaining:
27
26
  #
28
- # DB[:items] << {:id=>0, :name=>'Zero'} << DB[:old_items].select(:id, name)
27
+ # DB[:items] << {id: 0, name: 'Zero'} << DB[:old_items].select(:id, name)
29
28
  def <<(arg)
30
29
  insert(arg)
31
30
  self
@@ -33,8 +32,8 @@ module Sequel
33
32
 
34
33
  # Returns the first record matching the conditions. Examples:
35
34
  #
36
- # DB[:table][:id=>1] # SELECT * FROM table WHERE (id = 1) LIMIT 1
37
- # # => {:id=1}
35
+ # DB[:table][id: 1] # SELECT * FROM table WHERE (id = 1) LIMIT 1
36
+ # # => {:id=>1}
38
37
  def [](*conditions)
39
38
  raise(Error, 'You cannot call Dataset#[] with an integer or with no arguments') if (conditions.length == 1 and conditions.first.is_a?(Integer)) or conditions.length == 0
40
39
  first(*conditions)
@@ -92,6 +91,8 @@ module Sequel
92
91
  end
93
92
  end
94
93
 
94
+ COUNT_SELECT = Sequel.function(:count).*.as(:count)
95
+
95
96
  # Returns the number of records in the dataset. If an argument is provided,
96
97
  # it is used as the argument to count. If a block is provided, it is
97
98
  # treated as a virtual row, and the result is used as the argument to
@@ -106,8 +107,7 @@ module Sequel
106
107
  def count(arg=(no_arg=true), &block)
107
108
  if no_arg && !block
108
109
  cached_dataset(:_count_ds) do
109
- aggregate_dataset.select(Sequel.function(:count).*.as(:count)).single_value_ds
110
- #aggregate_dataset.select(COUNT_SELECT).single_value_ds # SEQUEL5
110
+ aggregate_dataset.select(COUNT_SELECT).single_value_ds
111
111
  end.single_value!.to_i
112
112
  else
113
113
  if block
@@ -121,12 +121,8 @@ module Sequel
121
121
  _aggregate(:count, arg)
122
122
  end
123
123
  end
124
- # SEQUEL5
125
- #COUNT_SELECT = Sequel.function(:count).*.as(:count)
126
- #private_constant :COUNT_SELECT
127
124
 
128
- # Deletes the records in the dataset. The returned value should be
129
- # number of records deleted, but that is adapter dependent.
125
+ # Deletes the records in the dataset, returning the number of records deleted.
130
126
  #
131
127
  # DB[:table].delete # DELETE * FROM table
132
128
  # # => 3
@@ -157,24 +153,22 @@ module Sequel
157
153
  self
158
154
  end
159
155
 
156
+ EMPTY_SELECT = Sequel::SQL::AliasedExpression.new(1, :one)
157
+
160
158
  # Returns true if no records exist in the dataset, false otherwise
161
159
  #
162
160
  # DB[:table].empty? # SELECT 1 AS one FROM table LIMIT 1
163
161
  # # => false
164
162
  def empty?
165
163
  cached_dataset(:_empty_ds) do
166
- single_value_ds.unordered.select(Sequel::SQL::AliasedExpression.new(1, :one))
167
- # single_value_ds.unordered.select(EMPTY_SELECT) # SEQUEL5
164
+ single_value_ds.unordered.select(EMPTY_SELECT)
168
165
  end.single_value!.nil?
169
166
  end
170
- # SEQUEL5
171
- #EMPTY_SELECT = Sequel::SQL::AliasedExpression.new(1, :one)
172
- #private_constant :EMPTY_SELECT
173
167
 
168
+ # Returns the first matching record if no arguments are given.
174
169
  # If a integer argument is given, it is interpreted as a limit, and then returns all
175
- # matching records up to that limit. If no argument is passed,
176
- # it returns the first matching record. If any other type of
177
- # argument(s) is passed, it is given to filter and the
170
+ # matching records up to that limit. If any other type of
171
+ # argument(s) is passed, it is treated as a filter and the
178
172
  # first matching record is returned. If a block is given, it is used
179
173
  # to filter the dataset before returning anything.
180
174
  #
@@ -189,19 +183,19 @@ module Sequel
189
183
  # DB[:table].first(2) # SELECT * FROM table LIMIT 2
190
184
  # # => [{:id=>6}, {:id=>4}]
191
185
  #
192
- # DB[:table].first(:id=>2) # SELECT * FROM table WHERE (id = 2) LIMIT 1
186
+ # DB[:table].first(id: 2) # SELECT * FROM table WHERE (id = 2) LIMIT 1
193
187
  # # => {:id=>2}
194
188
  #
195
- # DB[:table].first("id = 3") # SELECT * FROM table WHERE (id = 3) LIMIT 1
189
+ # DB[:table].first(Sequel.lit("id = 3")) # SELECT * FROM table WHERE (id = 3) LIMIT 1
196
190
  # # => {:id=>3}
197
191
  #
198
- # DB[:table].first("id = ?", 4) # SELECT * FROM table WHERE (id = 4) LIMIT 1
192
+ # DB[:table].first(Sequel.lit("id = ?", 4)) # SELECT * FROM table WHERE (id = 4) LIMIT 1
199
193
  # # => {:id=>4}
200
194
  #
201
195
  # DB[:table].first{id > 2} # SELECT * FROM table WHERE (id > 2) LIMIT 1
202
196
  # # => {:id=>5}
203
197
  #
204
- # DB[:table].first("id > ?", 4){id < 6} # SELECT * FROM table WHERE ((id > 4) AND (id < 6)) LIMIT 1
198
+ # DB[:table].first(Sequel.lit("id > ?", 4)){id < 6} # SELECT * FROM table WHERE ((id > 4) AND (id < 6)) LIMIT 1
205
199
  # # => {:id=>5}
206
200
  #
207
201
  # DB[:table].first(2){id < 2} # SELECT * FROM table WHERE (id < 2) LIMIT 2
@@ -361,7 +355,8 @@ module Sequel
361
355
  end
362
356
 
363
357
  # Inserts values into the associated table. The returned value is generally
364
- # the value of the primary key for the inserted row, but that is adapter dependent.
358
+ # the value of the autoincremented primary key for the inserted row, assuming that
359
+ # the a single row is inserted and the table has an autoincrementing primary key.
365
360
  #
366
361
  # +insert+ handles a number of different argument formats:
367
362
  # no arguments or single empty hash :: Uses DEFAULT VALUES
@@ -387,7 +382,7 @@ module Sequel
387
382
  # DB[:items].insert([:a, :b], [1,2])
388
383
  # # INSERT INTO items (a, b) VALUES (1, 2)
389
384
  #
390
- # DB[:items].insert(:a => 1, :b => 2)
385
+ # DB[:items].insert(a: 1, b: 2)
391
386
  # # INSERT INTO items (a, b) VALUES (1, 2)
392
387
  #
393
388
  # DB[:items].insert(DB[:old_items])
@@ -404,26 +399,6 @@ module Sequel
404
399
  end
405
400
  end
406
401
 
407
- # Returns the interval between minimum and maximum values for the given
408
- # column/expression. Uses a virtual row block if no argument is given.
409
- #
410
- # DB[:table].interval(:id) # SELECT (max(id) - min(id)) FROM table LIMIT 1
411
- # # => 6
412
- # DB[:table].interval{function(column)} # SELECT (max(function(column)) - min(function(column))) FROM table LIMIT 1
413
- # # => 7
414
- def interval(column=Sequel.virtual_row(&Proc.new))
415
- Sequel::Deprecation.deprecate("Sequel::Dataset#interval", "Use #max - #min, or use the sequel_4_dataset_methods extension")
416
- if loader = cached_placeholder_literalizer(:_interval_loader) do |pl|
417
- arg = pl.arg
418
- aggregate_dataset.limit(1).select((SQL::Function.new(:max, arg) - SQL::Function.new(:min, arg)).as(:interval))
419
- end
420
-
421
- loader.get(column)
422
- else
423
- aggregate_dataset.get{(max(column) - min(column)).as(:interval)}
424
- end
425
- end
426
-
427
402
  # Reverses the order and then runs #first with the given arguments and block. Note that this
428
403
  # will not necessarily give you the last record in the dataset,
429
404
  # unless you have an unambiguous order. If there is not
@@ -439,8 +414,8 @@ module Sequel
439
414
  reverse.first(*args, &block)
440
415
  end
441
416
 
442
- # Maps column values for each record in the dataset (if a column name is
443
- # given), or performs the stock mapping functionality of +Enumerable+ otherwise.
417
+ # Maps column values for each record in the dataset (if an argument is given)
418
+ # or performs the stock mapping functionality of +Enumerable+ otherwise.
444
419
  # Raises an +Error+ if both an argument and block are given.
445
420
  #
446
421
  # DB[:table].map(:id) # SELECT * FROM table
@@ -492,7 +467,7 @@ module Sequel
492
467
  # This is a front end for import that allows you to submit an array of
493
468
  # hashes instead of arrays of columns and values:
494
469
  #
495
- # DB[:table].multi_insert([{:x => 1}, {:x => 2}])
470
+ # DB[:table].multi_insert([{x: 1}, {x: 2}])
496
471
  # # INSERT INTO table (x) VALUES (1)
497
472
  # # INSERT INTO table (x) VALUES (2)
498
473
  #
@@ -519,6 +494,10 @@ module Sequel
519
494
  # Sequel checks that the datasets using this method have an order, but it cannot
520
495
  # ensure that the order is unambiguous.
521
496
  #
497
+ # Note that this method is not safe to use on many adapters if you are
498
+ # running additional queries inside the provided block. If you are
499
+ # running queries inside the block, use a separate thread or shard inside +paged_each+.
500
+ #
522
501
  # Options:
523
502
  # :rows_per_fetch :: The number of rows to fetch per query. Defaults to 1000.
524
503
  # :strategy :: The strategy to use for paging of results. By default this is :offset,
@@ -528,7 +507,7 @@ module Sequel
528
507
  # selecting the columns you are ordering by, and none of the columns can contain
529
508
  # NULLs. Note that some Sequel adapters have optimized implementations that will
530
509
  # use cursors or streaming regardless of the :strategy option used.
531
- # :filter_values :: If the :strategy=>:filter option is used, this option should be a proc
510
+ # :filter_values :: If the strategy: :filter option is used, this option should be a proc
532
511
  # that accepts the last retreived row for the previous page and an array of
533
512
  # ORDER BY expressions, and returns an array of values relating to those
534
513
  # expressions for the last retrieved row. You will need to use this option
@@ -548,13 +527,13 @@ module Sequel
548
527
  # # SELECT * FROM table ORDER BY id LIMIT 100 OFFSET 100
549
528
  # # ...
550
529
  #
551
- # DB[:table].order(:id).paged_each(:strategy=>:filter){|row| }
530
+ # DB[:table].order(:id).paged_each(strategy: :filter){|row| }
552
531
  # # SELECT * FROM table ORDER BY id LIMIT 1000
553
532
  # # SELECT * FROM table WHERE id > 1001 ORDER BY id LIMIT 1000
554
533
  # # ...
555
534
  #
556
- # DB[:table].order(:table__id).paged_each(:strategy=>:filter,
557
- # :filter_values=>proc{|row, exprs| [row[:id]]}){|row| }
535
+ # DB[:table].order(:id).paged_each(strategy: :filter,
536
+ # filter_values: lambda{|row, exprs| [row[:id]]}){|row| }
558
537
  # # SELECT * FROM table ORDER BY id LIMIT 1000
559
538
  # # SELECT * FROM table WHERE id > 1001 ORDER BY id LIMIT 1000
560
539
  # # ...
@@ -618,30 +597,6 @@ module Sequel
618
597
  self
619
598
  end
620
599
 
621
- # Returns a +Range+ instance made from the minimum and maximum values for the
622
- # given column/expression. Uses a virtual row block if no argument is given.
623
- #
624
- # DB[:table].range(:id) # SELECT max(id) AS v1, min(id) AS v2 FROM table LIMIT 1
625
- # # => 1..10
626
- # DB[:table].interval{function(column)} # SELECT max(function(column)) AS v1, min(function(column)) AS v2 FROM table LIMIT 1
627
- # # => 0..7
628
- def range(column=Sequel.virtual_row(&Proc.new))
629
- Sequel::Deprecation.deprecate("Sequel::Dataset#range", "Use #min..#max, or use the sequel_4_dataset_methods extension")
630
- r = if loader = cached_placeholder_literalizer(:_range_loader) do |pl|
631
- arg = pl.arg
632
- aggregate_dataset.limit(1).select(SQL::Function.new(:min, arg).as(:v1), SQL::Function.new(:max, arg).as(:v2))
633
- end
634
-
635
- loader.first(column)
636
- else
637
- aggregate_dataset.select{[min(column).as(v1), max(column).as(v2)]}.first
638
- end
639
-
640
- if r
641
- (r[:v1]..r[:v2])
642
- end
643
- end
644
-
645
600
  # Returns a hash with key_column values as keys and value_column values as
646
601
  # values. Similar to as_hash, but only selects the columns given. Like
647
602
  # as_hash, it accepts an optional :hash parameter, into which entries will
@@ -657,8 +612,7 @@ module Sequel
657
612
  # # {[1, 3]=>['a', 'c'], [2, 4]=>['b', 'd'], ...}
658
613
  #
659
614
  # When using this method, you must be sure that each expression has an alias
660
- # that Sequel can determine. Usually you can do this by calling the #as method
661
- # on the expression and providing an alias.
615
+ # that Sequel can determine.
662
616
  def select_hash(key_column, value_column, opts = OPTS)
663
617
  _select_hash(:as_hash, key_column, value_column, opts)
664
618
  end
@@ -677,8 +631,7 @@ module Sequel
677
631
  # # {['a', 'b']=>[['c', 1], ['d', 2], ...], ...}
678
632
  #
679
633
  # When using this method, you must be sure that each expression has an alias
680
- # that Sequel can determine. Usually you can do this by calling the #as method
681
- # on the expression and providing an alias.
634
+ # that Sequel can determine.
682
635
  def select_hash_groups(key_column, value_column, opts = OPTS)
683
636
  _select_hash(:to_hash_groups, key_column, value_column, opts)
684
637
  end
@@ -701,8 +654,7 @@ module Sequel
701
654
  # # => [[1, 'A'], [2, 'B'], [3, 'C'], ...]
702
655
  #
703
656
  # If you provide an array of expressions, you must be sure that each entry
704
- # in the array has an alias that Sequel can determine. Usually you can do this
705
- # by calling the #as method on the expression and providing an alias.
657
+ # in the array has an alias that Sequel can determine.
706
658
  def select_map(column=nil, &block)
707
659
  _select_map(column, false, &block)
708
660
  end
@@ -721,8 +673,7 @@ module Sequel
721
673
  # # => [[1, 'A'], [2, 'B'], [3, 'C'], ...]
722
674
  #
723
675
  # If you provide an array of expressions, you must be sure that each entry
724
- # in the array has an alias that Sequel can determine. Usually you can do this
725
- # by calling the #as method on the expression and providing an alias.
676
+ # in the array has an alias that Sequel can determine.
726
677
  def select_order_map(column=nil, &block)
727
678
  _select_map(column, true, &block)
728
679
  end
@@ -817,21 +768,21 @@ module Sequel
817
768
  return naked.as_hash(key_column, value_column, opts) if row_proc
818
769
  if value_column.is_a?(Array)
819
770
  if key_column.is_a?(Array)
820
- send(meth){|r| h[r.values_at(*key_column)] = r.values_at(*value_column)}
771
+ public_send(meth){|r| h[r.values_at(*key_column)] = r.values_at(*value_column)}
821
772
  else
822
- send(meth){|r| h[r[key_column]] = r.values_at(*value_column)}
773
+ public_send(meth){|r| h[r[key_column]] = r.values_at(*value_column)}
823
774
  end
824
775
  else
825
776
  if key_column.is_a?(Array)
826
- send(meth){|r| h[r.values_at(*key_column)] = r[value_column]}
777
+ public_send(meth){|r| h[r.values_at(*key_column)] = r[value_column]}
827
778
  else
828
- send(meth){|r| h[r[key_column]] = r[value_column]}
779
+ public_send(meth){|r| h[r[key_column]] = r[value_column]}
829
780
  end
830
781
  end
831
782
  elsif key_column.is_a?(Array)
832
- send(meth){|r| h[key_column.map{|k| r[k]}] = r}
783
+ public_send(meth){|r| h[key_column.map{|k| r[k]}] = r}
833
784
  else
834
- send(meth){|r| h[r[key_column]] = r}
785
+ public_send(meth){|r| h[r[key_column]] = r}
835
786
  end
836
787
  h
837
788
  end
@@ -872,21 +823,21 @@ module Sequel
872
823
  return naked.to_hash_groups(key_column, value_column, opts) if row_proc
873
824
  if value_column.is_a?(Array)
874
825
  if key_column.is_a?(Array)
875
- send(meth){|r| (h[r.values_at(*key_column)] ||= []) << r.values_at(*value_column)}
826
+ public_send(meth){|r| (h[r.values_at(*key_column)] ||= []) << r.values_at(*value_column)}
876
827
  else
877
- send(meth){|r| (h[r[key_column]] ||= []) << r.values_at(*value_column)}
828
+ public_send(meth){|r| (h[r[key_column]] ||= []) << r.values_at(*value_column)}
878
829
  end
879
830
  else
880
831
  if key_column.is_a?(Array)
881
- send(meth){|r| (h[r.values_at(*key_column)] ||= []) << r[value_column]}
832
+ public_send(meth){|r| (h[r.values_at(*key_column)] ||= []) << r[value_column]}
882
833
  else
883
- send(meth){|r| (h[r[key_column]] ||= []) << r[value_column]}
834
+ public_send(meth){|r| (h[r[key_column]] ||= []) << r[value_column]}
884
835
  end
885
836
  end
886
837
  elsif key_column.is_a?(Array)
887
- send(meth){|r| (h[key_column.map{|k| r[k]}] ||= []) << r}
838
+ public_send(meth){|r| (h[key_column.map{|k| r[k]}] ||= []) << r}
888
839
  else
889
- send(meth){|r| (h[r[key_column]] ||= []) << r}
840
+ public_send(meth){|r| (h[r[key_column]] ||= []) << r}
890
841
  end
891
842
  h
892
843
  end
@@ -899,15 +850,14 @@ module Sequel
899
850
  execute_ddl(truncate_sql)
900
851
  end
901
852
 
902
- # Updates values for the dataset. The returned value is generally the
903
- # number of rows updated, but that is adapter dependent. +values+ should
904
- # a hash where the keys are columns to set and values are the values to
853
+ # Updates values for the dataset. The returned value is the number of rows updated.
854
+ # +values+ should be a hash where the keys are columns to set and values are the values to
905
855
  # which to set the columns.
906
856
  #
907
- # DB[:table].update(:x=>nil) # UPDATE table SET x = NULL
857
+ # DB[:table].update(x: nil) # UPDATE table SET x = NULL
908
858
  # # => 10
909
859
  #
910
- # DB[:table].update(:x=>Sequel[:x]+1, :y=>0) # UPDATE table SET x = (x + 1), y = 0
860
+ # DB[:table].update(x: Sequel[:x]+1, y: 0) # UPDATE table SET x = (x + 1), y = 0
911
861
  # # => 10
912
862
  def update(values=OPTS, &block)
913
863
  sql = update_sql(values)
@@ -922,7 +872,7 @@ module Sequel
922
872
  # yielding each row to the given block. Basically the same as where(cond).all(&block),
923
873
  # except it can be optimized to not create an intermediate dataset.
924
874
  #
925
- # DB[:table].where_all(:id=>[1,2,3])
875
+ # DB[:table].where_all(id: [1,2,3])
926
876
  # # SELECT * FROM table WHERE (id IN (1, 2, 3))
927
877
  def where_all(cond, &block)
928
878
  if loader = _where_loader
@@ -936,7 +886,7 @@ module Sequel
936
886
  # yielding each row to the given block. Basically the same as where(cond).each(&block),
937
887
  # except it can be optimized to not create an intermediate dataset.
938
888
  #
939
- # DB[:table].where_each(:id=>[1,2,3]){|row| p row}
889
+ # DB[:table].where_each(id: [1,2,3]){|row| p row}
940
890
  # # SELECT * FROM table WHERE (id IN (1, 2, 3))
941
891
  def where_each(cond, &block)
942
892
  if loader = _where_loader
@@ -951,7 +901,7 @@ module Sequel
951
901
  # a single column. Basically the same as where(cond).single_value,
952
902
  # except it can be optimized to not create an intermediate dataset.
953
903
  #
954
- # DB[:table].select(:name).where_single_value(:id=>1)
904
+ # DB[:table].select(:name).where_single_value(id: 1)
955
905
  # # SELECT name FROM table WHERE (id = 1) LIMIT 1
956
906
  def where_single_value(cond)
957
907
  if loader = cached_placeholder_literalizer(:_where_single_value_loader) do |pl|
@@ -1069,7 +1019,7 @@ module Sequel
1069
1019
  # Internals of +select_hash+ and +select_hash_groups+
1070
1020
  def _select_hash(meth, key_column, value_column, opts=OPTS)
1071
1021
  select(*(key_column.is_a?(Array) ? key_column : [key_column]) + (value_column.is_a?(Array) ? value_column : [value_column])).
1072
- send(meth, hash_key_symbols(key_column), hash_key_symbols(value_column), opts)
1022
+ public_send(meth, hash_key_symbols(key_column), hash_key_symbols(value_column), opts)
1073
1023
  end
1074
1024
 
1075
1025
  # Internals of +select_map+ and +select_order_map+
@@ -17,22 +17,10 @@ module Sequel
17
17
  # DB[:table].active.with_id_and_name.by_id
18
18
  # # SELECT id, name FROM table WHERE active ORDER BY id
19
19
  class DatasetModule < ::Module
20
- %w'where exclude exclude_having having'.map(&:to_sym).each do |meth|
21
- define_method(meth) do |name, *args, &block|
22
- if block || args.flatten.any?{|arg| arg.is_a?(Proc)}
23
- define_method(name){send(meth, *args, &block)}
24
- else
25
- key = :"_#{meth}_#{name}_ds"
26
- define_method(name) do
27
- cached_dataset(key){send(meth, *args)}
28
- end
29
- end
30
- end
31
- end
32
-
33
20
  meths = (<<-METHS).split.map(&:to_sym)
21
+ where exclude exclude_having having
34
22
  distinct grep group group_and_count group_append
35
- limit offset order order_append order_prepend
23
+ limit offset order order_append order_prepend reverse
36
24
  select select_all select_append select_group server
37
25
  METHS
38
26
 
@@ -40,11 +28,11 @@ module Sequel
40
28
  def self.def_dataset_caching_method(mod, meth)
41
29
  mod.send(:define_method, meth) do |name, *args, &block|
42
30
  if block
43
- define_method(name){send(meth, *args, &block)}
31
+ define_method(name){public_send(meth, *args, &block)}
44
32
  else
45
33
  key = :"_#{meth}_#{name}_ds"
46
34
  define_method(name) do
47
- cached_dataset(key){send(meth, *args)}
35
+ cached_dataset(key){public_send(meth, *args)}
48
36
  end
49
37
  end
50
38
  end
@@ -14,39 +14,38 @@ module Sequel
14
14
  end
15
15
 
16
16
  # Whether this dataset will provide accurate number of rows matched for
17
- # delete and update statements. Accurate in this case is the number of
17
+ # delete and update statements, true by default. Accurate in this case is the number of
18
18
  # rows matched by the dataset's filter.
19
19
  def provides_accurate_rows_matched?
20
20
  true
21
21
  end
22
22
 
23
- # Whether you must use a column alias list for recursive CTEs (false by
24
- # default).
23
+ # Whether you must use a column alias list for recursive CTEs, false by default.
25
24
  def recursive_cte_requires_column_aliases?
26
25
  false
27
26
  end
28
27
 
29
- # Whether the dataset requires SQL standard datetimes (false by default,
30
- # as most allow strings with ISO 8601 format).
28
+ # Whether the dataset requires SQL standard datetimes. False by default,
29
+ # as most allow strings with ISO 8601 format.
31
30
  def requires_sql_standard_datetimes?
32
31
  false
33
32
  end
34
33
 
35
34
  # Whether type specifiers are required for prepared statement/bound
36
- # variable argument placeholders (i.e. :bv__integer)
35
+ # variable argument placeholders (i.e. :bv__integer), false by default.
37
36
  def requires_placeholder_type_specifiers?
38
37
  false
39
38
  end
40
39
 
41
- # Whether the dataset supports common table expressions (the WITH clause).
40
+ # Whether the dataset supports common table expressions, false by default.
42
41
  # If given, +type+ can be :select, :insert, :update, or :delete, in which case it
43
42
  # determines whether WITH is supported for the respective statement type.
44
43
  def supports_cte?(type=:select)
45
44
  false
46
45
  end
47
46
 
48
- # Whether the dataset supports common table expressions (the WITH clause)
49
- # in subqueries. If false, applies the WITH clause to the main query, which can cause issues
47
+ # Whether the dataset supports common table expressions in subqueries, false by default.
48
+ # If false, applies the WITH clause to the main query, which can cause issues
50
49
  # if multiple WITH clauses use the same name.
51
50
  def supports_cte_in_subqueries?
52
51
  false
@@ -64,23 +63,23 @@ module Sequel
64
63
  false
65
64
  end
66
65
 
67
- # Whether the dataset supports CUBE with GROUP BY.
66
+ # Whether the dataset supports CUBE with GROUP BY, false by default.
68
67
  def supports_group_cube?
69
68
  false
70
69
  end
71
70
 
72
- # Whether the dataset supports ROLLUP with GROUP BY.
71
+ # Whether the dataset supports ROLLUP with GROUP BY, false by default.
73
72
  def supports_group_rollup?
74
73
  false
75
74
  end
76
75
 
77
- # Whether the dataset supports GROUPING SETS with GROUP BY.
76
+ # Whether the dataset supports GROUPING SETS with GROUP BY, false by default.
78
77
  def supports_grouping_sets?
79
78
  false
80
79
  end
81
80
 
82
81
  # Whether this dataset supports the +insert_select+ method for returning all columns values
83
- # directly from an insert query.
82
+ # directly from an insert query, false by default.
84
83
  def supports_insert_select?
85
84
  supports_returning?(:insert)
86
85
  end
@@ -95,33 +94,34 @@ module Sequel
95
94
  true
96
95
  end
97
96
 
98
- # Whether the dataset supports the IS TRUE syntax.
97
+ # Whether the dataset supports the IS TRUE syntax, true by default.
99
98
  def supports_is_true?
100
99
  true
101
100
  end
102
101
 
103
- # Whether the dataset supports the JOIN table USING (column1, ...) syntax.
102
+ # Whether the dataset supports the JOIN table USING (column1, ...) syntax, true by default.
103
+ # If false, support is emulated using JOIN table ON (table.column1 = other_table.column1).
104
104
  def supports_join_using?
105
105
  true
106
106
  end
107
107
 
108
- # Whether the dataset supports LATERAL for subqueries in the FROM or JOIN clauses.
108
+ # Whether the dataset supports LATERAL for subqueries in the FROM or JOIN clauses, false by default.
109
109
  def supports_lateral_subqueries?
110
110
  false
111
111
  end
112
112
 
113
- # Whether limits are supported in correlated subqueries. True by default.
113
+ # Whether limits are supported in correlated subqueries, true by default.
114
114
  def supports_limits_in_correlated_subqueries?
115
115
  true
116
116
  end
117
117
 
118
- # Whether modifying joined datasets is supported.
118
+ # Whether modifying joined datasets is supported, false by default.
119
119
  def supports_modifying_joins?
120
120
  false
121
121
  end
122
122
 
123
123
  # Whether the IN/NOT IN operators support multiple columns when an
124
- # array of values is given.
124
+ # array of values is given, true by default.
125
125
  def supports_multiple_column_in?
126
126
  true
127
127
  end
@@ -132,12 +132,12 @@ module Sequel
132
132
  end
133
133
 
134
134
  # Whether the dataset supports or can fully emulate the DISTINCT ON clause,
135
- # including respecting the ORDER BY clause, false by default
135
+ # including respecting the ORDER BY clause, false by default.
136
136
  def supports_ordered_distinct_on?
137
137
  supports_distinct_on?
138
138
  end
139
139
 
140
- # Whether the dataset supports pattern matching by regular expressions.
140
+ # Whether the dataset supports pattern matching by regular expressions, false by default.
141
141
  def supports_regexp?
142
142
  false
143
143
  end
@@ -147,39 +147,39 @@ module Sequel
147
147
  false
148
148
  end
149
149
 
150
- # Whether the RETURNING clause is supported for the given type of query.
150
+ # Whether the RETURNING clause is supported for the given type of query, false by default.
151
151
  # +type+ can be :insert, :update, or :delete.
152
152
  def supports_returning?(type)
153
153
  false
154
154
  end
155
155
 
156
- # Whether the dataset supports skipping locked rows when returning data.
156
+ # Whether the dataset supports skipping locked rows when returning data, false by default.
157
157
  def supports_skip_locked?
158
158
  false
159
159
  end
160
160
 
161
- # Whether the database supports SELECT *, column FROM table
161
+ # Whether the database supports <tt>SELECT *, column FROM table</tt>, true by default.
162
162
  def supports_select_all_and_column?
163
163
  true
164
164
  end
165
165
 
166
- # Whether the dataset supports timezones in literal timestamps
166
+ # Whether the dataset supports timezones in literal timestamps, false by default.
167
167
  def supports_timestamp_timezones?
168
168
  false
169
169
  end
170
170
 
171
- # Whether the dataset supports fractional seconds in literal timestamps
171
+ # Whether the dataset supports fractional seconds in literal timestamps, true by default.
172
172
  def supports_timestamp_usecs?
173
173
  true
174
174
  end
175
175
 
176
- # Whether the dataset supports window functions.
176
+ # Whether the dataset supports window functions, false by default.
177
177
  def supports_window_functions?
178
178
  false
179
179
  end
180
180
 
181
181
  # Whether the dataset supports WHERE TRUE (or WHERE 1 for databases that
182
- # that use 1 for true).
182
+ # that use 1 for true), true by default.
183
183
  def supports_where_true?
184
184
  true
185
185
  end
@@ -187,12 +187,17 @@ module Sequel
187
187
  private
188
188
 
189
189
  # Whether insert(nil) or insert({}) must be emulated by
190
- # using at least one value, false by default.
190
+ # using at least one value.
191
191
  def insert_supports_empty_values?
192
192
  true
193
193
  end
194
194
 
195
- # Whether the database supports quoting function names, false by default.
195
+ # Whether common table expressions are supported in UNION/INTERSECT/EXCEPT clauses.
196
+ def supports_cte_in_compounds?
197
+ supports_cte_in_subqueries?
198
+ end
199
+
200
+ # Whether the database supports quoting function names.
196
201
  def supports_quoted_function_names?
197
202
  false
198
203
  end