sequel 4.26.0 → 5.37.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 (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
@@ -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 do 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,39 +324,52 @@ 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.
333
+
334
+ === VALUES Support
335
+
336
+ Sequel offers support for the +VALUES+ statement using <tt>Database#values</tt>:
337
+
338
+ DB.values([[1,2],[2,3],[3,4]])
339
+ # VALUES (1, 2), (2, 3), (3, 4)
340
+
341
+ DB.values([[1,2],[2,3],[3,4]]).order(2, 1)
342
+ # VALUES (1, 2), (2, 3), (3, 4) ORDER BY 2, 1
343
+
344
+ DB.values([[1,2],[2,3],[3,4]]).order(2, 1).limit(1,2)
345
+ # VALUES (1, 2), (2, 3), (3, 4) ORDER BY 2, 1 LIMIT 1 OFFSET 2
187
346
 
188
347
  === INSERT ON CONFLICT Support
189
348
 
190
349
  Starting with PostgreSQL 9.5, you can do an upsert or ignore unique or exclusion constraint
191
350
  violations when inserting using <tt>Dataset#insert_conflict</tt>:
192
351
 
193
- DB[:table].insert_conflict.insert(:a=>1, :b=>2)
352
+ DB[:table].insert_conflict.insert(a: 1, b: 2)
194
353
  # INSERT INTO TABLE (a, b) VALUES (1, 2)
195
354
  # ON CONFLICT DO NOTHING
196
355
 
197
356
  For compatibility with Sequel's MySQL support, you can also use +insert_ignore+:
198
357
 
199
- DB[:table].insert_ignore.insert(:a=>1, :b=>2)
358
+ DB[:table].insert_ignore.insert(a: 1, b: 2)
200
359
  # INSERT INTO TABLE (a, b) VALUES (1, 2)
201
360
  # ON CONFLICT DO NOTHING
202
361
 
203
362
  You can pass a specific constraint name using +:constraint+, to only ignore a specific
204
363
  constraint violation:
205
364
 
206
- 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)
207
366
  # INSERT INTO TABLE (a, b) VALUES (1, 2)
208
367
  # ON CONFLICT ON CONSTRAINT table_a_uidx DO NOTHING
209
368
 
210
369
  If the unique or exclusion constraint covers the whole table (e.g. it isn't a partial unique
211
370
  index), then you can just specify the column using the +:target+ option:
212
371
 
213
- DB[:table].insert_conflict(:target=>:a).insert(:a=>1, :b=>2)
372
+ DB[:table].insert_conflict(target: :a).insert(a: 1, b: 2)
214
373
  # INSERT INTO TABLE (a, b) VALUES (1, 2)
215
374
  # ON CONFLICT (a) DO NOTHING
216
375
 
@@ -218,20 +377,49 @@ If you want to update the existing row instead of ignoring the constraint violat
218
377
  can pass an +:update+ option with a hash of values to update. You must pass either the
219
378
  +:target+ or +:constraint+ options when passing the +:update+ option:
220
379
 
221
- 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)
222
381
  # INSERT INTO TABLE (a, b) VALUES (1, 2)
223
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)
224
395
 
225
396
  Additionally, if you only want to do the update in certain cases, you can specify an
226
397
  +:update_where+ option, which will be used as a filter. If the row doesn't match the
227
398
  conditions, the constraint violation will be ignored, but the row will not be updated:
228
399
 
229
- DB[:table].insert_conflict(:constraint=>:table_a_uidx,
230
- :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)
231
403
  # INSERT INTO TABLE (a, b) VALUES (1, 2)
232
404
  # ON CONFLICT ON CONSTRAINT table_a_uidx
233
405
  # DO UPDATE SET b = excluded.b WHERE (table.status_id = 1)
234
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
+
235
423
  === Distinct On Specific Columns
236
424
 
237
425
  Sequel allows passing columns to <tt>Dataset#distinct</tt>, which will make the dataset return
@@ -240,6 +428,20 @@ rows that are distinct on just those columns:
240
428
  DB[:table].distinct(:id).all
241
429
  # SELECT DISTINCT ON ("id") * FROM "table"
242
430
 
431
+ === Calling PostgreSQL 11+ Procedures <tt>postgres only</tt>
432
+
433
+ PostgreSQL 11+ added support for procedures, which are different from the user defined
434
+ functions that PostgreSQL has historically supported. These procedures are
435
+ called via a special +CALL+ syntax, and Sequel supports them via
436
+ <tt>Database#call_procedure</tt>:
437
+
438
+ DB.call_procedure(:foo, 1, "bar")
439
+ # CALL foo(1, 'bar')
440
+
441
+ <tt>Database#call_procedure</tt> will return a hash of return values if
442
+ the procedure returns a result, or +nil+ if the procedure does not return
443
+ a result.
444
+
243
445
  === Using a Cursor to Process Large Datasets <tt>postgres only</tt>
244
446
 
245
447
  The postgres adapter offers a <tt>Dataset#use_cursor</tt> method to process large result sets
@@ -258,19 +460,19 @@ without keeping all rows in memory:
258
460
  This support is used by default when using <tt>Dataset#paged_each</tt>.
259
461
 
260
462
  Using cursors, it is possible to update individual rows of a large dataset
261
- easily using the <tt>:rows_per_fetch=>1</tt> option in conjunction with
463
+ easily using the <tt>rows_per_fetch: 1</tt> option in conjunction with
262
464
  <tt>Dataset#where_current_of</tt>. This is useful if the logic needed to
263
465
  update the rows exists in the application and not in the database:
264
466
 
265
- ds.use_cursor(:rows_per_fetch=>1).each do |row|
266
- ds.where_current_of.update(:col=>new_col_value(row))
467
+ ds.use_cursor(rows_per_fetch: 1).each do |row|
468
+ ds.where_current_of.update(col: new_col_value(row))
267
469
  end
268
470
 
269
471
  === Truncate Modifiers
270
472
 
271
473
  Sequel supports PostgreSQL-specific truncate options:
272
474
 
273
- DB[:table].truncate(:cascade => true, :only=>true, :restart=>true)
475
+ DB[:table].truncate(cascade: true, only: true, restart: true)
274
476
  # TRUNCATE TABLE ONLY "table" RESTART IDENTITY CASCADE
275
477
 
276
478
  === COPY Support <tt>postgres/pg and jdbc/postgres only</tt>
@@ -279,14 +481,14 @@ PostgreSQL's COPY feature is pretty much the fastest way to get data in or out o
279
481
  Sequel supports getting data out of the database via <tt>Database#copy_table</tt>, either for
280
482
  a specific table or for an arbitrary dataset:
281
483
 
282
- DB.copy_table(:table, :format=>:csv)
484
+ DB.copy_table(:table, format: :csv)
283
485
  # COPY "table" TO STDOUT (FORMAT csv)
284
- DB.copy_table(DB[:table], :format=>:csv)
486
+ DB.copy_table(DB[:table], format: :csv)
285
487
  # COPY (SELECT * FROM "table") TO STDOUT (FORMAT csv)
286
488
 
287
489
  It supports putting data into the database via <tt>Database#copy_into</tt>:
288
490
 
289
- DB.copy_into(:table, :format=>:csv, :columns=>[:column1, :column2], :data=>"1,2\n2,3\n")
491
+ DB.copy_into(:table, format: :csv, columns: [:column1, :column2], data: "1,2\n2,3\n")
290
492
  # COPY "table"("column1", "column2") FROM STDIN (FORMAT csv)
291
493
 
292
494
  === Anonymous Function Execution
@@ -323,7 +525,7 @@ this blocks until the listening thread is notified:
323
525
  Note that +listen+ by default only listens for a single notification. If you want to loop and process
324
526
  notifications:
325
527
 
326
- DB.listen(:channel, :loop=>true){|channel| p channel}
528
+ DB.listen(:channel, loop: true){|channel| p channel}
327
529
 
328
530
  The +pg_static_cache_updater+ extension uses this support to automatically update
329
531
  the caches for models using the +static_cache+ plugin. Look at the documentation of that
@@ -335,7 +537,7 @@ Sequel makes it easy to lock tables, though it is generally better to let the da
335
537
  handle locking:
336
538
 
337
539
  DB[:table].lock('EXCLUSIVE') do
338
- DB[:table].insert(:id=>DB[:table].max(:id)+1)
540
+ DB[:table].insert(id: DB[:table].max(:id)+1)
339
541
  end
340
542
  # BEGIN;
341
543
  # LOCK TABLE "table" IN EXCLUSIVE MODE;
@@ -343,18 +545,46 @@ handle locking:
343
545
  # INSERT INTO "table" ("id") VALUES (2) RETURNING NULL;
344
546
  # COMMIT;
345
547
 
548
+ == Extended Error Info (<tt>postgres/pg only</tt>)
549
+
550
+ If you run a query that raises a Sequel::DatabaseError, you can pass the exception object to
551
+ <tt>Database#error_info</tt>, and that will return a hash with metadata regarding the error,
552
+ such as the related table and column or constraint.
553
+
554
+ DB.create_table(:test1){primary_key :id}
555
+ DB.create_table(:test2){primary_key :id; foreign_key :test1_id, :test1}
556
+ DB[:test2].insert(:test1_id=>1) rescue DB.error_info($!)
557
+ # => {
558
+ # :schema=>"public",
559
+ # :table=>"test2",
560
+ # :column=>nil,
561
+ # :constraint=>"test2_test1_id_fkey",
562
+ # :type=>nil,
563
+ # :severity=>"ERROR",
564
+ # :sql_state=>"23503",
565
+ # :message_primary=>"insert or update on table \"test2\" violates foreign key constraint \"test2_test1_id_fkey\"",
566
+ # :message_detail=>"Key (test1_id)=(1) is not present in table \"test1\"."
567
+ # :message_hint=>nil,
568
+ # :statement_position=>nil,
569
+ # :internal_position=>nil,
570
+ # :internal_query=>nil,
571
+ # :source_file=>"ri_triggers.c",
572
+ # :source_line=>"3321",
573
+ # :source_function=>"ri_ReportViolation"
574
+ # }
575
+
346
576
  == sequel_pg (<tt>postgres/pg only</tt>)
347
577
 
348
578
  When the postgres adapter is used with the pg driver, Sequel automatically checks for sequel_pg, and
349
579
  loads it if it is available. sequel_pg is a C extension that optimizes the fetching of rows, generally
350
- resulting in a 2-6x speedup. It is highly recommended to install sequel_pg if you are using the
580
+ resulting in a ~2x speedup. It is highly recommended to install sequel_pg if you are using the
351
581
  postgres adapter with pg.
352
582
 
353
- sequel_pg has additional optimizations when using the Dataset +map+, +to_hash+,
583
+ sequel_pg has additional optimizations when using the Dataset +map+, +as_hash+,
354
584
  +to_hash_groups+, +select_hash+, +select_hash_groups+, +select_map+, and +select_order_map+ methods,
355
585
  which avoids creating intermediate hashes and can add further speedups.
356
586
 
357
- In addition to optimization, sequel_pg also adds streaming support if used on PostgreSQL 9.2. Streaming
587
+ In addition to optimization, sequel_pg also adds streaming support if used on PostgreSQL 9.2+. Streaming
358
588
  support is similar to using a cursor, but it is faster and more transparent.
359
589
 
360
590
  You can enable the streaming support: