sequel 4.36.0 → 5.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (760) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +548 -5749
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +265 -159
  5. data/bin/sequel +34 -12
  6. data/doc/advanced_associations.rdoc +228 -187
  7. data/doc/association_basics.rdoc +281 -291
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +86 -51
  10. data/doc/code_order.rdoc +25 -19
  11. data/doc/core_extensions.rdoc +104 -63
  12. data/doc/dataset_basics.rdoc +12 -21
  13. data/doc/dataset_filtering.rdoc +99 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/fork_safety.rdoc +84 -0
  16. data/doc/mass_assignment.rdoc +74 -31
  17. data/doc/migration.rdoc +59 -51
  18. data/doc/model_dataset_method_design.rdoc +129 -0
  19. data/doc/model_hooks.rdoc +15 -25
  20. data/doc/model_plugins.rdoc +12 -12
  21. data/doc/mssql_stored_procedures.rdoc +3 -3
  22. data/doc/object_model.rdoc +58 -68
  23. data/doc/opening_databases.rdoc +85 -95
  24. data/doc/postgresql.rdoc +263 -38
  25. data/doc/prepared_statements.rdoc +29 -24
  26. data/doc/querying.rdoc +189 -167
  27. data/doc/reflection.rdoc +5 -6
  28. data/doc/release_notes/5.0.0.txt +159 -0
  29. data/doc/release_notes/5.1.0.txt +31 -0
  30. data/doc/release_notes/5.10.0.txt +84 -0
  31. data/doc/release_notes/5.11.0.txt +83 -0
  32. data/doc/release_notes/5.12.0.txt +141 -0
  33. data/doc/release_notes/5.13.0.txt +27 -0
  34. data/doc/release_notes/5.14.0.txt +63 -0
  35. data/doc/release_notes/5.15.0.txt +39 -0
  36. data/doc/release_notes/5.16.0.txt +110 -0
  37. data/doc/release_notes/5.17.0.txt +31 -0
  38. data/doc/release_notes/5.18.0.txt +69 -0
  39. data/doc/release_notes/5.19.0.txt +28 -0
  40. data/doc/release_notes/5.2.0.txt +33 -0
  41. data/doc/release_notes/5.20.0.txt +89 -0
  42. data/doc/release_notes/5.21.0.txt +87 -0
  43. data/doc/release_notes/5.22.0.txt +48 -0
  44. data/doc/release_notes/5.23.0.txt +56 -0
  45. data/doc/release_notes/5.24.0.txt +56 -0
  46. data/doc/release_notes/5.25.0.txt +32 -0
  47. data/doc/release_notes/5.26.0.txt +35 -0
  48. data/doc/release_notes/5.27.0.txt +21 -0
  49. data/doc/release_notes/5.28.0.txt +16 -0
  50. data/doc/release_notes/5.29.0.txt +22 -0
  51. data/doc/release_notes/5.3.0.txt +121 -0
  52. data/doc/release_notes/5.30.0.txt +20 -0
  53. data/doc/release_notes/5.31.0.txt +148 -0
  54. data/doc/release_notes/5.32.0.txt +46 -0
  55. data/doc/release_notes/5.33.0.txt +24 -0
  56. data/doc/release_notes/5.34.0.txt +40 -0
  57. data/doc/release_notes/5.35.0.txt +56 -0
  58. data/doc/release_notes/5.36.0.txt +60 -0
  59. data/doc/release_notes/5.37.0.txt +30 -0
  60. data/doc/release_notes/5.38.0.txt +28 -0
  61. data/doc/release_notes/5.39.0.txt +19 -0
  62. data/doc/release_notes/5.4.0.txt +80 -0
  63. data/doc/release_notes/5.40.0.txt +40 -0
  64. data/doc/release_notes/5.41.0.txt +25 -0
  65. data/doc/release_notes/5.42.0.txt +136 -0
  66. data/doc/release_notes/5.43.0.txt +98 -0
  67. data/doc/release_notes/5.44.0.txt +32 -0
  68. data/doc/release_notes/5.45.0.txt +34 -0
  69. data/doc/release_notes/5.46.0.txt +87 -0
  70. data/doc/release_notes/5.47.0.txt +59 -0
  71. data/doc/release_notes/5.48.0.txt +14 -0
  72. data/doc/release_notes/5.49.0.txt +59 -0
  73. data/doc/release_notes/5.5.0.txt +61 -0
  74. data/doc/release_notes/5.50.0.txt +78 -0
  75. data/doc/release_notes/5.51.0.txt +47 -0
  76. data/doc/release_notes/5.52.0.txt +87 -0
  77. data/doc/release_notes/5.53.0.txt +23 -0
  78. data/doc/release_notes/5.54.0.txt +27 -0
  79. data/doc/release_notes/5.55.0.txt +21 -0
  80. data/doc/release_notes/5.56.0.txt +51 -0
  81. data/doc/release_notes/5.57.0.txt +23 -0
  82. data/doc/release_notes/5.58.0.txt +31 -0
  83. data/doc/release_notes/5.59.0.txt +73 -0
  84. data/doc/release_notes/5.6.0.txt +31 -0
  85. data/doc/release_notes/5.60.0.txt +22 -0
  86. data/doc/release_notes/5.61.0.txt +43 -0
  87. data/doc/release_notes/5.7.0.txt +108 -0
  88. data/doc/release_notes/5.8.0.txt +170 -0
  89. data/doc/release_notes/5.9.0.txt +99 -0
  90. data/doc/schema_modification.rdoc +95 -75
  91. data/doc/security.rdoc +109 -80
  92. data/doc/sharding.rdoc +74 -47
  93. data/doc/sql.rdoc +147 -122
  94. data/doc/testing.rdoc +43 -20
  95. data/doc/thread_safety.rdoc +2 -4
  96. data/doc/transactions.rdoc +97 -18
  97. data/doc/validations.rdoc +52 -50
  98. data/doc/virtual_rows.rdoc +90 -109
  99. data/lib/sequel/adapters/ado/access.rb +15 -17
  100. data/lib/sequel/adapters/ado/mssql.rb +6 -15
  101. data/lib/sequel/adapters/ado.rb +150 -20
  102. data/lib/sequel/adapters/amalgalite.rb +11 -23
  103. data/lib/sequel/adapters/ibmdb.rb +47 -55
  104. data/lib/sequel/adapters/jdbc/db2.rb +29 -39
  105. data/lib/sequel/adapters/jdbc/derby.rb +58 -54
  106. data/lib/sequel/adapters/jdbc/h2.rb +93 -35
  107. data/lib/sequel/adapters/jdbc/hsqldb.rb +24 -31
  108. data/lib/sequel/adapters/jdbc/jtds.rb +2 -10
  109. data/lib/sequel/adapters/jdbc/mssql.rb +3 -11
  110. data/lib/sequel/adapters/jdbc/mysql.rb +17 -20
  111. data/lib/sequel/adapters/jdbc/oracle.rb +22 -18
  112. data/lib/sequel/adapters/jdbc/postgresql.rb +69 -71
  113. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +11 -23
  114. data/lib/sequel/adapters/jdbc/sqlite.rb +47 -11
  115. data/lib/sequel/adapters/jdbc/sqlserver.rb +34 -9
  116. data/lib/sequel/adapters/jdbc/transactions.rb +22 -38
  117. data/lib/sequel/adapters/jdbc.rb +145 -130
  118. data/lib/sequel/adapters/mock.rb +100 -111
  119. data/lib/sequel/adapters/mysql.rb +114 -122
  120. data/lib/sequel/adapters/mysql2.rb +147 -63
  121. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  122. data/lib/sequel/adapters/odbc/mssql.rb +8 -14
  123. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  124. data/lib/sequel/adapters/odbc.rb +20 -25
  125. data/lib/sequel/adapters/oracle.rb +50 -56
  126. data/lib/sequel/adapters/postgres.rb +305 -327
  127. data/lib/sequel/adapters/postgresql.rb +1 -1
  128. data/lib/sequel/adapters/shared/access.rb +74 -78
  129. data/lib/sequel/adapters/shared/db2.rb +118 -71
  130. data/lib/sequel/adapters/shared/mssql.rb +301 -220
  131. data/lib/sequel/adapters/shared/mysql.rb +299 -217
  132. data/lib/sequel/adapters/shared/oracle.rb +226 -65
  133. data/lib/sequel/adapters/shared/postgres.rb +935 -395
  134. data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -126
  135. data/lib/sequel/adapters/shared/sqlite.rb +447 -173
  136. data/lib/sequel/adapters/sqlanywhere.rb +48 -35
  137. data/lib/sequel/adapters/sqlite.rb +156 -111
  138. data/lib/sequel/adapters/tinytds.rb +30 -38
  139. data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
  140. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +3 -6
  141. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +2 -2
  142. data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
  143. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
  144. data/lib/sequel/adapters/utils/replace.rb +1 -4
  145. data/lib/sequel/adapters/utils/stored_procedures.rb +7 -22
  146. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
  147. data/lib/sequel/ast_transformer.rb +17 -89
  148. data/lib/sequel/connection_pool/sharded_single.rb +18 -15
  149. data/lib/sequel/connection_pool/sharded_threaded.rb +130 -111
  150. data/lib/sequel/connection_pool/single.rb +18 -13
  151. data/lib/sequel/connection_pool/threaded.rb +121 -120
  152. data/lib/sequel/connection_pool.rb +48 -29
  153. data/lib/sequel/core.rb +351 -301
  154. data/lib/sequel/database/connecting.rb +69 -57
  155. data/lib/sequel/database/dataset.rb +13 -5
  156. data/lib/sequel/database/dataset_defaults.rb +18 -102
  157. data/lib/sequel/database/features.rb +18 -4
  158. data/lib/sequel/database/logging.rb +12 -11
  159. data/lib/sequel/database/misc.rb +180 -122
  160. data/lib/sequel/database/query.rb +47 -27
  161. data/lib/sequel/database/schema_generator.rb +178 -84
  162. data/lib/sequel/database/schema_methods.rb +172 -97
  163. data/lib/sequel/database/transactions.rb +205 -44
  164. data/lib/sequel/database.rb +17 -2
  165. data/lib/sequel/dataset/actions.rb +339 -155
  166. data/lib/sequel/dataset/dataset_module.rb +46 -0
  167. data/lib/sequel/dataset/features.rb +90 -35
  168. data/lib/sequel/dataset/graph.rb +80 -58
  169. data/lib/sequel/dataset/misc.rb +137 -47
  170. data/lib/sequel/dataset/placeholder_literalizer.rb +63 -25
  171. data/lib/sequel/dataset/prepared_statements.rb +188 -85
  172. data/lib/sequel/dataset/query.rb +530 -222
  173. data/lib/sequel/dataset/sql.rb +590 -368
  174. data/lib/sequel/dataset.rb +26 -16
  175. data/lib/sequel/deprecated.rb +12 -2
  176. data/lib/sequel/exceptions.rb +46 -16
  177. data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
  178. data/lib/sequel/extensions/_model_pg_row.rb +43 -0
  179. data/lib/sequel/extensions/_pretty_table.rb +2 -5
  180. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  181. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  182. data/lib/sequel/extensions/async_thread_pool.rb +438 -0
  183. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  184. data/lib/sequel/extensions/blank.rb +8 -0
  185. data/lib/sequel/extensions/caller_logging.rb +79 -0
  186. data/lib/sequel/extensions/columns_introspection.rb +4 -3
  187. data/lib/sequel/extensions/connection_expiration.rb +20 -10
  188. data/lib/sequel/extensions/connection_validator.rb +11 -10
  189. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  190. data/lib/sequel/extensions/constraint_validations.rb +62 -39
  191. data/lib/sequel/extensions/core_extensions.rb +42 -48
  192. data/lib/sequel/extensions/core_refinements.rb +80 -59
  193. data/lib/sequel/extensions/current_datetime_timestamp.rb +1 -4
  194. data/lib/sequel/extensions/date_arithmetic.rb +98 -39
  195. data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
  196. data/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
  197. data/lib/sequel/extensions/duplicate_columns_handler.rb +21 -14
  198. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  199. data/lib/sequel/extensions/escaped_like.rb +100 -0
  200. data/lib/sequel/extensions/eval_inspect.rb +12 -15
  201. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  202. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  203. data/lib/sequel/extensions/freeze_datasets.rb +3 -0
  204. data/lib/sequel/extensions/from_block.rb +1 -34
  205. data/lib/sequel/extensions/graph_each.rb +4 -4
  206. data/lib/sequel/extensions/identifier_mangling.rb +180 -0
  207. data/lib/sequel/extensions/implicit_subquery.rb +48 -0
  208. data/lib/sequel/extensions/index_caching.rb +109 -0
  209. data/lib/sequel/extensions/inflector.rb +13 -5
  210. data/lib/sequel/extensions/integer64.rb +32 -0
  211. data/lib/sequel/extensions/is_distinct_from.rb +141 -0
  212. data/lib/sequel/extensions/looser_typecasting.rb +17 -8
  213. data/lib/sequel/extensions/migration.rb +119 -78
  214. data/lib/sequel/extensions/named_timezones.rb +88 -23
  215. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -82
  216. data/lib/sequel/extensions/null_dataset.rb +8 -8
  217. data/lib/sequel/extensions/pagination.rb +32 -29
  218. data/lib/sequel/extensions/pg_array.rb +221 -287
  219. data/lib/sequel/extensions/pg_array_ops.rb +17 -9
  220. data/lib/sequel/extensions/pg_enum.rb +63 -23
  221. data/lib/sequel/extensions/pg_extended_date_support.rb +241 -0
  222. data/lib/sequel/extensions/pg_hstore.rb +45 -54
  223. data/lib/sequel/extensions/pg_hstore_ops.rb +58 -6
  224. data/lib/sequel/extensions/pg_inet.rb +31 -12
  225. data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
  226. data/lib/sequel/extensions/pg_interval.rb +56 -29
  227. data/lib/sequel/extensions/pg_json.rb +417 -140
  228. data/lib/sequel/extensions/pg_json_ops.rb +270 -18
  229. data/lib/sequel/extensions/pg_loose_count.rb +4 -2
  230. data/lib/sequel/extensions/pg_multirange.rb +372 -0
  231. data/lib/sequel/extensions/pg_range.rb +131 -191
  232. data/lib/sequel/extensions/pg_range_ops.rb +42 -13
  233. data/lib/sequel/extensions/pg_row.rb +48 -81
  234. data/lib/sequel/extensions/pg_row_ops.rb +33 -14
  235. data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
  236. data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
  237. data/lib/sequel/extensions/query.rb +9 -7
  238. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  239. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  240. data/lib/sequel/extensions/s.rb +60 -0
  241. data/lib/sequel/extensions/schema_caching.rb +10 -1
  242. data/lib/sequel/extensions/schema_dumper.rb +71 -48
  243. data/lib/sequel/extensions/select_remove.rb +4 -4
  244. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
  245. data/lib/sequel/extensions/server_block.rb +51 -27
  246. data/lib/sequel/extensions/split_array_nil.rb +4 -4
  247. data/lib/sequel/extensions/sql_comments.rb +119 -7
  248. data/lib/sequel/extensions/sql_expr.rb +2 -1
  249. data/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
  250. data/lib/sequel/extensions/sqlite_json_ops.rb +255 -0
  251. data/lib/sequel/extensions/string_agg.rb +11 -8
  252. data/lib/sequel/extensions/string_date_time.rb +19 -23
  253. data/lib/sequel/extensions/symbol_aref.rb +55 -0
  254. data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
  255. data/lib/sequel/extensions/symbol_as.rb +23 -0
  256. data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
  257. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  258. data/lib/sequel/extensions/to_dot.rb +10 -4
  259. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  260. data/lib/sequel/model/associations.rb +1006 -284
  261. data/lib/sequel/model/base.rb +560 -805
  262. data/lib/sequel/model/dataset_module.rb +11 -10
  263. data/lib/sequel/model/default_inflections.rb +1 -1
  264. data/lib/sequel/model/errors.rb +10 -3
  265. data/lib/sequel/model/exceptions.rb +8 -10
  266. data/lib/sequel/model/inflections.rb +7 -20
  267. data/lib/sequel/model/plugins.rb +114 -0
  268. data/lib/sequel/model.rb +32 -82
  269. data/lib/sequel/plugins/active_model.rb +30 -14
  270. data/lib/sequel/plugins/after_initialize.rb +1 -1
  271. data/lib/sequel/plugins/association_dependencies.rb +25 -18
  272. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  273. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  274. data/lib/sequel/plugins/association_pks.rb +147 -70
  275. data/lib/sequel/plugins/association_proxies.rb +33 -9
  276. data/lib/sequel/plugins/async_thread_pool.rb +39 -0
  277. data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
  278. data/lib/sequel/plugins/auto_validations.rb +95 -28
  279. data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
  280. data/lib/sequel/plugins/before_after_save.rb +0 -42
  281. data/lib/sequel/plugins/blacklist_security.rb +21 -12
  282. data/lib/sequel/plugins/boolean_readers.rb +5 -5
  283. data/lib/sequel/plugins/boolean_subsets.rb +13 -8
  284. data/lib/sequel/plugins/caching.rb +25 -16
  285. data/lib/sequel/plugins/class_table_inheritance.rb +179 -100
  286. data/lib/sequel/plugins/column_conflicts.rb +16 -3
  287. data/lib/sequel/plugins/column_encryption.rb +728 -0
  288. data/lib/sequel/plugins/column_select.rb +7 -5
  289. data/lib/sequel/plugins/columns_updated.rb +42 -0
  290. data/lib/sequel/plugins/composition.rb +42 -26
  291. data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
  292. data/lib/sequel/plugins/constraint_validations.rb +20 -14
  293. data/lib/sequel/plugins/csv_serializer.rb +56 -35
  294. data/lib/sequel/plugins/dataset_associations.rb +40 -17
  295. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  296. data/lib/sequel/plugins/defaults_setter.rb +65 -10
  297. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  298. data/lib/sequel/plugins/dirty.rb +62 -24
  299. data/lib/sequel/plugins/eager_each.rb +3 -3
  300. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  301. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  302. data/lib/sequel/plugins/enum.rb +124 -0
  303. data/lib/sequel/plugins/error_splitter.rb +17 -12
  304. data/lib/sequel/plugins/finder.rb +246 -0
  305. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  306. data/lib/sequel/plugins/force_encoding.rb +7 -12
  307. data/lib/sequel/plugins/hook_class_methods.rb +37 -54
  308. data/lib/sequel/plugins/input_transformer.rb +18 -10
  309. data/lib/sequel/plugins/insert_conflict.rb +76 -0
  310. data/lib/sequel/plugins/insert_returning_select.rb +2 -2
  311. data/lib/sequel/plugins/instance_filters.rb +10 -8
  312. data/lib/sequel/plugins/instance_hooks.rb +34 -17
  313. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  314. data/lib/sequel/plugins/inverted_subsets.rb +22 -13
  315. data/lib/sequel/plugins/json_serializer.rb +124 -64
  316. data/lib/sequel/plugins/lazy_attributes.rb +21 -14
  317. data/lib/sequel/plugins/list.rb +35 -21
  318. data/lib/sequel/plugins/many_through_many.rb +134 -21
  319. data/lib/sequel/plugins/modification_detection.rb +15 -5
  320. data/lib/sequel/plugins/mssql_optimistic_locking.rb +6 -5
  321. data/lib/sequel/plugins/nested_attributes.rb +61 -31
  322. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  323. data/lib/sequel/plugins/pg_array_associations.rb +103 -53
  324. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +350 -0
  325. data/lib/sequel/plugins/pg_row.rb +5 -51
  326. data/lib/sequel/plugins/prepared_statements.rb +60 -72
  327. data/lib/sequel/plugins/prepared_statements_safe.rb +9 -4
  328. data/lib/sequel/plugins/rcte_tree.rb +68 -82
  329. data/lib/sequel/plugins/require_valid_schema.rb +67 -0
  330. data/lib/sequel/plugins/serialization.rb +43 -46
  331. data/lib/sequel/plugins/serialization_modification_detection.rb +3 -2
  332. data/lib/sequel/plugins/sharding.rb +15 -10
  333. data/lib/sequel/plugins/single_table_inheritance.rb +67 -28
  334. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  335. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  336. data/lib/sequel/plugins/split_values.rb +11 -6
  337. data/lib/sequel/plugins/sql_comments.rb +189 -0
  338. data/lib/sequel/plugins/static_cache.rb +77 -53
  339. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  340. data/lib/sequel/plugins/string_stripper.rb +3 -3
  341. data/lib/sequel/plugins/subclasses.rb +43 -10
  342. data/lib/sequel/plugins/subset_conditions.rb +15 -5
  343. data/lib/sequel/plugins/table_select.rb +2 -2
  344. data/lib/sequel/plugins/tactical_eager_loading.rb +96 -12
  345. data/lib/sequel/plugins/throw_failures.rb +110 -0
  346. data/lib/sequel/plugins/timestamps.rb +20 -8
  347. data/lib/sequel/plugins/touch.rb +19 -8
  348. data/lib/sequel/plugins/tree.rb +62 -32
  349. data/lib/sequel/plugins/typecast_on_load.rb +12 -4
  350. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  351. data/lib/sequel/plugins/unused_associations.rb +521 -0
  352. data/lib/sequel/plugins/update_or_create.rb +4 -4
  353. data/lib/sequel/plugins/update_primary_key.rb +1 -1
  354. data/lib/sequel/plugins/update_refresh.rb +26 -15
  355. data/lib/sequel/plugins/uuid.rb +7 -11
  356. data/lib/sequel/plugins/validate_associated.rb +18 -0
  357. data/lib/sequel/plugins/validation_class_methods.rb +38 -19
  358. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  359. data/lib/sequel/plugins/validation_helpers.rb +57 -41
  360. data/lib/sequel/plugins/whitelist_security.rb +122 -0
  361. data/lib/sequel/plugins/xml_serializer.rb +30 -31
  362. data/lib/sequel/sql.rb +471 -331
  363. data/lib/sequel/timezones.rb +78 -47
  364. data/lib/sequel/version.rb +7 -2
  365. data/lib/sequel.rb +1 -1
  366. metadata +217 -521
  367. data/Rakefile +0 -164
  368. data/doc/active_record.rdoc +0 -928
  369. data/doc/release_notes/1.0.txt +0 -38
  370. data/doc/release_notes/1.1.txt +0 -143
  371. data/doc/release_notes/1.3.txt +0 -101
  372. data/doc/release_notes/1.4.0.txt +0 -53
  373. data/doc/release_notes/1.5.0.txt +0 -155
  374. data/doc/release_notes/2.0.0.txt +0 -298
  375. data/doc/release_notes/2.1.0.txt +0 -271
  376. data/doc/release_notes/2.10.0.txt +0 -328
  377. data/doc/release_notes/2.11.0.txt +0 -215
  378. data/doc/release_notes/2.12.0.txt +0 -534
  379. data/doc/release_notes/2.2.0.txt +0 -253
  380. data/doc/release_notes/2.3.0.txt +0 -88
  381. data/doc/release_notes/2.4.0.txt +0 -106
  382. data/doc/release_notes/2.5.0.txt +0 -137
  383. data/doc/release_notes/2.6.0.txt +0 -157
  384. data/doc/release_notes/2.7.0.txt +0 -166
  385. data/doc/release_notes/2.8.0.txt +0 -171
  386. data/doc/release_notes/2.9.0.txt +0 -97
  387. data/doc/release_notes/3.0.0.txt +0 -221
  388. data/doc/release_notes/3.1.0.txt +0 -406
  389. data/doc/release_notes/3.10.0.txt +0 -286
  390. data/doc/release_notes/3.11.0.txt +0 -254
  391. data/doc/release_notes/3.12.0.txt +0 -304
  392. data/doc/release_notes/3.13.0.txt +0 -210
  393. data/doc/release_notes/3.14.0.txt +0 -118
  394. data/doc/release_notes/3.15.0.txt +0 -78
  395. data/doc/release_notes/3.16.0.txt +0 -45
  396. data/doc/release_notes/3.17.0.txt +0 -58
  397. data/doc/release_notes/3.18.0.txt +0 -120
  398. data/doc/release_notes/3.19.0.txt +0 -67
  399. data/doc/release_notes/3.2.0.txt +0 -268
  400. data/doc/release_notes/3.20.0.txt +0 -41
  401. data/doc/release_notes/3.21.0.txt +0 -87
  402. data/doc/release_notes/3.22.0.txt +0 -39
  403. data/doc/release_notes/3.23.0.txt +0 -172
  404. data/doc/release_notes/3.24.0.txt +0 -420
  405. data/doc/release_notes/3.25.0.txt +0 -88
  406. data/doc/release_notes/3.26.0.txt +0 -88
  407. data/doc/release_notes/3.27.0.txt +0 -82
  408. data/doc/release_notes/3.28.0.txt +0 -304
  409. data/doc/release_notes/3.29.0.txt +0 -459
  410. data/doc/release_notes/3.3.0.txt +0 -192
  411. data/doc/release_notes/3.30.0.txt +0 -135
  412. data/doc/release_notes/3.31.0.txt +0 -146
  413. data/doc/release_notes/3.32.0.txt +0 -202
  414. data/doc/release_notes/3.33.0.txt +0 -157
  415. data/doc/release_notes/3.34.0.txt +0 -671
  416. data/doc/release_notes/3.35.0.txt +0 -144
  417. data/doc/release_notes/3.36.0.txt +0 -245
  418. data/doc/release_notes/3.37.0.txt +0 -338
  419. data/doc/release_notes/3.38.0.txt +0 -234
  420. data/doc/release_notes/3.39.0.txt +0 -237
  421. data/doc/release_notes/3.4.0.txt +0 -325
  422. data/doc/release_notes/3.40.0.txt +0 -73
  423. data/doc/release_notes/3.41.0.txt +0 -155
  424. data/doc/release_notes/3.42.0.txt +0 -74
  425. data/doc/release_notes/3.43.0.txt +0 -105
  426. data/doc/release_notes/3.44.0.txt +0 -152
  427. data/doc/release_notes/3.45.0.txt +0 -179
  428. data/doc/release_notes/3.46.0.txt +0 -122
  429. data/doc/release_notes/3.47.0.txt +0 -270
  430. data/doc/release_notes/3.48.0.txt +0 -477
  431. data/doc/release_notes/3.5.0.txt +0 -510
  432. data/doc/release_notes/3.6.0.txt +0 -366
  433. data/doc/release_notes/3.7.0.txt +0 -179
  434. data/doc/release_notes/3.8.0.txt +0 -151
  435. data/doc/release_notes/3.9.0.txt +0 -233
  436. data/doc/release_notes/4.0.0.txt +0 -262
  437. data/doc/release_notes/4.1.0.txt +0 -85
  438. data/doc/release_notes/4.10.0.txt +0 -226
  439. data/doc/release_notes/4.11.0.txt +0 -147
  440. data/doc/release_notes/4.12.0.txt +0 -105
  441. data/doc/release_notes/4.13.0.txt +0 -169
  442. data/doc/release_notes/4.14.0.txt +0 -68
  443. data/doc/release_notes/4.15.0.txt +0 -56
  444. data/doc/release_notes/4.16.0.txt +0 -36
  445. data/doc/release_notes/4.17.0.txt +0 -38
  446. data/doc/release_notes/4.18.0.txt +0 -36
  447. data/doc/release_notes/4.19.0.txt +0 -45
  448. data/doc/release_notes/4.2.0.txt +0 -129
  449. data/doc/release_notes/4.20.0.txt +0 -79
  450. data/doc/release_notes/4.21.0.txt +0 -94
  451. data/doc/release_notes/4.22.0.txt +0 -72
  452. data/doc/release_notes/4.23.0.txt +0 -65
  453. data/doc/release_notes/4.24.0.txt +0 -99
  454. data/doc/release_notes/4.25.0.txt +0 -181
  455. data/doc/release_notes/4.26.0.txt +0 -44
  456. data/doc/release_notes/4.27.0.txt +0 -78
  457. data/doc/release_notes/4.28.0.txt +0 -57
  458. data/doc/release_notes/4.29.0.txt +0 -41
  459. data/doc/release_notes/4.3.0.txt +0 -40
  460. data/doc/release_notes/4.30.0.txt +0 -37
  461. data/doc/release_notes/4.31.0.txt +0 -57
  462. data/doc/release_notes/4.32.0.txt +0 -132
  463. data/doc/release_notes/4.33.0.txt +0 -88
  464. data/doc/release_notes/4.34.0.txt +0 -86
  465. data/doc/release_notes/4.35.0.txt +0 -130
  466. data/doc/release_notes/4.36.0.txt +0 -116
  467. data/doc/release_notes/4.4.0.txt +0 -92
  468. data/doc/release_notes/4.5.0.txt +0 -34
  469. data/doc/release_notes/4.6.0.txt +0 -30
  470. data/doc/release_notes/4.7.0.txt +0 -103
  471. data/doc/release_notes/4.8.0.txt +0 -175
  472. data/doc/release_notes/4.9.0.txt +0 -190
  473. data/lib/sequel/adapters/cubrid.rb +0 -144
  474. data/lib/sequel/adapters/do/mysql.rb +0 -66
  475. data/lib/sequel/adapters/do/postgres.rb +0 -44
  476. data/lib/sequel/adapters/do/sqlite3.rb +0 -42
  477. data/lib/sequel/adapters/do.rb +0 -158
  478. data/lib/sequel/adapters/jdbc/as400.rb +0 -84
  479. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -64
  480. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -36
  481. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -33
  482. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -33
  483. data/lib/sequel/adapters/odbc/progress.rb +0 -10
  484. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  485. data/lib/sequel/adapters/shared/firebird.rb +0 -247
  486. data/lib/sequel/adapters/shared/informix.rb +0 -54
  487. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -152
  488. data/lib/sequel/adapters/shared/progress.rb +0 -40
  489. data/lib/sequel/adapters/swift/mysql.rb +0 -49
  490. data/lib/sequel/adapters/swift/postgres.rb +0 -47
  491. data/lib/sequel/adapters/swift/sqlite.rb +0 -49
  492. data/lib/sequel/adapters/swift.rb +0 -160
  493. data/lib/sequel/adapters/utils/pg_types.rb +0 -70
  494. data/lib/sequel/dataset/mutation.rb +0 -111
  495. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -5
  496. data/lib/sequel/extensions/filter_having.rb +0 -63
  497. data/lib/sequel/extensions/hash_aliases.rb +0 -49
  498. data/lib/sequel/extensions/meta_def.rb +0 -35
  499. data/lib/sequel/extensions/query_literals.rb +0 -84
  500. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -24
  501. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -122
  502. data/lib/sequel/extensions/set_overrides.rb +0 -76
  503. data/lib/sequel/no_core_ext.rb +0 -3
  504. data/lib/sequel/plugins/association_autoreloading.rb +0 -9
  505. data/lib/sequel/plugins/identifier_columns.rb +0 -47
  506. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -9
  507. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -81
  508. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -119
  509. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -61
  510. data/lib/sequel/plugins/schema.rb +0 -82
  511. data/lib/sequel/plugins/scissors.rb +0 -35
  512. data/spec/adapter_spec.rb +0 -4
  513. data/spec/adapters/db2_spec.rb +0 -160
  514. data/spec/adapters/firebird_spec.rb +0 -411
  515. data/spec/adapters/informix_spec.rb +0 -100
  516. data/spec/adapters/mssql_spec.rb +0 -733
  517. data/spec/adapters/mysql_spec.rb +0 -1319
  518. data/spec/adapters/oracle_spec.rb +0 -313
  519. data/spec/adapters/postgres_spec.rb +0 -3790
  520. data/spec/adapters/spec_helper.rb +0 -49
  521. data/spec/adapters/sqlanywhere_spec.rb +0 -170
  522. data/spec/adapters/sqlite_spec.rb +0 -688
  523. data/spec/bin_spec.rb +0 -258
  524. data/spec/core/connection_pool_spec.rb +0 -1045
  525. data/spec/core/database_spec.rb +0 -2636
  526. data/spec/core/dataset_spec.rb +0 -5175
  527. data/spec/core/deprecated_spec.rb +0 -70
  528. data/spec/core/expression_filters_spec.rb +0 -1247
  529. data/spec/core/mock_adapter_spec.rb +0 -464
  530. data/spec/core/object_graph_spec.rb +0 -303
  531. data/spec/core/placeholder_literalizer_spec.rb +0 -163
  532. data/spec/core/schema_generator_spec.rb +0 -203
  533. data/spec/core/schema_spec.rb +0 -1676
  534. data/spec/core/spec_helper.rb +0 -34
  535. data/spec/core/version_spec.rb +0 -7
  536. data/spec/core_extensions_spec.rb +0 -699
  537. data/spec/core_model_spec.rb +0 -2
  538. data/spec/core_spec.rb +0 -1
  539. data/spec/extensions/accessed_columns_spec.rb +0 -51
  540. data/spec/extensions/active_model_spec.rb +0 -85
  541. data/spec/extensions/after_initialize_spec.rb +0 -24
  542. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  543. data/spec/extensions/association_dependencies_spec.rb +0 -117
  544. data/spec/extensions/association_pks_spec.rb +0 -405
  545. data/spec/extensions/association_proxies_spec.rb +0 -86
  546. data/spec/extensions/auto_validations_spec.rb +0 -192
  547. data/spec/extensions/before_after_save_spec.rb +0 -40
  548. data/spec/extensions/blacklist_security_spec.rb +0 -88
  549. data/spec/extensions/blank_spec.rb +0 -69
  550. data/spec/extensions/boolean_readers_spec.rb +0 -93
  551. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  552. data/spec/extensions/caching_spec.rb +0 -270
  553. data/spec/extensions/class_table_inheritance_spec.rb +0 -444
  554. data/spec/extensions/column_conflicts_spec.rb +0 -60
  555. data/spec/extensions/column_select_spec.rb +0 -108
  556. data/spec/extensions/columns_introspection_spec.rb +0 -91
  557. data/spec/extensions/composition_spec.rb +0 -242
  558. data/spec/extensions/connection_expiration_spec.rb +0 -121
  559. data/spec/extensions/connection_validator_spec.rb +0 -127
  560. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -288
  561. data/spec/extensions/constraint_validations_spec.rb +0 -389
  562. data/spec/extensions/core_refinements_spec.rb +0 -519
  563. data/spec/extensions/csv_serializer_spec.rb +0 -180
  564. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  565. data/spec/extensions/dataset_associations_spec.rb +0 -343
  566. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  567. data/spec/extensions/date_arithmetic_spec.rb +0 -167
  568. data/spec/extensions/defaults_setter_spec.rb +0 -102
  569. data/spec/extensions/delay_add_association_spec.rb +0 -74
  570. data/spec/extensions/dirty_spec.rb +0 -180
  571. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -110
  572. data/spec/extensions/eager_each_spec.rb +0 -66
  573. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  574. data/spec/extensions/error_splitter_spec.rb +0 -18
  575. data/spec/extensions/error_sql_spec.rb +0 -20
  576. data/spec/extensions/eval_inspect_spec.rb +0 -73
  577. data/spec/extensions/filter_having_spec.rb +0 -40
  578. data/spec/extensions/force_encoding_spec.rb +0 -114
  579. data/spec/extensions/from_block_spec.rb +0 -21
  580. data/spec/extensions/graph_each_spec.rb +0 -119
  581. data/spec/extensions/hash_aliases_spec.rb +0 -24
  582. data/spec/extensions/hook_class_methods_spec.rb +0 -429
  583. data/spec/extensions/identifier_columns_spec.rb +0 -17
  584. data/spec/extensions/inflector_spec.rb +0 -183
  585. data/spec/extensions/input_transformer_spec.rb +0 -54
  586. data/spec/extensions/insert_returning_select_spec.rb +0 -46
  587. data/spec/extensions/instance_filters_spec.rb +0 -79
  588. data/spec/extensions/instance_hooks_spec.rb +0 -276
  589. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  590. data/spec/extensions/json_serializer_spec.rb +0 -304
  591. data/spec/extensions/lazy_attributes_spec.rb +0 -170
  592. data/spec/extensions/list_spec.rb +0 -278
  593. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  594. data/spec/extensions/many_through_many_spec.rb +0 -2172
  595. data/spec/extensions/meta_def_spec.rb +0 -21
  596. data/spec/extensions/migration_spec.rb +0 -728
  597. data/spec/extensions/modification_detection_spec.rb +0 -80
  598. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
  599. data/spec/extensions/named_timezones_spec.rb +0 -108
  600. data/spec/extensions/nested_attributes_spec.rb +0 -697
  601. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -65
  602. data/spec/extensions/null_dataset_spec.rb +0 -85
  603. data/spec/extensions/optimistic_locking_spec.rb +0 -128
  604. data/spec/extensions/pagination_spec.rb +0 -118
  605. data/spec/extensions/pg_array_associations_spec.rb +0 -736
  606. data/spec/extensions/pg_array_ops_spec.rb +0 -143
  607. data/spec/extensions/pg_array_spec.rb +0 -390
  608. data/spec/extensions/pg_enum_spec.rb +0 -92
  609. data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
  610. data/spec/extensions/pg_hstore_spec.rb +0 -206
  611. data/spec/extensions/pg_inet_ops_spec.rb +0 -101
  612. data/spec/extensions/pg_inet_spec.rb +0 -52
  613. data/spec/extensions/pg_interval_spec.rb +0 -76
  614. data/spec/extensions/pg_json_ops_spec.rb +0 -275
  615. data/spec/extensions/pg_json_spec.rb +0 -218
  616. data/spec/extensions/pg_loose_count_spec.rb +0 -17
  617. data/spec/extensions/pg_range_ops_spec.rb +0 -58
  618. data/spec/extensions/pg_range_spec.rb +0 -473
  619. data/spec/extensions/pg_row_ops_spec.rb +0 -60
  620. data/spec/extensions/pg_row_plugin_spec.rb +0 -62
  621. data/spec/extensions/pg_row_spec.rb +0 -360
  622. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
  623. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
  624. data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
  625. data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
  626. data/spec/extensions/prepared_statements_spec.rb +0 -103
  627. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
  628. data/spec/extensions/pretty_table_spec.rb +0 -92
  629. data/spec/extensions/query_literals_spec.rb +0 -183
  630. data/spec/extensions/query_spec.rb +0 -102
  631. data/spec/extensions/rcte_tree_spec.rb +0 -392
  632. data/spec/extensions/round_timestamps_spec.rb +0 -43
  633. data/spec/extensions/schema_caching_spec.rb +0 -41
  634. data/spec/extensions/schema_dumper_spec.rb +0 -814
  635. data/spec/extensions/schema_spec.rb +0 -117
  636. data/spec/extensions/scissors_spec.rb +0 -26
  637. data/spec/extensions/select_remove_spec.rb +0 -38
  638. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
  639. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  640. data/spec/extensions/serialization_spec.rb +0 -362
  641. data/spec/extensions/server_block_spec.rb +0 -90
  642. data/spec/extensions/server_logging_spec.rb +0 -45
  643. data/spec/extensions/set_overrides_spec.rb +0 -61
  644. data/spec/extensions/sharding_spec.rb +0 -198
  645. data/spec/extensions/shared_caching_spec.rb +0 -175
  646. data/spec/extensions/single_table_inheritance_spec.rb +0 -297
  647. data/spec/extensions/singular_table_names_spec.rb +0 -22
  648. data/spec/extensions/skip_create_refresh_spec.rb +0 -17
  649. data/spec/extensions/spec_helper.rb +0 -71
  650. data/spec/extensions/split_array_nil_spec.rb +0 -24
  651. data/spec/extensions/split_values_spec.rb +0 -22
  652. data/spec/extensions/sql_comments_spec.rb +0 -27
  653. data/spec/extensions/sql_expr_spec.rb +0 -60
  654. data/spec/extensions/static_cache_spec.rb +0 -361
  655. data/spec/extensions/string_agg_spec.rb +0 -85
  656. data/spec/extensions/string_date_time_spec.rb +0 -95
  657. data/spec/extensions/string_stripper_spec.rb +0 -68
  658. data/spec/extensions/subclasses_spec.rb +0 -66
  659. data/spec/extensions/subset_conditions_spec.rb +0 -38
  660. data/spec/extensions/table_select_spec.rb +0 -71
  661. data/spec/extensions/tactical_eager_loading_spec.rb +0 -136
  662. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  663. data/spec/extensions/timestamps_spec.rb +0 -175
  664. data/spec/extensions/to_dot_spec.rb +0 -154
  665. data/spec/extensions/touch_spec.rb +0 -203
  666. data/spec/extensions/tree_spec.rb +0 -274
  667. data/spec/extensions/typecast_on_load_spec.rb +0 -80
  668. data/spec/extensions/unlimited_update_spec.rb +0 -20
  669. data/spec/extensions/update_or_create_spec.rb +0 -87
  670. data/spec/extensions/update_primary_key_spec.rb +0 -100
  671. data/spec/extensions/update_refresh_spec.rb +0 -53
  672. data/spec/extensions/uuid_spec.rb +0 -106
  673. data/spec/extensions/validate_associated_spec.rb +0 -52
  674. data/spec/extensions/validation_class_methods_spec.rb +0 -1027
  675. data/spec/extensions/validation_helpers_spec.rb +0 -554
  676. data/spec/extensions/xml_serializer_spec.rb +0 -207
  677. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  678. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  679. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  680. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  681. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  682. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  683. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  684. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  685. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  686. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  687. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  688. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  689. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  690. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  691. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  692. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  693. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  694. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  695. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  696. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  697. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  698. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  699. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  700. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  701. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  702. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  703. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  704. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  705. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  706. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  707. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  708. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  709. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  710. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  711. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  712. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  713. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  714. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  715. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  716. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  717. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  718. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  719. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  720. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  721. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  722. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  723. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  724. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  725. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  726. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  727. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  728. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  729. data/spec/guards_helper.rb +0 -55
  730. data/spec/integration/associations_test.rb +0 -2506
  731. data/spec/integration/database_test.rb +0 -113
  732. data/spec/integration/dataset_test.rb +0 -1858
  733. data/spec/integration/eager_loader_test.rb +0 -687
  734. data/spec/integration/migrator_test.rb +0 -262
  735. data/spec/integration/model_test.rb +0 -230
  736. data/spec/integration/plugin_test.rb +0 -2297
  737. data/spec/integration/prepared_statement_test.rb +0 -467
  738. data/spec/integration/schema_test.rb +0 -815
  739. data/spec/integration/spec_helper.rb +0 -56
  740. data/spec/integration/timezone_test.rb +0 -86
  741. data/spec/integration/transaction_test.rb +0 -406
  742. data/spec/integration/type_test.rb +0 -133
  743. data/spec/model/association_reflection_spec.rb +0 -565
  744. data/spec/model/associations_spec.rb +0 -4589
  745. data/spec/model/base_spec.rb +0 -759
  746. data/spec/model/class_dataset_methods_spec.rb +0 -150
  747. data/spec/model/dataset_methods_spec.rb +0 -149
  748. data/spec/model/eager_loading_spec.rb +0 -2197
  749. data/spec/model/hooks_spec.rb +0 -604
  750. data/spec/model/inflector_spec.rb +0 -26
  751. data/spec/model/model_spec.rb +0 -1097
  752. data/spec/model/plugins_spec.rb +0 -299
  753. data/spec/model/record_spec.rb +0 -2162
  754. data/spec/model/spec_helper.rb +0 -46
  755. data/spec/model/validations_spec.rb +0 -193
  756. data/spec/model_no_assoc_spec.rb +0 -1
  757. data/spec/model_spec.rb +0 -1
  758. data/spec/plugin_spec.rb +0 -1
  759. data/spec/sequel_coverage.rb +0 -15
  760. data/spec/spec_config.rb +0 -10
@@ -1,1676 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
2
-
3
- describe "DB#create_table" do
4
- before do
5
- @db = Sequel.mock
6
- end
7
-
8
- it "should accept the table name" do
9
- @db.create_table(:cats) {}
10
- @db.sqls.must_equal ['CREATE TABLE cats ()']
11
- end
12
-
13
- it "should accept the table name in multiple formats" do
14
- @db.create_table(:cats__cats) {}
15
- @db.create_table("cats__cats1") {}
16
- @db.create_table(Sequel.identifier(:cats__cats2)) {}
17
- @db.create_table(Sequel.qualify(:cats3, :cats)) {}
18
- @db.sqls.must_equal ['CREATE TABLE cats.cats ()', 'CREATE TABLE cats__cats1 ()', 'CREATE TABLE cats__cats2 ()', 'CREATE TABLE cats3.cats ()']
19
- end
20
-
21
- it "should raise an error if the table name argument is not valid" do
22
- proc{@db.create_table(1) {}}.must_raise(Sequel::Error)
23
- proc{@db.create_table(Sequel.as(:cats, :c)) {}}.must_raise(Sequel::Error)
24
- end
25
-
26
- it "should remove cached schema entry" do
27
- @db.instance_variable_set(:@schemas, {'cats'=>[]})
28
- @db.create_table(:cats){Integer :a}
29
- @db.instance_variable_get(:@schemas).must_be :empty?
30
- end
31
-
32
- it "should accept multiple columns" do
33
- @db.create_table(:cats) do
34
- column :id, :integer
35
- column :name, :text
36
- end
37
- @db.sqls.must_equal ['CREATE TABLE cats (id integer, name text)']
38
- end
39
-
40
- it "should accept method calls as data types" do
41
- @db.create_table(:cats) do
42
- integer :id
43
- text :name
44
- end
45
- @db.sqls.must_equal ['CREATE TABLE cats (id integer, name text)']
46
- end
47
-
48
- it "should transform types given as ruby classes to database-specific types" do
49
- @db.create_table(:cats) do
50
- String :a
51
- Integer :b
52
- Fixnum :c
53
- Bignum :d
54
- Float :e
55
- BigDecimal :f
56
- Date :g
57
- DateTime :h
58
- Time :i
59
- Numeric :j
60
- File :k
61
- TrueClass :l
62
- FalseClass :m
63
- column :n, Fixnum
64
- primary_key :o, :type=>String
65
- foreign_key :p, :f, :type=>Date
66
- end
67
- @db.sqls.must_equal ['CREATE TABLE cats (o varchar(255) PRIMARY KEY AUTOINCREMENT, a varchar(255), b integer, c integer, d bigint, e double precision, f numeric, g date, h timestamp, i timestamp, j numeric, k blob, l boolean, m boolean, n integer, p date REFERENCES f)']
68
- end
69
-
70
- it "should transform types given as ruby classes to database-specific types" do
71
- @db.default_string_column_size = 50
72
- @db.create_table(:cats) do
73
- String :a
74
- String :a2, :size=>13
75
- String :a3, :fixed=>true
76
- String :a4, :size=>13, :fixed=>true
77
- String :a5, :text=>true
78
- varchar :a6
79
- varchar :a7, :size=>13
80
- end
81
- @db.sqls.must_equal ['CREATE TABLE cats (a varchar(50), a2 varchar(13), a3 char(50), a4 char(13), a5 text, a6 varchar(50), a7 varchar(13))']
82
- end
83
-
84
- it "should allow the use of modifiers with ruby class types" do
85
- @db.create_table(:cats) do
86
- String :a, :size=>50
87
- String :b, :text=>true
88
- String :c, :fixed=>true, :size=>40
89
- Time :d, :only_time=>true
90
- BigDecimal :e, :size=>[11,2]
91
- end
92
- @db.sqls.must_equal ['CREATE TABLE cats (a varchar(50), b text, c char(40), d time, e numeric(11, 2))']
93
- end
94
-
95
- it "should raise an error if you use a ruby class that isn't handled" do
96
- proc{@db.create_table(:cats){column :a, Class}}.must_raise(Sequel::Error)
97
- end
98
-
99
- it "should accept primary key definition" do
100
- @db.create_table(:cats) do
101
- primary_key :id
102
- end
103
- @db.sqls.must_equal ['CREATE TABLE cats (id integer PRIMARY KEY AUTOINCREMENT)']
104
-
105
- @db.create_table(:cats) do
106
- primary_key :id, :serial, :auto_increment => false
107
- end
108
- @db.sqls.must_equal ['CREATE TABLE cats (id serial PRIMARY KEY)']
109
-
110
- @db.create_table(:cats) do
111
- primary_key :id, :type => :serial, :auto_increment => false
112
- end
113
- @db.sqls.must_equal ['CREATE TABLE cats (id serial PRIMARY KEY)']
114
-
115
- @db.create_table(:cats) do
116
- Integer :a
117
- primary_key :id
118
- end
119
- @db.sqls.must_equal ['CREATE TABLE cats (id integer PRIMARY KEY AUTOINCREMENT, a integer)']
120
-
121
- @db.create_table(:cats) do
122
- Integer :a
123
- primary_key :id, :keep_order=>true
124
- end
125
- @db.sqls.must_equal ['CREATE TABLE cats (a integer, id integer PRIMARY KEY AUTOINCREMENT)']
126
- end
127
-
128
- it "should allow naming primary key constraint with :primary_key_constraint_name option" do
129
- @db.create_table(:cats) do
130
- primary_key :id, :primary_key_constraint_name=>:foo
131
- end
132
- @db.sqls.must_equal ['CREATE TABLE cats (id integer CONSTRAINT foo PRIMARY KEY AUTOINCREMENT)']
133
- end
134
-
135
- it "should handling splitting named column constraints into table constraints if unsupported" do
136
- def @db.supports_named_column_constraints?; false end
137
- @db.create_table(:cats) do
138
- primary_key :id, :primary_key_constraint_name=>:foo
139
- foreign_key :cat_id, :cats, :unique=>true, :unique_constraint_name=>:bar, :foreign_key_constraint_name=>:baz, :deferrable=>true, :key=>:foo_id, :on_delete=>:cascade, :on_update=>:restrict
140
- end
141
- @db.sqls.must_equal ['CREATE TABLE cats (id integer AUTOINCREMENT, cat_id integer, CONSTRAINT foo PRIMARY KEY (id), CONSTRAINT baz FOREIGN KEY (cat_id) REFERENCES cats(foo_id) ON DELETE CASCADE ON UPDATE RESTRICT DEFERRABLE INITIALLY DEFERRED, CONSTRAINT bar UNIQUE (cat_id))']
142
- end
143
-
144
- it "should accept and literalize default values" do
145
- @db.create_table(:cats) do
146
- integer :id, :default => 123
147
- text :name, :default => "abc'def"
148
- end
149
- @db.sqls.must_equal ["CREATE TABLE cats (id integer DEFAULT 123, name text DEFAULT 'abc''def')"]
150
- end
151
-
152
- it "should accept not null definition" do
153
- @db.create_table(:cats) do
154
- integer :id
155
- text :name, :null => false
156
- text :name2, :allow_null => false
157
- end
158
- @db.sqls.must_equal ["CREATE TABLE cats (id integer, name text NOT NULL, name2 text NOT NULL)"]
159
- end
160
-
161
- it "should accept null definition" do
162
- @db.create_table(:cats) do
163
- integer :id
164
- text :name, :null => true
165
- text :name2, :allow_null => true
166
- end
167
- @db.sqls.must_equal ["CREATE TABLE cats (id integer, name text NULL, name2 text NULL)"]
168
- end
169
-
170
- it "should accept unique definition" do
171
- @db.create_table(:cats) do
172
- integer :id
173
- text :name, :unique => true
174
- end
175
- @db.sqls.must_equal ["CREATE TABLE cats (id integer, name text UNIQUE)"]
176
- end
177
-
178
- it "should allow naming unique constraint with :unique_constraint_name option" do
179
- @db.create_table(:cats) do
180
- text :name, :unique => true, :unique_constraint_name=>:foo
181
- end
182
- @db.sqls.must_equal ["CREATE TABLE cats (name text CONSTRAINT foo UNIQUE)"]
183
- end
184
-
185
- it "should handle not deferred unique constraints" do
186
- @db.create_table(:cats) do
187
- integer :id
188
- text :name
189
- unique :name, :deferrable=>false
190
- end
191
- @db.sqls.must_equal ["CREATE TABLE cats (id integer, name text, UNIQUE (name) NOT DEFERRABLE)"]
192
- end
193
-
194
- it "should handle deferred unique constraints" do
195
- @db.create_table(:cats) do
196
- integer :id
197
- text :name
198
- unique :name, :deferrable=>true
199
- end
200
- @db.sqls.must_equal ["CREATE TABLE cats (id integer, name text, UNIQUE (name) DEFERRABLE INITIALLY DEFERRED)"]
201
- end
202
-
203
- it "should handle deferred initially immediate unique constraints" do
204
- @db.create_table(:cats) do
205
- integer :id
206
- text :name
207
- unique :name, :deferrable=>:immediate
208
- end
209
- @db.sqls.must_equal ["CREATE TABLE cats (id integer, name text, UNIQUE (name) DEFERRABLE INITIALLY IMMEDIATE)"]
210
- end
211
-
212
- it "should accept unsigned definition" do
213
- @db.create_table(:cats) do
214
- integer :value, :unsigned => true
215
- end
216
- @db.sqls.must_equal ["CREATE TABLE cats (value integer UNSIGNED)"]
217
- end
218
-
219
- it "should accept [SET|ENUM](...) types" do
220
- @db.create_table(:cats) do
221
- set :color, :elements => ['black', 'tricolor', 'grey']
222
- end
223
- @db.sqls.must_equal ["CREATE TABLE cats (color set('black', 'tricolor', 'grey'))"]
224
- end
225
-
226
- it "should accept varchar size" do
227
- @db.create_table(:cats) do
228
- varchar :name
229
- end
230
- @db.sqls.must_equal ["CREATE TABLE cats (name varchar(255))"]
231
- @db.create_table(:cats) do
232
- varchar :name, :size => 51
233
- end
234
- @db.sqls.must_equal ["CREATE TABLE cats (name varchar(51))"]
235
- end
236
-
237
- it "should use double precision for double type" do
238
- @db.create_table(:cats) do
239
- double :name
240
- end
241
- @db.sqls.must_equal ["CREATE TABLE cats (name double precision)"]
242
- end
243
-
244
- it "should accept foreign keys without options" do
245
- @db.create_table(:cats) do
246
- foreign_key :project_id
247
- end
248
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer)"]
249
- end
250
-
251
- it "should accept foreign keys with options" do
252
- @db.create_table(:cats) do
253
- foreign_key :project_id, :table => :projects
254
- end
255
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects)"]
256
- end
257
-
258
- it "should accept foreign keys with separate table argument" do
259
- @db.create_table(:cats) do
260
- foreign_key :project_id, :projects, :default=>3
261
- end
262
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer DEFAULT 3 REFERENCES projects)"]
263
- end
264
-
265
- it "should allowing naming foreign key constraint with :foreign_key_constraint_name option" do
266
- @db.create_table(:cats) do
267
- foreign_key :project_id, :projects, :foreign_key_constraint_name=>:foo
268
- end
269
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer CONSTRAINT foo REFERENCES projects)"]
270
- end
271
-
272
- it "should raise an error if the table argument to foreign_key isn't a hash, symbol, or nil" do
273
- proc{@db.create_table(:cats){foreign_key :project_id, Object.new, :default=>3}}.must_raise(Sequel::Error)
274
- end
275
-
276
- it "should accept foreign keys with arbitrary keys" do
277
- @db.create_table(:cats) do
278
- foreign_key :project_id, :table => :projects, :key => :id
279
- end
280
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects(id))"]
281
-
282
- @db.create_table(:cats) do
283
- foreign_key :project_id, :table => :projects, :key => :zzz
284
- end
285
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects(zzz))"]
286
- end
287
-
288
- it "should accept foreign keys with ON DELETE clause" do
289
- @db.create_table(:cats) do
290
- foreign_key :project_id, :table => :projects, :on_delete => :restrict
291
- end
292
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE RESTRICT)"]
293
-
294
- @db.create_table(:cats) do
295
- foreign_key :project_id, :table => :projects, :on_delete => :cascade
296
- end
297
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE CASCADE)"]
298
-
299
- @db.create_table(:cats) do
300
- foreign_key :project_id, :table => :projects, :on_delete => :no_action
301
- end
302
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE NO ACTION)"]
303
-
304
- @db.create_table(:cats) do
305
- foreign_key :project_id, :table => :projects, :on_delete => :set_null
306
- end
307
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE SET NULL)"]
308
-
309
- @db.create_table(:cats) do
310
- foreign_key :project_id, :table => :projects, :on_delete => :set_default
311
- end
312
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE SET DEFAULT)"]
313
-
314
- @db.create_table(:cats) do
315
- foreign_key :project_id, :table => :projects, :on_delete => 'NO ACTION FOO'
316
- end
317
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE NO ACTION FOO)"]
318
- end
319
-
320
- it "should accept foreign keys with ON UPDATE clause" do
321
- @db.create_table(:cats) do
322
- foreign_key :project_id, :table => :projects, :on_update => :restrict
323
- end
324
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE RESTRICT)"]
325
-
326
- @db.create_table(:cats) do
327
- foreign_key :project_id, :table => :projects, :on_update => :cascade
328
- end
329
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE CASCADE)"]
330
-
331
- @db.create_table(:cats) do
332
- foreign_key :project_id, :table => :projects, :on_update => :no_action
333
- end
334
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE NO ACTION)"]
335
-
336
- @db.create_table(:cats) do
337
- foreign_key :project_id, :table => :projects, :on_update => :set_null
338
- end
339
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE SET NULL)"]
340
-
341
- @db.create_table(:cats) do
342
- foreign_key :project_id, :table => :projects, :on_update => :set_default
343
- end
344
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE SET DEFAULT)"]
345
-
346
- @db.create_table(:cats) do
347
- foreign_key :project_id, :table => :projects, :on_update => 'SET DEFAULT FOO'
348
- end
349
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE SET DEFAULT FOO)"]
350
- end
351
-
352
- it "should accept foreign keys with deferrable option" do
353
- @db.create_table(:cats) do
354
- foreign_key :project_id, :projects, :deferrable=>true
355
- end
356
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects DEFERRABLE INITIALLY DEFERRED)"]
357
- end
358
-
359
- it "should accept collation" do
360
- @db.quote_identifiers = true
361
- @db.create_table(:cats) do
362
- String :name, :collate => :utf8_bin
363
- end
364
- @db.sqls.must_equal ['CREATE TABLE "cats" ("name" varchar(255) COLLATE utf8_bin)']
365
- end
366
-
367
- it "should accept collation as a String, treated literally" do
368
- @db.create_table(:cats) do
369
- String :name, :collate => '"utf8_bin"'
370
- end
371
- @db.sqls.must_equal ['CREATE TABLE cats (name varchar(255) COLLATE "utf8_bin")']
372
- end
373
-
374
- it "should accept inline index definition" do
375
- @db.create_table(:cats) do
376
- integer :id, :index => true
377
- end
378
- @db.sqls.must_equal ["CREATE TABLE cats (id integer)", "CREATE INDEX cats_id_index ON cats (id)"]
379
- end
380
-
381
- it "should accept inline index definition with a hash of options" do
382
- @db.create_table(:cats) do
383
- integer :id, :index => {:unique=>true}
384
- end
385
- @db.sqls.must_equal ["CREATE TABLE cats (id integer)", "CREATE UNIQUE INDEX cats_id_index ON cats (id)"]
386
- end
387
-
388
- it "should accept inline index definition for foreign keys" do
389
- @db.create_table(:cats) do
390
- foreign_key :project_id, :table => :projects, :on_delete => :cascade, :index => true
391
- end
392
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE CASCADE)",
393
- "CREATE INDEX cats_project_id_index ON cats (project_id)"]
394
- end
395
-
396
- it "should accept inline index definition for foreign keys with a hash of options" do
397
- @db.create_table(:cats) do
398
- foreign_key :project_id, :table => :projects, :on_delete => :cascade, :index => {:unique=>true}
399
- end
400
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE CASCADE)",
401
- "CREATE UNIQUE INDEX cats_project_id_index ON cats (project_id)"]
402
- end
403
-
404
- it "should accept index definitions" do
405
- @db.create_table(:cats) do
406
- integer :id
407
- index :id
408
- end
409
- @db.sqls.must_equal ["CREATE TABLE cats (id integer)", "CREATE INDEX cats_id_index ON cats (id)"]
410
- end
411
-
412
- it "should accept unique constraint definitions" do
413
- @db.create_table(:cats) do
414
- text :name
415
- unique :name
416
- end
417
- @db.sqls.must_equal ["CREATE TABLE cats (name text, UNIQUE (name))"]
418
- end
419
-
420
- it "should accept partial index definitions" do
421
- def @db.supports_partial_indexes?() true end
422
- @db.create_table(:cats) do
423
- integer :id
424
- index :id, :where=>proc{id > 1}
425
- end
426
- @db.sqls.must_equal ["CREATE TABLE cats (id integer)", "CREATE INDEX cats_id_index ON cats (id) WHERE (id > 1)"]
427
- end
428
-
429
- it "should raise an error if partial indexes are not supported" do
430
- proc do
431
- @db.create_table(:cats) do
432
- integer :id
433
- index :id, :where=>proc{id > 1}
434
- end
435
- end.must_raise(Sequel::Error)
436
- end
437
-
438
- it "should not raise on index error for unsupported index definitions if ignore_index_errors is used" do
439
- @db.create_table(:cats, :ignore_index_errors=>true) do
440
- text :name
441
- full_text_index :name
442
- end
443
- end
444
-
445
- it "should raise on full-text index definitions" do
446
- proc {
447
- @db.create_table(:cats) do
448
- text :name
449
- full_text_index :name
450
- end
451
- }.must_raise(Sequel::Error)
452
- end
453
-
454
- it "should raise on spatial index definitions" do
455
- proc {
456
- @db.create_table(:cats) do
457
- point :geom
458
- spatial_index :geom
459
- end
460
- }.must_raise(Sequel::Error)
461
- end
462
-
463
- it "should raise on partial index definitions" do
464
- proc {
465
- @db.create_table(:cats) do
466
- text :name
467
- index :name, :where => {:something => true}
468
- end
469
- }.must_raise(Sequel::Error)
470
- end
471
-
472
- it "should raise index definitions with type" do
473
- proc {
474
- @db.create_table(:cats) do
475
- text :name
476
- index :name, :type => :hash
477
- end
478
- }.must_raise(Sequel::Error)
479
- end
480
-
481
- it "should ignore errors if the database raises an error on an index creation statement and the :ignore_index_errors option is used" do
482
- meta_def(@db, :execute_ddl){|*a| raise Sequel::DatabaseError if /blah/.match(a.first); super(*a)}
483
- lambda{@db.create_table(:cats){Integer :id; index :blah; index :id}}.must_raise(Sequel::DatabaseError)
484
- @db.sqls.must_equal ['CREATE TABLE cats (id integer)']
485
- @db.create_table(:cats, :ignore_index_errors=>true){Integer :id; index :blah; index :id}
486
- @db.sqls.must_equal ['CREATE TABLE cats (id integer)', 'CREATE INDEX cats_id_index ON cats (id)']
487
- end
488
-
489
- it "should accept multiple index definitions" do
490
- @db.create_table(:cats) do
491
- integer :id
492
- index :id
493
- index :name
494
- end
495
- @db.sqls.must_equal ["CREATE TABLE cats (id integer)", "CREATE INDEX cats_id_index ON cats (id)", "CREATE INDEX cats_name_index ON cats (name)"]
496
- end
497
-
498
- it "should accept functional indexes" do
499
- @db.create_table(:cats) do
500
- integer :id
501
- index Sequel.function(:lower, :name)
502
- end
503
- @db.sqls.must_equal ["CREATE TABLE cats (id integer)", "CREATE INDEX cats_lower_name__index ON cats (lower(name))"]
504
- end
505
-
506
- it "should accept indexes with identifiers" do
507
- @db.create_table(:cats) do
508
- integer :id
509
- index Sequel.identifier(:lower__name)
510
- end
511
- @db.sqls.must_equal ["CREATE TABLE cats (id integer)", "CREATE INDEX cats_lower__name_index ON cats (lower__name)"]
512
- end
513
-
514
- it "should accept custom index names" do
515
- @db.create_table(:cats) do
516
- integer :id
517
- index :id, :name => 'abc'
518
- end
519
- @db.sqls.must_equal ["CREATE TABLE cats (id integer)", "CREATE INDEX abc ON cats (id)"]
520
- end
521
-
522
- it "should accept unique index definitions" do
523
- @db.create_table(:cats) do
524
- integer :id
525
- index :id, :unique => true
526
- end
527
- @db.sqls.must_equal ["CREATE TABLE cats (id integer)", "CREATE UNIQUE INDEX cats_id_index ON cats (id)"]
528
- end
529
-
530
- it "should accept composite index definitions" do
531
- @db.create_table(:cats) do
532
- integer :id
533
- index [:id, :name], :unique => true
534
- end
535
- @db.sqls.must_equal ["CREATE TABLE cats (id integer)", "CREATE UNIQUE INDEX cats_id_name_index ON cats (id, name)"]
536
- end
537
-
538
- it "should accept unnamed constraint definitions with blocks" do
539
- @db.create_table(:cats) do
540
- integer :score
541
- check{(x > 0) & (y < 1)}
542
- end
543
- @db.sqls.must_equal ["CREATE TABLE cats (score integer, CHECK ((x > 0) AND (y < 1)))"]
544
- end
545
-
546
- it "should accept unnamed constraint definitions with function calls" do
547
- @db.create_table(:cats) do
548
- integer :score
549
- check{f(x)}
550
- end
551
- @db.sqls.must_equal ["CREATE TABLE cats (score integer, CHECK (f(x)))"]
552
- end
553
-
554
- it "should accept unnamed constraint definitions" do
555
- @db.create_table(:cats) do
556
- check 'price < ?', 100
557
- end
558
- @db.sqls.must_equal ["CREATE TABLE cats (CHECK (price < 100))"]
559
- end
560
-
561
- it "should accept arrays of pairs constraints" do
562
- @db.create_table(:cats) do
563
- check [[:price, 100]]
564
- end
565
- @db.sqls.must_equal ["CREATE TABLE cats (CHECK (price = 100))"]
566
- end
567
-
568
- it "should accept hash constraints" do
569
- @db.create_table(:cats) do
570
- check :price=>100
571
- end
572
- @db.sqls.must_equal ["CREATE TABLE cats (CHECK (price = 100))"]
573
- end
574
-
575
- it "should accept array constraints" do
576
- @db.create_table(:cats) do
577
- check [Sequel.expr(:x) > 0, Sequel.expr(:y) < 1]
578
- end
579
- @db.sqls.must_equal ["CREATE TABLE cats (CHECK ((x > 0) AND (y < 1)))"]
580
- end
581
-
582
- it "should accept named constraint definitions" do
583
- @db.create_table(:cats) do
584
- integer :score
585
- constraint :valid_score, 'score <= 100'
586
- end
587
- @db.sqls.must_equal ["CREATE TABLE cats (score integer, CONSTRAINT valid_score CHECK (score <= 100))"]
588
- end
589
-
590
- it "should accept named constraint definitions with options" do
591
- @db.create_table(:cats) do
592
- integer :score
593
- constraint({:name=>:valid_score, :deferrable=>true}, 'score <= 100')
594
- end
595
- @db.sqls.must_equal ["CREATE TABLE cats (score integer, CONSTRAINT valid_score CHECK (score <= 100) DEFERRABLE INITIALLY DEFERRED)"]
596
- end
597
-
598
- it "should accept named constraint definitions with block" do
599
- @db.create_table(:cats) do
600
- constraint(:blah_blah){(x.sql_number > 0) & (y.sql_number < 1)}
601
- end
602
- @db.sqls.must_equal ["CREATE TABLE cats (CONSTRAINT blah_blah CHECK ((x > 0) AND (y < 1)))"]
603
- end
604
-
605
- it "should raise an error if an invalid constraint type is used" do
606
- proc{@db.create_table(:cats){unique [:a, :b], :type=>:bb}}.must_raise(Sequel::Error)
607
- end
608
-
609
- it "should accept composite primary keys" do
610
- @db.create_table(:cats) do
611
- integer :a
612
- integer :b
613
- primary_key [:a, :b]
614
- end
615
- @db.sqls.must_equal ["CREATE TABLE cats (a integer, b integer, PRIMARY KEY (a, b))"]
616
- end
617
-
618
- it "should accept named composite primary keys" do
619
- @db.create_table(:cats) do
620
- integer :a
621
- integer :b
622
- primary_key [:a, :b], :name => :cpk
623
- end
624
- @db.sqls.must_equal ["CREATE TABLE cats (a integer, b integer, CONSTRAINT cpk PRIMARY KEY (a, b))"]
625
- end
626
-
627
- it "should accept composite foreign keys" do
628
- @db.create_table(:cats) do
629
- integer :a
630
- integer :b
631
- foreign_key [:a, :b], :abc
632
- end
633
- @db.sqls.must_equal ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc)"]
634
- end
635
-
636
- it "should accept named composite foreign keys" do
637
- @db.create_table(:cats) do
638
- integer :a
639
- integer :b
640
- foreign_key [:a, :b], :abc, :name => :cfk
641
- end
642
- @db.sqls.must_equal ["CREATE TABLE cats (a integer, b integer, CONSTRAINT cfk FOREIGN KEY (a, b) REFERENCES abc)"]
643
- end
644
-
645
- it "should accept composite foreign keys with arbitrary keys" do
646
- @db.create_table(:cats) do
647
- integer :a
648
- integer :b
649
- foreign_key [:a, :b], :abc, :key => [:real_a, :real_b]
650
- end
651
- @db.sqls.must_equal ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc(real_a, real_b))"]
652
-
653
- @db.create_table(:cats) do
654
- integer :a
655
- integer :b
656
- foreign_key [:a, :b], :abc, :key => [:z, :x]
657
- end
658
- @db.sqls.must_equal ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc(z, x))"]
659
- end
660
-
661
- it "should accept composite foreign keys with on delete and on update clauses" do
662
- @db.create_table(:cats) do
663
- integer :a
664
- integer :b
665
- foreign_key [:a, :b], :abc, :on_delete => :cascade
666
- end
667
- @db.sqls.must_equal ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc ON DELETE CASCADE)"]
668
-
669
- @db.create_table(:cats) do
670
- integer :a
671
- integer :b
672
- foreign_key [:a, :b], :abc, :on_update => :no_action
673
- end
674
- @db.sqls.must_equal ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc ON UPDATE NO ACTION)"]
675
-
676
- @db.create_table(:cats) do
677
- integer :a
678
- integer :b
679
- foreign_key [:a, :b], :abc, :on_delete => :restrict, :on_update => :set_default
680
- end
681
- @db.sqls.must_equal ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc ON DELETE RESTRICT ON UPDATE SET DEFAULT)"]
682
-
683
- @db.create_table(:cats) do
684
- integer :a
685
- integer :b
686
- foreign_key [:a, :b], :abc, :key => [:x, :y], :on_delete => :set_null, :on_update => :set_null
687
- end
688
- @db.sqls.must_equal ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc(x, y) ON DELETE SET NULL ON UPDATE SET NULL)"]
689
- end
690
-
691
- it "should accept an :as option to create a table from the results of a dataset" do
692
- @db.create_table(:cats, :as=>@db[:a])
693
- @db.sqls.must_equal ['CREATE TABLE cats AS SELECT * FROM a']
694
- end
695
-
696
- it "should accept an :as option to create a table from a SELECT string" do
697
- @db.create_table(:cats, :as=>'SELECT * FROM a')
698
- @db.sqls.must_equal ['CREATE TABLE cats AS SELECT * FROM a']
699
- end
700
-
701
- it "should raise an Error if both a block and an :as argument are given" do
702
- proc{@db.create_table(:cats, :as=>@db[:a]){}}.must_raise(Sequel::Error)
703
- end
704
- end
705
-
706
- describe "DB#create_table!" do
707
- before do
708
- @db = Sequel.mock
709
- end
710
-
711
- it "should create the table if it does not exist" do
712
- meta_def(@db, :table_exists?){|a| false}
713
- @db.create_table!(:cats){|*a|}
714
- @db.sqls.must_equal ['CREATE TABLE cats ()']
715
- end
716
-
717
- it "should drop the table before creating it if it already exists" do
718
- meta_def(@db, :table_exists?){|a| true}
719
- @db.create_table!(:cats){|*a|}
720
- @db.sqls.must_equal ['DROP TABLE cats', 'CREATE TABLE cats ()']
721
- end
722
-
723
- it "should use IF EXISTS if the database supports it" do
724
- meta_def(@db, :supports_drop_table_if_exists?){true}
725
- @db.create_table!(:cats){|*a|}
726
- @db.sqls.must_equal ['DROP TABLE IF EXISTS cats', 'CREATE TABLE cats ()']
727
- end
728
- end
729
-
730
- describe "DB#create_table?" do
731
- before do
732
- @db = Sequel.mock
733
- end
734
-
735
- it "should not create the table if the table already exists" do
736
- meta_def(@db, :table_exists?){|a| true}
737
- @db.create_table?(:cats){|*a|}
738
- @db.sqls.must_equal []
739
- end
740
-
741
- it "should create the table if the table doesn't already exist" do
742
- meta_def(@db, :table_exists?){|a| false}
743
- @db.create_table?(:cats){|*a|}
744
- @db.sqls.must_equal ['CREATE TABLE cats ()']
745
- end
746
-
747
- it "should use IF NOT EXISTS if the database supports that" do
748
- meta_def(@db, :supports_create_table_if_not_exists?){true}
749
- @db.create_table?(:cats){|*a|}
750
- @db.sqls.must_equal ['CREATE TABLE IF NOT EXISTS cats ()']
751
- end
752
-
753
- it "should not use IF NOT EXISTS if the indexes are created" do
754
- meta_def(@db, :table_exists?){|a| false}
755
- meta_def(@db, :supports_create_table_if_not_exists?){true}
756
- @db.create_table?(:cats){|*a| Integer :a, :index=>true}
757
- @db.sqls.must_equal ['CREATE TABLE cats (a integer)', 'CREATE INDEX cats_a_index ON cats (a)']
758
-
759
- meta_def(@db, :table_exists?){|a| true}
760
- @db.create_table?(:cats){|*a| Integer :a, :index=>true}
761
- @db.sqls.must_equal []
762
- end
763
- end
764
-
765
- describe "DB#create_join_table" do
766
- before do
767
- @db = Sequel.mock
768
- end
769
-
770
- it "should take a hash with foreign keys and table name values" do
771
- @db.create_join_table(:cat_id=>:cats, :dog_id=>:dogs)
772
- @db.sqls.must_equal ['CREATE TABLE cats_dogs (cat_id integer NOT NULL REFERENCES cats, dog_id integer NOT NULL REFERENCES dogs, PRIMARY KEY (cat_id, dog_id))', 'CREATE INDEX cats_dogs_dog_id_cat_id_index ON cats_dogs (dog_id, cat_id)']
773
- end
774
-
775
- it "should be able to have values be a hash of options" do
776
- @db.create_join_table(:cat_id=>{:table=>:cats, :null=>true}, :dog_id=>{:table=>:dogs, :default=>0})
777
- @db.sqls.must_equal ['CREATE TABLE cats_dogs (cat_id integer NULL REFERENCES cats, dog_id integer DEFAULT 0 NOT NULL REFERENCES dogs, PRIMARY KEY (cat_id, dog_id))', 'CREATE INDEX cats_dogs_dog_id_cat_id_index ON cats_dogs (dog_id, cat_id)']
778
- end
779
-
780
- it "should be able to pass a second hash of table options" do
781
- @db.create_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :temp=>true)
782
- @db.sqls.must_equal ['CREATE TEMPORARY TABLE cats_dogs (cat_id integer NOT NULL REFERENCES cats, dog_id integer NOT NULL REFERENCES dogs, PRIMARY KEY (cat_id, dog_id))', 'CREATE INDEX cats_dogs_dog_id_cat_id_index ON cats_dogs (dog_id, cat_id)']
783
- end
784
-
785
- it "should recognize :name option in table options" do
786
- @db.create_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :name=>:f)
787
- @db.sqls.must_equal ['CREATE TABLE f (cat_id integer NOT NULL REFERENCES cats, dog_id integer NOT NULL REFERENCES dogs, PRIMARY KEY (cat_id, dog_id))', 'CREATE INDEX f_dog_id_cat_id_index ON f (dog_id, cat_id)']
788
- end
789
-
790
- it "should recognize :index_options option in table options" do
791
- @db.create_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :index_options=>{:name=>:foo_index})
792
- @db.sqls.must_equal ['CREATE TABLE cats_dogs (cat_id integer NOT NULL REFERENCES cats, dog_id integer NOT NULL REFERENCES dogs, PRIMARY KEY (cat_id, dog_id))', 'CREATE INDEX foo_index ON cats_dogs (dog_id, cat_id)']
793
- end
794
-
795
- it "should recognize :no_index option in table options" do
796
- @db.create_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :no_index=>true)
797
- @db.sqls.must_equal ['CREATE TABLE cats_dogs (cat_id integer NOT NULL REFERENCES cats, dog_id integer NOT NULL REFERENCES dogs, PRIMARY KEY (cat_id, dog_id))']
798
- end
799
-
800
- it "should recognize :no_primary_key option in table options" do
801
- @db.create_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :no_primary_key=>true)
802
- @db.sqls.must_equal ['CREATE TABLE cats_dogs (cat_id integer NOT NULL REFERENCES cats, dog_id integer NOT NULL REFERENCES dogs)', 'CREATE INDEX cats_dogs_dog_id_cat_id_index ON cats_dogs (dog_id, cat_id)']
803
- end
804
-
805
- it "should raise an error if the hash doesn't have 2 entries with table names" do
806
- proc{@db.create_join_table({})}.must_raise(Sequel::Error)
807
- proc{@db.create_join_table({:cat_id=>:cats})}.must_raise(Sequel::Error)
808
- proc{@db.create_join_table({:cat_id=>:cats, :human_id=>:humans, :dog_id=>:dog})}.must_raise(Sequel::Error)
809
- proc{@db.create_join_table({:cat_id=>:cats, :dog_id=>{}})}.must_raise(Sequel::Error)
810
- end
811
- end
812
-
813
- describe "DB#create_join_table?" do
814
- before do
815
- @db = Sequel.mock
816
- end
817
-
818
- it "should create the table if it does not already exist" do
819
- meta_def(@db, :table_exists?){|a| false}
820
- @db.create_join_table?(:cat_id=>:cats, :dog_id=>:dogs)
821
- @db.sqls.must_equal ['CREATE TABLE cats_dogs (cat_id integer NOT NULL REFERENCES cats, dog_id integer NOT NULL REFERENCES dogs, PRIMARY KEY (cat_id, dog_id))', 'CREATE INDEX cats_dogs_dog_id_cat_id_index ON cats_dogs (dog_id, cat_id)']
822
- end
823
-
824
- it "should not create the table if it already exists" do
825
- meta_def(@db, :table_exists?){|a| true}
826
- @db.create_join_table?(:cat_id=>:cats, :dog_id=>:dogs)
827
- @db.sqls.must_equal []
828
- end
829
-
830
- it "should not use IF NOT EXISTS" do
831
- meta_def(@db, :table_exists?){|a| false}
832
- meta_def(@db, :supports_create_table_if_not_exists?){true}
833
- @db.create_join_table?(:cat_id=>:cats, :dog_id=>:dogs)
834
- @db.sqls.must_equal ['CREATE TABLE cats_dogs (cat_id integer NOT NULL REFERENCES cats, dog_id integer NOT NULL REFERENCES dogs, PRIMARY KEY (cat_id, dog_id))', 'CREATE INDEX cats_dogs_dog_id_cat_id_index ON cats_dogs (dog_id, cat_id)']
835
-
836
- meta_def(@db, :table_exists?){|a| true}
837
- @db.create_join_table?(:cat_id=>:cats, :dog_id=>:dogs)
838
- @db.sqls.must_equal []
839
- end
840
-
841
- it "should not use IF NOT EXISTS if no_index is used" do
842
- meta_def(@db, :supports_create_table_if_not_exists?){true}
843
- @db.create_join_table?({:cat_id=>:cats, :dog_id=>:dogs}, :no_index=>true)
844
- @db.sqls.must_equal ['CREATE TABLE IF NOT EXISTS cats_dogs (cat_id integer NOT NULL REFERENCES cats, dog_id integer NOT NULL REFERENCES dogs, PRIMARY KEY (cat_id, dog_id))']
845
- end
846
- end
847
-
848
- describe "DB#create_join_table!" do
849
- before do
850
- @db = Sequel.mock
851
- end
852
-
853
- it "should drop the table first if it already exists" do
854
- meta_def(@db, :table_exists?){|a| true}
855
- @db.create_join_table!(:cat_id=>:cats, :dog_id=>:dogs)
856
- @db.sqls.must_equal ['DROP TABLE cats_dogs', 'CREATE TABLE cats_dogs (cat_id integer NOT NULL REFERENCES cats, dog_id integer NOT NULL REFERENCES dogs, PRIMARY KEY (cat_id, dog_id))', 'CREATE INDEX cats_dogs_dog_id_cat_id_index ON cats_dogs (dog_id, cat_id)']
857
- end
858
-
859
- it "should not drop the table if it doesn't exists" do
860
- meta_def(@db, :table_exists?){|a| false}
861
- @db.create_join_table!(:cat_id=>:cats, :dog_id=>:dogs)
862
- @db.sqls.must_equal ['CREATE TABLE cats_dogs (cat_id integer NOT NULL REFERENCES cats, dog_id integer NOT NULL REFERENCES dogs, PRIMARY KEY (cat_id, dog_id))', 'CREATE INDEX cats_dogs_dog_id_cat_id_index ON cats_dogs (dog_id, cat_id)']
863
- end
864
-
865
- it "should use IF EXISTS if the database supports it" do
866
- meta_def(@db, :supports_drop_table_if_exists?){true}
867
- @db.create_join_table!(:cat_id=>:cats, :dog_id=>:dogs)
868
- @db.sqls.must_equal ['DROP TABLE IF EXISTS cats_dogs', 'CREATE TABLE cats_dogs (cat_id integer NOT NULL REFERENCES cats, dog_id integer NOT NULL REFERENCES dogs, PRIMARY KEY (cat_id, dog_id))', 'CREATE INDEX cats_dogs_dog_id_cat_id_index ON cats_dogs (dog_id, cat_id)']
869
- end
870
- end
871
-
872
- describe "DB#drop_join_table" do
873
- before do
874
- @db = Sequel.mock
875
- end
876
-
877
- it "should take a hash with foreign keys and table name values and drop the table" do
878
- @db.drop_join_table(:cat_id=>:cats, :dog_id=>:dogs)
879
- @db.sqls.must_equal ['DROP TABLE cats_dogs']
880
- end
881
-
882
- it "should be able to have values be a hash of options" do
883
- @db.drop_join_table(:cat_id=>{:table=>:cats, :null=>true}, :dog_id=>{:table=>:dogs, :default=>0})
884
- @db.sqls.must_equal ['DROP TABLE cats_dogs']
885
- end
886
-
887
- it "should respect a second hash of table options" do
888
- @db.drop_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :cascade=>true)
889
- @db.sqls.must_equal ['DROP TABLE cats_dogs CASCADE']
890
- end
891
-
892
- it "should respect :name option for table name" do
893
- @db.drop_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :name=>:f)
894
- @db.sqls.must_equal ['DROP TABLE f']
895
- end
896
-
897
- it "should raise an error if the hash doesn't have 2 entries with table names" do
898
- proc{@db.drop_join_table({})}.must_raise(Sequel::Error)
899
- proc{@db.drop_join_table({:cat_id=>:cats})}.must_raise(Sequel::Error)
900
- proc{@db.drop_join_table({:cat_id=>:cats, :human_id=>:humans, :dog_id=>:dog})}.must_raise(Sequel::Error)
901
- proc{@db.drop_join_table({:cat_id=>:cats, :dog_id=>{}})}.must_raise(Sequel::Error)
902
- end
903
- end
904
-
905
- describe "DB#drop_table" do
906
- before do
907
- @db = Sequel.mock
908
- end
909
-
910
- it "should generate a DROP TABLE statement" do
911
- @db.drop_table :cats
912
- @db.sqls.must_equal ['DROP TABLE cats']
913
- end
914
-
915
- it "should drop multiple tables at once" do
916
- @db.drop_table :cats, :dogs
917
- @db.sqls.must_equal ['DROP TABLE cats', 'DROP TABLE dogs']
918
- end
919
-
920
- it "should take an options hash and support the :cascade option" do
921
- @db.drop_table :cats, :dogs, :cascade=>true
922
- @db.sqls.must_equal ['DROP TABLE cats CASCADE', 'DROP TABLE dogs CASCADE']
923
- end
924
- end
925
-
926
- describe "DB#drop_table?" do
927
- before do
928
- @db = Sequel.mock
929
- end
930
-
931
- it "should drop the table if it exists" do
932
- meta_def(@db, :table_exists?){|a| true}
933
- @db.drop_table?(:cats)
934
- @db.sqls.must_equal ["DROP TABLE cats"]
935
- end
936
-
937
- it "should do nothing if the table does not exist" do
938
- meta_def(@db, :table_exists?){|a| false}
939
- @db.drop_table?(:cats)
940
- @db.sqls.must_equal []
941
- end
942
-
943
- it "should operate on multiple tables at once" do
944
- meta_def(@db, :table_exists?){|a| a == :cats}
945
- @db.drop_table? :cats, :dogs
946
- @db.sqls.must_equal ['DROP TABLE cats']
947
- end
948
-
949
- it "should take an options hash and support the :cascade option" do
950
- meta_def(@db, :table_exists?){|a| true}
951
- @db.drop_table? :cats, :dogs, :cascade=>true
952
- @db.sqls.must_equal ['DROP TABLE cats CASCADE', 'DROP TABLE dogs CASCADE']
953
- end
954
-
955
- it "should use IF NOT EXISTS if the database supports that" do
956
- meta_def(@db, :supports_drop_table_if_exists?){true}
957
- @db.drop_table? :cats, :dogs
958
- @db.sqls.must_equal ['DROP TABLE IF EXISTS cats', 'DROP TABLE IF EXISTS dogs']
959
- end
960
-
961
- it "should use IF NOT EXISTS with CASCADE if the database supports that" do
962
- meta_def(@db, :supports_drop_table_if_exists?){true}
963
- @db.drop_table? :cats, :dogs, :cascade=>true
964
- @db.sqls.must_equal ['DROP TABLE IF EXISTS cats CASCADE', 'DROP TABLE IF EXISTS dogs CASCADE']
965
- end
966
- end
967
-
968
- describe "DB#alter_table" do
969
- before do
970
- @db = Sequel.mock
971
- end
972
-
973
- it "should allow adding not null constraint via set_column_allow_null with false argument" do
974
- @db.alter_table(:cats) do
975
- set_column_allow_null :score, false
976
- end
977
- @db.sqls.must_equal ["ALTER TABLE cats ALTER COLUMN score SET NOT NULL"]
978
- end
979
-
980
- it "should allow removing not null constraint via set_column_allow_null with true argument" do
981
- @db.alter_table(:cats) do
982
- set_column_allow_null :score, true
983
- end
984
- @db.sqls.must_equal ["ALTER TABLE cats ALTER COLUMN score DROP NOT NULL"]
985
- end
986
-
987
- it "should allow adding not null constraint via set_column_not_null" do
988
- @db.alter_table(:cats) do
989
- set_column_not_null :score
990
- end
991
- @db.sqls.must_equal ["ALTER TABLE cats ALTER COLUMN score SET NOT NULL"]
992
- end
993
-
994
- it "should allow removing not null constraint via set_column_allow_null without argument" do
995
- @db.alter_table(:cats) do
996
- set_column_allow_null :score
997
- end
998
- @db.sqls.must_equal ["ALTER TABLE cats ALTER COLUMN score DROP NOT NULL"]
999
- end
1000
-
1001
- it "should support add_column" do
1002
- @db.alter_table(:cats) do
1003
- add_column :score, :integer
1004
- end
1005
- @db.sqls.must_equal ["ALTER TABLE cats ADD COLUMN score integer"]
1006
- end
1007
-
1008
- it "should support add_constraint" do
1009
- @db.alter_table(:cats) do
1010
- add_constraint :valid_score, 'score <= 100'
1011
- end
1012
- @db.sqls.must_equal ["ALTER TABLE cats ADD CONSTRAINT valid_score CHECK (score <= 100)"]
1013
- end
1014
-
1015
- it "should support add_constraint with options" do
1016
- @db.alter_table(:cats) do
1017
- add_constraint({:name=>:valid_score, :deferrable=>true}, 'score <= 100')
1018
- end
1019
- @db.sqls.must_equal ["ALTER TABLE cats ADD CONSTRAINT valid_score CHECK (score <= 100) DEFERRABLE INITIALLY DEFERRED"]
1020
- end
1021
-
1022
- it "should support add_constraint with block" do
1023
- @db.alter_table(:cats) do
1024
- add_constraint(:blah_blah){(x.sql_number > 0) & (y.sql_number < 1)}
1025
- end
1026
- @db.sqls.must_equal ["ALTER TABLE cats ADD CONSTRAINT blah_blah CHECK ((x > 0) AND (y < 1))"]
1027
- end
1028
-
1029
- it "should support add_unique_constraint" do
1030
- @db.alter_table(:cats) do
1031
- add_unique_constraint [:a, :b]
1032
- end
1033
- @db.sqls.must_equal ["ALTER TABLE cats ADD UNIQUE (a, b)"]
1034
-
1035
- @db.alter_table(:cats) do
1036
- add_unique_constraint [:a, :b], :name => :ab_uniq
1037
- end
1038
- @db.sqls.must_equal ["ALTER TABLE cats ADD CONSTRAINT ab_uniq UNIQUE (a, b)"]
1039
- end
1040
-
1041
- it "should support add_foreign_key" do
1042
- @db.alter_table(:cats) do
1043
- add_foreign_key :node_id, :nodes
1044
- end
1045
- @db.sqls.must_equal ["ALTER TABLE cats ADD COLUMN node_id integer REFERENCES nodes"]
1046
- end
1047
-
1048
- it "should support add_foreign_key with composite foreign keys" do
1049
- @db.alter_table(:cats) do
1050
- add_foreign_key [:node_id, :prop_id], :nodes_props
1051
- end
1052
- @db.sqls.must_equal ["ALTER TABLE cats ADD FOREIGN KEY (node_id, prop_id) REFERENCES nodes_props"]
1053
-
1054
- @db.alter_table(:cats) do
1055
- add_foreign_key [:node_id, :prop_id], :nodes_props, :name => :cfk
1056
- end
1057
- @db.sqls.must_equal ["ALTER TABLE cats ADD CONSTRAINT cfk FOREIGN KEY (node_id, prop_id) REFERENCES nodes_props"]
1058
-
1059
- @db.alter_table(:cats) do
1060
- add_foreign_key [:node_id, :prop_id], :nodes_props, :key => [:nid, :pid]
1061
- end
1062
- @db.sqls.must_equal ["ALTER TABLE cats ADD FOREIGN KEY (node_id, prop_id) REFERENCES nodes_props(nid, pid)"]
1063
-
1064
- @db.alter_table(:cats) do
1065
- add_foreign_key [:node_id, :prop_id], :nodes_props, :on_delete => :restrict, :on_update => :cascade
1066
- end
1067
- @db.sqls.must_equal ["ALTER TABLE cats ADD FOREIGN KEY (node_id, prop_id) REFERENCES nodes_props ON DELETE RESTRICT ON UPDATE CASCADE"]
1068
- end
1069
-
1070
- it "should support add_index" do
1071
- @db.alter_table(:cats) do
1072
- add_index :name
1073
- end
1074
- @db.sqls.must_equal ["CREATE INDEX cats_name_index ON cats (name)"]
1075
- end
1076
-
1077
- it "should ignore errors if the database raises an error on an add_index call and the :ignore_errors option is used" do
1078
- meta_def(@db, :execute_ddl){|*a| raise Sequel::DatabaseError}
1079
- lambda{@db.add_index(:cats, :id)}.must_raise(Sequel::DatabaseError)
1080
- @db.add_index(:cats, :id, :ignore_errors=>true)
1081
- @db.sqls.must_equal []
1082
- end
1083
-
1084
- it "should support add_primary_key" do
1085
- @db.alter_table(:cats) do
1086
- add_primary_key :id
1087
- end
1088
- @db.sqls.must_equal ["ALTER TABLE cats ADD COLUMN id integer PRIMARY KEY AUTOINCREMENT"]
1089
- end
1090
-
1091
- it "should support add_primary_key with composite primary keys" do
1092
- @db.alter_table(:cats) do
1093
- add_primary_key [:id, :type]
1094
- end
1095
- @db.sqls.must_equal ["ALTER TABLE cats ADD PRIMARY KEY (id, type)"]
1096
-
1097
- @db.alter_table(:cats) do
1098
- add_primary_key [:id, :type], :name => :cpk
1099
- end
1100
- @db.sqls.must_equal ["ALTER TABLE cats ADD CONSTRAINT cpk PRIMARY KEY (id, type)"]
1101
- end
1102
-
1103
- it "should support drop_column" do
1104
- @db.alter_table(:cats) do
1105
- drop_column :score
1106
- end
1107
- @db.sqls.must_equal ["ALTER TABLE cats DROP COLUMN score"]
1108
- end
1109
-
1110
- it "should support drop_column with :cascade=>true option" do
1111
- @db.alter_table(:cats) do
1112
- drop_column :score, :cascade=>true
1113
- end
1114
- @db.sqls.must_equal ["ALTER TABLE cats DROP COLUMN score CASCADE"]
1115
- end
1116
-
1117
- it "should support drop_constraint" do
1118
- @db.alter_table(:cats) do
1119
- drop_constraint :valid_score
1120
- end
1121
- @db.sqls.must_equal ["ALTER TABLE cats DROP CONSTRAINT valid_score"]
1122
- end
1123
-
1124
- it "should support drop_constraint with :cascade=>true option" do
1125
- @db.alter_table(:cats) do
1126
- drop_constraint :valid_score, :cascade=>true
1127
- end
1128
- @db.sqls.must_equal ["ALTER TABLE cats DROP CONSTRAINT valid_score CASCADE"]
1129
- end
1130
-
1131
- it "should support drop_foreign_key" do
1132
- def @db.foreign_key_list(table_name)
1133
- [{:name=>:cats_node_id_fkey, :columns=>[:node_id]}]
1134
- end
1135
- @db.alter_table(:cats) do
1136
- drop_foreign_key :node_id
1137
- end
1138
- @db.sqls.must_equal ["ALTER TABLE cats DROP CONSTRAINT cats_node_id_fkey", "ALTER TABLE cats DROP COLUMN node_id"]
1139
- end
1140
-
1141
- it "should support drop_foreign_key with composite foreign keys" do
1142
- def @db.foreign_key_list(table_name)
1143
- [{:name=>:cats_node_id_prop_id_fkey, :columns=>[:node_id, :prop_id]}]
1144
- end
1145
- @db.alter_table(:cats) do
1146
- drop_foreign_key [:node_id, :prop_id]
1147
- end
1148
- @db.sqls.must_equal ["ALTER TABLE cats DROP CONSTRAINT cats_node_id_prop_id_fkey"]
1149
-
1150
- @db.alter_table(:cats) do
1151
- drop_foreign_key [:node_id, :prop_id], :name => :cfk
1152
- end
1153
- @db.sqls.must_equal ["ALTER TABLE cats DROP CONSTRAINT cfk"]
1154
- end
1155
-
1156
- it "should have drop_foreign_key raise Error if no name is found" do
1157
- def @db.foreign_key_list(table_name)
1158
- [{:name=>:cats_node_id_fkey, :columns=>[:foo_id]}]
1159
- end
1160
- lambda{@db.alter_table(:cats){drop_foreign_key :node_id}}.must_raise(Sequel::Error)
1161
- end
1162
-
1163
- it "should have drop_foreign_key raise Error if multiple foreign keys found" do
1164
- def @db.foreign_key_list(table_name)
1165
- [{:name=>:cats_node_id_fkey, :columns=>[:node_id]}, {:name=>:cats_node_id_fkey2, :columns=>[:node_id]}]
1166
- end
1167
- lambda{@db.alter_table(:cats){drop_foreign_key :node_id}}.must_raise(Sequel::Error)
1168
- end
1169
-
1170
- it "should support drop_index" do
1171
- @db.alter_table(:cats) do
1172
- drop_index :name
1173
- end
1174
- @db.sqls.must_equal ["DROP INDEX cats_name_index"]
1175
- end
1176
-
1177
- it "should support drop_index with a given name" do
1178
- @db.alter_table(:cats) do
1179
- drop_index :name, :name=>:blah_blah
1180
- end
1181
- @db.sqls.must_equal ["DROP INDEX blah_blah"]
1182
- end
1183
-
1184
- it "should support rename_column" do
1185
- @db.alter_table(:cats) do
1186
- rename_column :name, :old_name
1187
- end
1188
- @db.sqls.must_equal ["ALTER TABLE cats RENAME COLUMN name TO old_name"]
1189
- end
1190
-
1191
- it "should support set_column_default" do
1192
- @db.alter_table(:cats) do
1193
- set_column_default :score, 3
1194
- end
1195
- @db.sqls.must_equal ["ALTER TABLE cats ALTER COLUMN score SET DEFAULT 3"]
1196
- end
1197
-
1198
- it "should support set_column_type" do
1199
- @db.alter_table(:cats) do
1200
- set_column_type :score, :real
1201
- end
1202
- @db.sqls.must_equal ["ALTER TABLE cats ALTER COLUMN score TYPE real"]
1203
- end
1204
-
1205
- it "should support set_column_type with options" do
1206
- @db.alter_table(:cats) do
1207
- set_column_type :score, :integer, :unsigned=>true
1208
- set_column_type :score, :varchar, :size=>30
1209
- set_column_type :score, :enum, :elements=>['a', 'b']
1210
- end
1211
- @db.sqls.must_equal ["ALTER TABLE cats ALTER COLUMN score TYPE integer UNSIGNED",
1212
- "ALTER TABLE cats ALTER COLUMN score TYPE varchar(30)",
1213
- "ALTER TABLE cats ALTER COLUMN score TYPE enum('a', 'b')"]
1214
- end
1215
-
1216
- it "should combine operations into a single query if the database supports it" do
1217
- meta_def(@db, :supports_combining_alter_table_ops?){true}
1218
- @db.alter_table(:cats) do
1219
- add_column :a, Integer
1220
- drop_column :b
1221
- set_column_not_null :c
1222
- rename_column :d, :e
1223
- set_column_default :f, 'g'
1224
- set_column_type :h, Integer
1225
- add_constraint(:i){a > 1}
1226
- drop_constraint :j
1227
- end
1228
- @db.sqls.must_equal ["ALTER TABLE cats ADD COLUMN a integer, DROP COLUMN b, ALTER COLUMN c SET NOT NULL, RENAME COLUMN d TO e, ALTER COLUMN f SET DEFAULT 'g', ALTER COLUMN h TYPE integer, ADD CONSTRAINT i CHECK (a > 1), DROP CONSTRAINT j"]
1229
- end
1230
-
1231
- it "should combine operations into consecutive groups of combinable operations if the database supports combining operations" do
1232
- meta_def(@db, :supports_combining_alter_table_ops?){true}
1233
- @db.alter_table(:cats) do
1234
- add_column :a, Integer
1235
- drop_column :b
1236
- set_column_not_null :c
1237
- rename_column :d, :e
1238
- add_index :e
1239
- set_column_default :f, 'g'
1240
- set_column_type :h, Integer
1241
- add_constraint(:i){a > 1}
1242
- drop_constraint :j
1243
- end
1244
- @db.sqls.must_equal ["ALTER TABLE cats ADD COLUMN a integer, DROP COLUMN b, ALTER COLUMN c SET NOT NULL, RENAME COLUMN d TO e",
1245
- "CREATE INDEX cats_e_index ON cats (e)",
1246
- "ALTER TABLE cats ALTER COLUMN f SET DEFAULT 'g', ALTER COLUMN h TYPE integer, ADD CONSTRAINT i CHECK (a > 1), DROP CONSTRAINT j"]
1247
- end
1248
-
1249
- end
1250
-
1251
- describe "Database#create_table" do
1252
- before do
1253
- @db = Sequel.mock
1254
- end
1255
-
1256
- it "should construct proper SQL" do
1257
- @db.create_table :test do
1258
- primary_key :id, :integer, :null => false
1259
- column :name, :text
1260
- index :name, :unique => true
1261
- end
1262
- @db.sqls.must_equal ['CREATE TABLE test (id integer NOT NULL PRIMARY KEY AUTOINCREMENT, name text)',
1263
- 'CREATE UNIQUE INDEX test_name_index ON test (name)']
1264
- end
1265
-
1266
- it "should create a temporary table" do
1267
- @db.create_table :test_tmp, :temp => true do
1268
- primary_key :id, :integer, :null => false
1269
- column :name, :text
1270
- index :name, :unique => true
1271
- end
1272
-
1273
- @db.sqls.must_equal ['CREATE TEMPORARY TABLE test_tmp (id integer NOT NULL PRIMARY KEY AUTOINCREMENT, name text)',
1274
- 'CREATE UNIQUE INDEX test_tmp_name_index ON test_tmp (name)']
1275
- end
1276
- end
1277
-
1278
- describe "Database#alter_table" do
1279
- before do
1280
- @db = Sequel.mock
1281
- end
1282
-
1283
- it "should construct proper SQL" do
1284
- @db.alter_table :xyz do
1285
- add_column :aaa, :text, :null => false, :unique => true
1286
- drop_column :bbb
1287
- rename_column :ccc, :ddd
1288
- set_column_type :eee, :integer
1289
- set_column_default :hhh, 'abcd'
1290
- add_index :fff, :unique => true
1291
- drop_index :ggg
1292
- end
1293
-
1294
- @db.sqls.must_equal ['ALTER TABLE xyz ADD COLUMN aaa text NOT NULL UNIQUE',
1295
- 'ALTER TABLE xyz DROP COLUMN bbb',
1296
- 'ALTER TABLE xyz RENAME COLUMN ccc TO ddd',
1297
- 'ALTER TABLE xyz ALTER COLUMN eee TYPE integer',
1298
- "ALTER TABLE xyz ALTER COLUMN hhh SET DEFAULT 'abcd'",
1299
- 'CREATE UNIQUE INDEX xyz_fff_index ON xyz (fff)',
1300
- 'DROP INDEX xyz_ggg_index']
1301
- end
1302
- end
1303
-
1304
- describe "Database#add_column" do
1305
- it "should construct proper SQL" do
1306
- db = Sequel.mock
1307
- db.add_column :test, :name, :text, :unique => true
1308
- db.sqls.must_equal ['ALTER TABLE test ADD COLUMN name text UNIQUE']
1309
- end
1310
- end
1311
-
1312
- describe "Database#drop_column" do
1313
- before do
1314
- @db = Sequel.mock
1315
- end
1316
-
1317
- it "should construct proper SQL" do
1318
- @db.drop_column :test, :name
1319
- @db.sqls.must_equal ['ALTER TABLE test DROP COLUMN name']
1320
- end
1321
-
1322
- it "should use CASCADE for :cascade=>true option" do
1323
- @db.drop_column :test, :name, :cascade=>true
1324
- @db.sqls.must_equal ['ALTER TABLE test DROP COLUMN name CASCADE']
1325
- end
1326
- end
1327
-
1328
- describe "Database#rename_column" do
1329
- before do
1330
- @db = Sequel.mock
1331
- end
1332
-
1333
- it "should construct proper SQL" do
1334
- @db.rename_column :test, :abc, :def
1335
- @db.sqls.must_equal ['ALTER TABLE test RENAME COLUMN abc TO def']
1336
- end
1337
- end
1338
-
1339
- describe "Database#set_column_type" do
1340
- before do
1341
- @db = Sequel.mock
1342
- end
1343
-
1344
- it "should construct proper SQL" do
1345
- @db.set_column_type :test, :name, :integer
1346
- @db.sqls.must_equal ['ALTER TABLE test ALTER COLUMN name TYPE integer']
1347
- end
1348
- end
1349
-
1350
- describe "Database#set_column_default" do
1351
- before do
1352
- @db = Sequel.mock
1353
- end
1354
-
1355
- it "should construct proper SQL" do
1356
- @db.set_column_default :test, :name, 'zyx'
1357
- @db.sqls.must_equal ["ALTER TABLE test ALTER COLUMN name SET DEFAULT 'zyx'"]
1358
- end
1359
- end
1360
-
1361
- describe "Database#add_index" do
1362
- before do
1363
- @db = Sequel.mock
1364
- end
1365
-
1366
- it "should construct proper SQL" do
1367
- @db.add_index :test, :name, :unique => true
1368
- @db.sqls.must_equal ['CREATE UNIQUE INDEX test_name_index ON test (name)']
1369
- end
1370
-
1371
- it "should accept multiple columns" do
1372
- @db.add_index :test, [:one, :two]
1373
- @db.sqls.must_equal ['CREATE INDEX test_one_two_index ON test (one, two)']
1374
- end
1375
- end
1376
-
1377
- describe "Database#drop_index" do
1378
- before do
1379
- @db = Sequel.mock
1380
- end
1381
-
1382
- it "should construct proper SQL" do
1383
- @db.drop_index :test, :name
1384
- @db.sqls.must_equal ['DROP INDEX test_name_index']
1385
- end
1386
-
1387
- end
1388
-
1389
- describe "Database#drop_table" do
1390
- before do
1391
- @db = Sequel.mock
1392
- end
1393
-
1394
- it "should construct proper SQL" do
1395
- @db.drop_table :test
1396
- @db.sqls.must_equal ['DROP TABLE test']
1397
- end
1398
-
1399
- it "should accept multiple table names" do
1400
- @db.drop_table :a, :bb, :ccc
1401
- @db.sqls.must_equal ['DROP TABLE a', 'DROP TABLE bb', 'DROP TABLE ccc']
1402
- end
1403
- end
1404
-
1405
- describe "Database#rename_table" do
1406
- before do
1407
- @db = Sequel.mock
1408
- end
1409
-
1410
- it "should construct proper SQL" do
1411
- @db.rename_table :abc, :xyz
1412
- @db.sqls.must_equal ['ALTER TABLE abc RENAME TO xyz']
1413
- end
1414
- end
1415
-
1416
- describe "Database#create_view" do
1417
- before do
1418
- @db = Sequel.mock
1419
- end
1420
-
1421
- it "should construct proper SQL with raw SQL" do
1422
- @db.create_view :test, "SELECT * FROM xyz"
1423
- @db.sqls.must_equal ['CREATE VIEW test AS SELECT * FROM xyz']
1424
- @db.create_view Sequel.identifier(:test), "SELECT * FROM xyz"
1425
- @db.sqls.must_equal ['CREATE VIEW test AS SELECT * FROM xyz']
1426
- end
1427
-
1428
- it "should construct proper SQL with dataset" do
1429
- @db.create_view :test, @db[:items].select(:a, :b).order(:c)
1430
- @db.sqls.must_equal ['CREATE VIEW test AS SELECT a, b FROM items ORDER BY c']
1431
- end
1432
-
1433
- it "should handle :columns option" do
1434
- @db.create_view :test, @db[:items].select(:a, :b).order(:c), :columns=>[:d, :e]
1435
- @db.sqls.must_equal ['CREATE VIEW test (d, e) AS SELECT a, b FROM items ORDER BY c']
1436
- @db.create_view :test, @db[:items].select(:a, :b).order(:c), :columns=>%w'd e'
1437
- @db.sqls.must_equal ['CREATE VIEW test (d, e) AS SELECT a, b FROM items ORDER BY c']
1438
- @db.create_view :test, @db[:items].select(:a, :b).order(:c), :columns=>[Sequel.identifier('d'), Sequel.lit('e')]
1439
- @db.sqls.must_equal ['CREATE VIEW test (d, e) AS SELECT a, b FROM items ORDER BY c']
1440
- end
1441
-
1442
- it "should handle :check option" do
1443
- @db.create_view :test, @db[:items].select(:a, :b).order(:c), :check=>true
1444
- @db.sqls.must_equal ['CREATE VIEW test AS SELECT a, b FROM items ORDER BY c WITH CHECK OPTION']
1445
- @db.create_view :test, @db[:items].select(:a, :b).order(:c), :check=>:local
1446
- @db.sqls.must_equal ['CREATE VIEW test AS SELECT a, b FROM items ORDER BY c WITH LOCAL CHECK OPTION']
1447
- end
1448
-
1449
- it "should handle create_or_replace_view" do
1450
- @db.create_or_replace_view :sch__test, "SELECT * FROM xyz"
1451
- @db.sqls.must_equal ['DROP VIEW sch.test', 'CREATE VIEW sch.test AS SELECT * FROM xyz']
1452
- @db.create_or_replace_view :test, @db[:items].select(:a, :b).order(:c)
1453
- @db.sqls.must_equal ['DROP VIEW test', 'CREATE VIEW test AS SELECT a, b FROM items ORDER BY c']
1454
- @db.create_or_replace_view Sequel.identifier(:test), @db[:items].select(:a, :b).order(:c)
1455
- @db.sqls.must_equal ['DROP VIEW test', 'CREATE VIEW test AS SELECT a, b FROM items ORDER BY c']
1456
- end
1457
-
1458
- it "should use CREATE OR REPLACE VIEW if such syntax is supported" do
1459
- def @db.supports_create_or_replace_view?() true end
1460
- @db.create_or_replace_view :test, @db[:items]
1461
- @db.sqls.must_equal ['CREATE OR REPLACE VIEW test AS SELECT * FROM items']
1462
- end
1463
- end
1464
-
1465
- describe "Database#drop_view" do
1466
- before do
1467
- @db = Sequel.mock
1468
- end
1469
-
1470
- it "should construct proper SQL" do
1471
- @db.drop_view :test
1472
- @db.drop_view Sequel.identifier(:test)
1473
- @db.drop_view :sch__test
1474
- @db.drop_view Sequel.qualify(:sch, :test)
1475
- @db.sqls.must_equal ['DROP VIEW test', 'DROP VIEW test', 'DROP VIEW sch.test', 'DROP VIEW sch.test']
1476
- end
1477
-
1478
- it "should drop multiple views at once" do
1479
- @db.drop_view :cats, :dogs
1480
- @db.sqls.must_equal ['DROP VIEW cats', 'DROP VIEW dogs']
1481
- end
1482
-
1483
- it "should support the :cascade option" do
1484
- @db.drop_view :cats, :dogs, :cascade=>true
1485
- @db.sqls.must_equal ['DROP VIEW cats CASCADE', 'DROP VIEW dogs CASCADE']
1486
- end
1487
-
1488
- it "should support the :if_exists option" do
1489
- @db.drop_view :cats, :dogs, :if_exists=>true
1490
- @db.sqls.must_equal ['DROP VIEW IF EXISTS cats', 'DROP VIEW IF EXISTS dogs']
1491
- end
1492
- end
1493
-
1494
- describe "Database#alter_table_sql" do
1495
- it "should raise error for an invalid op" do
1496
- proc {Sequel.mock.send(:alter_table_sql, :mau, :op => :blah)}.must_raise(Sequel::Error)
1497
- end
1498
- end
1499
-
1500
- describe "Schema Parser" do
1501
- before do
1502
- @sqls = []
1503
- @db = Sequel::Database.new
1504
- end
1505
-
1506
- it "should raise an error if there are no columns" do
1507
- meta_def(@db, :schema_parse_table) do |t, opts|
1508
- []
1509
- end
1510
- proc{@db.schema(:x)}.must_raise(Sequel::Error)
1511
- end
1512
-
1513
- it "should cache data by default" do
1514
- meta_def(@db, :schema_parse_table) do |t, opts|
1515
- [[:a, {}]]
1516
- end
1517
- @db.schema(:x).must_be_same_as(@db.schema(:x))
1518
- end
1519
-
1520
- it "should not cache data if :reload=>true is given" do
1521
- meta_def(@db, :schema_parse_table) do |t, opts|
1522
- [[:a, {}]]
1523
- end
1524
- @db.schema(:x).wont_be_same_as(@db.schema(:x, :reload=>true))
1525
- end
1526
-
1527
- it "should not cache schema metadata if cache_schema is false" do
1528
- @db.cache_schema = false
1529
- meta_def(@db, :schema_parse_table) do |t, opts|
1530
- [[:a, {}]]
1531
- end
1532
- @db.schema(:x).wont_be_same_as(@db.schema(:x))
1533
- end
1534
-
1535
- it "should provide options if given a table name" do
1536
- c = nil
1537
- meta_def(@db, :schema_parse_table) do |t, opts|
1538
- c = [t, opts]
1539
- [[:a, {:db_type=>t.to_s}]]
1540
- end
1541
- @db.schema(:x)
1542
- c.must_equal ["x", {}]
1543
- @db.schema(:s__x)
1544
- c.must_equal ["x", {:schema=>"s"}]
1545
- ds = @db[:s__y]
1546
- @db.schema(ds)
1547
- c.must_equal ["y", {:schema=>"s", :dataset=>ds}]
1548
- end
1549
-
1550
- it "should parse the schema correctly for a single table" do
1551
- sqls = @sqls
1552
- proc{@db.schema(:x)}.must_raise(Sequel::Error)
1553
- meta_def(@db, :schema_parse_table) do |t, opts|
1554
- sqls << t
1555
- [[:a, {:db_type=>t.to_s}]]
1556
- end
1557
- @db.schema(:x).must_equal [[:a, {:db_type=>"x", :ruby_default=>nil}]]
1558
- @sqls.must_equal ['x']
1559
- @db.schema(:x).must_equal [[:a, {:db_type=>"x", :ruby_default=>nil}]]
1560
- @sqls.must_equal ['x']
1561
- @db.schema(:x, :reload=>true).must_equal [[:a, {:db_type=>"x", :ruby_default=>nil}]]
1562
- @sqls.must_equal ['x', 'x']
1563
- end
1564
-
1565
- it "should set :auto_increment to true by default if unset and a single integer primary key is used" do
1566
- meta_def(@db, :schema_parse_table){|*| [[:a, {:primary_key=>true, :db_type=>'integer'}]]}
1567
- @db.schema(:x).first.last[:auto_increment].must_equal true
1568
- end
1569
-
1570
- it "should not set :auto_increment if already set" do
1571
- meta_def(@db, :schema_parse_table){|*| [[:a, {:primary_key=>true, :db_type=>'integer', :auto_increment=>false}]]}
1572
- @db.schema(:x).first.last[:auto_increment].must_equal false
1573
- end
1574
-
1575
- it "should set :auto_increment to false by default if unset and a single nonintegery primary key is used" do
1576
- meta_def(@db, :schema_parse_table){|*| [[:a, {:primary_key=>true, :db_type=>'varchar'}]]}
1577
- @db.schema(:x).first.last[:auto_increment].must_equal false
1578
- end
1579
-
1580
- it "should set :auto_increment to false by default if unset and a composite primary key" do
1581
- meta_def(@db, :schema_parse_table){|*| [[:a, {:primary_key=>true, :db_type=>'integer'}], [:b, {:primary_key=>true, :db_type=>'integer'}]]}
1582
- @db.schema(:x).first.last[:auto_increment].must_equal false
1583
- @db.schema(:x).last.last[:auto_increment].must_equal false
1584
- end
1585
-
1586
- it "should set :auto_increment to true by default if set and not the first column" do
1587
- meta_def(@db, :schema_parse_table){|*| [[:b, {}], [:a, {:primary_key=>true, :db_type=>'integer'}]]}
1588
- @db.schema(:x).last.last[:auto_increment].must_equal true
1589
- end
1590
-
1591
- it "should convert various types of table name arguments" do
1592
- meta_def(@db, :schema_parse_table) do |t, opts|
1593
- [[t, opts]]
1594
- end
1595
- s1 = @db.schema(:x)
1596
- s1.must_equal [['x', {:ruby_default=>nil}]]
1597
- @db.schema(:x).object_id.must_equal s1.object_id
1598
- @db.schema(Sequel.identifier(:x)).object_id.must_equal s1.object_id
1599
-
1600
- s2 = @db.schema(:x__y)
1601
- s2.must_equal [['y', {:schema=>'x', :ruby_default=>nil}]]
1602
- @db.schema(:x__y).object_id.must_equal s2.object_id
1603
- @db.schema(Sequel.qualify(:x, :y)).object_id.must_equal s2.object_id
1604
-
1605
- s2 = @db.schema(Sequel.qualify(:v, :x__y))
1606
- s2.must_equal [['y', {:schema=>'x', :ruby_default=>nil, :information_schema_schema=>Sequel.identifier('v')}]]
1607
- @db.schema(Sequel.qualify(:v, :x__y)).object_id.must_equal s2.object_id
1608
- @db.schema(Sequel.qualify(:v__x, :y)).object_id.must_equal s2.object_id
1609
-
1610
- s2 = @db.schema(Sequel.qualify(:u__v, :x__y))
1611
- s2.must_equal [['y', {:schema=>'x', :ruby_default=>nil, :information_schema_schema=>Sequel.qualify('u', 'v')}]]
1612
- @db.schema(Sequel.qualify(:u__v, :x__y)).object_id.must_equal s2.object_id
1613
- @db.schema(Sequel.qualify(Sequel.qualify(:u, :v), Sequel.qualify(:x, :y))).object_id.must_equal s2.object_id
1614
- end
1615
-
1616
- it "should correctly parse all supported data types" do
1617
- sm = Module.new do
1618
- def schema_parse_table(t, opts)
1619
- [[:x, {:db_type=>t.to_s, :type=>schema_column_type(t.to_s)}]]
1620
- end
1621
- end
1622
- @db.extend(sm)
1623
- @db.schema(:tinyint).first.last[:type].must_equal :integer
1624
- @db.schema(:int).first.last[:type].must_equal :integer
1625
- @db.schema(:integer).first.last[:type].must_equal :integer
1626
- @db.schema(:bigint).first.last[:type].must_equal :integer
1627
- @db.schema(:smallint).first.last[:type].must_equal :integer
1628
- @db.schema(:character).first.last[:type].must_equal :string
1629
- @db.schema(:"character varying").first.last[:type].must_equal :string
1630
- @db.schema(:varchar).first.last[:type].must_equal :string
1631
- @db.schema(:"varchar(255)").first.last[:type].must_equal :string
1632
- @db.schema(:"varchar(255)").first.last[:max_length].must_equal 255
1633
- @db.schema(:text).first.last[:type].must_equal :string
1634
- @db.schema(:date).first.last[:type].must_equal :date
1635
- @db.schema(:datetime).first.last[:type].must_equal :datetime
1636
- @db.schema(:timestamp).first.last[:type].must_equal :datetime
1637
- @db.schema(:"timestamp with time zone").first.last[:type].must_equal :datetime
1638
- @db.schema(:"timestamp without time zone").first.last[:type].must_equal :datetime
1639
- @db.schema(:time).first.last[:type].must_equal :time
1640
- @db.schema(:"time with time zone").first.last[:type].must_equal :time
1641
- @db.schema(:"time without time zone").first.last[:type].must_equal :time
1642
- @db.schema(:boolean).first.last[:type].must_equal :boolean
1643
- @db.schema(:real).first.last[:type].must_equal :float
1644
- @db.schema(:float).first.last[:type].must_equal :float
1645
- @db.schema(:double).first.last[:type].must_equal :float
1646
- @db.schema(:"double(1,2)").first.last[:type].must_equal :float
1647
- @db.schema(:"double precision").first.last[:type].must_equal :float
1648
- @db.schema(:number).first.last[:type].must_equal :decimal
1649
- @db.schema(:numeric).first.last[:type].must_equal :decimal
1650
- @db.schema(:decimal).first.last[:type].must_equal :decimal
1651
- @db.schema(:"number(10,0)").first.last[:type].must_equal :integer
1652
- @db.schema(:"numeric(10, 10)").first.last[:type].must_equal :decimal
1653
- @db.schema(:"decimal(10,1)").first.last[:type].must_equal :decimal
1654
- @db.schema(:bytea).first.last[:type].must_equal :blob
1655
- @db.schema(:blob).first.last[:type].must_equal :blob
1656
- @db.schema(:image).first.last[:type].must_equal :blob
1657
- @db.schema(:nchar).first.last[:type].must_equal :string
1658
- @db.schema(:nvarchar).first.last[:type].must_equal :string
1659
- @db.schema(:ntext).first.last[:type].must_equal :string
1660
- @db.schema(:smalldatetime).first.last[:type].must_equal :datetime
1661
- @db.schema(:binary).first.last[:type].must_equal :blob
1662
- @db.schema(:varbinary).first.last[:type].must_equal :blob
1663
- @db.schema(:enum).first.last[:type].must_equal :enum
1664
-
1665
- @db = Sequel.mock(:host=>'postgres')
1666
- @db.extend(sm)
1667
- @db.schema(:interval).first.last[:type].must_equal :interval
1668
- @db.schema(:citext).first.last[:type].must_equal :string
1669
-
1670
- @db = Sequel.mock(:host=>'mysql')
1671
- @db.extend(sm)
1672
- @db.schema(:set).first.last[:type].must_equal :set
1673
- @db.schema(:mediumint).first.last[:type].must_equal :integer
1674
- @db.schema(:mediumtext).first.last[:type].must_equal :string
1675
- end
1676
- end