sequel 4.36.0 → 5.61.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 (760) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +548 -5749
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +265 -159
  5. data/bin/sequel +34 -12
  6. data/doc/advanced_associations.rdoc +228 -187
  7. data/doc/association_basics.rdoc +281 -291
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +86 -51
  10. data/doc/code_order.rdoc +25 -19
  11. data/doc/core_extensions.rdoc +104 -63
  12. data/doc/dataset_basics.rdoc +12 -21
  13. data/doc/dataset_filtering.rdoc +99 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/fork_safety.rdoc +84 -0
  16. data/doc/mass_assignment.rdoc +74 -31
  17. data/doc/migration.rdoc +59 -51
  18. data/doc/model_dataset_method_design.rdoc +129 -0
  19. data/doc/model_hooks.rdoc +15 -25
  20. data/doc/model_plugins.rdoc +12 -12
  21. data/doc/mssql_stored_procedures.rdoc +3 -3
  22. data/doc/object_model.rdoc +58 -68
  23. data/doc/opening_databases.rdoc +85 -95
  24. data/doc/postgresql.rdoc +263 -38
  25. data/doc/prepared_statements.rdoc +29 -24
  26. data/doc/querying.rdoc +189 -167
  27. data/doc/reflection.rdoc +5 -6
  28. data/doc/release_notes/5.0.0.txt +159 -0
  29. data/doc/release_notes/5.1.0.txt +31 -0
  30. data/doc/release_notes/5.10.0.txt +84 -0
  31. data/doc/release_notes/5.11.0.txt +83 -0
  32. data/doc/release_notes/5.12.0.txt +141 -0
  33. data/doc/release_notes/5.13.0.txt +27 -0
  34. data/doc/release_notes/5.14.0.txt +63 -0
  35. data/doc/release_notes/5.15.0.txt +39 -0
  36. data/doc/release_notes/5.16.0.txt +110 -0
  37. data/doc/release_notes/5.17.0.txt +31 -0
  38. data/doc/release_notes/5.18.0.txt +69 -0
  39. data/doc/release_notes/5.19.0.txt +28 -0
  40. data/doc/release_notes/5.2.0.txt +33 -0
  41. data/doc/release_notes/5.20.0.txt +89 -0
  42. data/doc/release_notes/5.21.0.txt +87 -0
  43. data/doc/release_notes/5.22.0.txt +48 -0
  44. data/doc/release_notes/5.23.0.txt +56 -0
  45. data/doc/release_notes/5.24.0.txt +56 -0
  46. data/doc/release_notes/5.25.0.txt +32 -0
  47. data/doc/release_notes/5.26.0.txt +35 -0
  48. data/doc/release_notes/5.27.0.txt +21 -0
  49. data/doc/release_notes/5.28.0.txt +16 -0
  50. data/doc/release_notes/5.29.0.txt +22 -0
  51. data/doc/release_notes/5.3.0.txt +121 -0
  52. data/doc/release_notes/5.30.0.txt +20 -0
  53. data/doc/release_notes/5.31.0.txt +148 -0
  54. data/doc/release_notes/5.32.0.txt +46 -0
  55. data/doc/release_notes/5.33.0.txt +24 -0
  56. data/doc/release_notes/5.34.0.txt +40 -0
  57. data/doc/release_notes/5.35.0.txt +56 -0
  58. data/doc/release_notes/5.36.0.txt +60 -0
  59. data/doc/release_notes/5.37.0.txt +30 -0
  60. data/doc/release_notes/5.38.0.txt +28 -0
  61. data/doc/release_notes/5.39.0.txt +19 -0
  62. data/doc/release_notes/5.4.0.txt +80 -0
  63. data/doc/release_notes/5.40.0.txt +40 -0
  64. data/doc/release_notes/5.41.0.txt +25 -0
  65. data/doc/release_notes/5.42.0.txt +136 -0
  66. data/doc/release_notes/5.43.0.txt +98 -0
  67. data/doc/release_notes/5.44.0.txt +32 -0
  68. data/doc/release_notes/5.45.0.txt +34 -0
  69. data/doc/release_notes/5.46.0.txt +87 -0
  70. data/doc/release_notes/5.47.0.txt +59 -0
  71. data/doc/release_notes/5.48.0.txt +14 -0
  72. data/doc/release_notes/5.49.0.txt +59 -0
  73. data/doc/release_notes/5.5.0.txt +61 -0
  74. data/doc/release_notes/5.50.0.txt +78 -0
  75. data/doc/release_notes/5.51.0.txt +47 -0
  76. data/doc/release_notes/5.52.0.txt +87 -0
  77. data/doc/release_notes/5.53.0.txt +23 -0
  78. data/doc/release_notes/5.54.0.txt +27 -0
  79. data/doc/release_notes/5.55.0.txt +21 -0
  80. data/doc/release_notes/5.56.0.txt +51 -0
  81. data/doc/release_notes/5.57.0.txt +23 -0
  82. data/doc/release_notes/5.58.0.txt +31 -0
  83. data/doc/release_notes/5.59.0.txt +73 -0
  84. data/doc/release_notes/5.6.0.txt +31 -0
  85. data/doc/release_notes/5.60.0.txt +22 -0
  86. data/doc/release_notes/5.61.0.txt +43 -0
  87. data/doc/release_notes/5.7.0.txt +108 -0
  88. data/doc/release_notes/5.8.0.txt +170 -0
  89. data/doc/release_notes/5.9.0.txt +99 -0
  90. data/doc/schema_modification.rdoc +95 -75
  91. data/doc/security.rdoc +109 -80
  92. data/doc/sharding.rdoc +74 -47
  93. data/doc/sql.rdoc +147 -122
  94. data/doc/testing.rdoc +43 -20
  95. data/doc/thread_safety.rdoc +2 -4
  96. data/doc/transactions.rdoc +97 -18
  97. data/doc/validations.rdoc +52 -50
  98. data/doc/virtual_rows.rdoc +90 -109
  99. data/lib/sequel/adapters/ado/access.rb +15 -17
  100. data/lib/sequel/adapters/ado/mssql.rb +6 -15
  101. data/lib/sequel/adapters/ado.rb +150 -20
  102. data/lib/sequel/adapters/amalgalite.rb +11 -23
  103. data/lib/sequel/adapters/ibmdb.rb +47 -55
  104. data/lib/sequel/adapters/jdbc/db2.rb +29 -39
  105. data/lib/sequel/adapters/jdbc/derby.rb +58 -54
  106. data/lib/sequel/adapters/jdbc/h2.rb +93 -35
  107. data/lib/sequel/adapters/jdbc/hsqldb.rb +24 -31
  108. data/lib/sequel/adapters/jdbc/jtds.rb +2 -10
  109. data/lib/sequel/adapters/jdbc/mssql.rb +3 -11
  110. data/lib/sequel/adapters/jdbc/mysql.rb +17 -20
  111. data/lib/sequel/adapters/jdbc/oracle.rb +22 -18
  112. data/lib/sequel/adapters/jdbc/postgresql.rb +69 -71
  113. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +11 -23
  114. data/lib/sequel/adapters/jdbc/sqlite.rb +47 -11
  115. data/lib/sequel/adapters/jdbc/sqlserver.rb +34 -9
  116. data/lib/sequel/adapters/jdbc/transactions.rb +22 -38
  117. data/lib/sequel/adapters/jdbc.rb +145 -130
  118. data/lib/sequel/adapters/mock.rb +100 -111
  119. data/lib/sequel/adapters/mysql.rb +114 -122
  120. data/lib/sequel/adapters/mysql2.rb +147 -63
  121. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  122. data/lib/sequel/adapters/odbc/mssql.rb +8 -14
  123. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  124. data/lib/sequel/adapters/odbc.rb +20 -25
  125. data/lib/sequel/adapters/oracle.rb +50 -56
  126. data/lib/sequel/adapters/postgres.rb +305 -327
  127. data/lib/sequel/adapters/postgresql.rb +1 -1
  128. data/lib/sequel/adapters/shared/access.rb +74 -78
  129. data/lib/sequel/adapters/shared/db2.rb +118 -71
  130. data/lib/sequel/adapters/shared/mssql.rb +301 -220
  131. data/lib/sequel/adapters/shared/mysql.rb +299 -217
  132. data/lib/sequel/adapters/shared/oracle.rb +226 -65
  133. data/lib/sequel/adapters/shared/postgres.rb +935 -395
  134. data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -126
  135. data/lib/sequel/adapters/shared/sqlite.rb +447 -173
  136. data/lib/sequel/adapters/sqlanywhere.rb +48 -35
  137. data/lib/sequel/adapters/sqlite.rb +156 -111
  138. data/lib/sequel/adapters/tinytds.rb +30 -38
  139. data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
  140. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +3 -6
  141. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +2 -2
  142. data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
  143. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
  144. data/lib/sequel/adapters/utils/replace.rb +1 -4
  145. data/lib/sequel/adapters/utils/stored_procedures.rb +7 -22
  146. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
  147. data/lib/sequel/ast_transformer.rb +17 -89
  148. data/lib/sequel/connection_pool/sharded_single.rb +18 -15
  149. data/lib/sequel/connection_pool/sharded_threaded.rb +130 -111
  150. data/lib/sequel/connection_pool/single.rb +18 -13
  151. data/lib/sequel/connection_pool/threaded.rb +121 -120
  152. data/lib/sequel/connection_pool.rb +48 -29
  153. data/lib/sequel/core.rb +351 -301
  154. data/lib/sequel/database/connecting.rb +69 -57
  155. data/lib/sequel/database/dataset.rb +13 -5
  156. data/lib/sequel/database/dataset_defaults.rb +18 -102
  157. data/lib/sequel/database/features.rb +18 -4
  158. data/lib/sequel/database/logging.rb +12 -11
  159. data/lib/sequel/database/misc.rb +180 -122
  160. data/lib/sequel/database/query.rb +47 -27
  161. data/lib/sequel/database/schema_generator.rb +178 -84
  162. data/lib/sequel/database/schema_methods.rb +172 -97
  163. data/lib/sequel/database/transactions.rb +205 -44
  164. data/lib/sequel/database.rb +17 -2
  165. data/lib/sequel/dataset/actions.rb +339 -155
  166. data/lib/sequel/dataset/dataset_module.rb +46 -0
  167. data/lib/sequel/dataset/features.rb +90 -35
  168. data/lib/sequel/dataset/graph.rb +80 -58
  169. data/lib/sequel/dataset/misc.rb +137 -47
  170. data/lib/sequel/dataset/placeholder_literalizer.rb +63 -25
  171. data/lib/sequel/dataset/prepared_statements.rb +188 -85
  172. data/lib/sequel/dataset/query.rb +530 -222
  173. data/lib/sequel/dataset/sql.rb +590 -368
  174. data/lib/sequel/dataset.rb +26 -16
  175. data/lib/sequel/deprecated.rb +12 -2
  176. data/lib/sequel/exceptions.rb +46 -16
  177. data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
  178. data/lib/sequel/extensions/_model_pg_row.rb +43 -0
  179. data/lib/sequel/extensions/_pretty_table.rb +2 -5
  180. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  181. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  182. data/lib/sequel/extensions/async_thread_pool.rb +438 -0
  183. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  184. data/lib/sequel/extensions/blank.rb +8 -0
  185. data/lib/sequel/extensions/caller_logging.rb +79 -0
  186. data/lib/sequel/extensions/columns_introspection.rb +4 -3
  187. data/lib/sequel/extensions/connection_expiration.rb +20 -10
  188. data/lib/sequel/extensions/connection_validator.rb +11 -10
  189. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  190. data/lib/sequel/extensions/constraint_validations.rb +62 -39
  191. data/lib/sequel/extensions/core_extensions.rb +42 -48
  192. data/lib/sequel/extensions/core_refinements.rb +80 -59
  193. data/lib/sequel/extensions/current_datetime_timestamp.rb +1 -4
  194. data/lib/sequel/extensions/date_arithmetic.rb +98 -39
  195. data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
  196. data/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
  197. data/lib/sequel/extensions/duplicate_columns_handler.rb +21 -14
  198. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  199. data/lib/sequel/extensions/escaped_like.rb +100 -0
  200. data/lib/sequel/extensions/eval_inspect.rb +12 -15
  201. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  202. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  203. data/lib/sequel/extensions/freeze_datasets.rb +3 -0
  204. data/lib/sequel/extensions/from_block.rb +1 -34
  205. data/lib/sequel/extensions/graph_each.rb +4 -4
  206. data/lib/sequel/extensions/identifier_mangling.rb +180 -0
  207. data/lib/sequel/extensions/implicit_subquery.rb +48 -0
  208. data/lib/sequel/extensions/index_caching.rb +109 -0
  209. data/lib/sequel/extensions/inflector.rb +13 -5
  210. data/lib/sequel/extensions/integer64.rb +32 -0
  211. data/lib/sequel/extensions/is_distinct_from.rb +141 -0
  212. data/lib/sequel/extensions/looser_typecasting.rb +17 -8
  213. data/lib/sequel/extensions/migration.rb +119 -78
  214. data/lib/sequel/extensions/named_timezones.rb +88 -23
  215. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -82
  216. data/lib/sequel/extensions/null_dataset.rb +8 -8
  217. data/lib/sequel/extensions/pagination.rb +32 -29
  218. data/lib/sequel/extensions/pg_array.rb +221 -287
  219. data/lib/sequel/extensions/pg_array_ops.rb +17 -9
  220. data/lib/sequel/extensions/pg_enum.rb +63 -23
  221. data/lib/sequel/extensions/pg_extended_date_support.rb +241 -0
  222. data/lib/sequel/extensions/pg_hstore.rb +45 -54
  223. data/lib/sequel/extensions/pg_hstore_ops.rb +58 -6
  224. data/lib/sequel/extensions/pg_inet.rb +31 -12
  225. data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
  226. data/lib/sequel/extensions/pg_interval.rb +56 -29
  227. data/lib/sequel/extensions/pg_json.rb +417 -140
  228. data/lib/sequel/extensions/pg_json_ops.rb +270 -18
  229. data/lib/sequel/extensions/pg_loose_count.rb +4 -2
  230. data/lib/sequel/extensions/pg_multirange.rb +372 -0
  231. data/lib/sequel/extensions/pg_range.rb +131 -191
  232. data/lib/sequel/extensions/pg_range_ops.rb +42 -13
  233. data/lib/sequel/extensions/pg_row.rb +48 -81
  234. data/lib/sequel/extensions/pg_row_ops.rb +33 -14
  235. data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
  236. data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
  237. data/lib/sequel/extensions/query.rb +9 -7
  238. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  239. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  240. data/lib/sequel/extensions/s.rb +60 -0
  241. data/lib/sequel/extensions/schema_caching.rb +10 -1
  242. data/lib/sequel/extensions/schema_dumper.rb +71 -48
  243. data/lib/sequel/extensions/select_remove.rb +4 -4
  244. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
  245. data/lib/sequel/extensions/server_block.rb +51 -27
  246. data/lib/sequel/extensions/split_array_nil.rb +4 -4
  247. data/lib/sequel/extensions/sql_comments.rb +119 -7
  248. data/lib/sequel/extensions/sql_expr.rb +2 -1
  249. data/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
  250. data/lib/sequel/extensions/sqlite_json_ops.rb +255 -0
  251. data/lib/sequel/extensions/string_agg.rb +11 -8
  252. data/lib/sequel/extensions/string_date_time.rb +19 -23
  253. data/lib/sequel/extensions/symbol_aref.rb +55 -0
  254. data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
  255. data/lib/sequel/extensions/symbol_as.rb +23 -0
  256. data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
  257. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  258. data/lib/sequel/extensions/to_dot.rb +10 -4
  259. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  260. data/lib/sequel/model/associations.rb +1006 -284
  261. data/lib/sequel/model/base.rb +560 -805
  262. data/lib/sequel/model/dataset_module.rb +11 -10
  263. data/lib/sequel/model/default_inflections.rb +1 -1
  264. data/lib/sequel/model/errors.rb +10 -3
  265. data/lib/sequel/model/exceptions.rb +8 -10
  266. data/lib/sequel/model/inflections.rb +7 -20
  267. data/lib/sequel/model/plugins.rb +114 -0
  268. data/lib/sequel/model.rb +32 -82
  269. data/lib/sequel/plugins/active_model.rb +30 -14
  270. data/lib/sequel/plugins/after_initialize.rb +1 -1
  271. data/lib/sequel/plugins/association_dependencies.rb +25 -18
  272. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  273. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  274. data/lib/sequel/plugins/association_pks.rb +147 -70
  275. data/lib/sequel/plugins/association_proxies.rb +33 -9
  276. data/lib/sequel/plugins/async_thread_pool.rb +39 -0
  277. data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
  278. data/lib/sequel/plugins/auto_validations.rb +95 -28
  279. data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
  280. data/lib/sequel/plugins/before_after_save.rb +0 -42
  281. data/lib/sequel/plugins/blacklist_security.rb +21 -12
  282. data/lib/sequel/plugins/boolean_readers.rb +5 -5
  283. data/lib/sequel/plugins/boolean_subsets.rb +13 -8
  284. data/lib/sequel/plugins/caching.rb +25 -16
  285. data/lib/sequel/plugins/class_table_inheritance.rb +179 -100
  286. data/lib/sequel/plugins/column_conflicts.rb +16 -3
  287. data/lib/sequel/plugins/column_encryption.rb +728 -0
  288. data/lib/sequel/plugins/column_select.rb +7 -5
  289. data/lib/sequel/plugins/columns_updated.rb +42 -0
  290. data/lib/sequel/plugins/composition.rb +42 -26
  291. data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
  292. data/lib/sequel/plugins/constraint_validations.rb +20 -14
  293. data/lib/sequel/plugins/csv_serializer.rb +56 -35
  294. data/lib/sequel/plugins/dataset_associations.rb +40 -17
  295. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  296. data/lib/sequel/plugins/defaults_setter.rb +65 -10
  297. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  298. data/lib/sequel/plugins/dirty.rb +62 -24
  299. data/lib/sequel/plugins/eager_each.rb +3 -3
  300. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  301. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  302. data/lib/sequel/plugins/enum.rb +124 -0
  303. data/lib/sequel/plugins/error_splitter.rb +17 -12
  304. data/lib/sequel/plugins/finder.rb +246 -0
  305. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  306. data/lib/sequel/plugins/force_encoding.rb +7 -12
  307. data/lib/sequel/plugins/hook_class_methods.rb +37 -54
  308. data/lib/sequel/plugins/input_transformer.rb +18 -10
  309. data/lib/sequel/plugins/insert_conflict.rb +76 -0
  310. data/lib/sequel/plugins/insert_returning_select.rb +2 -2
  311. data/lib/sequel/plugins/instance_filters.rb +10 -8
  312. data/lib/sequel/plugins/instance_hooks.rb +34 -17
  313. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  314. data/lib/sequel/plugins/inverted_subsets.rb +22 -13
  315. data/lib/sequel/plugins/json_serializer.rb +124 -64
  316. data/lib/sequel/plugins/lazy_attributes.rb +21 -14
  317. data/lib/sequel/plugins/list.rb +35 -21
  318. data/lib/sequel/plugins/many_through_many.rb +134 -21
  319. data/lib/sequel/plugins/modification_detection.rb +15 -5
  320. data/lib/sequel/plugins/mssql_optimistic_locking.rb +6 -5
  321. data/lib/sequel/plugins/nested_attributes.rb +61 -31
  322. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  323. data/lib/sequel/plugins/pg_array_associations.rb +103 -53
  324. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +350 -0
  325. data/lib/sequel/plugins/pg_row.rb +5 -51
  326. data/lib/sequel/plugins/prepared_statements.rb +60 -72
  327. data/lib/sequel/plugins/prepared_statements_safe.rb +9 -4
  328. data/lib/sequel/plugins/rcte_tree.rb +68 -82
  329. data/lib/sequel/plugins/require_valid_schema.rb +67 -0
  330. data/lib/sequel/plugins/serialization.rb +43 -46
  331. data/lib/sequel/plugins/serialization_modification_detection.rb +3 -2
  332. data/lib/sequel/plugins/sharding.rb +15 -10
  333. data/lib/sequel/plugins/single_table_inheritance.rb +67 -28
  334. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  335. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  336. data/lib/sequel/plugins/split_values.rb +11 -6
  337. data/lib/sequel/plugins/sql_comments.rb +189 -0
  338. data/lib/sequel/plugins/static_cache.rb +77 -53
  339. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  340. data/lib/sequel/plugins/string_stripper.rb +3 -3
  341. data/lib/sequel/plugins/subclasses.rb +43 -10
  342. data/lib/sequel/plugins/subset_conditions.rb +15 -5
  343. data/lib/sequel/plugins/table_select.rb +2 -2
  344. data/lib/sequel/plugins/tactical_eager_loading.rb +96 -12
  345. data/lib/sequel/plugins/throw_failures.rb +110 -0
  346. data/lib/sequel/plugins/timestamps.rb +20 -8
  347. data/lib/sequel/plugins/touch.rb +19 -8
  348. data/lib/sequel/plugins/tree.rb +62 -32
  349. data/lib/sequel/plugins/typecast_on_load.rb +12 -4
  350. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  351. data/lib/sequel/plugins/unused_associations.rb +521 -0
  352. data/lib/sequel/plugins/update_or_create.rb +4 -4
  353. data/lib/sequel/plugins/update_primary_key.rb +1 -1
  354. data/lib/sequel/plugins/update_refresh.rb +26 -15
  355. data/lib/sequel/plugins/uuid.rb +7 -11
  356. data/lib/sequel/plugins/validate_associated.rb +18 -0
  357. data/lib/sequel/plugins/validation_class_methods.rb +38 -19
  358. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  359. data/lib/sequel/plugins/validation_helpers.rb +57 -41
  360. data/lib/sequel/plugins/whitelist_security.rb +122 -0
  361. data/lib/sequel/plugins/xml_serializer.rb +30 -31
  362. data/lib/sequel/sql.rb +471 -331
  363. data/lib/sequel/timezones.rb +78 -47
  364. data/lib/sequel/version.rb +7 -2
  365. data/lib/sequel.rb +1 -1
  366. metadata +217 -521
  367. data/Rakefile +0 -164
  368. data/doc/active_record.rdoc +0 -928
  369. data/doc/release_notes/1.0.txt +0 -38
  370. data/doc/release_notes/1.1.txt +0 -143
  371. data/doc/release_notes/1.3.txt +0 -101
  372. data/doc/release_notes/1.4.0.txt +0 -53
  373. data/doc/release_notes/1.5.0.txt +0 -155
  374. data/doc/release_notes/2.0.0.txt +0 -298
  375. data/doc/release_notes/2.1.0.txt +0 -271
  376. data/doc/release_notes/2.10.0.txt +0 -328
  377. data/doc/release_notes/2.11.0.txt +0 -215
  378. data/doc/release_notes/2.12.0.txt +0 -534
  379. data/doc/release_notes/2.2.0.txt +0 -253
  380. data/doc/release_notes/2.3.0.txt +0 -88
  381. data/doc/release_notes/2.4.0.txt +0 -106
  382. data/doc/release_notes/2.5.0.txt +0 -137
  383. data/doc/release_notes/2.6.0.txt +0 -157
  384. data/doc/release_notes/2.7.0.txt +0 -166
  385. data/doc/release_notes/2.8.0.txt +0 -171
  386. data/doc/release_notes/2.9.0.txt +0 -97
  387. data/doc/release_notes/3.0.0.txt +0 -221
  388. data/doc/release_notes/3.1.0.txt +0 -406
  389. data/doc/release_notes/3.10.0.txt +0 -286
  390. data/doc/release_notes/3.11.0.txt +0 -254
  391. data/doc/release_notes/3.12.0.txt +0 -304
  392. data/doc/release_notes/3.13.0.txt +0 -210
  393. data/doc/release_notes/3.14.0.txt +0 -118
  394. data/doc/release_notes/3.15.0.txt +0 -78
  395. data/doc/release_notes/3.16.0.txt +0 -45
  396. data/doc/release_notes/3.17.0.txt +0 -58
  397. data/doc/release_notes/3.18.0.txt +0 -120
  398. data/doc/release_notes/3.19.0.txt +0 -67
  399. data/doc/release_notes/3.2.0.txt +0 -268
  400. data/doc/release_notes/3.20.0.txt +0 -41
  401. data/doc/release_notes/3.21.0.txt +0 -87
  402. data/doc/release_notes/3.22.0.txt +0 -39
  403. data/doc/release_notes/3.23.0.txt +0 -172
  404. data/doc/release_notes/3.24.0.txt +0 -420
  405. data/doc/release_notes/3.25.0.txt +0 -88
  406. data/doc/release_notes/3.26.0.txt +0 -88
  407. data/doc/release_notes/3.27.0.txt +0 -82
  408. data/doc/release_notes/3.28.0.txt +0 -304
  409. data/doc/release_notes/3.29.0.txt +0 -459
  410. data/doc/release_notes/3.3.0.txt +0 -192
  411. data/doc/release_notes/3.30.0.txt +0 -135
  412. data/doc/release_notes/3.31.0.txt +0 -146
  413. data/doc/release_notes/3.32.0.txt +0 -202
  414. data/doc/release_notes/3.33.0.txt +0 -157
  415. data/doc/release_notes/3.34.0.txt +0 -671
  416. data/doc/release_notes/3.35.0.txt +0 -144
  417. data/doc/release_notes/3.36.0.txt +0 -245
  418. data/doc/release_notes/3.37.0.txt +0 -338
  419. data/doc/release_notes/3.38.0.txt +0 -234
  420. data/doc/release_notes/3.39.0.txt +0 -237
  421. data/doc/release_notes/3.4.0.txt +0 -325
  422. data/doc/release_notes/3.40.0.txt +0 -73
  423. data/doc/release_notes/3.41.0.txt +0 -155
  424. data/doc/release_notes/3.42.0.txt +0 -74
  425. data/doc/release_notes/3.43.0.txt +0 -105
  426. data/doc/release_notes/3.44.0.txt +0 -152
  427. data/doc/release_notes/3.45.0.txt +0 -179
  428. data/doc/release_notes/3.46.0.txt +0 -122
  429. data/doc/release_notes/3.47.0.txt +0 -270
  430. data/doc/release_notes/3.48.0.txt +0 -477
  431. data/doc/release_notes/3.5.0.txt +0 -510
  432. data/doc/release_notes/3.6.0.txt +0 -366
  433. data/doc/release_notes/3.7.0.txt +0 -179
  434. data/doc/release_notes/3.8.0.txt +0 -151
  435. data/doc/release_notes/3.9.0.txt +0 -233
  436. data/doc/release_notes/4.0.0.txt +0 -262
  437. data/doc/release_notes/4.1.0.txt +0 -85
  438. data/doc/release_notes/4.10.0.txt +0 -226
  439. data/doc/release_notes/4.11.0.txt +0 -147
  440. data/doc/release_notes/4.12.0.txt +0 -105
  441. data/doc/release_notes/4.13.0.txt +0 -169
  442. data/doc/release_notes/4.14.0.txt +0 -68
  443. data/doc/release_notes/4.15.0.txt +0 -56
  444. data/doc/release_notes/4.16.0.txt +0 -36
  445. data/doc/release_notes/4.17.0.txt +0 -38
  446. data/doc/release_notes/4.18.0.txt +0 -36
  447. data/doc/release_notes/4.19.0.txt +0 -45
  448. data/doc/release_notes/4.2.0.txt +0 -129
  449. data/doc/release_notes/4.20.0.txt +0 -79
  450. data/doc/release_notes/4.21.0.txt +0 -94
  451. data/doc/release_notes/4.22.0.txt +0 -72
  452. data/doc/release_notes/4.23.0.txt +0 -65
  453. data/doc/release_notes/4.24.0.txt +0 -99
  454. data/doc/release_notes/4.25.0.txt +0 -181
  455. data/doc/release_notes/4.26.0.txt +0 -44
  456. data/doc/release_notes/4.27.0.txt +0 -78
  457. data/doc/release_notes/4.28.0.txt +0 -57
  458. data/doc/release_notes/4.29.0.txt +0 -41
  459. data/doc/release_notes/4.3.0.txt +0 -40
  460. data/doc/release_notes/4.30.0.txt +0 -37
  461. data/doc/release_notes/4.31.0.txt +0 -57
  462. data/doc/release_notes/4.32.0.txt +0 -132
  463. data/doc/release_notes/4.33.0.txt +0 -88
  464. data/doc/release_notes/4.34.0.txt +0 -86
  465. data/doc/release_notes/4.35.0.txt +0 -130
  466. data/doc/release_notes/4.36.0.txt +0 -116
  467. data/doc/release_notes/4.4.0.txt +0 -92
  468. data/doc/release_notes/4.5.0.txt +0 -34
  469. data/doc/release_notes/4.6.0.txt +0 -30
  470. data/doc/release_notes/4.7.0.txt +0 -103
  471. data/doc/release_notes/4.8.0.txt +0 -175
  472. data/doc/release_notes/4.9.0.txt +0 -190
  473. data/lib/sequel/adapters/cubrid.rb +0 -144
  474. data/lib/sequel/adapters/do/mysql.rb +0 -66
  475. data/lib/sequel/adapters/do/postgres.rb +0 -44
  476. data/lib/sequel/adapters/do/sqlite3.rb +0 -42
  477. data/lib/sequel/adapters/do.rb +0 -158
  478. data/lib/sequel/adapters/jdbc/as400.rb +0 -84
  479. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -64
  480. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -36
  481. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -33
  482. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -33
  483. data/lib/sequel/adapters/odbc/progress.rb +0 -10
  484. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  485. data/lib/sequel/adapters/shared/firebird.rb +0 -247
  486. data/lib/sequel/adapters/shared/informix.rb +0 -54
  487. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -152
  488. data/lib/sequel/adapters/shared/progress.rb +0 -40
  489. data/lib/sequel/adapters/swift/mysql.rb +0 -49
  490. data/lib/sequel/adapters/swift/postgres.rb +0 -47
  491. data/lib/sequel/adapters/swift/sqlite.rb +0 -49
  492. data/lib/sequel/adapters/swift.rb +0 -160
  493. data/lib/sequel/adapters/utils/pg_types.rb +0 -70
  494. data/lib/sequel/dataset/mutation.rb +0 -111
  495. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -5
  496. data/lib/sequel/extensions/filter_having.rb +0 -63
  497. data/lib/sequel/extensions/hash_aliases.rb +0 -49
  498. data/lib/sequel/extensions/meta_def.rb +0 -35
  499. data/lib/sequel/extensions/query_literals.rb +0 -84
  500. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -24
  501. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -122
  502. data/lib/sequel/extensions/set_overrides.rb +0 -76
  503. data/lib/sequel/no_core_ext.rb +0 -3
  504. data/lib/sequel/plugins/association_autoreloading.rb +0 -9
  505. data/lib/sequel/plugins/identifier_columns.rb +0 -47
  506. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -9
  507. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -81
  508. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -119
  509. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -61
  510. data/lib/sequel/plugins/schema.rb +0 -82
  511. data/lib/sequel/plugins/scissors.rb +0 -35
  512. data/spec/adapter_spec.rb +0 -4
  513. data/spec/adapters/db2_spec.rb +0 -160
  514. data/spec/adapters/firebird_spec.rb +0 -411
  515. data/spec/adapters/informix_spec.rb +0 -100
  516. data/spec/adapters/mssql_spec.rb +0 -733
  517. data/spec/adapters/mysql_spec.rb +0 -1319
  518. data/spec/adapters/oracle_spec.rb +0 -313
  519. data/spec/adapters/postgres_spec.rb +0 -3790
  520. data/spec/adapters/spec_helper.rb +0 -49
  521. data/spec/adapters/sqlanywhere_spec.rb +0 -170
  522. data/spec/adapters/sqlite_spec.rb +0 -688
  523. data/spec/bin_spec.rb +0 -258
  524. data/spec/core/connection_pool_spec.rb +0 -1045
  525. data/spec/core/database_spec.rb +0 -2636
  526. data/spec/core/dataset_spec.rb +0 -5175
  527. data/spec/core/deprecated_spec.rb +0 -70
  528. data/spec/core/expression_filters_spec.rb +0 -1247
  529. data/spec/core/mock_adapter_spec.rb +0 -464
  530. data/spec/core/object_graph_spec.rb +0 -303
  531. data/spec/core/placeholder_literalizer_spec.rb +0 -163
  532. data/spec/core/schema_generator_spec.rb +0 -203
  533. data/spec/core/schema_spec.rb +0 -1676
  534. data/spec/core/spec_helper.rb +0 -34
  535. data/spec/core/version_spec.rb +0 -7
  536. data/spec/core_extensions_spec.rb +0 -699
  537. data/spec/core_model_spec.rb +0 -2
  538. data/spec/core_spec.rb +0 -1
  539. data/spec/extensions/accessed_columns_spec.rb +0 -51
  540. data/spec/extensions/active_model_spec.rb +0 -85
  541. data/spec/extensions/after_initialize_spec.rb +0 -24
  542. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  543. data/spec/extensions/association_dependencies_spec.rb +0 -117
  544. data/spec/extensions/association_pks_spec.rb +0 -405
  545. data/spec/extensions/association_proxies_spec.rb +0 -86
  546. data/spec/extensions/auto_validations_spec.rb +0 -192
  547. data/spec/extensions/before_after_save_spec.rb +0 -40
  548. data/spec/extensions/blacklist_security_spec.rb +0 -88
  549. data/spec/extensions/blank_spec.rb +0 -69
  550. data/spec/extensions/boolean_readers_spec.rb +0 -93
  551. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  552. data/spec/extensions/caching_spec.rb +0 -270
  553. data/spec/extensions/class_table_inheritance_spec.rb +0 -444
  554. data/spec/extensions/column_conflicts_spec.rb +0 -60
  555. data/spec/extensions/column_select_spec.rb +0 -108
  556. data/spec/extensions/columns_introspection_spec.rb +0 -91
  557. data/spec/extensions/composition_spec.rb +0 -242
  558. data/spec/extensions/connection_expiration_spec.rb +0 -121
  559. data/spec/extensions/connection_validator_spec.rb +0 -127
  560. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -288
  561. data/spec/extensions/constraint_validations_spec.rb +0 -389
  562. data/spec/extensions/core_refinements_spec.rb +0 -519
  563. data/spec/extensions/csv_serializer_spec.rb +0 -180
  564. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  565. data/spec/extensions/dataset_associations_spec.rb +0 -343
  566. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  567. data/spec/extensions/date_arithmetic_spec.rb +0 -167
  568. data/spec/extensions/defaults_setter_spec.rb +0 -102
  569. data/spec/extensions/delay_add_association_spec.rb +0 -74
  570. data/spec/extensions/dirty_spec.rb +0 -180
  571. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -110
  572. data/spec/extensions/eager_each_spec.rb +0 -66
  573. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  574. data/spec/extensions/error_splitter_spec.rb +0 -18
  575. data/spec/extensions/error_sql_spec.rb +0 -20
  576. data/spec/extensions/eval_inspect_spec.rb +0 -73
  577. data/spec/extensions/filter_having_spec.rb +0 -40
  578. data/spec/extensions/force_encoding_spec.rb +0 -114
  579. data/spec/extensions/from_block_spec.rb +0 -21
  580. data/spec/extensions/graph_each_spec.rb +0 -119
  581. data/spec/extensions/hash_aliases_spec.rb +0 -24
  582. data/spec/extensions/hook_class_methods_spec.rb +0 -429
  583. data/spec/extensions/identifier_columns_spec.rb +0 -17
  584. data/spec/extensions/inflector_spec.rb +0 -183
  585. data/spec/extensions/input_transformer_spec.rb +0 -54
  586. data/spec/extensions/insert_returning_select_spec.rb +0 -46
  587. data/spec/extensions/instance_filters_spec.rb +0 -79
  588. data/spec/extensions/instance_hooks_spec.rb +0 -276
  589. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  590. data/spec/extensions/json_serializer_spec.rb +0 -304
  591. data/spec/extensions/lazy_attributes_spec.rb +0 -170
  592. data/spec/extensions/list_spec.rb +0 -278
  593. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  594. data/spec/extensions/many_through_many_spec.rb +0 -2172
  595. data/spec/extensions/meta_def_spec.rb +0 -21
  596. data/spec/extensions/migration_spec.rb +0 -728
  597. data/spec/extensions/modification_detection_spec.rb +0 -80
  598. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
  599. data/spec/extensions/named_timezones_spec.rb +0 -108
  600. data/spec/extensions/nested_attributes_spec.rb +0 -697
  601. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -65
  602. data/spec/extensions/null_dataset_spec.rb +0 -85
  603. data/spec/extensions/optimistic_locking_spec.rb +0 -128
  604. data/spec/extensions/pagination_spec.rb +0 -118
  605. data/spec/extensions/pg_array_associations_spec.rb +0 -736
  606. data/spec/extensions/pg_array_ops_spec.rb +0 -143
  607. data/spec/extensions/pg_array_spec.rb +0 -390
  608. data/spec/extensions/pg_enum_spec.rb +0 -92
  609. data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
  610. data/spec/extensions/pg_hstore_spec.rb +0 -206
  611. data/spec/extensions/pg_inet_ops_spec.rb +0 -101
  612. data/spec/extensions/pg_inet_spec.rb +0 -52
  613. data/spec/extensions/pg_interval_spec.rb +0 -76
  614. data/spec/extensions/pg_json_ops_spec.rb +0 -275
  615. data/spec/extensions/pg_json_spec.rb +0 -218
  616. data/spec/extensions/pg_loose_count_spec.rb +0 -17
  617. data/spec/extensions/pg_range_ops_spec.rb +0 -58
  618. data/spec/extensions/pg_range_spec.rb +0 -473
  619. data/spec/extensions/pg_row_ops_spec.rb +0 -60
  620. data/spec/extensions/pg_row_plugin_spec.rb +0 -62
  621. data/spec/extensions/pg_row_spec.rb +0 -360
  622. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
  623. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
  624. data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
  625. data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
  626. data/spec/extensions/prepared_statements_spec.rb +0 -103
  627. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
  628. data/spec/extensions/pretty_table_spec.rb +0 -92
  629. data/spec/extensions/query_literals_spec.rb +0 -183
  630. data/spec/extensions/query_spec.rb +0 -102
  631. data/spec/extensions/rcte_tree_spec.rb +0 -392
  632. data/spec/extensions/round_timestamps_spec.rb +0 -43
  633. data/spec/extensions/schema_caching_spec.rb +0 -41
  634. data/spec/extensions/schema_dumper_spec.rb +0 -814
  635. data/spec/extensions/schema_spec.rb +0 -117
  636. data/spec/extensions/scissors_spec.rb +0 -26
  637. data/spec/extensions/select_remove_spec.rb +0 -38
  638. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
  639. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  640. data/spec/extensions/serialization_spec.rb +0 -362
  641. data/spec/extensions/server_block_spec.rb +0 -90
  642. data/spec/extensions/server_logging_spec.rb +0 -45
  643. data/spec/extensions/set_overrides_spec.rb +0 -61
  644. data/spec/extensions/sharding_spec.rb +0 -198
  645. data/spec/extensions/shared_caching_spec.rb +0 -175
  646. data/spec/extensions/single_table_inheritance_spec.rb +0 -297
  647. data/spec/extensions/singular_table_names_spec.rb +0 -22
  648. data/spec/extensions/skip_create_refresh_spec.rb +0 -17
  649. data/spec/extensions/spec_helper.rb +0 -71
  650. data/spec/extensions/split_array_nil_spec.rb +0 -24
  651. data/spec/extensions/split_values_spec.rb +0 -22
  652. data/spec/extensions/sql_comments_spec.rb +0 -27
  653. data/spec/extensions/sql_expr_spec.rb +0 -60
  654. data/spec/extensions/static_cache_spec.rb +0 -361
  655. data/spec/extensions/string_agg_spec.rb +0 -85
  656. data/spec/extensions/string_date_time_spec.rb +0 -95
  657. data/spec/extensions/string_stripper_spec.rb +0 -68
  658. data/spec/extensions/subclasses_spec.rb +0 -66
  659. data/spec/extensions/subset_conditions_spec.rb +0 -38
  660. data/spec/extensions/table_select_spec.rb +0 -71
  661. data/spec/extensions/tactical_eager_loading_spec.rb +0 -136
  662. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  663. data/spec/extensions/timestamps_spec.rb +0 -175
  664. data/spec/extensions/to_dot_spec.rb +0 -154
  665. data/spec/extensions/touch_spec.rb +0 -203
  666. data/spec/extensions/tree_spec.rb +0 -274
  667. data/spec/extensions/typecast_on_load_spec.rb +0 -80
  668. data/spec/extensions/unlimited_update_spec.rb +0 -20
  669. data/spec/extensions/update_or_create_spec.rb +0 -87
  670. data/spec/extensions/update_primary_key_spec.rb +0 -100
  671. data/spec/extensions/update_refresh_spec.rb +0 -53
  672. data/spec/extensions/uuid_spec.rb +0 -106
  673. data/spec/extensions/validate_associated_spec.rb +0 -52
  674. data/spec/extensions/validation_class_methods_spec.rb +0 -1027
  675. data/spec/extensions/validation_helpers_spec.rb +0 -554
  676. data/spec/extensions/xml_serializer_spec.rb +0 -207
  677. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  678. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  679. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  680. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  681. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  682. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  683. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  684. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  685. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  686. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  687. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  688. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  689. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  690. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  691. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  692. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  693. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  694. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  695. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  696. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  697. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  698. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  699. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  700. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  701. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  702. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  703. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  704. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  705. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  706. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  707. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  708. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  709. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  710. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  711. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  712. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  713. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  714. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  715. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  716. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  717. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  718. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  719. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  720. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  721. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  722. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  723. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  724. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  725. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  726. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  727. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  728. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  729. data/spec/guards_helper.rb +0 -55
  730. data/spec/integration/associations_test.rb +0 -2506
  731. data/spec/integration/database_test.rb +0 -113
  732. data/spec/integration/dataset_test.rb +0 -1858
  733. data/spec/integration/eager_loader_test.rb +0 -687
  734. data/spec/integration/migrator_test.rb +0 -262
  735. data/spec/integration/model_test.rb +0 -230
  736. data/spec/integration/plugin_test.rb +0 -2297
  737. data/spec/integration/prepared_statement_test.rb +0 -467
  738. data/spec/integration/schema_test.rb +0 -815
  739. data/spec/integration/spec_helper.rb +0 -56
  740. data/spec/integration/timezone_test.rb +0 -86
  741. data/spec/integration/transaction_test.rb +0 -406
  742. data/spec/integration/type_test.rb +0 -133
  743. data/spec/model/association_reflection_spec.rb +0 -565
  744. data/spec/model/associations_spec.rb +0 -4589
  745. data/spec/model/base_spec.rb +0 -759
  746. data/spec/model/class_dataset_methods_spec.rb +0 -150
  747. data/spec/model/dataset_methods_spec.rb +0 -149
  748. data/spec/model/eager_loading_spec.rb +0 -2197
  749. data/spec/model/hooks_spec.rb +0 -604
  750. data/spec/model/inflector_spec.rb +0 -26
  751. data/spec/model/model_spec.rb +0 -1097
  752. data/spec/model/plugins_spec.rb +0 -299
  753. data/spec/model/record_spec.rb +0 -2162
  754. data/spec/model/spec_helper.rb +0 -46
  755. data/spec/model/validations_spec.rb +0 -193
  756. data/spec/model_no_assoc_spec.rb +0 -1
  757. data/spec/model_spec.rb +0 -1
  758. data/spec/plugin_spec.rb +0 -1
  759. data/spec/sequel_coverage.rb +0 -15
  760. data/spec/spec_config.rb +0 -10
@@ -10,17 +10,21 @@ module Sequel
10
10
  # ---------------------
11
11
 
12
12
  # Action methods defined by Sequel that execute code on the database.
13
- ACTION_METHODS = (<<-METHS).split.map(&:to_sym)
14
- << [] all 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
13
+ ACTION_METHODS = (<<-METHS).split.map(&:to_sym).freeze
14
+ << [] all as_hash avg count columns columns! delete each
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
+ where_all where_each where_single_value
18
19
  METHS
19
20
 
21
+ # The clone options to use when retrieving columns for a dataset.
22
+ COLUMNS_CLONE_OPTIONS = {:distinct => nil, :limit => 0, :offset=>nil, :where=>nil, :having=>nil, :order=>nil, :row_proc=>nil, :graph=>nil, :eager_graph=>nil}.freeze
23
+
20
24
  # Inserts the given argument into the database. Returns self so it
21
25
  # can be used safely when chaining:
22
26
  #
23
- # 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)
24
28
  def <<(arg)
25
29
  insert(arg)
26
30
  self
@@ -28,10 +32,10 @@ module Sequel
28
32
 
29
33
  # Returns the first record matching the conditions. Examples:
30
34
  #
31
- # DB[:table][:id=>1] # SELECT * FROM table WHERE (id = 1) LIMIT 1
32
- # # => {:id=1}
35
+ # DB[:table][id: 1] # SELECT * FROM table WHERE (id = 1) LIMIT 1
36
+ # # => {:id=>1}
33
37
  def [](*conditions)
34
- raise(Error, ARRAY_ACCESS_ERROR_MSG) if (conditions.length == 1 and conditions.first.is_a?(Integer)) or conditions.length == 0
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
35
39
  first(*conditions)
36
40
  end
37
41
 
@@ -54,8 +58,9 @@ module Sequel
54
58
  # # => 3
55
59
  # DB[:table].avg{function(column)} # SELECT avg(function(column)) FROM table LIMIT 1
56
60
  # # => 1
57
- def avg(column=Sequel.virtual_row(&Proc.new))
58
- aggregate_dataset.get{avg(column).as(:avg)}
61
+ def avg(arg=(no_arg = true), &block)
62
+ arg = Sequel.virtual_row(&block) if no_arg
63
+ _aggregate(:avg, arg)
59
64
  end
60
65
 
61
66
  # Returns the columns in the result set in order as an array of symbols.
@@ -68,11 +73,7 @@ module Sequel
68
73
  # DB[:table].columns
69
74
  # # => [:id, :name]
70
75
  def columns
71
- return @columns if @columns
72
- ds = unfiltered.unordered.naked.clone(:distinct => nil, :limit => 1, :offset=>nil)
73
- ds.each{break}
74
- @columns = ds.instance_variable_get(:@columns)
75
- @columns || []
76
+ _columns || columns!
76
77
  end
77
78
 
78
79
  # Ignore any cached column information and perform a query to retrieve
@@ -81,10 +82,18 @@ module Sequel
81
82
  # DB[:table].columns!
82
83
  # # => [:id, :name]
83
84
  def columns!
84
- self.columns = nil
85
- columns
85
+ ds = clone(COLUMNS_CLONE_OPTIONS)
86
+ ds.each{break}
87
+
88
+ if cols = ds.cache[:_columns]
89
+ self.columns = cols
90
+ else
91
+ []
92
+ end
86
93
  end
87
94
 
95
+ COUNT_SELECT = Sequel.function(:count).*.as(:count)
96
+
88
97
  # Returns the number of records in the dataset. If an argument is provided,
89
98
  # it is used as the argument to count. If a block is provided, it is
90
99
  # treated as a virtual row, and the result is used as the argument to
@@ -97,22 +106,24 @@ module Sequel
97
106
  # DB[:table].count{foo(column)} # SELECT count(foo(column)) AS count FROM table LIMIT 1
98
107
  # # => 1
99
108
  def count(arg=(no_arg=true), &block)
100
- if no_arg
109
+ if no_arg && !block
110
+ cached_dataset(:_count_ds) do
111
+ aggregate_dataset.select(COUNT_SELECT).single_value_ds
112
+ end.single_value!.to_i
113
+ else
101
114
  if block
102
- arg = Sequel.virtual_row(&block)
103
- aggregate_dataset.get{count(arg).as(:count)}
104
- else
105
- aggregate_dataset.get{count{}.*.as(:count)}.to_i
115
+ if no_arg
116
+ arg = Sequel.virtual_row(&block)
117
+ else
118
+ raise Error, 'cannot provide both argument and block to Dataset#count'
119
+ end
106
120
  end
107
- elsif block
108
- raise Error, 'cannot provide both argument and block to Dataset#count'
109
- else
110
- aggregate_dataset.get{count(arg).as(:count)}
121
+
122
+ _aggregate(:count, arg)
111
123
  end
112
124
  end
113
-
114
- # Deletes the records in the dataset. The returned value should be
115
- # number of records deleted, but that is adapter dependent.
125
+
126
+ # Deletes the records in the dataset, returning the number of records deleted.
116
127
  #
117
128
  # DB[:table].delete # DELETE * FROM table
118
129
  # # => 3
@@ -135,27 +146,30 @@ module Sequel
135
146
  # running queries inside the block, you should use +all+ instead of +each+
136
147
  # for the outer queries, or use a separate thread or shard inside +each+.
137
148
  def each
138
- if row_proc = @row_proc
139
- fetch_rows(select_sql){|r| yield row_proc.call(r)}
149
+ if rp = row_proc
150
+ fetch_rows(select_sql){|r| yield rp.call(r)}
140
151
  else
141
152
  fetch_rows(select_sql){|r| yield r}
142
153
  end
143
154
  self
144
155
  end
145
156
 
157
+ EMPTY_SELECT = Sequel::SQL::AliasedExpression.new(1, :one)
158
+
146
159
  # Returns true if no records exist in the dataset, false otherwise
147
160
  #
148
161
  # DB[:table].empty? # SELECT 1 AS one FROM table LIMIT 1
149
162
  # # => false
150
163
  def empty?
151
- ds = @opts[:order] ? unordered : self
152
- ds.get(Sequel::SQL::AliasedExpression.new(1, :one)).nil?
164
+ cached_dataset(:_empty_ds) do
165
+ single_value_ds.unordered.select(EMPTY_SELECT)
166
+ end.single_value!.nil?
153
167
  end
154
168
 
169
+ # Returns the first matching record if no arguments are given.
155
170
  # If a integer argument is given, it is interpreted as a limit, and then returns all
156
- # matching records up to that limit. If no argument is passed,
157
- # it returns the first matching record. If any other type of
158
- # argument(s) is passed, it is given to filter and the
171
+ # matching records up to that limit. If any other type of
172
+ # argument(s) is passed, it is treated as a filter and the
159
173
  # first matching record is returned. If a block is given, it is used
160
174
  # to filter the dataset before returning anything.
161
175
  #
@@ -170,35 +184,65 @@ module Sequel
170
184
  # DB[:table].first(2) # SELECT * FROM table LIMIT 2
171
185
  # # => [{:id=>6}, {:id=>4}]
172
186
  #
173
- # DB[:table].first(:id=>2) # SELECT * FROM table WHERE (id = 2) LIMIT 1
187
+ # DB[:table].first(id: 2) # SELECT * FROM table WHERE (id = 2) LIMIT 1
174
188
  # # => {:id=>2}
175
189
  #
176
- # DB[:table].first("id = 3") # SELECT * FROM table WHERE (id = 3) LIMIT 1
190
+ # DB[:table].first(Sequel.lit("id = 3")) # SELECT * FROM table WHERE (id = 3) LIMIT 1
177
191
  # # => {:id=>3}
178
192
  #
179
- # DB[:table].first("id = ?", 4) # SELECT * FROM table WHERE (id = 4) LIMIT 1
193
+ # DB[:table].first(Sequel.lit("id = ?", 4)) # SELECT * FROM table WHERE (id = 4) LIMIT 1
180
194
  # # => {:id=>4}
181
195
  #
182
196
  # DB[:table].first{id > 2} # SELECT * FROM table WHERE (id > 2) LIMIT 1
183
197
  # # => {:id=>5}
184
198
  #
185
- # DB[:table].first("id > ?", 4){id < 6} # SELECT * FROM table WHERE ((id > 4) AND (id < 6)) LIMIT 1
199
+ # DB[:table].first(Sequel.lit("id > ?", 4)){id < 6} # SELECT * FROM table WHERE ((id > 4) AND (id < 6)) LIMIT 1
186
200
  # # => {:id=>5}
187
201
  #
188
202
  # DB[:table].first(2){id < 2} # SELECT * FROM table WHERE (id < 2) LIMIT 2
189
203
  # # => [{:id=>1}]
190
204
  def first(*args, &block)
191
- ds = block ? filter(&block) : self
205
+ case args.length
206
+ when 0
207
+ unless block
208
+ return single_record
209
+ end
210
+ when 1
211
+ arg = args[0]
212
+ if arg.is_a?(Integer)
213
+ res = if block
214
+ if loader = cached_placeholder_literalizer(:_first_integer_cond_loader) do |pl|
215
+ where(pl.arg).limit(pl.arg)
216
+ end
192
217
 
193
- if args.empty?
194
- ds.single_record
195
- else
196
- args = (args.size == 1) ? args.first : args
197
- if args.is_a?(Integer)
198
- ds.limit(args).all
199
- else
200
- ds.filter(args).single_record
218
+ loader.all(filter_expr(&block), arg)
219
+ else
220
+ where(&block).limit(arg).all
221
+ end
222
+ else
223
+ if loader = cached_placeholder_literalizer(:_first_integer_loader) do |pl|
224
+ limit(pl.arg)
225
+ end
226
+
227
+ loader.all(arg)
228
+ else
229
+ limit(arg).all
230
+ end
231
+ end
232
+
233
+ return res
234
+ end
235
+ where_args = args
236
+ args = arg
237
+ end
238
+
239
+ if loader = cached_where_placeholder_literalizer(where_args||args, block, :_first_cond_loader) do |pl|
240
+ _single_record_ds.where(pl.arg)
201
241
  end
242
+
243
+ loader.first(filter_expr(args, &block))
244
+ else
245
+ _single_record_ds.where(args, &block).single_record!
202
246
  end
203
247
  end
204
248
 
@@ -229,15 +273,32 @@ module Sequel
229
273
  def get(column=(no_arg=true; nil), &block)
230
274
  ds = naked
231
275
  if block
232
- raise(Error, ARG_BLOCK_ERROR_MSG) unless no_arg
276
+ raise(Error, 'Must call Dataset#get with an argument or a block, not both') unless no_arg
233
277
  ds = ds.select(&block)
234
278
  column = ds.opts[:select]
235
279
  column = nil if column.is_a?(Array) && column.length < 2
236
280
  else
237
- ds = if column.is_a?(Array)
238
- ds.select(*column)
281
+ case column
282
+ when Array
283
+ ds = ds.select(*column)
284
+ when LiteralString, Symbol, SQL::Identifier, SQL::QualifiedIdentifier, SQL::AliasedExpression
285
+ if loader = cached_placeholder_literalizer(:_get_loader) do |pl|
286
+ ds.single_value_ds.select(pl.arg)
287
+ end
288
+
289
+ return loader.get(column)
290
+ end
291
+
292
+ ds = ds.select(column)
239
293
  else
240
- ds.select(auto_alias_expression(column))
294
+ if loader = cached_placeholder_literalizer(:_get_alias_loader) do |pl|
295
+ ds.single_value_ds.select(Sequel.as(pl.arg, :v))
296
+ end
297
+
298
+ return loader.get(column)
299
+ end
300
+
301
+ ds = ds.select(Sequel.as(column, :v))
241
302
  end
242
303
  end
243
304
 
@@ -272,6 +333,7 @@ module Sequel
272
333
  # after every 50 records.
273
334
  # :return :: When this is set to :primary_key, returns an array of
274
335
  # autoincremented primary key values for the rows inserted.
336
+ # This does not have an effect if +values+ is a Dataset.
275
337
  # :server :: Set the server/shard to use for the transaction and insert
276
338
  # queries.
277
339
  # :slice :: Same as :commit_every, :commit_every takes precedence.
@@ -279,7 +341,7 @@ module Sequel
279
341
  return @db.transaction{insert(columns, values)} if values.is_a?(Dataset)
280
342
 
281
343
  return if values.empty?
282
- raise(Error, IMPORT_ERROR_MSG) if columns.empty?
344
+ raise(Error, 'Using Sequel::Dataset#import with an empty column array is not allowed') if columns.empty?
283
345
  ds = opts[:server] ? server(opts[:server]) : self
284
346
 
285
347
  if slice_size = opts.fetch(:commit_every, opts.fetch(:slice, default_import_slice))
@@ -296,7 +358,8 @@ module Sequel
296
358
  end
297
359
 
298
360
  # Inserts values into the associated table. The returned value is generally
299
- # the value of the primary key for the inserted row, but that is adapter dependent.
361
+ # the value of the autoincremented primary key for the inserted row, assuming that
362
+ # a single row is inserted and the table has an autoincrementing primary key.
300
363
  #
301
364
  # +insert+ handles a number of different argument formats:
302
365
  # no arguments or single empty hash :: Uses DEFAULT VALUES
@@ -322,7 +385,7 @@ module Sequel
322
385
  # DB[:items].insert([:a, :b], [1,2])
323
386
  # # INSERT INTO items (a, b) VALUES (1, 2)
324
387
  #
325
- # DB[:items].insert(:a => 1, :b => 2)
388
+ # DB[:items].insert(a: 1, b: 2)
326
389
  # # INSERT INTO items (a, b) VALUES (1, 2)
327
390
  #
328
391
  # DB[:items].insert(DB[:old_items])
@@ -339,17 +402,6 @@ module Sequel
339
402
  end
340
403
  end
341
404
 
342
- # Returns the interval between minimum and maximum values for the given
343
- # column/expression. Uses a virtual row block if no argument is given.
344
- #
345
- # DB[:table].interval(:id) # SELECT (max(id) - min(id)) FROM table LIMIT 1
346
- # # => 6
347
- # DB[:table].interval{function(column)} # SELECT (max(function(column)) - min(function(column))) FROM table LIMIT 1
348
- # # => 7
349
- def interval(column=Sequel.virtual_row(&Proc.new))
350
- aggregate_dataset.get{(max(column) - min(column)).as(:interval)}
351
- end
352
-
353
405
  # Reverses the order and then runs #first with the given arguments and block. Note that this
354
406
  # will not necessarily give you the last record in the dataset,
355
407
  # unless you have an unambiguous order. If there is not
@@ -365,8 +417,8 @@ module Sequel
365
417
  reverse.first(*args, &block)
366
418
  end
367
419
 
368
- # Maps column values for each record in the dataset (if a column name is
369
- # given), or performs the stock mapping functionality of +Enumerable+ otherwise.
420
+ # Maps column values for each record in the dataset (if an argument is given)
421
+ # or performs the stock mapping functionality of +Enumerable+ otherwise.
370
422
  # Raises an +Error+ if both an argument and block are given.
371
423
  #
372
424
  # DB[:table].map(:id) # SELECT * FROM table
@@ -381,7 +433,7 @@ module Sequel
381
433
  # # => [[1, 'A'], [2, 'B'], [3, 'C'], ...]
382
434
  def map(column=nil, &block)
383
435
  if column
384
- raise(Error, ARG_BLOCK_ERROR_MSG) if block
436
+ raise(Error, 'Must call Dataset#map with either an argument or a block, not both') if block
385
437
  return naked.map(column) if row_proc
386
438
  if column.is_a?(Array)
387
439
  super(){|r| r.values_at(*column)}
@@ -400,8 +452,58 @@ module Sequel
400
452
  # # => 10
401
453
  # DB[:table].max{function(column)} # SELECT max(function(column)) FROM table LIMIT 1
402
454
  # # => 7
403
- def max(column=Sequel.virtual_row(&Proc.new))
404
- aggregate_dataset.get{max(column).as(:max)}
455
+ def max(arg=(no_arg = true), &block)
456
+ arg = Sequel.virtual_row(&block) if no_arg
457
+ _aggregate(:max, arg)
458
+ end
459
+
460
+ # Execute a MERGE statement, which allows for INSERT, UPDATE, and DELETE
461
+ # behavior in a single query, based on whether rows from a source table
462
+ # match rows in the current table, based on the join conditions.
463
+ #
464
+ # Unless the dataset uses static SQL, to use #merge, you must first have
465
+ # called #merge_using to specify the merge source and join conditions.
466
+ # You will then likely to call one or more of the following methods
467
+ # to specify MERGE behavior by adding WHEN [NOT] MATCHED clauses:
468
+ #
469
+ # * #merge_insert
470
+ # * #merge_update
471
+ # * #merge_delete
472
+ #
473
+ # The WHEN [NOT] MATCHED clauses are added to the SQL in the order these
474
+ # methods were called on the dataset. If none of these methods are
475
+ # called, an error is raised.
476
+ #
477
+ # Example:
478
+ #
479
+ # DB[:m1]
480
+ # merge_using(:m2, i1: :i2).
481
+ # merge_insert(i1: :i2, a: Sequel[:b]+11).
482
+ # merge_delete{a > 30}.
483
+ # merge_update(i1: Sequel[:i1]+:i2+10, a: Sequel[:a]+:b+20).
484
+ # merge
485
+ #
486
+ # SQL:
487
+ #
488
+ # MERGE INTO m1 USING m2 ON (i1 = i2)
489
+ # WHEN NOT MATCHED THEN INSERT (i1, a) VALUES (i2, (b + 11))
490
+ # WHEN MATCHED AND (a > 30) THEN DELETE
491
+ # WHEN MATCHED THEN UPDATE SET i1 = (i1 + i2 + 10), a = (a + b + 20)
492
+ #
493
+ # On PostgreSQL, two additional merge methods are supported, for the
494
+ # PostgreSQL-specific DO NOTHING syntax.
495
+ #
496
+ # * #merge_do_nothing_when_matched
497
+ # * #merge_do_nothing_when_not_matched
498
+ #
499
+ # This method is supported on Oracle, but Oracle's MERGE support is
500
+ # non-standard, and has the following issues:
501
+ #
502
+ # * DELETE clause requires UPDATE clause
503
+ # * DELETE clause requires a condition
504
+ # * DELETE clause only affects rows updated by UPDATE clause
505
+ def merge
506
+ execute_ddl(merge_sql)
405
507
  end
406
508
 
407
509
  # Returns the minimum value for the given column/expression.
@@ -411,14 +513,15 @@ module Sequel
411
513
  # # => 1
412
514
  # DB[:table].min{function(column)} # SELECT min(function(column)) FROM table LIMIT 1
413
515
  # # => 0
414
- def min(column=Sequel.virtual_row(&Proc.new))
415
- aggregate_dataset.get{min(column).as(:min)}
516
+ def min(arg=(no_arg = true), &block)
517
+ arg = Sequel.virtual_row(&block) if no_arg
518
+ _aggregate(:min, arg)
416
519
  end
417
520
 
418
521
  # This is a front end for import that allows you to submit an array of
419
522
  # hashes instead of arrays of columns and values:
420
523
  #
421
- # DB[:table].multi_insert([{:x => 1}, {:x => 2}])
524
+ # DB[:table].multi_insert([{x: 1}, {x: 2}])
422
525
  # # INSERT INTO table (x) VALUES (1)
423
526
  # # INSERT INTO table (x) VALUES (2)
424
527
  #
@@ -433,7 +536,7 @@ module Sequel
433
536
  import(columns, hashes.map{|h| columns.map{|c| h[c]}}, opts)
434
537
  end
435
538
 
436
- # Yields each row in the dataset, but interally uses multiple queries as needed to
539
+ # Yields each row in the dataset, but internally uses multiple queries as needed to
437
540
  # process the entire result set without keeping all rows in the dataset in memory,
438
541
  # even if the underlying driver buffers all query results in memory.
439
542
  #
@@ -445,6 +548,10 @@ module Sequel
445
548
  # Sequel checks that the datasets using this method have an order, but it cannot
446
549
  # ensure that the order is unambiguous.
447
550
  #
551
+ # Note that this method is not safe to use on many adapters if you are
552
+ # running additional queries inside the provided block. If you are
553
+ # running queries inside the block, use a separate thread or shard inside +paged_each+.
554
+ #
448
555
  # Options:
449
556
  # :rows_per_fetch :: The number of rows to fetch per query. Defaults to 1000.
450
557
  # :strategy :: The strategy to use for paging of results. By default this is :offset,
@@ -454,8 +561,8 @@ module Sequel
454
561
  # selecting the columns you are ordering by, and none of the columns can contain
455
562
  # NULLs. Note that some Sequel adapters have optimized implementations that will
456
563
  # use cursors or streaming regardless of the :strategy option used.
457
- # :filter_values :: If the :strategy=>:filter option is used, this option should be a proc
458
- # that accepts the last retreived row for the previous page and an array of
564
+ # :filter_values :: If the strategy: :filter option is used, this option should be a proc
565
+ # that accepts the last retrieved row for the previous page and an array of
459
566
  # ORDER BY expressions, and returns an array of values relating to those
460
567
  # expressions for the last retrieved row. You will need to use this option
461
568
  # if your ORDER BY expressions are not simple columns, if they contain
@@ -474,13 +581,13 @@ module Sequel
474
581
  # # SELECT * FROM table ORDER BY id LIMIT 100 OFFSET 100
475
582
  # # ...
476
583
  #
477
- # DB[:table].order(:id).paged_each(:strategy=>:filter){|row| }
584
+ # DB[:table].order(:id).paged_each(strategy: :filter){|row| }
478
585
  # # SELECT * FROM table ORDER BY id LIMIT 1000
479
586
  # # SELECT * FROM table WHERE id > 1001 ORDER BY id LIMIT 1000
480
587
  # # ...
481
588
  #
482
- # DB[:table].order(:table__id).paged_each(:strategy=>:filter,
483
- # :filter_values=>proc{|row, exprs| [row[:id]]}){|row| }
589
+ # DB[:table].order(:id).paged_each(strategy: :filter,
590
+ # filter_values: lambda{|row, exprs| [row[:id]]}){|row| }
484
591
  # # SELECT * FROM table ORDER BY id LIMIT 1000
485
592
  # # SELECT * FROM table WHERE id > 1001 ORDER BY id LIMIT 1000
486
593
  # # ...
@@ -488,7 +595,7 @@ module Sequel
488
595
  unless @opts[:order]
489
596
  raise Sequel::Error, "Dataset#paged_each requires the dataset be ordered"
490
597
  end
491
- unless block_given?
598
+ unless defined?(yield)
492
599
  return enum_for(:paged_each, opts)
493
600
  end
494
601
 
@@ -544,56 +651,45 @@ module Sequel
544
651
  self
545
652
  end
546
653
 
547
- # Returns a +Range+ instance made from the minimum and maximum values for the
548
- # given column/expression. Uses a virtual row block if no argument is given.
549
- #
550
- # DB[:table].range(:id) # SELECT max(id) AS v1, min(id) AS v2 FROM table LIMIT 1
551
- # # => 1..10
552
- # DB[:table].interval{function(column)} # SELECT max(function(column)) AS v1, min(function(column)) AS v2 FROM table LIMIT 1
553
- # # => 0..7
554
- def range(column=Sequel.virtual_row(&Proc.new))
555
- if r = aggregate_dataset.select{[min(column).as(v1), max(column).as(v2)]}.first
556
- (r[:v1]..r[:v2])
557
- end
558
- end
559
-
560
654
  # Returns a hash with key_column values as keys and value_column values as
561
- # values. Similar to to_hash, but only selects the columns given. Like
562
- # to_hash, it accepts an optional :hash parameter, into which entries will
655
+ # values. Similar to as_hash, but only selects the columns given. Like
656
+ # as_hash, it accepts an optional :hash parameter, into which entries will
563
657
  # be merged.
564
658
  #
565
- # DB[:table].select_hash(:id, :name) # SELECT id, name FROM table
659
+ # DB[:table].select_hash(:id, :name)
660
+ # # SELECT id, name FROM table
566
661
  # # => {1=>'a', 2=>'b', ...}
567
662
  #
568
663
  # You can also provide an array of column names for either the key_column,
569
664
  # the value column, or both:
570
665
  #
571
- # DB[:table].select_hash([:id, :foo], [:name, :bar]) # SELECT * FROM table
572
- # # {[1, 3]=>['a', 'c'], [2, 4]=>['b', 'd'], ...}
666
+ # DB[:table].select_hash([:id, :foo], [:name, :bar])
667
+ # # SELECT id, foo, name, bar FROM table
668
+ # # => {[1, 3]=>['a', 'c'], [2, 4]=>['b', 'd'], ...}
573
669
  #
574
670
  # When using this method, you must be sure that each expression has an alias
575
- # that Sequel can determine. Usually you can do this by calling the #as method
576
- # on the expression and providing an alias.
671
+ # that Sequel can determine.
577
672
  def select_hash(key_column, value_column, opts = OPTS)
578
- _select_hash(:to_hash, key_column, value_column, opts)
673
+ _select_hash(:as_hash, key_column, value_column, opts)
579
674
  end
580
675
 
581
676
  # Returns a hash with key_column values as keys and an array of value_column values.
582
677
  # Similar to to_hash_groups, but only selects the columns given. Like to_hash_groups,
583
678
  # it accepts an optional :hash parameter, into which entries will be merged.
584
679
  #
585
- # DB[:table].select_hash_groups(:name, :id) # SELECT id, name FROM table
680
+ # DB[:table].select_hash_groups(:name, :id)
681
+ # # SELECT id, name FROM table
586
682
  # # => {'a'=>[1, 4, ...], 'b'=>[2, ...], ...}
587
683
  #
588
684
  # You can also provide an array of column names for either the key_column,
589
685
  # the value column, or both:
590
686
  #
591
- # DB[:table].select_hash_groups([:first, :middle], [:last, :id]) # SELECT * FROM table
592
- # # {['a', 'b']=>[['c', 1], ['d', 2], ...], ...}
687
+ # DB[:table].select_hash_groups([:first, :middle], [:last, :id])
688
+ # # SELECT first, middle, last, id FROM table
689
+ # # => {['a', 'b']=>[['c', 1], ['d', 2], ...], ...}
593
690
  #
594
691
  # When using this method, you must be sure that each expression has an alias
595
- # that Sequel can determine. Usually you can do this by calling the #as method
596
- # on the expression and providing an alias.
692
+ # that Sequel can determine.
597
693
  def select_hash_groups(key_column, value_column, opts = OPTS)
598
694
  _select_hash(:to_hash_groups, key_column, value_column, opts)
599
695
  end
@@ -616,8 +712,7 @@ module Sequel
616
712
  # # => [[1, 'A'], [2, 'B'], [3, 'C'], ...]
617
713
  #
618
714
  # If you provide an array of expressions, you must be sure that each entry
619
- # in the array has an alias that Sequel can determine. Usually you can do this
620
- # by calling the #as method on the expression and providing an alias.
715
+ # in the array has an alias that Sequel can determine.
621
716
  def select_map(column=nil, &block)
622
717
  _select_map(column, false, &block)
623
718
  end
@@ -636,8 +731,7 @@ module Sequel
636
731
  # # => [[1, 'A'], [2, 'B'], [3, 'C'], ...]
637
732
  #
638
733
  # If you provide an array of expressions, you must be sure that each entry
639
- # in the array has an alias that Sequel can determine. Usually you can do this
640
- # by calling the #as method on the expression and providing an alias.
734
+ # in the array has an alias that Sequel can determine.
641
735
  def select_order_map(column=nil, &block)
642
736
  _select_map(column, true, &block)
643
737
  end
@@ -649,7 +743,7 @@ module Sequel
649
743
  # DB[:test].single_record # SELECT * FROM test LIMIT 1
650
744
  # # => {:column_name=>'value'}
651
745
  def single_record
652
- clone(:limit=>1).single_record!
746
+ _single_record_ds.single_record!
653
747
  end
654
748
 
655
749
  # Returns the first record in dataset, without limiting the dataset. Returns nil if
@@ -671,9 +765,10 @@ module Sequel
671
765
  # DB[:test].single_value # SELECT * FROM test LIMIT 1
672
766
  # # => 'value'
673
767
  def single_value
674
- if r = ungraphed.naked.single_record
768
+ single_value_ds.each do |r|
675
769
  r.each{|_, v| return v}
676
770
  end
771
+ nil
677
772
  end
678
773
 
679
774
  # Returns the first value of the first record in the dataset, without limiting the dataset.
@@ -695,8 +790,9 @@ module Sequel
695
790
  # # => 55
696
791
  # DB[:table].sum{function(column)} # SELECT sum(function(column)) FROM table LIMIT 1
697
792
  # # => 10
698
- def sum(column=Sequel.virtual_row(&Proc.new))
699
- aggregate_dataset.get{sum(column).as(:sum)}
793
+ def sum(arg=(no_arg = true), &block)
794
+ arg = Sequel.virtual_row(&block) if no_arg
795
+ _aggregate(:sum, arg)
700
796
  end
701
797
 
702
798
  # Returns a hash with one column used as key and another used as value.
@@ -704,52 +800,57 @@ module Sequel
704
800
  # will overwrite the value of the previous row(s). If the value_column
705
801
  # is not given or nil, uses the entire hash as the value.
706
802
  #
707
- # DB[:table].to_hash(:id, :name) # SELECT * FROM table
803
+ # DB[:table].as_hash(:id, :name) # SELECT * FROM table
708
804
  # # {1=>'Jim', 2=>'Bob', ...}
709
805
  #
710
- # DB[:table].to_hash(:id) # SELECT * FROM table
806
+ # DB[:table].as_hash(:id) # SELECT * FROM table
711
807
  # # {1=>{:id=>1, :name=>'Jim'}, 2=>{:id=>2, :name=>'Bob'}, ...}
712
808
  #
713
809
  # You can also provide an array of column names for either the key_column,
714
810
  # the value column, or both:
715
811
  #
716
- # DB[:table].to_hash([:id, :foo], [:name, :bar]) # SELECT * FROM table
812
+ # DB[:table].as_hash([:id, :foo], [:name, :bar]) # SELECT * FROM table
717
813
  # # {[1, 3]=>['Jim', 'bo'], [2, 4]=>['Bob', 'be'], ...}
718
814
  #
719
- # DB[:table].to_hash([:id, :name]) # SELECT * FROM table
720
- # # {[1, 'Jim']=>{:id=>1, :name=>'Jim'}, [2, 'Bob'=>{:id=>2, :name=>'Bob'}, ...}
815
+ # DB[:table].as_hash([:id, :name]) # SELECT * FROM table
816
+ # # {[1, 'Jim']=>{:id=>1, :name=>'Jim'}, [2, 'Bob']=>{:id=>2, :name=>'Bob'}, ...}
721
817
  #
722
818
  # Options:
723
819
  # :all :: Use all instead of each to retrieve the objects
724
820
  # :hash :: The object into which the values will be placed. If this is not
725
821
  # given, an empty hash is used. This can be used to use a hash with
726
822
  # a default value or default proc.
727
- def to_hash(key_column, value_column = nil, opts = OPTS)
823
+ def as_hash(key_column, value_column = nil, opts = OPTS)
728
824
  h = opts[:hash] || {}
729
825
  meth = opts[:all] ? :all : :each
730
826
  if value_column
731
- return naked.to_hash(key_column, value_column, opts) if row_proc
827
+ return naked.as_hash(key_column, value_column, opts) if row_proc
732
828
  if value_column.is_a?(Array)
733
829
  if key_column.is_a?(Array)
734
- send(meth){|r| h[r.values_at(*key_column)] = r.values_at(*value_column)}
830
+ public_send(meth){|r| h[r.values_at(*key_column)] = r.values_at(*value_column)}
735
831
  else
736
- send(meth){|r| h[r[key_column]] = r.values_at(*value_column)}
832
+ public_send(meth){|r| h[r[key_column]] = r.values_at(*value_column)}
737
833
  end
738
834
  else
739
835
  if key_column.is_a?(Array)
740
- send(meth){|r| h[r.values_at(*key_column)] = r[value_column]}
836
+ public_send(meth){|r| h[r.values_at(*key_column)] = r[value_column]}
741
837
  else
742
- send(meth){|r| h[r[key_column]] = r[value_column]}
838
+ public_send(meth){|r| h[r[key_column]] = r[value_column]}
743
839
  end
744
840
  end
745
841
  elsif key_column.is_a?(Array)
746
- send(meth){|r| h[key_column.map{|k| r[k]}] = r}
842
+ public_send(meth){|r| h[key_column.map{|k| r[k]}] = r}
747
843
  else
748
- send(meth){|r| h[r[key_column]] = r}
844
+ public_send(meth){|r| h[r[key_column]] = r}
749
845
  end
750
846
  h
751
847
  end
752
848
 
849
+ # Alias of as_hash for backwards compatibility.
850
+ def to_hash(*a)
851
+ as_hash(*a)
852
+ end
853
+
753
854
  # Returns a hash with one column used as key and the values being an
754
855
  # array of column values. If the value_column is not given or nil, uses
755
856
  # the entire hash as the value.
@@ -774,7 +875,6 @@ module Sequel
774
875
  # :hash :: The object into which the values will be placed. If this is not
775
876
  # given, an empty hash is used. This can be used to use a hash with
776
877
  # a default value or default proc.
777
- # to start with a new, empty hash.
778
878
  def to_hash_groups(key_column, value_column = nil, opts = OPTS)
779
879
  h = opts[:hash] || {}
780
880
  meth = opts[:all] ? :all : :each
@@ -782,21 +882,21 @@ module Sequel
782
882
  return naked.to_hash_groups(key_column, value_column, opts) if row_proc
783
883
  if value_column.is_a?(Array)
784
884
  if key_column.is_a?(Array)
785
- send(meth){|r| (h[r.values_at(*key_column)] ||= []) << r.values_at(*value_column)}
885
+ public_send(meth){|r| (h[r.values_at(*key_column)] ||= []) << r.values_at(*value_column)}
786
886
  else
787
- send(meth){|r| (h[r[key_column]] ||= []) << r.values_at(*value_column)}
887
+ public_send(meth){|r| (h[r[key_column]] ||= []) << r.values_at(*value_column)}
788
888
  end
789
889
  else
790
890
  if key_column.is_a?(Array)
791
- send(meth){|r| (h[r.values_at(*key_column)] ||= []) << r[value_column]}
891
+ public_send(meth){|r| (h[r.values_at(*key_column)] ||= []) << r[value_column]}
792
892
  else
793
- send(meth){|r| (h[r[key_column]] ||= []) << r[value_column]}
893
+ public_send(meth){|r| (h[r[key_column]] ||= []) << r[value_column]}
794
894
  end
795
895
  end
796
896
  elsif key_column.is_a?(Array)
797
- send(meth){|r| (h[key_column.map{|k| r[k]}] ||= []) << r}
897
+ public_send(meth){|r| (h[key_column.map{|k| r[k]}] ||= []) << r}
798
898
  else
799
- send(meth){|r| (h[r[key_column]] ||= []) << r}
899
+ public_send(meth){|r| (h[r[key_column]] ||= []) << r}
800
900
  end
801
901
  h
802
902
  end
@@ -809,15 +909,14 @@ module Sequel
809
909
  execute_ddl(truncate_sql)
810
910
  end
811
911
 
812
- # Updates values for the dataset. The returned value is generally the
813
- # number of rows updated, but that is adapter dependent. +values+ should
814
- # a hash where the keys are columns to set and values are the values to
912
+ # Updates values for the dataset. The returned value is the number of rows updated.
913
+ # +values+ should be a hash where the keys are columns to set and values are the values to
815
914
  # which to set the columns.
816
915
  #
817
- # DB[:table].update(:x=>nil) # UPDATE table SET x = NULL
916
+ # DB[:table].update(x: nil) # UPDATE table SET x = NULL
818
917
  # # => 10
819
918
  #
820
- # DB[:table].update(:x=>Sequel.expr(:x)+1, :y=>0) # UPDATE table SET x = (x + 1), y = 0
919
+ # DB[:table].update(x: Sequel[:x]+1, y: 0) # UPDATE table SET x = (x + 1), y = 0
821
920
  # # => 10
822
921
  def update(values=OPTS, &block)
823
922
  sql = update_sql(values)
@@ -828,6 +927,52 @@ module Sequel
828
927
  end
829
928
  end
830
929
 
930
+ # Return an array of all rows matching the given filter condition, also
931
+ # yielding each row to the given block. Basically the same as where(cond).all(&block),
932
+ # except it can be optimized to not create an intermediate dataset.
933
+ #
934
+ # DB[:table].where_all(id: [1,2,3])
935
+ # # SELECT * FROM table WHERE (id IN (1, 2, 3))
936
+ def where_all(cond, &block)
937
+ if loader = _where_loader([cond], nil)
938
+ loader.all(filter_expr(cond), &block)
939
+ else
940
+ where(cond).all(&block)
941
+ end
942
+ end
943
+
944
+ # Iterate over all rows matching the given filter condition,
945
+ # yielding each row to the given block. Basically the same as where(cond).each(&block),
946
+ # except it can be optimized to not create an intermediate dataset.
947
+ #
948
+ # DB[:table].where_each(id: [1,2,3]){|row| p row}
949
+ # # SELECT * FROM table WHERE (id IN (1, 2, 3))
950
+ def where_each(cond, &block)
951
+ if loader = _where_loader([cond], nil)
952
+ loader.each(filter_expr(cond), &block)
953
+ else
954
+ where(cond).each(&block)
955
+ end
956
+ end
957
+
958
+ # Filter the datasets using the given filter condition, then return a single value.
959
+ # This assumes that the dataset has already been setup to limit the selection to
960
+ # a single column. Basically the same as where(cond).single_value,
961
+ # except it can be optimized to not create an intermediate dataset.
962
+ #
963
+ # DB[:table].select(:name).where_single_value(id: 1)
964
+ # # SELECT name FROM table WHERE (id = 1) LIMIT 1
965
+ def where_single_value(cond)
966
+ if loader = cached_where_placeholder_literalizer([cond], nil, :_where_single_value_loader) do |pl|
967
+ single_value_ds.where(pl.arg)
968
+ end
969
+
970
+ loader.get(filter_expr(cond))
971
+ else
972
+ where(cond).single_value
973
+ end
974
+ end
975
+
831
976
  # Run the given SQL and return an array of all rows. If a block is given,
832
977
  # each row is yielded to the block after all rows are loaded. See with_sql_each.
833
978
  def with_sql_all(sql, &block)
@@ -843,14 +988,11 @@ module Sequel
843
988
  alias with_sql_update with_sql_delete
844
989
 
845
990
  # Run the given SQL and yield each returned row to the block.
846
- #
847
- # This method should not be called on a shared dataset if the columns selected
848
- # in the given SQL do not match the columns in the receiver.
849
991
  def with_sql_each(sql)
850
- if row_proc = @row_proc
851
- fetch_rows(sql){|r| yield row_proc.call(r)}
992
+ if rp = row_proc
993
+ _with_sql_dataset.fetch_rows(sql){|r| yield rp.call(r)}
852
994
  else
853
- fetch_rows(sql){|r| yield r}
995
+ _with_sql_dataset.fetch_rows(sql){|r| yield r}
854
996
  end
855
997
  self
856
998
  end
@@ -883,7 +1025,8 @@ module Sequel
883
1025
  # separate insert commands for each row. Otherwise, call #multi_insert_sql
884
1026
  # and execute each statement it gives separately.
885
1027
  def _import(columns, values, opts)
886
- trans_opts = Hash[opts].merge!(:server=>@opts[:server])
1028
+ trans_opts = Hash[opts]
1029
+ trans_opts[:server] = @opts[:server]
887
1030
  if opts[:return] == :primary_key
888
1031
  @db.transaction(trans_opts){values.map{|v| insert(columns, v)}}
889
1032
  else
@@ -899,9 +1042,15 @@ module Sequel
899
1042
 
900
1043
  # Returns an array of the first value in each row.
901
1044
  def _select_map_single
902
- map{|r| r.values.first}
1045
+ k = nil
1046
+ map{|r| r[k||=r.keys.first]}
903
1047
  end
904
1048
 
1049
+ # A dataset for returning single values from the current dataset.
1050
+ def single_value_ds
1051
+ clone(:limit=>1).ungraphed.naked
1052
+ end
1053
+
905
1054
  private
906
1055
 
907
1056
  # Internals of all and with_sql_all
@@ -913,10 +1062,21 @@ module Sequel
913
1062
  a
914
1063
  end
915
1064
 
1065
+ # Cached placeholder literalizer for methods that return values using aggregate functions.
1066
+ def _aggregate(function, arg)
1067
+ if loader = cached_placeholder_literalizer(:"_#{function}_loader") do |pl|
1068
+ aggregate_dataset.limit(1).select(SQL::Function.new(function, pl.arg).as(function))
1069
+ end
1070
+ loader.get(arg)
1071
+ else
1072
+ aggregate_dataset.get(SQL::Function.new(function, arg).as(function))
1073
+ end
1074
+ end
1075
+
916
1076
  # Internals of +select_hash+ and +select_hash_groups+
917
1077
  def _select_hash(meth, key_column, value_column, opts=OPTS)
918
1078
  select(*(key_column.is_a?(Array) ? key_column : [key_column]) + (value_column.is_a?(Array) ? value_column : [value_column])).
919
- send(meth, hash_key_symbols(key_column), hash_key_symbols(value_column), opts)
1079
+ public_send(meth, hash_key_symbols(key_column), hash_key_symbols(value_column), opts)
920
1080
  end
921
1081
 
922
1082
  # Internals of +select_map+ and +select_order_map+
@@ -933,6 +1093,18 @@ module Sequel
933
1093
  end
934
1094
  end
935
1095
 
1096
+ # A cached dataset for a single record for this dataset.
1097
+ def _single_record_ds
1098
+ cached_dataset(:_single_record_ds){clone(:limit=>1)}
1099
+ end
1100
+
1101
+ # Loader used for where_all and where_each.
1102
+ def _where_loader(where_args, where_block)
1103
+ cached_where_placeholder_literalizer(where_args, where_block, :_where_loader) do |pl|
1104
+ where(pl.arg)
1105
+ end
1106
+ end
1107
+
936
1108
  # Automatically alias the given expression if it does not have an identifiable alias.
937
1109
  def auto_alias_expression(v)
938
1110
  case v
@@ -951,7 +1123,7 @@ module Sequel
951
1123
 
952
1124
  # Set the server to use to :default unless it is already set in the passed opts
953
1125
  def default_server_opts(opts)
954
- if @db.sharded?
1126
+ if @db.sharded? && !opts.has_key?(:server)
955
1127
  opts = Hash[opts]
956
1128
  opts[:server] = @opts[:server] || :default
957
1129
  end
@@ -962,7 +1134,7 @@ module Sequel
962
1134
  # :read_only server unless a specific server is set.
963
1135
  def execute(sql, opts=OPTS, &block)
964
1136
  db = @db
965
- if db.sharded?
1137
+ if db.sharded? && !opts.has_key?(:server)
966
1138
  opts = Hash[opts]
967
1139
  opts[:server] = @opts[:server] || (@opts[:lock] ? :default : :read_only)
968
1140
  opts
@@ -1052,11 +1224,10 @@ module Sequel
1052
1224
  Sequel.|(*cond)
1053
1225
  end
1054
1226
 
1055
- # Modify the identifier returned from the database based on the
1056
- # identifier_output_method.
1227
+ # Downcase identifiers by default when outputing them from the database.
1057
1228
  def output_identifier(v)
1058
1229
  v = 'untitled' if v == ''
1059
- (i = identifier_output_method) ? v.to_s.send(i).to_sym : v.to_sym
1230
+ v.to_s.downcase.to_sym
1060
1231
  end
1061
1232
 
1062
1233
  # This is run inside .all, after all of the records have been loaded
@@ -1105,5 +1276,18 @@ module Sequel
1105
1276
  c
1106
1277
  end
1107
1278
  end
1279
+
1280
+ # Cached dataset to use for with_sql_#{all,each,first,single_value}.
1281
+ # This is used so that the columns returned by the given SQL do not
1282
+ # affect the receiver of the with_sql_* method.
1283
+ def _with_sql_dataset
1284
+ if @opts[:_with_sql_ds]
1285
+ self
1286
+ else
1287
+ cached_dataset(:_with_sql_ds) do
1288
+ clone(:_with_sql_ds=>true)
1289
+ end
1290
+ end
1291
+ end
1108
1292
  end
1109
1293
  end