sequel 5.20.0 → 5.49.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 (511) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +398 -1922
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +7 -7
  5. data/doc/advanced_associations.rdoc +4 -4
  6. data/doc/association_basics.rdoc +80 -16
  7. data/doc/cheat_sheet.rdoc +6 -5
  8. data/doc/code_order.rdoc +10 -12
  9. data/doc/dataset_filtering.rdoc +17 -2
  10. data/doc/fork_safety.rdoc +84 -0
  11. data/doc/migration.rdoc +11 -5
  12. data/doc/model_dataset_method_design.rdoc +1 -1
  13. data/doc/model_plugins.rdoc +1 -1
  14. data/doc/opening_databases.rdoc +10 -2
  15. data/doc/postgresql.rdoc +82 -3
  16. data/doc/querying.rdoc +4 -4
  17. data/doc/release_notes/5.21.0.txt +87 -0
  18. data/doc/release_notes/5.22.0.txt +48 -0
  19. data/doc/release_notes/5.23.0.txt +56 -0
  20. data/doc/release_notes/5.24.0.txt +56 -0
  21. data/doc/release_notes/5.25.0.txt +32 -0
  22. data/doc/release_notes/5.26.0.txt +35 -0
  23. data/doc/release_notes/5.27.0.txt +21 -0
  24. data/doc/release_notes/5.28.0.txt +16 -0
  25. data/doc/release_notes/5.29.0.txt +22 -0
  26. data/doc/release_notes/5.30.0.txt +20 -0
  27. data/doc/release_notes/5.31.0.txt +148 -0
  28. data/doc/release_notes/5.32.0.txt +46 -0
  29. data/doc/release_notes/5.33.0.txt +24 -0
  30. data/doc/release_notes/5.34.0.txt +40 -0
  31. data/doc/release_notes/5.35.0.txt +56 -0
  32. data/doc/release_notes/5.36.0.txt +60 -0
  33. data/doc/release_notes/5.37.0.txt +30 -0
  34. data/doc/release_notes/5.38.0.txt +28 -0
  35. data/doc/release_notes/5.39.0.txt +19 -0
  36. data/doc/release_notes/5.40.0.txt +40 -0
  37. data/doc/release_notes/5.41.0.txt +25 -0
  38. data/doc/release_notes/5.42.0.txt +136 -0
  39. data/doc/release_notes/5.43.0.txt +98 -0
  40. data/doc/release_notes/5.44.0.txt +32 -0
  41. data/doc/release_notes/5.45.0.txt +34 -0
  42. data/doc/release_notes/5.46.0.txt +87 -0
  43. data/doc/release_notes/5.47.0.txt +59 -0
  44. data/doc/release_notes/5.48.0.txt +14 -0
  45. data/doc/release_notes/5.49.0.txt +59 -0
  46. data/doc/sharding.rdoc +2 -0
  47. data/doc/sql.rdoc +13 -1
  48. data/doc/testing.rdoc +20 -7
  49. data/doc/transactions.rdoc +0 -8
  50. data/doc/validations.rdoc +1 -1
  51. data/doc/virtual_rows.rdoc +1 -1
  52. data/lib/sequel/adapters/ado/access.rb +1 -1
  53. data/lib/sequel/adapters/ado.rb +43 -35
  54. data/lib/sequel/adapters/ibmdb.rb +2 -2
  55. data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
  56. data/lib/sequel/adapters/jdbc/postgresql.rb +11 -17
  57. data/lib/sequel/adapters/jdbc/sqlite.rb +29 -0
  58. data/lib/sequel/adapters/jdbc.rb +24 -6
  59. data/lib/sequel/adapters/mysql.rb +1 -1
  60. data/lib/sequel/adapters/mysql2.rb +2 -3
  61. data/lib/sequel/adapters/odbc.rb +8 -6
  62. data/lib/sequel/adapters/oracle.rb +5 -4
  63. data/lib/sequel/adapters/postgres.rb +15 -9
  64. data/lib/sequel/adapters/shared/access.rb +6 -6
  65. data/lib/sequel/adapters/shared/mssql.rb +66 -21
  66. data/lib/sequel/adapters/shared/mysql.rb +27 -10
  67. data/lib/sequel/adapters/shared/oracle.rb +29 -23
  68. data/lib/sequel/adapters/shared/postgres.rb +271 -32
  69. data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
  70. data/lib/sequel/adapters/shared/sqlite.rb +161 -19
  71. data/lib/sequel/adapters/sqlanywhere.rb +1 -1
  72. data/lib/sequel/adapters/sqlite.rb +1 -1
  73. data/lib/sequel/adapters/tinytds.rb +15 -2
  74. data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -1
  75. data/lib/sequel/ast_transformer.rb +6 -0
  76. data/lib/sequel/connection_pool/sharded_single.rb +4 -1
  77. data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
  78. data/lib/sequel/connection_pool/single.rb +1 -1
  79. data/lib/sequel/connection_pool/threaded.rb +2 -2
  80. data/lib/sequel/core.rb +333 -319
  81. data/lib/sequel/database/connecting.rb +3 -4
  82. data/lib/sequel/database/logging.rb +7 -1
  83. data/lib/sequel/database/misc.rb +31 -12
  84. data/lib/sequel/database/query.rb +3 -1
  85. data/lib/sequel/database/schema_generator.rb +53 -51
  86. data/lib/sequel/database/schema_methods.rb +38 -23
  87. data/lib/sequel/database/transactions.rb +17 -18
  88. data/lib/sequel/dataset/actions.rb +14 -9
  89. data/lib/sequel/dataset/features.rb +16 -0
  90. data/lib/sequel/dataset/misc.rb +2 -2
  91. data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
  92. data/lib/sequel/dataset/prepared_statements.rb +2 -0
  93. data/lib/sequel/dataset/query.rb +26 -9
  94. data/lib/sequel/dataset/sql.rb +76 -25
  95. data/lib/sequel/dataset.rb +4 -2
  96. data/lib/sequel/deprecated.rb +3 -1
  97. data/lib/sequel/exceptions.rb +2 -0
  98. data/lib/sequel/extensions/_pretty_table.rb +1 -2
  99. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  100. data/lib/sequel/extensions/async_thread_pool.rb +438 -0
  101. data/lib/sequel/extensions/blank.rb +8 -0
  102. data/lib/sequel/extensions/columns_introspection.rb +1 -2
  103. data/lib/sequel/extensions/connection_expiration.rb +2 -2
  104. data/lib/sequel/extensions/connection_validator.rb +2 -2
  105. data/lib/sequel/extensions/core_refinements.rb +2 -0
  106. data/lib/sequel/extensions/date_arithmetic.rb +36 -24
  107. data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -1
  108. data/lib/sequel/extensions/eval_inspect.rb +2 -0
  109. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  110. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  111. data/lib/sequel/extensions/index_caching.rb +9 -7
  112. data/lib/sequel/extensions/inflector.rb +9 -1
  113. data/lib/sequel/extensions/integer64.rb +2 -0
  114. data/lib/sequel/extensions/migration.rb +11 -3
  115. data/lib/sequel/extensions/named_timezones.rb +56 -8
  116. data/lib/sequel/extensions/pagination.rb +1 -1
  117. data/lib/sequel/extensions/pg_array.rb +5 -0
  118. data/lib/sequel/extensions/pg_array_ops.rb +14 -6
  119. data/lib/sequel/extensions/pg_enum.rb +11 -3
  120. data/lib/sequel/extensions/pg_extended_date_support.rb +2 -2
  121. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  122. data/lib/sequel/extensions/pg_hstore_ops.rb +54 -2
  123. data/lib/sequel/extensions/pg_inet.rb +15 -5
  124. data/lib/sequel/extensions/pg_interval.rb +36 -8
  125. data/lib/sequel/extensions/pg_json.rb +387 -123
  126. data/lib/sequel/extensions/pg_json_ops.rb +238 -0
  127. data/lib/sequel/extensions/pg_loose_count.rb +3 -1
  128. data/lib/sequel/extensions/pg_range.rb +17 -9
  129. data/lib/sequel/extensions/pg_range_ops.rb +2 -0
  130. data/lib/sequel/extensions/pg_row.rb +4 -2
  131. data/lib/sequel/extensions/pg_row_ops.rb +24 -0
  132. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  133. data/lib/sequel/extensions/query.rb +3 -0
  134. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  135. data/lib/sequel/extensions/s.rb +2 -0
  136. data/lib/sequel/extensions/schema_dumper.rb +24 -7
  137. data/lib/sequel/extensions/server_block.rb +18 -7
  138. data/lib/sequel/extensions/sql_comments.rb +2 -2
  139. data/lib/sequel/extensions/string_agg.rb +1 -1
  140. data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
  141. data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
  142. data/lib/sequel/extensions/to_dot.rb +9 -3
  143. data/lib/sequel/model/associations.rb +356 -117
  144. data/lib/sequel/model/base.rb +107 -68
  145. data/lib/sequel/model/errors.rb +10 -1
  146. data/lib/sequel/model/inflections.rb +1 -1
  147. data/lib/sequel/model/plugins.rb +9 -3
  148. data/lib/sequel/model.rb +3 -1
  149. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  150. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  151. data/lib/sequel/plugins/association_pks.rb +60 -18
  152. data/lib/sequel/plugins/association_proxies.rb +8 -2
  153. data/lib/sequel/plugins/async_thread_pool.rb +39 -0
  154. data/lib/sequel/plugins/auto_validations.rb +39 -5
  155. data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
  156. data/lib/sequel/plugins/blacklist_security.rb +1 -2
  157. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  158. data/lib/sequel/plugins/caching.rb +3 -0
  159. data/lib/sequel/plugins/class_table_inheritance.rb +33 -28
  160. data/lib/sequel/plugins/column_encryption.rb +728 -0
  161. data/lib/sequel/plugins/composition.rb +7 -2
  162. data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
  163. data/lib/sequel/plugins/constraint_validations.rb +2 -1
  164. data/lib/sequel/plugins/csv_serializer.rb +28 -9
  165. data/lib/sequel/plugins/dataset_associations.rb +4 -1
  166. data/lib/sequel/plugins/dirty.rb +60 -22
  167. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  168. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  169. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  170. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  171. data/lib/sequel/plugins/json_serializer.rb +57 -35
  172. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  173. data/lib/sequel/plugins/many_through_many.rb +108 -9
  174. data/lib/sequel/plugins/nested_attributes.rb +15 -3
  175. data/lib/sequel/plugins/pg_array_associations.rb +58 -41
  176. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +91 -30
  177. data/lib/sequel/plugins/prepared_statements.rb +15 -12
  178. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
  179. data/lib/sequel/plugins/rcte_tree.rb +43 -35
  180. data/lib/sequel/plugins/serialization.rb +8 -3
  181. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  182. data/lib/sequel/plugins/sharding.rb +11 -5
  183. data/lib/sequel/plugins/single_table_inheritance.rb +22 -15
  184. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  185. data/lib/sequel/plugins/static_cache.rb +9 -4
  186. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  187. data/lib/sequel/plugins/string_stripper.rb +1 -1
  188. data/lib/sequel/plugins/subclasses.rb +2 -0
  189. data/lib/sequel/plugins/throw_failures.rb +1 -1
  190. data/lib/sequel/plugins/timestamps.rb +1 -1
  191. data/lib/sequel/plugins/tree.rb +9 -4
  192. data/lib/sequel/plugins/typecast_on_load.rb +3 -2
  193. data/lib/sequel/plugins/unused_associations.rb +521 -0
  194. data/lib/sequel/plugins/update_or_create.rb +1 -1
  195. data/lib/sequel/plugins/validation_class_methods.rb +5 -1
  196. data/lib/sequel/plugins/validation_helpers.rb +18 -11
  197. data/lib/sequel/plugins/xml_serializer.rb +1 -1
  198. data/lib/sequel/sql.rb +20 -5
  199. data/lib/sequel/timezones.rb +63 -17
  200. data/lib/sequel/version.rb +1 -1
  201. metadata +113 -381
  202. data/Rakefile +0 -151
  203. data/doc/release_notes/4.0.0.txt +0 -262
  204. data/doc/release_notes/4.1.0.txt +0 -85
  205. data/doc/release_notes/4.10.0.txt +0 -226
  206. data/doc/release_notes/4.11.0.txt +0 -147
  207. data/doc/release_notes/4.12.0.txt +0 -105
  208. data/doc/release_notes/4.13.0.txt +0 -169
  209. data/doc/release_notes/4.14.0.txt +0 -68
  210. data/doc/release_notes/4.15.0.txt +0 -56
  211. data/doc/release_notes/4.16.0.txt +0 -36
  212. data/doc/release_notes/4.17.0.txt +0 -38
  213. data/doc/release_notes/4.18.0.txt +0 -36
  214. data/doc/release_notes/4.19.0.txt +0 -45
  215. data/doc/release_notes/4.2.0.txt +0 -129
  216. data/doc/release_notes/4.20.0.txt +0 -79
  217. data/doc/release_notes/4.21.0.txt +0 -94
  218. data/doc/release_notes/4.22.0.txt +0 -72
  219. data/doc/release_notes/4.23.0.txt +0 -65
  220. data/doc/release_notes/4.24.0.txt +0 -99
  221. data/doc/release_notes/4.25.0.txt +0 -181
  222. data/doc/release_notes/4.26.0.txt +0 -44
  223. data/doc/release_notes/4.27.0.txt +0 -78
  224. data/doc/release_notes/4.28.0.txt +0 -57
  225. data/doc/release_notes/4.29.0.txt +0 -41
  226. data/doc/release_notes/4.3.0.txt +0 -40
  227. data/doc/release_notes/4.30.0.txt +0 -37
  228. data/doc/release_notes/4.31.0.txt +0 -57
  229. data/doc/release_notes/4.32.0.txt +0 -132
  230. data/doc/release_notes/4.33.0.txt +0 -88
  231. data/doc/release_notes/4.34.0.txt +0 -86
  232. data/doc/release_notes/4.35.0.txt +0 -130
  233. data/doc/release_notes/4.36.0.txt +0 -116
  234. data/doc/release_notes/4.37.0.txt +0 -50
  235. data/doc/release_notes/4.38.0.txt +0 -67
  236. data/doc/release_notes/4.39.0.txt +0 -127
  237. data/doc/release_notes/4.4.0.txt +0 -92
  238. data/doc/release_notes/4.40.0.txt +0 -179
  239. data/doc/release_notes/4.41.0.txt +0 -77
  240. data/doc/release_notes/4.42.0.txt +0 -221
  241. data/doc/release_notes/4.43.0.txt +0 -87
  242. data/doc/release_notes/4.44.0.txt +0 -125
  243. data/doc/release_notes/4.45.0.txt +0 -370
  244. data/doc/release_notes/4.46.0.txt +0 -404
  245. data/doc/release_notes/4.47.0.txt +0 -56
  246. data/doc/release_notes/4.48.0.txt +0 -293
  247. data/doc/release_notes/4.49.0.txt +0 -222
  248. data/doc/release_notes/4.5.0.txt +0 -34
  249. data/doc/release_notes/4.6.0.txt +0 -30
  250. data/doc/release_notes/4.7.0.txt +0 -103
  251. data/doc/release_notes/4.8.0.txt +0 -175
  252. data/doc/release_notes/4.9.0.txt +0 -190
  253. data/spec/adapter_spec.rb +0 -4
  254. data/spec/adapters/db2_spec.rb +0 -170
  255. data/spec/adapters/mssql_spec.rb +0 -804
  256. data/spec/adapters/mysql_spec.rb +0 -1065
  257. data/spec/adapters/oracle_spec.rb +0 -371
  258. data/spec/adapters/postgres_spec.rb +0 -4125
  259. data/spec/adapters/spec_helper.rb +0 -44
  260. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  261. data/spec/adapters/sqlite_spec.rb +0 -652
  262. data/spec/bin_spec.rb +0 -278
  263. data/spec/core/connection_pool_spec.rb +0 -1250
  264. data/spec/core/database_spec.rb +0 -2865
  265. data/spec/core/dataset_spec.rb +0 -5515
  266. data/spec/core/deprecated_spec.rb +0 -70
  267. data/spec/core/expression_filters_spec.rb +0 -1455
  268. data/spec/core/mock_adapter_spec.rb +0 -722
  269. data/spec/core/object_graph_spec.rb +0 -336
  270. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  271. data/spec/core/schema_generator_spec.rb +0 -214
  272. data/spec/core/schema_spec.rb +0 -1826
  273. data/spec/core/spec_helper.rb +0 -24
  274. data/spec/core/version_spec.rb +0 -14
  275. data/spec/core_extensions_spec.rb +0 -763
  276. data/spec/core_model_spec.rb +0 -2
  277. data/spec/core_spec.rb +0 -1
  278. data/spec/deprecation_helper.rb +0 -30
  279. data/spec/extensions/accessed_columns_spec.rb +0 -51
  280. data/spec/extensions/active_model_spec.rb +0 -99
  281. data/spec/extensions/after_initialize_spec.rb +0 -28
  282. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  283. data/spec/extensions/association_dependencies_spec.rb +0 -125
  284. data/spec/extensions/association_pks_spec.rb +0 -423
  285. data/spec/extensions/association_proxies_spec.rb +0 -100
  286. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  287. data/spec/extensions/auto_validations_spec.rb +0 -229
  288. data/spec/extensions/blacklist_security_spec.rb +0 -95
  289. data/spec/extensions/blank_spec.rb +0 -69
  290. data/spec/extensions/boolean_readers_spec.rb +0 -93
  291. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  292. data/spec/extensions/caching_spec.rb +0 -273
  293. data/spec/extensions/caller_logging_spec.rb +0 -52
  294. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  295. data/spec/extensions/column_conflicts_spec.rb +0 -75
  296. data/spec/extensions/column_select_spec.rb +0 -129
  297. data/spec/extensions/columns_introspection_spec.rb +0 -90
  298. data/spec/extensions/columns_updated_spec.rb +0 -35
  299. data/spec/extensions/composition_spec.rb +0 -248
  300. data/spec/extensions/connection_expiration_spec.rb +0 -151
  301. data/spec/extensions/connection_validator_spec.rb +0 -144
  302. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  303. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  304. data/spec/extensions/constraint_validations_spec.rb +0 -439
  305. data/spec/extensions/core_refinements_spec.rb +0 -528
  306. data/spec/extensions/csv_serializer_spec.rb +0 -183
  307. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  308. data/spec/extensions/dataset_associations_spec.rb +0 -365
  309. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  310. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  311. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  312. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  313. data/spec/extensions/defaults_setter_spec.rb +0 -150
  314. data/spec/extensions/delay_add_association_spec.rb +0 -73
  315. data/spec/extensions/dirty_spec.rb +0 -189
  316. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  317. data/spec/extensions/eager_each_spec.rb +0 -62
  318. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  319. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  320. data/spec/extensions/error_splitter_spec.rb +0 -18
  321. data/spec/extensions/error_sql_spec.rb +0 -20
  322. data/spec/extensions/escaped_like_spec.rb +0 -40
  323. data/spec/extensions/eval_inspect_spec.rb +0 -81
  324. data/spec/extensions/finder_spec.rb +0 -260
  325. data/spec/extensions/force_encoding_spec.rb +0 -126
  326. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  327. data/spec/extensions/graph_each_spec.rb +0 -113
  328. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  329. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  330. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  331. data/spec/extensions/index_caching_spec.rb +0 -66
  332. data/spec/extensions/inflector_spec.rb +0 -183
  333. data/spec/extensions/input_transformer_spec.rb +0 -69
  334. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  335. data/spec/extensions/instance_filters_spec.rb +0 -79
  336. data/spec/extensions/instance_hooks_spec.rb +0 -246
  337. data/spec/extensions/integer64_spec.rb +0 -22
  338. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  339. data/spec/extensions/json_serializer_spec.rb +0 -336
  340. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  341. data/spec/extensions/list_spec.rb +0 -291
  342. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  343. data/spec/extensions/many_through_many_spec.rb +0 -2177
  344. data/spec/extensions/migration_spec.rb +0 -864
  345. data/spec/extensions/modification_detection_spec.rb +0 -93
  346. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  347. data/spec/extensions/named_timezones_spec.rb +0 -111
  348. data/spec/extensions/nested_attributes_spec.rb +0 -767
  349. data/spec/extensions/null_dataset_spec.rb +0 -85
  350. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  351. data/spec/extensions/pagination_spec.rb +0 -116
  352. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  353. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  354. data/spec/extensions/pg_array_spec.rb +0 -398
  355. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -172
  356. data/spec/extensions/pg_enum_spec.rb +0 -118
  357. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  358. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  359. data/spec/extensions/pg_hstore_spec.rb +0 -219
  360. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  361. data/spec/extensions/pg_inet_spec.rb +0 -72
  362. data/spec/extensions/pg_interval_spec.rb +0 -103
  363. data/spec/extensions/pg_json_ops_spec.rb +0 -289
  364. data/spec/extensions/pg_json_spec.rb +0 -262
  365. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  366. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  367. data/spec/extensions/pg_range_spec.rb +0 -519
  368. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  369. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  370. data/spec/extensions/pg_row_spec.rb +0 -363
  371. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  372. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  373. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  374. data/spec/extensions/prepared_statements_spec.rb +0 -177
  375. data/spec/extensions/pretty_table_spec.rb +0 -123
  376. data/spec/extensions/query_spec.rb +0 -94
  377. data/spec/extensions/rcte_tree_spec.rb +0 -381
  378. data/spec/extensions/round_timestamps_spec.rb +0 -39
  379. data/spec/extensions/s_spec.rb +0 -60
  380. data/spec/extensions/schema_caching_spec.rb +0 -64
  381. data/spec/extensions/schema_dumper_spec.rb +0 -870
  382. data/spec/extensions/select_remove_spec.rb +0 -38
  383. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  384. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  385. data/spec/extensions/serialization_spec.rb +0 -365
  386. data/spec/extensions/server_block_spec.rb +0 -97
  387. data/spec/extensions/server_logging_spec.rb +0 -45
  388. data/spec/extensions/sharding_spec.rb +0 -189
  389. data/spec/extensions/shared_caching_spec.rb +0 -151
  390. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  391. data/spec/extensions/singular_table_names_spec.rb +0 -22
  392. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  393. data/spec/extensions/spec_helper.rb +0 -63
  394. data/spec/extensions/split_array_nil_spec.rb +0 -24
  395. data/spec/extensions/split_values_spec.rb +0 -57
  396. data/spec/extensions/sql_comments_spec.rb +0 -33
  397. data/spec/extensions/sql_expr_spec.rb +0 -59
  398. data/spec/extensions/static_cache_spec.rb +0 -471
  399. data/spec/extensions/string_agg_spec.rb +0 -90
  400. data/spec/extensions/string_date_time_spec.rb +0 -95
  401. data/spec/extensions/string_stripper_spec.rb +0 -68
  402. data/spec/extensions/subclasses_spec.rb +0 -79
  403. data/spec/extensions/subset_conditions_spec.rb +0 -38
  404. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  405. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  406. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  407. data/spec/extensions/table_select_spec.rb +0 -83
  408. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  409. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  410. data/spec/extensions/throw_failures_spec.rb +0 -74
  411. data/spec/extensions/timestamps_spec.rb +0 -209
  412. data/spec/extensions/to_dot_spec.rb +0 -153
  413. data/spec/extensions/touch_spec.rb +0 -226
  414. data/spec/extensions/tree_spec.rb +0 -334
  415. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  416. data/spec/extensions/unlimited_update_spec.rb +0 -21
  417. data/spec/extensions/update_or_create_spec.rb +0 -83
  418. data/spec/extensions/update_primary_key_spec.rb +0 -105
  419. data/spec/extensions/update_refresh_spec.rb +0 -59
  420. data/spec/extensions/uuid_spec.rb +0 -101
  421. data/spec/extensions/validate_associated_spec.rb +0 -52
  422. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  423. data/spec/extensions/validation_contexts_spec.rb +0 -31
  424. data/spec/extensions/validation_helpers_spec.rb +0 -525
  425. data/spec/extensions/whitelist_security_spec.rb +0 -157
  426. data/spec/extensions/xml_serializer_spec.rb +0 -213
  427. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  428. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  429. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  430. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  431. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  432. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  433. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  434. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  435. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  436. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  437. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  438. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  439. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  440. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  441. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  442. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  443. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  444. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  445. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  446. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  447. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  448. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  449. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  450. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  451. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  452. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  453. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  454. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  455. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  456. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  457. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  458. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  459. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  460. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  461. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  462. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  463. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  464. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  465. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  466. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  467. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  468. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  469. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  470. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  471. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  472. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  473. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  474. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  475. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  476. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  477. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  478. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  479. data/spec/guards_helper.rb +0 -59
  480. data/spec/integration/associations_test.rb +0 -2597
  481. data/spec/integration/database_test.rb +0 -113
  482. data/spec/integration/dataset_test.rb +0 -1981
  483. data/spec/integration/eager_loader_test.rb +0 -687
  484. data/spec/integration/migrator_test.rb +0 -262
  485. data/spec/integration/model_test.rb +0 -203
  486. data/spec/integration/plugin_test.rb +0 -2396
  487. data/spec/integration/prepared_statement_test.rb +0 -405
  488. data/spec/integration/schema_test.rb +0 -889
  489. data/spec/integration/spec_helper.rb +0 -65
  490. data/spec/integration/timezone_test.rb +0 -86
  491. data/spec/integration/transaction_test.rb +0 -603
  492. data/spec/integration/type_test.rb +0 -127
  493. data/spec/model/association_reflection_spec.rb +0 -803
  494. data/spec/model/associations_spec.rb +0 -4738
  495. data/spec/model/base_spec.rb +0 -875
  496. data/spec/model/class_dataset_methods_spec.rb +0 -146
  497. data/spec/model/dataset_methods_spec.rb +0 -198
  498. data/spec/model/eager_loading_spec.rb +0 -2377
  499. data/spec/model/hooks_spec.rb +0 -370
  500. data/spec/model/inflector_spec.rb +0 -26
  501. data/spec/model/model_spec.rb +0 -956
  502. data/spec/model/plugins_spec.rb +0 -429
  503. data/spec/model/record_spec.rb +0 -2118
  504. data/spec/model/spec_helper.rb +0 -46
  505. data/spec/model/validations_spec.rb +0 -220
  506. data/spec/model_no_assoc_spec.rb +0 -1
  507. data/spec/model_spec.rb +0 -1
  508. data/spec/plugin_spec.rb +0 -1
  509. data/spec/sequel_coverage.rb +0 -15
  510. data/spec/sequel_warning.rb +0 -4
  511. data/spec/spec_config.rb +0 -12
@@ -1,889 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Database schema parser" do
4
- after do
5
- DB.drop_table?(:items)
6
- end
7
-
8
- describe "with identifier mangling" do
9
- before do
10
- @iom = DB.identifier_output_method
11
- @iim = DB.identifier_input_method
12
- @qi = DB.quote_identifiers?
13
- end
14
- after do
15
- DB.identifier_output_method = @iom
16
- DB.identifier_input_method = @iim
17
- DB.quote_identifiers = @qi
18
- end
19
-
20
- it "should handle a database with a identifier methods" do
21
- DB.identifier_output_method = :reverse
22
- DB.identifier_input_method = :reverse
23
- DB.quote_identifiers = true
24
- DB.create_table!(:items){Integer :number}
25
- begin
26
- DB.schema(:items, :reload=>true).must_be_kind_of(Array)
27
- DB.schema(:items, :reload=>true).first.first.must_equal :number
28
- ensure
29
- end
30
- end
31
-
32
- it "should handle a dataset with identifier methods different than the database's" do
33
- DB.identifier_output_method = :reverse
34
- DB.identifier_input_method = :reverse
35
- DB.quote_identifiers = true
36
- DB.create_table!(:items){Integer :number}
37
- DB.identifier_output_method = @iom
38
- DB.identifier_input_method = @iim
39
- ds = DB[:items].
40
- with_identifier_output_method(:reverse).
41
- with_identifier_input_method(:reverse)
42
- begin
43
- DB.schema(ds, :reload=>true).must_be_kind_of(Array)
44
- DB.schema(ds, :reload=>true).first.first.must_equal :number
45
- ensure
46
- DB.identifier_output_method = :reverse
47
- DB.identifier_input_method = :reverse
48
- DB.drop_table(:items)
49
- end
50
- end
51
- end if IDENTIFIER_MANGLING && !DB.frozen?
52
-
53
- it "should not issue an sql query if the schema has been loaded unless :reload is true" do
54
- DB.create_table!(:items){Integer :number}
55
- DB.schema(:items, :reload=>true)
56
- DB.schema(:items)
57
- DB.schema(:items, :reload=>true)
58
- end
59
-
60
- it "Model schema should include columns in the table, even if they aren't selected" do
61
- DB.create_table!(:items){String :a; Integer :number}
62
- m = Sequel::Model(DB[:items].select(:a))
63
- m.columns.must_equal [:a]
64
- m.db_schema[:number][:type].must_equal :integer
65
- end
66
-
67
- it "should raise an error when the table doesn't exist" do
68
- proc{DB.schema(:no_table)}.must_raise(Sequel::Error, Sequel::DatabaseError)
69
- end
70
-
71
- it "should return the schema correctly" do
72
- DB.create_table!(:items){Integer :number}
73
- schema = DB.schema(:items, :reload=>true)
74
- schema.must_be_kind_of(Array)
75
- schema.length.must_equal 1
76
- col = schema.first
77
- col.must_be_kind_of(Array)
78
- col.length.must_equal 2
79
- col.first.must_equal :number
80
- col_info = col.last
81
- col_info.must_be_kind_of(Hash)
82
- col_info[:type].must_equal :integer
83
- DB.schema(:items)
84
- end
85
-
86
- it "should parse primary keys from the schema properly" do
87
- DB.create_table!(:items){Integer :number}
88
- DB.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.must_equal []
89
- DB.create_table!(:items){primary_key :number}
90
- DB.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.must_equal [:number]
91
- DB.create_table!(:items){Integer :number1; Integer :number2; primary_key [:number1, :number2]}
92
- DB.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.must_equal [:number1, :number2]
93
- end
94
-
95
- cspecify "should parse autoincrementing primary keys from the schema properly", :sqlite, :oracle do
96
- DB.create_table!(:items){Integer :number}
97
- DB.schema(:items).collect{|k,v| k if v[:primary_key] && v[:auto_increment]}.compact.must_equal []
98
- DB.create_table!(:items){primary_key :number}
99
- DB.schema(:items).collect{|k,v| k if v[:primary_key] && v[:auto_increment]}.compact.must_equal [:number]
100
- DB.create_table!(:items){Integer :number, :primary_key=>true}
101
- DB.schema(:items).collect{|k,v| k if v[:primary_key] && v[:auto_increment]}.compact.must_equal []
102
- end
103
-
104
- it "should parse NULL/NOT NULL from the schema properly" do
105
- DB.create_table!(:items){Integer :number, :null=>true}
106
- DB.schema(:items).first.last[:allow_null].must_equal true
107
- DB.create_table!(:items){Integer :number, :null=>false}
108
- DB.schema(:items).first.last[:allow_null].must_equal false
109
- end
110
-
111
- it "should parse defaults from the schema properly" do
112
- DB.create_table!(:items){Integer :number}
113
- DB.schema(:items).first.last[:ruby_default].must_be_nil
114
- DB.create_table!(:items){Integer :number, :default=>0}
115
- DB.schema(:items).first.last[:ruby_default].must_equal 0
116
- DB.create_table!(:items){String :a, :default=>"blah"}
117
- DB.schema(:items).first.last[:ruby_default].must_equal 'blah'
118
- end
119
-
120
- it "should make :default nil for a NULL default" do
121
- DB.create_table!(:items){Integer :number}
122
- DB.schema(:items).first.last[:default].must_be_nil
123
- DB.create_table!(:items){Integer :number, :default=>0}
124
- DB.schema(:items).first.last[:default].wont_equal nil
125
- end
126
-
127
- it "should parse current timestamp defaults from the schema properly" do
128
- DB.create_table!(:items){Time :a, :default=>Sequel::CURRENT_TIMESTAMP}
129
- DB.schema(:items).first.last[:ruby_default].must_equal Sequel::CURRENT_TIMESTAMP
130
- end
131
-
132
- cspecify "should parse current date defaults from the schema properly", [proc{|db| !db.mariadb? || db.server_version <= 100200}, :mysql], :oracle do
133
- DB.create_table!(:items){Date :a, :default=>Sequel::CURRENT_DATE}
134
- DB.schema(:items).first.last[:ruby_default].must_equal Sequel::CURRENT_DATE
135
- end
136
-
137
- cspecify "should parse types from the schema properly", [:jdbc, :db2], :oracle do
138
- DB.create_table!(:items){Integer :number}
139
- DB.schema(:items).first.last[:type].must_equal :integer
140
- DB.create_table!(:items){Fixnum :number}
141
- DB.schema(:items).first.last[:type].must_equal :integer
142
- DB.create_table!(:items){Bignum :number}
143
- DB.schema(:items).first.last[:type].must_equal :integer
144
- DB.create_table!(:items){Float :number}
145
- DB.schema(:items).first.last[:type].must_equal :float
146
- DB.create_table!(:items){BigDecimal :number, :size=>[11, 2]}
147
- DB.schema(:items).first.last[:type].must_equal :decimal
148
- DB.create_table!(:items){Numeric :number, :size=>[12, 0]}
149
- DB.schema(:items).first.last[:type].must_equal :integer
150
- DB.create_table!(:items){String :number}
151
- DB.schema(:items).first.last[:type].must_equal :string
152
- DB.create_table!(:items){Date :number}
153
- DB.schema(:items).first.last[:type].must_equal :date
154
- DB.create_table!(:items){Time :number}
155
- DB.schema(:items).first.last[:type].must_equal :datetime
156
- DB.create_table!(:items){DateTime :number}
157
- DB.schema(:items).first.last[:type].must_equal :datetime
158
- DB.create_table!(:items){File :number}
159
- DB.schema(:items).first.last[:type].must_equal :blob
160
- DB.create_table!(:items){TrueClass :number}
161
- DB.schema(:items).first.last[:type].must_equal :boolean
162
- DB.create_table!(:items){FalseClass :number}
163
- DB.schema(:items).first.last[:type].must_equal :boolean
164
- end
165
-
166
- it "should round trip database types from the schema properly" do
167
- DB.create_table!(:items){String :number, :size=>50}
168
- db_type = DB.schema(:items).first.last[:db_type]
169
- DB.create_table!(:items){column :number, db_type}
170
- DB.schema(:items).first.last[:db_type].must_equal db_type
171
-
172
- DB.create_table!(:items){Numeric :number, :size=>[11,3]}
173
- db_type = DB.schema(:items).first.last[:db_type]
174
- DB.create_table!(:items){column :number, db_type}
175
- DB.schema(:items).first.last[:db_type].must_equal db_type
176
- end
177
-
178
- it "should parse maximum length for string columns" do
179
- DB.create_table!(:items){String :a, :size=>4}
180
- DB.schema(:items).first.last[:max_length].must_equal 4
181
- DB.create_table!(:items){String :a, :fixed=>true, :size=>3}
182
- DB.schema(:items).first.last[:max_length].must_equal 3
183
- end
184
- end if DB.supports_schema_parsing?
185
-
186
- describe "Database index parsing" do
187
- after do
188
- DB.drop_table?(:items)
189
- end
190
-
191
- it "should parse indexes into a hash" do
192
- [:items, Sequel.identifier(:items)].each do |table|
193
- # Delete :deferrable entry, since not all adapters implement it
194
- f = lambda{h = DB.indexes(table); h.values.each{|h2| h2.delete(:deferrable)}; h}
195
-
196
- DB.create_table!(table){Integer :n; Integer :a}
197
- f.call.must_equal({})
198
- DB.add_index(table, :n)
199
- f.call.must_equal(:items_n_index=>{:columns=>[:n], :unique=>false})
200
- DB.drop_index(table, :n)
201
- f.call.must_equal({})
202
- DB.add_index(table, :n, :unique=>true, :name=>:blah_blah_index)
203
- f.call.must_equal(:blah_blah_index=>{:columns=>[:n], :unique=>true})
204
- DB.add_index(table, [:n, :a])
205
- f.call.must_equal(:blah_blah_index=>{:columns=>[:n], :unique=>true}, :items_n_a_index=>{:columns=>[:n, :a], :unique=>false})
206
- DB.drop_index(table, :n, :name=>:blah_blah_index)
207
- f.call.must_equal(:items_n_a_index=>{:columns=>[:n, :a], :unique=>false})
208
- DB.drop_index(table, [:n, :a])
209
- f.call.must_equal({})
210
- end
211
- end
212
-
213
- it "should not include a primary key index" do
214
- DB.create_table!(:items){primary_key :n}
215
- DB.indexes(:items).must_equal({})
216
- DB.create_table!(:items){Integer :n; Integer :a; primary_key [:n, :a]}
217
- DB.indexes(:items).must_equal({})
218
- end
219
-
220
- cspecify "should not include partial indexes", [proc{|db| db.sqlite_version < 30808}, :sqlite] do
221
- DB.create_table!(:items){Integer :n; Integer :a; index :n, :where=>proc{n > 10}}
222
- DB.indexes(:items).must_equal({})
223
- end if DB.supports_partial_indexes?
224
- end if DB.supports_index_parsing?
225
-
226
- describe "Database foreign key parsing" do
227
- before do
228
- @db = DB
229
- @pr = lambda do |table, *expected|
230
- 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)}
231
- actual.zip(expected).each do |a, e|
232
- if e.last.first == :pk
233
- if a.last == nil
234
- a.pop
235
- e.pop
236
- else
237
- e.last.shift
238
- end
239
- end
240
- a.must_equal e
241
- end
242
- actual.length.must_equal expected.length
243
- end
244
- end
245
- after do
246
- @db.drop_table?(:b, :a)
247
- end
248
-
249
- it "should parse foreign key information into an array of hashes" do
250
- @db.create_table!(:a, :engine=>:InnoDB){primary_key :c; Integer :d, :null => false, :unique => true}
251
- @db.create_table!(:b, :engine=>:InnoDB){foreign_key :e, :a}
252
- @pr[:a]
253
- @pr[:b, [[:e], :a, [:pk, :c]]]
254
-
255
- @db.alter_table(:b){add_foreign_key :f, :a, :key=>[:d]}
256
- @pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:d]]]
257
-
258
- @db.alter_table(:b){add_foreign_key [:f], :a, :key=>[:c]}
259
- @pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:c]], [[:f], :a, [:d]]]
260
-
261
- @db.alter_table(:a){add_unique_constraint [:d, :c]}
262
- @db.alter_table(:b){add_foreign_key [:f, :e], :a, :key=>[:d, :c]}
263
- @pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:c]], [[:f], :a, [:d]], [[:f, :e], :a, [:d, :c]]]
264
-
265
- @db.alter_table(:b){drop_foreign_key [:f, :e]}
266
- @pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:c]], [[:f], :a, [:d]]]
267
-
268
- @db.alter_table(:b){drop_foreign_key :e}
269
- @pr[:b, [[:f], :a, [:c]], [[:f], :a, [:d]]]
270
-
271
- proc{@db.alter_table(:b){drop_foreign_key :f}}.must_raise(Sequel::Error, Sequel::DatabaseError)
272
- @pr[:b, [[:f], :a, [:c]], [[:f], :a, [:d]]]
273
- end
274
-
275
- it "should handle composite foreign and primary keys" do
276
- @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]}
277
- @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]}
278
- @pr[:b, [[:e, :f], :a, [:pk, :b, :c]], [[:g, :f], :a, [:d, :c]]]
279
- end
280
-
281
- it "should handle self-referential composite foreign and primary keys" do
282
- @db.create_table!(:a, :engine=>:InnoDB){Integer :b, :null=>false; Integer :c, :null=>false; Integer :d, :null=>false; primary_key [:b, :c]; unique [:d, :b]}
283
- @db.alter_table(:a){add_foreign_key [:b, :d], :a; add_foreign_key [:d, :c], :a; add_foreign_key [:c, :b], :a, :key=>[:d, :b]}
284
- @pr[:a, [[:b, :d], :a, [:pk, :b, :c]], [[:c, :b], :a, [:d, :b]], [[:d, :c], :a, [:pk, :b, :c]]]
285
- end
286
- end if DB.supports_foreign_key_parsing?
287
-
288
- describe "Database schema modifiers" do
289
- before do
290
- @db = DB
291
- @ds = @db[:items]
292
- end
293
- after do
294
- # Use instead of drop_table? to work around issues on jdbc/db2
295
- @db.drop_table(:items) rescue nil
296
- @db.drop_table(:items2) rescue nil
297
- end
298
-
299
- it "should create tables correctly" do
300
- @db.create_table!(:items){Integer :number}
301
- @db.table_exists?(:items).must_equal true
302
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:number]
303
- @ds.insert([10])
304
- @ds.columns!.must_equal [:number]
305
- end
306
-
307
- it "should create tables from select statements correctly" do
308
- @db.create_table!(:items){Integer :number}
309
- @ds.insert([10])
310
- @db.create_table(:items2, :as=>@db[:items])
311
- @db.schema(:items2, :reload=>true).map{|x| x.first}.must_equal [:number]
312
- @db[:items2].columns.must_equal [:number]
313
- @db[:items2].all.must_equal [{:number=>10}]
314
- end
315
-
316
- it "should not raise an error if table doesn't exist when using drop_table :if_exists" do
317
- @db.drop_table(:items, :if_exists=>true)
318
- end if DB.supports_drop_table_if_exists?
319
-
320
- describe "views" do
321
- before do
322
- @db.drop_view(:items_view2) rescue nil
323
- @db.drop_view(:items_view) rescue nil
324
- @db.create_table!(:items){Integer :number}
325
- @ds.insert(:number=>1)
326
- @ds.insert(:number=>2)
327
- end
328
- after do
329
- @db.drop_view(:items_view2) rescue nil
330
- @db.drop_view(:items_view) rescue nil
331
- end
332
-
333
- it "should create views correctly" do
334
- @db.create_view(:items_view, @ds.where(:number=>1))
335
- @db[:items_view].map(:number).must_equal [1]
336
- end
337
-
338
- it "should create views with check options correctly" do
339
- @db.create_view(:items_view, @ds.where{number > 2}, :check=>true)
340
- proc{@db[:items_view].insert(1)}.must_raise(Sequel::DatabaseError)
341
- @db[:items_view].insert(3)
342
- @db[:items_view].select_order_map(:number).must_equal [3]
343
- @db.create_view(:items_view2, @db[:items_view].where{number > 1}, :check=>true)
344
- proc{@db[:items_view2].insert(1)}.must_raise(Sequel::DatabaseError)
345
- proc{@db[:items_view2].insert(2)}.must_raise(Sequel::DatabaseError)
346
- @db[:items_view2].insert(4)
347
- @db[:items_view2].select_order_map(:number).must_equal [3, 4]
348
- @ds.select_order_map(:number).must_equal [1, 2, 3, 4]
349
- end if DB.supports_views_with_check_option?
350
-
351
- it "should create views with local check options correctly" do
352
- @db.create_view(:items_view, @ds.where{number > 2})
353
- @db[:items_view].insert(3)
354
- @db[:items_view].select_order_map(:number).must_equal [3]
355
- @db.create_view(:items_view2, @db[:items_view].where{number > 1}, :check=>:local)
356
- proc{@db[:items_view2].insert(1)}.must_raise(Sequel::DatabaseError)
357
- @db[:items_view2].insert(2)
358
- @db[:items_view2].insert(4)
359
- @db[:items_view2].select_order_map(:number).must_equal [3, 4]
360
- @ds.select_order_map(:number).must_equal [1, 2, 2, 3, 4]
361
- end if DB.supports_views_with_local_check_option?
362
-
363
- cspecify "should create views with explicit columns correctly", [proc{|db| db.sqlite_version < 30900}, :sqlite] do
364
- @db.create_view(:items_view, @ds.where(:number=>1), :columns=>[:n])
365
- @db[:items_view].map(:n).must_equal [1]
366
- end
367
-
368
- it "should drop views correctly" do
369
- @db.create_view(:items_view, @ds.where(:number=>1))
370
- @db.drop_view(:items_view)
371
- proc{@db[:items_view].map(:number)}.must_raise(Sequel::DatabaseError)
372
- end
373
-
374
- it "should not raise an error if view doesn't exist when using drop_view :if_exists" do
375
- @db.drop_view(:items_view, :if_exists=>true)
376
- end if DB.supports_drop_table_if_exists?
377
-
378
- it "should create or replace views correctly" do
379
- @db.create_or_replace_view(:items_view, @ds.where(:number=>1))
380
- @db[:items_view].map(:number).must_equal [1]
381
- @db.create_or_replace_view(:items_view, @ds.where(:number=>2))
382
- @db[:items_view].map(:number).must_equal [2]
383
- end
384
- end
385
-
386
- it "should handle create table in a rolled back transaction" do
387
- @db.drop_table?(:items)
388
- @db.transaction(:rollback=>:always){@db.create_table(:items){Integer :number}}
389
- @db.table_exists?(:items).must_equal false
390
- end if DB.supports_transactional_ddl?
391
-
392
- it "should handle errors creating indexes when ignoring index errors" do
393
- @db.drop_table?(:items)
394
- @db.transaction do
395
- @db.create_table(:items, :ignore_index_errors=>true) do
396
- Integer :n1
397
- Integer :n2
398
- index :n1, :name=>'items_n1'
399
- index :foo, :name=>'items_f'
400
- index :n2, :name=>'items_n2'
401
- index :bar, :name=>'items_g'
402
- end
403
- end
404
- @db.table_exists?(:items).must_equal true
405
- indexes = @db.indexes(:items).keys
406
- indexes.must_include :items_n1
407
- indexes.must_include :items_n2
408
- indexes.wont_include :items_f
409
- indexes.wont_include :items_g
410
- end if DB.supports_transactional_ddl? && DB.database_type != :mssql
411
-
412
- describe "join tables" do
413
- after do
414
- @db.drop_join_table(:cat_id=>:cats, :dog_id=>:dogs) if @db.table_exists?(:cats_dogs)
415
- @db.drop_table(:cats, :dogs)
416
- @db.table_exists?(:cats_dogs).must_equal false
417
- end
418
-
419
- it "should create join tables correctly" do
420
- @db.create_table!(:cats){primary_key :id}
421
- @db.create_table!(:dogs){primary_key :id}
422
- @db.create_join_table(:cat_id=>:cats, :dog_id=>:dogs)
423
- @db.table_exists?(:cats_dogs).must_equal true
424
- end
425
- end
426
-
427
- it "should create temporary tables without raising an exception" do
428
- @db.create_table!(:items_temp, :temp=>true){Integer :number}
429
- end
430
-
431
- it "should have create_table? only create the table if it doesn't already exist" do
432
- @db.create_table!(:items){String :a}
433
- @db.create_table?(:items){String :b}
434
- @db[:items].columns.must_equal [:a]
435
- @db.drop_table?(:items)
436
- @db.create_table?(:items){String :b}
437
- @db[:items].columns.must_equal [:b]
438
- end
439
-
440
- it "should have create_table? work correctly with indexes" do
441
- @db.create_table!(:items){String :a, :index=>true}
442
- @db.create_table?(:items){String :b, :index=>true}
443
- @db[:items].columns.must_equal [:a]
444
- @db.drop_table?(:items)
445
- @db.create_table?(:items){String :b, :index=>true}
446
- @db[:items].columns.must_equal [:b]
447
- end
448
-
449
- it "should rename tables correctly" do
450
- @db.drop_table?(:items)
451
- @db.create_table!(:items2){Integer :number}
452
- @db.rename_table(:items2, :items)
453
- @db.table_exists?(:items).must_equal true
454
- @db.table_exists?(:items2).must_equal false
455
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:number]
456
- @ds.insert([10])
457
- @ds.columns!.must_equal [:number]
458
- end
459
-
460
- it "should allow creating indexes with tables" do
461
- @db.create_table!(:items){Integer :number; index :number}
462
- @db.table_exists?(:items).must_equal true
463
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:number]
464
- @ds.insert([10])
465
- @ds.columns!.must_equal [:number]
466
- end
467
-
468
- it "should allow creating partial indexes with tables" do
469
- @db.create_table!(:items){Integer :number; index :number, :where=>proc{number > 10}}
470
- @db.table_exists?(:items).must_equal true
471
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:number]
472
- @ds.insert([10])
473
- @ds.columns!.must_equal [:number]
474
- end if DB.supports_partial_indexes?
475
-
476
- it "should handle combination of default, unique, and not null" do
477
- @db.create_table!(:items){Integer :number, :default=>0, :null=>false, :unique=>true}
478
- @db.table_exists?(:items).must_equal true
479
- @db.schema(:items, :reload=>true).map{|x| x.last}.first.values_at(:ruby_default, :allow_null).must_equal [0, false]
480
- @ds.insert([10])
481
- end
482
-
483
- it "should be able to specify constraint names for column constraints" do
484
- @db.create_table!(:items2){primary_key :id, :primary_key_constraint_name=>:foo_pk}
485
- @db.create_table!(:items){foreign_key :id, :items2, :unique=>true, :foreign_key_constraint_name => :foo_fk, :unique_constraint_name => :foo_uk, :null=>false}
486
- @db.alter_table(:items){drop_constraint :foo_fk, :type=>:foreign_key; drop_constraint :foo_uk, :type=>:unique}
487
- @db.alter_table(:items2){drop_constraint :foo_pk, :type=>:primary_key}
488
- end
489
-
490
- it "should handle foreign keys correctly when creating tables" do
491
- @db.create_table!(:items) do
492
- primary_key :id
493
- foreign_key :item_id, :items
494
- unique [:item_id, :id]
495
- foreign_key [:id, :item_id], :items, :key=>[:item_id, :id]
496
- end
497
- @db.table_exists?(:items).must_equal true
498
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :item_id]
499
- @ds.columns!.must_equal [:id, :item_id]
500
- end
501
-
502
- it "should add columns to tables correctly" do
503
- @db.create_table!(:items){Integer :number}
504
- @ds.insert(:number=>10)
505
- @db.alter_table(:items){add_column :name, String}
506
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:number, :name]
507
- @ds.columns!.must_equal [:number, :name]
508
- @ds.all.must_equal [{:number=>10, :name=>nil}]
509
- end
510
-
511
- cspecify "should add primary key columns to tables correctly", :derby do
512
- @db.create_table!(:items){Integer :number}
513
- @ds.insert(:number=>10)
514
- @db.alter_table(:items){add_primary_key :id}
515
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:number, :id]
516
- @ds.columns!.must_equal [:number, :id]
517
- @ds.map(:number).must_equal [10]
518
- proc{@ds.insert(:id=>@ds.map(:id).first)}.must_raise Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError
519
- end
520
-
521
- it "should drop primary key constraints from tables correctly" do
522
- @db.create_table!(:items){Integer :number; primary_key [:number], :name=>:items_pk}
523
- @ds.insert(:number=>10)
524
- @db.alter_table(:items){drop_constraint :items_pk, :type=>:primary_key}
525
- @ds.map(:number).must_equal [10]
526
- @ds.insert(10)
527
- end
528
-
529
- it "should add foreign key columns to tables correctly" do
530
- @db.create_table!(:items){primary_key :id}
531
- @ds.insert
532
- i = @ds.get(:id)
533
- @db.alter_table(:items){add_foreign_key :item_id, :items}
534
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :item_id]
535
- @ds.columns!.must_equal [:id, :item_id]
536
- @ds.all.must_equal [{:id=>i, :item_id=>nil}]
537
- end
538
-
539
- it "should not allow NULLs in a primary key" do
540
- @db.create_table!(:items){String :id, :primary_key=>true}
541
- proc{@ds.insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
542
- end
543
-
544
- it "should not allow NULLs when adding a primary key column" do
545
- @db.create_table!(:items){String :foo}
546
- @db.alter_table(:items){add_column :id, String, :primary_key=>true, :default=>'a'}
547
- proc{@ds.insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
548
- end
549
-
550
- it "should not allow NULLs when creating table with primary key constraint" do
551
- @db.create_table!(:items){String :id1; String :id2; primary_key [:id1, :id2]}
552
- proc{@ds.insert(:id1=>nil, :id2=>nil)}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
553
- proc{@ds.insert(:id1=>nil, :id2=>'1')}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
554
- proc{@ds.insert(:id1=>'1', :id2=>nil)}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
555
- end
556
-
557
- it "should not allow NULLs when adding a primary key constraint" do
558
- @db.create_table!(:items){String :id1; String :id2}
559
- @db.alter_table(:items){add_primary_key [:id1, :id2]}
560
- proc{@ds.insert(:id1=>nil, :id2=>nil)}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
561
- proc{@ds.insert(:id1=>nil, :id2=>'1')}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
562
- proc{@ds.insert(:id1=>'1', :id2=>nil)}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
563
- end
564
-
565
- it "should rename columns correctly" do
566
- @db.create_table!(:items){Integer :id}
567
- @ds.insert(:id=>10)
568
- @db.alter_table(:items){rename_column :id, :id2}
569
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id2]
570
- @ds.columns!.must_equal [:id2]
571
- @ds.all.must_equal [{:id2=>10}]
572
- end
573
-
574
- it "should rename columns with defaults correctly" do
575
- @db.create_table!(:items){String :n, :default=>'blah'}
576
- @ds.insert
577
- @db.alter_table(:items){rename_column :n, :n2}
578
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:n2]
579
- @ds.columns!.must_equal [:n2]
580
- @ds.insert
581
- @ds.all.must_equal [{:n2=>'blah'}, {:n2=>'blah'}]
582
- end
583
-
584
- it "should rename columns with not null constraints" do
585
- @db.create_table!(:items, :engine=>:InnoDB){String :n, :null=>false}
586
- @ds.insert(:n=>'blah')
587
- @db.alter_table(:items){rename_column :n, :n2}
588
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:n2]
589
- @ds.columns!.must_equal [:n2]
590
- @ds.insert(:n2=>'blah')
591
- @ds.all.must_equal [{:n2=>'blah'}, {:n2=>'blah'}]
592
- proc{@ds.insert(:n=>nil)}.must_raise(Sequel::DatabaseError)
593
- end
594
-
595
- it "should rename columns when the table is referenced by a foreign key" do
596
- @db.create_table!(:items2){primary_key :id; Integer :a}
597
- @db.create_table!(:items){Integer :id, :primary_key=>true; foreign_key :items_id, :items2}
598
- @db[:items2].insert(:a=>10)
599
- @ds.insert(:id=>1)
600
- @db.alter_table(:items2){rename_column :a, :b}
601
- @db[:items2].insert(:b=>20)
602
- @ds.insert(:id=>2)
603
- @db[:items2].select_order_map([:id, :b]).must_equal [[1, 10], [2, 20]]
604
- end
605
-
606
- cspecify "should rename primary_key columns correctly", :db2 do
607
- @db.create_table!(:items){Integer :id, :primary_key=>true}
608
- @ds.insert(:id=>10)
609
- @db.alter_table(:items){rename_column :id, :id2}
610
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id2]
611
- @ds.columns!.must_equal [:id2]
612
- @ds.all.must_equal [{:id2=>10}]
613
- end
614
-
615
- cspecify "should set column NULL/NOT NULL correctly", [:jdbc, :db2] do
616
- @db.create_table!(:items, :engine=>:InnoDB){Integer :id}
617
- @ds.insert(:id=>10)
618
- @db.alter_table(:items){set_column_allow_null :id, false}
619
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id]
620
- @ds.columns!.must_equal [:id]
621
- proc{@ds.insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
622
- @db.alter_table(:items){set_column_allow_null :id, true}
623
- @ds.insert(:id=>nil)
624
- @ds.all.must_equal [{:id=>10}, {:id=>nil}]
625
- end
626
-
627
- it "should set column defaults correctly" do
628
- @db.create_table!(:items){Integer :id}
629
- @ds.insert(:id=>10)
630
- @db.alter_table(:items){set_column_default :id, 20}
631
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id]
632
- @ds.columns!.must_equal [:id]
633
- @ds.insert
634
- @ds.all.must_equal [{:id=>10}, {:id=>20}]
635
- end
636
-
637
- it "should set column defaults to nil correctly" do
638
- @db.create_table!(:items){Integer :id}
639
- @ds.insert(:id=>10)
640
- @db.alter_table(:items){set_column_default :id, nil}
641
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id]
642
- @ds.columns!.must_equal [:id]
643
- @ds.insert
644
- @ds.all.must_equal [{:id=>10}, {:id=>nil}]
645
- end
646
-
647
- it "should set column defaults to nil for NOT NULL columns correctly" do
648
- @db.create_table!(:items){Integer :id, :null=>false}
649
- @ds.insert(:id=>10)
650
- @db.alter_table(:items){set_column_default :id, nil}
651
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id]
652
- @ds.columns!.must_equal [:id]
653
- @ds.insert(20)
654
- @ds.all.must_equal [{:id=>10}, {:id=>20}]
655
- end
656
-
657
- cspecify "should set column types correctly", [:jdbc, :db2], :oracle do
658
- @db.create_table!(:items){Integer :id}
659
- @ds.insert(:id=>10)
660
- @db.alter_table(:items){set_column_type :id, String}
661
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id]
662
- @ds.columns!.must_equal [:id]
663
- @ds.insert(:id=>'20')
664
- @ds.order(:id).all.must_equal [{:id=>"10"}, {:id=>"20"}]
665
- end
666
-
667
- cspecify "should set column types without modifying NULL/NOT NULL", [:jdbc, :db2], :derby do
668
- @db.create_table!(:items){Integer :id, :null=>false, :default=>2}
669
- proc{@ds.insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
670
- @db.alter_table(:items){set_column_type :id, String}
671
- proc{@ds.insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
672
-
673
- @db.create_table!(:items){Integer :id}
674
- @ds.insert(:id=>nil)
675
- @db.alter_table(:items){set_column_type :id, String}
676
- @ds.insert(:id=>nil)
677
- @ds.map(:id).must_equal [nil, nil]
678
- end
679
-
680
- cspecify "should set column types without modifying defaults", [:jdbc, :db2], :oracle, :derby do
681
- @db.create_table!(:items){Integer :id, :default=>0}
682
- @ds.insert
683
- @ds.map(:id).must_equal [0]
684
- @db.alter_table(:items){set_column_type :id, String}
685
- @ds.insert
686
- @ds.map(:id).must_equal ['0', '0']
687
-
688
- @db.create_table!(:items){String :id, :default=>'a'}
689
- @ds.insert
690
- @ds.map(:id).must_equal %w'a'
691
- @db.alter_table(:items){set_column_type :id, String, :size=>1}
692
- @ds.insert
693
- @ds.map(:id).must_equal %w'a a'
694
- end
695
-
696
- it "should add unnamed unique constraints and foreign key table constraints correctly" do
697
- @db.create_table!(:items, :engine=>:InnoDB){Integer :id, :null => false; Integer :item_id, :null => false}
698
- @db.alter_table(:items) do
699
- add_unique_constraint [:item_id, :id]
700
- add_foreign_key [:id, :item_id], :items, :key=>[:item_id, :id]
701
- end
702
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :item_id]
703
- @ds.columns!.must_equal [:id, :item_id]
704
- @ds.insert(1, 1)
705
- proc{@ds.insert(1, 1)}.must_raise Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError
706
- proc{@ds.insert(1, 2)}.must_raise Sequel::ForeignKeyConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError
707
- end
708
-
709
- it "should add named unique constraints and foreign key table constraints correctly" do
710
- @db.create_table!(:items, :engine=>:InnoDB){Integer :id, :null=>false; Integer :item_id, :null=>false}
711
- @db.alter_table(:items) do
712
- add_unique_constraint [:item_id, :id], :name=>:unique_iii
713
- add_foreign_key [:id, :item_id], :items, :key=>[:item_id, :id], :name=>:fk_iii
714
- end
715
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :item_id]
716
- @ds.columns!.must_equal [:id, :item_id]
717
- @ds.insert(1, 1)
718
- proc{@ds.insert(1, 1)}.must_raise Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError
719
- proc{@ds.insert(1, 2)}.must_raise Sequel::ForeignKeyConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError
720
- end
721
-
722
- it "should drop unique constraints and foreign key table constraints correctly" do
723
- @db.create_table!(:items) do
724
- Integer :id
725
- Integer :item_id
726
- unique [:item_id, :id], :name=>:items_uk
727
- foreign_key [:id, :item_id], :items, :key=>[:item_id, :id], :name=>:items_fk
728
- end
729
- @db.alter_table(:items) do
730
- drop_constraint(:items_fk, :type=>:foreign_key)
731
- drop_constraint(:items_uk, :type=>:unique)
732
- end
733
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :item_id]
734
- @ds.columns!.must_equal [:id, :item_id]
735
- @ds.insert(1, 2)
736
- @ds.insert(1, 2)
737
- end
738
-
739
- it "should remove columns from tables correctly" do
740
- @db.create_table!(:items) do
741
- primary_key :id
742
- Integer :i
743
- end
744
- @ds.insert(:i=>10)
745
- @db.drop_column(:items, :i)
746
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id]
747
- end
748
-
749
- it "should remove columns with defaults from tables correctly" do
750
- @db.create_table!(:items) do
751
- primary_key :id
752
- Integer :i, :default=>20
753
- end
754
- @ds.insert(:i=>10)
755
- @db.drop_column(:items, :i)
756
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id]
757
- end
758
-
759
- it "should remove foreign key columns from tables correctly" do
760
- @db.create_table!(:items, :engine=>:InnoDB) do
761
- primary_key :id
762
- Integer :i
763
- foreign_key :item_id, :items
764
- end
765
- @ds.insert(:i=>10)
766
- @db.alter_table(:items){drop_foreign_key :item_id}
767
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :i]
768
- end if DB.supports_foreign_key_parsing?
769
-
770
- it "should remove multiple columns in a single alter_table block" do
771
- @db.create_table!(:items) do
772
- primary_key :id
773
- String :name
774
- Integer :number
775
- end
776
- @ds.insert(:number=>10)
777
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :name, :number]
778
- @db.alter_table(:items) do
779
- drop_column :name
780
- drop_column :number
781
- end
782
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id]
783
- end
784
-
785
- cspecify "should work correctly with many operations in a single alter_table call", [:jdbc, :db2] do
786
- @db.create_table!(:items) do
787
- primary_key :id
788
- String :name2
789
- String :number2
790
- constraint :bar, Sequel.~(:number2=>nil, :name2=>nil)
791
- end
792
- @ds.insert(:name2=>'A12')
793
- @db.alter_table(:items) do
794
- add_column :number, Integer
795
- drop_constraint :bar
796
- drop_column :number2
797
- rename_column :name2, :name
798
- set_column_not_null :name
799
- set_column_default :name, 'A13'
800
- add_constraint :foo, Sequel.like(:name, 'A%')
801
- end
802
- @db[:items].first.must_equal(:id=>1, :name=>'A12', :number=>nil)
803
- @db[:items].delete
804
- proc{@db[:items].insert(:name=>nil)}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
805
- @db[:items].insert(:number=>1)
806
- @db[:items].get(:name).must_equal 'A13'
807
- end
808
-
809
- it "should support deferrable foreign key constraints" do
810
- @db.create_table!(:items2){Integer :id, :primary_key=>true}
811
- @db.create_table!(:items){foreign_key :id, :items2, :deferrable=>true}
812
- proc{@db[:items].insert(1)}.must_raise(Sequel::ForeignKeyConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
813
- @db.transaction{proc{@db[:items].insert(1)}}.must_raise(Sequel::ForeignKeyConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
814
- end if DB.supports_deferrable_foreign_key_constraints?
815
-
816
- it "should support deferrable unique constraints when creating or altering tables" do
817
- @db.create_table!(:items){Integer :t; unique [:t], :name=>:atest_def, :deferrable=>true, :using=>:btree}
818
- @db[:items].insert(1)
819
- @db[:items].insert(2)
820
- proc{@db[:items].insert(2)}.must_raise(Sequel::DatabaseError, Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
821
- @db.transaction{proc{@db[:items].insert(2)}}.must_raise(Sequel::DatabaseError, Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
822
-
823
- @db.create_table!(:items){Integer :t}
824
- @db.alter_table(:items){add_unique_constraint [:t], :name=>:atest_def, :deferrable=>true, :using=>:btree}
825
- @db[:items].insert(1)
826
- @db[:items].insert(2)
827
- proc{@db[:items].insert(2)}.must_raise(Sequel::DatabaseError, Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
828
- @db.transaction{proc{@db[:items].insert(2)}}.must_raise(Sequel::DatabaseError, Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
829
- end if DB.supports_deferrable_constraints?
830
- end
831
-
832
- describe "Database#tables and #views" do
833
- before do
834
- class ::String
835
- @@xxxxx = 0
836
- def xxxxx
837
- "xxxxx#{@@xxxxx += 1}"
838
- end
839
- end
840
- @db = DB
841
- @db.drop_view(:sequel_test_view) rescue nil
842
- @db.drop_table?(:sequel_test_table)
843
- @db.create_table(:sequel_test_table){Integer :a}
844
- @db.create_view :sequel_test_view, @db[:sequel_test_table]
845
- end
846
- after do
847
- @db.drop_view :sequel_test_view
848
- @db.drop_table :sequel_test_table
849
- end
850
-
851
- it "#tables should return an array of symbols" do
852
- ts = @db.tables
853
- ts.must_be_kind_of(Array)
854
- ts.each{|t| t.must_be_kind_of(Symbol)}
855
- ts.must_include(:sequel_test_table)
856
- ts.wont_include(:sequel_test_view)
857
- end if DB.supports_table_listing?
858
-
859
- it "#views should return an array of symbols" do
860
- ts = @db.views
861
- ts.must_be_kind_of(Array)
862
- ts.each{|t| t.must_be_kind_of(Symbol)}
863
- ts.wont_include(:sequel_test_table)
864
- ts.must_include(:sequel_test_view)
865
- end if DB.supports_view_listing?
866
-
867
- describe "with identifier mangling" do
868
- before do
869
- @iom = @db.identifier_output_method
870
- @iim = @db.identifier_input_method
871
- end
872
- after do
873
- @db.identifier_output_method = @iom
874
- @db.identifier_input_method = @iim
875
- end
876
-
877
- it "#tables should respect the database's identifier_output_method" do
878
- @db.identifier_output_method = :xxxxx
879
- @db.identifier_input_method = :xxxxx
880
- @db.tables.each{|t| t.to_s.must_match(/\Ax{5}\d+\z/)}
881
- end if DB.supports_table_listing?
882
-
883
- it "#views should respect the database's identifier_output_method" do
884
- @db.identifier_output_method = :xxxxx
885
- @db.identifier_input_method = :xxxxx
886
- @db.views.each{|t| t.to_s.must_match(/\Ax{5}\d+\z/)}
887
- end if DB.supports_view_listing?
888
- end if IDENTIFIER_MANGLING && !DB.frozen?
889
- end