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,817 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
2
-
3
- describe "Database schema parser" do
4
- before do
5
- @iom = DB.identifier_output_method
6
- @iim = DB.identifier_input_method
7
- @qi = DB.quote_identifiers?
8
- end
9
- after do
10
- DB.identifier_output_method = @iom
11
- DB.identifier_input_method = @iim
12
- DB.quote_identifiers = @qi
13
- DB.drop_table?(:items)
14
- end
15
-
16
- it "should handle a database with a identifier methods" do
17
- DB.identifier_output_method = :reverse
18
- DB.identifier_input_method = :reverse
19
- DB.quote_identifiers = true
20
- DB.create_table!(:items){Integer :number}
21
- begin
22
- DB.schema(:items, :reload=>true).must_be_kind_of(Array)
23
- DB.schema(:items, :reload=>true).first.first.must_equal :number
24
- ensure
25
- DB.drop_table(:items)
26
- end
27
- end
28
-
29
- it "should handle a dataset with identifier methods different than the database's" do
30
- DB.identifier_output_method = :reverse
31
- DB.identifier_input_method = :reverse
32
- DB.quote_identifiers = true
33
- DB.create_table!(:items){Integer :number}
34
- DB.identifier_output_method = @iom
35
- DB.identifier_input_method = @iim
36
- ds = DB[:items]
37
- ds.identifier_output_method = :reverse
38
- ds.identifier_input_method = :reverse
39
- begin
40
- DB.schema(ds, :reload=>true).must_be_kind_of(Array)
41
- DB.schema(ds, :reload=>true).first.first.must_equal :number
42
- ensure
43
- DB.identifier_output_method = :reverse
44
- DB.identifier_input_method = :reverse
45
- DB.drop_table(:items)
46
- end
47
- end
48
-
49
- it "should not issue an sql query if the schema has been loaded unless :reload is true" do
50
- DB.create_table!(:items){Integer :number}
51
- DB.schema(:items, :reload=>true)
52
- DB.schema(:items)
53
- DB.schema(:items, :reload=>true)
54
- end
55
-
56
- it "Model schema should include columns in the table, even if they aren't selected" do
57
- DB.create_table!(:items){String :a; Integer :number}
58
- m = Sequel::Model(DB[:items].select(:a))
59
- m.columns.must_equal [:a]
60
- m.db_schema[:number][:type].must_equal :integer
61
- end
62
-
63
- it "should raise an error when the table doesn't exist" do
64
- proc{DB.schema(:no_table)}.must_raise(Sequel::Error, Sequel::DatabaseError)
65
- end
66
-
67
- it "should return the schema correctly" do
68
- DB.create_table!(:items){Integer :number}
69
- schema = DB.schema(:items, :reload=>true)
70
- schema.must_be_kind_of(Array)
71
- schema.length.must_equal 1
72
- col = schema.first
73
- col.must_be_kind_of(Array)
74
- col.length.must_equal 2
75
- col.first.must_equal :number
76
- col_info = col.last
77
- col_info.must_be_kind_of(Hash)
78
- col_info[:type].must_equal :integer
79
- DB.schema(:items)
80
- end
81
-
82
- it "should parse primary keys from the schema properly" do
83
- DB.create_table!(:items){Integer :number}
84
- DB.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.must_equal []
85
- DB.create_table!(:items){primary_key :number}
86
- DB.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.must_equal [:number]
87
- DB.create_table!(:items){Integer :number1; Integer :number2; primary_key [:number1, :number2]}
88
- DB.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.must_equal [:number1, :number2]
89
- end
90
-
91
- cspecify "should parse autoincrementing primary keys from the schema properly", :sqlite, :oracle do
92
- DB.create_table!(:items){Integer :number}
93
- DB.schema(:items).collect{|k,v| k if v[:primary_key] && v[:auto_increment]}.compact.must_equal []
94
- DB.create_table!(:items){primary_key :number}
95
- DB.schema(:items).collect{|k,v| k if v[:primary_key] && v[:auto_increment]}.compact.must_equal [:number]
96
- DB.create_table!(:items){Integer :number, :primary_key=>true}
97
- DB.schema(:items).collect{|k,v| k if v[:primary_key] && v[:auto_increment]}.compact.must_equal []
98
- end
99
-
100
- it "should parse NULL/NOT NULL from the schema properly" do
101
- DB.create_table!(:items){Integer :number, :null=>true}
102
- DB.schema(:items).first.last[:allow_null].must_equal true
103
- DB.create_table!(:items){Integer :number, :null=>false}
104
- DB.schema(:items).first.last[:allow_null].must_equal false
105
- end
106
-
107
- it "should parse defaults from the schema properly" do
108
- DB.create_table!(:items){Integer :number}
109
- DB.schema(:items).first.last[:ruby_default].must_equal nil
110
- DB.create_table!(:items){Integer :number, :default=>0}
111
- DB.schema(:items).first.last[:ruby_default].must_equal 0
112
- DB.create_table!(:items){String :a, :default=>"blah"}
113
- DB.schema(:items).first.last[:ruby_default].must_equal 'blah'
114
- end
115
-
116
- it "should make :default nil for a NULL default" do
117
- DB.create_table!(:items){Integer :number}
118
- DB.schema(:items).first.last[:default].must_equal nil
119
- DB.create_table!(:items){Integer :number, :default=>0}
120
- DB.schema(:items).first.last[:default].wont_equal nil
121
- end
122
-
123
- it "should parse current timestamp defaults from the schema properly" do
124
- DB.create_table!(:items){Time :a, :default=>Sequel::CURRENT_TIMESTAMP}
125
- DB.schema(:items).first.last[:ruby_default].must_equal Sequel::CURRENT_TIMESTAMP
126
- end
127
-
128
- cspecify "should parse current date defaults from the schema properly", :mysql, :oracle do
129
- DB.create_table!(:items){Date :a, :default=>Sequel::CURRENT_DATE}
130
- DB.schema(:items).first.last[:ruby_default].must_equal Sequel::CURRENT_DATE
131
- end
132
-
133
- cspecify "should parse types from the schema properly", [:jdbc, :db2], :oracle do
134
- DB.create_table!(:items){Integer :number}
135
- DB.schema(:items).first.last[:type].must_equal :integer
136
- DB.create_table!(:items){Fixnum :number}
137
- DB.schema(:items).first.last[:type].must_equal :integer
138
- DB.create_table!(:items){Bignum :number}
139
- DB.schema(:items).first.last[:type].must_equal :integer
140
- DB.create_table!(:items){Float :number}
141
- DB.schema(:items).first.last[:type].must_equal :float
142
- DB.create_table!(:items){BigDecimal :number, :size=>[11, 2]}
143
- DB.schema(:items).first.last[:type].must_equal :decimal
144
- DB.create_table!(:items){Numeric :number, :size=>[12, 0]}
145
- DB.schema(:items).first.last[:type].must_equal :integer
146
- DB.create_table!(:items){String :number}
147
- DB.schema(:items).first.last[:type].must_equal :string
148
- DB.create_table!(:items){Date :number}
149
- DB.schema(:items).first.last[:type].must_equal :date
150
- DB.create_table!(:items){Time :number}
151
- DB.schema(:items).first.last[:type].must_equal :datetime
152
- DB.create_table!(:items){DateTime :number}
153
- DB.schema(:items).first.last[:type].must_equal :datetime
154
- DB.create_table!(:items){File :number}
155
- DB.schema(:items).first.last[:type].must_equal :blob
156
- DB.create_table!(:items){TrueClass :number}
157
- DB.schema(:items).first.last[:type].must_equal :boolean
158
- DB.create_table!(:items){FalseClass :number}
159
- DB.schema(:items).first.last[:type].must_equal :boolean
160
- end
161
-
162
- it "should parse maximum length for string columns" do
163
- DB.create_table!(:items){String :a, :size=>4}
164
- DB.schema(:items).first.last[:max_length].must_equal 4
165
- DB.create_table!(:items){String :a, :fixed=>true, :size=>3}
166
- DB.schema(:items).first.last[:max_length].must_equal 3
167
- end
168
- end if DB.supports_schema_parsing?
169
-
170
- describe "Database index parsing" do
171
- after do
172
- DB.drop_table?(:items)
173
- end
174
-
175
- it "should parse indexes into a hash" do
176
- # Delete :deferrable entry, since not all adapters implement it
177
- f = lambda{h = DB.indexes(:items); h.values.each{|h2| h2.delete(:deferrable)}; h}
178
-
179
- DB.create_table!(:items){Integer :n; Integer :a}
180
- f.call.must_equal({})
181
- DB.add_index(:items, :n)
182
- f.call.must_equal(:items_n_index=>{:columns=>[:n], :unique=>false})
183
- DB.drop_index(:items, :n)
184
- f.call.must_equal({})
185
- DB.add_index(:items, :n, :unique=>true, :name=>:blah_blah_index)
186
- f.call.must_equal(:blah_blah_index=>{:columns=>[:n], :unique=>true})
187
- DB.add_index(:items, [:n, :a])
188
- f.call.must_equal(:blah_blah_index=>{:columns=>[:n], :unique=>true}, :items_n_a_index=>{:columns=>[:n, :a], :unique=>false})
189
- DB.drop_index(:items, :n, :name=>:blah_blah_index)
190
- f.call.must_equal(:items_n_a_index=>{:columns=>[:n, :a], :unique=>false})
191
- DB.drop_index(:items, [:n, :a])
192
- f.call.must_equal({})
193
- end
194
-
195
- it "should not include a primary key index" do
196
- DB.create_table!(:items){primary_key :n}
197
- DB.indexes(:items).must_equal({})
198
- DB.create_table!(:items){Integer :n; Integer :a; primary_key [:n, :a]}
199
- DB.indexes(:items).must_equal({})
200
- end
201
-
202
- cspecify "should not include partial indexes", :sqlite do
203
- DB.create_table!(:items){Integer :n; Integer :a; index :n, :where=>proc{n > 10}}
204
- DB.indexes(:items).must_equal({})
205
- end if DB.supports_partial_indexes?
206
- end if DB.supports_index_parsing?
207
-
208
- describe "Database foreign key parsing" do
209
- before do
210
- @db = DB
211
- @pr = lambda do |table, *expected|
212
- actual = @db.foreign_key_list(table).sort_by{|c| c[:columns].map{|s| s.to_s}.join << (c[:key]||[]).map{|s| s.to_s}.join}.map{|v| v.values_at(:columns, :table, :key)}
213
- actual.zip(expected).each do |a, e|
214
- if e.last.first == :pk
215
- if a.last == nil
216
- a.pop
217
- e.pop
218
- else
219
- e.last.shift
220
- end
221
- end
222
- a.must_equal e
223
- end
224
- actual.length.must_equal expected.length
225
- end
226
- end
227
- after do
228
- @db.drop_table?(:b, :a)
229
- end
230
-
231
- it "should parse foreign key information into an array of hashes" do
232
- @db.create_table!(:a, :engine=>:InnoDB){primary_key :c; Integer :d, :null => false, :unique => true}
233
- @db.create_table!(:b, :engine=>:InnoDB){foreign_key :e, :a}
234
- @pr[:a]
235
- @pr[:b, [[:e], :a, [:pk, :c]]]
236
-
237
- @db.alter_table(:b){add_foreign_key :f, :a, :key=>[:d]}
238
- @pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:d]]]
239
-
240
- @db.alter_table(:b){add_foreign_key [:f], :a, :key=>[:c]}
241
- @pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:c]], [[:f], :a, [:d]]]
242
-
243
- @db.alter_table(:a){add_unique_constraint [:d, :c]}
244
- @db.alter_table(:b){add_foreign_key [:f, :e], :a, :key=>[:d, :c]}
245
- @pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:c]], [[:f], :a, [:d]], [[:f, :e], :a, [:d, :c]]]
246
-
247
- @db.alter_table(:b){drop_foreign_key [:f, :e]}
248
- @pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:c]], [[:f], :a, [:d]]]
249
-
250
- @db.alter_table(:b){drop_foreign_key :e}
251
- @pr[:b, [[:f], :a, [:c]], [[:f], :a, [:d]]]
252
-
253
- proc{@db.alter_table(:b){drop_foreign_key :f}}.must_raise(Sequel::Error, Sequel::DatabaseError)
254
- @pr[:b, [[:f], :a, [:c]], [[:f], :a, [:d]]]
255
- end
256
-
257
- it "should handle composite foreign and primary keys" do
258
- @db.create_table!(:a, :engine=>:InnoDB){Integer :b, :null=>false; Integer :c, :null=>false; Integer :d, :null=>false; primary_key [:b, :c]; unique [:d, :c]}
259
- @db.create_table!(:b, :engine=>:InnoDB){Integer :e, :null=>false; Integer :f, :null=>false; Integer :g, :null=>false; foreign_key [:e, :f], :a; foreign_key [:g, :f], :a, :key=>[:d, :c]}
260
- @pr[:b, [[:e, :f], :a, [:pk, :b, :c]], [[:g, :f], :a, [:d, :c]]]
261
- end
262
- end if DB.supports_foreign_key_parsing?
263
-
264
- describe "Database schema modifiers" do
265
- before do
266
- @db = DB
267
- @ds = @db[:items]
268
- end
269
- after do
270
- # Use instead of drop_table? to work around issues on jdbc/db2
271
- @db.drop_table(:items) rescue nil
272
- @db.drop_table(:items2) rescue nil
273
- end
274
-
275
- it "should create tables correctly" do
276
- @db.create_table!(:items){Integer :number}
277
- @db.table_exists?(:items).must_equal true
278
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:number]
279
- @ds.insert([10])
280
- @ds.columns!.must_equal [:number]
281
- end
282
-
283
- it "should create tables from select statements correctly" do
284
- @db.create_table!(:items){Integer :number}
285
- @ds.insert([10])
286
- @db.create_table(:items2, :as=>@db[:items])
287
- @db.schema(:items2, :reload=>true).map{|x| x.first}.must_equal [:number]
288
- @db[:items2].columns.must_equal [:number]
289
- @db[:items2].all.must_equal [{:number=>10}]
290
- end
291
-
292
- it "should not raise an error if table doesn't exist when using drop_table :if_exists" do
293
- @db.drop_table(:items, :if_exists=>true)
294
- end if DB.supports_drop_table_if_exists?
295
-
296
- describe "views" do
297
- before do
298
- @db.drop_view(:items_view2) rescue nil
299
- @db.drop_view(:items_view) rescue nil
300
- @db.create_table!(:items){Integer :number}
301
- @ds.insert(:number=>1)
302
- @ds.insert(:number=>2)
303
- end
304
- after do
305
- @db.drop_view(:items_view2) rescue nil
306
- @db.drop_view(:items_view) rescue nil
307
- end
308
-
309
- it "should create views correctly" do
310
- @db.create_view(:items_view, @ds.where(:number=>1))
311
- @db[:items_view].map(:number).must_equal [1]
312
- end
313
-
314
- it "should create views with check options correctly" do
315
- @db.create_view(:items_view, @ds.where{number > 2}, :check=>true)
316
- proc{@db[:items_view].insert(1)}.must_raise(Sequel::DatabaseError)
317
- @db[:items_view].insert(3)
318
- @db[:items_view].select_order_map(:number).must_equal [3]
319
- @db.create_view(:items_view2, @db[:items_view].where{number > 1}, :check=>true)
320
- proc{@db[:items_view2].insert(1)}.must_raise(Sequel::DatabaseError)
321
- proc{@db[:items_view2].insert(2)}.must_raise(Sequel::DatabaseError)
322
- @db[:items_view2].insert(4)
323
- @db[:items_view2].select_order_map(:number).must_equal [3, 4]
324
- @ds.select_order_map(:number).must_equal [1, 2, 3, 4]
325
- end if DB.supports_views_with_check_option?
326
-
327
- it "should create views with local check options correctly" do
328
- @db.create_view(:items_view, @ds.where{number > 2})
329
- @db[:items_view].insert(3)
330
- @db[:items_view].select_order_map(:number).must_equal [3]
331
- @db.create_view(:items_view2, @db[:items_view].where{number > 1}, :check=>:local)
332
- proc{@db[:items_view2].insert(1)}.must_raise(Sequel::DatabaseError)
333
- @db[:items_view2].insert(2)
334
- @db[:items_view2].insert(4)
335
- @db[:items_view2].select_order_map(:number).must_equal [3, 4]
336
- @ds.select_order_map(:number).must_equal [1, 2, 2, 3, 4]
337
- end if DB.supports_views_with_local_check_option?
338
-
339
- cspecify "should create views with explicit columns correctly", :sqlite do
340
- @db.create_view(:items_view, @ds.where(:number=>1), :columns=>[:n])
341
- @db[:items_view].map(:n).must_equal [1]
342
- end
343
-
344
- it "should drop views correctly" do
345
- @db.create_view(:items_view, @ds.where(:number=>1))
346
- @db.drop_view(:items_view)
347
- proc{@db[:items_view].map(:number)}.must_raise(Sequel::DatabaseError)
348
- end
349
-
350
- it "should not raise an error if view doesn't exist when using drop_view :if_exists" do
351
- @db.drop_view(:items_view, :if_exists=>true)
352
- end if DB.supports_drop_table_if_exists?
353
-
354
- it "should create or replace views correctly" do
355
- @db.create_or_replace_view(:items_view, @ds.where(:number=>1))
356
- @db[:items_view].map(:number).must_equal [1]
357
- @db.create_or_replace_view(:items_view, @ds.where(:number=>2))
358
- @db[:items_view].map(:number).must_equal [2]
359
- end
360
- end
361
-
362
- it "should handle create table in a rolled back transaction" do
363
- @db.drop_table?(:items)
364
- @db.transaction(:rollback=>:always){@db.create_table(:items){Integer :number}}
365
- @db.table_exists?(:items).must_equal false
366
- end if DB.supports_transactional_ddl?
367
-
368
- describe "join tables" do
369
- after do
370
- @db.drop_join_table(:cat_id=>:cats, :dog_id=>:dogs) if @db.table_exists?(:cats_dogs)
371
- @db.drop_table(:cats, :dogs)
372
- @db.table_exists?(:cats_dogs).must_equal false
373
- end
374
-
375
- it "should create join tables correctly" do
376
- @db.create_table!(:cats){primary_key :id}
377
- @db.create_table!(:dogs){primary_key :id}
378
- @db.create_join_table(:cat_id=>:cats, :dog_id=>:dogs)
379
- @db.table_exists?(:cats_dogs).must_equal true
380
- end
381
- end
382
-
383
- it "should create temporary tables without raising an exception" do
384
- @db.create_table!(:items_temp, :temp=>true){Integer :number}
385
- end
386
-
387
- it "should have create_table? only create the table if it doesn't already exist" do
388
- @db.create_table!(:items){String :a}
389
- @db.create_table?(:items){String :b}
390
- @db[:items].columns.must_equal [:a]
391
- @db.drop_table?(:items)
392
- @db.create_table?(:items){String :b}
393
- @db[:items].columns.must_equal [:b]
394
- end
395
-
396
- it "should have create_table? work correctly with indexes" do
397
- @db.create_table!(:items){String :a, :index=>true}
398
- @db.create_table?(:items){String :b, :index=>true}
399
- @db[:items].columns.must_equal [:a]
400
- @db.drop_table?(:items)
401
- @db.create_table?(:items){String :b, :index=>true}
402
- @db[:items].columns.must_equal [:b]
403
- end
404
-
405
- it "should rename tables correctly" do
406
- @db.drop_table?(:items)
407
- @db.create_table!(:items2){Integer :number}
408
- @db.rename_table(:items2, :items)
409
- @db.table_exists?(:items).must_equal true
410
- @db.table_exists?(:items2).must_equal false
411
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:number]
412
- @ds.insert([10])
413
- @ds.columns!.must_equal [:number]
414
- end
415
-
416
- it "should allow creating indexes with tables" do
417
- @db.create_table!(:items){Integer :number; index :number}
418
- @db.table_exists?(:items).must_equal true
419
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:number]
420
- @ds.insert([10])
421
- @ds.columns!.must_equal [:number]
422
- end
423
-
424
- it "should allow creating partial indexes with tables" do
425
- @db.create_table!(:items){Integer :number; index :number, :where=>proc{number > 10}}
426
- @db.table_exists?(:items).must_equal true
427
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:number]
428
- @ds.insert([10])
429
- @ds.columns!.must_equal [:number]
430
- end if DB.supports_partial_indexes?
431
-
432
- it "should handle combination of default, unique, and not null" do
433
- @db.create_table!(:items){Integer :number, :default=>0, :null=>false, :unique=>true}
434
- @db.table_exists?(:items).must_equal true
435
- @db.schema(:items, :reload=>true).map{|x| x.last}.first.values_at(:ruby_default, :allow_null).must_equal [0, false]
436
- @ds.insert([10])
437
- end
438
-
439
- it "should be able to specify constraint names for column constraints" do
440
- @db.create_table!(:items2){primary_key :id, :primary_key_constraint_name=>:foo_pk}
441
- @db.create_table!(:items){foreign_key :id, :items2, :unique=>true, :foreign_key_constraint_name => :foo_fk, :unique_constraint_name => :foo_uk, :null=>false}
442
- @db.alter_table(:items){drop_constraint :foo_fk, :type=>:foreign_key; drop_constraint :foo_uk, :type=>:unique}
443
- @db.alter_table(:items2){drop_constraint :foo_pk, :type=>:primary_key}
444
- end
445
-
446
- it "should handle foreign keys correctly when creating tables" do
447
- @db.create_table!(:items) do
448
- primary_key :id
449
- foreign_key :item_id, :items
450
- unique [:item_id, :id]
451
- foreign_key [:id, :item_id], :items, :key=>[:item_id, :id]
452
- end
453
- @db.table_exists?(:items).must_equal true
454
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :item_id]
455
- @ds.columns!.must_equal [:id, :item_id]
456
- end
457
-
458
- it "should add columns to tables correctly" do
459
- @db.create_table!(:items){Integer :number}
460
- @ds.insert(:number=>10)
461
- @db.alter_table(:items){add_column :name, String}
462
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:number, :name]
463
- @ds.columns!.must_equal [:number, :name]
464
- @ds.all.must_equal [{:number=>10, :name=>nil}]
465
- end
466
-
467
- cspecify "should add primary key columns to tables correctly", :derby do
468
- @db.create_table!(:items){Integer :number}
469
- @ds.insert(:number=>10)
470
- @db.alter_table(:items){add_primary_key :id}
471
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:number, :id]
472
- @ds.columns!.must_equal [:number, :id]
473
- @ds.map(:number).must_equal [10]
474
- proc{@ds.insert(:id=>@ds.map(:id).first)}.must_raise Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError
475
- end
476
-
477
- it "should drop primary key constraints from tables correctly" do
478
- @db.create_table!(:items){Integer :number; primary_key [:number], :name=>:items_pk}
479
- @ds.insert(:number=>10)
480
- @db.alter_table(:items){drop_constraint :items_pk, :type=>:primary_key}
481
- @ds.map(:number).must_equal [10]
482
- @ds.insert(10)
483
- end
484
-
485
- it "should add foreign key columns to tables correctly" do
486
- @db.create_table!(:items){primary_key :id}
487
- @ds.insert
488
- i = @ds.get(:id)
489
- @db.alter_table(:items){add_foreign_key :item_id, :items}
490
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :item_id]
491
- @ds.columns!.must_equal [:id, :item_id]
492
- @ds.all.must_equal [{:id=>i, :item_id=>nil}]
493
- end
494
-
495
- it "should not allow NULLs in a primary key" do
496
- @db.create_table!(:items){String :id, :primary_key=>true}
497
- proc{@ds.insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
498
- end
499
-
500
- it "should rename columns correctly" do
501
- @db.create_table!(:items){Integer :id}
502
- @ds.insert(:id=>10)
503
- @db.alter_table(:items){rename_column :id, :id2}
504
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id2]
505
- @ds.columns!.must_equal [:id2]
506
- @ds.all.must_equal [{:id2=>10}]
507
- end
508
-
509
- it "should rename columns with defaults correctly" do
510
- @db.create_table!(:items){String :n, :default=>'blah'}
511
- @ds.insert
512
- @db.alter_table(:items){rename_column :n, :n2}
513
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:n2]
514
- @ds.columns!.must_equal [:n2]
515
- @ds.insert
516
- @ds.all.must_equal [{:n2=>'blah'}, {:n2=>'blah'}]
517
- end
518
-
519
- it "should rename columns with not null constraints" do
520
- @db.create_table!(:items, :engine=>:InnoDB){String :n, :null=>false}
521
- @ds.insert(:n=>'blah')
522
- @db.alter_table(:items){rename_column :n, :n2}
523
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:n2]
524
- @ds.columns!.must_equal [:n2]
525
- @ds.insert(:n2=>'blah')
526
- @ds.all.must_equal [{:n2=>'blah'}, {:n2=>'blah'}]
527
- proc{@ds.insert(:n=>nil)}.must_raise(Sequel::DatabaseError)
528
- end
529
-
530
- it "should rename columns when the table is referenced by a foreign key" do
531
- @db.create_table!(:items2){primary_key :id; Integer :a}
532
- @db.create_table!(:items){Integer :id, :primary_key=>true; foreign_key :items_id, :items2}
533
- @db[:items2].insert(:a=>10)
534
- @ds.insert(:id=>1)
535
- @db.alter_table(:items2){rename_column :a, :b}
536
- @db[:items2].insert(:b=>20)
537
- @ds.insert(:id=>2)
538
- @db[:items2].select_order_map([:id, :b]).must_equal [[1, 10], [2, 20]]
539
- end
540
-
541
- cspecify "should rename primary_key columns correctly", :db2 do
542
- @db.create_table!(:items){Integer :id, :primary_key=>true}
543
- @ds.insert(:id=>10)
544
- @db.alter_table(:items){rename_column :id, :id2}
545
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id2]
546
- @ds.columns!.must_equal [:id2]
547
- @ds.all.must_equal [{:id2=>10}]
548
- end
549
-
550
- cspecify "should set column NULL/NOT NULL correctly", [:jdbc, :db2], [:db2] do
551
- @db.create_table!(:items, :engine=>:InnoDB){Integer :id}
552
- @ds.insert(:id=>10)
553
- @db.alter_table(:items){set_column_allow_null :id, false}
554
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id]
555
- @ds.columns!.must_equal [:id]
556
- proc{@ds.insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
557
- @db.alter_table(:items){set_column_allow_null :id, true}
558
- @ds.insert(:id=>nil)
559
- @ds.all.must_equal [{:id=>10}, {:id=>nil}]
560
- end
561
-
562
- it "should set column defaults correctly" do
563
- @db.create_table!(:items){Integer :id}
564
- @ds.insert(:id=>10)
565
- @db.alter_table(:items){set_column_default :id, 20}
566
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id]
567
- @ds.columns!.must_equal [:id]
568
- @ds.insert
569
- @ds.all.must_equal [{:id=>10}, {:id=>20}]
570
- end
571
-
572
- cspecify "should set column types correctly", [:jdbc, :db2], [:db2], :oracle do
573
- @db.create_table!(:items){Integer :id}
574
- @ds.insert(:id=>10)
575
- @db.alter_table(:items){set_column_type :id, String}
576
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id]
577
- @ds.columns!.must_equal [:id]
578
- @ds.insert(:id=>'20')
579
- @ds.all.must_equal [{:id=>"10"}, {:id=>"20"}]
580
- end
581
-
582
- cspecify "should set column types without modifying NULL/NOT NULL", [:jdbc, :db2], [:db2], :oracle, :derby do
583
- @db.create_table!(:items){Integer :id, :null=>false, :default=>2}
584
- proc{@ds.insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
585
- @db.alter_table(:items){set_column_type :id, String}
586
- proc{@ds.insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
587
-
588
- @db.create_table!(:items){Integer :id}
589
- @ds.insert(:id=>nil)
590
- @db.alter_table(:items){set_column_type :id, String}
591
- @ds.insert(:id=>nil)
592
- @ds.map(:id).must_equal [nil, nil]
593
- end
594
-
595
- cspecify "should set column types without modifying defaults", [:jdbc, :db2], [:db2], :oracle, :derby do
596
- @db.create_table!(:items){Integer :id, :default=>0}
597
- @ds.insert
598
- @ds.map(:id).must_equal [0]
599
- @db.alter_table(:items){set_column_type :id, String}
600
- @ds.insert
601
- @ds.map(:id).must_equal ['0', '0']
602
-
603
- @db.create_table!(:items){String :id, :default=>'a'}
604
- @ds.insert
605
- @ds.map(:id).must_equal %w'a'
606
- @db.alter_table(:items){set_column_type :id, String, :size=>1}
607
- @ds.insert
608
- @ds.map(:id).must_equal %w'a a'
609
- end
610
-
611
- it "should add unnamed unique constraints and foreign key table constraints correctly" do
612
- @db.create_table!(:items, :engine=>:InnoDB){Integer :id, :null => false; Integer :item_id, :null => false}
613
- @db.alter_table(:items) do
614
- add_unique_constraint [:item_id, :id]
615
- add_foreign_key [:id, :item_id], :items, :key=>[:item_id, :id]
616
- end
617
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :item_id]
618
- @ds.columns!.must_equal [:id, :item_id]
619
- @ds.insert(1, 1)
620
- proc{@ds.insert(1, 1)}.must_raise Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError
621
- proc{@ds.insert(1, 2)}.must_raise Sequel::ForeignKeyConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError
622
- end
623
-
624
- it "should add named unique constraints and foreign key table constraints correctly" do
625
- @db.create_table!(:items, :engine=>:InnoDB){Integer :id, :null=>false; Integer :item_id, :null=>false}
626
- @db.alter_table(:items) do
627
- add_unique_constraint [:item_id, :id], :name=>:unique_iii
628
- add_foreign_key [:id, :item_id], :items, :key=>[:item_id, :id], :name=>:fk_iii
629
- end
630
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :item_id]
631
- @ds.columns!.must_equal [:id, :item_id]
632
- @ds.insert(1, 1)
633
- proc{@ds.insert(1, 1)}.must_raise Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError
634
- proc{@ds.insert(1, 2)}.must_raise Sequel::ForeignKeyConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError
635
- end
636
-
637
- it "should drop unique constraints and foreign key table constraints correctly" do
638
- @db.create_table!(:items) do
639
- Integer :id
640
- Integer :item_id
641
- unique [:item_id, :id], :name=>:items_uk
642
- foreign_key [:id, :item_id], :items, :key=>[:item_id, :id], :name=>:items_fk
643
- end
644
- @db.alter_table(:items) do
645
- drop_constraint(:items_fk, :type=>:foreign_key)
646
- drop_constraint(:items_uk, :type=>:unique)
647
- end
648
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :item_id]
649
- @ds.columns!.must_equal [:id, :item_id]
650
- @ds.insert(1, 2)
651
- @ds.insert(1, 2)
652
- end
653
-
654
- it "should remove columns from tables correctly" do
655
- @db.create_table!(:items) do
656
- primary_key :id
657
- Integer :i
658
- end
659
- @ds.insert(:i=>10)
660
- @db.drop_column(:items, :i)
661
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id]
662
- end
663
-
664
- it "should remove columns with defaults from tables correctly" do
665
- @db.create_table!(:items) do
666
- primary_key :id
667
- Integer :i, :default=>20
668
- end
669
- @ds.insert(:i=>10)
670
- @db.drop_column(:items, :i)
671
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id]
672
- end
673
-
674
- it "should remove foreign key columns from tables correctly" do
675
- @db.create_table!(:items, :engine=>:InnoDB) do
676
- primary_key :id
677
- Integer :i
678
- foreign_key :item_id, :items
679
- end
680
- @ds.insert(:i=>10)
681
- @db.alter_table(:items){drop_foreign_key :item_id}
682
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :i]
683
- end if DB.supports_foreign_key_parsing?
684
-
685
- it "should remove multiple columns in a single alter_table block" do
686
- @db.create_table!(:items) do
687
- primary_key :id
688
- String :name
689
- Integer :number
690
- end
691
- @ds.insert(:number=>10)
692
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :name, :number]
693
- @db.alter_table(:items) do
694
- drop_column :name
695
- drop_column :number
696
- end
697
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id]
698
- end
699
-
700
- cspecify "should work correctly with many operations in a single alter_table call", [:jdbc, :db2], [:db2] do
701
- @db.create_table!(:items) do
702
- primary_key :id
703
- String :name2
704
- String :number2
705
- constraint :bar, Sequel.~(:id=>nil)
706
- end
707
- @ds.insert(:name2=>'A12')
708
- @db.alter_table(:items) do
709
- add_column :number, Integer
710
- drop_column :number2
711
- rename_column :name2, :name
712
- drop_constraint :bar
713
- set_column_not_null :name
714
- set_column_default :name, 'A13'
715
- add_constraint :foo, Sequel.like(:name, 'A%')
716
- end
717
- @db[:items].first.must_equal(:id=>1, :name=>'A12', :number=>nil)
718
- @db[:items].delete
719
- proc{@db[:items].insert(:name=>nil)}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
720
- @db[:items].insert(:number=>1)
721
- @db[:items].get(:name).must_equal 'A13'
722
- end
723
-
724
- it "should support deferrable foreign key constraints" do
725
- @db.create_table!(:items2){Integer :id, :primary_key=>true}
726
- @db.create_table!(:items){foreign_key :id, :items2, :deferrable=>true}
727
- proc{@db[:items].insert(1)}.must_raise(Sequel::ForeignKeyConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
728
- @db.transaction{proc{@db[:items].insert(1)}}.must_raise(Sequel::ForeignKeyConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
729
- end if DB.supports_deferrable_foreign_key_constraints?
730
-
731
- it "should support deferrable unique constraints when creating or altering tables" do
732
- @db.create_table!(:items){Integer :t; unique [:t], :name=>:atest_def, :deferrable=>true, :using=>:btree}
733
- @db[:items].insert(1)
734
- @db[:items].insert(2)
735
- proc{@db[:items].insert(2)}.must_raise(Sequel::DatabaseError, Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
736
- @db.transaction{proc{@db[:items].insert(2)}}.must_raise(Sequel::DatabaseError, Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
737
-
738
- @db.create_table!(:items){Integer :t}
739
- @db.alter_table(:items){add_unique_constraint [:t], :name=>:atest_def, :deferrable=>true, :using=>:btree}
740
- @db[:items].insert(1)
741
- @db[:items].insert(2)
742
- proc{@db[:items].insert(2)}.must_raise(Sequel::DatabaseError, Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
743
- @db.transaction{proc{@db[:items].insert(2)}}.must_raise(Sequel::DatabaseError, Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
744
- end if DB.supports_deferrable_constraints?
745
- end
746
-
747
- describe "Database#tables" do
748
- before do
749
- class ::String
750
- @@xxxxx = 0
751
- def xxxxx
752
- "xxxxx#{@@xxxxx += 1}"
753
- end
754
- end
755
- @db = DB
756
- @db.create_table(:sequel_test_table){Integer :a}
757
- @db.create_view :sequel_test_view, @db[:sequel_test_table]
758
- @iom = @db.identifier_output_method
759
- @iim = @db.identifier_input_method
760
- end
761
- after do
762
- @db.identifier_output_method = @iom
763
- @db.identifier_input_method = @iim
764
- @db.drop_view :sequel_test_view
765
- @db.drop_table :sequel_test_table
766
- end
767
-
768
- it "should return an array of symbols" do
769
- ts = @db.tables
770
- ts.must_be_kind_of(Array)
771
- ts.each{|t| t.must_be_kind_of(Symbol)}
772
- ts.must_include(:sequel_test_table)
773
- ts.wont_include(:sequel_test_view)
774
- end
775
-
776
- it "should respect the database's identifier_output_method" do
777
- @db.identifier_output_method = :xxxxx
778
- @db.identifier_input_method = :xxxxx
779
- @db.tables.each{|t| t.to_s.must_match(/\Ax{5}\d+\z/)}
780
- end
781
- end if DB.supports_table_listing?
782
-
783
- describe "Database#views" do
784
- before do
785
- class ::String
786
- @@xxxxx = 0
787
- def xxxxx
788
- "xxxxx#{@@xxxxx += 1}"
789
- end
790
- end
791
- @db = DB
792
- @db.create_table(:sequel_test_table){Integer :a}
793
- @db.create_view :sequel_test_view, @db[:sequel_test_table]
794
- @iom = @db.identifier_output_method
795
- @iim = @db.identifier_input_method
796
- end
797
- after do
798
- @db.identifier_output_method = @iom
799
- @db.identifier_input_method = @iim
800
- @db.drop_view :sequel_test_view
801
- @db.drop_table :sequel_test_table
802
- end
803
-
804
- it "should return an array of symbols" do
805
- ts = @db.views
806
- ts.must_be_kind_of(Array)
807
- ts.each{|t| t.must_be_kind_of(Symbol)}
808
- ts.wont_include(:sequel_test_table)
809
- ts.must_include(:sequel_test_view)
810
- end
811
-
812
- it "should respect the database's identifier_output_method" do
813
- @db.identifier_output_method = :xxxxx
814
- @db.identifier_input_method = :xxxxx
815
- @db.views.each{|t| t.to_s.must_match(/\Ax{5}\d+\z/)}
816
- end
817
- end if DB.supports_view_listing?