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
data/doc/sql.rdoc CHANGED
@@ -14,7 +14,7 @@ For SELECT queries, you should probably use <tt>Database#fetch</tt> with a strin
14
14
  puts row[:name]
15
15
  end
16
16
 
17
- <tt>Database#fetch</tt> will take the query you give it, execute it on the database, and yield a hash with column symbol keys for each row returned. If you want to use some placeholder variables, you can set the placeholders with ? and add the arguments to fetch:
17
+ <tt>Database#fetch</tt> will take the query you give it, execute it on the database, and yield a hash with column symbol keys for each row returned. If you want to use some placeholder variables, you can set the placeholders with ? and add the corresponding arguments to +fetch+:
18
18
 
19
19
  DB.fetch("SELECT * FROM albums WHERE name LIKE ?", 'A%') do |row|
20
20
  puts row[:name]
@@ -22,13 +22,13 @@ For SELECT queries, you should probably use <tt>Database#fetch</tt> with a strin
22
22
 
23
23
  You can also use named placeholders by starting the placeholder with a colon, and using a hash for the argument:
24
24
 
25
- DB.fetch("SELECT * FROM albums WHERE name LIKE :pattern", :pattern=>'A%') do |row|
25
+ DB.fetch("SELECT * FROM albums WHERE name LIKE :pattern", pattern: 'A%') do |row|
26
26
  puts row[:name]
27
27
  end
28
28
 
29
- This can be helpful for long queries where it is difficult to match the ? with the arguments.
29
+ This can be helpful for long queries where it is difficult to match the question marks in the query with the arguments.
30
30
 
31
- What Sequel actually does internally is two separate things. It first creates a dataset representing the query, and then it executes the dataset's SQL code to retrieve the objects. Often, you want to define a dataset at some point, but not execute it till later. You can do this by leaving off the block, and storing the dataset in a variable:
31
+ What Sequel actually does internally is two separate things. It first creates a dataset representing the query, and then it executes the dataset's SQL code to retrieve the objects. Often, you want to define a dataset at some point, but not execute it until later. You can do this by leaving off the block, and storing the dataset in a variable:
32
32
 
33
33
  ds = DB.fetch("SELECT * FROM albums")
34
34
 
@@ -41,7 +41,7 @@ You should note that <tt>Database#[]</tt> calls <tt>Database#fetch</tt> if a str
41
41
  ds = DB["SELECT * FROM albums"]
42
42
  ds.each{|r| puts r[:name]}
43
43
 
44
- However, note that <tt>Database#[]</tt> cannot take a block directly, you have to call +each+ on the returned dataset. There are plenty of other methods besides +each+, one is +all+ which returns all records as an array:
44
+ However, note that <tt>Database#[]</tt> cannot take a block directly, you have to call +each+ on the returned dataset. There are plenty of other methods besides +each+. For example, the +all+ method returns all records in the dataset as an array:
45
45
 
46
46
  DB["SELECT * FROM albums"].all # [{:id=>1, :name=>'RF', ...}, ...]
47
47
 
@@ -78,7 +78,7 @@ Almost everywhere in Sequel, you can drop down to literal SQL by providing a lit
78
78
  DB[:albums].select('name') # SELECT 'name' FROM albums
79
79
  DB[:albums].select(Sequel.lit('name')) # SELECT name FROM albums
80
80
 
81
- For a simpler way of creating literal strings, you can also use the {core_extensions extension}[rdoc-ref:doc/core_extensions.rdoc], which adds the <tt>String#lit</tt> method, and other methods that integrate Sequel's DSL with the ruby language:
81
+ For a simpler way of creating literal strings, you can also use the {core_extensions extension}[rdoc-ref:doc/core_extensions.rdoc], which adds the <tt>String#lit</tt> method, and other methods that integrate Sequel's DSL with the Ruby language:
82
82
 
83
83
  DB[:albums].select('name'.lit)
84
84
 
@@ -113,7 +113,7 @@ Now that you know how to see what SQL is being used, let's jump in and see how t
113
113
 
114
114
  === Identifiers
115
115
 
116
- In Sequel, SQL identifiers are usually specified as ruby symbols:
116
+ In Sequel, SQL identifiers are usually specified as Ruby symbols:
117
117
 
118
118
  :column # "column"
119
119
 
@@ -121,30 +121,33 @@ As you can see, Sequel quotes identifiers by default. Depending on your databas
121
121
 
122
122
  :column # "COLUMN" on some databases
123
123
 
124
- A plain symbol is usually treated as an unqualified identifier. However, if you are using multiple tables in a query, and you want to reference a column in one of the tables that has the same name as a column in another one of the tables, you need to qualify that reference. There's two main ways in Sequel to do that. The first is implicit qualification inside the symbol, using the double underscore:
125
-
126
- :table__column # "table"."column"
127
-
128
- Note that you can't use a period to separate them:
124
+ A plain symbol is usually treated as an unqualified identifier. However, if you are using multiple tables in a query, and you want to reference a column in one of the tables that has the same name as a column in another one of the tables, you need to qualify that reference. Note that you can't use a period to separate them:
129
125
 
130
126
  :table.column # calls the column method on the symbol
131
127
 
132
128
  Also note that specifying the period inside the symbol doesn't work if you are quoting identifiers:
133
129
 
134
- :"table.column" # "table.column"
130
+ :"table.column" # "table.column" instead of "table"."column"
135
131
 
136
- The other way to qualify an identifier is to use the <tt>Sequel.qualify</tt> with the table and column symbols:
132
+ There are a few different Sequel methods for creating qualified identifier objects. The recommended way is to explicitly create a qualified identifier by using <tt>Sequel.[]</tt> to create an identifier and call <tt>[]</tt> or +qualify+ on that, or by using the <tt>Sequel.qualify</tt> method with the table and column symbols:
137
133
 
134
+ Sequel[:table][:column] # "table"."column"
135
+ Sequel[:column].qualify(:table) # "table"."column"
138
136
  Sequel.qualify(:table, :column) # "table"."column"
139
137
 
140
138
  Another way to generate identifiers is to use Sequel's {virtual row support}[rdoc-ref:doc/virtual_rows.rdoc]:
141
139
 
142
140
  DB[:albums].select{name} # SELECT "name" FROM "albums"
143
- DB[:albums].select{albums__name} # SELECT "albums"."name" FROM "albums"
141
+ DB[:albums].select{albums[:name]} # SELECT "albums"."name" FROM "albums"
142
+
143
+ You can also use the symbol_aref extension for creating qualified identifiers:
144
+
145
+ Sequel.extension :symbol_aref
146
+ :table[:column] # "table"."column"
144
147
 
145
148
  === Numbers
146
149
 
147
- In general, ruby numbers map directly to SQL numbers:
150
+ In general, Ruby numbers map directly to SQL numbers:
148
151
 
149
152
  # Integers
150
153
  1 # 1
@@ -158,25 +161,24 @@ In general, ruby numbers map directly to SQL numbers:
158
161
 
159
162
  === Strings
160
163
 
161
- In general, ruby strings map directly to SQL strings:
164
+ In general, Ruby strings map directly to SQL strings:
162
165
 
163
166
  'name' # 'name'
164
167
  "name" # 'name'
165
168
 
166
169
  === Aliasing
167
170
 
168
- Sequel allows for implicit aliasing in column symbols using the triple underscore:
171
+ You can use the <tt>Sequel.as</tt> method to create an alias, and the +as+ method on most Sequel-specific expression objects:
169
172
 
170
- :column___alias # "column" AS "alias"
173
+ Sequel.as(:column, :alias) # "column" AS "alias"
174
+ Sequel[:column].as(:alias) # "column" AS "alias"
175
+ Sequel[:table][:column].as(:alias) # "table"."column" AS "alias"
176
+ (Sequel[:column] + 1).as(:alias) # ("column" + 1) AS "alias"
171
177
 
172
- You can combine this with implicit qualification:
178
+ You can also use the symbol_as extension for creating aliased identifiers:
173
179
 
174
- :table__column___alias # "table"."column" AS "alias"
175
-
176
- You can also use the <tt>Sequel.as</tt> method to create an alias, and the +as+ method on most Sequel-specific expression objects:
177
-
178
- Sequel.as(:column, :alias) # "column" AS "alias"
179
- Sequel.qualify(:table, :column).as(:alias) # "table"."column" AS "alias"
180
+ Sequel.extension :symbol_as
181
+ :column.as(:alias) # "column" AS "alias"
180
182
 
181
183
  If you want to use a derived column list, you can provide an array of column aliases:
182
184
 
@@ -200,11 +202,11 @@ Aggregate functions work the same way as normal functions, since they share the
200
202
 
201
203
  Sequel.function(:sum, :column) # sum(column)
202
204
 
203
- To use the DISTINCT modifier to an aggregate function, call the distinct method on the function:
205
+ To use the DISTINCT modifier to an aggregate function, call the +distinct+ method on the function expression, which returns a new function expression:
204
206
 
205
207
  DB[:albums].select{sum(:column).distinct} # SELECT sum(DISTINCT column) FROM albums
206
208
 
207
- If you want to use the wildcard as the sole argument of the aggregate function, use the * method on the Function:
209
+ If you want to use the wildcard as the sole argument of the aggregate function, use the * method on the function expression:
208
210
 
209
211
  Sequel.function(:count).* # count(*)
210
212
  DB[:albums].select{count.function.*} # SELECT count(*) FROM albums
@@ -213,10 +215,10 @@ Note that Sequel provides helper methods for aggregate functions such as +count+
213
215
 
214
216
  === Window Functions
215
217
 
216
- If the database supports window functions, Sequel can handle them by calling the over method on a Function:
218
+ If the database supports window functions, Sequel can handle them by calling the +over+ method on a function expression:
217
219
 
218
- DB[:albums].select{function.function.over}
219
- # SELECT function() OVER () FROM albums
220
+ DB[:albums].select{row_number.function.over}
221
+ # SELECT row_number() OVER () FROM albums
220
222
 
221
223
  DB[:albums].select{count.function.*.over}
222
224
  # SELECT count(*) OVER () FROM albums
@@ -224,17 +226,29 @@ If the database supports window functions, Sequel can handle them by calling the
224
226
  DB[:albums].select{function(:col1).over(:partition=>col2, :order=>col3)}
225
227
  # SELECT function(col1) OVER (PARTITION BY col2 ORDER BY col3) FROM albums
226
228
 
227
- DB[:albums].select{function(c1, c2).over(:partition=>[c3, c4], :order=>[c5, c6])}
228
- # SELECT function(c1, c2) OVER (PARTITION BY c3, c4 ORDER BY c5, c6) FROM albums
229
+ DB[:albums].select{function(c1, c2).over(:partition=>[c3, c4], :order=>[c5, c6.desc])}
230
+ # SELECT function(c1, c2) OVER (PARTITION BY c3, c4 ORDER BY c5, c6 DESC) FROM albums
231
+
232
+ DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3, :frame=>:rows)}
233
+ # SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM albums
234
+
235
+ DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3, :frame=>{:type=>:range, :start=>1, :end=>1})}
236
+ # SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3 RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM albums
237
+
238
+ DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3, :frame=>{:type=>:groups, :start=>[2, :preceding], :end=>[1, :preceding]})}
239
+ # SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3 GROUPS BETWEEN 2 PRECEDING AND 1 PRECEDING) FROM albums
240
+
241
+ DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3, :frame=>{:type=>:range, :start=>:preceding, :exclude=>:current})}
242
+ # SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3 RANGE UNBOUNDED PRECEDING EXCLUDE CURRENT ROW) FROM albums
229
243
 
230
244
  === Schema Qualified Functions
231
245
 
232
- If the database supports schema qualified functions, Sequel can handle them by calling the function method on a QuailfiedIdentifier:
246
+ If the database supports schema qualified functions, Sequel can handle them by calling the +function+ method on a qualified identifier:
233
247
 
234
- DB[:albums].select{schema__function.function}
248
+ DB[:albums].select{schema[:function].function}
235
249
  # SELECT schema.function() FROM albums
236
250
 
237
- DB[:albums].select{schema__function.function(col, 2, "a")}
251
+ DB[:albums].select{schema[:function].function(:col, 2, "a")}
238
252
  # SELECT schema.function(col, 2, 'a') FROM albums
239
253
 
240
254
  === Portable/Emulated Functions
@@ -250,7 +264,7 @@ Some examples are:
250
264
 
251
265
  Sequel uses hashes to specify equality:
252
266
 
253
- {:column=>1} # ("column" = 1)
267
+ {column: 1} # ("column" = 1)
254
268
 
255
269
  You can also specify this as an array of two element arrays:
256
270
 
@@ -264,27 +278,27 @@ For expression objects, you can also use the =~ method:
264
278
 
265
279
  You can specify a not equals condition by inverting the hash or array of two element arrays using <tt>Sequel.negate</tt> or <tt>Sequel.~</tt>:
266
280
 
267
- Sequel.negate(:column => 1) # ("column" != 1)
281
+ Sequel.negate(column: 1) # ("column" != 1)
268
282
  Sequel.negate([[:column, 1]]) # ("column" != 1)
269
- Sequel.~(:column => 1) # ("column" != 1)
283
+ Sequel.~(column: 1) # ("column" != 1)
270
284
  Sequel.~([[:column, 1]]) # ("column" != 1)
271
285
 
272
- The difference between the two is that negate only works on hashes and arrays of element arrays, and it negates all entries in the hash or array, while ~ does a general inversion. This is best shown by an example with multiple entries:
286
+ The difference between the two is that +negate+ only works on hashes and arrays of element arrays, and it negates all entries in the hash or array, while ~ does a general inversion. This is best shown by an example with multiple entries:
273
287
 
274
- Sequel.negate(:column => 1, :foo => 2) # (("column" != 1) AND (foo != 2))
275
- Sequel.~(:column => 1, :foo => 2) # (("column" != 1) OR (foo != 2))
288
+ Sequel.negate(column: 1, foo: 2) # (("column" != 1) AND (foo != 2))
289
+ Sequel.~(column: 1, foo: 2) # (("column" != 1) OR (foo != 2))
276
290
 
277
291
  You can also use the ~ method on an equality expression:
278
292
 
279
293
  where{~(column =~ 1)} # ("column" != 1)
280
294
 
281
- On Ruby 1.9+, you can use the !~ method:
295
+ Or you can use the !~ method:
282
296
 
283
297
  where{column !~ 1} # ("column" != 1)
284
298
 
285
299
  The most common need for not equals is in filters, in which case you can use the +exclude+ method:
286
300
 
287
- DB[:albums].exclude(:column=>1) # SELECT * FROM "albums" WHERE ("column" != 1)
301
+ DB[:albums].exclude(column: 1) # SELECT * FROM "albums" WHERE ("column" != 1)
288
302
 
289
303
  Note that +exclude+ does a generalized inversion, similar to <tt>Sequel.~</tt>.
290
304
 
@@ -292,19 +306,19 @@ Note that +exclude+ does a generalized inversion, similar to <tt>Sequel.~</tt>.
292
306
 
293
307
  Sequel also uses hashes to specify inclusion, and inversions of those hashes to specify exclusion:
294
308
 
295
- {:column=>[1, 2, 3]} # ("column" IN (1, 2, 3))
296
- Sequel.~(:column=>[1, 2, 3]) # ("column" NOT IN (1, 2, 3))
309
+ {column: [1, 2, 3]} # ("column" IN (1, 2, 3))
310
+ Sequel.~(column: [1, 2, 3]) # ("column" NOT IN (1, 2, 3))
297
311
 
298
312
  As you may have guessed, Sequel switches from an = to an IN when the hash value is an array. It also does this for datasets, which easily allows you to test for inclusion and exclusion in a subselect:
299
313
 
300
- {:column=>DB[:albums].select(:id)} # ("column" IN (SELECT "id" FROM "albums"))
301
- Sequel.~(:column=>DB[:albums].select(:id)) # ("column" NOT IN (SELECT "id" FROM "albums"))
314
+ {column: DB[:albums].select(:id)} # ("column" IN (SELECT "id" FROM "albums"))
315
+ Sequel.~(column: DB[:albums].select(:id)) # ("column" NOT IN (SELECT "id" FROM "albums"))
302
316
 
303
317
  Similar to =, you can also use =~ with expressions for inclusion:
304
318
 
305
319
  where{column =~ [1, 2, 3]} # ("column" IN (1, 2, 3))
306
320
 
307
- and on Ruby 1.9, !~ for exclusion:
321
+ and !~ for exclusion:
308
322
 
309
323
  where{column !~ [1, 2, 3]} # ("column" NOT IN (1, 2, 3))
310
324
 
@@ -314,19 +328,19 @@ Sequel also supports the SQL EXISTS operator using <tt>Dataset#exists</tt>:
314
328
 
315
329
  === Identity Operators (IS, IS NOT)
316
330
 
317
- Hashes in Sequel use IS if the value is true, false, or nil:
331
+ Hashes in Sequel use IS if the value is +true+, +false+, or +nil+:
318
332
 
319
- {:column=>nil} # ("column" IS NULL)
320
- {:column=>true} # ("column" IS TRUE)
321
- {:column=>false} # ("column" IS FALSE)
333
+ {column: nil} # ("column" IS NULL)
334
+ {column: true} # ("column" IS TRUE)
335
+ {column: false} # ("column" IS FALSE)
322
336
 
323
337
  Negation works the same way as it does for equality and inclusion:
324
338
 
325
- Sequel.~(:column=>nil) # ("column" IS NOT NULL)
326
- Sequel.~(:column=>true) # ("column" IS NOT TRUE)
327
- Sequel.~(:column=>false) # ("column" IS NOT FALSE)
339
+ Sequel.~(column: nil) # ("column" IS NOT NULL)
340
+ Sequel.~(column: true) # ("column" IS NOT TRUE)
341
+ Sequel.~(column: false) # ("column" IS NOT FALSE)
328
342
 
329
- Likewise, =~ works for identity (and Ruby 1.9, !~ for negative identity):
343
+ Likewise, =~ works for identity and !~ for negative identity on expressions:
330
344
 
331
345
  where{column =~ nil} # ("column" IS NULL)
332
346
  where{column !~ nil} # ("column" IS NOT NULL)
@@ -339,7 +353,7 @@ Sequel's general inversion operator is ~, which works on symbols and most Sequel
339
353
 
340
354
  Note that ~ will actually apply the inversion operation to the underlying object, which is why
341
355
 
342
- Sequel.~(:column=>1)
356
+ Sequel.~(column: 1)
343
357
 
344
358
  produces <tt>(column != 1)</tt> instead of <tt>NOT (column = 1)</tt>.
345
359
 
@@ -347,14 +361,14 @@ produces <tt>(column != 1)</tt> instead of <tt>NOT (column = 1)</tt>.
347
361
 
348
362
  Sequel defines the inequality operators directly on most Sequel-specific expression objects:
349
363
 
350
- Sequel.qualify(:table, :column) > 1 # ("table"."column" > 1)
351
- Sequel.qualify(:table, :column) < 1 # ("table"."column" < 1)
364
+ Sequel[:table][:column] > 1 # ("table"."column" > 1)
365
+ Sequel[:table][:column] < 1 # ("table"."column" < 1)
352
366
  Sequel.function(:func) >= 1 # (func() >= 1)
353
367
  Sequel.function(:func, :column) <= 1 # (func("column") <= 1)
354
368
 
355
- If you want to use them on a symbol, you should call <tt>Sequel.expr</tt> with the symbol:
369
+ If you want to use them on a symbol, you should call <tt>Sequel.[]</tt> with the symbol to get an expression object:
356
370
 
357
- Sequel.expr(:column) > 1 # ("column" > 1)
371
+ Sequel[:column] > 1 # ("column" > 1)
358
372
 
359
373
  A common use of virtual rows is to handle inequality operators:
360
374
 
@@ -364,33 +378,31 @@ A common use of virtual rows is to handle inequality operators:
364
378
 
365
379
  The standard mathematical operates are defined on most Sequel-specific expression objects:
366
380
 
367
- Sequel.expr(:column) + 1 # "column" + 1
368
- Sequel.expr(:table__column) - 1 # "table"."column" - 1
369
- Sequel.qualify(:table, :column) * 1 # "table"."column" * 1
370
- Sequel.expr(:column) / 1 # "column" / 1
381
+ Sequel[:column] + 1 # "column" + 1
382
+ Sequel[:table][:column] - 1 # "table"."column" - 1
383
+ Sequel[:table][:column] * 1 # "table"."column" * 1
384
+ Sequel[:column] / 1 # "column" / 1
385
+ Sequel[:column] ** 1 # power("column", 1)
371
386
 
372
387
  You can also call the operator methods directly on the Sequel module:
373
388
 
374
389
  Sequel.+(:column, 1) # "column" + 1
375
- Sequel.-(:table__column, 1) # "table"."column" - 1
376
- Sequel.*(Sequel.qualify(:table, :column), 1) # "table"."column" * 1
390
+ Sequel.-(Sequel[:table][:column], 1) # "table"."column" - 1
391
+ Sequel.*(Sequel[:table][:column], 1) # "table"."column" * 1
377
392
  Sequel./(:column, 1) # "column" / 1
393
+ Sequel.**(:column, 1) # power("column", 1)
378
394
 
379
- Note that the following does not work:
380
-
381
- 1 + Sequel.expr(:column) # raises TypeError
382
-
383
- For commutative operates such as + and *, this isn't a problem as you can just reorder, but non-commutative operators such as - and / cannot be expressed directly. The solution is to use one of the methods on the Sequel module:
395
+ Note that since Sequel implements support for Ruby's coercion protocol, the following also works:
384
396
 
385
- Sequel.expr(1) / :column # (1 / "column")
386
- Sequel./(1, :column) # (1 / "column")
397
+ 1 + Sequel[:column]
398
+ 1 - Sequel[:table][:column]
387
399
 
388
400
  === Boolean Operators (AND OR)
389
401
 
390
402
  Sequel defines the & and | methods on most Sequel-specific expression objects to handle AND and OR:
391
403
 
392
- Sequel.expr(:column1) & :column2 # ("column1" AND "column2")
393
- Sequel.expr(:column1=>1) | {:column2=>2} # (("column1" = 1) OR ("column2" = 2))
404
+ Sequel[:column1] & :column2 # ("column1" AND "column2")
405
+ Sequel[{column1: 1}] | {column2: 2} # (("column1" = 1) OR ("column2" = 2))
394
406
  (Sequel.function(:func) > 1) & :column3 # ((func() > 1) AND "column3")
395
407
 
396
408
  Note the use of parentheses in the last statement. If you omit them, you won't get what you expect.
@@ -402,39 +414,51 @@ is parsed as:
402
414
 
403
415
  Sequel.function(:func) > (1 & :column3)
404
416
 
405
- You and also use the <tt>Sequel.&</tt> and <tt>Sequel.|</tt> methods:
417
+ You can also use the <tt>Sequel.&</tt> and <tt>Sequel.|</tt> methods:
406
418
 
407
419
  Sequel.&(:column1, :column2) # ("column1" AND "column2")
408
- Sequel.|({:column1=>1}, {:column2=>2}) # (("column1" = 1) OR ("column2" = 2))
420
+ Sequel.|({column1: 1}, {column2: 2}) # (("column1" = 1) OR ("column2" = 2))
409
421
 
410
422
  You can use hashes and arrays of two element arrays to specify AND and OR with equality conditions:
411
423
 
412
- {:column1=>1, :column2=>2} # (("column1" = 1) AND ("column2" = 2))
424
+ {column1: 1, column2: 2} # (("column1" = 1) AND ("column2" = 2))
413
425
  [[:column1, 1], [:column2, 2]] # (("column1" = 1) AND ("column2" = 2))
414
426
 
415
427
  As you can see, these literalize with ANDs by default. You can use the <tt>Sequel.or</tt> method to use OR instead:
416
428
 
417
- Sequel.or(:column1=>1, :column2=>2) # (("column1" = 1) OR ("column2" = 2))
429
+ Sequel.or(column1: 1, column2: 2) # (("column1" = 1) OR ("column2" = 2))
430
+
431
+ As you can see in the above examples, <tt>Sequel.|</tt> and <tt>Sequel.or</tt> work differently.
432
+ <tt>Sequel.|</tt> is for combining an arbitrary number of expressions using OR. If you pass a single
433
+ argument, <tt>Sequel.|</tt> will just convert it to a Sequel expression, similar to <tt>Sequel.expr</tt>.
434
+ <tt>Sequel.or</tt> is for taking a single hash or array of two element arrays and combining the
435
+ elements of that single argument using OR instead of AND:
436
+
437
+ Sequel.|(column1: 1, column2: 2) # (("column1" = 1) AND ("column2" = 2))
438
+ Sequel.or(column1: 1, column2: 2) # (("column1" = 1) OR ("column2" = 2))
439
+
440
+ Sequel.|({column1: 1}, {column2: 2}) # (("column1" = 1) OR ("column2" = 2))
441
+ Sequel.or({column1: 1}, {column2: 2}) # ArgumentError
418
442
 
419
443
  You've already seen the <tt>Sequel.negate</tt> method, which will use ANDs if multiple entries are used:
420
444
 
421
- Sequel.negate(:column1=>1, :column2=>2) # (("column1" != 1) AND ("column2" != 2))
445
+ Sequel.negate(column1: 1, column2: 2) # (("column1" != 1) AND ("column2" != 2))
422
446
 
423
447
  To negate while using ORs, the <tt>Sequel.~</tt> operator can be used:
424
448
 
425
- Sequel.~(:column1=>1, :column2=>2) # (("column1" != 1) OR ("column2" != 2))
449
+ Sequel.~(column1: 1, column2: 2) # (("column1" != 1) OR ("column2" != 2))
426
450
 
427
451
  Note again that <tt>Dataset#exclude</tt> uses ~, not +negate+:
428
452
 
429
- DB[:albums].exclude(:column1=>1, :column2=>2) # SELECT * FROM "albums" WHERE (("column" != 1) OR ("column2" != 2))
453
+ DB[:albums].exclude(column1: 1, column2: 2) # SELECT * FROM "albums" WHERE (("column" != 1) OR ("column2" != 2))
430
454
 
431
455
  === Casts
432
456
 
433
457
  Casting in Sequel is done with the +cast+ method, which is available on most of the Sequel-specific expression objects:
434
458
 
435
- Sequel.expr(:name).cast(:text) # CAST("name" AS text)
436
- Sequel.expr('1').cast(:integer) # CAST('1' AS integer)
437
- Sequel.qualify(:table, :column).cast(:date) # CAST("table"."column" AS date)
459
+ Sequel[:name].cast(:text) # CAST("name" AS text)
460
+ Sequel['1'].cast(:integer) # CAST('1' AS integer)
461
+ Sequel[:table][:column].cast(:date) # CAST("table"."column" AS date)
438
462
 
439
463
  You can also use the <tt>Sequel.cast</tt> method:
440
464
 
@@ -444,72 +468,72 @@ You can also use the <tt>Sequel.cast</tt> method:
444
468
 
445
469
  Sequel allows the use of bitwise mathematical operators on Sequel::SQL::NumericExpression objects:
446
470
 
447
- Sequel.expr(:number) + 1 # => #<Sequel::SQL::NumericExpression ...>
448
- (Sequel.expr(:number) + 1) & 5 # (("number" + 1) & 5)
471
+ Sequel[:number] + 1 # => #<Sequel::SQL::NumericExpression ...>
472
+ (Sequel[:number] + 1) & 5 # (("number" + 1) & 5)
449
473
 
450
474
  As you can see, when you use the + operator on a symbol, you get a NumericExpression. You can turn an expression a NumericExpression using +sql_number+:
451
475
 
452
- Sequel.expr(:number).sql_number | 5 # ("number" | 5)
476
+ Sequel[:number].sql_number | 5 # ("number" | 5)
453
477
  Sequel.function(:func).sql_number << 7 # (func() << 7)
454
478
  Sequel.cast(:name, :integer).sql_number >> 8 # (CAST("name" AS integer) >> 8)
455
479
 
456
480
  Sequel allows you to do the cast and conversion at the same time via +cast_numeric+:
457
481
 
458
- Sequel.expr(:name).cast_numeric ^ 9 # (CAST("name" AS integer) ^ 9)
482
+ Sequel[:name].cast_numeric ^ 9 # (CAST("name" AS integer) ^ 9)
459
483
 
460
484
  Note that &, |, and ~ are already defined to do AND, OR, and NOT on most expressions, so if you want to use the bitwise operators, you need to make sure that they are converted first:
461
485
 
462
- ~Sequel.expr(:name) # NOT "name"
463
- ~Sequel.expr(:name).sql_number # ~"name"
486
+ ~Sequel[:name] # NOT "name"
487
+ ~Sequel[:name].sql_number # ~"name"
464
488
 
465
489
  === String Operators (||, LIKE, Regexp)
466
490
 
467
491
  Sequel allows the use of the string concatenation operator on Sequel::SQL::StringExpression objects, which can be created using the +sql_string+ method on an expression:
468
492
 
469
- Sequel.expr(:name).sql_string + ' - Name' # ("name" || ' - Name')
493
+ Sequel[:name].sql_string + ' - Name' # ("name" || ' - Name')
470
494
 
471
- Just like for the bitwise operators, Sequel allows you do do the cast and conversion at the same time via +cast_string+:
495
+ Just like for the bitwise operators, Sequel allows you to do the cast and conversion at the same time via +cast_string+:
472
496
 
473
- Sequel.expr(:number).cast_string + ' - Number' # (CAST(number AS varchar(255)) || ' - Number')
497
+ Sequel[:number].cast_string + ' - Number' # (CAST(number AS varchar(255)) || ' - Number')
474
498
 
475
499
  Note that similar to the mathematical operators, you cannot switch the order the expression and have it work:
476
500
 
477
- 'Name - ' + Sequel.expr(:name).sql_string # raises TypeError
501
+ 'Name - ' + Sequel[:name].sql_string # raises TypeError
478
502
 
479
- Just like for the mathematical operators, you can use <tt>Sequel.expr</tt> to wrap the object:
503
+ Just like for the mathematical operators, you can use <tt>Sequel.[]</tt> to wrap the object:
480
504
 
481
- Sequel.expr('Name - ') + :name # ('Name - ' || "name")
505
+ Sequel['Name - '] + :name # ('Name - ' || "name")
482
506
 
483
507
  The <tt>Sequel.join</tt> method concatenates all of the elements in the array:
484
508
 
485
509
  Sequel.join(['Name', :name]) # ('Name' || "name")
486
510
 
487
- Just like ruby's <tt>String#join</tt>, you can provide an argument for a string used to join each element:
511
+ Just like Ruby's <tt>String#join</tt>, you can provide an argument for a string used to join each element:
488
512
 
489
513
  Sequel.join(['Name', :name], ' - ') # ('Name' || ' - ' || "name")
490
514
 
491
515
  For the LIKE operator, Sequel defines the +like+ and +ilike+ methods on most Sequel-specific expression objects:
492
516
 
493
- Sequel.expr(:name).like('A%') # ("name" LIKE 'A%' ESCAPE '\')
494
- Sequel.expr(:name).ilike('A%') # ("name" ILIKE 'A%' ESCAPE '\')
517
+ Sequel[:name].like('A%') # ("name" LIKE 'A%' ESCAPE '\')
518
+ Sequel[:name].ilike('A%') # ("name" ILIKE 'A%' ESCAPE '\')
495
519
 
496
520
  You can also use the <tt>Sequel.like</tt> and <tt>Sequel.ilike</tt> methods:
497
521
 
498
522
  Sequel.like(:name, 'A%') # ("name" LIKE 'A%' ESCAPE '\')
499
523
  Sequel.ilike(:name, 'A%') # ("name" ILIKE 'A%' ESCAPE '\')
500
524
 
501
- Note the above syntax for ilike, while Sequel's default, is specific to PostgreSQL. However, most other adapters override the behavior. For example, on MySQL, Sequel uses LIKE BINARY for +like+, and LIKE for +ilike+. If the database supports both case sensitive and case insensitive LIKE, then +like+ will use a case sensitive LIKE, and +ilike+ will use a case insensitive LIKE.
525
+ Note the above syntax for +ilike+, while Sequel's default, is specific to PostgreSQL. However, most other adapters override the behavior. For example, on MySQL, Sequel uses LIKE BINARY for +like+, and LIKE for +ilike+. If the database supports both case sensitive and case insensitive LIKE, then +like+ will use a case sensitive LIKE, and +ilike+ will use a case insensitive LIKE.
502
526
 
503
527
  Inverting the LIKE operator works like other inversions:
504
528
 
505
529
  ~Sequel.like(:name, 'A%') # ("name" NOT LIKE 'A%' ESCAPE '\')
506
530
 
507
- Sequel also supports SQL regular expressions on MySQL and PostgreSQL. You can use these by passing a ruby regular expression to +like+ or +ilike+, or by making the regular expression a hash value:
531
+ Sequel also supports SQL regular expressions on MySQL and PostgreSQL (and SQLite when using the sqlite adapter with the :setup_regexp_function Database option). You can use these by passing a Ruby regular expression to +like+ or +ilike+, or by making the regular expression a hash value:
508
532
 
509
533
  Sequel.like(:name, /^A/) # ("name" ~ '^A')
510
534
  ~Sequel.ilike(:name, /^A/) # ("name" !~* '^A')
511
- {:name=>/^A/i} # ("name" ~* '^A')
512
- Sequel.~(:name=>/^A/) # ("name" !~ '^A')
535
+ {name: /^A/i} # ("name" ~* '^A')
536
+ Sequel.~(name: /^A/) # ("name" !~ '^A')
513
537
 
514
538
  Note that using +ilike+ with a regular expression will always make the regexp case insensitive. If you use +like+ or the hash with regexp value, it will only be case insensitive if the Regexp itself is case insensitive.
515
539
 
@@ -517,36 +541,37 @@ Note that using +ilike+ with a regular expression will always make the regexp ca
517
541
 
518
542
  Sequel supports specifying ascending or descending order using the +asc+ and +desc+ method on most Sequel-specific expression objects:
519
543
 
520
- Sequel.expr(:column).asc # "column" ASC
521
- Sequel.expr(:column).qualify(:table).desc # "table"."column" DESC
544
+ Sequel[:column].asc # "column" ASC
545
+ Sequel[:table][:column].desc # "table"."column" DESC
522
546
 
523
547
  You can also use the <tt>Sequel.asc</tt> and <tt>Sequel.desc</tt> methods:
524
548
 
525
549
  Sequel.asc(:column) # "column" ASC
526
- Sequel.desc(Sequel.expr(:column).qualify(:table)) # "table"."column" DESC
550
+ Sequel.desc(Sequel[:table][:column]) # "table"."column" DESC
527
551
 
528
552
  On some databases, you can specify null ordering:
529
553
 
530
554
  Sequel.asc(:column, :nulls=>:first) # "column" ASC NULLS FIRST
531
- Sequel.desc(Sequel.expr(:column).qualify(:table), :nulls=>:last) # "table"."column" DESC NULLS LAST
555
+ Sequel.desc(Sequel[:table][:column], :nulls=>:last) # "table"."column" DESC NULLS LAST
532
556
 
533
557
  === All Columns (.*)
534
558
 
535
- To select all columns in a table, Sequel supports the * method on identifiers without an argument:
559
+ To select all columns in a table, Sequel supports the * method on identifiers and qualified identifiers without an argument:
536
560
 
537
- Sequel.expr(:table).* # "table".*
561
+ Sequel[:table].* # "table".*
562
+ Sequel[:schema][:table].* # "schema"."table".*
538
563
 
539
564
  === CASE statements
540
565
 
541
- Sequel allows the easy production of SQL CASE statements using the <tt>Sequel.case</tt> method. The first argument is a hash or array of two element arrays representing the conditions, the second argument is the default value (ELSE). The keys of the hash (or first element in each array) is the WHEN condition, and the values of the hash (or second element in each array) is the THEN result. Here are some examples:
566
+ Sequel supports SQL CASE statements using the <tt>Sequel.case</tt> method. The first argument is a hash or array of two element arrays representing the conditions, the second argument is the default value (ELSE). The keys of the hash (or first element in each array) is the WHEN condition, and the values of the hash (or second element in each array) is the THEN result. Here are some examples:
542
567
 
543
- Sequel.case({:column=>1}, 0) # (CASE WHEN "column" THEN 1 ELSE 0 END)
544
- Sequel.case([[column, 1]], 0) # (CASE WHEN "column" THEN 1 ELSE 0 END)
545
- Sequel.case({{:column=>nil}=>1}, 0) # (CASE WHEN (column IS NULL) THEN 1 ELSE 0 END)
568
+ Sequel.case({column: 1}, 0) # (CASE WHEN "column" THEN 1 ELSE 0 END)
569
+ Sequel.case([[:column, 1]], 0) # (CASE WHEN "column" THEN 1 ELSE 0 END)
570
+ Sequel.case({{column: nil}=>1}, 0) # (CASE WHEN (column IS NULL) THEN 1 ELSE 0 END)
546
571
 
547
572
  If the hash or array has multiple arguments, multiple WHEN clauses are used:
548
573
 
549
- Sequel.case({:c=>1, :d=>2}, 0) # (CASE WHEN "c" THEN 1 WHEN "d" THEN 2 ELSE 0 END)
574
+ Sequel.case({c: 1, d: 2}, 0) # (CASE WHEN "c" THEN 1 WHEN "d" THEN 2 ELSE 0 END)
550
575
  Sequel.case([[:c, 1], [:d, 2]], 0) # (CASE WHEN "c" THEN 1 WHEN "d" THEN 2 ELSE 0 END)
551
576
 
552
577
  If you provide a 3rd argument to <tt>Sequel.case</tt>, it goes between CASE and WHEN:
@@ -557,8 +582,8 @@ If you provide a 3rd argument to <tt>Sequel.case</tt>, it goes between CASE and
557
582
 
558
583
  Sequel supports SQL subscripts using the +sql_subscript+ method on most Sequel-specific expression objects:
559
584
 
560
- Sequel.expr(:column).sql_subscript(3) # column[3]
561
- Sequel.expr(:column).qualify(:table).sql_subscript(3) # table.column[3]
585
+ Sequel[:column].sql_subscript(3) # column[3]
586
+ Sequel[:table][:column].sql_subscript(3) # table.column[3]
562
587
 
563
588
  You can also use the <tt>Sequel.subscript</tt> method:
564
589
 
@@ -574,7 +599,7 @@ In Sequel, the SQL queries are build with method chaining.
574
599
 
575
600
  === Creating Datasets
576
601
 
577
- You generally start by creating a dataset by calling <tt>Dataset#[]</tt> with a symbol specifying the table name:
602
+ You generally start creating a dataset by calling <tt>Dataset#[]</tt> with a symbol specifying the table name:
578
603
 
579
604
  DB[:albums] # SELECT * FROM albums
580
605
 
@@ -582,7 +607,7 @@ If you want to select from multiple FROM tables, use multiple arguments:
582
607
 
583
608
  DB[:albums, :artists] # SELECT * FROM albums, artists
584
609
 
585
- If you don't want to select from any FROM tables, just call dataset:
610
+ If you don't want to select from any FROM tables, just call +dataset+:
586
611
 
587
612
  DB.dataset # SELECT *
588
613
 
@@ -616,7 +641,7 @@ In general, the +insert+, +update+, and +delete+ methods use the appropriate cla
616
641
  ds.update(:name=>'RF') # UPDATE albums SET name = 'RF' WHERE (id = 1)
617
642
  ds.delete # DELETE FROM albums WHERE (id = 1)
618
643
 
619
- Note how +update+ and +delete+ used the +where+ argument, but that +insert+ did not, because INSERT doesn't use a WHERE clause.
644
+ Note how +update+ and +delete+ used the +where+ argument, but +insert+ did not, because INSERT doesn't use a WHERE clause.
620
645
 
621
646
  === Methods Used for Each SQL Clause
622
647