sequel 4.26.0 → 5.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (692) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +405 -5656
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +232 -157
  5. data/bin/sequel +32 -9
  6. data/doc/advanced_associations.rdoc +252 -188
  7. data/doc/association_basics.rdoc +231 -273
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +75 -48
  10. data/doc/code_order.rdoc +28 -10
  11. data/doc/core_extensions.rdoc +104 -63
  12. data/doc/dataset_basics.rdoc +12 -21
  13. data/doc/dataset_filtering.rdoc +99 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/mass_assignment.rdoc +74 -31
  16. data/doc/migration.rdoc +72 -46
  17. data/doc/model_dataset_method_design.rdoc +129 -0
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +12 -12
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +59 -69
  22. data/doc/opening_databases.rdoc +84 -94
  23. data/doc/postgresql.rdoc +268 -38
  24. data/doc/prepared_statements.rdoc +29 -24
  25. data/doc/querying.rdoc +184 -164
  26. data/doc/reflection.rdoc +5 -6
  27. data/doc/release_notes/5.0.0.txt +159 -0
  28. data/doc/release_notes/5.1.0.txt +31 -0
  29. data/doc/release_notes/5.10.0.txt +84 -0
  30. data/doc/release_notes/5.11.0.txt +83 -0
  31. data/doc/release_notes/5.12.0.txt +141 -0
  32. data/doc/release_notes/5.13.0.txt +27 -0
  33. data/doc/release_notes/5.14.0.txt +63 -0
  34. data/doc/release_notes/5.15.0.txt +39 -0
  35. data/doc/release_notes/5.16.0.txt +110 -0
  36. data/doc/release_notes/5.17.0.txt +31 -0
  37. data/doc/release_notes/5.18.0.txt +69 -0
  38. data/doc/release_notes/5.19.0.txt +28 -0
  39. data/doc/release_notes/5.2.0.txt +33 -0
  40. data/doc/release_notes/5.20.0.txt +89 -0
  41. data/doc/release_notes/5.21.0.txt +87 -0
  42. data/doc/release_notes/5.22.0.txt +48 -0
  43. data/doc/release_notes/5.23.0.txt +56 -0
  44. data/doc/release_notes/5.24.0.txt +56 -0
  45. data/doc/release_notes/5.25.0.txt +32 -0
  46. data/doc/release_notes/5.26.0.txt +35 -0
  47. data/doc/release_notes/5.27.0.txt +21 -0
  48. data/doc/release_notes/5.28.0.txt +16 -0
  49. data/doc/release_notes/5.29.0.txt +22 -0
  50. data/doc/release_notes/5.3.0.txt +121 -0
  51. data/doc/release_notes/5.30.0.txt +20 -0
  52. data/doc/release_notes/5.31.0.txt +148 -0
  53. data/doc/release_notes/5.32.0.txt +46 -0
  54. data/doc/release_notes/5.33.0.txt +24 -0
  55. data/doc/release_notes/5.34.0.txt +40 -0
  56. data/doc/release_notes/5.35.0.txt +56 -0
  57. data/doc/release_notes/5.36.0.txt +60 -0
  58. data/doc/release_notes/5.37.0.txt +30 -0
  59. data/doc/release_notes/5.4.0.txt +80 -0
  60. data/doc/release_notes/5.5.0.txt +61 -0
  61. data/doc/release_notes/5.6.0.txt +31 -0
  62. data/doc/release_notes/5.7.0.txt +108 -0
  63. data/doc/release_notes/5.8.0.txt +170 -0
  64. data/doc/release_notes/5.9.0.txt +99 -0
  65. data/doc/schema_modification.rdoc +102 -77
  66. data/doc/security.rdoc +160 -87
  67. data/doc/sharding.rdoc +74 -47
  68. data/doc/sql.rdoc +135 -122
  69. data/doc/testing.rdoc +34 -18
  70. data/doc/thread_safety.rdoc +2 -4
  71. data/doc/transactions.rdoc +101 -19
  72. data/doc/validations.rdoc +64 -51
  73. data/doc/virtual_rows.rdoc +90 -109
  74. data/lib/sequel.rb +3 -1
  75. data/lib/sequel/adapters/ado.rb +154 -22
  76. data/lib/sequel/adapters/ado/access.rb +21 -21
  77. data/lib/sequel/adapters/ado/mssql.rb +8 -15
  78. data/lib/sequel/adapters/amalgalite.rb +17 -25
  79. data/lib/sequel/adapters/ibmdb.rb +52 -58
  80. data/lib/sequel/adapters/jdbc.rb +149 -127
  81. data/lib/sequel/adapters/jdbc/db2.rb +32 -40
  82. data/lib/sequel/adapters/jdbc/derby.rb +56 -58
  83. data/lib/sequel/adapters/jdbc/h2.rb +40 -30
  84. data/lib/sequel/adapters/jdbc/hsqldb.rb +22 -33
  85. data/lib/sequel/adapters/jdbc/jtds.rb +4 -10
  86. data/lib/sequel/adapters/jdbc/mssql.rb +6 -12
  87. data/lib/sequel/adapters/jdbc/mysql.rb +17 -18
  88. data/lib/sequel/adapters/jdbc/oracle.rb +25 -19
  89. data/lib/sequel/adapters/jdbc/postgresql.rb +90 -69
  90. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +14 -24
  91. data/lib/sequel/adapters/jdbc/sqlite.rb +50 -12
  92. data/lib/sequel/adapters/jdbc/sqlserver.rb +36 -9
  93. data/lib/sequel/adapters/jdbc/transactions.rb +25 -39
  94. data/lib/sequel/adapters/mock.rb +104 -113
  95. data/lib/sequel/adapters/mysql.rb +42 -61
  96. data/lib/sequel/adapters/mysql2.rb +126 -35
  97. data/lib/sequel/adapters/odbc.rb +21 -28
  98. data/lib/sequel/adapters/odbc/db2.rb +3 -1
  99. data/lib/sequel/adapters/odbc/mssql.rb +11 -15
  100. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  101. data/lib/sequel/adapters/oracle.rb +62 -68
  102. data/lib/sequel/adapters/postgres.rb +257 -311
  103. data/lib/sequel/adapters/postgresql.rb +3 -1
  104. data/lib/sequel/adapters/shared/access.rb +75 -79
  105. data/lib/sequel/adapters/shared/db2.rb +96 -74
  106. data/lib/sequel/adapters/shared/mssql.rb +258 -213
  107. data/lib/sequel/adapters/shared/mysql.rb +284 -216
  108. data/lib/sequel/adapters/shared/oracle.rb +175 -60
  109. data/lib/sequel/adapters/shared/postgres.rb +829 -383
  110. data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -127
  111. data/lib/sequel/adapters/shared/sqlite.rb +382 -159
  112. data/lib/sequel/adapters/sqlanywhere.rb +53 -38
  113. data/lib/sequel/adapters/sqlite.rb +111 -105
  114. data/lib/sequel/adapters/tinytds.rb +38 -46
  115. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -9
  116. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +7 -5
  117. data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
  118. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
  119. data/lib/sequel/adapters/utils/replace.rb +3 -4
  120. data/lib/sequel/adapters/utils/split_alter_table.rb +2 -0
  121. data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
  122. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
  123. data/lib/sequel/ast_transformer.rb +13 -89
  124. data/lib/sequel/connection_pool.rb +54 -26
  125. data/lib/sequel/connection_pool/sharded_single.rb +19 -12
  126. data/lib/sequel/connection_pool/sharded_threaded.rb +160 -111
  127. data/lib/sequel/connection_pool/single.rb +21 -12
  128. data/lib/sequel/connection_pool/threaded.rb +137 -119
  129. data/lib/sequel/core.rb +352 -320
  130. data/lib/sequel/database.rb +19 -2
  131. data/lib/sequel/database/connecting.rb +70 -55
  132. data/lib/sequel/database/dataset.rb +15 -5
  133. data/lib/sequel/database/dataset_defaults.rb +20 -102
  134. data/lib/sequel/database/features.rb +20 -4
  135. data/lib/sequel/database/logging.rb +25 -7
  136. data/lib/sequel/database/misc.rb +132 -118
  137. data/lib/sequel/database/query.rb +51 -28
  138. data/lib/sequel/database/schema_generator.rb +188 -75
  139. data/lib/sequel/database/schema_methods.rb +161 -92
  140. data/lib/sequel/database/transactions.rb +260 -58
  141. data/lib/sequel/dataset.rb +28 -12
  142. data/lib/sequel/dataset/actions.rb +354 -170
  143. data/lib/sequel/dataset/dataset_module.rb +46 -0
  144. data/lib/sequel/dataset/features.rb +81 -34
  145. data/lib/sequel/dataset/graph.rb +82 -58
  146. data/lib/sequel/dataset/misc.rb +139 -47
  147. data/lib/sequel/dataset/placeholder_literalizer.rb +66 -26
  148. data/lib/sequel/dataset/prepared_statements.rb +188 -85
  149. data/lib/sequel/dataset/query.rb +428 -214
  150. data/lib/sequel/dataset/sql.rb +446 -339
  151. data/lib/sequel/deprecated.rb +14 -2
  152. data/lib/sequel/exceptions.rb +48 -16
  153. data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
  154. data/lib/sequel/extensions/_model_pg_row.rb +43 -0
  155. data/lib/sequel/extensions/_pretty_table.rb +10 -9
  156. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  157. data/lib/sequel/extensions/arbitrary_servers.rb +15 -11
  158. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  159. data/lib/sequel/extensions/blank.rb +2 -0
  160. data/lib/sequel/extensions/caller_logging.rb +79 -0
  161. data/lib/sequel/extensions/columns_introspection.rb +9 -4
  162. data/lib/sequel/extensions/connection_expiration.rb +99 -0
  163. data/lib/sequel/extensions/connection_validator.rb +26 -13
  164. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  165. data/lib/sequel/extensions/constraint_validations.rb +93 -38
  166. data/lib/sequel/extensions/core_extensions.rb +45 -53
  167. data/lib/sequel/extensions/core_refinements.rb +44 -46
  168. data/lib/sequel/extensions/current_datetime_timestamp.rb +5 -4
  169. data/lib/sequel/extensions/dataset_source_alias.rb +4 -0
  170. data/lib/sequel/extensions/date_arithmetic.rb +42 -16
  171. data/lib/sequel/extensions/datetime_parse_to_time.rb +37 -0
  172. data/lib/sequel/extensions/duplicate_columns_handler.rb +94 -0
  173. data/lib/sequel/extensions/empty_array_consider_nulls.rb +7 -3
  174. data/lib/sequel/extensions/error_sql.rb +7 -3
  175. data/lib/sequel/extensions/escaped_like.rb +100 -0
  176. data/lib/sequel/extensions/eval_inspect.rb +14 -15
  177. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  178. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  179. data/lib/sequel/extensions/freeze_datasets.rb +3 -0
  180. data/lib/sequel/extensions/from_block.rb +2 -31
  181. data/lib/sequel/extensions/graph_each.rb +19 -6
  182. data/lib/sequel/extensions/identifier_mangling.rb +180 -0
  183. data/lib/sequel/extensions/implicit_subquery.rb +48 -0
  184. data/lib/sequel/extensions/index_caching.rb +109 -0
  185. data/lib/sequel/extensions/inflector.rb +8 -4
  186. data/lib/sequel/extensions/integer64.rb +32 -0
  187. data/lib/sequel/extensions/looser_typecasting.rb +19 -9
  188. data/lib/sequel/extensions/migration.rb +132 -80
  189. data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +4 -0
  190. data/lib/sequel/extensions/named_timezones.rb +88 -23
  191. data/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
  192. data/lib/sequel/extensions/null_dataset.rb +12 -8
  193. data/lib/sequel/extensions/pagination.rb +35 -28
  194. data/lib/sequel/extensions/pg_array.rb +227 -316
  195. data/lib/sequel/extensions/pg_array_ops.rb +19 -7
  196. data/lib/sequel/extensions/pg_enum.rb +69 -24
  197. data/lib/sequel/extensions/pg_extended_date_support.rb +250 -0
  198. data/lib/sequel/extensions/pg_hstore.rb +50 -59
  199. data/lib/sequel/extensions/pg_hstore_ops.rb +9 -3
  200. data/lib/sequel/extensions/pg_inet.rb +34 -15
  201. data/lib/sequel/extensions/pg_inet_ops.rb +5 -1
  202. data/lib/sequel/extensions/pg_interval.rb +26 -26
  203. data/lib/sequel/extensions/pg_json.rb +422 -141
  204. data/lib/sequel/extensions/pg_json_ops.rb +248 -9
  205. data/lib/sequel/extensions/pg_loose_count.rb +5 -1
  206. data/lib/sequel/extensions/pg_range.rb +162 -146
  207. data/lib/sequel/extensions/pg_range_ops.rb +10 -5
  208. data/lib/sequel/extensions/pg_row.rb +53 -87
  209. data/lib/sequel/extensions/pg_row_ops.rb +36 -13
  210. data/lib/sequel/extensions/pg_static_cache_updater.rb +6 -2
  211. data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
  212. data/lib/sequel/extensions/pretty_table.rb +4 -0
  213. data/lib/sequel/extensions/query.rb +12 -7
  214. data/lib/sequel/extensions/round_timestamps.rb +6 -9
  215. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  216. data/lib/sequel/extensions/s.rb +59 -0
  217. data/lib/sequel/extensions/schema_caching.rb +14 -1
  218. data/lib/sequel/extensions/schema_dumper.rb +83 -55
  219. data/lib/sequel/extensions/select_remove.rb +8 -4
  220. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
  221. data/lib/sequel/extensions/server_block.rb +50 -17
  222. data/lib/sequel/extensions/server_logging.rb +61 -0
  223. data/lib/sequel/extensions/split_array_nil.rb +8 -4
  224. data/lib/sequel/extensions/sql_comments.rb +96 -0
  225. data/lib/sequel/extensions/sql_expr.rb +4 -1
  226. data/lib/sequel/extensions/string_agg.rb +181 -0
  227. data/lib/sequel/extensions/string_date_time.rb +2 -0
  228. data/lib/sequel/extensions/symbol_aref.rb +53 -0
  229. data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
  230. data/lib/sequel/extensions/symbol_as.rb +23 -0
  231. data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
  232. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  233. data/lib/sequel/extensions/thread_local_timezones.rb +4 -0
  234. data/lib/sequel/extensions/to_dot.rb +15 -5
  235. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  236. data/lib/sequel/model.rb +36 -126
  237. data/lib/sequel/model/associations.rb +850 -257
  238. data/lib/sequel/model/base.rb +652 -764
  239. data/lib/sequel/model/dataset_module.rb +13 -10
  240. data/lib/sequel/model/default_inflections.rb +3 -1
  241. data/lib/sequel/model/errors.rb +3 -3
  242. data/lib/sequel/model/exceptions.rb +12 -12
  243. data/lib/sequel/model/inflections.rb +8 -19
  244. data/lib/sequel/model/plugins.rb +111 -0
  245. data/lib/sequel/plugins/accessed_columns.rb +2 -0
  246. data/lib/sequel/plugins/active_model.rb +32 -7
  247. data/lib/sequel/plugins/after_initialize.rb +3 -1
  248. data/lib/sequel/plugins/association_dependencies.rb +27 -18
  249. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  250. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  251. data/lib/sequel/plugins/association_pks.rb +181 -83
  252. data/lib/sequel/plugins/association_proxies.rb +33 -9
  253. data/lib/sequel/plugins/auto_validations.rb +58 -23
  254. data/lib/sequel/plugins/before_after_save.rb +8 -0
  255. data/lib/sequel/plugins/blacklist_security.rb +23 -12
  256. data/lib/sequel/plugins/boolean_readers.rb +9 -6
  257. data/lib/sequel/plugins/boolean_subsets.rb +64 -0
  258. data/lib/sequel/plugins/caching.rb +27 -16
  259. data/lib/sequel/plugins/class_table_inheritance.rb +192 -94
  260. data/lib/sequel/plugins/column_conflicts.rb +18 -3
  261. data/lib/sequel/plugins/column_select.rb +9 -5
  262. data/lib/sequel/plugins/columns_updated.rb +42 -0
  263. data/lib/sequel/plugins/composition.rb +36 -24
  264. data/lib/sequel/plugins/constraint_validations.rb +37 -16
  265. data/lib/sequel/plugins/csv_serializer.rb +58 -35
  266. data/lib/sequel/plugins/dataset_associations.rb +60 -18
  267. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  268. data/lib/sequel/plugins/defaults_setter.rb +74 -13
  269. data/lib/sequel/plugins/delay_add_association.rb +4 -1
  270. data/lib/sequel/plugins/dirty.rb +65 -24
  271. data/lib/sequel/plugins/eager_each.rb +27 -3
  272. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  273. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  274. data/lib/sequel/plugins/error_splitter.rb +19 -12
  275. data/lib/sequel/plugins/finder.rb +246 -0
  276. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  277. data/lib/sequel/plugins/force_encoding.rb +9 -12
  278. data/lib/sequel/plugins/hook_class_methods.rb +39 -54
  279. data/lib/sequel/plugins/input_transformer.rb +20 -10
  280. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  281. data/lib/sequel/plugins/insert_returning_select.rb +4 -2
  282. data/lib/sequel/plugins/instance_filters.rb +12 -8
  283. data/lib/sequel/plugins/instance_hooks.rb +36 -17
  284. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  285. data/lib/sequel/plugins/inverted_subsets.rb +24 -13
  286. data/lib/sequel/plugins/json_serializer.rb +123 -47
  287. data/lib/sequel/plugins/lazy_attributes.rb +20 -14
  288. data/lib/sequel/plugins/list.rb +40 -26
  289. data/lib/sequel/plugins/many_through_many.rb +28 -12
  290. data/lib/sequel/plugins/modification_detection.rb +17 -5
  291. data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -5
  292. data/lib/sequel/plugins/nested_attributes.rb +55 -28
  293. data/lib/sequel/plugins/optimistic_locking.rb +5 -3
  294. data/lib/sequel/plugins/pg_array_associations.rb +52 -18
  295. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +348 -0
  296. data/lib/sequel/plugins/pg_row.rb +7 -51
  297. data/lib/sequel/plugins/prepared_statements.rb +53 -72
  298. data/lib/sequel/plugins/prepared_statements_safe.rb +13 -5
  299. data/lib/sequel/plugins/rcte_tree.rb +43 -63
  300. data/lib/sequel/plugins/serialization.rb +37 -44
  301. data/lib/sequel/plugins/serialization_modification_detection.rb +3 -1
  302. data/lib/sequel/plugins/sharding.rb +17 -10
  303. data/lib/sequel/plugins/single_table_inheritance.rb +62 -28
  304. data/lib/sequel/plugins/singular_table_names.rb +2 -0
  305. data/lib/sequel/plugins/skip_create_refresh.rb +5 -3
  306. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  307. data/lib/sequel/plugins/split_values.rb +13 -6
  308. data/lib/sequel/plugins/static_cache.rb +79 -53
  309. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  310. data/lib/sequel/plugins/string_stripper.rb +5 -3
  311. data/lib/sequel/plugins/subclasses.rb +20 -2
  312. data/lib/sequel/plugins/subset_conditions.rb +48 -0
  313. data/lib/sequel/plugins/table_select.rb +4 -2
  314. data/lib/sequel/plugins/tactical_eager_loading.rb +120 -6
  315. data/lib/sequel/plugins/throw_failures.rb +110 -0
  316. data/lib/sequel/plugins/timestamps.rb +22 -8
  317. data/lib/sequel/plugins/touch.rb +21 -8
  318. data/lib/sequel/plugins/tree.rb +57 -30
  319. data/lib/sequel/plugins/typecast_on_load.rb +14 -4
  320. data/lib/sequel/plugins/unlimited_update.rb +3 -7
  321. data/lib/sequel/plugins/update_or_create.rb +6 -4
  322. data/lib/sequel/plugins/update_primary_key.rb +3 -1
  323. data/lib/sequel/plugins/update_refresh.rb +28 -15
  324. data/lib/sequel/plugins/uuid.rb +70 -0
  325. data/lib/sequel/plugins/validate_associated.rb +20 -0
  326. data/lib/sequel/plugins/validation_class_methods.rb +40 -19
  327. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  328. data/lib/sequel/plugins/validation_helpers.rb +49 -31
  329. data/lib/sequel/plugins/whitelist_security.rb +122 -0
  330. data/lib/sequel/plugins/xml_serializer.rb +31 -30
  331. data/lib/sequel/sql.rb +479 -329
  332. data/lib/sequel/timezones.rb +62 -32
  333. data/lib/sequel/version.rb +10 -3
  334. metadata +177 -477
  335. data/Rakefile +0 -165
  336. data/doc/active_record.rdoc +0 -912
  337. data/doc/release_notes/1.0.txt +0 -38
  338. data/doc/release_notes/1.1.txt +0 -143
  339. data/doc/release_notes/1.3.txt +0 -101
  340. data/doc/release_notes/1.4.0.txt +0 -53
  341. data/doc/release_notes/1.5.0.txt +0 -155
  342. data/doc/release_notes/2.0.0.txt +0 -298
  343. data/doc/release_notes/2.1.0.txt +0 -271
  344. data/doc/release_notes/2.10.0.txt +0 -328
  345. data/doc/release_notes/2.11.0.txt +0 -215
  346. data/doc/release_notes/2.12.0.txt +0 -534
  347. data/doc/release_notes/2.2.0.txt +0 -253
  348. data/doc/release_notes/2.3.0.txt +0 -88
  349. data/doc/release_notes/2.4.0.txt +0 -106
  350. data/doc/release_notes/2.5.0.txt +0 -137
  351. data/doc/release_notes/2.6.0.txt +0 -157
  352. data/doc/release_notes/2.7.0.txt +0 -166
  353. data/doc/release_notes/2.8.0.txt +0 -171
  354. data/doc/release_notes/2.9.0.txt +0 -97
  355. data/doc/release_notes/3.0.0.txt +0 -221
  356. data/doc/release_notes/3.1.0.txt +0 -406
  357. data/doc/release_notes/3.10.0.txt +0 -286
  358. data/doc/release_notes/3.11.0.txt +0 -254
  359. data/doc/release_notes/3.12.0.txt +0 -304
  360. data/doc/release_notes/3.13.0.txt +0 -210
  361. data/doc/release_notes/3.14.0.txt +0 -118
  362. data/doc/release_notes/3.15.0.txt +0 -78
  363. data/doc/release_notes/3.16.0.txt +0 -45
  364. data/doc/release_notes/3.17.0.txt +0 -58
  365. data/doc/release_notes/3.18.0.txt +0 -120
  366. data/doc/release_notes/3.19.0.txt +0 -67
  367. data/doc/release_notes/3.2.0.txt +0 -268
  368. data/doc/release_notes/3.20.0.txt +0 -41
  369. data/doc/release_notes/3.21.0.txt +0 -87
  370. data/doc/release_notes/3.22.0.txt +0 -39
  371. data/doc/release_notes/3.23.0.txt +0 -172
  372. data/doc/release_notes/3.24.0.txt +0 -420
  373. data/doc/release_notes/3.25.0.txt +0 -88
  374. data/doc/release_notes/3.26.0.txt +0 -88
  375. data/doc/release_notes/3.27.0.txt +0 -82
  376. data/doc/release_notes/3.28.0.txt +0 -304
  377. data/doc/release_notes/3.29.0.txt +0 -459
  378. data/doc/release_notes/3.3.0.txt +0 -192
  379. data/doc/release_notes/3.30.0.txt +0 -135
  380. data/doc/release_notes/3.31.0.txt +0 -146
  381. data/doc/release_notes/3.32.0.txt +0 -202
  382. data/doc/release_notes/3.33.0.txt +0 -157
  383. data/doc/release_notes/3.34.0.txt +0 -671
  384. data/doc/release_notes/3.35.0.txt +0 -144
  385. data/doc/release_notes/3.36.0.txt +0 -245
  386. data/doc/release_notes/3.37.0.txt +0 -338
  387. data/doc/release_notes/3.38.0.txt +0 -234
  388. data/doc/release_notes/3.39.0.txt +0 -237
  389. data/doc/release_notes/3.4.0.txt +0 -325
  390. data/doc/release_notes/3.40.0.txt +0 -73
  391. data/doc/release_notes/3.41.0.txt +0 -155
  392. data/doc/release_notes/3.42.0.txt +0 -74
  393. data/doc/release_notes/3.43.0.txt +0 -105
  394. data/doc/release_notes/3.44.0.txt +0 -152
  395. data/doc/release_notes/3.45.0.txt +0 -179
  396. data/doc/release_notes/3.46.0.txt +0 -122
  397. data/doc/release_notes/3.47.0.txt +0 -270
  398. data/doc/release_notes/3.48.0.txt +0 -477
  399. data/doc/release_notes/3.5.0.txt +0 -510
  400. data/doc/release_notes/3.6.0.txt +0 -366
  401. data/doc/release_notes/3.7.0.txt +0 -179
  402. data/doc/release_notes/3.8.0.txt +0 -151
  403. data/doc/release_notes/3.9.0.txt +0 -233
  404. data/doc/release_notes/4.0.0.txt +0 -262
  405. data/doc/release_notes/4.1.0.txt +0 -85
  406. data/doc/release_notes/4.10.0.txt +0 -226
  407. data/doc/release_notes/4.11.0.txt +0 -147
  408. data/doc/release_notes/4.12.0.txt +0 -105
  409. data/doc/release_notes/4.13.0.txt +0 -169
  410. data/doc/release_notes/4.14.0.txt +0 -68
  411. data/doc/release_notes/4.15.0.txt +0 -56
  412. data/doc/release_notes/4.16.0.txt +0 -36
  413. data/doc/release_notes/4.17.0.txt +0 -38
  414. data/doc/release_notes/4.18.0.txt +0 -36
  415. data/doc/release_notes/4.19.0.txt +0 -45
  416. data/doc/release_notes/4.2.0.txt +0 -129
  417. data/doc/release_notes/4.20.0.txt +0 -79
  418. data/doc/release_notes/4.21.0.txt +0 -94
  419. data/doc/release_notes/4.22.0.txt +0 -72
  420. data/doc/release_notes/4.23.0.txt +0 -65
  421. data/doc/release_notes/4.24.0.txt +0 -99
  422. data/doc/release_notes/4.25.0.txt +0 -181
  423. data/doc/release_notes/4.26.0.txt +0 -44
  424. data/doc/release_notes/4.3.0.txt +0 -40
  425. data/doc/release_notes/4.4.0.txt +0 -92
  426. data/doc/release_notes/4.5.0.txt +0 -34
  427. data/doc/release_notes/4.6.0.txt +0 -30
  428. data/doc/release_notes/4.7.0.txt +0 -103
  429. data/doc/release_notes/4.8.0.txt +0 -175
  430. data/doc/release_notes/4.9.0.txt +0 -190
  431. data/lib/sequel/adapters/cubrid.rb +0 -142
  432. data/lib/sequel/adapters/do.rb +0 -156
  433. data/lib/sequel/adapters/do/mysql.rb +0 -64
  434. data/lib/sequel/adapters/do/postgres.rb +0 -42
  435. data/lib/sequel/adapters/do/sqlite3.rb +0 -40
  436. data/lib/sequel/adapters/jdbc/as400.rb +0 -82
  437. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -62
  438. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -34
  439. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -31
  440. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -31
  441. data/lib/sequel/adapters/odbc/progress.rb +0 -8
  442. data/lib/sequel/adapters/shared/cubrid.rb +0 -243
  443. data/lib/sequel/adapters/shared/firebird.rb +0 -245
  444. data/lib/sequel/adapters/shared/informix.rb +0 -52
  445. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -150
  446. data/lib/sequel/adapters/shared/progress.rb +0 -38
  447. data/lib/sequel/adapters/swift.rb +0 -158
  448. data/lib/sequel/adapters/swift/mysql.rb +0 -47
  449. data/lib/sequel/adapters/swift/postgres.rb +0 -45
  450. data/lib/sequel/adapters/swift/sqlite.rb +0 -47
  451. data/lib/sequel/adapters/utils/pg_types.rb +0 -68
  452. data/lib/sequel/dataset/mutation.rb +0 -109
  453. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -3
  454. data/lib/sequel/extensions/filter_having.rb +0 -59
  455. data/lib/sequel/extensions/hash_aliases.rb +0 -45
  456. data/lib/sequel/extensions/meta_def.rb +0 -31
  457. data/lib/sequel/extensions/query_literals.rb +0 -80
  458. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -22
  459. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -118
  460. data/lib/sequel/extensions/set_overrides.rb +0 -72
  461. data/lib/sequel/no_core_ext.rb +0 -1
  462. data/lib/sequel/plugins/association_autoreloading.rb +0 -7
  463. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -7
  464. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -78
  465. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -117
  466. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -59
  467. data/lib/sequel/plugins/schema.rb +0 -80
  468. data/lib/sequel/plugins/scissors.rb +0 -33
  469. data/spec/adapters/db2_spec.rb +0 -160
  470. data/spec/adapters/firebird_spec.rb +0 -411
  471. data/spec/adapters/informix_spec.rb +0 -100
  472. data/spec/adapters/mssql_spec.rb +0 -706
  473. data/spec/adapters/mysql_spec.rb +0 -1287
  474. data/spec/adapters/oracle_spec.rb +0 -313
  475. data/spec/adapters/postgres_spec.rb +0 -3725
  476. data/spec/adapters/spec_helper.rb +0 -43
  477. data/spec/adapters/sqlanywhere_spec.rb +0 -170
  478. data/spec/adapters/sqlite_spec.rb +0 -653
  479. data/spec/bin_spec.rb +0 -254
  480. data/spec/core/connection_pool_spec.rb +0 -1016
  481. data/spec/core/database_spec.rb +0 -2531
  482. data/spec/core/dataset_spec.rb +0 -5098
  483. data/spec/core/deprecated_spec.rb +0 -70
  484. data/spec/core/expression_filters_spec.rb +0 -1243
  485. data/spec/core/mock_adapter_spec.rb +0 -462
  486. data/spec/core/object_graph_spec.rb +0 -303
  487. data/spec/core/placeholder_literalizer_spec.rb +0 -163
  488. data/spec/core/schema_generator_spec.rb +0 -179
  489. data/spec/core/schema_spec.rb +0 -1659
  490. data/spec/core/spec_helper.rb +0 -34
  491. data/spec/core/version_spec.rb +0 -7
  492. data/spec/core_extensions_spec.rb +0 -699
  493. data/spec/extensions/accessed_columns_spec.rb +0 -51
  494. data/spec/extensions/active_model_spec.rb +0 -123
  495. data/spec/extensions/after_initialize_spec.rb +0 -24
  496. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  497. data/spec/extensions/association_dependencies_spec.rb +0 -117
  498. data/spec/extensions/association_pks_spec.rb +0 -365
  499. data/spec/extensions/association_proxies_spec.rb +0 -86
  500. data/spec/extensions/auto_validations_spec.rb +0 -192
  501. data/spec/extensions/blacklist_security_spec.rb +0 -88
  502. data/spec/extensions/blank_spec.rb +0 -69
  503. data/spec/extensions/boolean_readers_spec.rb +0 -93
  504. data/spec/extensions/caching_spec.rb +0 -270
  505. data/spec/extensions/class_table_inheritance_spec.rb +0 -420
  506. data/spec/extensions/column_conflicts_spec.rb +0 -60
  507. data/spec/extensions/column_select_spec.rb +0 -108
  508. data/spec/extensions/columns_introspection_spec.rb +0 -91
  509. data/spec/extensions/composition_spec.rb +0 -242
  510. data/spec/extensions/connection_validator_spec.rb +0 -120
  511. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -274
  512. data/spec/extensions/constraint_validations_spec.rb +0 -325
  513. data/spec/extensions/core_refinements_spec.rb +0 -519
  514. data/spec/extensions/csv_serializer_spec.rb +0 -173
  515. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  516. data/spec/extensions/dataset_associations_spec.rb +0 -311
  517. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  518. data/spec/extensions/date_arithmetic_spec.rb +0 -150
  519. data/spec/extensions/defaults_setter_spec.rb +0 -101
  520. data/spec/extensions/delay_add_association_spec.rb +0 -52
  521. data/spec/extensions/dirty_spec.rb +0 -180
  522. data/spec/extensions/eager_each_spec.rb +0 -42
  523. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  524. data/spec/extensions/error_splitter_spec.rb +0 -18
  525. data/spec/extensions/error_sql_spec.rb +0 -20
  526. data/spec/extensions/eval_inspect_spec.rb +0 -73
  527. data/spec/extensions/filter_having_spec.rb +0 -40
  528. data/spec/extensions/force_encoding_spec.rb +0 -114
  529. data/spec/extensions/from_block_spec.rb +0 -21
  530. data/spec/extensions/graph_each_spec.rb +0 -109
  531. data/spec/extensions/hash_aliases_spec.rb +0 -24
  532. data/spec/extensions/hook_class_methods_spec.rb +0 -429
  533. data/spec/extensions/inflector_spec.rb +0 -183
  534. data/spec/extensions/input_transformer_spec.rb +0 -54
  535. data/spec/extensions/insert_returning_select_spec.rb +0 -46
  536. data/spec/extensions/instance_filters_spec.rb +0 -79
  537. data/spec/extensions/instance_hooks_spec.rb +0 -276
  538. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  539. data/spec/extensions/json_serializer_spec.rb +0 -291
  540. data/spec/extensions/lazy_attributes_spec.rb +0 -170
  541. data/spec/extensions/list_spec.rb +0 -267
  542. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  543. data/spec/extensions/many_through_many_spec.rb +0 -2172
  544. data/spec/extensions/meta_def_spec.rb +0 -21
  545. data/spec/extensions/migration_spec.rb +0 -712
  546. data/spec/extensions/modification_detection_spec.rb +0 -80
  547. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
  548. data/spec/extensions/named_timezones_spec.rb +0 -108
  549. data/spec/extensions/nested_attributes_spec.rb +0 -697
  550. data/spec/extensions/null_dataset_spec.rb +0 -85
  551. data/spec/extensions/optimistic_locking_spec.rb +0 -128
  552. data/spec/extensions/pagination_spec.rb +0 -118
  553. data/spec/extensions/pg_array_associations_spec.rb +0 -736
  554. data/spec/extensions/pg_array_ops_spec.rb +0 -143
  555. data/spec/extensions/pg_array_spec.rb +0 -395
  556. data/spec/extensions/pg_enum_spec.rb +0 -92
  557. data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
  558. data/spec/extensions/pg_hstore_spec.rb +0 -206
  559. data/spec/extensions/pg_inet_ops_spec.rb +0 -101
  560. data/spec/extensions/pg_inet_spec.rb +0 -52
  561. data/spec/extensions/pg_interval_spec.rb +0 -76
  562. data/spec/extensions/pg_json_ops_spec.rb +0 -229
  563. data/spec/extensions/pg_json_spec.rb +0 -218
  564. data/spec/extensions/pg_loose_count_spec.rb +0 -17
  565. data/spec/extensions/pg_range_ops_spec.rb +0 -58
  566. data/spec/extensions/pg_range_spec.rb +0 -404
  567. data/spec/extensions/pg_row_ops_spec.rb +0 -60
  568. data/spec/extensions/pg_row_plugin_spec.rb +0 -62
  569. data/spec/extensions/pg_row_spec.rb +0 -360
  570. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
  571. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
  572. data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
  573. data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
  574. data/spec/extensions/prepared_statements_spec.rb +0 -103
  575. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
  576. data/spec/extensions/pretty_table_spec.rb +0 -92
  577. data/spec/extensions/query_literals_spec.rb +0 -183
  578. data/spec/extensions/query_spec.rb +0 -102
  579. data/spec/extensions/rcte_tree_spec.rb +0 -392
  580. data/spec/extensions/round_timestamps_spec.rb +0 -43
  581. data/spec/extensions/schema_caching_spec.rb +0 -41
  582. data/spec/extensions/schema_dumper_spec.rb +0 -789
  583. data/spec/extensions/schema_spec.rb +0 -117
  584. data/spec/extensions/scissors_spec.rb +0 -26
  585. data/spec/extensions/select_remove_spec.rb +0 -38
  586. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
  587. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  588. data/spec/extensions/serialization_spec.rb +0 -362
  589. data/spec/extensions/server_block_spec.rb +0 -90
  590. data/spec/extensions/set_overrides_spec.rb +0 -61
  591. data/spec/extensions/sharding_spec.rb +0 -198
  592. data/spec/extensions/shared_caching_spec.rb +0 -175
  593. data/spec/extensions/single_table_inheritance_spec.rb +0 -297
  594. data/spec/extensions/singular_table_names_spec.rb +0 -22
  595. data/spec/extensions/skip_create_refresh_spec.rb +0 -17
  596. data/spec/extensions/spec_helper.rb +0 -71
  597. data/spec/extensions/split_array_nil_spec.rb +0 -24
  598. data/spec/extensions/split_values_spec.rb +0 -22
  599. data/spec/extensions/sql_expr_spec.rb +0 -60
  600. data/spec/extensions/static_cache_spec.rb +0 -361
  601. data/spec/extensions/string_date_time_spec.rb +0 -95
  602. data/spec/extensions/string_stripper_spec.rb +0 -68
  603. data/spec/extensions/subclasses_spec.rb +0 -66
  604. data/spec/extensions/table_select_spec.rb +0 -71
  605. data/spec/extensions/tactical_eager_loading_spec.rb +0 -82
  606. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  607. data/spec/extensions/timestamps_spec.rb +0 -175
  608. data/spec/extensions/to_dot_spec.rb +0 -154
  609. data/spec/extensions/touch_spec.rb +0 -203
  610. data/spec/extensions/tree_spec.rb +0 -274
  611. data/spec/extensions/typecast_on_load_spec.rb +0 -80
  612. data/spec/extensions/unlimited_update_spec.rb +0 -20
  613. data/spec/extensions/update_or_create_spec.rb +0 -87
  614. data/spec/extensions/update_primary_key_spec.rb +0 -100
  615. data/spec/extensions/update_refresh_spec.rb +0 -53
  616. data/spec/extensions/validate_associated_spec.rb +0 -52
  617. data/spec/extensions/validation_class_methods_spec.rb +0 -1027
  618. data/spec/extensions/validation_helpers_spec.rb +0 -541
  619. data/spec/extensions/xml_serializer_spec.rb +0 -207
  620. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  621. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  622. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  623. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  624. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  625. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  626. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  627. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  628. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  629. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  630. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  631. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  632. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  633. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  634. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  635. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  636. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  637. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  638. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  639. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  640. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  641. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  642. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  643. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  644. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  645. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  646. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  647. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  648. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  649. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  650. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  651. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  652. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  653. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  654. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  655. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  656. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  657. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  658. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  659. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  660. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  661. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  662. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  663. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  664. data/spec/guards_helper.rb +0 -55
  665. data/spec/integration/associations_test.rb +0 -2454
  666. data/spec/integration/database_test.rb +0 -113
  667. data/spec/integration/dataset_test.rb +0 -1808
  668. data/spec/integration/eager_loader_test.rb +0 -687
  669. data/spec/integration/migrator_test.rb +0 -240
  670. data/spec/integration/model_test.rb +0 -226
  671. data/spec/integration/plugin_test.rb +0 -2240
  672. data/spec/integration/prepared_statement_test.rb +0 -467
  673. data/spec/integration/schema_test.rb +0 -817
  674. data/spec/integration/spec_helper.rb +0 -48
  675. data/spec/integration/timezone_test.rb +0 -86
  676. data/spec/integration/transaction_test.rb +0 -374
  677. data/spec/integration/type_test.rb +0 -133
  678. data/spec/model/association_reflection_spec.rb +0 -525
  679. data/spec/model/associations_spec.rb +0 -4426
  680. data/spec/model/base_spec.rb +0 -759
  681. data/spec/model/class_dataset_methods_spec.rb +0 -146
  682. data/spec/model/dataset_methods_spec.rb +0 -149
  683. data/spec/model/eager_loading_spec.rb +0 -2137
  684. data/spec/model/hooks_spec.rb +0 -604
  685. data/spec/model/inflector_spec.rb +0 -26
  686. data/spec/model/model_spec.rb +0 -982
  687. data/spec/model/plugins_spec.rb +0 -299
  688. data/spec/model/record_spec.rb +0 -2147
  689. data/spec/model/spec_helper.rb +0 -46
  690. data/spec/model/validations_spec.rb +0 -193
  691. data/spec/sequel_coverage.rb +0 -15
  692. data/spec/spec_config.rb +0 -10
@@ -1,3 +1,5 @@
1
+ # frozen-string-literal: true
2
+
1
3
  module Sequel
2
4
  class Database
3
5
  # ---------------------
@@ -5,10 +7,8 @@ module Sequel
5
7
  # This methods generally execute SQL code on the database server.
6
8
  # ---------------------
7
9
 
8
- STRING_DEFAULT_RE = /\A'(.*)'\z/
9
- CURRENT_TIMESTAMP_RE = /now|today|CURRENT|getdate|\ADate\(\)\z/io
10
- COLUMN_SCHEMA_DATETIME_TYPES = [:date, :datetime]
11
- COLUMN_SCHEMA_STRING_TYPES = [:string, :blob, :date, :datetime, :time, :enum, :set, :interval]
10
+ COLUMN_SCHEMA_DATETIME_TYPES = [:date, :datetime].freeze
11
+ COLUMN_SCHEMA_STRING_TYPES = [:string, :blob, :date, :datetime, :time, :enum, :set, :interval].freeze
12
12
 
13
13
  # The prepared statement object hash for this database, keyed by name symbol
14
14
  attr_reader :prepared_statements
@@ -30,9 +30,9 @@ module Sequel
30
30
  # Call the prepared statement with the given name with the given hash
31
31
  # of arguments.
32
32
  #
33
- # DB[:items].filter(:id=>1).prepare(:first, :sa)
33
+ # DB[:items].where(id: 1).prepare(:first, :sa)
34
34
  # DB.call(:sa) # SELECT * FROM items WHERE id = 1
35
- def call(ps_name, hash={}, &block)
35
+ def call(ps_name, hash=OPTS, &block)
36
36
  prepared_statement(ps_name).call(hash, &block)
37
37
  end
38
38
 
@@ -43,7 +43,7 @@ module Sequel
43
43
  execute_dui(sql, opts, &block)
44
44
  end
45
45
 
46
- # Method that should be used when issuing a DELETE, UPDATE, or INSERT
46
+ # Method that should be used when issuing a DELETE or UPDATE
47
47
  # statement. By default, calls execute.
48
48
  # This method should not be called directly by user code.
49
49
  def execute_dui(sql, opts=OPTS, &block)
@@ -57,11 +57,11 @@ module Sequel
57
57
  execute_dui(sql, opts, &block)
58
58
  end
59
59
 
60
- # Returns a single value from the database, e.g.:
60
+ # Returns a single value from the database, see Dataset#get.
61
61
  #
62
62
  # DB.get(1) # SELECT 1
63
63
  # # => 1
64
- # DB.get{server_version{}} # SELECT server_version()
64
+ # DB.get{server_version.function} # SELECT server_version()
65
65
  def get(*args, &block)
66
66
  @default_dataset.get(*args, &block)
67
67
  end
@@ -86,7 +86,7 @@ module Sequel
86
86
  # :schema :: An explicit schema to use. It may also be implicitly provided
87
87
  # via the table name.
88
88
  #
89
- # If schema parsing is supported by the database, the column information should hash at least contain the
89
+ # If schema parsing is supported by the database, the column information hash should contain at least the
90
90
  # following entries:
91
91
  #
92
92
  # :allow_null :: Whether NULL is an allowed value for the column.
@@ -157,11 +157,11 @@ module Sequel
157
157
  end
158
158
 
159
159
  cols = schema_parse_table(table_name, opts)
160
- raise(Error, 'schema parsing returned no columns, table probably doesn\'t exist') if cols.nil? || cols.empty?
160
+ raise(Error, "schema parsing returned no columns, table #{table_name.inspect} probably doesn't exist") if cols.nil? || cols.empty?
161
161
 
162
162
  primary_keys = 0
163
163
  auto_increment_set = false
164
- cols.all? do |_,c|
164
+ cols.each do |_,c|
165
165
  auto_increment_set = true if c.has_key?(:auto_increment)
166
166
  primary_keys += 1 if c[:primary_key]
167
167
  end
@@ -176,6 +176,8 @@ module Sequel
176
176
  c[:max_length] = max_length
177
177
  end
178
178
  end
179
+ schema_post_process(cols)
180
+
179
181
  Sequel.synchronize{@schemas[quoted_name] = cols} if cache_schema
180
182
  cols
181
183
  end
@@ -191,7 +193,8 @@ module Sequel
191
193
  def table_exists?(name)
192
194
  sch, table_name = schema_and_table(name)
193
195
  name = SQL::QualifiedIdentifier.new(sch, table_name) if sch
194
- _table_exists?(from(name))
196
+ ds = from(name)
197
+ transaction(:savepoint=>:only){_table_exists?(ds)}
195
198
  true
196
199
  rescue DatabaseError
197
200
  false
@@ -237,7 +240,7 @@ module Sequel
237
240
  when :time
238
241
  Sequel.string_to_time(default)
239
242
  when :decimal
240
- BigDecimal.new(default)
243
+ BigDecimal(default)
241
244
  end
242
245
  end
243
246
 
@@ -245,7 +248,7 @@ module Sequel
245
248
  # and return the normalized value.
246
249
  def column_schema_normalize_default(default, type)
247
250
  if column_schema_default_string_type?(type)
248
- return unless m = STRING_DEFAULT_RE.match(default)
251
+ return unless m = /\A'(.*)'\z/.match(default)
249
252
  m[1].gsub("''", "'")
250
253
  else
251
254
  default
@@ -257,7 +260,7 @@ module Sequel
257
260
  def column_schema_to_ruby_default(default, type)
258
261
  return default unless default.is_a?(String)
259
262
  if COLUMN_SCHEMA_DATETIME_TYPES.include?(type)
260
- if CURRENT_TIMESTAMP_RE.match(default)
263
+ if /now|today|CURRENT|getdate|\ADate\(\)\z/i.match(default)
261
264
  if type == :date
262
265
  return Sequel::CURRENT_DATE
263
266
  else
@@ -284,16 +287,16 @@ module Sequel
284
287
  (ds || dataset).method(:input_identifier)
285
288
  end
286
289
 
290
+ # Uncached version of metadata_dataset, designed for overriding.
291
+ def _metadata_dataset
292
+ dataset
293
+ end
294
+
287
295
  # Return a dataset that uses the default identifier input and output methods
288
296
  # for this database. Used when parsing metadata so that column symbols are
289
297
  # returned as expected.
290
298
  def metadata_dataset
291
- @metadata_dataset ||= (
292
- ds = dataset;
293
- ds.identifier_input_method = identifier_input_method_default;
294
- ds.identifier_output_method = identifier_output_method_default;
295
- ds
296
- )
299
+ @metadata_dataset ||= _metadata_dataset
297
300
  end
298
301
 
299
302
  # Return a Method object for the dataset's output_identifier_method.
@@ -305,10 +308,10 @@ module Sequel
305
308
 
306
309
  # Remove the cached schema for the given schema name
307
310
  def remove_cached_schema(table)
308
- if @schemas
309
- k = quote_schema_table(table)
310
- Sequel.synchronize{@schemas.delete(k)}
311
- end
311
+ cache = @default_dataset.send(:cache)
312
+ Sequel.synchronize{cache.clear}
313
+ k = quote_schema_table(table)
314
+ Sequel.synchronize{@schemas.delete(k)}
312
315
  end
313
316
 
314
317
  # Match the database's column type to a ruby type via a
@@ -322,13 +325,13 @@ module Sequel
322
325
  :integer
323
326
  when /\Adate\z/io
324
327
  :date
325
- when /\A((small)?datetime|timestamp( with(out)? time zone)?)(\(\d+\))?\z/io
328
+ when /\A((small)?datetime|timestamp(\(\d\))?( with(out)? time zone)?)\z/io
326
329
  :datetime
327
330
  when /\Atime( with(out)? time zone)?\z/io
328
331
  :time
329
332
  when /\A(bool(ean)?)\z/io
330
333
  :boolean
331
- when /\A(real|float|double( precision)?|double\(\d+,\d+\)( unsigned)?)\z/io
334
+ when /\A(real|float( unsigned)?|double( precision)?|double\(\d+,\d+\)( unsigned)?)\z/io
332
335
  :float
333
336
  when /\A(?:(?:(?:num(?:ber|eric)?|decimal)(?:\(\d+,\s*(\d+|false|true)\))?))\z/io
334
337
  $1 && ['0', 'false'].include?($1) ? :integer : :decimal
@@ -338,5 +341,25 @@ module Sequel
338
341
  :enum
339
342
  end
340
343
  end
344
+
345
+ # Post process the schema values.
346
+ def schema_post_process(cols)
347
+ # :nocov:
348
+ if RUBY_VERSION >= '2.5'
349
+ # :nocov:
350
+ cols.each do |_, h|
351
+ db_type = h[:db_type]
352
+ if db_type.is_a?(String)
353
+ h[:db_type] = -db_type
354
+ end
355
+ end
356
+ end
357
+
358
+ cols.each do |_,c|
359
+ c.each_value do |val|
360
+ val.freeze if val.is_a?(String)
361
+ end
362
+ end
363
+ end
341
364
  end
342
365
  end
@@ -1,3 +1,5 @@
1
+ # frozen-string-literal: true
2
+
1
3
  module Sequel
2
4
  # The Schema module holds the schema generators.
3
5
  module Schema
@@ -16,16 +18,15 @@ module Sequel
16
18
  # the {"Schema Modification" guide}[rdoc-ref:doc/schema_modification.rdoc].
17
19
  class CreateTableGenerator
18
20
  # Classes specifying generic types that Sequel will convert to database-specific types.
19
- GENERIC_TYPES=[String, Integer, Fixnum, Bignum, Float, Numeric, BigDecimal,
20
- Date, DateTime, Time, File, TrueClass, FalseClass]
21
+ GENERIC_TYPES=%w'String Integer Float Numeric BigDecimal Date DateTime Time File TrueClass FalseClass'.freeze
21
22
 
22
- # Return the column hashes created by this generator
23
+ # Column hashes created by this generator
23
24
  attr_reader :columns
24
25
 
25
- # Return the constraint hashes created by this generator
26
+ # Constraint hashes created by this generator
26
27
  attr_reader :constraints
27
28
 
28
- # Return the index hashes created by this generator
29
+ # Index hashes created by this generator
29
30
  attr_reader :indexes
30
31
 
31
32
  # Set the database in which to create the table, and evaluate the block
@@ -36,38 +37,55 @@ module Sequel
36
37
  @indexes = []
37
38
  @constraints = []
38
39
  @primary_key = nil
39
- instance_eval(&block) if block
40
- @columns.unshift(@primary_key) if @primary_key && !has_column?(primary_key_name)
40
+ instance_exec(&block) if block
41
+ end
42
+
43
+ # Use custom Bignum method to use :Bignum instead of Bignum class, to work
44
+ # correctly in cases where Bignum is the same as Integer.
45
+ def Bignum(name, opts=OPTS)
46
+ column(name, :Bignum, opts)
41
47
  end
42
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
+
43
55
  # Add a method for each of the given types that creates a column
44
56
  # with that type as a constant. Types given should either already
45
57
  # be constants/classes or a capitalized string/symbol with the same name
46
58
  # as a constant/class.
47
- #
48
- # Do not call this method with untrusted input, as that can result in
49
- # arbitrary code execution.
50
59
  def self.add_type_method(*types)
51
60
  types.each do |type|
52
- 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)}
53
70
  end
71
+ nil
54
72
  end
55
73
 
56
- # Add an unnamed constraint to the DDL, specified by the given block
74
+ # Add an unnamed constraint, specified by the given block
57
75
  # or args:
58
76
  #
59
- # check(:num=>1..5) # CHECK num >= 1 AND num <= 5
60
- # check{num > 5} # CHECK num > 5
77
+ # check(num: 1..5) # CHECK num >= 1 AND num <= 5
78
+ # check{num > 5} # CHECK num > 5
61
79
  def check(*args, &block)
62
80
  constraint(nil, *args, &block)
63
81
  end
64
82
 
65
- # Add a column with the given name, type, and opts to the DDL.
83
+ # Add a column with the given name, type, and opts:
66
84
  #
67
85
  # column :num, :integer
68
86
  # # num INTEGER
69
87
  #
70
- # column :name, String, :null=>false, :default=>'a'
88
+ # column :name, String, null: false, default: 'a'
71
89
  # # name varchar(255) NOT NULL DEFAULT 'a'
72
90
  #
73
91
  # inet :ip
@@ -91,6 +109,9 @@ module Sequel
91
109
  # yet exist on referenced table (but will exist before the transaction commits).
92
110
  # Basically it adds DEFERRABLE INITIALLY DEFERRED on key creation.
93
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+).
94
115
  # :index :: Create an index on this column. If given a hash, use the hash as the
95
116
  # options for the index.
96
117
  # :key :: For foreign key columns, the column in the associated table
@@ -98,47 +119,61 @@ module Sequel
98
119
  # references the primary key of the associated table, except if you are
99
120
  # using MySQL.
100
121
  # :null :: Mark the column as allowing NULL values (if true),
101
- # or not allowing NULL values (if false). If unspecified, will default
102
- # to whatever the database default is.
122
+ # or not allowing NULL values (if false). The default is to allow NULL values.
103
123
  # :on_delete :: Specify the behavior of this column when being deleted
104
124
  # (:restrict, :cascade, :set_null, :set_default, :no_action).
105
125
  # :on_update :: Specify the behavior of this column when being updated
106
126
  # (:restrict, :cascade, :set_null, :set_default, :no_action).
107
- # :primary_key :: Make the column as a single primary key column. This should only
108
- # 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).
109
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.
110
133
  # :type :: Overrides the type given as the argument. Generally not used by column
111
134
  # itself, but can be passed as an option to other methods that call column.
112
135
  # :unique :: Mark the column as unique, generally has the same effect as
113
136
  # creating a unique index on the column.
114
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
+ # :generated_type :: Set the type of column when using :generated_always_as,
147
+ # should be :virtual or :stored to force a type.
115
148
  def column(name, type, opts = OPTS)
116
149
  columns << {:name => name, :type => type}.merge!(opts)
117
150
  if index_opts = opts[:index]
118
- index(name, index_opts.is_a?(Hash) ? index_opts : {})
151
+ index(name, index_opts.is_a?(Hash) ? index_opts : OPTS)
119
152
  end
153
+ nil
120
154
  end
121
155
 
122
- # Adds a named constraint (or unnamed if name is nil) to the DDL,
156
+ # Adds a named constraint (or unnamed if name is nil),
123
157
  # with the given block or args. To provide options for the constraint, pass
124
158
  # a hash as the first argument.
125
159
  #
126
- # constraint(:blah, :num=>1..5)
160
+ # constraint(:blah, num: 1..5)
127
161
  # # CONSTRAINT blah CHECK num >= 1 AND num <= 5
128
- # constraint({:name=>:blah, :deferrable=>true}, :num=>1..5)
162
+ # constraint({name: :blah, deferrable: true}, num: 1..5)
129
163
  # # CONSTRAINT blah CHECK num >= 1 AND num <= 5 DEFERRABLE INITIALLY DEFERRED
130
164
  def constraint(name, *args, &block)
131
165
  opts = name.is_a?(Hash) ? name : {:name=>name}
132
166
  constraints << opts.merge(:type=>:check, :check=>block || args)
167
+ nil
133
168
  end
134
169
 
135
- # Add a foreign key in the table that references another table to the DDL. See column
170
+ # Add a foreign key in the table that references another table. See #column
136
171
  # for available options.
137
172
  #
138
173
  # foreign_key(:artist_id) # artist_id INTEGER
139
174
  # foreign_key(:artist_id, :artists) # artist_id INTEGER REFERENCES artists
140
- # foreign_key(:artist_id, :artists, :key=>:id) # artist_id INTEGER REFERENCES artists(id)
141
- # foreign_key(:artist_id, :artists, :type=>String) # artist_id varchar(255) REFERENCES artists(id)
175
+ # foreign_key(:artist_id, :artists, key: :id) # artist_id INTEGER REFERENCES artists(id)
176
+ # foreign_key(:artist_id, :artists, type: String) # artist_id varchar(255) REFERENCES artists(id)
142
177
  #
143
178
  # Additional Options:
144
179
  #
@@ -148,24 +183,22 @@ module Sequel
148
183
  # composite foreign key), you can provide an array of columns as the first argument, and
149
184
  # you can provide the :name option to name the constraint:
150
185
  #
151
- # foreign_key([:artist_name, :artist_location], :artists, :name=>:artist_fk)
186
+ # foreign_key([:artist_name, :artist_location], :artists, name: :artist_fk)
152
187
  # # ADD CONSTRAINT artist_fk FOREIGN KEY (artist_name, artist_location) REFERENCES artists
153
188
  def foreign_key(name, table=nil, opts = OPTS)
154
189
  opts = case table
155
190
  when Hash
156
191
  table.merge(opts)
157
- when Symbol
158
- opts.merge(:table=>table)
159
192
  when NilClass
160
193
  opts
161
194
  else
162
- raise(Error, "The second argument to foreign_key should be a Hash, Symbol, or nil")
195
+ opts.merge(:table=>table)
163
196
  end
164
197
  return composite_foreign_key(name, opts) if name.is_a?(Array)
165
198
  column(name, Integer, opts)
166
199
  end
167
200
 
168
- # Add a full text index on the given columns to the DDL.
201
+ # Add a full text index on the given columns.
169
202
  #
170
203
  # PostgreSQL specific options:
171
204
  # :index_type :: Can be set to :gist to use a GIST index instead of the
@@ -178,12 +211,12 @@ module Sequel
178
211
  index(columns, opts.merge(:type => :full_text))
179
212
  end
180
213
 
181
- # True if the DDL includes the creation of a column with the given name.
214
+ # True if the generator includes the creation of a column with the given name.
182
215
  def has_column?(name)
183
216
  columns.any?{|c| c[:name] == name}
184
217
  end
185
218
 
186
- # Add an index on the given column(s) with the given options to the DDL.
219
+ # Add an index on the given column(s) with the given options.
187
220
  # General options:
188
221
  #
189
222
  # :name :: The name to use for the index. If not given, a default name
@@ -198,6 +231,9 @@ module Sequel
198
231
  # operations on the table while the index is being
199
232
  # built.
200
233
  # :opclass :: Use a specific operator class in the index.
234
+ # :include :: Include additional column values in the index, without
235
+ # actually indexing on those values (PostgreSQL 11+).
236
+ # :tablespace :: Specify tablespace for index.
201
237
  #
202
238
  # Microsoft SQL Server specific options:
203
239
  #
@@ -211,9 +247,10 @@ module Sequel
211
247
  # # CREATE INDEX table_artist_id_name_index ON table (artist_id, name)
212
248
  def index(columns, opts = OPTS)
213
249
  indexes << {:columns => Array(columns)}.merge!(opts)
250
+ nil
214
251
  end
215
252
 
216
- # Add a column with the given type, name, and opts to the DDL. See +column+ for available
253
+ # Add a column with the given type, name, and opts. See #column for available
217
254
  # options.
218
255
  def method_missing(type, name = nil, opts = OPTS)
219
256
  name ? column(name, type, opts) : super
@@ -224,7 +261,7 @@ module Sequel
224
261
  true
225
262
  end
226
263
 
227
- # Adds an autoincrementing primary key column or a primary key constraint to the DDL.
264
+ # Adds an autoincrementing primary key column or a primary key constraint.
228
265
  # To just create a constraint, the first argument should be an array of column symbols
229
266
  # specifying the primary key columns. To create an autoincrementing primary key
230
267
  # column, a single symbol can be used. In both cases, an options hash can be used
@@ -232,26 +269,39 @@ module Sequel
232
269
  #
233
270
  # If you want to create a primary key column that is not autoincrementing, you
234
271
  # should not use this method. Instead, you should use the regular +column+ method
235
- # with a <tt>:primary_key=>true</tt> option.
272
+ # with a <tt>primary_key: true</tt> option.
236
273
  #
237
274
  # If an array of column symbols is used, you can specify the :name option
238
275
  # to name the constraint.
276
+ #
277
+ # Options:
278
+ # :keep_order :: For non-composite primary keys, respects the existing order of
279
+ # columns, overriding the default behavior of making the primary
280
+ # key the first column.
239
281
  #
240
282
  # Examples:
241
283
  # primary_key(:id)
242
- # primary_key([:street_number, :house_number], :name=>:some constraint_name)
284
+ # primary_key(:id, type: :Bignum, keep_order: true)
285
+ # primary_key([:street_number, :house_number], name: :some constraint_name)
243
286
  def primary_key(name, *args)
244
287
  return composite_primary_key(name, *args) if name.is_a?(Array)
245
- @primary_key = @db.serial_primary_key_options.merge({:name => name})
288
+ column = @db.serial_primary_key_options.merge({:name => name})
246
289
 
247
290
  if opts = args.pop
248
291
  opts = {:type => opts} unless opts.is_a?(Hash)
249
292
  if type = args.pop
250
- opts.merge!(:type => type)
293
+ opts = opts.merge(:type => type)
251
294
  end
252
- @primary_key.merge!(opts)
295
+ column.merge!(opts)
253
296
  end
254
- @primary_key
297
+
298
+ @primary_key = column
299
+ if column[:keep_order]
300
+ columns << column
301
+ else
302
+ columns.unshift(column)
303
+ end
304
+ nil
255
305
  end
256
306
 
257
307
  # The name of the primary key for this generator, if it has a primary key.
@@ -259,12 +309,12 @@ module Sequel
259
309
  @primary_key[:name] if @primary_key
260
310
  end
261
311
 
262
- # Add a spatial index on the given columns to the DDL.
312
+ # Add a spatial index on the given columns.
263
313
  def spatial_index(columns, opts = OPTS)
264
314
  index(columns, opts.merge(:type => :spatial))
265
315
  end
266
316
 
267
- # Add a unique constraint on the given columns to the DDL.
317
+ # Add a unique constraint on the given columns.
268
318
  #
269
319
  # unique(:name) # UNIQUE (name)
270
320
  #
@@ -272,27 +322,27 @@ module Sequel
272
322
  # to name the constraint.
273
323
  def unique(columns, opts = OPTS)
274
324
  constraints << {:type => :unique, :columns => Array(columns)}.merge!(opts)
325
+ nil
275
326
  end
276
327
 
277
328
  private
278
329
 
279
330
  # Add a composite primary key constraint
280
331
  def composite_primary_key(columns, *args)
281
- opts = args.pop || {}
332
+ opts = args.pop || OPTS
282
333
  constraints << {:type => :primary_key, :columns => columns}.merge!(opts)
334
+ nil
283
335
  end
284
336
 
285
337
  # Add a composite foreign key constraint
286
338
  def composite_foreign_key(columns, opts)
287
339
  constraints << {:type => :foreign_key, :columns => columns}.merge!(opts)
340
+ nil
288
341
  end
289
342
 
290
343
  add_type_method(*GENERIC_TYPES)
291
344
  end
292
345
 
293
- # Alias of CreateTableGenerator for backwards compatibility.
294
- Generator = CreateTableGenerator
295
-
296
346
  # Schema::AlterTableGenerator is an internal class that the user is not expected
297
347
  # to instantiate directly. Instances are created by Database#alter_table.
298
348
  # It is used to specify table alteration parameters. It takes a Database
@@ -303,49 +353,63 @@ module Sequel
303
353
  # For more information on Sequel's support for schema modification, see
304
354
  # the {"Schema Modification" guide}[link:files/doc/schema_modification_rdoc.html].
305
355
  class AlterTableGenerator
306
- # An array of DDL operations to perform
356
+ # An array of operations to perform
307
357
  attr_reader :operations
308
358
 
309
- # Set the Database object to which to apply the DDL, and evaluate the
359
+ # Set the Database object to which to apply the changes, and evaluate the
310
360
  # block in the context of this object.
311
361
  def initialize(db, &block)
312
362
  @db = db
313
363
  @operations = []
314
- instance_eval(&block) if block
364
+ instance_exec(&block) if block
315
365
  end
316
366
 
317
- # Add a column with the given name, type, and opts to the DDL for the table.
318
- # See CreateTableGenerator#column for the available options.
367
+ # Add a column with the given name, type, and opts.
368
+ # See CreateTableGenerator#column for the available options (except for +:index+, use a
369
+ # separate +add_index+ call to add an index for the column).
319
370
  #
320
371
  # add_column(:name, String) # ADD COLUMN name varchar(255)
372
+ #
373
+ # PostgreSQL specific options:
374
+ #
375
+ # :if_not_exists :: Set to true to not add the column if it already exists (PostgreSQL 9.6+)
376
+ #
377
+ # MySQL specific options:
378
+ #
379
+ # :after :: The name of an existing column that the new column should be positioned after
380
+ # :first :: Create this new column before all other existing columns
321
381
  def add_column(name, type, opts = OPTS)
322
382
  @operations << {:op => :add_column, :name => name, :type => type}.merge!(opts)
383
+ nil
323
384
  end
324
385
 
325
- # Add a constraint with the given name and args to the DDL for the table.
386
+ # Add a constraint with the given name and args.
326
387
  # See CreateTableGenerator#constraint.
327
388
  #
328
389
  # add_constraint(:valid_name, Sequel.like(:name, 'A%'))
329
390
  # # ADD CONSTRAINT valid_name CHECK (name LIKE 'A%' ESCAPE '\')
330
- # add_constraint({:name=>:valid_name, :deferrable=>true}, Sequel.like(:name, 'A%'))
391
+ # add_constraint({name: :valid_name, deferrable: true}, Sequel.like(:name, 'A%'))
331
392
  # # ADD CONSTRAINT valid_name CHECK (name LIKE 'A%' ESCAPE '\') DEFERRABLE INITIALLY DEFERRED
332
393
  def add_constraint(name, *args, &block)
333
394
  opts = name.is_a?(Hash) ? name : {:name=>name}
334
395
  @operations << opts.merge(:op=>:add_constraint, :type=>:check, :check=>block || args)
396
+ nil
335
397
  end
336
398
 
337
399
  # Add a unique constraint to the given column(s)
338
400
  #
339
401
  # add_unique_constraint(:name) # ADD UNIQUE (name)
340
- # add_unique_constraint(:name, :name=>:unique_name) # ADD CONSTRAINT unique_name UNIQUE (name)
402
+ # add_unique_constraint(:name, name: :unique_name) # ADD CONSTRAINT unique_name UNIQUE (name)
341
403
  #
342
404
  # Supports the same :deferrable option as CreateTableGenerator#column.
343
405
  def add_unique_constraint(columns, opts = OPTS)
344
406
  @operations << {:op => :add_constraint, :type => :unique, :columns => Array(columns)}.merge!(opts)
407
+ nil
345
408
  end
346
409
 
347
- # Add a foreign key with the given name and referencing the given table
348
- # to the DDL for the table. See CreateTableGenerator#column for the available options.
410
+ # Add a foreign key with the given name and referencing the given table.
411
+ # See CreateTableGenerator#column for the available options (except for +:index+, use a
412
+ # separate +add_index+ call to add an index for the column).
349
413
  #
350
414
  # You can also pass an array of column names for creating composite foreign
351
415
  # keys. In this case, it will assume the columns exist and will only add
@@ -371,21 +435,50 @@ module Sequel
371
435
  add_column(name, Integer, {:table=>table}.merge!(opts))
372
436
  end
373
437
 
374
- # Add a full text index on the given columns to the DDL for the table.
438
+ # Add a full text index on the given columns.
375
439
  # See CreateTableGenerator#index for available options.
376
440
  def add_full_text_index(columns, opts = OPTS)
377
441
  add_index(columns, {:type=>:full_text}.merge!(opts))
378
442
  end
379
443
 
380
- # Add an index on the given columns to the DDL for the table. See
444
+ # Add an index on the given columns. See
381
445
  # CreateTableGenerator#index for available options.
382
446
  #
383
447
  # add_index(:artist_id) # CREATE INDEX table_artist_id_index ON table (artist_id)
448
+ #
449
+ # Options:
450
+ #
451
+ # :name :: Give a specific name for the index. Highly recommended if you plan on
452
+ # dropping the index later.
453
+ # :where :: A filter expression, used to setup a partial index (if supported).
454
+ # :unique :: Create a unique index.
455
+ #
456
+ # PostgreSQL specific options:
457
+ #
458
+ # :concurrently :: Create the index concurrently, so it doesn't require an exclusive lock
459
+ # on the table.
460
+ # :index_type :: The underlying index type to use for a full_text index, gin by default).
461
+ # :language :: The language to use for a full text index (simple by default).
462
+ # :opclass :: Set an opclass to use for all columns (per-column opclasses require
463
+ # custom SQL).
464
+ # :type :: Set the index type (e.g. full_text, spatial, hash, gin, gist, btree).
465
+ # :if_not_exists :: Only create the index if an index of the same name doesn't already exists
466
+ #
467
+ # MySQL specific options:
468
+ #
469
+ # :type :: Set the index type, with full_text and spatial indexes handled specially.
470
+ #
471
+ # Microsoft SQL Server specific options:
472
+ #
473
+ # :include :: Includes additional columns in the index.
474
+ # :key_index :: Sets the KEY INDEX to the given value.
475
+ # :type :: clustered uses a clustered index, full_text uses a full text index.
384
476
  def add_index(columns, opts = OPTS)
385
477
  @operations << {:op => :add_index, :columns => Array(columns)}.merge!(opts)
478
+ nil
386
479
  end
387
480
 
388
- # Add a primary key to the DDL for the table. See CreateTableGenerator#column
481
+ # Add a primary key. See CreateTableGenerator#column
389
482
  # for the available options. Like +add_foreign_key+, if you specify
390
483
  # the column name as an array, it just creates a constraint:
391
484
  #
@@ -397,16 +490,16 @@ module Sequel
397
490
  add_column(name, opts.delete(:type), opts)
398
491
  end
399
492
 
400
- # Add a spatial index on the given columns to the DDL for the table.
493
+ # Add a spatial index on the given columns.
401
494
  # See CreateTableGenerator#index for available options.
402
495
  def add_spatial_index(columns, opts = OPTS)
403
496
  add_index(columns, {:type=>:spatial}.merge!(opts))
404
497
  end
405
498
 
406
- # Remove a column from the DDL for the table.
499
+ # Remove a column from the table.
407
500
  #
408
501
  # drop_column(:artist_id) # DROP COLUMN artist_id
409
- # drop_column(:artist_id, :cascade=>true) # DROP COLUMN artist_id CASCADE
502
+ # drop_column(:artist_id, cascade: true) # DROP COLUMN artist_id CASCADE
410
503
  #
411
504
  # Options:
412
505
  #
@@ -418,20 +511,24 @@ module Sequel
418
511
  # exist.
419
512
  def drop_column(name, opts=OPTS)
420
513
  @operations << {:op => :drop_column, :name => name}.merge!(opts)
514
+ nil
421
515
  end
422
516
 
423
- # Remove a constraint from the DDL for the table. MySQL/SQLite specific options:
517
+ # Remove a constraint from the table:
518
+ #
519
+ # drop_constraint(:unique_name) # DROP CONSTRAINT unique_name
520
+ # drop_constraint(:unique_name, cascade: true) # DROP CONSTRAINT unique_name CASCADE
521
+ #
522
+ # MySQL/SQLite specific options:
424
523
  #
425
524
  # :type :: Set the type of constraint to drop, either :primary_key, :foreign_key,
426
525
  # or :unique.
427
- #
428
- # drop_constraint(:unique_name) # DROP CONSTRAINT unique_name
429
- # drop_constraint(:unique_name, :cascade=>true) # DROP CONSTRAINT unique_name CASCADE
430
526
  def drop_constraint(name, opts=OPTS)
431
527
  @operations << {:op => :drop_constraint, :name => name}.merge!(opts)
528
+ nil
432
529
  end
433
530
 
434
- # Remove a foreign key and the associated column from the DDL for the table. General options:
531
+ # Remove a foreign key and the associated column from the table. General options:
435
532
  #
436
533
  # :name :: The name of the constraint to drop. If not given, uses the same name
437
534
  # that would be used by add_foreign_key with the same columns.
@@ -442,11 +539,15 @@ module Sequel
442
539
  # drop_foreign_key(:artist_id) # DROP CONSTRAINT table_artist_id_fkey, DROP COLUMN artist_id
443
540
  # drop_foreign_key([:name]) # DROP CONSTRAINT table_name_fkey
444
541
  def drop_foreign_key(name, opts=OPTS)
542
+ if !name.is_a?(Array) && opts[:foreign_key_constraint_name]
543
+ opts = Hash[opts]
544
+ opts[:name] = opts[:foreign_key_constraint_name]
545
+ end
445
546
  drop_composite_foreign_key(Array(name), opts)
446
547
  drop_column(name) unless name.is_a?(Array)
447
548
  end
448
549
 
449
- # Remove an index from the DDL for the table. General options:
550
+ # Remove an index from the table. General options:
450
551
  #
451
552
  # :name :: The name of the index to drop. If not given, uses the same name
452
553
  # that would be used by add_index with the same columns.
@@ -460,29 +561,36 @@ module Sequel
460
561
  #
461
562
  # drop_index(:artist_id) # DROP INDEX table_artist_id_index
462
563
  # drop_index([:a, :b]) # DROP INDEX table_a_b_index
463
- # drop_index([:a, :b], :name=>:foo) # DROP INDEX foo
564
+ # drop_index([:a, :b], name: :foo) # DROP INDEX foo
464
565
  def drop_index(columns, options=OPTS)
465
566
  @operations << {:op => :drop_index, :columns => Array(columns)}.merge!(options)
567
+ nil
466
568
  end
467
569
 
468
- # Modify a column's name in the DDL for the table.
570
+ # Rename one of the table's columns.
469
571
  #
470
572
  # rename_column(:name, :artist_name) # RENAME COLUMN name TO artist_name
471
573
  def rename_column(name, new_name, opts = OPTS)
472
574
  @operations << {:op => :rename_column, :name => name, :new_name => new_name}.merge!(opts)
575
+ nil
473
576
  end
474
577
 
475
- # Modify a column's default value in the DDL for the table.
578
+ # Modify the default value for one of the table's column.
476
579
  #
477
580
  # set_column_default(:artist_name, 'a') # ALTER COLUMN artist_name SET DEFAULT 'a'
478
581
  #
582
+ # To remove an existing default value, use +nil+ as the value:
583
+ #
584
+ # set_column_default(:artist_name, nil) # ALTER COLUMN artist_name SET DEFAULT NULL
585
+ #
479
586
  # On MySQL, make sure to use a symbol for the name of the column, as otherwise you
480
587
  # can lose the type and NULL/NOT NULL setting for the column.
481
588
  def set_column_default(name, default)
482
589
  @operations << {:op => :set_column_default, :name => name, :default => default}
590
+ nil
483
591
  end
484
592
 
485
- # Modify a column's type in the DDL for the table.
593
+ # Modify the type of one of the table's column.
486
594
  #
487
595
  # set_column_type(:artist_name, 'char(10)') # ALTER COLUMN artist_name TYPE char(10)
488
596
  #
@@ -494,6 +602,7 @@ module Sequel
494
602
  # can lose the default and NULL/NOT NULL setting for the column.
495
603
  def set_column_type(name, type, opts=OPTS)
496
604
  @operations << {:op => :set_column_type, :name => name, :type => type}.merge!(opts)
605
+ nil
497
606
  end
498
607
 
499
608
  # Set a given column as allowing NULL values.
@@ -504,6 +613,7 @@ module Sequel
504
613
  # can lose the default and type for the column.
505
614
  def set_column_allow_null(name, allow_null=true)
506
615
  @operations << {:op => :set_column_null, :name => name, :null => allow_null}
616
+ nil
507
617
  end
508
618
 
509
619
  # Set a given column as not allowing NULL values.
@@ -521,16 +631,19 @@ module Sequel
521
631
  # Add a composite primary key constraint
522
632
  def add_composite_primary_key(columns, opts)
523
633
  @operations << {:op => :add_constraint, :type => :primary_key, :columns => columns}.merge!(opts)
634
+ nil
524
635
  end
525
636
 
526
637
  # Add a composite foreign key constraint
527
638
  def add_composite_foreign_key(columns, table, opts)
528
639
  @operations << {:op => :add_constraint, :type => :foreign_key, :columns => columns, :table => table}.merge!(opts)
640
+ nil
529
641
  end
530
642
 
531
643
  # Drop a composite foreign key constraint
532
644
  def drop_composite_foreign_key(columns, opts)
533
- @operations << {:op => :drop_constraint, :type => :foreign_key, :columns => columns}.merge!(opts)
645
+ @operations << opts.merge(:op => :drop_constraint, :type => :foreign_key, :columns => columns)
646
+ nil
534
647
  end
535
648
  end
536
649
  end