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
@@ -7,32 +7,19 @@ module Sequel
7
7
  # These methods execute code on the database that modifies the database's schema.
8
8
  # ---------------------
9
9
 
10
- AUTOINCREMENT = 'AUTOINCREMENT'.freeze
11
- COMMA_SEPARATOR = ', '.freeze
12
- NOT_NULL = ' NOT NULL'.freeze
13
- NULL = ' NULL'.freeze
14
- PRIMARY_KEY = ' PRIMARY KEY'.freeze
15
- TEMPORARY = 'TEMPORARY '.freeze
16
- UNDERSCORE = '_'.freeze
17
- UNIQUE = ' UNIQUE'.freeze
18
- UNSIGNED = ' UNSIGNED'.freeze
19
-
20
10
  # The order of column modifiers to use when defining a column.
21
- COLUMN_DEFINITION_ORDER = [:collate, :default, :null, :unique, :primary_key, :auto_increment, :references]
22
-
23
- # The default options for join table columns.
24
- DEFAULT_JOIN_TABLE_COLUMN_OPTIONS = {:null=>false}
11
+ COLUMN_DEFINITION_ORDER = [:collate, :default, :null, :unique, :primary_key, :auto_increment, :references].freeze
25
12
 
26
13
  # The alter table operations that are combinable.
27
14
  COMBINABLE_ALTER_TABLE_OPS = [:add_column, :drop_column, :rename_column,
28
15
  :set_column_type, :set_column_default, :set_column_null,
29
- :add_constraint, :drop_constraint]
16
+ :add_constraint, :drop_constraint].freeze
30
17
 
31
18
  # Adds a column to the specified table. This method expects a column name,
32
19
  # a datatype and optionally a hash with additional constraints and options:
33
20
  #
34
- # DB.add_column :items, :name, :text, :unique => true, :null => false
35
- # DB.add_column :items, :category, :text, :default => 'ruby'
21
+ # DB.add_column :items, :name, String, unique: true, null: false
22
+ # DB.add_column :items, :category, String, default: 'ruby'
36
23
  #
37
24
  # See <tt>alter_table</tt>.
38
25
  def add_column(table, *args)
@@ -42,9 +29,10 @@ module Sequel
42
29
  # Adds an index to a table for the given columns:
43
30
  #
44
31
  # DB.add_index :posts, :title
45
- # DB.add_index :posts, [:author, :title], :unique => true
32
+ # DB.add_index :posts, [:author, :title], unique: true
46
33
  #
47
34
  # Options:
35
+ #
48
36
  # :ignore_errors :: Ignore any DatabaseErrors that are raised
49
37
  # :name :: Name to use for index instead of default
50
38
  #
@@ -56,16 +44,17 @@ module Sequel
56
44
  rescue DatabaseError
57
45
  raise unless e
58
46
  end
47
+ nil
59
48
  end
60
49
 
61
50
  # Alters the given table with the specified block. Example:
62
51
  #
63
52
  # DB.alter_table :items do
64
- # add_column :category, :text, :default => 'ruby'
53
+ # add_column :category, String, default: 'ruby'
65
54
  # drop_column :category
66
55
  # rename_column :cntr, :counter
67
- # set_column_type :value, :float
68
- # set_column_default :value, :float
56
+ # set_column_type :value, Float
57
+ # set_column_default :value, 4.2
69
58
  # add_index [:group, :category]
70
59
  # drop_index [:group, :category]
71
60
  # end
@@ -74,9 +63,9 @@ module Sequel
74
63
  # definitions using <tt>create_table</tt>, and +add_index+ accepts all the options
75
64
  # available for index definition.
76
65
  #
77
- # See <tt>Schema::AlterTableGenerator</tt> and the {"Migrations and Schema Modification" guide}[rdoc-ref:doc/migration.rdoc].
78
- def alter_table(name, generator=nil, &block)
79
- generator ||= alter_table_generator(&block)
66
+ # See <tt>Schema::AlterTableGenerator</tt> and the {Migrations guide}[rdoc-ref:doc/migration.rdoc].
67
+ def alter_table(name, &block)
68
+ generator = alter_table_generator(&block)
80
69
  remove_cached_schema(name)
81
70
  apply_alter_table_generator(name, generator)
82
71
  nil
@@ -91,7 +80,7 @@ module Sequel
91
80
  # Create a join table using a hash of foreign keys to referenced
92
81
  # table names. Example:
93
82
  #
94
- # create_join_table(:cat_id=>:cats, :dog_id=>:dogs)
83
+ # create_join_table(cat_id: :cats, dog_id: :dogs)
95
84
  # # CREATE TABLE cats_dogs (
96
85
  # # cat_id integer NOT NULL REFERENCES cats,
97
86
  # # dog_id integer NOT NULL REFERENCES dogs,
@@ -104,15 +93,22 @@ module Sequel
104
93
  # key ensures that entries in the table are unique, which is the typical
105
94
  # desire for a join table.
106
95
  #
96
+ # The default table name this will create is the sorted version of the two
97
+ # hash values, joined by an underscore. So the following two method calls
98
+ # create the same table:
99
+ #
100
+ # create_join_table(cat_id: :cats, dog_id: :dogs) # cats_dogs
101
+ # create_join_table(dog_id: :dogs, cat_id: :cats) # cats_dogs
102
+ #
107
103
  # You can provide column options by making the values in the hash
108
104
  # be option hashes, so long as the option hashes have a :table
109
105
  # entry giving the table referenced:
110
106
  #
111
- # create_join_table(:cat_id=>{:table=>:cats, :type=>:Bignum}, :dog_id=>:dogs)
107
+ # create_join_table(cat_id: {table: :cats, type: :Bignum}, dog_id: :dogs)
112
108
  #
113
109
  # You can provide a second argument which is a table options hash:
114
110
  #
115
- # create_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :temp=>true)
111
+ # create_join_table({cat_id: :cats, dog_id: :dogs}, temp: true)
116
112
  #
117
113
  # Some table options are handled specially:
118
114
  #
@@ -121,19 +117,20 @@ module Sequel
121
117
  # :no_index :: Set to true not to create the second index.
122
118
  # :no_primary_key :: Set to true to not create the primary key.
123
119
  def create_join_table(hash, options=OPTS)
124
- keys = hash.keys.sort_by(&:to_s)
120
+ keys = hash.keys.sort
125
121
  create_table(join_table_name(hash, options), options) do
126
122
  keys.each do |key|
127
123
  v = hash[key]
128
124
  unless v.is_a?(Hash)
129
125
  v = {:table=>v}
130
126
  end
131
- v = DEFAULT_JOIN_TABLE_COLUMN_OPTIONS.merge(v)
127
+ v[:null] = false unless v.has_key?(:null)
132
128
  foreign_key(key, v)
133
129
  end
134
130
  primary_key(keys) unless options[:no_primary_key]
135
- index(keys.reverse, options[:index_options] || {}) unless options[:no_index]
131
+ index(keys.reverse, options[:index_options] || OPTS) unless options[:no_index]
136
132
  end
133
+ nil
137
134
  end
138
135
 
139
136
  # Forcibly create a join table, attempting to drop it if it already exists, then creating it.
@@ -155,7 +152,7 @@ module Sequel
155
152
  #
156
153
  # DB.create_table :posts do
157
154
  # primary_key :id
158
- # column :title, :text
155
+ # column :title, String
159
156
  # String :content
160
157
  # index :title
161
158
  # end
@@ -184,11 +181,20 @@ module Sequel
184
181
  # where keys are option names and values are option values. Note
185
182
  # that option names are unquoted, so you should not use untrusted
186
183
  # keys.
184
+ # :tablespace :: The tablespace to use for the table.
185
+ #
186
+ # SQLite specific options:
187
+ # :strict :: Create a STRICT table, which checks that the values for the columns
188
+ # are the correct type (similar to all other SQL databases). Note that
189
+ # when using this option, all column types used should be one of the
190
+ # following: +int+, +integer+, +real+, +text+, +blob+, and +any+.
191
+ # The +any+ type is treated like a SQLite column in a non-strict table,
192
+ # allowing any type of data to be stored. This option is supported on
193
+ # SQLite 3.37.0+.
187
194
  #
188
- # See <tt>Schema::Generator</tt> and the {"Schema Modification" guide}[rdoc-ref:doc/schema_modification.rdoc].
195
+ # See <tt>Schema::CreateTableGenerator</tt> and the {"Schema Modification" guide}[rdoc-ref:doc/schema_modification.rdoc].
189
196
  def create_table(name, options=OPTS, &block)
190
197
  remove_cached_schema(name)
191
- options = {:generator=>options} if options.is_a?(Schema::CreateTableGenerator)
192
198
  if sql = options[:as]
193
199
  raise(Error, "can't provide both :as option and block to create_table") if block
194
200
  create_table_as(name, sql, options)
@@ -196,8 +202,8 @@ module Sequel
196
202
  generator = options[:generator] || create_table_generator(&block)
197
203
  create_table_from_generator(name, generator, options)
198
204
  create_table_indexes_from_generator(name, generator, options)
199
- nil
200
205
  end
206
+ nil
201
207
  end
202
208
 
203
209
  # Forcibly create a table, attempting to drop it if it already exists, then creating it.
@@ -235,7 +241,7 @@ module Sequel
235
241
  # Creates a view, replacing a view with the same name if one already exists.
236
242
  #
237
243
  # DB.create_or_replace_view(:some_items, "SELECT * FROM items WHERE price < 100")
238
- # DB.create_or_replace_view(:some_items, DB[:items].filter(:category => 'ruby'))
244
+ # DB.create_or_replace_view(:some_items, DB[:items].where(category: 'ruby'))
239
245
  #
240
246
  # For databases where replacing a view is not natively supported, support
241
247
  # is emulated by dropping a view with the same name before creating the view.
@@ -243,10 +249,11 @@ module Sequel
243
249
  if supports_create_or_replace_view?
244
250
  options = options.merge(:replace=>true)
245
251
  else
246
- drop_view(name) rescue nil
252
+ swallow_database_error{drop_view(name)}
247
253
  end
248
254
 
249
255
  create_view(name, source, options)
256
+ nil
250
257
  end
251
258
 
252
259
  # Creates a view based on a dataset or an SQL string:
@@ -255,15 +262,19 @@ module Sequel
255
262
  # # CREATE VIEW cheap_items AS
256
263
  # # SELECT * FROM items WHERE price < 100
257
264
  #
258
- # DB.create_view(:ruby_items, DB[:items].where(:category => 'ruby'))
265
+ # DB.create_view(:ruby_items, DB[:items].where(category: 'ruby'))
259
266
  # # CREATE VIEW ruby_items AS
260
267
  # # SELECT * FROM items WHERE (category = 'ruby')
261
268
  #
262
- # DB.create_view(:checked_items, DB[:items].where(:foo), :check=>true)
269
+ # DB.create_view(:checked_items, DB[:items].where(:foo), check: true)
263
270
  # # CREATE VIEW checked_items AS
264
271
  # # SELECT * FROM items WHERE foo
265
272
  # # WITH CHECK OPTION
266
273
  #
274
+ # DB.create_view(:bar_items, DB[:items].select(:foo), columns: [:bar])
275
+ # # CREATE VIEW bar_items (bar) AS
276
+ # # SELECT foo FROM items
277
+ #
267
278
  # Options:
268
279
  # :columns :: The column names to use for the view. If not given,
269
280
  # automatically determined based on the input dataset.
@@ -283,7 +294,11 @@ module Sequel
283
294
  # option. Since a recursive view requires a union that isn't
284
295
  # in a subquery, if you are providing a Dataset as the source
285
296
  # argument, if should probably call the union method with the
286
- # :all=>true and :from_self=>false options.
297
+ # all: true and from_self: false options.
298
+ # :security_invoker :: Set the security_invoker property on the view, making
299
+ # the access to the view use the current user's permissions,
300
+ # instead of the view owner's permissions.
301
+ # :tablespace :: The tablespace to use for materialized views.
287
302
  def create_view(name, source, options = OPTS)
288
303
  execute_ddl(create_view_sql(name, source, options))
289
304
  remove_cached_schema(name)
@@ -299,7 +314,7 @@ module Sequel
299
314
  alter_table(table) {drop_column(*args)}
300
315
  end
301
316
 
302
- # Removes an index for the given table and column/s:
317
+ # Removes an index for the given table and column(s):
303
318
  #
304
319
  # DB.drop_index :posts, :title
305
320
  # DB.drop_index :posts, [:author, :title]
@@ -312,7 +327,7 @@ module Sequel
312
327
  # Drop the join table that would have been created with the
313
328
  # same arguments to create_join_table:
314
329
  #
315
- # drop_join_table(:cat_id=>:cats, :dog_id=>:dogs)
330
+ # drop_join_table(cat_id: :cats, dog_id: :dogs)
316
331
  # # DROP TABLE cats_dogs
317
332
  def drop_join_table(hash, options=OPTS)
318
333
  drop_table(join_table_name(hash, options), options)
@@ -322,9 +337,9 @@ module Sequel
322
337
  #
323
338
  # DB.drop_table(:posts) # DROP TABLE posts
324
339
  # DB.drop_table(:posts, :comments)
325
- # DB.drop_table(:posts, :comments, :cascade=>true)
340
+ # DB.drop_table(:posts, :comments, cascade: true)
326
341
  def drop_table(*names)
327
- options = names.last.is_a?(Hash) ? names.pop : {}
342
+ options = names.last.is_a?(Hash) ? names.pop : OPTS
328
343
  names.each do |n|
329
344
  execute_ddl(drop_table_sql(n, options))
330
345
  remove_cached_schema(n)
@@ -339,7 +354,7 @@ module Sequel
339
354
  # # SELECT NULL FROM a LIMIT 1 -- check existence
340
355
  # # DROP TABLE a -- if it already exists
341
356
  def drop_table?(*names)
342
- options = names.last.is_a?(Hash) ? names.pop : {}
357
+ options = names.last.is_a?(Hash) ? names.pop : OPTS
343
358
  if supports_drop_table_if_exists?
344
359
  options = options.merge(:if_exists=>true)
345
360
  names.each do |name|
@@ -350,14 +365,15 @@ module Sequel
350
365
  drop_table(name, options) if table_exists?(name)
351
366
  end
352
367
  end
368
+ nil
353
369
  end
354
370
 
355
371
  # Drops one or more views corresponding to the given names:
356
372
  #
357
373
  # DB.drop_view(:cheap_items)
358
374
  # DB.drop_view(:cheap_items, :pricey_items)
359
- # DB.drop_view(:cheap_items, :pricey_items, :cascade=>true)
360
- # DB.drop_view(:cheap_items, :pricey_items, :if_exists=>true)
375
+ # DB.drop_view(:cheap_items, :pricey_items, cascade: true)
376
+ # DB.drop_view(:cheap_items, :pricey_items, if_exists: true)
361
377
  #
362
378
  # Options:
363
379
  # :cascade :: Also drop objects depending on this view.
@@ -366,7 +382,7 @@ module Sequel
366
382
  # PostgreSQL specific options:
367
383
  # :materialized :: Drop a materialized view.
368
384
  def drop_view(*names)
369
- options = names.last.is_a?(Hash) ? names.pop : {}
385
+ options = names.last.is_a?(Hash) ? names.pop : OPTS
370
386
  names.each do |n|
371
387
  execute_ddl(drop_view_sql(n, options))
372
388
  remove_cached_schema(n)
@@ -422,7 +438,15 @@ module Sequel
422
438
 
423
439
  # Apply the operations in the given generator to the table given by name.
424
440
  def apply_alter_table_generator(name, generator)
425
- apply_alter_table(name, generator.operations)
441
+ ops = generator.operations
442
+
443
+ unless can_add_primary_key_constraint_on_nullable_columns?
444
+ if add_pk = ops.find{|op| op[:op] == :add_constraint && op[:type] == :primary_key}
445
+ ops = add_pk[:columns].map{|column| {:op => :set_column_null, :name => column, :null => false}} + ops
446
+ end
447
+ end
448
+
449
+ apply_alter_table(name, ops)
426
450
  end
427
451
 
428
452
  # The class used for alter_table generators.
@@ -434,6 +458,7 @@ module Sequel
434
458
  def alter_table_op_sql(table, op)
435
459
  meth = "alter_table_#{op[:op]}_sql"
436
460
  if respond_to?(meth, true)
461
+ # Allow calling private methods as alter table op sql methods are private
437
462
  send(meth, table, op)
438
463
  else
439
464
  raise Error, "Unsupported ALTER TABLE operation: #{op[:op]}"
@@ -476,7 +501,7 @@ module Sequel
476
501
  "DROP CONSTRAINT #{quoted_name}#{' CASCADE' if op[:cascade]}"
477
502
  end
478
503
 
479
- # The SQL to execute to modify the DDL for the given table name. op
504
+ # The SQL to execute to modify the table. op
480
505
  # should be one of the operations returned by the AlterTableGenerator.
481
506
  def alter_table_sql(table, op)
482
507
  case op[:op]
@@ -485,12 +510,14 @@ module Sequel
485
510
  when :drop_index
486
511
  drop_index_sql(table, op)
487
512
  else
488
- "ALTER TABLE #{quote_schema_table(table)} #{alter_table_op_sql(table, op)}"
513
+ if sql = alter_table_op_sql(table, op)
514
+ "ALTER TABLE #{quote_schema_table(table)} #{sql}"
515
+ end
489
516
  end
490
517
  end
491
518
 
492
- # Array of SQL DDL modification statements for the given table,
493
- # corresponding to the DDL changes specified by the operations.
519
+ # Array of SQL statements used to modify the table,
520
+ # corresponding to changes specified by the operations.
494
521
  def alter_table_sql_list(table, operations)
495
522
  if supports_combining_alter_table_ops?
496
523
  grouped_ops = []
@@ -522,15 +549,15 @@ module Sequel
522
549
  # The SQL string specify the autoincrement property, generally used by
523
550
  # primary keys.
524
551
  def auto_increment_sql
525
- AUTOINCREMENT
552
+ 'AUTOINCREMENT'
526
553
  end
527
554
 
528
555
  # The order of the column definition, as an array of symbols.
529
556
  def column_definition_order
530
- self.class.const_get(:COLUMN_DEFINITION_ORDER)
557
+ COLUMN_DEFINITION_ORDER
531
558
  end
532
559
 
533
- # SQL DDL fragment containing the column creation SQL for the given column.
560
+ # SQL fragment containing the column creation SQL for the given column.
534
561
  def column_definition_sql(column)
535
562
  sql = String.new
536
563
  sql << "#{quote_identifier(column[:name])} #{type_literal(column)}"
@@ -558,17 +585,26 @@ module Sequel
558
585
  # Add null/not null SQL fragment to column creation SQL.
559
586
  def column_definition_null_sql(sql, column)
560
587
  null = column.fetch(:null, column[:allow_null])
561
- sql << NOT_NULL if null == false
562
- sql << NULL if null == true
588
+ if null.nil? && !can_add_primary_key_constraint_on_nullable_columns? && column[:primary_key]
589
+ null = false
590
+ end
591
+
592
+ case null
593
+ when false
594
+ sql << ' NOT NULL'
595
+ when true
596
+ sql << ' NULL'
597
+ end
563
598
  end
564
-
599
+
565
600
  # Add primary key SQL fragment to column creation SQL.
566
601
  def column_definition_primary_key_sql(sql, column)
567
602
  if column[:primary_key]
568
603
  if name = column[:primary_key_constraint_name]
569
604
  sql << " CONSTRAINT #{quote_identifier(name)}"
570
605
  end
571
- sql << PRIMARY_KEY
606
+ sql << " " << primary_key_constraint_sql_fragment(column)
607
+ constraint_deferrable_sql_append(sql, column[:primary_key_deferrable])
572
608
  end
573
609
  end
574
610
 
@@ -588,43 +624,43 @@ module Sequel
588
624
  if name = column[:unique_constraint_name]
589
625
  sql << " CONSTRAINT #{quote_identifier(name)}"
590
626
  end
591
- sql << UNIQUE
627
+ sql << ' ' << unique_constraint_sql_fragment(column)
628
+ constraint_deferrable_sql_append(sql, column[:unique_deferrable])
592
629
  end
593
630
  end
594
631
 
595
632
  # SQL for all given columns, used inside a CREATE TABLE block.
596
633
  def column_list_sql(generator)
597
- (generator.columns.map{|c| column_definition_sql(c)} + generator.constraints.map{|c| constraint_definition_sql(c)}).join(COMMA_SEPARATOR)
634
+ (generator.columns.map{|c| column_definition_sql(c)} + generator.constraints.map{|c| constraint_definition_sql(c)}).join(', ')
598
635
  end
599
636
 
600
- # SQL DDL fragment for column foreign key references (column constraints)
637
+ # SQL fragment for column foreign key references (column constraints)
601
638
  def column_references_column_constraint_sql(column)
602
639
  column_references_sql(column)
603
640
  end
604
641
 
605
- # SQL DDL fragment for column foreign key references
642
+ # SQL fragment for column foreign key references
606
643
  def column_references_sql(column)
607
644
  sql = String.new
608
645
  sql << " REFERENCES #{quote_schema_table(column[:table])}"
609
- sql << "(#{Array(column[:key]).map{|x| quote_identifier(x)}.join(COMMA_SEPARATOR)})" if column[:key]
646
+ sql << "(#{Array(column[:key]).map{|x| quote_identifier(x)}.join(', ')})" if column[:key]
610
647
  sql << " ON DELETE #{on_delete_clause(column[:on_delete])}" if column[:on_delete]
611
648
  sql << " ON UPDATE #{on_update_clause(column[:on_update])}" if column[:on_update]
612
649
  constraint_deferrable_sql_append(sql, column[:deferrable])
613
650
  sql
614
651
  end
615
652
 
616
- # SQL DDL fragment for table foreign key references (table constraints)
653
+ # SQL fragment for table foreign key references (table constraints)
617
654
  def column_references_table_constraint_sql(constraint)
618
655
  "FOREIGN KEY #{literal(constraint[:columns])}#{column_references_sql(constraint)}"
619
656
  end
620
657
 
621
658
  # Whether the given alter table operation is combinable.
622
659
  def combinable_alter_table_op?(op)
623
- # Use a dynamic lookup for easier overriding in adapters
624
660
  COMBINABLE_ALTER_TABLE_OPS.include?(op[:op])
625
661
  end
626
662
 
627
- # SQL DDL fragment specifying a constraint on a table.
663
+ # SQL fragment specifying a constraint on a table.
628
664
  def constraint_definition_sql(constraint)
629
665
  sql = String.new
630
666
  sql << "CONSTRAINT #{quote_identifier(constraint[:name])} " if constraint[:name]
@@ -636,11 +672,11 @@ module Sequel
636
672
  check = "(#{check})" unless check[0..0] == '(' && check[-1..-1] == ')'
637
673
  sql << "CHECK #{check}"
638
674
  when :primary_key
639
- sql << "PRIMARY KEY #{literal(constraint[:columns])}"
675
+ sql << "#{primary_key_constraint_sql_fragment(constraint)} #{literal(constraint[:columns])}"
640
676
  when :foreign_key
641
677
  sql << column_references_table_constraint_sql(constraint.merge(:deferrable=>nil))
642
678
  when :unique
643
- sql << "UNIQUE #{literal(constraint[:columns])}"
679
+ sql << "#{unique_constraint_sql_fragment(constraint)} #{literal(constraint[:columns])}"
644
680
  else
645
681
  raise Error, "Invalid constraint type #{constraint[:type]}, should be :check, :primary_key, :foreign_key, or :unique"
646
682
  end
@@ -648,7 +684,7 @@ module Sequel
648
684
  sql
649
685
  end
650
686
 
651
- # SQL DDL fragment specifying the deferrable constraint attributes.
687
+ # SQL fragment specifying the deferrable constraint attributes.
652
688
  def constraint_deferrable_sql_append(sql, defer)
653
689
  case defer
654
690
  when nil
@@ -676,14 +712,15 @@ module Sequel
676
712
  e = options[:ignore_index_errors] || options[:if_not_exists]
677
713
  generator.indexes.each do |index|
678
714
  begin
679
- index_sql_list(name, [index]).each{|sql| execute_ddl(sql)}
715
+ pr = proc{index_sql_list(name, [index]).each{|sql| execute_ddl(sql)}}
716
+ supports_transactional_ddl? ? transaction(:savepoint=>:only, &pr) : pr.call
680
717
  rescue Error
681
718
  raise unless e
682
719
  end
683
720
  end
684
721
  end
685
722
 
686
- # DDL statement for creating a table with the given name, columns, and options
723
+ # SQL statement for creating a table with the given name, columns, and options
687
724
  def create_table_sql(name, generator, options)
688
725
  unless supports_named_column_constraints?
689
726
  # Split column constraints into table constraints if they have a name
@@ -702,33 +739,44 @@ module Sequel
702
739
  end
703
740
  end
704
741
  end
742
+
743
+ unless can_add_primary_key_constraint_on_nullable_columns?
744
+ if pk = generator.constraints.find{|op| op[:type] == :primary_key}
745
+ pk[:columns].each do |column|
746
+ if matched_column = generator.columns.find{|gc| gc[:name] == column}
747
+ matched_column[:null] = false
748
+ end
749
+ end
750
+ end
751
+ end
752
+
705
753
  "#{create_table_prefix_sql(name, options)} (#{column_list_sql(generator)})"
706
754
  end
707
755
 
708
- # Run a command to create the table with the given name from the given
756
+ # Run SQL statement to create the table with the given name from the given
709
757
  # SELECT sql statement.
710
758
  def create_table_as(name, sql, options)
711
759
  sql = sql.sql if sql.is_a?(Sequel::Dataset)
712
760
  run(create_table_as_sql(name, sql, options))
713
761
  end
714
762
 
715
- # DDL statement for creating a table from the result of a SELECT statement.
763
+ # SQL statement for creating a table from the result of a SELECT statement.
716
764
  # +sql+ should be a string representing a SELECT query.
717
765
  def create_table_as_sql(name, sql, options)
718
766
  "#{create_table_prefix_sql(name, options)} AS #{sql}"
719
767
  end
720
768
 
721
- # DDL fragment for initial part of CREATE TABLE statement
769
+ # SQL fragment for initial part of CREATE TABLE statement
722
770
  def create_table_prefix_sql(name, options)
723
771
  "CREATE #{temporary_table_sql if options[:temp]}TABLE#{' IF NOT EXISTS' if options[:if_not_exists]} #{options[:temp] ? quote_identifier(name) : quote_schema_table(name)}"
724
772
  end
725
773
 
726
- # DDL fragment for initial part of CREATE VIEW statement
774
+ # SQL fragment for initial part of CREATE VIEW statement
727
775
  def create_view_prefix_sql(name, options)
728
776
  create_view_sql_append_columns("CREATE #{'OR REPLACE 'if options[:replace]}VIEW #{quote_schema_table(name)}", options[:columns])
729
777
  end
730
778
 
731
- # DDL statement for creating a view.
779
+ # SQL statement for creating a view.
732
780
  def create_view_sql(name, source, options)
733
781
  source = source.sql if source.is_a?(Dataset)
734
782
  sql = String.new
@@ -741,9 +789,8 @@ module Sequel
741
789
 
742
790
  # Append the column list to the SQL, if a column list is given.
743
791
  def create_view_sql_append_columns(sql, columns)
744
- sql = sql.dup
745
792
  if columns
746
- sql << ' ('
793
+ sql += ' ('
747
794
  schema_utility_dataset.send(:identifier_list_append, sql, columns)
748
795
  sql << ')'
749
796
  end
@@ -754,7 +801,7 @@ module Sequel
754
801
  # for certain databases.
755
802
  def default_index_name(table_name, columns)
756
803
  schema, table = schema_and_table(table_name)
757
- "#{"#{schema}_" if schema}#{table}_#{columns.map{|c| [String, Symbol].any?{|cl| c.is_a?(cl)} ? c : literal(c).gsub(/\W/, '_')}.join(UNDERSCORE)}_index"
804
+ "#{"#{schema}_" if schema}#{table}_#{columns.map{|c| [String, Symbol].any?{|cl| c.is_a?(cl)} ? c : literal(c).gsub(/\W/, '_')}.join('_')}_index"
758
805
  end
759
806
 
760
807
  # Get foreign key name for given table and columns.
@@ -780,11 +827,25 @@ module Sequel
780
827
  end
781
828
 
782
829
  # Proxy the filter_expr call to the dataset, used for creating constraints.
783
- def filter_expr(*args, &block)
784
- schema_utility_dataset.literal(schema_utility_dataset.send(:filter_expr, *args, &block))
830
+ # Support passing Proc arguments as blocks, as well as treating plain strings
831
+ # as literal strings, so that previous migrations that used this API do not break.
832
+ def filter_expr(arg=nil, &block)
833
+ if arg.is_a?(Proc) && !block
834
+ block = arg
835
+ arg = nil
836
+ elsif arg.is_a?(String)
837
+ arg = Sequel.lit(arg)
838
+ elsif arg.is_a?(Array)
839
+ if arg.first.is_a?(String)
840
+ arg = Sequel.lit(*arg)
841
+ elsif arg.length > 1
842
+ arg = Sequel.&(*arg)
843
+ end
844
+ end
845
+ schema_utility_dataset.literal(schema_utility_dataset.send(:filter_expr, arg, &block))
785
846
  end
786
847
 
787
- # SQL DDL statement for creating an index for the table with the given name
848
+ # SQL statement for creating an index for the table with the given name
788
849
  # and index specifications.
789
850
  def index_definition_sql(table_name, index)
790
851
  index_name = index[:name] || default_index_name(table_name, index[:columns])
@@ -793,7 +854,7 @@ module Sequel
793
854
  "CREATE #{'UNIQUE ' if index[:unique]}INDEX #{quote_identifier(index_name)} ON #{quote_schema_table(table_name)} #{literal(index[:columns])}#{" WHERE #{filter_expr(index[:where])}" if index[:where]}"
794
855
  end
795
856
 
796
- # Array of SQL DDL statements, one for each index specification,
857
+ # Array of SQL statements, one for each index specification,
797
858
  # for the given table.
798
859
  def index_sql_list(table_name, indexes)
799
860
  indexes.map{|i| index_definition_sql(table_name, i)}
@@ -825,7 +886,7 @@ module Sequel
825
886
  end
826
887
  end
827
888
 
828
- # SQL DDL ON DELETE fragment to use, based on the given action.
889
+ # SQL fragment to use for ON DELETE, based on the given action.
829
890
  # The following actions are recognized:
830
891
  #
831
892
  # :cascade :: Delete rows referencing this row.
@@ -847,12 +908,17 @@ module Sequel
847
908
  on_delete_clause(action)
848
909
  end
849
910
 
911
+ # Add fragment for primary key specification, separated for easier overridding.
912
+ def primary_key_constraint_sql_fragment(_)
913
+ 'PRIMARY KEY'
914
+ end
915
+
850
916
  # Proxy the quote_schema_table method to the dataset
851
917
  def quote_schema_table(table)
852
918
  schema_utility_dataset.quote_schema_table(table)
853
919
  end
854
920
 
855
- # SQL DDL statement for renaming a table.
921
+ # SQL statement for renaming a table.
856
922
  def rename_table_sql(name, new_name)
857
923
  "ALTER TABLE #{quote_schema_table(name)} RENAME TO #{quote_schema_table(new_name)}"
858
924
  end
@@ -877,9 +943,9 @@ module Sequel
877
943
  schema_utility_dataset.split_qualifiers(table_name)
878
944
  end
879
945
 
880
- # SQL DDL fragment for temporary table
946
+ # SQL fragment for temporary table
881
947
  def temporary_table_sql
882
- self.class.const_get(:TEMPORARY)
948
+ 'TEMPORARY '
883
949
  end
884
950
 
885
951
  # SQL fragment specifying the type of a given column.
@@ -899,6 +965,7 @@ module Sequel
899
965
  def type_literal_generic(column)
900
966
  meth = "type_literal_generic_#{column[:type].name.to_s.downcase}"
901
967
  if respond_to?(meth, true)
968
+ # Allow calling private methods as per type literal generic methods are private
902
969
  send(meth, column)
903
970
  else
904
971
  raise Error, "Unsupported ruby class used as database type: #{column[:type]}"
@@ -910,12 +977,6 @@ module Sequel
910
977
  type_literal_generic_numeric(column)
911
978
  end
912
979
 
913
- # Sequel uses the bigint type by default for Bignums.
914
- def type_literal_generic_bignum(column)
915
- Sequel::Deprecation.deprecate("Using the Bignum class as a generic type is deprecated and will be removed in Sequel 4.41.0, as the behavior will change in ruby 2.4. Switch to using the :Bignum symbol.")
916
- type_literal_generic_bignum_symbol(column)
917
- end
918
-
919
980
  # Sequel uses the bigint type by default for :Bignum symbol.
920
981
  def type_literal_generic_bignum_symbol(column)
921
982
  :bigint
@@ -980,7 +1041,16 @@ module Sequel
980
1041
  # Sequel uses the timestamp type by default for Time values.
981
1042
  # If the :only_time option is used, the time type is used.
982
1043
  def type_literal_generic_time(column)
983
- column[:only_time] ? :time : :timestamp
1044
+ if column[:only_time]
1045
+ type_literal_generic_only_time(column)
1046
+ else
1047
+ type_literal_generic_datetime(column)
1048
+ end
1049
+ end
1050
+
1051
+ # Use time by default for Time values if :only_time option is used.
1052
+ def type_literal_generic_only_time(column)
1053
+ :time
984
1054
  end
985
1055
 
986
1056
  # Sequel uses the boolean type by default for TrueClass and FalseClass.
@@ -995,10 +1065,15 @@ module Sequel
995
1065
  type = "double precision" if type.to_s == 'double'
996
1066
  column[:size] ||= default_string_column_size if type.to_s == 'varchar'
997
1067
  elements = column[:size] || column[:elements]
998
- "#{type}#{literal(Array(elements)) if elements}#{UNSIGNED if column[:unsigned]}"
1068
+ "#{type}#{literal(Array(elements)) if elements}#{' UNSIGNED' if column[:unsigned]}"
999
1069
  end
1000
1070
 
1001
- # Whether clob should be used for String :text=>true columns.
1071
+ # Add fragment for unique specification, separated for easier overridding.
1072
+ def unique_constraint_sql_fragment(_)
1073
+ 'UNIQUE'
1074
+ end
1075
+
1076
+ # Whether clob should be used for String text: true columns.
1002
1077
  def uses_clob_for_text?
1003
1078
  false
1004
1079
  end