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,32 +7,19 @@ module Sequel
5
7
  # These methods execute code on the database that modifies the database's schema.
6
8
  # ---------------------
7
9
 
8
- AUTOINCREMENT = 'AUTOINCREMENT'.freeze
9
- COMMA_SEPARATOR = ', '.freeze
10
- NOT_NULL = ' NOT NULL'.freeze
11
- NULL = ' NULL'.freeze
12
- PRIMARY_KEY = ' PRIMARY KEY'.freeze
13
- TEMPORARY = 'TEMPORARY '.freeze
14
- UNDERSCORE = '_'.freeze
15
- UNIQUE = ' UNIQUE'.freeze
16
- UNSIGNED = ' UNSIGNED'.freeze
17
-
18
10
  # The order of column modifiers to use when defining a column.
19
- COLUMN_DEFINITION_ORDER = [:collate, :default, :null, :unique, :primary_key, :auto_increment, :references]
20
-
21
- # The default options for join table columns.
22
- DEFAULT_JOIN_TABLE_COLUMN_OPTIONS = {:null=>false}
11
+ COLUMN_DEFINITION_ORDER = [:collate, :default, :null, :unique, :primary_key, :auto_increment, :references].freeze
23
12
 
24
13
  # The alter table operations that are combinable.
25
14
  COMBINABLE_ALTER_TABLE_OPS = [:add_column, :drop_column, :rename_column,
26
15
  :set_column_type, :set_column_default, :set_column_null,
27
- :add_constraint, :drop_constraint]
16
+ :add_constraint, :drop_constraint].freeze
28
17
 
29
18
  # Adds a column to the specified table. This method expects a column name,
30
19
  # a datatype and optionally a hash with additional constraints and options:
31
20
  #
32
- # DB.add_column :items, :name, :text, :unique => true, :null => false
33
- # 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'
34
23
  #
35
24
  # See <tt>alter_table</tt>.
36
25
  def add_column(table, *args)
@@ -40,9 +29,10 @@ module Sequel
40
29
  # Adds an index to a table for the given columns:
41
30
  #
42
31
  # DB.add_index :posts, :title
43
- # DB.add_index :posts, [:author, :title], :unique => true
32
+ # DB.add_index :posts, [:author, :title], unique: true
44
33
  #
45
34
  # Options:
35
+ #
46
36
  # :ignore_errors :: Ignore any DatabaseErrors that are raised
47
37
  # :name :: Name to use for index instead of default
48
38
  #
@@ -54,16 +44,17 @@ module Sequel
54
44
  rescue DatabaseError
55
45
  raise unless e
56
46
  end
47
+ nil
57
48
  end
58
49
 
59
50
  # Alters the given table with the specified block. Example:
60
51
  #
61
52
  # DB.alter_table :items do
62
- # add_column :category, :text, :default => 'ruby'
53
+ # add_column :category, String, default: 'ruby'
63
54
  # drop_column :category
64
55
  # rename_column :cntr, :counter
65
- # set_column_type :value, :float
66
- # set_column_default :value, :float
56
+ # set_column_type :value, Float
57
+ # set_column_default :value, 4.2
67
58
  # add_index [:group, :category]
68
59
  # drop_index [:group, :category]
69
60
  # end
@@ -73,8 +64,8 @@ module Sequel
73
64
  # available for index definition.
74
65
  #
75
66
  # See <tt>Schema::AlterTableGenerator</tt> and the {"Migrations and Schema Modification" guide}[rdoc-ref:doc/migration.rdoc].
76
- def alter_table(name, generator=nil, &block)
77
- generator ||= alter_table_generator(&block)
67
+ def alter_table(name, &block)
68
+ generator = alter_table_generator(&block)
78
69
  remove_cached_schema(name)
79
70
  apply_alter_table_generator(name, generator)
80
71
  nil
@@ -89,7 +80,7 @@ module Sequel
89
80
  # Create a join table using a hash of foreign keys to referenced
90
81
  # table names. Example:
91
82
  #
92
- # create_join_table(:cat_id=>:cats, :dog_id=>:dogs)
83
+ # create_join_table(cat_id: :cats, dog_id: :dogs)
93
84
  # # CREATE TABLE cats_dogs (
94
85
  # # cat_id integer NOT NULL REFERENCES cats,
95
86
  # # dog_id integer NOT NULL REFERENCES dogs,
@@ -102,15 +93,22 @@ module Sequel
102
93
  # key ensures that entries in the table are unique, which is the typical
103
94
  # desire for a join table.
104
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
+ #
105
103
  # You can provide column options by making the values in the hash
106
104
  # be option hashes, so long as the option hashes have a :table
107
105
  # entry giving the table referenced:
108
106
  #
109
- # 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)
110
108
  #
111
109
  # You can provide a second argument which is a table options hash:
112
110
  #
113
- # create_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :temp=>true)
111
+ # create_join_table({cat_id: :cats, dog_id: :dogs}, temp: true)
114
112
  #
115
113
  # Some table options are handled specially:
116
114
  #
@@ -119,19 +117,20 @@ module Sequel
119
117
  # :no_index :: Set to true not to create the second index.
120
118
  # :no_primary_key :: Set to true to not create the primary key.
121
119
  def create_join_table(hash, options=OPTS)
122
- keys = hash.keys.sort_by(&:to_s)
120
+ keys = hash.keys.sort
123
121
  create_table(join_table_name(hash, options), options) do
124
122
  keys.each do |key|
125
123
  v = hash[key]
126
124
  unless v.is_a?(Hash)
127
125
  v = {:table=>v}
128
126
  end
129
- v = DEFAULT_JOIN_TABLE_COLUMN_OPTIONS.merge(v)
127
+ v[:null] = false unless v.has_key?(:null)
130
128
  foreign_key(key, v)
131
129
  end
132
130
  primary_key(keys) unless options[:no_primary_key]
133
- index(keys.reverse, options[:index_options] || {}) unless options[:no_index]
131
+ index(keys.reverse, options[:index_options] || OPTS) unless options[:no_index]
134
132
  end
133
+ nil
135
134
  end
136
135
 
137
136
  # Forcibly create a join table, attempting to drop it if it already exists, then creating it.
@@ -153,7 +152,7 @@ module Sequel
153
152
  #
154
153
  # DB.create_table :posts do
155
154
  # primary_key :id
156
- # column :title, :text
155
+ # column :title, String
157
156
  # String :content
158
157
  # index :title
159
158
  # end
@@ -182,11 +181,11 @@ module Sequel
182
181
  # where keys are option names and values are option values. Note
183
182
  # that option names are unquoted, so you should not use untrusted
184
183
  # keys.
184
+ # :tablespace :: The tablespace to use for the table.
185
185
  #
186
- # See <tt>Schema::Generator</tt> and the {"Schema Modification" guide}[rdoc-ref:doc/schema_modification.rdoc].
186
+ # See <tt>Schema::CreateTableGenerator</tt> and the {"Schema Modification" guide}[rdoc-ref:doc/schema_modification.rdoc].
187
187
  def create_table(name, options=OPTS, &block)
188
188
  remove_cached_schema(name)
189
- options = {:generator=>options} if options.is_a?(Schema::CreateTableGenerator)
190
189
  if sql = options[:as]
191
190
  raise(Error, "can't provide both :as option and block to create_table") if block
192
191
  create_table_as(name, sql, options)
@@ -194,8 +193,8 @@ module Sequel
194
193
  generator = options[:generator] || create_table_generator(&block)
195
194
  create_table_from_generator(name, generator, options)
196
195
  create_table_indexes_from_generator(name, generator, options)
197
- nil
198
196
  end
197
+ nil
199
198
  end
200
199
 
201
200
  # Forcibly create a table, attempting to drop it if it already exists, then creating it.
@@ -233,7 +232,7 @@ module Sequel
233
232
  # Creates a view, replacing a view with the same name if one already exists.
234
233
  #
235
234
  # DB.create_or_replace_view(:some_items, "SELECT * FROM items WHERE price < 100")
236
- # DB.create_or_replace_view(:some_items, DB[:items].filter(:category => 'ruby'))
235
+ # DB.create_or_replace_view(:some_items, DB[:items].where(category: 'ruby'))
237
236
  #
238
237
  # For databases where replacing a view is not natively supported, support
239
238
  # is emulated by dropping a view with the same name before creating the view.
@@ -245,6 +244,7 @@ module Sequel
245
244
  end
246
245
 
247
246
  create_view(name, source, options)
247
+ nil
248
248
  end
249
249
 
250
250
  # Creates a view based on a dataset or an SQL string:
@@ -253,11 +253,11 @@ module Sequel
253
253
  # # CREATE VIEW cheap_items AS
254
254
  # # SELECT * FROM items WHERE price < 100
255
255
  #
256
- # DB.create_view(:ruby_items, DB[:items].where(:category => 'ruby'))
256
+ # DB.create_view(:ruby_items, DB[:items].where(category: 'ruby'))
257
257
  # # CREATE VIEW ruby_items AS
258
258
  # # SELECT * FROM items WHERE (category = 'ruby')
259
259
  #
260
- # DB.create_view(:checked_items, DB[:items].where(:foo), :check=>true)
260
+ # DB.create_view(:checked_items, DB[:items].where(:foo), check: true)
261
261
  # # CREATE VIEW checked_items AS
262
262
  # # SELECT * FROM items WHERE foo
263
263
  # # WITH CHECK OPTION
@@ -281,7 +281,8 @@ module Sequel
281
281
  # option. Since a recursive view requires a union that isn't
282
282
  # in a subquery, if you are providing a Dataset as the source
283
283
  # argument, if should probably call the union method with the
284
- # :all=>true and :from_self=>false options.
284
+ # all: true and from_self: false options.
285
+ # :tablespace :: The tablespace to use for materialized views.
285
286
  def create_view(name, source, options = OPTS)
286
287
  execute_ddl(create_view_sql(name, source, options))
287
288
  remove_cached_schema(name)
@@ -297,7 +298,7 @@ module Sequel
297
298
  alter_table(table) {drop_column(*args)}
298
299
  end
299
300
 
300
- # Removes an index for the given table and column/s:
301
+ # Removes an index for the given table and column(s):
301
302
  #
302
303
  # DB.drop_index :posts, :title
303
304
  # DB.drop_index :posts, [:author, :title]
@@ -310,7 +311,7 @@ module Sequel
310
311
  # Drop the join table that would have been created with the
311
312
  # same arguments to create_join_table:
312
313
  #
313
- # drop_join_table(:cat_id=>:cats, :dog_id=>:dogs)
314
+ # drop_join_table(cat_id: :cats, dog_id: :dogs)
314
315
  # # DROP TABLE cats_dogs
315
316
  def drop_join_table(hash, options=OPTS)
316
317
  drop_table(join_table_name(hash, options), options)
@@ -320,9 +321,9 @@ module Sequel
320
321
  #
321
322
  # DB.drop_table(:posts) # DROP TABLE posts
322
323
  # DB.drop_table(:posts, :comments)
323
- # DB.drop_table(:posts, :comments, :cascade=>true)
324
+ # DB.drop_table(:posts, :comments, cascade: true)
324
325
  def drop_table(*names)
325
- options = names.last.is_a?(Hash) ? names.pop : {}
326
+ options = names.last.is_a?(Hash) ? names.pop : OPTS
326
327
  names.each do |n|
327
328
  execute_ddl(drop_table_sql(n, options))
328
329
  remove_cached_schema(n)
@@ -337,7 +338,7 @@ module Sequel
337
338
  # # SELECT NULL FROM a LIMIT 1 -- check existence
338
339
  # # DROP TABLE a -- if it already exists
339
340
  def drop_table?(*names)
340
- options = names.last.is_a?(Hash) ? names.pop : {}
341
+ options = names.last.is_a?(Hash) ? names.pop : OPTS
341
342
  if supports_drop_table_if_exists?
342
343
  options = options.merge(:if_exists=>true)
343
344
  names.each do |name|
@@ -348,14 +349,15 @@ module Sequel
348
349
  drop_table(name, options) if table_exists?(name)
349
350
  end
350
351
  end
352
+ nil
351
353
  end
352
354
 
353
355
  # Drops one or more views corresponding to the given names:
354
356
  #
355
357
  # DB.drop_view(:cheap_items)
356
358
  # DB.drop_view(:cheap_items, :pricey_items)
357
- # DB.drop_view(:cheap_items, :pricey_items, :cascade=>true)
358
- # DB.drop_view(:cheap_items, :pricey_items, :if_exists=>true)
359
+ # DB.drop_view(:cheap_items, :pricey_items, cascade: true)
360
+ # DB.drop_view(:cheap_items, :pricey_items, if_exists: true)
359
361
  #
360
362
  # Options:
361
363
  # :cascade :: Also drop objects depending on this view.
@@ -364,7 +366,7 @@ module Sequel
364
366
  # PostgreSQL specific options:
365
367
  # :materialized :: Drop a materialized view.
366
368
  def drop_view(*names)
367
- options = names.last.is_a?(Hash) ? names.pop : {}
369
+ options = names.last.is_a?(Hash) ? names.pop : OPTS
368
370
  names.each do |n|
369
371
  execute_ddl(drop_view_sql(n, options))
370
372
  remove_cached_schema(n)
@@ -420,7 +422,15 @@ module Sequel
420
422
 
421
423
  # Apply the operations in the given generator to the table given by name.
422
424
  def apply_alter_table_generator(name, generator)
423
- apply_alter_table(name, generator.operations)
425
+ ops = generator.operations
426
+
427
+ unless can_add_primary_key_constraint_on_nullable_columns?
428
+ if add_pk = ops.find{|op| op[:op] == :add_constraint && op[:type] == :primary_key}
429
+ ops = add_pk[:columns].map{|column| {:op => :set_column_null, :name => column, :null => false}} + ops
430
+ end
431
+ end
432
+
433
+ apply_alter_table(name, ops)
424
434
  end
425
435
 
426
436
  # The class used for alter_table generators.
@@ -432,6 +442,7 @@ module Sequel
432
442
  def alter_table_op_sql(table, op)
433
443
  meth = "alter_table_#{op[:op]}_sql"
434
444
  if respond_to?(meth, true)
445
+ # Allow calling private methods as alter table op sql methods are private
435
446
  send(meth, table, op)
436
447
  else
437
448
  raise Error, "Unsupported ALTER TABLE operation: #{op[:op]}"
@@ -474,7 +485,7 @@ module Sequel
474
485
  "DROP CONSTRAINT #{quoted_name}#{' CASCADE' if op[:cascade]}"
475
486
  end
476
487
 
477
- # The SQL to execute to modify the DDL for the given table name. op
488
+ # The SQL to execute to modify the table. op
478
489
  # should be one of the operations returned by the AlterTableGenerator.
479
490
  def alter_table_sql(table, op)
480
491
  case op[:op]
@@ -483,12 +494,14 @@ module Sequel
483
494
  when :drop_index
484
495
  drop_index_sql(table, op)
485
496
  else
486
- "ALTER TABLE #{quote_schema_table(table)} #{alter_table_op_sql(table, op)}"
497
+ if sql = alter_table_op_sql(table, op)
498
+ "ALTER TABLE #{quote_schema_table(table)} #{sql}"
499
+ end
487
500
  end
488
501
  end
489
502
 
490
- # Array of SQL DDL modification statements for the given table,
491
- # corresponding to the DDL changes specified by the operations.
503
+ # Array of SQL statements used to modify the table,
504
+ # corresponding to changes specified by the operations.
492
505
  def alter_table_sql_list(table, operations)
493
506
  if supports_combining_alter_table_ops?
494
507
  grouped_ops = []
@@ -520,17 +533,18 @@ module Sequel
520
533
  # The SQL string specify the autoincrement property, generally used by
521
534
  # primary keys.
522
535
  def auto_increment_sql
523
- AUTOINCREMENT
536
+ 'AUTOINCREMENT'
524
537
  end
525
538
 
526
539
  # The order of the column definition, as an array of symbols.
527
540
  def column_definition_order
528
- self.class.const_get(:COLUMN_DEFINITION_ORDER)
541
+ COLUMN_DEFINITION_ORDER
529
542
  end
530
543
 
531
- # SQL DDL fragment containing the column creation SQL for the given column.
544
+ # SQL fragment containing the column creation SQL for the given column.
532
545
  def column_definition_sql(column)
533
- sql = "#{quote_identifier(column[:name])} #{type_literal(column)}"
546
+ sql = String.new
547
+ sql << "#{quote_identifier(column[:name])} #{type_literal(column)}"
534
548
  column_definition_order.each{|m| send(:"column_definition_#{m}_sql", sql, column)}
535
549
  sql
536
550
  end
@@ -555,8 +569,16 @@ module Sequel
555
569
  # Add null/not null SQL fragment to column creation SQL.
556
570
  def column_definition_null_sql(sql, column)
557
571
  null = column.fetch(:null, column[:allow_null])
558
- sql << NOT_NULL if null == false
559
- sql << NULL if null == true
572
+ if null.nil? && !can_add_primary_key_constraint_on_nullable_columns? && column[:primary_key]
573
+ null = false
574
+ end
575
+
576
+ case null
577
+ when false
578
+ sql << ' NOT NULL'
579
+ when true
580
+ sql << ' NULL'
581
+ end
560
582
  end
561
583
 
562
584
  # Add primary key SQL fragment to column creation SQL.
@@ -565,7 +587,8 @@ module Sequel
565
587
  if name = column[:primary_key_constraint_name]
566
588
  sql << " CONSTRAINT #{quote_identifier(name)}"
567
589
  end
568
- sql << PRIMARY_KEY
590
+ sql << ' PRIMARY KEY'
591
+ constraint_deferrable_sql_append(sql, column[:primary_key_deferrable])
569
592
  end
570
593
  end
571
594
 
@@ -585,44 +608,46 @@ module Sequel
585
608
  if name = column[:unique_constraint_name]
586
609
  sql << " CONSTRAINT #{quote_identifier(name)}"
587
610
  end
588
- sql << UNIQUE
611
+ sql << ' UNIQUE'
612
+ constraint_deferrable_sql_append(sql, column[:unique_deferrable])
589
613
  end
590
614
  end
591
615
 
592
616
  # SQL for all given columns, used inside a CREATE TABLE block.
593
617
  def column_list_sql(generator)
594
- (generator.columns.map{|c| column_definition_sql(c)} + generator.constraints.map{|c| constraint_definition_sql(c)}).join(COMMA_SEPARATOR)
618
+ (generator.columns.map{|c| column_definition_sql(c)} + generator.constraints.map{|c| constraint_definition_sql(c)}).join(', ')
595
619
  end
596
620
 
597
- # SQL DDL fragment for column foreign key references (column constraints)
621
+ # SQL fragment for column foreign key references (column constraints)
598
622
  def column_references_column_constraint_sql(column)
599
623
  column_references_sql(column)
600
624
  end
601
625
 
602
- # SQL DDL fragment for column foreign key references
626
+ # SQL fragment for column foreign key references
603
627
  def column_references_sql(column)
604
- sql = " REFERENCES #{quote_schema_table(column[:table])}"
605
- sql << "(#{Array(column[:key]).map{|x| quote_identifier(x)}.join(COMMA_SEPARATOR)})" if column[:key]
628
+ sql = String.new
629
+ sql << " REFERENCES #{quote_schema_table(column[:table])}"
630
+ sql << "(#{Array(column[:key]).map{|x| quote_identifier(x)}.join(', ')})" if column[:key]
606
631
  sql << " ON DELETE #{on_delete_clause(column[:on_delete])}" if column[:on_delete]
607
632
  sql << " ON UPDATE #{on_update_clause(column[:on_update])}" if column[:on_update]
608
633
  constraint_deferrable_sql_append(sql, column[:deferrable])
609
634
  sql
610
635
  end
611
636
 
612
- # SQL DDL fragment for table foreign key references (table constraints)
637
+ # SQL fragment for table foreign key references (table constraints)
613
638
  def column_references_table_constraint_sql(constraint)
614
639
  "FOREIGN KEY #{literal(constraint[:columns])}#{column_references_sql(constraint)}"
615
640
  end
616
641
 
617
642
  # Whether the given alter table operation is combinable.
618
643
  def combinable_alter_table_op?(op)
619
- # Use a dynamic lookup for easier overriding in adapters
620
644
  COMBINABLE_ALTER_TABLE_OPS.include?(op[:op])
621
645
  end
622
646
 
623
- # SQL DDL fragment specifying a constraint on a table.
647
+ # SQL fragment specifying a constraint on a table.
624
648
  def constraint_definition_sql(constraint)
625
- sql = constraint[:name] ? "CONSTRAINT #{quote_identifier(constraint[:name])} " : ""
649
+ sql = String.new
650
+ sql << "CONSTRAINT #{quote_identifier(constraint[:name])} " if constraint[:name]
626
651
  case constraint[:type]
627
652
  when :check
628
653
  check = constraint[:check]
@@ -643,7 +668,7 @@ module Sequel
643
668
  sql
644
669
  end
645
670
 
646
- # SQL DDL fragment specifying the deferrable constraint attributes.
671
+ # SQL fragment specifying the deferrable constraint attributes.
647
672
  def constraint_deferrable_sql_append(sql, defer)
648
673
  case defer
649
674
  when nil
@@ -671,14 +696,15 @@ module Sequel
671
696
  e = options[:ignore_index_errors] || options[:if_not_exists]
672
697
  generator.indexes.each do |index|
673
698
  begin
674
- index_sql_list(name, [index]).each{|sql| execute_ddl(sql)}
699
+ pr = proc{index_sql_list(name, [index]).each{|sql| execute_ddl(sql)}}
700
+ supports_transactional_ddl? ? transaction(:savepoint=>:only, &pr) : pr.call
675
701
  rescue Error
676
702
  raise unless e
677
703
  end
678
704
  end
679
705
  end
680
706
 
681
- # DDL statement for creating a table with the given name, columns, and options
707
+ # SQL statement for creating a table with the given name, columns, and options
682
708
  def create_table_sql(name, generator, options)
683
709
  unless supports_named_column_constraints?
684
710
  # Split column constraints into table constraints if they have a name
@@ -697,36 +723,48 @@ module Sequel
697
723
  end
698
724
  end
699
725
  end
726
+
727
+ unless can_add_primary_key_constraint_on_nullable_columns?
728
+ if pk = generator.constraints.find{|op| op[:type] == :primary_key}
729
+ pk[:columns].each do |column|
730
+ if matched_column = generator.columns.find{|gc| gc[:name] == column}
731
+ matched_column[:null] = false
732
+ end
733
+ end
734
+ end
735
+ end
736
+
700
737
  "#{create_table_prefix_sql(name, options)} (#{column_list_sql(generator)})"
701
738
  end
702
739
 
703
- # Run a command to create the table with the given name from the given
740
+ # Run SQL statement to create the table with the given name from the given
704
741
  # SELECT sql statement.
705
742
  def create_table_as(name, sql, options)
706
743
  sql = sql.sql if sql.is_a?(Sequel::Dataset)
707
744
  run(create_table_as_sql(name, sql, options))
708
745
  end
709
746
 
710
- # DDL statement for creating a table from the result of a SELECT statement.
747
+ # SQL statement for creating a table from the result of a SELECT statement.
711
748
  # +sql+ should be a string representing a SELECT query.
712
749
  def create_table_as_sql(name, sql, options)
713
750
  "#{create_table_prefix_sql(name, options)} AS #{sql}"
714
751
  end
715
752
 
716
- # DDL fragment for initial part of CREATE TABLE statement
753
+ # SQL fragment for initial part of CREATE TABLE statement
717
754
  def create_table_prefix_sql(name, options)
718
755
  "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)}"
719
756
  end
720
757
 
721
- # DDL fragment for initial part of CREATE VIEW statement
758
+ # SQL fragment for initial part of CREATE VIEW statement
722
759
  def create_view_prefix_sql(name, options)
723
760
  create_view_sql_append_columns("CREATE #{'OR REPLACE 'if options[:replace]}VIEW #{quote_schema_table(name)}", options[:columns])
724
761
  end
725
762
 
726
- # DDL statement for creating a view.
763
+ # SQL statement for creating a view.
727
764
  def create_view_sql(name, source, options)
728
765
  source = source.sql if source.is_a?(Dataset)
729
- sql = "#{create_view_prefix_sql(name, options)} AS #{source}"
766
+ sql = String.new
767
+ sql << "#{create_view_prefix_sql(name, options)} AS #{source}"
730
768
  if check = options[:check]
731
769
  sql << " WITH#{' LOCAL' if check == :local} CHECK OPTION"
732
770
  end
@@ -736,7 +774,7 @@ module Sequel
736
774
  # Append the column list to the SQL, if a column list is given.
737
775
  def create_view_sql_append_columns(sql, columns)
738
776
  if columns
739
- sql << ' ('
777
+ sql += ' ('
740
778
  schema_utility_dataset.send(:identifier_list_append, sql, columns)
741
779
  sql << ')'
742
780
  end
@@ -747,7 +785,7 @@ module Sequel
747
785
  # for certain databases.
748
786
  def default_index_name(table_name, columns)
749
787
  schema, table = schema_and_table(table_name)
750
- "#{"#{schema}_" if schema}#{table}_#{columns.map{|c| [String, Symbol].any?{|cl| c.is_a?(cl)} ? c : literal(c).gsub(/\W/, '_')}.join(UNDERSCORE)}_index"
788
+ "#{"#{schema}_" if schema}#{table}_#{columns.map{|c| [String, Symbol].any?{|cl| c.is_a?(cl)} ? c : literal(c).gsub(/\W/, '_')}.join('_')}_index"
751
789
  end
752
790
 
753
791
  # Get foreign key name for given table and columns.
@@ -773,11 +811,25 @@ module Sequel
773
811
  end
774
812
 
775
813
  # Proxy the filter_expr call to the dataset, used for creating constraints.
776
- def filter_expr(*args, &block)
777
- schema_utility_dataset.literal(schema_utility_dataset.send(:filter_expr, *args, &block))
814
+ # Support passing Proc arguments as blocks, as well as treating plain strings
815
+ # as literal strings, so that previous migrations that used this API do not break.
816
+ def filter_expr(arg=nil, &block)
817
+ if arg.is_a?(Proc) && !block
818
+ block = arg
819
+ arg = nil
820
+ elsif arg.is_a?(String)
821
+ arg = Sequel.lit(arg)
822
+ elsif arg.is_a?(Array)
823
+ if arg.first.is_a?(String)
824
+ arg = Sequel.lit(*arg)
825
+ elsif arg.length > 1
826
+ arg = Sequel.&(*arg)
827
+ end
828
+ end
829
+ schema_utility_dataset.literal(schema_utility_dataset.send(:filter_expr, arg, &block))
778
830
  end
779
831
 
780
- # SQL DDL statement for creating an index for the table with the given name
832
+ # SQL statement for creating an index for the table with the given name
781
833
  # and index specifications.
782
834
  def index_definition_sql(table_name, index)
783
835
  index_name = index[:name] || default_index_name(table_name, index[:columns])
@@ -786,7 +838,7 @@ module Sequel
786
838
  "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]}"
787
839
  end
788
840
 
789
- # Array of SQL DDL statements, one for each index specification,
841
+ # Array of SQL statements, one for each index specification,
790
842
  # for the given table.
791
843
  def index_sql_list(table_name, indexes)
792
844
  indexes.map{|i| index_definition_sql(table_name, i)}
@@ -818,7 +870,7 @@ module Sequel
818
870
  end
819
871
  end
820
872
 
821
- # SQL DDL ON DELETE fragment to use, based on the given action.
873
+ # SQL fragment to use for ON DELETE, based on the given action.
822
874
  # The following actions are recognized:
823
875
  #
824
876
  # :cascade :: Delete rows referencing this row.
@@ -845,7 +897,7 @@ module Sequel
845
897
  schema_utility_dataset.quote_schema_table(table)
846
898
  end
847
899
 
848
- # SQL DDL statement for renaming a table.
900
+ # SQL statement for renaming a table.
849
901
  def rename_table_sql(name, new_name)
850
902
  "ALTER TABLE #{quote_schema_table(name)} RENAME TO #{quote_schema_table(new_name)}"
851
903
  end
@@ -870,14 +922,21 @@ module Sequel
870
922
  schema_utility_dataset.split_qualifiers(table_name)
871
923
  end
872
924
 
873
- # SQL DDL fragment for temporary table
925
+ # SQL fragment for temporary table
874
926
  def temporary_table_sql
875
- self.class.const_get(:TEMPORARY)
927
+ 'TEMPORARY '
876
928
  end
877
929
 
878
930
  # SQL fragment specifying the type of a given column.
879
931
  def type_literal(column)
880
- column[:type].is_a?(Class) ? type_literal_generic(column) : type_literal_specific(column)
932
+ case column[:type]
933
+ when Class
934
+ type_literal_generic(column)
935
+ when :Bignum
936
+ type_literal_generic_bignum_symbol(column)
937
+ else
938
+ type_literal_specific(column)
939
+ end
881
940
  end
882
941
 
883
942
  # SQL fragment specifying the full type of a column,
@@ -885,6 +944,7 @@ module Sequel
885
944
  def type_literal_generic(column)
886
945
  meth = "type_literal_generic_#{column[:type].name.to_s.downcase}"
887
946
  if respond_to?(meth, true)
947
+ # Allow calling private methods as per type literal generic methods are private
888
948
  send(meth, column)
889
949
  else
890
950
  raise Error, "Unsupported ruby class used as database type: #{column[:type]}"
@@ -896,8 +956,8 @@ module Sequel
896
956
  type_literal_generic_numeric(column)
897
957
  end
898
958
 
899
- # Sequel uses the bigint type by default for Bignums.
900
- def type_literal_generic_bignum(column)
959
+ # Sequel uses the bigint type by default for :Bignum symbol.
960
+ def type_literal_generic_bignum_symbol(column)
901
961
  :bigint
902
962
  end
903
963
 
@@ -960,7 +1020,16 @@ module Sequel
960
1020
  # Sequel uses the timestamp type by default for Time values.
961
1021
  # If the :only_time option is used, the time type is used.
962
1022
  def type_literal_generic_time(column)
963
- column[:only_time] ? :time : :timestamp
1023
+ if column[:only_time]
1024
+ type_literal_generic_only_time(column)
1025
+ else
1026
+ type_literal_generic_datetime(column)
1027
+ end
1028
+ end
1029
+
1030
+ # Use time by default for Time values if :only_time option is used.
1031
+ def type_literal_generic_only_time(column)
1032
+ :time
964
1033
  end
965
1034
 
966
1035
  # Sequel uses the boolean type by default for TrueClass and FalseClass.
@@ -975,10 +1044,10 @@ module Sequel
975
1044
  type = "double precision" if type.to_s == 'double'
976
1045
  column[:size] ||= default_string_column_size if type.to_s == 'varchar'
977
1046
  elements = column[:size] || column[:elements]
978
- "#{type}#{literal(Array(elements)) if elements}#{UNSIGNED if column[:unsigned]}"
1047
+ "#{type}#{literal(Array(elements)) if elements}#{' UNSIGNED' if column[:unsigned]}"
979
1048
  end
980
1049
 
981
- # Whether clob should be used for String :text=>true columns.
1050
+ # Whether clob should be used for String text: true columns.
982
1051
  def uses_clob_for_text?
983
1052
  false
984
1053
  end