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/postgresql.rdoc CHANGED
@@ -19,10 +19,10 @@ rarely used PostgreSQL features that Sequel supports which are not mentioned her
19
19
 
20
20
  Some of this this support depends on the specific adapter or underlying driver in use.
21
21
  <tt>postgres only</tt> will denote support specific to the postgres adapter (i.e.
22
- not available when connecting to PostgreSQL via the jdbc, do, or swift adapters).
22
+ not available when connecting to PostgreSQL via the jdbc adapter).
23
23
  <tt>postgres/pg only</tt> will denote support specific to the postgres adapter when
24
- pg is used as the underlying driver (i.e. not available when using the postgres-pr or
25
- postgres drivers).
24
+ pg is used as the underlying driver (i.e. not available when using the postgres-pr
25
+ driver).
26
26
 
27
27
  == PostgreSQL-specific Database Type Support
28
28
 
@@ -44,7 +44,7 @@ pg_range :: ranges (for any scalar type), as a ruby Range-like object
44
44
  pg_row :: row-valued/composite types, as a ruby Hash-like or Sequel::Model object
45
45
 
46
46
  In general, these extensions just add support for Database objects to return retrieved
47
- column values as the appropriate type (<tt>postgres and jdbc/postgres only</tt>), and support for literalizing
47
+ column values as the appropriate type and support for literalizing
48
48
  the objects correctly for use in an SQL string, or using them as bound variable values (<tt>postgres/pg and jdbc/postgres only</tt>).
49
49
 
50
50
  There are also type-specific extensions that make it easy to use database functions
@@ -56,6 +56,21 @@ pg_json_ops :: json-related functions and operators
56
56
  pg_range_ops :: range-related functions and operators
57
57
  pg_row_ops :: row-valued/composite type syntax support
58
58
 
59
+ These extensions aren't Database specific, they are global extensions, so you should
60
+ load them via <tt>Sequel.extension</tt>, after loading support for the specific types
61
+ into the Database instance:
62
+
63
+ DB.extension :pg_array
64
+ Sequel.extension :pg_array_ops
65
+
66
+ With regard to common database types, please note that the generic String type
67
+ is +text+ on PostgreSQL and not <tt>varchar(255)</tt> as it is on some other
68
+ databases. +text+ is PostgreSQL's recommended type for storage of text data,
69
+ and is more similar to Ruby's String type as it allows for unlimited length.
70
+ If you want to set a maximum size for a text column, you must specify a
71
+ <tt>:size</tt> option. This will use a <tt>varchar($size)</tt> type and
72
+ impose a maximum size for the column.
73
+
59
74
  == PostgreSQL-specific DDL Support
60
75
 
61
76
  === Exclusion Constraints
@@ -64,7 +79,7 @@ In +create_table+ blocks, you can use the +exclude+ method to set up exclusion c
64
79
 
65
80
  DB.create_table(:table) do
66
81
  daterange :during
67
- exclude([[:during, '&&']], :name=>:table_during_excl)
82
+ exclude([[:during, '&&']], name: :table_during_excl)
68
83
  end
69
84
  # CREATE TABLE "table" ("during" daterange,
70
85
  # CONSTRAINT "table_during_excl" EXCLUDE USING gist ("during" WITH &&))
@@ -72,20 +87,20 @@ In +create_table+ blocks, you can use the +exclude+ method to set up exclusion c
72
87
  You can also add exclusion constraints in +alter_table+ blocks using add_exclusion_constraint:
73
88
 
74
89
  DB.alter_table(:table) do
75
- add_exclusion_constraint([[:during, '&&']], :name=>:table_during_excl)
90
+ add_exclusion_constraint([[:during, '&&']], name: :table_during_excl)
76
91
  end
77
92
  # ALTER TABLE "table" ADD CONSTRAINT "table_during_excl" EXCLUDE USING gist ("during" WITH &&)
78
93
 
79
94
  === Adding Foreign Key and Check Constraints Without Initial Validation
80
95
 
81
- You can add a <tt>:not_valid=>true</tt> option when adding constraints to existing tables so
96
+ You can add a <tt>not_valid: true</tt> option when adding constraints to existing tables so
82
97
  that it doesn't check if all current rows are valid:
83
98
 
84
99
  DB.alter_table(:table) do
85
100
  # Assumes t_id column already exists
86
- add_foreign_key([:t_id], :table, :not_valid=>true, :name=>:table_fk)
101
+ add_foreign_key([:t_id], :table, not_valid: true, name: :table_fk)
87
102
 
88
- constraint({:name=>:col_123, :not_valid=>true}, :col=>[1,2,3])
103
+ constraint({name: :col_123, not_valid: true}, col: [1,2,3])
89
104
  end
90
105
  # ALTER TABLE "table" ADD CONSTRAINT "table_fk" FOREIGN KEY ("t_id") REFERENCES "table" NOT VALID
91
106
  # ALTER TABLE "table" ADD CONSTRAINT "col_123" CHECK (col IN (1, 2, 3)) NOT VALID
@@ -102,14 +117,14 @@ all existing rows have been fixed, you can validate the constraint:
102
117
 
103
118
  === Creating Indexes Concurrently
104
119
 
105
- You can create indexes concurrently using the <tt>:concurrently=>true</tt> option:
120
+ You can create indexes concurrently using the <tt>concurrently: true</tt> option:
106
121
 
107
- DB.add_index(:table, :t_id, :concurrently=>true)
122
+ DB.add_index(:table, :t_id, concurrently: true)
108
123
  # CREATE INDEX CONCURRENTLY "table_t_id_index" ON "table" ("t_id")
109
124
 
110
125
  Similarly, you can drop indexes concurrently as well:
111
126
 
112
- DB.drop_index(:table, :t_id, :concurrently=>true)
127
+ DB.drop_index(:table, :t_id, concurrently: true)
113
128
  # DROP INDEX CONCURRENTLY "table_t_id_index"
114
129
 
115
130
  === Specific Conversions When Altering Column Types
@@ -119,19 +134,105 @@ conversion via a USING clause, and Sequel supports this using the <tt>:using</tt
119
134
 
120
135
  DB.alter_table(:table) do
121
136
  # Assume unix_time column is stored as an integer, and you want to change it to timestamp
122
- set_column_type :unix_time, Time, :using=>(Sequel.cast('epoch', Time) + Sequel.cast('1 second', :interval) * :unix_time)
137
+ set_column_type :unix_time, Time, using: (Sequel.cast('epoch', Time) + Sequel.cast('1 second', :interval) * :unix_time)
123
138
  end
124
139
  # ALTER TABLE "table" ALTER COLUMN "unix_time" TYPE timestamp
125
140
  # USING (CAST('epoch' AS timestamp) + (CAST('1 second' AS interval) * "unix_time"))
126
141
 
142
+ === Creating Partitioned Tables
143
+
144
+ PostgreSQL allows marking tables as partitioned tables, and adding partitions to such tables. Sequel
145
+ offers support for this. You can create a partitioned table using the +:partition_by+ option and
146
+ +:partition_type+ options (the default partition type is range partitioning):
147
+
148
+ DB.create_table(:table1, partition_by: :column, partition_type: :range) do
149
+ Integer :id
150
+ Date :column
151
+ end
152
+
153
+ DB.create_table(:table2, partition_by: :column, partition_type: :list) do
154
+ Integer :id
155
+ String :column
156
+ end
157
+
158
+ DB.create_table(:table3, partition_by: :column, partition_type: :hash) do
159
+ Integer :id
160
+ Integer :column
161
+ end
162
+
163
+ To add partitions of other tables, you use the +:partition_of+ option. This option will use
164
+ a custom DSL specific to partitioning other tables. For range partitioning, you can use the
165
+ +from+ and +to+ methods to specify the inclusive beginning and exclusive ending of the
166
+ range of the partition. You can call the +minvalue+ and +maxvalue+ methods to get the minimum
167
+ and maximum values for the column(s) in the range, useful as arguments to +from+ and +to+:
168
+
169
+ DB.create_table(:table1a, partition_of: :table1) do
170
+ from minvalue
171
+ to 0
172
+ end
173
+ DB.create_table(:table1b, partition_of: :table1) do
174
+ from 0
175
+ to 100
176
+ end
177
+ DB.create_table(:table1c, partition_of: :table1) do
178
+ from 100
179
+ to maxvalue
180
+ end
181
+
182
+ For list partitioning, you use the +values_in+ method. You can also use the +default+ method
183
+ to mark a partition as the default partition:
184
+
185
+ DB.create_table(:table2a, partition_of: :table2) do
186
+ values_in 1, 2, 3
187
+ end
188
+ DB.create_table(:table2b, partition_of: :table2) do
189
+ values_in 4, 5, 6
190
+ end
191
+ DB.create_table(:table2c, partition_of: :table2) do
192
+ default
193
+ end
194
+
195
+ For hash partitioning, you use the +modulus+ and +remainder+ methods:
196
+
197
+ DB.create_table(:table3a, partition_of: :table3) do
198
+ modulus 3
199
+ remainder 0
200
+ end
201
+ DB.create_table(:table3b, partition_of: :table3) do
202
+ modulus 3
203
+ remainder 1
204
+ end
205
+ DB.create_table(:table3c, partition_of: :table3) do
206
+ modulus 3
207
+ remainder 2
208
+ end
209
+
210
+ There is currently no support for using custom column or table constraints in partitions of
211
+ other tables. Support may be added in the future.
212
+
127
213
  === Creating Unlogged Tables
128
214
 
129
215
  PostgreSQL allows users to create unlogged tables, which are faster but not crash safe. Sequel
130
- allows you do create an unlogged table by specifying the <tt>:unlogged=>true</tt> option to +create_table+:
216
+ allows you to create an unlogged table by specifying the <tt>unlogged: true</tt> option to +create_table+:
131
217
 
132
- DB.create_table(:table, :unlogged=>true){Integer :i}
218
+ DB.create_table(:table, unlogged: true){Integer :i}
133
219
  # CREATE UNLOGGED TABLE "table" ("i" integer)
134
220
 
221
+ === Creating Identity Columns
222
+
223
+ You can use the +:identity+ option when creating columns to mark them as identity columns.
224
+ Identity columns are tied to a sequence for the default value. You can still override the
225
+ default value for the column when inserting:
226
+
227
+ DB.create_table(:table){Integer :id, identity: true}
228
+ # CREATE TABLE "table" ("id" integer GENERATED BY DEFAULT AS IDENTITY)
229
+
230
+ If you want to disallow using a user provided value when inserting, you can mark the
231
+ identity column using <tt>identity: :always</tt>:
232
+
233
+ DB.create_table(:table){Integer :id, identity: :always}
234
+ # CREATE TABLE "table" ("id" integer GENERATED ALWAYS AS IDENTITY)
235
+
135
236
  === Creating/Dropping Schemas, Languages, Functions, and Triggers
136
237
 
137
238
  Sequel has built in support for creating and dropping PostgreSQL schemas, procedural languages, functions, and triggers:
@@ -146,7 +247,7 @@ Sequel has built in support for creating and dropping PostgreSQL schemas, proced
146
247
  DB.drop_language(:plperl)
147
248
  # DROP LANGUAGE plperl
148
249
 
149
- DB.create_function(:set_updated_at, <<-SQL, :language=>:plpgsql, :returns=>:trigger)
250
+ DB.create_function(:set_updated_at, <<-SQL, language: :plpgsql, returns: :trigger)
150
251
  BEGIN
151
252
  NEW.updated_at := CURRENT_TIMESTAMP;
152
253
  RETURN NEW;
@@ -160,11 +261,56 @@ Sequel has built in support for creating and dropping PostgreSQL schemas, proced
160
261
  DB.drop_function(:set_updated_at)
161
262
  # DROP FUNCTION set_updated_at()
162
263
 
163
- DB.create_trigger(:table, :trg_updated_at, :set_updated_at, :events=>:update, :each_row=>true, :when => {:new__updated_at => :old__updated_at})
264
+ DB.create_trigger(:table, :trg_updated_at, :set_updated_at, events: :update, each_row: true, when: {Sequel[:new][:updated_at] => Sequel[:old][:updated_at]})
164
265
  # CREATE TRIGGER trg_updated_at BEFORE UPDATE ON "table" FOR EACH ROW WHEN ("new"."updated_at" = "old"."updated_at") EXECUTE PROCEDURE set_updated_at()
165
266
  DB.drop_trigger(:table, :trg_updated_at)
166
267
  # DROP TRIGGER trg_updated_at ON "table"
167
268
 
269
+ However, you may want to consider just use <tt>Database#run</tt> with the necessary SQL code, at least for functions and triggers.
270
+
271
+ === Parsing Check Constraints
272
+
273
+ Sequel has support for parsing CHECK constraints on PostgreSQL using <tt>Sequel::Database#check_constraints</tt>:
274
+
275
+ DB.create_table(:foo) do
276
+ Integer :i
277
+ Integer :j
278
+ constraint(:ic, Sequel[:i] > 2)
279
+ constraint(:jc, Sequel[:j] > 2)
280
+ constraint(:ijc, Sequel[:i] - Sequel[:j] > 2)
281
+ end
282
+ DB.check_constraints(:foo)
283
+ # => {
284
+ # :ic=>{:definition=>"CHECK ((i > 2))", :columns=>[:i]},
285
+ # :jc=>{:definition=>"CHECK ((j > 2))", :columns=>[:j]},
286
+ # :ijc=>{:definition=>"CHECK (((i - j) > 2))", :columns=>[:i, :j]}
287
+ # }
288
+
289
+ === Parsing Foreign Key Constraints Referencing A Given Table
290
+
291
+ Sequel has support for parsing FOREIGN KEY constraints that reference a given table, using the +:reverse+
292
+ option to +foreign_key_list+:
293
+
294
+ DB.create_table!(:a) do
295
+ primary_key :id
296
+ Integer :i
297
+ Integer :j
298
+ foreign_key :a_id, :a, :foreign_key_constraint_name=>:a_a
299
+ unique [:i, :j]
300
+ end
301
+ DB.create_table!(:b) do
302
+ foreign_key :a_id, :a, :foreign_key_constraint_name=>:a_a
303
+ Integer :c
304
+ Integer :d
305
+ foreign_key [:c, :d], :a, :key=>[:j, :i], :name=>:a_c_d
306
+ end
307
+ DB.foreign_key_list(:a, :reverse=>true)
308
+ # => [
309
+ # {:name=>:a_a, :columns=>[:a_id], :key=>[:id], :on_update=>:no_action, :on_delete=>:no_action, :deferrable=>false, :table=>:a, :schema=>:public},
310
+ # {:name=>:a_a, :columns=>[:a_id], :key=>[:id], :on_update=>:no_action, :on_delete=>:no_action, :deferrable=>false, :table=>:b, :schema=>:public},
311
+ # {:name=>:a_c_d, :columns=>[:c, :d], :key=>[:j, :i], :on_update=>:no_action, :on_delete=>:no_action, :deferrable=>false, :table=>:b, :schema=>:public}
312
+ # ]
313
+
168
314
  == PostgreSQL-specific DML Support
169
315
 
170
316
  === Returning Rows From Insert, Update, and Delete Statements
@@ -178,12 +324,12 @@ Sequel supports the ability to return rows from insert, update, and delete state
178
324
  DB[:table].returning(:id).delete
179
325
  # DELETE FROM "table" RETURNING "id"
180
326
 
181
- DB[:table].returning(:id, Sequel.*(:id, :id).as(:idsq)).update(:id=>2)
327
+ DB[:table].returning(:id, Sequel.*(:id, :id).as(:idsq)).update(id: 2)
182
328
  # UPDATE "table" SET "id" = 2 RETURNING "id", ("id" * "id") AS "idsq"
183
329
 
184
330
  When returning is used, instead of returning the number of rows affected (for updated/delete)
185
331
  or the serial primary key value (for insert), it will return an array of hashes with the
186
- returned results.
332
+ returning results.
187
333
 
188
334
  === VALUES Support
189
335
 
@@ -203,27 +349,27 @@ Sequel offers support for the +VALUES+ statement using <tt>Database#values</tt>:
203
349
  Starting with PostgreSQL 9.5, you can do an upsert or ignore unique or exclusion constraint
204
350
  violations when inserting using <tt>Dataset#insert_conflict</tt>:
205
351
 
206
- DB[:table].insert_conflict.insert(:a=>1, :b=>2)
352
+ DB[:table].insert_conflict.insert(a: 1, b: 2)
207
353
  # INSERT INTO TABLE (a, b) VALUES (1, 2)
208
354
  # ON CONFLICT DO NOTHING
209
355
 
210
356
  For compatibility with Sequel's MySQL support, you can also use +insert_ignore+:
211
357
 
212
- DB[:table].insert_ignore.insert(:a=>1, :b=>2)
358
+ DB[:table].insert_ignore.insert(a: 1, b: 2)
213
359
  # INSERT INTO TABLE (a, b) VALUES (1, 2)
214
360
  # ON CONFLICT DO NOTHING
215
361
 
216
362
  You can pass a specific constraint name using +:constraint+, to only ignore a specific
217
363
  constraint violation:
218
364
 
219
- DB[:table].insert_conflict(:constraint=>:table_a_uidx).insert(:a=>1, :b=>2)
365
+ DB[:table].insert_conflict(constraint: :table_a_uidx).insert(a: 1, b: 2)
220
366
  # INSERT INTO TABLE (a, b) VALUES (1, 2)
221
367
  # ON CONFLICT ON CONSTRAINT table_a_uidx DO NOTHING
222
368
 
223
369
  If the unique or exclusion constraint covers the whole table (e.g. it isn't a partial unique
224
370
  index), then you can just specify the column using the +:target+ option:
225
371
 
226
- DB[:table].insert_conflict(:target=>:a).insert(:a=>1, :b=>2)
372
+ DB[:table].insert_conflict(target: :a).insert(a: 1, b: 2)
227
373
  # INSERT INTO TABLE (a, b) VALUES (1, 2)
228
374
  # ON CONFLICT (a) DO NOTHING
229
375
 
@@ -231,20 +377,49 @@ If you want to update the existing row instead of ignoring the constraint violat
231
377
  can pass an +:update+ option with a hash of values to update. You must pass either the
232
378
  +:target+ or +:constraint+ options when passing the +:update+ option:
233
379
 
234
- DB[:table].insert_conflict(:target=>:a, :update=>{:b=>:excluded__b}).insert(:a=>1, :b=>2)
380
+ DB[:table].insert_conflict(target: :a, update: {b: Sequel[:excluded][:b]}).insert(a: 1, b: 2)
235
381
  # INSERT INTO TABLE (a, b) VALUES (1, 2)
236
382
  # ON CONFLICT (a) DO UPDATE SET b = excluded.b
383
+
384
+ If you want to update existing rows but using the current value of the column, you can build
385
+ the desired calculation using <tt>Sequel[]</tt>
386
+
387
+ DB[:table]
388
+ .insert_conflict(
389
+ target: :a,
390
+ update: {b: Sequel[:excluded][:b] + Sequel[:table][:a]}
391
+ )
392
+ .import([:a, :b], [ [1, 2] ])
393
+ # INSERT INTO TABLE (a, b) VALUES (1, 2)
394
+ # ON CONFLICT (a) DO UPDATE SET b = (excluded.b + table.a)
237
395
 
238
396
  Additionally, if you only want to do the update in certain cases, you can specify an
239
397
  +:update_where+ option, which will be used as a filter. If the row doesn't match the
240
398
  conditions, the constraint violation will be ignored, but the row will not be updated:
241
399
 
242
- DB[:table].insert_conflict(:constraint=>:table_a_uidx,
243
- :update=>{:b=>:excluded__b}, :update_where=>{:table__status_id=>1}).insert(:a=>1, :b=>2)
400
+ DB[:table].insert_conflict(constraint::table_a_uidx,
401
+ update: {b: Sequel[:excluded][:b]},
402
+ update_where: {Sequel[:table][:status_id]=>1}).insert(a: 1, b: 2)
244
403
  # INSERT INTO TABLE (a, b) VALUES (1, 2)
245
404
  # ON CONFLICT ON CONSTRAINT table_a_uidx
246
405
  # DO UPDATE SET b = excluded.b WHERE (table.status_id = 1)
247
406
 
407
+ === INSERT OVERRIDING SYSTEM|USER VALUE Support
408
+
409
+ PostgreSQL 10+ supports identity columns, which are designed to replace the serial
410
+ columns previously used for autoincrementing primary keys. You can use
411
+ Dataset#overriding_system_value and Dataset#overriding_user_value to use this new
412
+ syntax:
413
+
414
+ DB.create_table(:table){primary_key :id}
415
+ # Ignore the given value for id, using the identity's sequence value.
416
+ DB[:table].overriding_user_value.insert(:id=>1)
417
+
418
+ DB.create_table(:table){primary_key :id, :identity=>:always}
419
+ # Force the use of the given value for id, because otherwise the insert will
420
+ # raise an error, since GENERATED ALWAYS was used when creating the column.
421
+ DB[:table].overriding_system_value.insert(:id=>1)
422
+
248
423
  === Distinct On Specific Columns
249
424
 
250
425
  Sequel allows passing columns to <tt>Dataset#distinct</tt>, which will make the dataset return
@@ -253,6 +428,28 @@ rows that are distinct on just those columns:
253
428
  DB[:table].distinct(:id).all
254
429
  # SELECT DISTINCT ON ("id") * FROM "table"
255
430
 
431
+ === JOIN USING table alias
432
+
433
+ Sequel allows passing an SQL::AliasedExpression to join table methods to use a USING
434
+ join with a table alias for the USING columns:
435
+
436
+ DB[:t1].join(:t2, Sequel.as([:c1, :c2], :alias))
437
+ # SELECT * FROM "t1" INNER JOIN "t2" USING ("c1", "c2") AS "alias"
438
+
439
+ === Calling PostgreSQL 11+ Procedures <tt>postgres only</tt>
440
+
441
+ PostgreSQL 11+ added support for procedures, which are different from the user defined
442
+ functions that PostgreSQL has historically supported. These procedures are
443
+ called via a special +CALL+ syntax, and Sequel supports them via
444
+ <tt>Database#call_procedure</tt>:
445
+
446
+ DB.call_procedure(:foo, 1, "bar")
447
+ # CALL foo(1, 'bar')
448
+
449
+ <tt>Database#call_procedure</tt> will return a hash of return values if
450
+ the procedure returns a result, or +nil+ if the procedure does not return
451
+ a result.
452
+
256
453
  === Using a Cursor to Process Large Datasets <tt>postgres only</tt>
257
454
 
258
455
  The postgres adapter offers a <tt>Dataset#use_cursor</tt> method to process large result sets
@@ -271,19 +468,19 @@ without keeping all rows in memory:
271
468
  This support is used by default when using <tt>Dataset#paged_each</tt>.
272
469
 
273
470
  Using cursors, it is possible to update individual rows of a large dataset
274
- easily using the <tt>:rows_per_fetch=>1</tt> option in conjunction with
471
+ easily using the <tt>rows_per_fetch: 1</tt> option in conjunction with
275
472
  <tt>Dataset#where_current_of</tt>. This is useful if the logic needed to
276
473
  update the rows exists in the application and not in the database:
277
474
 
278
- ds.use_cursor(:rows_per_fetch=>1).each do |row|
279
- ds.where_current_of.update(:col=>new_col_value(row))
475
+ ds.use_cursor(rows_per_fetch: 1).each do |row|
476
+ ds.where_current_of.update(col: new_col_value(row))
280
477
  end
281
478
 
282
479
  === Truncate Modifiers
283
480
 
284
481
  Sequel supports PostgreSQL-specific truncate options:
285
482
 
286
- DB[:table].truncate(:cascade => true, :only=>true, :restart=>true)
483
+ DB[:table].truncate(cascade: true, only: true, restart: true)
287
484
  # TRUNCATE TABLE ONLY "table" RESTART IDENTITY CASCADE
288
485
 
289
486
  === COPY Support <tt>postgres/pg and jdbc/postgres only</tt>
@@ -292,14 +489,14 @@ PostgreSQL's COPY feature is pretty much the fastest way to get data in or out o
292
489
  Sequel supports getting data out of the database via <tt>Database#copy_table</tt>, either for
293
490
  a specific table or for an arbitrary dataset:
294
491
 
295
- DB.copy_table(:table, :format=>:csv)
492
+ DB.copy_table(:table, format: :csv)
296
493
  # COPY "table" TO STDOUT (FORMAT csv)
297
- DB.copy_table(DB[:table], :format=>:csv)
494
+ DB.copy_table(DB[:table], format: :csv)
298
495
  # COPY (SELECT * FROM "table") TO STDOUT (FORMAT csv)
299
496
 
300
497
  It supports putting data into the database via <tt>Database#copy_into</tt>:
301
498
 
302
- DB.copy_into(:table, :format=>:csv, :columns=>[:column1, :column2], :data=>"1,2\n2,3\n")
499
+ DB.copy_into(:table, format: :csv, columns: [:column1, :column2], data: "1,2\n2,3\n")
303
500
  # COPY "table"("column1", "column2") FROM STDIN (FORMAT csv)
304
501
 
305
502
  === Anonymous Function Execution
@@ -336,7 +533,7 @@ this blocks until the listening thread is notified:
336
533
  Note that +listen+ by default only listens for a single notification. If you want to loop and process
337
534
  notifications:
338
535
 
339
- DB.listen(:channel, :loop=>true){|channel| p channel}
536
+ DB.listen(:channel, loop: true){|channel| p channel}
340
537
 
341
538
  The +pg_static_cache_updater+ extension uses this support to automatically update
342
539
  the caches for models using the +static_cache+ plugin. Look at the documentation of that
@@ -348,7 +545,7 @@ Sequel makes it easy to lock tables, though it is generally better to let the da
348
545
  handle locking:
349
546
 
350
547
  DB[:table].lock('EXCLUSIVE') do
351
- DB[:table].insert(:id=>DB[:table].max(:id)+1)
548
+ DB[:table].insert(id: DB[:table].max(:id)+1)
352
549
  end
353
550
  # BEGIN;
354
551
  # LOCK TABLE "table" IN EXCLUSIVE MODE;
@@ -356,18 +553,46 @@ handle locking:
356
553
  # INSERT INTO "table" ("id") VALUES (2) RETURNING NULL;
357
554
  # COMMIT;
358
555
 
556
+ == Extended Error Info (<tt>postgres/pg only</tt>)
557
+
558
+ If you run a query that raises a Sequel::DatabaseError, you can pass the exception object to
559
+ <tt>Database#error_info</tt>, and that will return a hash with metadata regarding the error,
560
+ such as the related table and column or constraint.
561
+
562
+ DB.create_table(:test1){primary_key :id}
563
+ DB.create_table(:test2){primary_key :id; foreign_key :test1_id, :test1}
564
+ DB[:test2].insert(:test1_id=>1) rescue DB.error_info($!)
565
+ # => {
566
+ # :schema=>"public",
567
+ # :table=>"test2",
568
+ # :column=>nil,
569
+ # :constraint=>"test2_test1_id_fkey",
570
+ # :type=>nil,
571
+ # :severity=>"ERROR",
572
+ # :sql_state=>"23503",
573
+ # :message_primary=>"insert or update on table \"test2\" violates foreign key constraint \"test2_test1_id_fkey\"",
574
+ # :message_detail=>"Key (test1_id)=(1) is not present in table \"test1\"."
575
+ # :message_hint=>nil,
576
+ # :statement_position=>nil,
577
+ # :internal_position=>nil,
578
+ # :internal_query=>nil,
579
+ # :source_file=>"ri_triggers.c",
580
+ # :source_line=>"3321",
581
+ # :source_function=>"ri_ReportViolation"
582
+ # }
583
+
359
584
  == sequel_pg (<tt>postgres/pg only</tt>)
360
585
 
361
586
  When the postgres adapter is used with the pg driver, Sequel automatically checks for sequel_pg, and
362
587
  loads it if it is available. sequel_pg is a C extension that optimizes the fetching of rows, generally
363
- resulting in a 2-6x speedup. It is highly recommended to install sequel_pg if you are using the
588
+ resulting in a ~2x speedup. It is highly recommended to install sequel_pg if you are using the
364
589
  postgres adapter with pg.
365
590
 
366
- sequel_pg has additional optimizations when using the Dataset +map+, +to_hash+,
591
+ sequel_pg has additional optimizations when using the Dataset +map+, +as_hash+,
367
592
  +to_hash_groups+, +select_hash+, +select_hash_groups+, +select_map+, and +select_order_map+ methods,
368
593
  which avoids creating intermediate hashes and can add further speedups.
369
594
 
370
- In addition to optimization, sequel_pg also adds streaming support if used on PostgreSQL 9.2. Streaming
595
+ In addition to optimization, sequel_pg also adds streaming support if used on PostgreSQL 9.2+. Streaming
371
596
  support is similar to using a cursor, but it is faster and more transparent.
372
597
 
373
598
  You can enable the streaming support:
@@ -7,14 +7,14 @@ the following adapters:
7
7
 
8
8
  * ibmdb (prepared statements only)
9
9
  * jdbc
10
- * mysql (prepared statements only)
11
- * mysql2 (prepared statements only)
10
+ * mysql (server prepared statements using literalized connection variables)
11
+ * mysql2 (full support on 0.4+, otherwise server prepared statements using literalized connection variables)
12
12
  * oracle (requires type specifiers for nil/NULL values)
13
13
  * postgres (when using the pg driver)
14
14
  * sqlite
15
15
  * tinytds
16
16
 
17
- Support on other adapters is emulated via string interpolation.
17
+ Support on other adapters is emulated.
18
18
 
19
19
  You can use the prepared_statements model plugin to automatically use prepared
20
20
  statements for some common model actions such as saving or deleting a model
@@ -29,7 +29,7 @@ significantly for placeholders (e.g. :name, $1, ?). Sequel abstracts all of
29
29
  that and allows you to specify placeholders by using the :$name format for
30
30
  placeholders, e.g.:
31
31
 
32
- ds = DB[:items].where(:name=>:$n)
32
+ ds = DB[:items].where(name: :$n)
33
33
 
34
34
  You can use these placeholders in most places where you can use the value
35
35
  directly. For example, if you want to use placeholders while also using
@@ -41,45 +41,49 @@ raw SQL, you can do:
41
41
 
42
42
  Using bound variables for this query is simple:
43
43
 
44
- ds.call(:select, :n=>'Jim')
44
+ ds.call(:select, n: 'Jim')
45
45
 
46
46
  This will do the equivalent of selecting records that have the name 'Jim'. It
47
47
  returns all records, and can take a block that is passed to <tt>Dataset#all</tt>.
48
48
 
49
49
  Deleting or returning the first record works similarly:
50
50
 
51
- ds.call(:first, :n=>'Jim') # First record with name 'Jim'
52
- ds.call(:delete, :n=>'Jim') # Delete records with name 'Jim'
51
+ ds.call(:first, n: 'Jim') # First record with name 'Jim'
52
+ ds.call(:delete, n: 'Jim') # Delete records with name 'Jim'
53
53
 
54
54
  For inserting/updating records, you should also specify a value hash, which
55
55
  may itself contain placeholders:
56
56
 
57
57
  # Insert record with 'Jim', note that the previous filter is ignored
58
- ds.call(:insert, {:n=>'Jim'}, :name=>:$n)
58
+ ds.call(:insert, {n: 'Jim'}, name: :$n)
59
59
  # Change name to 'Bob' for all records with name of 'Jim'
60
- ds.call(:update, {:n=>'Jim', :new_n=>'Bob'}, :name=>:$new_n)
60
+ ds.call(:update, {n: 'Jim', new_n: 'Bob'}, name: :$new_n)
61
61
 
62
62
  == Prepared Statements
63
63
 
64
64
  Prepared statement support is similar to bound variable support, but you
65
65
  use <tt>Dataset#prepare</tt> with a name, and <tt>Dataset#call</tt> or <tt>Database#call</tt> later with the values:
66
66
 
67
- ds = DB[:items].filter(:name=>:$n)
67
+ ds = DB[:items].where(name: :$n)
68
68
  ps = ds.prepare(:select, :select_by_name)
69
- ps.call(:n=>'Jim')
70
- DB.call(:select_by_name, :n=>'Jim') # same as above
69
+
70
+ ps.call(n: 'Jim')
71
+ DB.call(:select_by_name, n: 'Jim') # same
71
72
 
72
73
  The <tt>Dataset#prepare</tt> method returns a prepared statement, and also stores a
73
74
  copy of the prepared statement in the database for later use. For insert
74
75
  and update queries, the hash to insert/update is passed to +prepare+:
75
76
 
76
- ps1 = DB[:items].prepare(:insert, :insert_with_name, :name=>:$n)
77
- ps1.call(:n=>'Jim')
78
- DB.call(:insert_with_name, :n=>'Jim') # same as above
79
- ds = DB[:items].filter(:name=>:$n)
80
- ps2 = ds.prepare(:update, :update_name, :name=>:$new_n)
81
- ps2.call(:n=>'Jim', :new_n=>'Bob')
82
- DB.call(:update_name, :n=>'Jim', :new_n=>'Bob') # same as above
77
+ ps1 = DB[:items].prepare(:insert, :insert_with_name, name: :$n)
78
+
79
+ ps1.call(n: 'Jim')
80
+ DB.call(:insert_with_name, n: 'Jim') # same
81
+
82
+ ds = DB[:items].where(name: :$n)
83
+ ps2 = ds.prepare(:update, :update_name, name: :$new_n)
84
+
85
+ ps2.call(n: 'Jim', new_n: 'Bob')
86
+ DB.call(:update_name, n: 'Jim', new_n: 'Bob') # same
83
87
 
84
88
  == Implementation Issues
85
89
 
@@ -92,7 +96,7 @@ to create prepared statements dynamically at runtime.
92
96
 
93
97
  === PostgreSQL
94
98
 
95
- If you are using the ruby-postgres or postgres-pr driver, PostgreSQL uses the
99
+ If you are using the postgres-pr driver, PostgreSQL uses the
96
100
  default emulated support. If you are using ruby-pg, there is native support
97
101
  for both prepared statements and bound variables. Prepared statements are
98
102
  always server side.
@@ -103,9 +107,10 @@ SQLite supports both prepared statements and bound variables.
103
107
 
104
108
  === MySQL/Mysql2
105
109
 
106
- The MySQL/Mysql2 ruby drivers do not support bound variables, so the bound
107
- variable methods fall back to string interpolation. It uses server side
108
- prepared statements.
110
+ The MySQL and Mysql2 <0.4 ruby drivers do not support bound variables, so the bound
111
+ variable methods are emulated. It uses server side prepared statements.
112
+
113
+ Mysql2 0.4+ supports both prepared statements and bound variables.
109
114
 
110
115
  === JDBC
111
116
 
@@ -136,4 +141,4 @@ not currently supported.
136
141
 
137
142
  === All Others
138
143
 
139
- Support is emulated using interpolation.
144
+ Support is emulated.