sequel 4.26.0 → 5.37.0

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