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
@@ -18,15 +18,15 @@ module Sequel
18
18
  # the {"Schema Modification" guide}[rdoc-ref:doc/schema_modification.rdoc].
19
19
  class CreateTableGenerator
20
20
  # Classes specifying generic types that Sequel will convert to database-specific types.
21
- GENERIC_TYPES=%w'String Integer Fixnum Float Numeric BigDecimal Date DateTime Time File TrueClass FalseClass'
21
+ GENERIC_TYPES=%w'String Integer Float Numeric BigDecimal Date DateTime Time File TrueClass FalseClass'.freeze
22
22
 
23
- # Return the column hashes created by this generator
23
+ # Column hashes created by this generator
24
24
  attr_reader :columns
25
25
 
26
- # Return the constraint hashes created by this generator
26
+ # Constraint hashes created by this generator
27
27
  attr_reader :constraints
28
28
 
29
- # Return the index hashes created by this generator
29
+ # Index hashes created by this generator
30
30
  attr_reader :indexes
31
31
 
32
32
  # Set the database in which to create the table, and evaluate the block
@@ -37,8 +37,7 @@ module Sequel
37
37
  @indexes = []
38
38
  @constraints = []
39
39
  @primary_key = nil
40
- instance_eval(&block) if block
41
- @columns.unshift(@primary_key) if @primary_key && !has_column?(primary_key_name)
40
+ instance_exec(&block) if block
42
41
  end
43
42
 
44
43
  # Use custom Bignum method to use :Bignum instead of Bignum class, to work
@@ -47,34 +46,46 @@ module Sequel
47
46
  column(name, :Bignum, opts)
48
47
  end
49
48
 
49
+ # Use custom Fixnum method to use Integer instead of Fixnum class, to avoid
50
+ # warnings on ruby 2.4+.
51
+ def Fixnum(name, opts=OPTS)
52
+ column(name, Integer, opts)
53
+ end
54
+
50
55
  # Add a method for each of the given types that creates a column
51
56
  # with that type as a constant. Types given should either already
52
57
  # be constants/classes or a capitalized string/symbol with the same name
53
58
  # as a constant/class.
54
- #
55
- # Do not call this method with untrusted input, as that can result in
56
- # arbitrary code execution.
57
59
  def self.add_type_method(*types)
58
60
  types.each do |type|
59
- class_eval("def #{type}(name, opts={}); column(name, #{type}, opts); end", __FILE__, __LINE__)
61
+ case type
62
+ when Symbol, String
63
+ method = type
64
+ type = Object.const_get(type)
65
+ else
66
+ method = type.to_s
67
+ end
68
+
69
+ define_method(method){|name, opts=OPTS| column(name, type, opts)}
60
70
  end
71
+ nil
61
72
  end
62
73
 
63
- # Add an unnamed constraint to the DDL, specified by the given block
74
+ # Add an unnamed constraint, specified by the given block
64
75
  # or args:
65
76
  #
66
- # check(:num=>1..5) # CHECK num >= 1 AND num <= 5
67
- # check{num > 5} # CHECK num > 5
77
+ # check(num: 1..5) # CHECK num >= 1 AND num <= 5
78
+ # check{num > 5} # CHECK num > 5
68
79
  def check(*args, &block)
69
80
  constraint(nil, *args, &block)
70
81
  end
71
82
 
72
- # Add a column with the given name, type, and opts to the DDL.
83
+ # Add a column with the given name, type, and opts:
73
84
  #
74
85
  # column :num, :integer
75
86
  # # num INTEGER
76
87
  #
77
- # column :name, String, :null=>false, :default=>'a'
88
+ # column :name, String, null: false, default: 'a'
78
89
  # # name varchar(255) NOT NULL DEFAULT 'a'
79
90
  #
80
91
  # inet :ip
@@ -98,6 +109,9 @@ module Sequel
98
109
  # yet exist on referenced table (but will exist before the transaction commits).
99
110
  # Basically it adds DEFERRABLE INITIALLY DEFERRED on key creation.
100
111
  # If you use :immediate as the value, uses DEFERRABLE INITIALLY IMMEDIATE.
112
+ # :generated_always_as :: Specify a GENERATED ALWAYS AS column expression,
113
+ # if generated columns are supported (PostgreSQL 12+, MariaDB 5.2.0+,
114
+ # and MySQL 5.7.6+).
101
115
  # :index :: Create an index on this column. If given a hash, use the hash as the
102
116
  # options for the index.
103
117
  # :key :: For foreign key columns, the column in the associated table
@@ -105,47 +119,79 @@ module Sequel
105
119
  # references the primary key of the associated table, except if you are
106
120
  # using MySQL.
107
121
  # :null :: Mark the column as allowing NULL values (if true),
108
- # or not allowing NULL values (if false). If unspecified, will default
109
- # to whatever the database default is.
122
+ # or not allowing NULL values (if false). The default is to allow NULL values.
110
123
  # :on_delete :: Specify the behavior of this column when being deleted
111
124
  # (:restrict, :cascade, :set_null, :set_default, :no_action).
112
125
  # :on_update :: Specify the behavior of this column when being updated
113
126
  # (:restrict, :cascade, :set_null, :set_default, :no_action).
114
- # :primary_key :: Make the column as a single primary key column. This should only
115
- # be used if you have a single, nonautoincrementing primary key column.
127
+ # :primary_key :: Make the column as a single primary key column. This should not
128
+ # be used if you want a single autoincrementing primary key column
129
+ # (use the primary_key method in that case).
116
130
  # :primary_key_constraint_name :: The name to give the primary key constraint
131
+ # :primary_key_deferrable :: Similar to :deferrable, but for the primary key constraint
132
+ # if :primary_key is used.
117
133
  # :type :: Overrides the type given as the argument. Generally not used by column
118
134
  # itself, but can be passed as an option to other methods that call column.
119
135
  # :unique :: Mark the column as unique, generally has the same effect as
120
136
  # creating a unique index on the column.
121
137
  # :unique_constraint_name :: The name to give the unique key constraint
138
+ # :unique_deferrable :: Similar to :deferrable, but for the unique constraint if :unique
139
+ # is used.
140
+ #
141
+ # PostgreSQL specific options:
142
+ #
143
+ # :identity :: Create an identity column.
144
+ #
145
+ # MySQL specific options:
146
+ #
147
+ # :generated_type :: Set the type of column when using :generated_always_as,
148
+ # should be :virtual or :stored to force a type.
149
+ # :on_update_current_timestamp :: Use ON UPDATE CURRENT TIMESTAMP when defining the column,
150
+ # which will update the column value to CURRENT_TIMESTAMP
151
+ # on every UPDATE.
152
+ #
153
+ # Microsoft SQL Server specific options:
154
+ #
155
+ # :clustered :: When using :primary_key or :unique, marks the primary key or unique
156
+ # constraint as CLUSTERED (if true), or NONCLUSTERED (if false).
122
157
  def column(name, type, opts = OPTS)
123
158
  columns << {:name => name, :type => type}.merge!(opts)
124
159
  if index_opts = opts[:index]
125
- index(name, index_opts.is_a?(Hash) ? index_opts : {})
160
+ index(name, index_opts.is_a?(Hash) ? index_opts : OPTS)
126
161
  end
162
+ nil
127
163
  end
128
164
 
129
- # Adds a named constraint (or unnamed if name is nil) to the DDL,
165
+ # Adds a named CHECK constraint (or unnamed if name is nil),
130
166
  # with the given block or args. To provide options for the constraint, pass
131
167
  # a hash as the first argument.
132
168
  #
133
- # constraint(:blah, :num=>1..5)
169
+ # constraint(:blah, num: 1..5)
134
170
  # # CONSTRAINT blah CHECK num >= 1 AND num <= 5
135
- # constraint({:name=>:blah, :deferrable=>true}, :num=>1..5)
171
+ # constraint({name: :blah, deferrable: true}, num: 1..5)
136
172
  # # CONSTRAINT blah CHECK num >= 1 AND num <= 5 DEFERRABLE INITIALLY DEFERRED
173
+ #
174
+ # If the first argument is a hash, the following options are supported:
175
+ #
176
+ # Options:
177
+ # :name :: The name of the CHECK constraint
178
+ # :deferrable :: Whether the CHECK constraint should be marked DEFERRABLE.
179
+ #
180
+ # PostgreSQL specific options:
181
+ # :not_valid :: Whether the CHECK constraint should be marked NOT VALID.
137
182
  def constraint(name, *args, &block)
138
183
  opts = name.is_a?(Hash) ? name : {:name=>name}
139
184
  constraints << opts.merge(:type=>:check, :check=>block || args)
185
+ nil
140
186
  end
141
187
 
142
- # Add a foreign key in the table that references another table to the DDL. See column
188
+ # Add a foreign key in the table that references another table. See #column
143
189
  # for available options.
144
190
  #
145
191
  # foreign_key(:artist_id) # artist_id INTEGER
146
192
  # foreign_key(:artist_id, :artists) # artist_id INTEGER REFERENCES artists
147
- # foreign_key(:artist_id, :artists, :key=>:id) # artist_id INTEGER REFERENCES artists(id)
148
- # foreign_key(:artist_id, :artists, :type=>String) # artist_id varchar(255) REFERENCES artists(id)
193
+ # foreign_key(:artist_id, :artists, key: :id) # artist_id INTEGER REFERENCES artists(id)
194
+ # foreign_key(:artist_id, :artists, type: String) # artist_id varchar(255) REFERENCES artists(id)
149
195
  #
150
196
  # Additional Options:
151
197
  #
@@ -155,7 +201,7 @@ module Sequel
155
201
  # composite foreign key), you can provide an array of columns as the first argument, and
156
202
  # you can provide the :name option to name the constraint:
157
203
  #
158
- # foreign_key([:artist_name, :artist_location], :artists, :name=>:artist_fk)
204
+ # foreign_key([:artist_name, :artist_location], :artists, name: :artist_fk)
159
205
  # # ADD CONSTRAINT artist_fk FOREIGN KEY (artist_name, artist_location) REFERENCES artists
160
206
  def foreign_key(name, table=nil, opts = OPTS)
161
207
  opts = case table
@@ -170,55 +216,66 @@ module Sequel
170
216
  column(name, Integer, opts)
171
217
  end
172
218
 
173
- # Add a full text index on the given columns to the DDL.
219
+ # Add a full text index on the given columns.
220
+ # See #index for additional options.
174
221
  #
175
222
  # PostgreSQL specific options:
176
223
  # :index_type :: Can be set to :gist to use a GIST index instead of the
177
224
  # default GIN index.
178
225
  # :language :: Set a language to use for the index (default: simple).
179
- #
180
- # Microsoft SQL Server specific options:
181
- # :key_index :: The KEY INDEX to use for the full text index.
182
226
  def full_text_index(columns, opts = OPTS)
183
227
  index(columns, opts.merge(:type => :full_text))
184
228
  end
185
229
 
186
- # True if the DDL includes the creation of a column with the given name.
230
+ # True if the generator includes the creation of a column with the given name.
187
231
  def has_column?(name)
188
232
  columns.any?{|c| c[:name] == name}
189
233
  end
190
234
 
191
- # Add an index on the given column(s) with the given options to the DDL.
235
+ # Add an index on the given column(s) with the given options. Examples:
236
+ #
237
+ # index :name
238
+ # # CREATE INDEX table_name_index ON table (name)
239
+ #
240
+ # index [:artist_id, :name]
241
+ # # CREATE INDEX table_artist_id_name_index ON table (artist_id, name)
242
+ #
243
+ # index [:artist_id, :name], name: :foo
244
+ # # CREATE INDEX foo ON table (artist_id, name)
245
+ #
192
246
  # General options:
193
247
  #
248
+ # :include :: Include additional column values in the index, without
249
+ # actually indexing on those values (only supported by
250
+ # some databases).
194
251
  # :name :: The name to use for the index. If not given, a default name
195
252
  # based on the table and columns is used.
196
- # :type :: The type of index to use (only supported by some databases)
253
+ # :type :: The type of index to use (only supported by some databases,
254
+ # :full_text and :spatial values are handled specially).
197
255
  # :unique :: Make the index unique, so duplicate values are not allowed.
198
- # :where :: Create a partial index (only supported by some databases)
256
+ # :where :: A filter expression, used to create a partial index (only
257
+ # supported by some databases).
199
258
  #
200
259
  # PostgreSQL specific options:
201
260
  #
202
261
  # :concurrently :: Create the index concurrently, so it doesn't block
203
262
  # operations on the table while the index is being
204
263
  # built.
205
- # :opclass :: Use a specific operator class in the index.
264
+ # :if_not_exists :: Only create the index if an index of the same name doesn't already exist.
265
+ # :nulls_distinct :: Set whether separate NULLs should be considered distinct values in unique indexes.
266
+ # :opclass :: Set an opclass to use for all columns (per-column opclasses require
267
+ # custom SQL).
268
+ # :tablespace :: Specify tablespace for index.
206
269
  #
207
270
  # Microsoft SQL Server specific options:
208
271
  #
209
- # :include :: Include additional column values in the index, without
210
- # actually indexing on those values.
211
- #
212
- # index :name
213
- # # CREATE INDEX table_name_index ON table (name)
214
- #
215
- # index [:artist_id, :name]
216
- # # CREATE INDEX table_artist_id_name_index ON table (artist_id, name)
272
+ # :key_index :: Sets the KEY INDEX to the given value.
217
273
  def index(columns, opts = OPTS)
218
274
  indexes << {:columns => Array(columns)}.merge!(opts)
275
+ nil
219
276
  end
220
277
 
221
- # Add a column with the given type, name, and opts to the DDL. See +column+ for available
278
+ # Add a column with the given type, name, and opts. See #column for available
222
279
  # options.
223
280
  def method_missing(type, name = nil, opts = OPTS)
224
281
  name ? column(name, type, opts) : super
@@ -229,7 +286,7 @@ module Sequel
229
286
  true
230
287
  end
231
288
 
232
- # Adds an autoincrementing primary key column or a primary key constraint to the DDL.
289
+ # Adds an autoincrementing primary key column or a primary key constraint.
233
290
  # To just create a constraint, the first argument should be an array of column symbols
234
291
  # specifying the primary key columns. To create an autoincrementing primary key
235
292
  # column, a single symbol can be used. In both cases, an options hash can be used
@@ -237,7 +294,7 @@ module Sequel
237
294
  #
238
295
  # If you want to create a primary key column that is not autoincrementing, you
239
296
  # should not use this method. Instead, you should use the regular +column+ method
240
- # with a <tt>:primary_key=>true</tt> option.
297
+ # with a <tt>primary_key: true</tt> option.
241
298
  #
242
299
  # If an array of column symbols is used, you can specify the :name option
243
300
  # to name the constraint.
@@ -249,9 +306,8 @@ module Sequel
249
306
  #
250
307
  # Examples:
251
308
  # primary_key(:id)
252
- # primary_key(:id, Bigint)
253
- # primary_key(:id, Bigint, :keep_order=>true)
254
- # primary_key([:street_number, :house_number], :name=>:some constraint_name)
309
+ # primary_key(:id, type: :Bignum, keep_order: true)
310
+ # primary_key([:street_number, :house_number], name: :some constraint_name)
255
311
  def primary_key(name, *args)
256
312
  return composite_primary_key(name, *args) if name.is_a?(Array)
257
313
  column = @db.serial_primary_key_options.merge({:name => name})
@@ -270,6 +326,7 @@ module Sequel
270
326
  else
271
327
  columns.unshift(column)
272
328
  end
329
+ nil
273
330
  end
274
331
 
275
332
  # The name of the primary key for this generator, if it has a primary key.
@@ -277,12 +334,13 @@ module Sequel
277
334
  @primary_key[:name] if @primary_key
278
335
  end
279
336
 
280
- # Add a spatial index on the given columns to the DDL.
337
+ # Add a spatial index on the given columns.
338
+ # See #index for additional options.
281
339
  def spatial_index(columns, opts = OPTS)
282
340
  index(columns, opts.merge(:type => :spatial))
283
341
  end
284
342
 
285
- # Add a unique constraint on the given columns to the DDL.
343
+ # Add a unique constraint on the given columns.
286
344
  #
287
345
  # unique(:name) # UNIQUE (name)
288
346
  #
@@ -290,27 +348,27 @@ module Sequel
290
348
  # to name the constraint.
291
349
  def unique(columns, opts = OPTS)
292
350
  constraints << {:type => :unique, :columns => Array(columns)}.merge!(opts)
351
+ nil
293
352
  end
294
353
 
295
354
  private
296
355
 
297
356
  # Add a composite primary key constraint
298
357
  def composite_primary_key(columns, *args)
299
- opts = args.pop || {}
358
+ opts = args.pop || OPTS
300
359
  constraints << {:type => :primary_key, :columns => columns}.merge!(opts)
360
+ nil
301
361
  end
302
362
 
303
363
  # Add a composite foreign key constraint
304
364
  def composite_foreign_key(columns, opts)
305
365
  constraints << {:type => :foreign_key, :columns => columns}.merge!(opts)
366
+ nil
306
367
  end
307
368
 
308
369
  add_type_method(*GENERIC_TYPES)
309
370
  end
310
371
 
311
- # Alias of CreateTableGenerator for backwards compatibility.
312
- Generator = CreateTableGenerator
313
-
314
372
  # Schema::AlterTableGenerator is an internal class that the user is not expected
315
373
  # to instantiate directly. Instances are created by Database#alter_table.
316
374
  # It is used to specify table alteration parameters. It takes a Database
@@ -321,49 +379,64 @@ module Sequel
321
379
  # For more information on Sequel's support for schema modification, see
322
380
  # the {"Schema Modification" guide}[link:files/doc/schema_modification_rdoc.html].
323
381
  class AlterTableGenerator
324
- # An array of DDL operations to perform
382
+ # An array of operations to perform
325
383
  attr_reader :operations
326
384
 
327
- # Set the Database object to which to apply the DDL, and evaluate the
385
+ # Set the Database object to which to apply the changes, and evaluate the
328
386
  # block in the context of this object.
329
387
  def initialize(db, &block)
330
388
  @db = db
331
389
  @operations = []
332
- instance_eval(&block) if block
390
+ instance_exec(&block) if block
333
391
  end
334
392
 
335
- # Add a column with the given name, type, and opts to the DDL for the table.
393
+ # Add a column with the given name, type, and opts.
336
394
  # See CreateTableGenerator#column for the available options.
337
395
  #
338
396
  # add_column(:name, String) # ADD COLUMN name varchar(255)
397
+ #
398
+ # PostgreSQL specific options:
399
+ #
400
+ # :if_not_exists :: Set to true to not add the column if it already exists (PostgreSQL 9.6+)
401
+ #
402
+ # MySQL specific options:
403
+ #
404
+ # :after :: The name of an existing column that the new column should be positioned after
405
+ # :first :: Create this new column before all other existing columns
339
406
  def add_column(name, type, opts = OPTS)
340
- @operations << {:op => :add_column, :name => name, :type => type}.merge!(opts)
407
+ op = {:op => :add_column, :name => name, :type => type}.merge!(opts)
408
+ index_opts = op.delete(:index)
409
+ @operations << op
410
+ add_index(name, index_opts.is_a?(Hash) ? index_opts : OPTS) if index_opts
411
+ nil
341
412
  end
342
413
 
343
- # Add a constraint with the given name and args to the DDL for the table.
414
+ # Add a constraint with the given name and args.
344
415
  # See CreateTableGenerator#constraint.
345
416
  #
346
417
  # add_constraint(:valid_name, Sequel.like(:name, 'A%'))
347
418
  # # ADD CONSTRAINT valid_name CHECK (name LIKE 'A%' ESCAPE '\')
348
- # add_constraint({:name=>:valid_name, :deferrable=>true}, Sequel.like(:name, 'A%'))
419
+ # add_constraint({name: :valid_name, deferrable: true}, Sequel.like(:name, 'A%'))
349
420
  # # ADD CONSTRAINT valid_name CHECK (name LIKE 'A%' ESCAPE '\') DEFERRABLE INITIALLY DEFERRED
350
421
  def add_constraint(name, *args, &block)
351
422
  opts = name.is_a?(Hash) ? name : {:name=>name}
352
423
  @operations << opts.merge(:op=>:add_constraint, :type=>:check, :check=>block || args)
424
+ nil
353
425
  end
354
426
 
355
427
  # Add a unique constraint to the given column(s)
356
428
  #
357
429
  # add_unique_constraint(:name) # ADD UNIQUE (name)
358
- # add_unique_constraint(:name, :name=>:unique_name) # ADD CONSTRAINT unique_name UNIQUE (name)
430
+ # add_unique_constraint(:name, name: :unique_name) # ADD CONSTRAINT unique_name UNIQUE (name)
359
431
  #
360
432
  # Supports the same :deferrable option as CreateTableGenerator#column.
361
433
  def add_unique_constraint(columns, opts = OPTS)
362
434
  @operations << {:op => :add_constraint, :type => :unique, :columns => Array(columns)}.merge!(opts)
435
+ nil
363
436
  end
364
437
 
365
- # Add a foreign key with the given name and referencing the given table
366
- # to the DDL for the table. See CreateTableGenerator#column for the available options.
438
+ # Add a foreign key with the given name and referencing the given table.
439
+ # See CreateTableGenerator#column for the available options.
367
440
  #
368
441
  # You can also pass an array of column names for creating composite foreign
369
442
  # keys. In this case, it will assume the columns exist and will only add
@@ -389,21 +462,22 @@ module Sequel
389
462
  add_column(name, Integer, {:table=>table}.merge!(opts))
390
463
  end
391
464
 
392
- # Add a full text index on the given columns to the DDL for the table.
393
- # See CreateTableGenerator#index for available options.
465
+ # Add a full text index on the given columns.
466
+ # See CreateTableGenerator#full_text_index for available options.
394
467
  def add_full_text_index(columns, opts = OPTS)
395
468
  add_index(columns, {:type=>:full_text}.merge!(opts))
396
469
  end
397
470
 
398
- # Add an index on the given columns to the DDL for the table. See
471
+ # Add an index on the given columns. See
399
472
  # CreateTableGenerator#index for available options.
400
473
  #
401
474
  # add_index(:artist_id) # CREATE INDEX table_artist_id_index ON table (artist_id)
402
475
  def add_index(columns, opts = OPTS)
403
476
  @operations << {:op => :add_index, :columns => Array(columns)}.merge!(opts)
477
+ nil
404
478
  end
405
479
 
406
- # Add a primary key to the DDL for the table. See CreateTableGenerator#column
480
+ # Add a primary key. See CreateTableGenerator#column
407
481
  # for the available options. Like +add_foreign_key+, if you specify
408
482
  # the column name as an array, it just creates a constraint:
409
483
  #
@@ -415,16 +489,16 @@ module Sequel
415
489
  add_column(name, opts.delete(:type), opts)
416
490
  end
417
491
 
418
- # Add a spatial index on the given columns to the DDL for the table.
492
+ # Add a spatial index on the given columns.
419
493
  # See CreateTableGenerator#index for available options.
420
494
  def add_spatial_index(columns, opts = OPTS)
421
495
  add_index(columns, {:type=>:spatial}.merge!(opts))
422
496
  end
423
497
 
424
- # Remove a column from the DDL for the table.
498
+ # Remove a column from the table.
425
499
  #
426
500
  # drop_column(:artist_id) # DROP COLUMN artist_id
427
- # drop_column(:artist_id, :cascade=>true) # DROP COLUMN artist_id CASCADE
501
+ # drop_column(:artist_id, cascade: true) # DROP COLUMN artist_id CASCADE
428
502
  #
429
503
  # Options:
430
504
  #
@@ -436,20 +510,24 @@ module Sequel
436
510
  # exist.
437
511
  def drop_column(name, opts=OPTS)
438
512
  @operations << {:op => :drop_column, :name => name}.merge!(opts)
513
+ nil
439
514
  end
440
515
 
441
- # Remove a constraint from the DDL for the table. MySQL/SQLite specific options:
516
+ # Remove a constraint from the table:
517
+ #
518
+ # drop_constraint(:unique_name) # DROP CONSTRAINT unique_name
519
+ # drop_constraint(:unique_name, cascade: true) # DROP CONSTRAINT unique_name CASCADE
520
+ #
521
+ # MySQL/SQLite specific options:
442
522
  #
443
523
  # :type :: Set the type of constraint to drop, either :primary_key, :foreign_key,
444
524
  # or :unique.
445
- #
446
- # drop_constraint(:unique_name) # DROP CONSTRAINT unique_name
447
- # drop_constraint(:unique_name, :cascade=>true) # DROP CONSTRAINT unique_name CASCADE
448
525
  def drop_constraint(name, opts=OPTS)
449
526
  @operations << {:op => :drop_constraint, :name => name}.merge!(opts)
527
+ nil
450
528
  end
451
529
 
452
- # Remove a foreign key and the associated column from the DDL for the table. General options:
530
+ # Remove a foreign key and the associated column from the table. General options:
453
531
  #
454
532
  # :name :: The name of the constraint to drop. If not given, uses the same name
455
533
  # that would be used by add_foreign_key with the same columns.
@@ -460,11 +538,15 @@ module Sequel
460
538
  # drop_foreign_key(:artist_id) # DROP CONSTRAINT table_artist_id_fkey, DROP COLUMN artist_id
461
539
  # drop_foreign_key([:name]) # DROP CONSTRAINT table_name_fkey
462
540
  def drop_foreign_key(name, opts=OPTS)
541
+ if !name.is_a?(Array) && opts[:foreign_key_constraint_name]
542
+ opts = Hash[opts]
543
+ opts[:name] = opts[:foreign_key_constraint_name]
544
+ end
463
545
  drop_composite_foreign_key(Array(name), opts)
464
546
  drop_column(name) unless name.is_a?(Array)
465
547
  end
466
548
 
467
- # Remove an index from the DDL for the table. General options:
549
+ # Remove an index from the table. General options:
468
550
  #
469
551
  # :name :: The name of the index to drop. If not given, uses the same name
470
552
  # that would be used by add_index with the same columns.
@@ -478,29 +560,36 @@ module Sequel
478
560
  #
479
561
  # drop_index(:artist_id) # DROP INDEX table_artist_id_index
480
562
  # drop_index([:a, :b]) # DROP INDEX table_a_b_index
481
- # drop_index([:a, :b], :name=>:foo) # DROP INDEX foo
563
+ # drop_index([:a, :b], name: :foo) # DROP INDEX foo
482
564
  def drop_index(columns, options=OPTS)
483
565
  @operations << {:op => :drop_index, :columns => Array(columns)}.merge!(options)
566
+ nil
484
567
  end
485
568
 
486
- # Modify a column's name in the DDL for the table.
569
+ # Rename one of the table's columns.
487
570
  #
488
571
  # rename_column(:name, :artist_name) # RENAME COLUMN name TO artist_name
489
572
  def rename_column(name, new_name, opts = OPTS)
490
573
  @operations << {:op => :rename_column, :name => name, :new_name => new_name}.merge!(opts)
574
+ nil
491
575
  end
492
576
 
493
- # Modify a column's default value in the DDL for the table.
577
+ # Modify the default value for one of the table's column.
494
578
  #
495
579
  # set_column_default(:artist_name, 'a') # ALTER COLUMN artist_name SET DEFAULT 'a'
496
580
  #
581
+ # To remove an existing default value, use +nil+ as the value:
582
+ #
583
+ # set_column_default(:artist_name, nil) # ALTER COLUMN artist_name SET DEFAULT NULL
584
+ #
497
585
  # On MySQL, make sure to use a symbol for the name of the column, as otherwise you
498
586
  # can lose the type and NULL/NOT NULL setting for the column.
499
587
  def set_column_default(name, default)
500
588
  @operations << {:op => :set_column_default, :name => name, :default => default}
589
+ nil
501
590
  end
502
591
 
503
- # Modify a column's type in the DDL for the table.
592
+ # Modify the type of one of the table's column.
504
593
  #
505
594
  # set_column_type(:artist_name, 'char(10)') # ALTER COLUMN artist_name TYPE char(10)
506
595
  #
@@ -512,6 +601,7 @@ module Sequel
512
601
  # can lose the default and NULL/NOT NULL setting for the column.
513
602
  def set_column_type(name, type, opts=OPTS)
514
603
  @operations << {:op => :set_column_type, :name => name, :type => type}.merge!(opts)
604
+ nil
515
605
  end
516
606
 
517
607
  # Set a given column as allowing NULL values.
@@ -522,6 +612,7 @@ module Sequel
522
612
  # can lose the default and type for the column.
523
613
  def set_column_allow_null(name, allow_null=true)
524
614
  @operations << {:op => :set_column_null, :name => name, :null => allow_null}
615
+ nil
525
616
  end
526
617
 
527
618
  # Set a given column as not allowing NULL values.
@@ -539,16 +630,19 @@ module Sequel
539
630
  # Add a composite primary key constraint
540
631
  def add_composite_primary_key(columns, opts)
541
632
  @operations << {:op => :add_constraint, :type => :primary_key, :columns => columns}.merge!(opts)
633
+ nil
542
634
  end
543
635
 
544
636
  # Add a composite foreign key constraint
545
637
  def add_composite_foreign_key(columns, table, opts)
546
638
  @operations << {:op => :add_constraint, :type => :foreign_key, :columns => columns, :table => table}.merge!(opts)
639
+ nil
547
640
  end
548
641
 
549
642
  # Drop a composite foreign key constraint
550
643
  def drop_composite_foreign_key(columns, opts)
551
- @operations << {:op => :drop_constraint, :type => :foreign_key, :columns => columns}.merge!(opts)
644
+ @operations << opts.merge(:op => :drop_constraint, :type => :foreign_key, :columns => columns)
645
+ nil
552
646
  end
553
647
  end
554
648
  end