sequel 4.26.0 → 5.37.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (692) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +405 -5656
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +232 -157
  5. data/bin/sequel +32 -9
  6. data/doc/advanced_associations.rdoc +252 -188
  7. data/doc/association_basics.rdoc +231 -273
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +75 -48
  10. data/doc/code_order.rdoc +28 -10
  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/mass_assignment.rdoc +74 -31
  16. data/doc/migration.rdoc +72 -46
  17. data/doc/model_dataset_method_design.rdoc +129 -0
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +12 -12
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +59 -69
  22. data/doc/opening_databases.rdoc +84 -94
  23. data/doc/postgresql.rdoc +268 -38
  24. data/doc/prepared_statements.rdoc +29 -24
  25. data/doc/querying.rdoc +184 -164
  26. data/doc/reflection.rdoc +5 -6
  27. data/doc/release_notes/5.0.0.txt +159 -0
  28. data/doc/release_notes/5.1.0.txt +31 -0
  29. data/doc/release_notes/5.10.0.txt +84 -0
  30. data/doc/release_notes/5.11.0.txt +83 -0
  31. data/doc/release_notes/5.12.0.txt +141 -0
  32. data/doc/release_notes/5.13.0.txt +27 -0
  33. data/doc/release_notes/5.14.0.txt +63 -0
  34. data/doc/release_notes/5.15.0.txt +39 -0
  35. data/doc/release_notes/5.16.0.txt +110 -0
  36. data/doc/release_notes/5.17.0.txt +31 -0
  37. data/doc/release_notes/5.18.0.txt +69 -0
  38. data/doc/release_notes/5.19.0.txt +28 -0
  39. data/doc/release_notes/5.2.0.txt +33 -0
  40. data/doc/release_notes/5.20.0.txt +89 -0
  41. data/doc/release_notes/5.21.0.txt +87 -0
  42. data/doc/release_notes/5.22.0.txt +48 -0
  43. data/doc/release_notes/5.23.0.txt +56 -0
  44. data/doc/release_notes/5.24.0.txt +56 -0
  45. data/doc/release_notes/5.25.0.txt +32 -0
  46. data/doc/release_notes/5.26.0.txt +35 -0
  47. data/doc/release_notes/5.27.0.txt +21 -0
  48. data/doc/release_notes/5.28.0.txt +16 -0
  49. data/doc/release_notes/5.29.0.txt +22 -0
  50. data/doc/release_notes/5.3.0.txt +121 -0
  51. data/doc/release_notes/5.30.0.txt +20 -0
  52. data/doc/release_notes/5.31.0.txt +148 -0
  53. data/doc/release_notes/5.32.0.txt +46 -0
  54. data/doc/release_notes/5.33.0.txt +24 -0
  55. data/doc/release_notes/5.34.0.txt +40 -0
  56. data/doc/release_notes/5.35.0.txt +56 -0
  57. data/doc/release_notes/5.36.0.txt +60 -0
  58. data/doc/release_notes/5.37.0.txt +30 -0
  59. data/doc/release_notes/5.4.0.txt +80 -0
  60. data/doc/release_notes/5.5.0.txt +61 -0
  61. data/doc/release_notes/5.6.0.txt +31 -0
  62. data/doc/release_notes/5.7.0.txt +108 -0
  63. data/doc/release_notes/5.8.0.txt +170 -0
  64. data/doc/release_notes/5.9.0.txt +99 -0
  65. data/doc/schema_modification.rdoc +102 -77
  66. data/doc/security.rdoc +160 -87
  67. data/doc/sharding.rdoc +74 -47
  68. data/doc/sql.rdoc +135 -122
  69. data/doc/testing.rdoc +34 -18
  70. data/doc/thread_safety.rdoc +2 -4
  71. data/doc/transactions.rdoc +101 -19
  72. data/doc/validations.rdoc +64 -51
  73. data/doc/virtual_rows.rdoc +90 -109
  74. data/lib/sequel.rb +3 -1
  75. data/lib/sequel/adapters/ado.rb +154 -22
  76. data/lib/sequel/adapters/ado/access.rb +21 -21
  77. data/lib/sequel/adapters/ado/mssql.rb +8 -15
  78. data/lib/sequel/adapters/amalgalite.rb +17 -25
  79. data/lib/sequel/adapters/ibmdb.rb +52 -58
  80. data/lib/sequel/adapters/jdbc.rb +149 -127
  81. data/lib/sequel/adapters/jdbc/db2.rb +32 -40
  82. data/lib/sequel/adapters/jdbc/derby.rb +56 -58
  83. data/lib/sequel/adapters/jdbc/h2.rb +40 -30
  84. data/lib/sequel/adapters/jdbc/hsqldb.rb +22 -33
  85. data/lib/sequel/adapters/jdbc/jtds.rb +4 -10
  86. data/lib/sequel/adapters/jdbc/mssql.rb +6 -12
  87. data/lib/sequel/adapters/jdbc/mysql.rb +17 -18
  88. data/lib/sequel/adapters/jdbc/oracle.rb +25 -19
  89. data/lib/sequel/adapters/jdbc/postgresql.rb +90 -69
  90. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +14 -24
  91. data/lib/sequel/adapters/jdbc/sqlite.rb +50 -12
  92. data/lib/sequel/adapters/jdbc/sqlserver.rb +36 -9
  93. data/lib/sequel/adapters/jdbc/transactions.rb +25 -39
  94. data/lib/sequel/adapters/mock.rb +104 -113
  95. data/lib/sequel/adapters/mysql.rb +42 -61
  96. data/lib/sequel/adapters/mysql2.rb +126 -35
  97. data/lib/sequel/adapters/odbc.rb +21 -28
  98. data/lib/sequel/adapters/odbc/db2.rb +3 -1
  99. data/lib/sequel/adapters/odbc/mssql.rb +11 -15
  100. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  101. data/lib/sequel/adapters/oracle.rb +62 -68
  102. data/lib/sequel/adapters/postgres.rb +257 -311
  103. data/lib/sequel/adapters/postgresql.rb +3 -1
  104. data/lib/sequel/adapters/shared/access.rb +75 -79
  105. data/lib/sequel/adapters/shared/db2.rb +96 -74
  106. data/lib/sequel/adapters/shared/mssql.rb +258 -213
  107. data/lib/sequel/adapters/shared/mysql.rb +284 -216
  108. data/lib/sequel/adapters/shared/oracle.rb +175 -60
  109. data/lib/sequel/adapters/shared/postgres.rb +829 -383
  110. data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -127
  111. data/lib/sequel/adapters/shared/sqlite.rb +382 -159
  112. data/lib/sequel/adapters/sqlanywhere.rb +53 -38
  113. data/lib/sequel/adapters/sqlite.rb +111 -105
  114. data/lib/sequel/adapters/tinytds.rb +38 -46
  115. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -9
  116. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +7 -5
  117. data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
  118. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
  119. data/lib/sequel/adapters/utils/replace.rb +3 -4
  120. data/lib/sequel/adapters/utils/split_alter_table.rb +2 -0
  121. data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
  122. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
  123. data/lib/sequel/ast_transformer.rb +13 -89
  124. data/lib/sequel/connection_pool.rb +54 -26
  125. data/lib/sequel/connection_pool/sharded_single.rb +19 -12
  126. data/lib/sequel/connection_pool/sharded_threaded.rb +160 -111
  127. data/lib/sequel/connection_pool/single.rb +21 -12
  128. data/lib/sequel/connection_pool/threaded.rb +137 -119
  129. data/lib/sequel/core.rb +352 -320
  130. data/lib/sequel/database.rb +19 -2
  131. data/lib/sequel/database/connecting.rb +70 -55
  132. data/lib/sequel/database/dataset.rb +15 -5
  133. data/lib/sequel/database/dataset_defaults.rb +20 -102
  134. data/lib/sequel/database/features.rb +20 -4
  135. data/lib/sequel/database/logging.rb +25 -7
  136. data/lib/sequel/database/misc.rb +132 -118
  137. data/lib/sequel/database/query.rb +51 -28
  138. data/lib/sequel/database/schema_generator.rb +188 -75
  139. data/lib/sequel/database/schema_methods.rb +161 -92
  140. data/lib/sequel/database/transactions.rb +260 -58
  141. data/lib/sequel/dataset.rb +28 -12
  142. data/lib/sequel/dataset/actions.rb +354 -170
  143. data/lib/sequel/dataset/dataset_module.rb +46 -0
  144. data/lib/sequel/dataset/features.rb +81 -34
  145. data/lib/sequel/dataset/graph.rb +82 -58
  146. data/lib/sequel/dataset/misc.rb +139 -47
  147. data/lib/sequel/dataset/placeholder_literalizer.rb +66 -26
  148. data/lib/sequel/dataset/prepared_statements.rb +188 -85
  149. data/lib/sequel/dataset/query.rb +428 -214
  150. data/lib/sequel/dataset/sql.rb +446 -339
  151. data/lib/sequel/deprecated.rb +14 -2
  152. data/lib/sequel/exceptions.rb +48 -16
  153. data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
  154. data/lib/sequel/extensions/_model_pg_row.rb +43 -0
  155. data/lib/sequel/extensions/_pretty_table.rb +10 -9
  156. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  157. data/lib/sequel/extensions/arbitrary_servers.rb +15 -11
  158. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  159. data/lib/sequel/extensions/blank.rb +2 -0
  160. data/lib/sequel/extensions/caller_logging.rb +79 -0
  161. data/lib/sequel/extensions/columns_introspection.rb +9 -4
  162. data/lib/sequel/extensions/connection_expiration.rb +99 -0
  163. data/lib/sequel/extensions/connection_validator.rb +26 -13
  164. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  165. data/lib/sequel/extensions/constraint_validations.rb +93 -38
  166. data/lib/sequel/extensions/core_extensions.rb +45 -53
  167. data/lib/sequel/extensions/core_refinements.rb +44 -46
  168. data/lib/sequel/extensions/current_datetime_timestamp.rb +5 -4
  169. data/lib/sequel/extensions/dataset_source_alias.rb +4 -0
  170. data/lib/sequel/extensions/date_arithmetic.rb +42 -16
  171. data/lib/sequel/extensions/datetime_parse_to_time.rb +37 -0
  172. data/lib/sequel/extensions/duplicate_columns_handler.rb +94 -0
  173. data/lib/sequel/extensions/empty_array_consider_nulls.rb +7 -3
  174. data/lib/sequel/extensions/error_sql.rb +7 -3
  175. data/lib/sequel/extensions/escaped_like.rb +100 -0
  176. data/lib/sequel/extensions/eval_inspect.rb +14 -15
  177. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  178. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  179. data/lib/sequel/extensions/freeze_datasets.rb +3 -0
  180. data/lib/sequel/extensions/from_block.rb +2 -31
  181. data/lib/sequel/extensions/graph_each.rb +19 -6
  182. data/lib/sequel/extensions/identifier_mangling.rb +180 -0
  183. data/lib/sequel/extensions/implicit_subquery.rb +48 -0
  184. data/lib/sequel/extensions/index_caching.rb +109 -0
  185. data/lib/sequel/extensions/inflector.rb +8 -4
  186. data/lib/sequel/extensions/integer64.rb +32 -0
  187. data/lib/sequel/extensions/looser_typecasting.rb +19 -9
  188. data/lib/sequel/extensions/migration.rb +132 -80
  189. data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +4 -0
  190. data/lib/sequel/extensions/named_timezones.rb +88 -23
  191. data/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
  192. data/lib/sequel/extensions/null_dataset.rb +12 -8
  193. data/lib/sequel/extensions/pagination.rb +35 -28
  194. data/lib/sequel/extensions/pg_array.rb +227 -316
  195. data/lib/sequel/extensions/pg_array_ops.rb +19 -7
  196. data/lib/sequel/extensions/pg_enum.rb +69 -24
  197. data/lib/sequel/extensions/pg_extended_date_support.rb +250 -0
  198. data/lib/sequel/extensions/pg_hstore.rb +50 -59
  199. data/lib/sequel/extensions/pg_hstore_ops.rb +9 -3
  200. data/lib/sequel/extensions/pg_inet.rb +34 -15
  201. data/lib/sequel/extensions/pg_inet_ops.rb +5 -1
  202. data/lib/sequel/extensions/pg_interval.rb +26 -26
  203. data/lib/sequel/extensions/pg_json.rb +422 -141
  204. data/lib/sequel/extensions/pg_json_ops.rb +248 -9
  205. data/lib/sequel/extensions/pg_loose_count.rb +5 -1
  206. data/lib/sequel/extensions/pg_range.rb +162 -146
  207. data/lib/sequel/extensions/pg_range_ops.rb +10 -5
  208. data/lib/sequel/extensions/pg_row.rb +53 -87
  209. data/lib/sequel/extensions/pg_row_ops.rb +36 -13
  210. data/lib/sequel/extensions/pg_static_cache_updater.rb +6 -2
  211. data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
  212. data/lib/sequel/extensions/pretty_table.rb +4 -0
  213. data/lib/sequel/extensions/query.rb +12 -7
  214. data/lib/sequel/extensions/round_timestamps.rb +6 -9
  215. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  216. data/lib/sequel/extensions/s.rb +59 -0
  217. data/lib/sequel/extensions/schema_caching.rb +14 -1
  218. data/lib/sequel/extensions/schema_dumper.rb +83 -55
  219. data/lib/sequel/extensions/select_remove.rb +8 -4
  220. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
  221. data/lib/sequel/extensions/server_block.rb +50 -17
  222. data/lib/sequel/extensions/server_logging.rb +61 -0
  223. data/lib/sequel/extensions/split_array_nil.rb +8 -4
  224. data/lib/sequel/extensions/sql_comments.rb +96 -0
  225. data/lib/sequel/extensions/sql_expr.rb +4 -1
  226. data/lib/sequel/extensions/string_agg.rb +181 -0
  227. data/lib/sequel/extensions/string_date_time.rb +2 -0
  228. data/lib/sequel/extensions/symbol_aref.rb +53 -0
  229. data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
  230. data/lib/sequel/extensions/symbol_as.rb +23 -0
  231. data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
  232. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  233. data/lib/sequel/extensions/thread_local_timezones.rb +4 -0
  234. data/lib/sequel/extensions/to_dot.rb +15 -5
  235. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  236. data/lib/sequel/model.rb +36 -126
  237. data/lib/sequel/model/associations.rb +850 -257
  238. data/lib/sequel/model/base.rb +652 -764
  239. data/lib/sequel/model/dataset_module.rb +13 -10
  240. data/lib/sequel/model/default_inflections.rb +3 -1
  241. data/lib/sequel/model/errors.rb +3 -3
  242. data/lib/sequel/model/exceptions.rb +12 -12
  243. data/lib/sequel/model/inflections.rb +8 -19
  244. data/lib/sequel/model/plugins.rb +111 -0
  245. data/lib/sequel/plugins/accessed_columns.rb +2 -0
  246. data/lib/sequel/plugins/active_model.rb +32 -7
  247. data/lib/sequel/plugins/after_initialize.rb +3 -1
  248. data/lib/sequel/plugins/association_dependencies.rb +27 -18
  249. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  250. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  251. data/lib/sequel/plugins/association_pks.rb +181 -83
  252. data/lib/sequel/plugins/association_proxies.rb +33 -9
  253. data/lib/sequel/plugins/auto_validations.rb +58 -23
  254. data/lib/sequel/plugins/before_after_save.rb +8 -0
  255. data/lib/sequel/plugins/blacklist_security.rb +23 -12
  256. data/lib/sequel/plugins/boolean_readers.rb +9 -6
  257. data/lib/sequel/plugins/boolean_subsets.rb +64 -0
  258. data/lib/sequel/plugins/caching.rb +27 -16
  259. data/lib/sequel/plugins/class_table_inheritance.rb +192 -94
  260. data/lib/sequel/plugins/column_conflicts.rb +18 -3
  261. data/lib/sequel/plugins/column_select.rb +9 -5
  262. data/lib/sequel/plugins/columns_updated.rb +42 -0
  263. data/lib/sequel/plugins/composition.rb +36 -24
  264. data/lib/sequel/plugins/constraint_validations.rb +37 -16
  265. data/lib/sequel/plugins/csv_serializer.rb +58 -35
  266. data/lib/sequel/plugins/dataset_associations.rb +60 -18
  267. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  268. data/lib/sequel/plugins/defaults_setter.rb +74 -13
  269. data/lib/sequel/plugins/delay_add_association.rb +4 -1
  270. data/lib/sequel/plugins/dirty.rb +65 -24
  271. data/lib/sequel/plugins/eager_each.rb +27 -3
  272. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  273. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  274. data/lib/sequel/plugins/error_splitter.rb +19 -12
  275. data/lib/sequel/plugins/finder.rb +246 -0
  276. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  277. data/lib/sequel/plugins/force_encoding.rb +9 -12
  278. data/lib/sequel/plugins/hook_class_methods.rb +39 -54
  279. data/lib/sequel/plugins/input_transformer.rb +20 -10
  280. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  281. data/lib/sequel/plugins/insert_returning_select.rb +4 -2
  282. data/lib/sequel/plugins/instance_filters.rb +12 -8
  283. data/lib/sequel/plugins/instance_hooks.rb +36 -17
  284. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  285. data/lib/sequel/plugins/inverted_subsets.rb +24 -13
  286. data/lib/sequel/plugins/json_serializer.rb +123 -47
  287. data/lib/sequel/plugins/lazy_attributes.rb +20 -14
  288. data/lib/sequel/plugins/list.rb +40 -26
  289. data/lib/sequel/plugins/many_through_many.rb +28 -12
  290. data/lib/sequel/plugins/modification_detection.rb +17 -5
  291. data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -5
  292. data/lib/sequel/plugins/nested_attributes.rb +55 -28
  293. data/lib/sequel/plugins/optimistic_locking.rb +5 -3
  294. data/lib/sequel/plugins/pg_array_associations.rb +52 -18
  295. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +348 -0
  296. data/lib/sequel/plugins/pg_row.rb +7 -51
  297. data/lib/sequel/plugins/prepared_statements.rb +53 -72
  298. data/lib/sequel/plugins/prepared_statements_safe.rb +13 -5
  299. data/lib/sequel/plugins/rcte_tree.rb +43 -63
  300. data/lib/sequel/plugins/serialization.rb +37 -44
  301. data/lib/sequel/plugins/serialization_modification_detection.rb +3 -1
  302. data/lib/sequel/plugins/sharding.rb +17 -10
  303. data/lib/sequel/plugins/single_table_inheritance.rb +62 -28
  304. data/lib/sequel/plugins/singular_table_names.rb +2 -0
  305. data/lib/sequel/plugins/skip_create_refresh.rb +5 -3
  306. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  307. data/lib/sequel/plugins/split_values.rb +13 -6
  308. data/lib/sequel/plugins/static_cache.rb +79 -53
  309. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  310. data/lib/sequel/plugins/string_stripper.rb +5 -3
  311. data/lib/sequel/plugins/subclasses.rb +20 -2
  312. data/lib/sequel/plugins/subset_conditions.rb +48 -0
  313. data/lib/sequel/plugins/table_select.rb +4 -2
  314. data/lib/sequel/plugins/tactical_eager_loading.rb +120 -6
  315. data/lib/sequel/plugins/throw_failures.rb +110 -0
  316. data/lib/sequel/plugins/timestamps.rb +22 -8
  317. data/lib/sequel/plugins/touch.rb +21 -8
  318. data/lib/sequel/plugins/tree.rb +57 -30
  319. data/lib/sequel/plugins/typecast_on_load.rb +14 -4
  320. data/lib/sequel/plugins/unlimited_update.rb +3 -7
  321. data/lib/sequel/plugins/update_or_create.rb +6 -4
  322. data/lib/sequel/plugins/update_primary_key.rb +3 -1
  323. data/lib/sequel/plugins/update_refresh.rb +28 -15
  324. data/lib/sequel/plugins/uuid.rb +70 -0
  325. data/lib/sequel/plugins/validate_associated.rb +20 -0
  326. data/lib/sequel/plugins/validation_class_methods.rb +40 -19
  327. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  328. data/lib/sequel/plugins/validation_helpers.rb +49 -31
  329. data/lib/sequel/plugins/whitelist_security.rb +122 -0
  330. data/lib/sequel/plugins/xml_serializer.rb +31 -30
  331. data/lib/sequel/sql.rb +479 -329
  332. data/lib/sequel/timezones.rb +62 -32
  333. data/lib/sequel/version.rb +10 -3
  334. metadata +177 -477
  335. data/Rakefile +0 -165
  336. data/doc/active_record.rdoc +0 -912
  337. data/doc/release_notes/1.0.txt +0 -38
  338. data/doc/release_notes/1.1.txt +0 -143
  339. data/doc/release_notes/1.3.txt +0 -101
  340. data/doc/release_notes/1.4.0.txt +0 -53
  341. data/doc/release_notes/1.5.0.txt +0 -155
  342. data/doc/release_notes/2.0.0.txt +0 -298
  343. data/doc/release_notes/2.1.0.txt +0 -271
  344. data/doc/release_notes/2.10.0.txt +0 -328
  345. data/doc/release_notes/2.11.0.txt +0 -215
  346. data/doc/release_notes/2.12.0.txt +0 -534
  347. data/doc/release_notes/2.2.0.txt +0 -253
  348. data/doc/release_notes/2.3.0.txt +0 -88
  349. data/doc/release_notes/2.4.0.txt +0 -106
  350. data/doc/release_notes/2.5.0.txt +0 -137
  351. data/doc/release_notes/2.6.0.txt +0 -157
  352. data/doc/release_notes/2.7.0.txt +0 -166
  353. data/doc/release_notes/2.8.0.txt +0 -171
  354. data/doc/release_notes/2.9.0.txt +0 -97
  355. data/doc/release_notes/3.0.0.txt +0 -221
  356. data/doc/release_notes/3.1.0.txt +0 -406
  357. data/doc/release_notes/3.10.0.txt +0 -286
  358. data/doc/release_notes/3.11.0.txt +0 -254
  359. data/doc/release_notes/3.12.0.txt +0 -304
  360. data/doc/release_notes/3.13.0.txt +0 -210
  361. data/doc/release_notes/3.14.0.txt +0 -118
  362. data/doc/release_notes/3.15.0.txt +0 -78
  363. data/doc/release_notes/3.16.0.txt +0 -45
  364. data/doc/release_notes/3.17.0.txt +0 -58
  365. data/doc/release_notes/3.18.0.txt +0 -120
  366. data/doc/release_notes/3.19.0.txt +0 -67
  367. data/doc/release_notes/3.2.0.txt +0 -268
  368. data/doc/release_notes/3.20.0.txt +0 -41
  369. data/doc/release_notes/3.21.0.txt +0 -87
  370. data/doc/release_notes/3.22.0.txt +0 -39
  371. data/doc/release_notes/3.23.0.txt +0 -172
  372. data/doc/release_notes/3.24.0.txt +0 -420
  373. data/doc/release_notes/3.25.0.txt +0 -88
  374. data/doc/release_notes/3.26.0.txt +0 -88
  375. data/doc/release_notes/3.27.0.txt +0 -82
  376. data/doc/release_notes/3.28.0.txt +0 -304
  377. data/doc/release_notes/3.29.0.txt +0 -459
  378. data/doc/release_notes/3.3.0.txt +0 -192
  379. data/doc/release_notes/3.30.0.txt +0 -135
  380. data/doc/release_notes/3.31.0.txt +0 -146
  381. data/doc/release_notes/3.32.0.txt +0 -202
  382. data/doc/release_notes/3.33.0.txt +0 -157
  383. data/doc/release_notes/3.34.0.txt +0 -671
  384. data/doc/release_notes/3.35.0.txt +0 -144
  385. data/doc/release_notes/3.36.0.txt +0 -245
  386. data/doc/release_notes/3.37.0.txt +0 -338
  387. data/doc/release_notes/3.38.0.txt +0 -234
  388. data/doc/release_notes/3.39.0.txt +0 -237
  389. data/doc/release_notes/3.4.0.txt +0 -325
  390. data/doc/release_notes/3.40.0.txt +0 -73
  391. data/doc/release_notes/3.41.0.txt +0 -155
  392. data/doc/release_notes/3.42.0.txt +0 -74
  393. data/doc/release_notes/3.43.0.txt +0 -105
  394. data/doc/release_notes/3.44.0.txt +0 -152
  395. data/doc/release_notes/3.45.0.txt +0 -179
  396. data/doc/release_notes/3.46.0.txt +0 -122
  397. data/doc/release_notes/3.47.0.txt +0 -270
  398. data/doc/release_notes/3.48.0.txt +0 -477
  399. data/doc/release_notes/3.5.0.txt +0 -510
  400. data/doc/release_notes/3.6.0.txt +0 -366
  401. data/doc/release_notes/3.7.0.txt +0 -179
  402. data/doc/release_notes/3.8.0.txt +0 -151
  403. data/doc/release_notes/3.9.0.txt +0 -233
  404. data/doc/release_notes/4.0.0.txt +0 -262
  405. data/doc/release_notes/4.1.0.txt +0 -85
  406. data/doc/release_notes/4.10.0.txt +0 -226
  407. data/doc/release_notes/4.11.0.txt +0 -147
  408. data/doc/release_notes/4.12.0.txt +0 -105
  409. data/doc/release_notes/4.13.0.txt +0 -169
  410. data/doc/release_notes/4.14.0.txt +0 -68
  411. data/doc/release_notes/4.15.0.txt +0 -56
  412. data/doc/release_notes/4.16.0.txt +0 -36
  413. data/doc/release_notes/4.17.0.txt +0 -38
  414. data/doc/release_notes/4.18.0.txt +0 -36
  415. data/doc/release_notes/4.19.0.txt +0 -45
  416. data/doc/release_notes/4.2.0.txt +0 -129
  417. data/doc/release_notes/4.20.0.txt +0 -79
  418. data/doc/release_notes/4.21.0.txt +0 -94
  419. data/doc/release_notes/4.22.0.txt +0 -72
  420. data/doc/release_notes/4.23.0.txt +0 -65
  421. data/doc/release_notes/4.24.0.txt +0 -99
  422. data/doc/release_notes/4.25.0.txt +0 -181
  423. data/doc/release_notes/4.26.0.txt +0 -44
  424. data/doc/release_notes/4.3.0.txt +0 -40
  425. data/doc/release_notes/4.4.0.txt +0 -92
  426. data/doc/release_notes/4.5.0.txt +0 -34
  427. data/doc/release_notes/4.6.0.txt +0 -30
  428. data/doc/release_notes/4.7.0.txt +0 -103
  429. data/doc/release_notes/4.8.0.txt +0 -175
  430. data/doc/release_notes/4.9.0.txt +0 -190
  431. data/lib/sequel/adapters/cubrid.rb +0 -142
  432. data/lib/sequel/adapters/do.rb +0 -156
  433. data/lib/sequel/adapters/do/mysql.rb +0 -64
  434. data/lib/sequel/adapters/do/postgres.rb +0 -42
  435. data/lib/sequel/adapters/do/sqlite3.rb +0 -40
  436. data/lib/sequel/adapters/jdbc/as400.rb +0 -82
  437. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -62
  438. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -34
  439. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -31
  440. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -31
  441. data/lib/sequel/adapters/odbc/progress.rb +0 -8
  442. data/lib/sequel/adapters/shared/cubrid.rb +0 -243
  443. data/lib/sequel/adapters/shared/firebird.rb +0 -245
  444. data/lib/sequel/adapters/shared/informix.rb +0 -52
  445. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -150
  446. data/lib/sequel/adapters/shared/progress.rb +0 -38
  447. data/lib/sequel/adapters/swift.rb +0 -158
  448. data/lib/sequel/adapters/swift/mysql.rb +0 -47
  449. data/lib/sequel/adapters/swift/postgres.rb +0 -45
  450. data/lib/sequel/adapters/swift/sqlite.rb +0 -47
  451. data/lib/sequel/adapters/utils/pg_types.rb +0 -68
  452. data/lib/sequel/dataset/mutation.rb +0 -109
  453. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -3
  454. data/lib/sequel/extensions/filter_having.rb +0 -59
  455. data/lib/sequel/extensions/hash_aliases.rb +0 -45
  456. data/lib/sequel/extensions/meta_def.rb +0 -31
  457. data/lib/sequel/extensions/query_literals.rb +0 -80
  458. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -22
  459. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -118
  460. data/lib/sequel/extensions/set_overrides.rb +0 -72
  461. data/lib/sequel/no_core_ext.rb +0 -1
  462. data/lib/sequel/plugins/association_autoreloading.rb +0 -7
  463. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -7
  464. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -78
  465. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -117
  466. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -59
  467. data/lib/sequel/plugins/schema.rb +0 -80
  468. data/lib/sequel/plugins/scissors.rb +0 -33
  469. data/spec/adapters/db2_spec.rb +0 -160
  470. data/spec/adapters/firebird_spec.rb +0 -411
  471. data/spec/adapters/informix_spec.rb +0 -100
  472. data/spec/adapters/mssql_spec.rb +0 -706
  473. data/spec/adapters/mysql_spec.rb +0 -1287
  474. data/spec/adapters/oracle_spec.rb +0 -313
  475. data/spec/adapters/postgres_spec.rb +0 -3725
  476. data/spec/adapters/spec_helper.rb +0 -43
  477. data/spec/adapters/sqlanywhere_spec.rb +0 -170
  478. data/spec/adapters/sqlite_spec.rb +0 -653
  479. data/spec/bin_spec.rb +0 -254
  480. data/spec/core/connection_pool_spec.rb +0 -1016
  481. data/spec/core/database_spec.rb +0 -2531
  482. data/spec/core/dataset_spec.rb +0 -5098
  483. data/spec/core/deprecated_spec.rb +0 -70
  484. data/spec/core/expression_filters_spec.rb +0 -1243
  485. data/spec/core/mock_adapter_spec.rb +0 -462
  486. data/spec/core/object_graph_spec.rb +0 -303
  487. data/spec/core/placeholder_literalizer_spec.rb +0 -163
  488. data/spec/core/schema_generator_spec.rb +0 -179
  489. data/spec/core/schema_spec.rb +0 -1659
  490. data/spec/core/spec_helper.rb +0 -34
  491. data/spec/core/version_spec.rb +0 -7
  492. data/spec/core_extensions_spec.rb +0 -699
  493. data/spec/extensions/accessed_columns_spec.rb +0 -51
  494. data/spec/extensions/active_model_spec.rb +0 -123
  495. data/spec/extensions/after_initialize_spec.rb +0 -24
  496. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  497. data/spec/extensions/association_dependencies_spec.rb +0 -117
  498. data/spec/extensions/association_pks_spec.rb +0 -365
  499. data/spec/extensions/association_proxies_spec.rb +0 -86
  500. data/spec/extensions/auto_validations_spec.rb +0 -192
  501. data/spec/extensions/blacklist_security_spec.rb +0 -88
  502. data/spec/extensions/blank_spec.rb +0 -69
  503. data/spec/extensions/boolean_readers_spec.rb +0 -93
  504. data/spec/extensions/caching_spec.rb +0 -270
  505. data/spec/extensions/class_table_inheritance_spec.rb +0 -420
  506. data/spec/extensions/column_conflicts_spec.rb +0 -60
  507. data/spec/extensions/column_select_spec.rb +0 -108
  508. data/spec/extensions/columns_introspection_spec.rb +0 -91
  509. data/spec/extensions/composition_spec.rb +0 -242
  510. data/spec/extensions/connection_validator_spec.rb +0 -120
  511. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -274
  512. data/spec/extensions/constraint_validations_spec.rb +0 -325
  513. data/spec/extensions/core_refinements_spec.rb +0 -519
  514. data/spec/extensions/csv_serializer_spec.rb +0 -173
  515. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  516. data/spec/extensions/dataset_associations_spec.rb +0 -311
  517. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  518. data/spec/extensions/date_arithmetic_spec.rb +0 -150
  519. data/spec/extensions/defaults_setter_spec.rb +0 -101
  520. data/spec/extensions/delay_add_association_spec.rb +0 -52
  521. data/spec/extensions/dirty_spec.rb +0 -180
  522. data/spec/extensions/eager_each_spec.rb +0 -42
  523. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  524. data/spec/extensions/error_splitter_spec.rb +0 -18
  525. data/spec/extensions/error_sql_spec.rb +0 -20
  526. data/spec/extensions/eval_inspect_spec.rb +0 -73
  527. data/spec/extensions/filter_having_spec.rb +0 -40
  528. data/spec/extensions/force_encoding_spec.rb +0 -114
  529. data/spec/extensions/from_block_spec.rb +0 -21
  530. data/spec/extensions/graph_each_spec.rb +0 -109
  531. data/spec/extensions/hash_aliases_spec.rb +0 -24
  532. data/spec/extensions/hook_class_methods_spec.rb +0 -429
  533. data/spec/extensions/inflector_spec.rb +0 -183
  534. data/spec/extensions/input_transformer_spec.rb +0 -54
  535. data/spec/extensions/insert_returning_select_spec.rb +0 -46
  536. data/spec/extensions/instance_filters_spec.rb +0 -79
  537. data/spec/extensions/instance_hooks_spec.rb +0 -276
  538. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  539. data/spec/extensions/json_serializer_spec.rb +0 -291
  540. data/spec/extensions/lazy_attributes_spec.rb +0 -170
  541. data/spec/extensions/list_spec.rb +0 -267
  542. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  543. data/spec/extensions/many_through_many_spec.rb +0 -2172
  544. data/spec/extensions/meta_def_spec.rb +0 -21
  545. data/spec/extensions/migration_spec.rb +0 -712
  546. data/spec/extensions/modification_detection_spec.rb +0 -80
  547. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
  548. data/spec/extensions/named_timezones_spec.rb +0 -108
  549. data/spec/extensions/nested_attributes_spec.rb +0 -697
  550. data/spec/extensions/null_dataset_spec.rb +0 -85
  551. data/spec/extensions/optimistic_locking_spec.rb +0 -128
  552. data/spec/extensions/pagination_spec.rb +0 -118
  553. data/spec/extensions/pg_array_associations_spec.rb +0 -736
  554. data/spec/extensions/pg_array_ops_spec.rb +0 -143
  555. data/spec/extensions/pg_array_spec.rb +0 -395
  556. data/spec/extensions/pg_enum_spec.rb +0 -92
  557. data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
  558. data/spec/extensions/pg_hstore_spec.rb +0 -206
  559. data/spec/extensions/pg_inet_ops_spec.rb +0 -101
  560. data/spec/extensions/pg_inet_spec.rb +0 -52
  561. data/spec/extensions/pg_interval_spec.rb +0 -76
  562. data/spec/extensions/pg_json_ops_spec.rb +0 -229
  563. data/spec/extensions/pg_json_spec.rb +0 -218
  564. data/spec/extensions/pg_loose_count_spec.rb +0 -17
  565. data/spec/extensions/pg_range_ops_spec.rb +0 -58
  566. data/spec/extensions/pg_range_spec.rb +0 -404
  567. data/spec/extensions/pg_row_ops_spec.rb +0 -60
  568. data/spec/extensions/pg_row_plugin_spec.rb +0 -62
  569. data/spec/extensions/pg_row_spec.rb +0 -360
  570. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
  571. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
  572. data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
  573. data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
  574. data/spec/extensions/prepared_statements_spec.rb +0 -103
  575. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
  576. data/spec/extensions/pretty_table_spec.rb +0 -92
  577. data/spec/extensions/query_literals_spec.rb +0 -183
  578. data/spec/extensions/query_spec.rb +0 -102
  579. data/spec/extensions/rcte_tree_spec.rb +0 -392
  580. data/spec/extensions/round_timestamps_spec.rb +0 -43
  581. data/spec/extensions/schema_caching_spec.rb +0 -41
  582. data/spec/extensions/schema_dumper_spec.rb +0 -789
  583. data/spec/extensions/schema_spec.rb +0 -117
  584. data/spec/extensions/scissors_spec.rb +0 -26
  585. data/spec/extensions/select_remove_spec.rb +0 -38
  586. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
  587. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  588. data/spec/extensions/serialization_spec.rb +0 -362
  589. data/spec/extensions/server_block_spec.rb +0 -90
  590. data/spec/extensions/set_overrides_spec.rb +0 -61
  591. data/spec/extensions/sharding_spec.rb +0 -198
  592. data/spec/extensions/shared_caching_spec.rb +0 -175
  593. data/spec/extensions/single_table_inheritance_spec.rb +0 -297
  594. data/spec/extensions/singular_table_names_spec.rb +0 -22
  595. data/spec/extensions/skip_create_refresh_spec.rb +0 -17
  596. data/spec/extensions/spec_helper.rb +0 -71
  597. data/spec/extensions/split_array_nil_spec.rb +0 -24
  598. data/spec/extensions/split_values_spec.rb +0 -22
  599. data/spec/extensions/sql_expr_spec.rb +0 -60
  600. data/spec/extensions/static_cache_spec.rb +0 -361
  601. data/spec/extensions/string_date_time_spec.rb +0 -95
  602. data/spec/extensions/string_stripper_spec.rb +0 -68
  603. data/spec/extensions/subclasses_spec.rb +0 -66
  604. data/spec/extensions/table_select_spec.rb +0 -71
  605. data/spec/extensions/tactical_eager_loading_spec.rb +0 -82
  606. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  607. data/spec/extensions/timestamps_spec.rb +0 -175
  608. data/spec/extensions/to_dot_spec.rb +0 -154
  609. data/spec/extensions/touch_spec.rb +0 -203
  610. data/spec/extensions/tree_spec.rb +0 -274
  611. data/spec/extensions/typecast_on_load_spec.rb +0 -80
  612. data/spec/extensions/unlimited_update_spec.rb +0 -20
  613. data/spec/extensions/update_or_create_spec.rb +0 -87
  614. data/spec/extensions/update_primary_key_spec.rb +0 -100
  615. data/spec/extensions/update_refresh_spec.rb +0 -53
  616. data/spec/extensions/validate_associated_spec.rb +0 -52
  617. data/spec/extensions/validation_class_methods_spec.rb +0 -1027
  618. data/spec/extensions/validation_helpers_spec.rb +0 -541
  619. data/spec/extensions/xml_serializer_spec.rb +0 -207
  620. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  621. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  622. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  623. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  624. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  625. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  626. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  627. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  628. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  629. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  630. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  631. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  632. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  633. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  634. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  635. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  636. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  637. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  638. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  639. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  640. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  641. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  642. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  643. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  644. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  645. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  646. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  647. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  648. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  649. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  650. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  651. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  652. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  653. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  654. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  655. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  656. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  657. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  658. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  659. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  660. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  661. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  662. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  663. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  664. data/spec/guards_helper.rb +0 -55
  665. data/spec/integration/associations_test.rb +0 -2454
  666. data/spec/integration/database_test.rb +0 -113
  667. data/spec/integration/dataset_test.rb +0 -1808
  668. data/spec/integration/eager_loader_test.rb +0 -687
  669. data/spec/integration/migrator_test.rb +0 -240
  670. data/spec/integration/model_test.rb +0 -226
  671. data/spec/integration/plugin_test.rb +0 -2240
  672. data/spec/integration/prepared_statement_test.rb +0 -467
  673. data/spec/integration/schema_test.rb +0 -817
  674. data/spec/integration/spec_helper.rb +0 -48
  675. data/spec/integration/timezone_test.rb +0 -86
  676. data/spec/integration/transaction_test.rb +0 -374
  677. data/spec/integration/type_test.rb +0 -133
  678. data/spec/model/association_reflection_spec.rb +0 -525
  679. data/spec/model/associations_spec.rb +0 -4426
  680. data/spec/model/base_spec.rb +0 -759
  681. data/spec/model/class_dataset_methods_spec.rb +0 -146
  682. data/spec/model/dataset_methods_spec.rb +0 -149
  683. data/spec/model/eager_loading_spec.rb +0 -2137
  684. data/spec/model/hooks_spec.rb +0 -604
  685. data/spec/model/inflector_spec.rb +0 -26
  686. data/spec/model/model_spec.rb +0 -982
  687. data/spec/model/plugins_spec.rb +0 -299
  688. data/spec/model/record_spec.rb +0 -2147
  689. data/spec/model/spec_helper.rb +0 -46
  690. data/spec/model/validations_spec.rb +0 -193
  691. data/spec/sequel_coverage.rb +0 -15
  692. data/spec/spec_config.rb +0 -10
@@ -1,7 +1,7 @@
1
- = Read-Only Slaves/Writable Master and Database Sharding
1
+ = Primary/Replica Configurations and Database Sharding
2
2
 
3
- Sequel has support for read only slave databases
4
- with a writable master database, as well as database sharding (where you can
3
+ Sequel has support for primary/replica configurations (writable primary
4
+ database with read only replicas databases), as well as database sharding (where you can
5
5
  pick a server to use for a given dataset). Support for both
6
6
  features is database independent, and should work for all database adapters
7
7
  that ship with Sequel.
@@ -13,7 +13,7 @@ option. Using the :servers database option makes Sequel use a connection pool
13
13
  class that supports sharding, and the minimum required to enable sharding
14
14
  support is to use the empty hash:
15
15
 
16
- DB=Sequel.connect('postgres://master_server/database', :servers=>{})
16
+ DB=Sequel.connect('postgres://primary_server/database', servers: {})
17
17
 
18
18
  In most cases, you are probably not going to want to use an empty hash. Keys in the server hash are
19
19
  not restricted to type, but the general recommendation is to use a symbol
@@ -28,69 +28,69 @@ a :host entry in each shard's hash.
28
28
  Note that all servers should have the same schema for all
29
29
  tables you are accessing, unless you really know what you are doing.
30
30
 
31
- == Master and Slave Database Configurations
31
+ == Primary and Replica Database Configurations
32
32
 
33
- === Single Read-Only Slave, Single Master
33
+ === Single Primary, Single Replica
34
34
 
35
- To use a single, read-only slave that handles SELECT queries, the following
35
+ To use a single, read-only replica that handles SELECT queries, the following
36
36
  is the simplest configuration:
37
37
 
38
- DB=Sequel.connect('postgres://master_server/database', \
39
- :servers=>{:read_only=>{:host=>'slave_server'}})
38
+ DB=Sequel.connect('postgres://primary_server/database',
39
+ servers: {read_only: {host: 'replica_server'}})
40
40
 
41
- This will use the slave_server for SELECT queries and master_server for
41
+ This will use the replica_server for SELECT queries and primary_server for
42
42
  other queries.
43
43
 
44
44
  If you want to ensure your queries are going to a specific database, you
45
45
  can force this for a given query by using the .server method and passing
46
46
  the symbol name defined in the connect options. For example:
47
47
 
48
- # Force the SELECT to run on the master
48
+ # Force the SELECT to run on the primary server
49
49
  DB[:users].server(:default).all
50
50
 
51
- # Force the SELECT to run on the read-only slave
52
- DB[:users].server(:read_only).all
51
+ # Force the DELETE to run on the read-only replica
52
+ DB[:users].server(:read_only).delete
53
53
 
54
- === Multiple Read-Only Slaves, Single Master
54
+ === Single Primary, Multiple Replicas
55
55
 
56
- Let's say you have 4 slave database servers with names slave_server0,
57
- slave_server1, slave_server2, and slave_server3.
56
+ Let's say you have 4 replica servers with names replica_server0,
57
+ replica_server1, replica_server2, and replica_server3.
58
58
 
59
59
  num_read_only = 4
60
60
  read_only_host = rand(num_read_only)
61
61
  read_only_proc = proc do |db|
62
- {:host=>"slave_server#{(read_only_host+=1) % num_read_only}"}
62
+ {host: "replica_server#{(read_only_host+=1) % num_read_only}"}
63
63
  end
64
- DB=Sequel.connect('postgres://master_server/database', \
65
- :servers=>{:read_only=>read_only_proc})
64
+ DB=Sequel.connect('postgres://primary_server/database',
65
+ servers: {read_only: read_only_proc})
66
66
 
67
- This will use one of the slave servers for SELECT queries and use the
68
- master_server for other queries. It's also possible to pick a random host
67
+ This will use one of the replica servers for SELECT queries and use the
68
+ primary server for other queries. It's also possible to pick a random host
69
69
  instead of using the round robin approach presented above, but that can result
70
70
  in less optimal resource usage.
71
71
 
72
- === Multiple Read-Only Slaves, Multiple Masters
72
+ === Multiple Primary, Multiple Replicas
73
73
 
74
- This involves the same basic idea as the multiple slaves, single master, but
75
- it shows that the master database is named :default. So for 4 masters and
76
- 4 slaves:
74
+ This involves the same basic idea as the multiple replicas, single primary, but
75
+ it shows that the primary database is named :default. So for 4 primary servers and
76
+ 4 replica servers:
77
77
 
78
78
  num_read_only = 4
79
79
  read_only_host = rand(num_read_only)
80
80
  read_only_proc = proc do |db|
81
- {:host=>"slave_server#{(read_only_host+=1) % num_read_only}"}
81
+ {host: "replica_server#{(read_only_host+=1) % num_read_only}"}
82
82
  end
83
83
  num_default = 4
84
84
  default_host = rand(num_default)
85
85
  default_proc = proc do |db|
86
- {:host=>"master_server#{(default_host+=1) % num_default}"}
86
+ {host: "primary_server#{(default_host+=1) % num_default}"}
87
87
  end
88
- DB=Sequel.connect('postgres://master_server/database', \
89
- :servers=>{:default=>default_proc, :read_only=>read_only_proc})
88
+ DB=Sequel.connect('postgres://primary_server/database',
89
+ servers: {default: default_proc, read_only: read_only_proc})
90
90
 
91
91
  == Sharding
92
92
 
93
- There is specific support in Sequel for handling master/slave database
93
+ There is specific support in Sequel for handling primary/replica database
94
94
  combinations, with the only necessary setup being the database configuration.
95
95
  However, since sharding is always going to be implementation dependent, Sequel
96
96
  supplies the basic infrastructure, but you have to tell it which server to use
@@ -100,16 +100,16 @@ of 16 shards). First, you need to configure the database:
100
100
 
101
101
  servers = {}
102
102
  (('0'..'9').to_a + ('a'..'f').to_a).each do |hex|
103
- servers[hex.to_sym] = {:host=>"hash_host_#{hex}"}
103
+ servers[hex.to_sym] = {host: "hash_host_#{hex}"}
104
104
  end
105
- DB=Sequel.connect('postgres://hash_host/hashes', :servers=>servers)
105
+ DB=Sequel.connect('postgres://hash_host/hashes', servers: servers)
106
106
 
107
107
  This configures 17 servers, the 16 shard servers (/hash_host_[0-9a-f]/), and 1
108
108
  default server which will be used if no shard is specified ("hash_host"). If
109
109
  you want the default server to be one of the shard servers (e.g. hash_host_a),
110
110
  it's easiest to do:
111
111
 
112
- DB=Sequel.connect('postgres://hash_host_a/hashes', :servers=>servers)
112
+ DB=Sequel.connect('postgres://hash_host_a/hashes', servers: servers)
113
113
 
114
114
  That will still set up a second pool of connections for the default server,
115
115
  since it considers the default server and shard servers independent. Note that
@@ -120,7 +120,7 @@ schemas, so you should always have a default server that works.
120
120
 
121
121
  To set the shard for a given query, you use the Dataset#server method:
122
122
 
123
- DB[:hashes].server(:a).where(:hash=>/31337/)
123
+ DB[:hashes].server(:a).where(hash: /31337/)
124
124
 
125
125
  That will return all matching rows on the hash_host_a shard that have a hash
126
126
  column that contains 31337.
@@ -133,37 +133,39 @@ the shard to use. This is fairly easy using a Sequel::Model:
133
133
  dataset_module do
134
134
  def plaintext_for_hash(hash)
135
135
  raise(ArgumentError, 'Invalid SHA-1 Hash') unless /\A[0-9a-f]{40}\z/.match(hash)
136
- server(hash[0...1].to_sym).where(:hash=>hash).get(:plaintext)
136
+ server(hash[0...1].to_sym).where(hash: hash).get(:plaintext)
137
137
  end
138
138
  end
139
139
  end
140
140
 
141
141
  Rainbow.plaintext_for_hash("e580726d31f6e1ad216ffd87279e536d1f74e606")
142
142
 
143
+ === :servers_hash Option
144
+
143
145
  The connection pool can be further controlled to change how it handles attempts
144
146
  to access shards that haven't been configured. The default is
145
147
  to assume the :default shard. However, you can specify a
146
148
  different shard using the :servers_hash option when connecting
147
149
  to the database:
148
150
 
149
- DB = Sequel.connect('postgres://...', :servers_hash=>Hash.new(:some_shard))
151
+ DB = Sequel.connect('postgres://...', servers_hash: Hash.new(:some_shard))
150
152
 
151
153
  You can also use this feature to raise an exception if an
152
154
  unconfigured shard is used:
153
155
 
154
- DB = Sequel.connect('postgres://...', :servers_hash=>Hash.new{raise 'foo'})
156
+ DB = Sequel.connect('postgres://...', servers_hash: Hash.new{raise 'foo'})
155
157
 
156
158
  If you specify a :servers_hash option to raise an exception for non configured
157
159
  shards you should also explicitly specify a :read_only entry in your :servers option
158
160
  for the case where a shard is not specified. In most cases it is sufficient
159
161
  to make the :read_only entry the same as the :default shard:
160
162
 
161
- servers = {:read_only => {}}
163
+ servers = {read_only: {}}
162
164
  (('0'..'9').to_a + ('a'..'f').to_a).each do |hex|
163
- servers[hex.to_sym] = {:host=>"hash_host_#{hex}"}
165
+ servers[hex.to_sym] = {host: "hash_host_#{hex}"}
164
166
  end
165
- DB=Sequel.connect('postgres://hash_host/hashes', :servers=>servers,
166
- :servers_hash=>Hash.new{raise Exception.new("Invalid Server")})
167
+ DB=Sequel.connect('postgres://hash_host/hashes', servers: servers,
168
+ servers_hash: Hash.new{raise "Invalid Server"})
167
169
 
168
170
  === Sharding Plugin
169
171
 
@@ -176,7 +178,7 @@ work well with shards. You just need to remember to set to model to use the plu
176
178
  plugin :sharding
177
179
  end
178
180
 
179
- Rainbow.server(:a).first(:id=>1).update(:plaintext=>'VGM')
181
+ Rainbow.server(:a).first(id: 1).update(plaintext: 'VGM')
180
182
 
181
183
  If all of your models are sharded, you can set all models to use the plugin via:
182
184
 
@@ -186,7 +188,7 @@ If all of your models are sharded, you can set all models to use the plugin via:
186
188
 
187
189
  By default, you must specify the server/shard you want to use for every dataset/action,
188
190
  or Sequel will use the default shard. If you have a group of queries that should use the
189
- same shard, it can get a bit redundent to specify the same shard for all of them.
191
+ same shard, it can get a bit redundant to specify the same shard for all of them.
190
192
 
191
193
  The server_block extension adds a Database#with_server method that scopes all database
192
194
  access inside the block to the given shard by default:
@@ -194,7 +196,7 @@ access inside the block to the given shard by default:
194
196
  DB.extension :server_block
195
197
  DB.with_server(:a) do
196
198
  # this SELECT query uses the "a" shard
197
- if r = Rainbow.first(:hash=>/31337/)
199
+ if r = Rainbow.first(hash: /31337/)
198
200
  r.count += 1
199
201
  # this UPDATE query also uses the "a" shard
200
202
  r.save
@@ -209,6 +211,19 @@ you retrieve the models inside the block and save them outside of the block. If
209
211
  need to do that, call the server method explicitly on the dataset used to retrieve the
210
212
  model objects.
211
213
 
214
+ The with_server method also supports a second argument for the default read_only server
215
+ to use, which can be useful if you are mixing sharding and primary/replica servers:
216
+
217
+ DB.extension :server_block
218
+ DB.with_server(:a, :a_read_only) do
219
+ # this SELECT query uses the "a_read_only" shard
220
+ if r = Rainbow.first(hash: /31337/)
221
+ r.count += 1
222
+ # this UPDATE query also uses the "a" shard
223
+ r.save
224
+ end
225
+ end
226
+
212
227
  === arbitrary_servers Extension
213
228
 
214
229
  By default, Sequel's sharding support is designed to work with predefined shards. It ships
@@ -220,13 +235,13 @@ The arbitrary_servers extension allows you to pass a server/shard options hash a
220
235
  server to use, and those options will be merged directly into the database's default options:
221
236
 
222
237
  DB.extension :arbitrary_servers
223
- DB[:rainbows].server(:host=>'hash_host_a').all
238
+ DB[:rainbows].server(host: 'hash_host_a').all
224
239
  # or
225
- DB[:rainbows].server(:host=>'hash_host_b', :database=>'backup').all
240
+ DB[:rainbows].server(host: 'hash_host_b', database: 'backup').all
226
241
 
227
242
  arbitrary_servers is designed to work well in conjunction with the server_block extension:
228
243
 
229
- DB.with_server(:host=>'hash_host_b', :database=>'backup') do
244
+ DB.with_server(host: 'hash_host_b', database: 'backup') do
230
245
  DB.synchronize do
231
246
  # All queries here default to the backup database on hash_host_b
232
247
  end
@@ -255,3 +270,15 @@ the Database, just remove that option. If you are setting:
255
270
  Sequel.single_threaded = true
256
271
 
257
272
  just remove or comment out that code.
273
+
274
+ == JDBC
275
+
276
+ If you are using the jdbc adapter, note that it does not handle separate
277
+ options such as +:host+, +:user+, and +:port+. If you would like to use
278
+ the +:servers+ option when connecting to a JDBC database, each hash value in
279
+ the +servers+ option should contain a +:uri+ key with a JDBC connection string
280
+ for that shard as the value. Example:
281
+
282
+ DB=Sequel.connect('jdbc:postgresql://primary_server/database',
283
+ servers: {read_only: {uri: 'jdbc:postgresql://replica_server/database'}})
284
+
@@ -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:
169
-
170
- :column___alias # "column" AS "alias"
171
-
172
- You can combine this with implicit qualification:
171
+ You can use the <tt>Sequel.as</tt> method to create an alias, and the +as+ method on most Sequel-specific expression objects:
173
172
 
174
- :table__column___alias # "table"."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"
175
177
 
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:
178
+ You can also use the symbol_as extension for creating aliased identifiers:
177
179
 
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,39 @@ 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))
418
430
 
419
431
  You've already seen the <tt>Sequel.negate</tt> method, which will use ANDs if multiple entries are used:
420
432
 
421
- Sequel.negate(:column1=>1, :column2=>2) # (("column1" != 1) AND ("column2" != 2))
433
+ Sequel.negate(column1: 1, column2: 2) # (("column1" != 1) AND ("column2" != 2))
422
434
 
423
435
  To negate while using ORs, the <tt>Sequel.~</tt> operator can be used:
424
436
 
425
- Sequel.~(:column1=>1, :column2=>2) # (("column1" != 1) OR ("column2" != 2))
437
+ Sequel.~(column1: 1, column2: 2) # (("column1" != 1) OR ("column2" != 2))
426
438
 
427
439
  Note again that <tt>Dataset#exclude</tt> uses ~, not +negate+:
428
440
 
429
- DB[:albums].exclude(:column1=>1, :column2=>2) # SELECT * FROM "albums" WHERE (("column" != 1) OR ("column2" != 2))
441
+ DB[:albums].exclude(column1: 1, column2: 2) # SELECT * FROM "albums" WHERE (("column" != 1) OR ("column2" != 2))
430
442
 
431
443
  === Casts
432
444
 
433
445
  Casting in Sequel is done with the +cast+ method, which is available on most of the Sequel-specific expression objects:
434
446
 
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)
447
+ Sequel[:name].cast(:text) # CAST("name" AS text)
448
+ Sequel['1'].cast(:integer) # CAST('1' AS integer)
449
+ Sequel[:table][:column].cast(:date) # CAST("table"."column" AS date)
438
450
 
439
451
  You can also use the <tt>Sequel.cast</tt> method:
440
452
 
@@ -444,72 +456,72 @@ You can also use the <tt>Sequel.cast</tt> method:
444
456
 
445
457
  Sequel allows the use of bitwise mathematical operators on Sequel::SQL::NumericExpression objects:
446
458
 
447
- Sequel.expr(:number) + 1 # => #<Sequel::SQL::NumericExpression ...>
448
- (Sequel.expr(:number) + 1) & 5 # (("number" + 1) & 5)
459
+ Sequel[:number] + 1 # => #<Sequel::SQL::NumericExpression ...>
460
+ (Sequel[:number] + 1) & 5 # (("number" + 1) & 5)
449
461
 
450
462
  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
463
 
452
- Sequel.expr(:number).sql_number | 5 # ("number" | 5)
464
+ Sequel[:number].sql_number | 5 # ("number" | 5)
453
465
  Sequel.function(:func).sql_number << 7 # (func() << 7)
454
466
  Sequel.cast(:name, :integer).sql_number >> 8 # (CAST("name" AS integer) >> 8)
455
467
 
456
468
  Sequel allows you to do the cast and conversion at the same time via +cast_numeric+:
457
469
 
458
- Sequel.expr(:name).cast_numeric ^ 9 # (CAST("name" AS integer) ^ 9)
470
+ Sequel[:name].cast_numeric ^ 9 # (CAST("name" AS integer) ^ 9)
459
471
 
460
472
  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
473
 
462
- ~Sequel.expr(:name) # NOT "name"
463
- ~Sequel.expr(:name).sql_number # ~"name"
474
+ ~Sequel[:name] # NOT "name"
475
+ ~Sequel[:name].sql_number # ~"name"
464
476
 
465
477
  === String Operators (||, LIKE, Regexp)
466
478
 
467
479
  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
480
 
469
- Sequel.expr(:name).sql_string + ' - Name' # ("name" || ' - Name')
481
+ Sequel[:name].sql_string + ' - Name' # ("name" || ' - Name')
470
482
 
471
- Just like for the bitwise operators, Sequel allows you do do the cast and conversion at the same time via +cast_string+:
483
+ Just like for the bitwise operators, Sequel allows you to do the cast and conversion at the same time via +cast_string+:
472
484
 
473
- Sequel.expr(:number).cast_string + ' - Number' # (CAST(number AS varchar(255)) || ' - Number')
485
+ Sequel[:number].cast_string + ' - Number' # (CAST(number AS varchar(255)) || ' - Number')
474
486
 
475
487
  Note that similar to the mathematical operators, you cannot switch the order the expression and have it work:
476
488
 
477
- 'Name - ' + Sequel.expr(:name).sql_string # raises TypeError
489
+ 'Name - ' + Sequel[:name].sql_string # raises TypeError
478
490
 
479
- Just like for the mathematical operators, you can use <tt>Sequel.expr</tt> to wrap the object:
491
+ Just like for the mathematical operators, you can use <tt>Sequel.[]</tt> to wrap the object:
480
492
 
481
- Sequel.expr('Name - ') + :name # ('Name - ' || "name")
493
+ Sequel['Name - '] + :name # ('Name - ' || "name")
482
494
 
483
495
  The <tt>Sequel.join</tt> method concatenates all of the elements in the array:
484
496
 
485
497
  Sequel.join(['Name', :name]) # ('Name' || "name")
486
498
 
487
- Just like ruby's <tt>String#join</tt>, you can provide an argument for a string used to join each element:
499
+ Just like Ruby's <tt>String#join</tt>, you can provide an argument for a string used to join each element:
488
500
 
489
501
  Sequel.join(['Name', :name], ' - ') # ('Name' || ' - ' || "name")
490
502
 
491
503
  For the LIKE operator, Sequel defines the +like+ and +ilike+ methods on most Sequel-specific expression objects:
492
504
 
493
- Sequel.expr(:name).like('A%') # ("name" LIKE 'A%' ESCAPE '\')
494
- Sequel.expr(:name).ilike('A%') # ("name" ILIKE 'A%' ESCAPE '\')
505
+ Sequel[:name].like('A%') # ("name" LIKE 'A%' ESCAPE '\')
506
+ Sequel[:name].ilike('A%') # ("name" ILIKE 'A%' ESCAPE '\')
495
507
 
496
508
  You can also use the <tt>Sequel.like</tt> and <tt>Sequel.ilike</tt> methods:
497
509
 
498
510
  Sequel.like(:name, 'A%') # ("name" LIKE 'A%' ESCAPE '\')
499
511
  Sequel.ilike(:name, 'A%') # ("name" ILIKE 'A%' ESCAPE '\')
500
512
 
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.
513
+ 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
514
 
503
515
  Inverting the LIKE operator works like other inversions:
504
516
 
505
517
  ~Sequel.like(:name, 'A%') # ("name" NOT LIKE 'A%' ESCAPE '\')
506
518
 
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:
519
+ 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:
508
520
 
509
521
  Sequel.like(:name, /^A/) # ("name" ~ '^A')
510
522
  ~Sequel.ilike(:name, /^A/) # ("name" !~* '^A')
511
- {:name=>/^A/i} # ("name" ~* '^A')
512
- Sequel.~(:name=>/^A/) # ("name" !~ '^A')
523
+ {name: /^A/i} # ("name" ~* '^A')
524
+ Sequel.~(name: /^A/) # ("name" !~ '^A')
513
525
 
514
526
  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
527
 
@@ -517,36 +529,37 @@ Note that using +ilike+ with a regular expression will always make the regexp ca
517
529
 
518
530
  Sequel supports specifying ascending or descending order using the +asc+ and +desc+ method on most Sequel-specific expression objects:
519
531
 
520
- Sequel.expr(:column).asc # "column" ASC
521
- Sequel.expr(:column).qualify(:table).desc # "table"."column" DESC
532
+ Sequel[:column].asc # "column" ASC
533
+ Sequel[:table][:column].desc # "table"."column" DESC
522
534
 
523
535
  You can also use the <tt>Sequel.asc</tt> and <tt>Sequel.desc</tt> methods:
524
536
 
525
537
  Sequel.asc(:column) # "column" ASC
526
- Sequel.desc(Sequel.expr(:column).qualify(:table)) # "table"."column" DESC
538
+ Sequel.desc(Sequel[:table][:column]) # "table"."column" DESC
527
539
 
528
540
  On some databases, you can specify null ordering:
529
541
 
530
542
  Sequel.asc(:column, :nulls=>:first) # "column" ASC NULLS FIRST
531
- Sequel.desc(Sequel.expr(:column).qualify(:table), :nulls=>:last) # "table"."column" DESC NULLS LAST
543
+ Sequel.desc(Sequel[:table][:column], :nulls=>:last) # "table"."column" DESC NULLS LAST
532
544
 
533
545
  === All Columns (.*)
534
546
 
535
- To select all columns in a table, Sequel supports the * method on identifiers without an argument:
547
+ To select all columns in a table, Sequel supports the * method on identifiers and qualified without an argument:
536
548
 
537
- Sequel.expr(:table).* # "table".*
549
+ Sequel[:table].* # "table".*
550
+ Sequel[:schema][:table].* # "schema"."table".*
538
551
 
539
552
  === CASE statements
540
553
 
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:
554
+ 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
555
 
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)
556
+ Sequel.case({column: 1}, 0) # (CASE WHEN "column" THEN 1 ELSE 0 END)
557
+ Sequel.case([[:column, 1]], 0) # (CASE WHEN "column" THEN 1 ELSE 0 END)
558
+ Sequel.case({{column: nil}=>1}, 0) # (CASE WHEN (column IS NULL) THEN 1 ELSE 0 END)
546
559
 
547
560
  If the hash or array has multiple arguments, multiple WHEN clauses are used:
548
561
 
549
- Sequel.case({:c=>1, :d=>2}, 0) # (CASE WHEN "c" THEN 1 WHEN "d" THEN 2 ELSE 0 END)
562
+ Sequel.case({c: 1, d: 2}, 0) # (CASE WHEN "c" THEN 1 WHEN "d" THEN 2 ELSE 0 END)
550
563
  Sequel.case([[:c, 1], [:d, 2]], 0) # (CASE WHEN "c" THEN 1 WHEN "d" THEN 2 ELSE 0 END)
551
564
 
552
565
  If you provide a 3rd argument to <tt>Sequel.case</tt>, it goes between CASE and WHEN:
@@ -557,8 +570,8 @@ If you provide a 3rd argument to <tt>Sequel.case</tt>, it goes between CASE and
557
570
 
558
571
  Sequel supports SQL subscripts using the +sql_subscript+ method on most Sequel-specific expression objects:
559
572
 
560
- Sequel.expr(:column).sql_subscript(3) # column[3]
561
- Sequel.expr(:column).qualify(:table).sql_subscript(3) # table.column[3]
573
+ Sequel[:column].sql_subscript(3) # column[3]
574
+ Sequel[:table][:column].sql_subscript(3) # table.column[3]
562
575
 
563
576
  You can also use the <tt>Sequel.subscript</tt> method:
564
577
 
@@ -574,7 +587,7 @@ In Sequel, the SQL queries are build with method chaining.
574
587
 
575
588
  === Creating Datasets
576
589
 
577
- You generally start by creating a dataset by calling <tt>Dataset#[]</tt> with a symbol specifying the table name:
590
+ You generally start creating a dataset by calling <tt>Dataset#[]</tt> with a symbol specifying the table name:
578
591
 
579
592
  DB[:albums] # SELECT * FROM albums
580
593
 
@@ -582,7 +595,7 @@ If you want to select from multiple FROM tables, use multiple arguments:
582
595
 
583
596
  DB[:albums, :artists] # SELECT * FROM albums, artists
584
597
 
585
- If you don't want to select from any FROM tables, just call dataset:
598
+ If you don't want to select from any FROM tables, just call +dataset+:
586
599
 
587
600
  DB.dataset # SELECT *
588
601
 
@@ -616,7 +629,7 @@ In general, the +insert+, +update+, and +delete+ methods use the appropriate cla
616
629
  ds.update(:name=>'RF') # UPDATE albums SET name = 'RF' WHERE (id = 1)
617
630
  ds.delete # DELETE FROM albums WHERE (id = 1)
618
631
 
619
- Note how +update+ and +delete+ used the +where+ argument, but that +insert+ did not, because INSERT doesn't use a WHERE clause.
632
+ Note how +update+ and +delete+ used the +where+ argument, but +insert+ did not, because INSERT doesn't use a WHERE clause.
620
633
 
621
634
  === Methods Used for Each SQL Clause
622
635