sequel 5.29.0 → 5.30.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 (323) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +8 -1922
  3. data/doc/release_notes/5.30.0.txt +20 -0
  4. data/lib/sequel/adapters/shared/sqlite.rb +7 -1
  5. data/lib/sequel/database/transactions.rb +5 -9
  6. data/lib/sequel/version.rb +1 -1
  7. metadata +4 -368
  8. data/Rakefile +0 -151
  9. data/doc/release_notes/4.0.0.txt +0 -262
  10. data/doc/release_notes/4.1.0.txt +0 -85
  11. data/doc/release_notes/4.10.0.txt +0 -226
  12. data/doc/release_notes/4.11.0.txt +0 -147
  13. data/doc/release_notes/4.12.0.txt +0 -105
  14. data/doc/release_notes/4.13.0.txt +0 -169
  15. data/doc/release_notes/4.14.0.txt +0 -68
  16. data/doc/release_notes/4.15.0.txt +0 -56
  17. data/doc/release_notes/4.16.0.txt +0 -36
  18. data/doc/release_notes/4.17.0.txt +0 -38
  19. data/doc/release_notes/4.18.0.txt +0 -36
  20. data/doc/release_notes/4.19.0.txt +0 -45
  21. data/doc/release_notes/4.2.0.txt +0 -129
  22. data/doc/release_notes/4.20.0.txt +0 -79
  23. data/doc/release_notes/4.21.0.txt +0 -94
  24. data/doc/release_notes/4.22.0.txt +0 -72
  25. data/doc/release_notes/4.23.0.txt +0 -65
  26. data/doc/release_notes/4.24.0.txt +0 -99
  27. data/doc/release_notes/4.25.0.txt +0 -181
  28. data/doc/release_notes/4.26.0.txt +0 -44
  29. data/doc/release_notes/4.27.0.txt +0 -78
  30. data/doc/release_notes/4.28.0.txt +0 -57
  31. data/doc/release_notes/4.29.0.txt +0 -41
  32. data/doc/release_notes/4.3.0.txt +0 -40
  33. data/doc/release_notes/4.30.0.txt +0 -37
  34. data/doc/release_notes/4.31.0.txt +0 -57
  35. data/doc/release_notes/4.32.0.txt +0 -132
  36. data/doc/release_notes/4.33.0.txt +0 -88
  37. data/doc/release_notes/4.34.0.txt +0 -86
  38. data/doc/release_notes/4.35.0.txt +0 -130
  39. data/doc/release_notes/4.36.0.txt +0 -116
  40. data/doc/release_notes/4.37.0.txt +0 -50
  41. data/doc/release_notes/4.38.0.txt +0 -67
  42. data/doc/release_notes/4.39.0.txt +0 -127
  43. data/doc/release_notes/4.4.0.txt +0 -92
  44. data/doc/release_notes/4.40.0.txt +0 -179
  45. data/doc/release_notes/4.41.0.txt +0 -77
  46. data/doc/release_notes/4.42.0.txt +0 -221
  47. data/doc/release_notes/4.43.0.txt +0 -87
  48. data/doc/release_notes/4.44.0.txt +0 -125
  49. data/doc/release_notes/4.45.0.txt +0 -370
  50. data/doc/release_notes/4.46.0.txt +0 -404
  51. data/doc/release_notes/4.47.0.txt +0 -56
  52. data/doc/release_notes/4.48.0.txt +0 -293
  53. data/doc/release_notes/4.49.0.txt +0 -222
  54. data/doc/release_notes/4.5.0.txt +0 -34
  55. data/doc/release_notes/4.6.0.txt +0 -30
  56. data/doc/release_notes/4.7.0.txt +0 -103
  57. data/doc/release_notes/4.8.0.txt +0 -175
  58. data/doc/release_notes/4.9.0.txt +0 -190
  59. data/spec/adapter_spec.rb +0 -4
  60. data/spec/adapters/db2_spec.rb +0 -170
  61. data/spec/adapters/mssql_spec.rb +0 -828
  62. data/spec/adapters/mysql_spec.rb +0 -1060
  63. data/spec/adapters/oracle_spec.rb +0 -371
  64. data/spec/adapters/postgres_spec.rb +0 -4476
  65. data/spec/adapters/spec_helper.rb +0 -44
  66. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  67. data/spec/adapters/sqlite_spec.rb +0 -652
  68. data/spec/bin_spec.rb +0 -278
  69. data/spec/core/connection_pool_spec.rb +0 -1250
  70. data/spec/core/database_spec.rb +0 -2915
  71. data/spec/core/dataset_spec.rb +0 -5544
  72. data/spec/core/deprecated_spec.rb +0 -70
  73. data/spec/core/expression_filters_spec.rb +0 -1498
  74. data/spec/core/mock_adapter_spec.rb +0 -722
  75. data/spec/core/object_graph_spec.rb +0 -336
  76. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  77. data/spec/core/schema_generator_spec.rb +0 -214
  78. data/spec/core/schema_spec.rb +0 -1844
  79. data/spec/core/spec_helper.rb +0 -24
  80. data/spec/core/version_spec.rb +0 -14
  81. data/spec/core_extensions_spec.rb +0 -763
  82. data/spec/core_model_spec.rb +0 -2
  83. data/spec/core_spec.rb +0 -1
  84. data/spec/deprecation_helper.rb +0 -30
  85. data/spec/extensions/accessed_columns_spec.rb +0 -51
  86. data/spec/extensions/active_model_spec.rb +0 -99
  87. data/spec/extensions/after_initialize_spec.rb +0 -28
  88. data/spec/extensions/any_not_empty_spec.rb +0 -23
  89. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  90. data/spec/extensions/association_dependencies_spec.rb +0 -125
  91. data/spec/extensions/association_multi_add_remove_spec.rb +0 -1041
  92. data/spec/extensions/association_pks_spec.rb +0 -423
  93. data/spec/extensions/association_proxies_spec.rb +0 -100
  94. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  95. data/spec/extensions/auto_validations_spec.rb +0 -229
  96. data/spec/extensions/blacklist_security_spec.rb +0 -95
  97. data/spec/extensions/blank_spec.rb +0 -69
  98. data/spec/extensions/boolean_readers_spec.rb +0 -93
  99. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  100. data/spec/extensions/caching_spec.rb +0 -273
  101. data/spec/extensions/caller_logging_spec.rb +0 -52
  102. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  103. data/spec/extensions/column_conflicts_spec.rb +0 -75
  104. data/spec/extensions/column_select_spec.rb +0 -129
  105. data/spec/extensions/columns_introspection_spec.rb +0 -90
  106. data/spec/extensions/columns_updated_spec.rb +0 -35
  107. data/spec/extensions/composition_spec.rb +0 -248
  108. data/spec/extensions/connection_expiration_spec.rb +0 -151
  109. data/spec/extensions/connection_validator_spec.rb +0 -144
  110. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  111. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  112. data/spec/extensions/constraint_validations_spec.rb +0 -439
  113. data/spec/extensions/core_refinements_spec.rb +0 -528
  114. data/spec/extensions/csv_serializer_spec.rb +0 -183
  115. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  116. data/spec/extensions/dataset_associations_spec.rb +0 -365
  117. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  118. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  119. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  120. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  121. data/spec/extensions/defaults_setter_spec.rb +0 -150
  122. data/spec/extensions/delay_add_association_spec.rb +0 -73
  123. data/spec/extensions/dirty_spec.rb +0 -222
  124. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  125. data/spec/extensions/eager_each_spec.rb +0 -62
  126. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  127. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  128. data/spec/extensions/empty_failure_backtraces_spec.rb +0 -60
  129. data/spec/extensions/error_splitter_spec.rb +0 -18
  130. data/spec/extensions/error_sql_spec.rb +0 -20
  131. data/spec/extensions/escaped_like_spec.rb +0 -40
  132. data/spec/extensions/eval_inspect_spec.rb +0 -81
  133. data/spec/extensions/exclude_or_null_spec.rb +0 -15
  134. data/spec/extensions/finder_spec.rb +0 -260
  135. data/spec/extensions/force_encoding_spec.rb +0 -126
  136. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  137. data/spec/extensions/graph_each_spec.rb +0 -113
  138. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  139. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  140. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  141. data/spec/extensions/index_caching_spec.rb +0 -66
  142. data/spec/extensions/inflector_spec.rb +0 -183
  143. data/spec/extensions/input_transformer_spec.rb +0 -69
  144. data/spec/extensions/insert_conflict_spec.rb +0 -103
  145. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  146. data/spec/extensions/instance_filters_spec.rb +0 -79
  147. data/spec/extensions/instance_hooks_spec.rb +0 -246
  148. data/spec/extensions/integer64_spec.rb +0 -22
  149. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  150. data/spec/extensions/json_serializer_spec.rb +0 -346
  151. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  152. data/spec/extensions/list_spec.rb +0 -291
  153. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  154. data/spec/extensions/many_through_many_spec.rb +0 -2177
  155. data/spec/extensions/migration_spec.rb +0 -864
  156. data/spec/extensions/modification_detection_spec.rb +0 -93
  157. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  158. data/spec/extensions/named_timezones_spec.rb +0 -218
  159. data/spec/extensions/nested_attributes_spec.rb +0 -815
  160. data/spec/extensions/null_dataset_spec.rb +0 -85
  161. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  162. data/spec/extensions/pagination_spec.rb +0 -116
  163. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  164. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  165. data/spec/extensions/pg_array_spec.rb +0 -398
  166. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -209
  167. data/spec/extensions/pg_enum_spec.rb +0 -118
  168. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  169. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  170. data/spec/extensions/pg_hstore_spec.rb +0 -219
  171. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  172. data/spec/extensions/pg_inet_spec.rb +0 -72
  173. data/spec/extensions/pg_interval_spec.rb +0 -103
  174. data/spec/extensions/pg_json_ops_spec.rb +0 -356
  175. data/spec/extensions/pg_json_spec.rb +0 -451
  176. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  177. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  178. data/spec/extensions/pg_range_spec.rb +0 -600
  179. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  180. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  181. data/spec/extensions/pg_row_spec.rb +0 -363
  182. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  183. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  184. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  185. data/spec/extensions/prepared_statements_spec.rb +0 -177
  186. data/spec/extensions/pretty_table_spec.rb +0 -123
  187. data/spec/extensions/query_spec.rb +0 -94
  188. data/spec/extensions/rcte_tree_spec.rb +0 -387
  189. data/spec/extensions/round_timestamps_spec.rb +0 -39
  190. data/spec/extensions/s_spec.rb +0 -60
  191. data/spec/extensions/schema_caching_spec.rb +0 -64
  192. data/spec/extensions/schema_dumper_spec.rb +0 -870
  193. data/spec/extensions/select_remove_spec.rb +0 -38
  194. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  195. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  196. data/spec/extensions/serialization_spec.rb +0 -365
  197. data/spec/extensions/server_block_spec.rb +0 -135
  198. data/spec/extensions/server_logging_spec.rb +0 -45
  199. data/spec/extensions/sharding_spec.rb +0 -197
  200. data/spec/extensions/shared_caching_spec.rb +0 -151
  201. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  202. data/spec/extensions/singular_table_names_spec.rb +0 -22
  203. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  204. data/spec/extensions/spec_helper.rb +0 -70
  205. data/spec/extensions/split_array_nil_spec.rb +0 -24
  206. data/spec/extensions/split_values_spec.rb +0 -57
  207. data/spec/extensions/sql_comments_spec.rb +0 -33
  208. data/spec/extensions/sql_expr_spec.rb +0 -59
  209. data/spec/extensions/static_cache_cache_spec.rb +0 -35
  210. data/spec/extensions/static_cache_spec.rb +0 -471
  211. data/spec/extensions/string_agg_spec.rb +0 -90
  212. data/spec/extensions/string_date_time_spec.rb +0 -95
  213. data/spec/extensions/string_stripper_spec.rb +0 -68
  214. data/spec/extensions/subclasses_spec.rb +0 -79
  215. data/spec/extensions/subset_conditions_spec.rb +0 -38
  216. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  217. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  218. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  219. data/spec/extensions/table_select_spec.rb +0 -83
  220. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  221. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  222. data/spec/extensions/throw_failures_spec.rb +0 -74
  223. data/spec/extensions/timestamps_spec.rb +0 -209
  224. data/spec/extensions/to_dot_spec.rb +0 -153
  225. data/spec/extensions/touch_spec.rb +0 -226
  226. data/spec/extensions/tree_spec.rb +0 -334
  227. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  228. data/spec/extensions/unlimited_update_spec.rb +0 -21
  229. data/spec/extensions/update_or_create_spec.rb +0 -83
  230. data/spec/extensions/update_primary_key_spec.rb +0 -105
  231. data/spec/extensions/update_refresh_spec.rb +0 -59
  232. data/spec/extensions/uuid_spec.rb +0 -101
  233. data/spec/extensions/validate_associated_spec.rb +0 -52
  234. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  235. data/spec/extensions/validation_contexts_spec.rb +0 -31
  236. data/spec/extensions/validation_helpers_spec.rb +0 -525
  237. data/spec/extensions/whitelist_security_spec.rb +0 -157
  238. data/spec/extensions/xml_serializer_spec.rb +0 -213
  239. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  240. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  241. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  242. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  243. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  244. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  245. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  246. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  247. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  248. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  249. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  250. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  251. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  252. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  253. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  254. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  255. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  256. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  257. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  258. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  259. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  260. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  261. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  262. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  263. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  264. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  265. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  266. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  267. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  268. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  269. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  270. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  271. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  272. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  273. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  274. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  275. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  276. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  277. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  278. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  279. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  280. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  281. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  282. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  283. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  284. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  285. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  286. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  287. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  288. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  289. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  290. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  291. data/spec/guards_helper.rb +0 -59
  292. data/spec/integration/associations_test.rb +0 -2597
  293. data/spec/integration/database_test.rb +0 -113
  294. data/spec/integration/dataset_test.rb +0 -2037
  295. data/spec/integration/eager_loader_test.rb +0 -687
  296. data/spec/integration/migrator_test.rb +0 -262
  297. data/spec/integration/model_test.rb +0 -203
  298. data/spec/integration/plugin_test.rb +0 -2423
  299. data/spec/integration/prepared_statement_test.rb +0 -405
  300. data/spec/integration/schema_test.rb +0 -903
  301. data/spec/integration/spec_helper.rb +0 -71
  302. data/spec/integration/timezone_test.rb +0 -86
  303. data/spec/integration/transaction_test.rb +0 -603
  304. data/spec/integration/type_test.rb +0 -127
  305. data/spec/model/association_reflection_spec.rb +0 -803
  306. data/spec/model/associations_spec.rb +0 -4738
  307. data/spec/model/base_spec.rb +0 -875
  308. data/spec/model/class_dataset_methods_spec.rb +0 -146
  309. data/spec/model/dataset_methods_spec.rb +0 -198
  310. data/spec/model/eager_loading_spec.rb +0 -2377
  311. data/spec/model/hooks_spec.rb +0 -370
  312. data/spec/model/inflector_spec.rb +0 -26
  313. data/spec/model/model_spec.rb +0 -956
  314. data/spec/model/plugins_spec.rb +0 -429
  315. data/spec/model/record_spec.rb +0 -2118
  316. data/spec/model/spec_helper.rb +0 -46
  317. data/spec/model/validations_spec.rb +0 -220
  318. data/spec/model_no_assoc_spec.rb +0 -1
  319. data/spec/model_spec.rb +0 -1
  320. data/spec/plugin_spec.rb +0 -1
  321. data/spec/sequel_coverage.rb +0 -15
  322. data/spec/sequel_warning.rb +0 -5
  323. data/spec/spec_config.rb +0 -12
@@ -1,214 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe Sequel::Schema::CreateTableGenerator do
4
- before do
5
- @generator = Sequel::Schema::CreateTableGenerator.new(Sequel.mock) do
6
- string(:title).must_be_nil
7
- column(:body, :text).must_be_nil
8
- foreign_key(:parent_id).must_be_nil
9
- primary_key(:id).must_be_nil
10
- check('price > 100').must_be_nil
11
- constraint(:xxx){{:yyy => :zzz}}.must_be_nil
12
- index(:title).must_be_nil
13
- index([:title, :body], :unique => true).must_be_nil
14
- foreign_key(:node_id, :nodes).must_be_nil
15
- foreign_key(:deferrable_node_id, :nodes, :deferrable => true).must_be_nil
16
- primary_key([:title, :parent_id], :name => :cpk).must_be_nil
17
- foreign_key([:node_id, :prop_id], :nodes_props, :name => :cfk).must_be_nil
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
25
-
26
- it "should respond adding types" do
27
- c = Class.new(Sequel::Schema::CreateTableGenerator)
28
- c2 = Class.new
29
- def c2.to_s; 'Foo' end
30
- c.add_type_method(c2)
31
- gen = c.new(Sequel.mock) do
32
- Foo :bar
33
- end
34
-
35
- gen.columns.first.values_at(:name, :type).must_equal [:bar, c2]
36
- end
37
-
38
- it "should primary key column first" do
39
- @columns.first[:name].must_equal :id
40
- @columns.first[:primary_key].must_equal true
41
- @columns[3][:name].must_equal :parent_id
42
- @columns[3][:primary_key].must_be_nil
43
- end
44
-
45
- it "should respect existing column order if primary_key :keep_order is used" do
46
- generator = Sequel::Schema::CreateTableGenerator.new(Sequel.mock) do
47
- string :title
48
- primary_key :id, :keep_order=>true
49
- end
50
-
51
- columns = generator.columns
52
- columns.last[:name].must_equal :id
53
- columns.last[:primary_key].must_equal true
54
- columns.first[:name].must_equal :title
55
- columns.first[:primary_key].must_be_nil
56
- end
57
-
58
- it "should handle SQL::Identifier and SQL::QualifiedIdentifier as foreign_key arguments" do
59
- generator = Sequel::Schema::CreateTableGenerator.new(Sequel.mock) do
60
- foreign_key :a_id, Sequel.identifier(:as)
61
- foreign_key :b_id, Sequel.qualify(:c, :b)
62
- end
63
-
64
- columns = generator.columns
65
- columns.first.values_at(:name, :table).must_equal [:a_id, Sequel.identifier(:as)]
66
- columns.last.values_at(:name, :table).must_equal [:b_id, Sequel.qualify(:c, :b)]
67
- end
68
-
69
- it "counts definitions correctly" do
70
- @columns.size.must_equal 6
71
- @indexes.size.must_equal 2
72
- @constraints.size.must_equal 4
73
- end
74
-
75
- it "retrieves primary key name" do
76
- @generator.primary_key_name.must_equal :id
77
- end
78
-
79
- it "keeps columns in order" do
80
- @columns[1][:name].must_equal :title
81
- @columns[1][:type].must_equal :string
82
- @columns[2][:name].must_equal :body
83
- @columns[2][:type].must_equal :text
84
- end
85
-
86
- it "creates foreign key column" do
87
- @columns[3][:name].must_equal :parent_id
88
- @columns[3][:type].must_equal Integer
89
- @columns[4][:name].must_equal :node_id
90
- @columns[4][:type].must_equal Integer
91
- end
92
-
93
- it "creates deferrable altered foreign key column" do
94
- @columns[5][:name].must_equal :deferrable_node_id
95
- @columns[5][:type].must_equal Integer
96
- @columns[5][:deferrable].must_equal true
97
- end
98
-
99
- it "uses table for foreign key columns, if specified" do
100
- @columns[3][:table].must_be_nil
101
- @columns[4][:table].must_equal :nodes
102
- @constraints[3][:table].must_equal :nodes_props
103
- end
104
-
105
- it "finds columns" do
106
- [:title, :body, :parent_id, :id].each do |col|
107
- @generator.has_column?(col).must_equal true
108
- end
109
- @generator.has_column?(:foo).wont_equal true
110
- end
111
-
112
- it "creates constraints" do
113
- @constraints[0][:name].must_be_nil
114
- @constraints[0][:type].must_equal :check
115
- @constraints[0][:check].must_equal ['price > 100']
116
-
117
- @constraints[1][:name].must_equal :xxx
118
- @constraints[1][:type].must_equal :check
119
- @constraints[1][:check].must_be_kind_of Proc
120
-
121
- @constraints[2][:name].must_equal :cpk
122
- @constraints[2][:type].must_equal :primary_key
123
- @constraints[2][:columns].must_equal [ :title, :parent_id ]
124
-
125
- @constraints[3][:name].must_equal :cfk
126
- @constraints[3][:type].must_equal :foreign_key
127
- @constraints[3][:columns].must_equal [ :node_id, :prop_id ]
128
- @constraints[3][:table].must_equal :nodes_props
129
- end
130
-
131
- it "creates indexes" do
132
- @indexes[0][:columns].must_equal [:title]
133
- @indexes[1][:columns].must_equal [:title, :body]
134
- end
135
- end
136
-
137
- describe Sequel::Schema::AlterTableGenerator do
138
- before do
139
- @generator = Sequel::Schema::AlterTableGenerator.new(Sequel.mock) do
140
- add_column(:aaa, :text).must_be_nil
141
- drop_column(:bbb).must_be_nil
142
- rename_column(:ccc, :ho).must_be_nil
143
- set_column_type(:ddd, :float).must_be_nil
144
- set_column_default(:eee, 1).must_be_nil
145
- add_index([:fff, :ggg]).must_be_nil
146
- drop_index(:hhh).must_be_nil
147
- drop_index(:hhh, :name=>:blah_blah).must_be_nil
148
- add_full_text_index(:blah).must_be_nil
149
- add_spatial_index(:geom).must_be_nil
150
- add_index(:blah, :type => :hash).must_be_nil
151
- add_index(:blah, :where => {:something => true}).must_be_nil
152
- add_constraint(:con1, 'fred > 100').must_be_nil
153
- drop_constraint(:con2).must_be_nil
154
- add_unique_constraint([:aaa, :bbb, :ccc], :name => :con3).must_be_nil
155
- add_primary_key(:id).must_be_nil
156
- add_foreign_key(:node_id, :nodes).must_be_nil
157
- add_primary_key([:aaa, :bbb]).must_be_nil
158
- add_foreign_key([:node_id, :prop_id], :nodes_props).must_be_nil
159
- add_foreign_key([:node_id, :prop_id], :nodes_props, :name => :fkey).must_be_nil
160
- drop_foreign_key(:node_id).must_be_nil
161
- drop_foreign_key([:node_id, :prop_id]).must_be_nil
162
- drop_foreign_key([:node_id, :prop_id], :name => :fkey).must_be_nil
163
- end
164
- end
165
-
166
- it "should generate operation records" do
167
- @generator.operations.must_equal [
168
- {:op => :add_column, :name => :aaa, :type => :text},
169
- {:op => :drop_column, :name => :bbb},
170
- {:op => :rename_column, :name => :ccc, :new_name => :ho},
171
- {:op => :set_column_type, :name => :ddd, :type => :float},
172
- {:op => :set_column_default, :name => :eee, :default => 1},
173
- {:op => :add_index, :columns => [:fff, :ggg]},
174
- {:op => :drop_index, :columns => [:hhh]},
175
- {:op => :drop_index, :columns => [:hhh], :name=>:blah_blah},
176
- {:op => :add_index, :columns => [:blah], :type => :full_text},
177
- {:op => :add_index, :columns => [:geom], :type => :spatial},
178
- {:op => :add_index, :columns => [:blah], :type => :hash},
179
- {:op => :add_index, :columns => [:blah], :where => {:something => true}},
180
- {:op => :add_constraint, :type => :check, :name => :con1, :check => ['fred > 100']},
181
- {:op => :drop_constraint, :name => :con2},
182
- {:op => :add_constraint, :type => :unique, :name => :con3, :columns => [:aaa, :bbb, :ccc]},
183
- {:op => :add_column, :name => :id, :type => Integer, :primary_key=>true, :auto_increment=>true},
184
- {:op => :add_column, :name => :node_id, :type => Integer, :table=>:nodes},
185
- {:op => :add_constraint, :type => :primary_key, :columns => [:aaa, :bbb]},
186
- {:op => :add_constraint, :type => :foreign_key, :columns => [:node_id, :prop_id], :table => :nodes_props},
187
- {:op => :add_constraint, :type => :foreign_key, :columns => [:node_id, :prop_id], :table => :nodes_props, :name => :fkey},
188
- {:op => :drop_constraint, :type => :foreign_key, :columns => [:node_id]},
189
- {:op => :drop_column, :name => :node_id},
190
- {:op => :drop_constraint, :type => :foreign_key, :columns => [:node_id, :prop_id]},
191
- {:op => :drop_constraint, :type => :foreign_key, :columns => [:node_id, :prop_id], :name => :fkey},
192
- ]
193
- end
194
- end
195
-
196
- describe "Sequel::Schema::CreateTableGenerator generic type methods" do
197
- it "should store the type class in :type for each column" do
198
- Sequel::Schema::CreateTableGenerator.new(Sequel.mock) do
199
- String :a
200
- Integer :b
201
- Fixnum :c
202
- Bignum :d
203
- Float :e
204
- BigDecimal :f
205
- Date :g
206
- DateTime :h
207
- Time :i
208
- Numeric :j
209
- File :k
210
- TrueClass :l
211
- FalseClass :m
212
- end.columns.map{|c| c[:type]}.must_equal [String, Integer, Integer, :Bignum, Float, BigDecimal, Date, DateTime, Time, Numeric, File, TrueClass, FalseClass]
213
- end
214
- end
@@ -1,1844 +0,0 @@
1
- require_relative "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){}.must_be_nil
10
- @db.sqls.must_equal ['CREATE TABLE cats ()']
11
- end
12
-
13
- with_symbol_splitting "should accept the table name with splittable symbols" do
14
- @db.create_table(:cats__cats) {}
15
- @db.sqls.must_equal ['CREATE TABLE cats.cats ()']
16
- end
17
-
18
- it "should accept the table name in multiple formats" do
19
- @db.create_table(Sequel[:cats][:cats]) {}
20
- @db.create_table("cats__cats1") {}
21
- @db.create_table(Sequel.identifier(:cats__cats2)) {}
22
- @db.create_table(Sequel.qualify(:cats3, :cats)) {}
23
- @db.sqls.must_equal ['CREATE TABLE cats.cats ()', 'CREATE TABLE cats__cats1 ()', 'CREATE TABLE cats__cats2 ()', 'CREATE TABLE cats3.cats ()']
24
- end
25
-
26
- it "should raise an error if the table name argument is not valid" do
27
- proc{@db.create_table(1) {}}.must_raise(Sequel::Error)
28
- proc{@db.create_table(Sequel.as(:cats, :c)) {}}.must_raise(Sequel::Error)
29
- end
30
-
31
- it "should remove cached schema entry" do
32
- @db.instance_variable_set(:@schemas, {'cats'=>[]})
33
- @db.create_table(:cats){Integer :a}
34
- @db.instance_variable_get(:@schemas).must_be :empty?
35
- end
36
-
37
- it "should accept multiple columns" do
38
- @db.create_table(:cats) do
39
- column :id, :integer
40
- column :name, :text
41
- end
42
- @db.sqls.must_equal ['CREATE TABLE cats (id integer, name text)']
43
- end
44
-
45
- it "should accept method calls as data types" do
46
- @db.create_table(:cats) do
47
- integer :id
48
- text :name
49
- end
50
- @db.sqls.must_equal ['CREATE TABLE cats (id integer, name text)']
51
- end
52
-
53
- it "should transform types given as ruby classes to database-specific types" do
54
- @db.create_table(:cats) do
55
- String :a
56
- Integer :b
57
- Fixnum :c
58
- Bignum :d
59
- Float :e
60
- BigDecimal :f
61
- Date :g
62
- DateTime :h
63
- Time :i
64
- Numeric :j
65
- File :k
66
- TrueClass :l
67
- FalseClass :m
68
- column :n, Integer
69
- primary_key :o, :type=>String
70
- foreign_key :p, :f, :type=>Date
71
- end
72
- @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)']
73
- end
74
-
75
- it "should transform types given as ruby classes to database-specific types" do
76
- @db.default_string_column_size = 50
77
- @db.create_table(:cats) do
78
- String :a
79
- String :a2, :size=>13
80
- String :a3, :fixed=>true
81
- String :a4, :size=>13, :fixed=>true
82
- String :a5, :text=>true
83
- varchar :a6
84
- varchar :a7, :size=>13
85
- end
86
- @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))']
87
- end
88
-
89
- it "should allow the use of modifiers with ruby class types" do
90
- @db.create_table(:cats) do
91
- String :a, :size=>50
92
- String :b, :text=>true
93
- String :c, :fixed=>true, :size=>40
94
- Time :d, :only_time=>true
95
- BigDecimal :e, :size=>[11,2]
96
- end
97
- @db.sqls.must_equal ['CREATE TABLE cats (a varchar(50), b text, c char(40), d time, e numeric(11, 2))']
98
- end
99
-
100
- it "should allow the use of modifiers with ruby class types" do
101
- c = Class.new
102
- def c.name; 'Fixnum'; end
103
- @db.create_table(:cats) do
104
- column :a, c
105
- end
106
- @db.sqls.must_equal ['CREATE TABLE cats (a integer)']
107
- end
108
-
109
- it "should raise an error if you use a ruby class that isn't handled" do
110
- proc{@db.create_table(:cats){column :a, Class}}.must_raise(Sequel::Error)
111
- end
112
-
113
- it "should accept primary key definition" do
114
- @db.create_table(:cats) do
115
- primary_key :id
116
- end
117
- @db.sqls.must_equal ['CREATE TABLE cats (id integer PRIMARY KEY AUTOINCREMENT)']
118
-
119
- @db.create_table(:cats) do
120
- primary_key :id, :serial, :auto_increment => false
121
- end
122
- @db.sqls.must_equal ['CREATE TABLE cats (id serial PRIMARY KEY)']
123
-
124
- @db.create_table(:cats) do
125
- primary_key :id, :type => :serial, :auto_increment => false
126
- end
127
- @db.sqls.must_equal ['CREATE TABLE cats (id serial PRIMARY KEY)']
128
-
129
- @db.create_table(:cats) do
130
- Integer :a
131
- primary_key :id
132
- end
133
- @db.sqls.must_equal ['CREATE TABLE cats (id integer PRIMARY KEY AUTOINCREMENT, a integer)']
134
-
135
- @db.create_table(:cats) do
136
- Integer :a
137
- primary_key :id, :keep_order=>true
138
- end
139
- @db.sqls.must_equal ['CREATE TABLE cats (a integer, id integer PRIMARY KEY AUTOINCREMENT)']
140
- end
141
-
142
- it "should allow naming primary key constraint with :primary_key_constraint_name option" do
143
- @db.create_table(:cats) do
144
- primary_key :id, :primary_key_constraint_name=>:foo
145
- end
146
- @db.sqls.must_equal ['CREATE TABLE cats (id integer CONSTRAINT foo PRIMARY KEY AUTOINCREMENT)']
147
- end
148
-
149
- it "should automatically set primary key column NOT NULL if database doesn't do it automatically" do
150
- def @db.can_add_primary_key_constraint_on_nullable_columns?; false end
151
- @db.create_table(:cats) do
152
- primary_key :id
153
- end
154
- @db.sqls.must_equal ['CREATE TABLE cats (id integer NOT NULL PRIMARY KEY AUTOINCREMENT)']
155
- end
156
-
157
- it "should automatically set primary key column NOT NULL when adding constraint if database doesn't do it automatically" do
158
- def @db.can_add_primary_key_constraint_on_nullable_columns?; false end
159
- @db.create_table(:cats) do
160
- String :id
161
- primary_key [:id]
162
- end
163
- @db.sqls.must_equal ['CREATE TABLE cats (id varchar(255) NOT NULL, PRIMARY KEY (id))']
164
- end
165
-
166
- it "should handling splitting named column constraints into table constraints if unsupported" do
167
- def @db.supports_named_column_constraints?; false end
168
- @db.create_table(:cats) do
169
- primary_key :id, :primary_key_constraint_name=>:foo
170
- 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
171
- end
172
- @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))']
173
- end
174
-
175
- it "should accept and literalize default values" do
176
- @db.create_table(:cats) do
177
- integer :id, :default => 123
178
- text :name, :default => "abc'def"
179
- end
180
- @db.sqls.must_equal ["CREATE TABLE cats (id integer DEFAULT 123, name text DEFAULT 'abc''def')"]
181
- end
182
-
183
- it "should accept not null definition" do
184
- @db.create_table(:cats) do
185
- integer :id
186
- text :name, :null => false
187
- text :name2, :allow_null => false
188
- end
189
- @db.sqls.must_equal ["CREATE TABLE cats (id integer, name text NOT NULL, name2 text NOT NULL)"]
190
- end
191
-
192
- it "should accept null definition" do
193
- @db.create_table(:cats) do
194
- integer :id
195
- text :name, :null => true
196
- text :name2, :allow_null => true
197
- end
198
- @db.sqls.must_equal ["CREATE TABLE cats (id integer, name text NULL, name2 text NULL)"]
199
- end
200
-
201
- it "should accept unique definition" do
202
- @db.create_table(:cats) do
203
- integer :id
204
- text :name, :unique => true
205
- end
206
- @db.sqls.must_equal ["CREATE TABLE cats (id integer, name text UNIQUE)"]
207
- end
208
-
209
- it "should allow naming unique constraint with :unique_constraint_name option" do
210
- @db.create_table(:cats) do
211
- text :name, :unique => true, :unique_constraint_name=>:foo
212
- end
213
- @db.sqls.must_equal ["CREATE TABLE cats (name text CONSTRAINT foo UNIQUE)"]
214
- end
215
-
216
- it "should handle not deferred unique constraints" do
217
- @db.create_table(:cats) do
218
- integer :id
219
- text :name
220
- unique :name, :deferrable=>false
221
- end
222
- @db.sqls.must_equal ["CREATE TABLE cats (id integer, name text, UNIQUE (name) NOT DEFERRABLE)"]
223
- end
224
-
225
- it "should handle deferred unique constraints" do
226
- @db.create_table(:cats) do
227
- integer :id
228
- text :name
229
- unique :name, :deferrable=>true
230
- end
231
- @db.sqls.must_equal ["CREATE TABLE cats (id integer, name text, UNIQUE (name) DEFERRABLE INITIALLY DEFERRED)"]
232
- end
233
-
234
- it "should handle deferred initially immediate unique constraints" do
235
- @db.create_table(:cats) do
236
- integer :id
237
- text :name
238
- unique :name, :deferrable=>:immediate
239
- end
240
- @db.sqls.must_equal ["CREATE TABLE cats (id integer, name text, UNIQUE (name) DEFERRABLE INITIALLY IMMEDIATE)"]
241
- end
242
-
243
- it "should handle deferred unique column constraints" do
244
- @db.create_table(:cats) do
245
- integer :id, :unique=>true, :unique_deferrable=>true
246
- integer :i, :unique=>true, :unique_deferrable=>:immediate
247
- integer :j, :unique=>true, :unique_deferrable=>false
248
- end
249
- @db.sqls.must_equal ["CREATE TABLE cats (id integer UNIQUE DEFERRABLE INITIALLY DEFERRED, i integer UNIQUE DEFERRABLE INITIALLY IMMEDIATE, j integer UNIQUE NOT DEFERRABLE)"]
250
- end
251
-
252
- it "should handle deferred primary key column constraints" do
253
- @db.create_table(:cats) do
254
- integer :id, :primary_key=>true, :primary_key_deferrable=>true
255
- integer :i, :primary_key=>true, :primary_key_deferrable=>:immediate
256
- integer :j, :primary_key=>true, :primary_key_deferrable=>false
257
- end
258
- @db.sqls.must_equal ["CREATE TABLE cats (id integer PRIMARY KEY DEFERRABLE INITIALLY DEFERRED, i integer PRIMARY KEY DEFERRABLE INITIALLY IMMEDIATE, j integer PRIMARY KEY NOT DEFERRABLE)"]
259
- end
260
-
261
- it "should accept unsigned definition" do
262
- @db.create_table(:cats) do
263
- integer :value, :unsigned => true
264
- end
265
- @db.sqls.must_equal ["CREATE TABLE cats (value integer UNSIGNED)"]
266
- end
267
-
268
- it "should accept [SET|ENUM](...) types" do
269
- @db.create_table(:cats) do
270
- set :color, :elements => ['black', 'tricolor', 'grey']
271
- end
272
- @db.sqls.must_equal ["CREATE TABLE cats (color set('black', 'tricolor', 'grey'))"]
273
- end
274
-
275
- it "should accept varchar size" do
276
- @db.create_table(:cats) do
277
- varchar :name
278
- end
279
- @db.sqls.must_equal ["CREATE TABLE cats (name varchar(255))"]
280
- @db.create_table(:cats) do
281
- varchar :name, :size => 51
282
- end
283
- @db.sqls.must_equal ["CREATE TABLE cats (name varchar(51))"]
284
- end
285
-
286
- it "should use double precision for double type" do
287
- @db.create_table(:cats) do
288
- double :name
289
- end
290
- @db.sqls.must_equal ["CREATE TABLE cats (name double precision)"]
291
- end
292
-
293
- it "should accept foreign keys without options" do
294
- @db.create_table(:cats) do
295
- foreign_key :project_id
296
- end
297
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer)"]
298
- end
299
-
300
- it "should accept foreign keys with options" do
301
- @db.create_table(:cats) do
302
- foreign_key :project_id, :table => :projects
303
- end
304
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects)"]
305
- end
306
-
307
- it "should accept foreign keys with separate table argument" do
308
- @db.create_table(:cats) do
309
- foreign_key :project_id, :projects, :default=>3
310
- end
311
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer DEFAULT 3 REFERENCES projects)"]
312
- end
313
-
314
- it "should allowing naming foreign key constraint with :foreign_key_constraint_name option" do
315
- @db.create_table(:cats) do
316
- foreign_key :project_id, :projects, :foreign_key_constraint_name=>:foo
317
- end
318
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer CONSTRAINT foo REFERENCES projects)"]
319
- end
320
-
321
- it "should raise an error if the table argument to foreign_key isn't a hash, symbol, or nil" do
322
- proc{@db.create_table(:cats){foreign_key :project_id, Object.new, :default=>3}}.must_raise(Sequel::Error)
323
- end
324
-
325
- it "should accept foreign keys with arbitrary keys" do
326
- @db.create_table(:cats) do
327
- foreign_key :project_id, :table => :projects, :key => :id
328
- end
329
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects(id))"]
330
-
331
- @db.create_table(:cats) do
332
- foreign_key :project_id, :table => :projects, :key => :zzz
333
- end
334
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects(zzz))"]
335
- end
336
-
337
- it "should accept foreign keys with ON DELETE clause" do
338
- @db.create_table(:cats) do
339
- foreign_key :project_id, :table => :projects, :on_delete => :restrict
340
- end
341
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE RESTRICT)"]
342
-
343
- @db.create_table(:cats) do
344
- foreign_key :project_id, :table => :projects, :on_delete => :cascade
345
- end
346
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE CASCADE)"]
347
-
348
- @db.create_table(:cats) do
349
- foreign_key :project_id, :table => :projects, :on_delete => :no_action
350
- end
351
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE NO ACTION)"]
352
-
353
- @db.create_table(:cats) do
354
- foreign_key :project_id, :table => :projects, :on_delete => :set_null
355
- end
356
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE SET NULL)"]
357
-
358
- @db.create_table(:cats) do
359
- foreign_key :project_id, :table => :projects, :on_delete => :set_default
360
- end
361
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE SET DEFAULT)"]
362
-
363
- @db.create_table(:cats) do
364
- foreign_key :project_id, :table => :projects, :on_delete => 'NO ACTION FOO'
365
- end
366
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE NO ACTION FOO)"]
367
- end
368
-
369
- it "should accept foreign keys with ON UPDATE clause" do
370
- @db.create_table(:cats) do
371
- foreign_key :project_id, :table => :projects, :on_update => :restrict
372
- end
373
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE RESTRICT)"]
374
-
375
- @db.create_table(:cats) do
376
- foreign_key :project_id, :table => :projects, :on_update => :cascade
377
- end
378
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE CASCADE)"]
379
-
380
- @db.create_table(:cats) do
381
- foreign_key :project_id, :table => :projects, :on_update => :no_action
382
- end
383
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE NO ACTION)"]
384
-
385
- @db.create_table(:cats) do
386
- foreign_key :project_id, :table => :projects, :on_update => :set_null
387
- end
388
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE SET NULL)"]
389
-
390
- @db.create_table(:cats) do
391
- foreign_key :project_id, :table => :projects, :on_update => :set_default
392
- end
393
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE SET DEFAULT)"]
394
-
395
- @db.create_table(:cats) do
396
- foreign_key :project_id, :table => :projects, :on_update => 'SET DEFAULT FOO'
397
- end
398
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE SET DEFAULT FOO)"]
399
- end
400
-
401
- it "should accept foreign keys with deferrable option" do
402
- @db.create_table(:cats) do
403
- foreign_key :project_id, :projects, :deferrable=>true
404
- end
405
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects DEFERRABLE INITIALLY DEFERRED)"]
406
- end
407
-
408
- it "should accept collation" do
409
- @db.create_table(:cats) do
410
- String :name, :collate => :utf8_bin
411
- end
412
- @db.sqls.must_equal ['CREATE TABLE cats (name varchar(255) COLLATE utf8_bin)']
413
- end
414
-
415
- it "should accept collation as a String, treated literally" do
416
- @db.create_table(:cats) do
417
- String :name, :collate => '"utf8_bin"'
418
- end
419
- @db.sqls.must_equal ['CREATE TABLE cats (name varchar(255) COLLATE "utf8_bin")']
420
- end
421
-
422
- it "should accept inline index definition" do
423
- @db.create_table(:cats) do
424
- integer :id, :index => true
425
- end
426
- @db.sqls.must_equal ["CREATE TABLE cats (id integer)", "CREATE INDEX cats_id_index ON cats (id)"]
427
- end
428
-
429
- it "should accept inline index definition with a hash of options" do
430
- @db.create_table(:cats) do
431
- integer :id, :index => {:unique=>true}
432
- end
433
- @db.sqls.must_equal ["CREATE TABLE cats (id integer)", "CREATE UNIQUE INDEX cats_id_index ON cats (id)"]
434
- end
435
-
436
- it "should accept inline index definition for foreign keys" do
437
- @db.create_table(:cats) do
438
- foreign_key :project_id, :table => :projects, :on_delete => :cascade, :index => true
439
- end
440
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE CASCADE)",
441
- "CREATE INDEX cats_project_id_index ON cats (project_id)"]
442
- end
443
-
444
- it "should accept inline index definition for foreign keys with a hash of options" do
445
- @db.create_table(:cats) do
446
- foreign_key :project_id, :table => :projects, :on_delete => :cascade, :index => {:unique=>true}
447
- end
448
- @db.sqls.must_equal ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE CASCADE)",
449
- "CREATE UNIQUE INDEX cats_project_id_index ON cats (project_id)"]
450
- end
451
-
452
- it "should accept index definitions" do
453
- @db.create_table(:cats) do
454
- integer :id
455
- index :id
456
- end
457
- @db.sqls.must_equal ["CREATE TABLE cats (id integer)", "CREATE INDEX cats_id_index ON cats (id)"]
458
- end
459
-
460
- it "should accept unique constraint definitions" do
461
- @db.create_table(:cats) do
462
- text :name
463
- unique :name
464
- end
465
- @db.sqls.must_equal ["CREATE TABLE cats (name text, UNIQUE (name))"]
466
- end
467
-
468
- it "should accept partial index definitions" do
469
- def @db.supports_partial_indexes?() true end
470
- @db.create_table(:cats) do
471
- integer :id
472
- index :id, :where=>proc{id > 1}
473
- end
474
- @db.sqls.must_equal ["CREATE TABLE cats (id integer)", "CREATE INDEX cats_id_index ON cats (id) WHERE (id > 1)"]
475
- end
476
-
477
- it "should raise an error if partial indexes are not supported" do
478
- proc do
479
- @db.create_table(:cats) do
480
- integer :id
481
- index :id, :where=>proc{id > 1}
482
- end
483
- end.must_raise(Sequel::Error)
484
- end
485
-
486
- it "should not raise on index error for unsupported index definitions if ignore_index_errors is used" do
487
- @db.create_table(:cats, :ignore_index_errors=>true) do
488
- text :name
489
- full_text_index :name
490
- end
491
- end
492
-
493
- it "should raise on full-text index definitions" do
494
- proc {
495
- @db.create_table(:cats) do
496
- text :name
497
- full_text_index :name
498
- end
499
- }.must_raise(Sequel::Error)
500
- end
501
-
502
- it "should raise on spatial index definitions" do
503
- proc {
504
- @db.create_table(:cats) do
505
- point :geom
506
- spatial_index :geom
507
- end
508
- }.must_raise(Sequel::Error)
509
- end
510
-
511
- it "should raise on partial index definitions" do
512
- proc {
513
- @db.create_table(:cats) do
514
- text :name
515
- index :name, :where => {:something => true}
516
- end
517
- }.must_raise(Sequel::Error)
518
- end
519
-
520
- it "should raise index definitions with type" do
521
- proc {
522
- @db.create_table(:cats) do
523
- text :name
524
- index :name, :type => :hash
525
- end
526
- }.must_raise(Sequel::Error)
527
- end
528
-
529
- it "should ignore errors if the database raises an error on an index creation statement and the :ignore_index_errors option is used" do
530
- @db.define_singleton_method(:execute_ddl){|*a| raise Sequel::DatabaseError if /blah/.match(a.first); super(*a)}
531
- lambda{@db.create_table(:cats){Integer :id; index :blah; index :id}}.must_raise(Sequel::DatabaseError)
532
- @db.sqls.must_equal ['CREATE TABLE cats (id integer)']
533
- @db.create_table(:cats, :ignore_index_errors=>true){Integer :id; index :blah; index :id}
534
- @db.sqls.must_equal ['CREATE TABLE cats (id integer)', 'CREATE INDEX cats_id_index ON cats (id)']
535
- end
536
-
537
- it "should not use savepoints around index creation if running inside a transaction if :ignore_index_errors option is used" do
538
- @db.define_singleton_method(:execute_ddl){|*a| super(*a); raise Sequel::DatabaseError if /blah/.match(a.first)}
539
- @db.transaction{@db.create_table(:cats, :ignore_index_errors=>true){Integer :id; index :blah; index :id}}
540
- @db.sqls.must_equal ["BEGIN", "CREATE TABLE cats (id integer)", "CREATE INDEX cats_blah_index ON cats (blah)", "CREATE INDEX cats_id_index ON cats (id)", "COMMIT"]
541
- end
542
-
543
- it "should use savepoints around index creation if running inside a transaction if :ignore_index_errors option is used and transactional schema modifications are supported" do
544
- @db.define_singleton_method(:supports_transactional_ddl?){true}
545
- @db.define_singleton_method(:execute_ddl){|*a| super(*a); raise Sequel::DatabaseError if /blah/.match(a.first)}
546
- @db.transaction{@db.create_table(:cats, :ignore_index_errors=>true){Integer :id; index :blah; index :id}}
547
- @db.sqls.must_equal ["BEGIN", "CREATE TABLE cats (id integer)", "SAVEPOINT autopoint_1", "CREATE INDEX cats_blah_index ON cats (blah)", "ROLLBACK TO SAVEPOINT autopoint_1", "SAVEPOINT autopoint_1", "CREATE INDEX cats_id_index ON cats (id)", "RELEASE SAVEPOINT autopoint_1", "COMMIT"]
548
- end
549
-
550
- it "should accept multiple index definitions" do
551
- @db.create_table(:cats) do
552
- integer :id
553
- index :id
554
- index :name
555
- end
556
- @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)"]
557
- end
558
-
559
- it "should accept functional indexes" do
560
- @db.create_table(:cats) do
561
- integer :id
562
- index Sequel.function(:lower, :name)
563
- end
564
- @db.sqls.must_equal ["CREATE TABLE cats (id integer)", "CREATE INDEX cats_lower_name__index ON cats (lower(name))"]
565
- end
566
-
567
- it "should accept indexes with identifiers" do
568
- @db.create_table(:cats) do
569
- integer :id
570
- index Sequel.identifier(:lower__name)
571
- end
572
- @db.sqls.must_equal ["CREATE TABLE cats (id integer)", "CREATE INDEX cats_lower__name_index ON cats (lower__name)"]
573
- end
574
-
575
- it "should accept custom index names" do
576
- @db.create_table(:cats) do
577
- integer :id
578
- index :id, :name => 'abc'
579
- end
580
- @db.sqls.must_equal ["CREATE TABLE cats (id integer)", "CREATE INDEX abc ON cats (id)"]
581
- end
582
-
583
- it "should accept unique index definitions" do
584
- @db.create_table(:cats) do
585
- integer :id
586
- index :id, :unique => true
587
- end
588
- @db.sqls.must_equal ["CREATE TABLE cats (id integer)", "CREATE UNIQUE INDEX cats_id_index ON cats (id)"]
589
- end
590
-
591
- it "should accept composite index definitions" do
592
- @db.create_table(:cats) do
593
- integer :id
594
- index [:id, :name], :unique => true
595
- end
596
- @db.sqls.must_equal ["CREATE TABLE cats (id integer)", "CREATE UNIQUE INDEX cats_id_name_index ON cats (id, name)"]
597
- end
598
-
599
- it "should accept unnamed constraint definitions with blocks" do
600
- @db.create_table(:cats) do
601
- integer :score
602
- check{(x > 0) & (y < 1)}
603
- end
604
- @db.sqls.must_equal ["CREATE TABLE cats (score integer, CHECK ((x > 0) AND (y < 1)))"]
605
- end
606
-
607
- it "should accept unnamed constraint definitions with function calls" do
608
- @db.create_table(:cats) do
609
- integer :score
610
- check{f(x)}
611
- end
612
- @db.sqls.must_equal ["CREATE TABLE cats (score integer, CHECK (f(x)))"]
613
- end
614
-
615
- it "should accept unnamed constraint definitions" do
616
- @db.create_table(:cats) do
617
- check 'price < ?', 100
618
- end
619
- @db.sqls.must_equal ["CREATE TABLE cats (CHECK (price < 100))"]
620
- end
621
-
622
- it "should accept arrays of pairs constraints" do
623
- @db.create_table(:cats) do
624
- check [[:price, 100]]
625
- end
626
- @db.sqls.must_equal ["CREATE TABLE cats (CHECK (price = 100))"]
627
- end
628
-
629
- it "should accept hash constraints" do
630
- @db.create_table(:cats) do
631
- check :price=>100
632
- end
633
- @db.sqls.must_equal ["CREATE TABLE cats (CHECK (price = 100))"]
634
- end
635
-
636
- it "should accept array constraints" do
637
- @db.create_table(:cats) do
638
- check [Sequel.expr(:x) > 0, Sequel.expr(:y) < 1]
639
- end
640
- @db.sqls.must_equal ["CREATE TABLE cats (CHECK ((x > 0) AND (y < 1)))"]
641
- end
642
-
643
- it "should accept expression constraints" do
644
- @db.create_table(:cats) do
645
- check Sequel.&(Sequel.expr(:x) > 0, Sequel.expr(:y) < 1)
646
- end
647
- @db.sqls.must_equal ["CREATE TABLE cats (CHECK ((x > 0) AND (y < 1)))"]
648
- end
649
-
650
- it "should accept named constraint definitions" do
651
- @db.create_table(:cats) do
652
- integer :score
653
- constraint :valid_score, 'score <= 100'
654
- end
655
- @db.sqls.must_equal ["CREATE TABLE cats (score integer, CONSTRAINT valid_score CHECK (score <= 100))"]
656
- end
657
-
658
- it "should accept named constraint definitions with options" do
659
- @db.create_table(:cats) do
660
- integer :score
661
- constraint({:name=>:valid_score, :deferrable=>true}, 'score <= 100')
662
- end
663
- @db.sqls.must_equal ["CREATE TABLE cats (score integer, CONSTRAINT valid_score CHECK (score <= 100) DEFERRABLE INITIALLY DEFERRED)"]
664
- end
665
-
666
- it "should accept named constraint definitions with block" do
667
- @db.create_table(:cats) do
668
- constraint(:blah_blah){(x.sql_number > 0) & (y.sql_number < 1)}
669
- end
670
- @db.sqls.must_equal ["CREATE TABLE cats (CONSTRAINT blah_blah CHECK ((x > 0) AND (y < 1)))"]
671
- end
672
-
673
- it "should raise an error if an invalid constraint type is used" do
674
- proc{@db.create_table(:cats){unique [:a, :b], :type=>:bb}}.must_raise(Sequel::Error)
675
- end
676
-
677
- it "should accept composite primary keys" do
678
- @db.create_table(:cats) do
679
- integer :a
680
- integer :b
681
- primary_key [:a, :b]
682
- end
683
- @db.sqls.must_equal ["CREATE TABLE cats (a integer, b integer, PRIMARY KEY (a, b))"]
684
- end
685
-
686
- it "should accept named composite primary keys" do
687
- @db.create_table(:cats) do
688
- integer :a
689
- integer :b
690
- primary_key [:a, :b], :name => :cpk
691
- end
692
- @db.sqls.must_equal ["CREATE TABLE cats (a integer, b integer, CONSTRAINT cpk PRIMARY KEY (a, b))"]
693
- end
694
-
695
- it "should accept composite foreign keys" do
696
- @db.create_table(:cats) do
697
- integer :a
698
- integer :b
699
- foreign_key [:a, :b], :abc
700
- end
701
- @db.sqls.must_equal ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc)"]
702
- end
703
-
704
- it "should accept named composite foreign keys" do
705
- @db.create_table(:cats) do
706
- integer :a
707
- integer :b
708
- foreign_key [:a, :b], :abc, :name => :cfk
709
- end
710
- @db.sqls.must_equal ["CREATE TABLE cats (a integer, b integer, CONSTRAINT cfk FOREIGN KEY (a, b) REFERENCES abc)"]
711
- end
712
-
713
- it "should accept composite foreign keys with arbitrary keys" do
714
- @db.create_table(:cats) do
715
- integer :a
716
- integer :b
717
- foreign_key [:a, :b], :abc, :key => [:real_a, :real_b]
718
- end
719
- @db.sqls.must_equal ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc(real_a, real_b))"]
720
-
721
- @db.create_table(:cats) do
722
- integer :a
723
- integer :b
724
- foreign_key [:a, :b], :abc, :key => [:z, :x]
725
- end
726
- @db.sqls.must_equal ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc(z, x))"]
727
- end
728
-
729
- it "should accept composite foreign keys with on delete and on update clauses" do
730
- @db.create_table(:cats) do
731
- integer :a
732
- integer :b
733
- foreign_key [:a, :b], :abc, :on_delete => :cascade
734
- end
735
- @db.sqls.must_equal ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc ON DELETE CASCADE)"]
736
-
737
- @db.create_table(:cats) do
738
- integer :a
739
- integer :b
740
- foreign_key [:a, :b], :abc, :on_update => :no_action
741
- end
742
- @db.sqls.must_equal ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc ON UPDATE NO ACTION)"]
743
-
744
- @db.create_table(:cats) do
745
- integer :a
746
- integer :b
747
- foreign_key [:a, :b], :abc, :on_delete => :restrict, :on_update => :set_default
748
- end
749
- @db.sqls.must_equal ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc ON DELETE RESTRICT ON UPDATE SET DEFAULT)"]
750
-
751
- @db.create_table(:cats) do
752
- integer :a
753
- integer :b
754
- foreign_key [:a, :b], :abc, :key => [:x, :y], :on_delete => :set_null, :on_update => :set_null
755
- end
756
- @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)"]
757
- end
758
-
759
- it "should accept an :as option to create a table from the results of a dataset" do
760
- @db.create_table(:cats, :as=>@db[:a])
761
- @db.sqls.must_equal ['CREATE TABLE cats AS SELECT * FROM a']
762
- end
763
-
764
- it "should accept an :as option to create a table from a SELECT string" do
765
- @db.create_table(:cats, :as=>'SELECT * FROM a')
766
- @db.sqls.must_equal ['CREATE TABLE cats AS SELECT * FROM a']
767
- end
768
-
769
- it "should raise an Error if both a block and an :as argument are given" do
770
- proc{@db.create_table(:cats, :as=>@db[:a]){}}.must_raise(Sequel::Error)
771
- end
772
- end
773
-
774
- describe "DB#create_table!" do
775
- before do
776
- @db = Sequel.mock
777
- end
778
-
779
- it "should create the table if it does not exist" do
780
- @db.define_singleton_method(:table_exists?){|a| false}
781
- @db.create_table!(:cats){|*a|}.must_be_nil
782
- @db.sqls.must_equal ['CREATE TABLE cats ()']
783
- end
784
-
785
- it "should drop the table before creating it if it already exists" do
786
- @db.define_singleton_method(:table_exists?){|a| true}
787
- @db.create_table!(:cats){|*a|}
788
- @db.sqls.must_equal ['DROP TABLE cats', 'CREATE TABLE cats ()']
789
- end
790
-
791
- it "should use IF EXISTS if the database supports it" do
792
- @db.define_singleton_method(:supports_drop_table_if_exists?){true}
793
- @db.create_table!(:cats){|*a|}
794
- @db.sqls.must_equal ['DROP TABLE IF EXISTS cats', 'CREATE TABLE cats ()']
795
- end
796
- end
797
-
798
- describe "DB#create_table?" do
799
- before do
800
- @db = Sequel.mock
801
- end
802
-
803
- it "should not create the table if the table already exists" do
804
- @db.define_singleton_method(:table_exists?){|a| true}
805
- @db.create_table?(:cats){|*a|}.must_be_nil
806
- @db.sqls.must_equal []
807
- end
808
-
809
- it "should create the table if the table doesn't already exist" do
810
- @db.define_singleton_method(:table_exists?){|a| false}
811
- @db.create_table?(:cats){|*a|}
812
- @db.sqls.must_equal ['CREATE TABLE cats ()']
813
- end
814
-
815
- it "should use IF NOT EXISTS if the database supports that" do
816
- @db.define_singleton_method(:supports_create_table_if_not_exists?){true}
817
- @db.create_table?(:cats){|*a|}
818
- @db.sqls.must_equal ['CREATE TABLE IF NOT EXISTS cats ()']
819
- end
820
-
821
- it "should not use IF NOT EXISTS if the indexes are created" do
822
- @db.define_singleton_method(:table_exists?){|a| false}
823
- @db.define_singleton_method(:supports_create_table_if_not_exists?){true}
824
- @db.create_table?(:cats){|*a| Integer :a, :index=>true}
825
- @db.sqls.must_equal ['CREATE TABLE cats (a integer)', 'CREATE INDEX cats_a_index ON cats (a)']
826
-
827
- @db.define_singleton_method(:table_exists?){|a| true}
828
- @db.create_table?(:cats){|*a| Integer :a, :index=>true}
829
- @db.sqls.must_equal []
830
- end
831
- end
832
-
833
- describe "DB#create_join_table" do
834
- before do
835
- @db = Sequel.mock
836
- end
837
-
838
- it "should take a hash with foreign keys and table name values" do
839
- @db.create_join_table(:cat_id=>:cats, :dog_id=>:dogs).must_be_nil
840
- @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)']
841
- end
842
-
843
- it "should be able to have values be a hash of options" do
844
- @db.create_join_table(:cat_id=>{:table=>:cats, :null=>true}, :dog_id=>{:table=>:dogs, :default=>0})
845
- @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)']
846
- end
847
-
848
- it "should be able to pass a second hash of table options" do
849
- @db.create_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :temp=>true)
850
- @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)']
851
- end
852
-
853
- it "should recognize :name option in table options" do
854
- @db.create_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :name=>:f)
855
- @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)']
856
- end
857
-
858
- it "should recognize :index_options option in table options" do
859
- @db.create_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :index_options=>{:name=>:foo_index})
860
- @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)']
861
- end
862
-
863
- it "should recognize :no_index option in table options" do
864
- @db.create_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :no_index=>true)
865
- @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))']
866
- end
867
-
868
- it "should recognize :no_primary_key option in table options" do
869
- @db.create_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :no_primary_key=>true)
870
- @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)']
871
- end
872
-
873
- it "should raise an error if the hash doesn't have 2 entries with table names" do
874
- proc{@db.create_join_table({})}.must_raise(Sequel::Error)
875
- proc{@db.create_join_table({:cat_id=>:cats})}.must_raise(Sequel::Error)
876
- proc{@db.create_join_table({:cat_id=>:cats, :human_id=>:humans, :dog_id=>:dog})}.must_raise(Sequel::Error)
877
- proc{@db.create_join_table({:cat_id=>:cats, :dog_id=>{}})}.must_raise(Sequel::Error)
878
- end
879
- end
880
-
881
- describe "DB#create_join_table?" do
882
- before do
883
- @db = Sequel.mock
884
- end
885
-
886
- it "should create the table if it does not already exist" do
887
- @db.define_singleton_method(:table_exists?){|a| false}
888
- @db.create_join_table?(:cat_id=>:cats, :dog_id=>:dogs).must_be_nil
889
- @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)']
890
- end
891
-
892
- it "should not create the table if it already exists" do
893
- @db.define_singleton_method(:table_exists?){|a| true}
894
- @db.create_join_table?(:cat_id=>:cats, :dog_id=>:dogs)
895
- @db.sqls.must_equal []
896
- end
897
-
898
- it "should not use IF NOT EXISTS" do
899
- @db.define_singleton_method(:table_exists?){|a| false}
900
- @db.define_singleton_method(:supports_create_table_if_not_exists?){true}
901
- @db.create_join_table?(:cat_id=>:cats, :dog_id=>:dogs)
902
- @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)']
903
-
904
- @db.define_singleton_method(:table_exists?){|a| true}
905
- @db.create_join_table?(:cat_id=>:cats, :dog_id=>:dogs)
906
- @db.sqls.must_equal []
907
- end
908
-
909
- it "should not use IF NOT EXISTS if no_index is used" do
910
- @db.define_singleton_method(:supports_create_table_if_not_exists?){true}
911
- @db.create_join_table?({:cat_id=>:cats, :dog_id=>:dogs}, :no_index=>true)
912
- @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))']
913
- end
914
- end
915
-
916
- describe "DB#create_join_table!" do
917
- before do
918
- @db = Sequel.mock
919
- end
920
-
921
- it "should drop the table first if it already exists" do
922
- @db.define_singleton_method(:table_exists?){|a| true}
923
- @db.create_join_table!(:cat_id=>:cats, :dog_id=>:dogs).must_be_nil
924
- @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)']
925
- end
926
-
927
- it "should not drop the table if it doesn't exists" do
928
- @db.define_singleton_method(:table_exists?){|a| false}
929
- @db.create_join_table!(:cat_id=>:cats, :dog_id=>:dogs)
930
- @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)']
931
- end
932
-
933
- it "should use IF EXISTS if the database supports it" do
934
- @db.define_singleton_method(:supports_drop_table_if_exists?){true}
935
- @db.create_join_table!(:cat_id=>:cats, :dog_id=>:dogs)
936
- @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)']
937
- end
938
- end
939
-
940
- describe "DB#drop_join_table" do
941
- before do
942
- @db = Sequel.mock
943
- end
944
-
945
- it "should take a hash with foreign keys and table name values and drop the table" do
946
- @db.drop_join_table(:cat_id=>:cats, :dog_id=>:dogs).must_be_nil
947
- @db.sqls.must_equal ['DROP TABLE cats_dogs']
948
- end
949
-
950
- it "should be able to have values be a hash of options" do
951
- @db.drop_join_table(:cat_id=>{:table=>:cats, :null=>true}, :dog_id=>{:table=>:dogs, :default=>0})
952
- @db.sqls.must_equal ['DROP TABLE cats_dogs']
953
- end
954
-
955
- it "should respect a second hash of table options" do
956
- @db.drop_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :cascade=>true)
957
- @db.sqls.must_equal ['DROP TABLE cats_dogs CASCADE']
958
- end
959
-
960
- it "should respect :name option for table name" do
961
- @db.drop_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :name=>:f)
962
- @db.sqls.must_equal ['DROP TABLE f']
963
- end
964
-
965
- it "should raise an error if the hash doesn't have 2 entries with table names" do
966
- proc{@db.drop_join_table({})}.must_raise(Sequel::Error)
967
- proc{@db.drop_join_table({:cat_id=>:cats})}.must_raise(Sequel::Error)
968
- proc{@db.drop_join_table({:cat_id=>:cats, :human_id=>:humans, :dog_id=>:dog})}.must_raise(Sequel::Error)
969
- proc{@db.drop_join_table({:cat_id=>:cats, :dog_id=>{}})}.must_raise(Sequel::Error)
970
- end
971
- end
972
-
973
- describe "DB#drop_table" do
974
- before do
975
- @db = Sequel.mock
976
- end
977
-
978
- it "should generate a DROP TABLE statement" do
979
- @db.drop_table(:cats).must_be_nil
980
- @db.sqls.must_equal ['DROP TABLE cats']
981
- end
982
-
983
- it "should drop multiple tables at once" do
984
- @db.drop_table :cats, :dogs
985
- @db.sqls.must_equal ['DROP TABLE cats', 'DROP TABLE dogs']
986
- end
987
-
988
- it "should take an options hash and support the :cascade option" do
989
- @db.drop_table :cats, :dogs, :cascade=>true
990
- @db.sqls.must_equal ['DROP TABLE cats CASCADE', 'DROP TABLE dogs CASCADE']
991
- end
992
- end
993
-
994
- describe "DB#drop_table?" do
995
- before do
996
- @db = Sequel.mock
997
- end
998
-
999
- it "should drop the table if it exists" do
1000
- @db.define_singleton_method(:table_exists?){|a| true}
1001
- @db.drop_table?(:cats).must_be_nil
1002
- @db.sqls.must_equal ["DROP TABLE cats"]
1003
- end
1004
-
1005
- it "should do nothing if the table does not exist" do
1006
- @db.define_singleton_method(:table_exists?){|a| false}
1007
- @db.drop_table?(:cats)
1008
- @db.sqls.must_equal []
1009
- end
1010
-
1011
- it "should operate on multiple tables at once" do
1012
- @db.define_singleton_method(:table_exists?){|a| a == :cats}
1013
- @db.drop_table? :cats, :dogs
1014
- @db.sqls.must_equal ['DROP TABLE cats']
1015
- end
1016
-
1017
- it "should take an options hash and support the :cascade option" do
1018
- @db.define_singleton_method(:table_exists?){|a| true}
1019
- @db.drop_table? :cats, :dogs, :cascade=>true
1020
- @db.sqls.must_equal ['DROP TABLE cats CASCADE', 'DROP TABLE dogs CASCADE']
1021
- end
1022
-
1023
- it "should use IF NOT EXISTS if the database supports that" do
1024
- @db.define_singleton_method(:supports_drop_table_if_exists?){true}
1025
- @db.drop_table? :cats, :dogs
1026
- @db.sqls.must_equal ['DROP TABLE IF EXISTS cats', 'DROP TABLE IF EXISTS dogs']
1027
- end
1028
-
1029
- it "should use IF NOT EXISTS with CASCADE if the database supports that" do
1030
- @db.define_singleton_method(:supports_drop_table_if_exists?){true}
1031
- @db.drop_table? :cats, :dogs, :cascade=>true
1032
- @db.sqls.must_equal ['DROP TABLE IF EXISTS cats CASCADE', 'DROP TABLE IF EXISTS dogs CASCADE']
1033
- end
1034
- end
1035
-
1036
- describe "DB#alter_table" do
1037
- before do
1038
- @db = Sequel.mock
1039
- end
1040
-
1041
- it "should allow adding not null constraint via set_column_allow_null with false argument" do
1042
- @db.alter_table(:cats) do
1043
- set_column_allow_null :score, false
1044
- end.must_be_nil
1045
- @db.sqls.must_equal ["ALTER TABLE cats ALTER COLUMN score SET NOT NULL"]
1046
- end
1047
-
1048
- it "should allow removing not null constraint via set_column_allow_null with true argument" do
1049
- @db.alter_table(:cats) do
1050
- set_column_allow_null :score, true
1051
- end
1052
- @db.sqls.must_equal ["ALTER TABLE cats ALTER COLUMN score DROP NOT NULL"]
1053
- end
1054
-
1055
- it "should allow adding not null constraint via set_column_not_null" do
1056
- @db.alter_table(:cats) do
1057
- set_column_not_null :score
1058
- end
1059
- @db.sqls.must_equal ["ALTER TABLE cats ALTER COLUMN score SET NOT NULL"]
1060
- end
1061
-
1062
- it "should allow removing not null constraint via set_column_allow_null without argument" do
1063
- @db.alter_table(:cats) do
1064
- set_column_allow_null :score
1065
- end
1066
- @db.sqls.must_equal ["ALTER TABLE cats ALTER COLUMN score DROP NOT NULL"]
1067
- end
1068
-
1069
- it "should support add_column" do
1070
- @db.alter_table(:cats) do
1071
- add_column :score, :integer
1072
- end
1073
- @db.sqls.must_equal ["ALTER TABLE cats ADD COLUMN score integer"]
1074
- end
1075
-
1076
- it "should support add_constraint" do
1077
- @db.alter_table(:cats) do
1078
- add_constraint :valid_score, 'score <= 100'
1079
- end
1080
- @db.sqls.must_equal ["ALTER TABLE cats ADD CONSTRAINT valid_score CHECK (score <= 100)"]
1081
- end
1082
-
1083
- it "should support add_constraint with options" do
1084
- @db.alter_table(:cats) do
1085
- add_constraint({:name=>:valid_score, :deferrable=>true}, 'score <= 100')
1086
- end
1087
- @db.sqls.must_equal ["ALTER TABLE cats ADD CONSTRAINT valid_score CHECK (score <= 100) DEFERRABLE INITIALLY DEFERRED"]
1088
- end
1089
-
1090
- it "should support add_constraint with block" do
1091
- @db.alter_table(:cats) do
1092
- add_constraint(:blah_blah){(x.sql_number > 0) & (y.sql_number < 1)}
1093
- end
1094
- @db.sqls.must_equal ["ALTER TABLE cats ADD CONSTRAINT blah_blah CHECK ((x > 0) AND (y < 1))"]
1095
- end
1096
-
1097
- it "should support add_unique_constraint" do
1098
- @db.alter_table(:cats) do
1099
- add_unique_constraint [:a, :b]
1100
- end
1101
- @db.sqls.must_equal ["ALTER TABLE cats ADD UNIQUE (a, b)"]
1102
-
1103
- @db.alter_table(:cats) do
1104
- add_unique_constraint [:a, :b], :name => :ab_uniq
1105
- end
1106
- @db.sqls.must_equal ["ALTER TABLE cats ADD CONSTRAINT ab_uniq UNIQUE (a, b)"]
1107
- end
1108
-
1109
- it "should support add_foreign_key" do
1110
- @db.alter_table(:cats) do
1111
- add_foreign_key :node_id, :nodes
1112
- end
1113
- @db.sqls.must_equal ["ALTER TABLE cats ADD COLUMN node_id integer REFERENCES nodes"]
1114
- end
1115
-
1116
- it "should support add_foreign_key with composite foreign keys" do
1117
- @db.alter_table(:cats) do
1118
- add_foreign_key [:node_id, :prop_id], :nodes_props
1119
- end
1120
- @db.sqls.must_equal ["ALTER TABLE cats ADD FOREIGN KEY (node_id, prop_id) REFERENCES nodes_props"]
1121
-
1122
- @db.alter_table(:cats) do
1123
- add_foreign_key [:node_id, :prop_id], :nodes_props, :name => :cfk
1124
- end
1125
- @db.sqls.must_equal ["ALTER TABLE cats ADD CONSTRAINT cfk FOREIGN KEY (node_id, prop_id) REFERENCES nodes_props"]
1126
-
1127
- @db.alter_table(:cats) do
1128
- add_foreign_key [:node_id, :prop_id], :nodes_props, :key => [:nid, :pid]
1129
- end
1130
- @db.sqls.must_equal ["ALTER TABLE cats ADD FOREIGN KEY (node_id, prop_id) REFERENCES nodes_props(nid, pid)"]
1131
-
1132
- @db.alter_table(:cats) do
1133
- add_foreign_key [:node_id, :prop_id], :nodes_props, :on_delete => :restrict, :on_update => :cascade
1134
- end
1135
- @db.sqls.must_equal ["ALTER TABLE cats ADD FOREIGN KEY (node_id, prop_id) REFERENCES nodes_props ON DELETE RESTRICT ON UPDATE CASCADE"]
1136
- end
1137
-
1138
- it "should support add_index" do
1139
- @db.alter_table(:cats) do
1140
- add_index :name
1141
- end
1142
- @db.sqls.must_equal ["CREATE INDEX cats_name_index ON cats (name)"]
1143
- end
1144
-
1145
- it "should ignore errors if the database raises an error on an add_index call and the :ignore_errors option is used" do
1146
- @db.define_singleton_method(:execute_ddl){|*a| raise Sequel::DatabaseError}
1147
- lambda{@db.add_index(:cats, :id)}.must_raise(Sequel::DatabaseError)
1148
- @db.add_index(:cats, :id, :ignore_errors=>true)
1149
- @db.sqls.must_equal []
1150
- end
1151
-
1152
- it "should support add_primary_key" do
1153
- @db.alter_table(:cats) do
1154
- add_primary_key :id
1155
- end
1156
- @db.sqls.must_equal ["ALTER TABLE cats ADD COLUMN id integer PRIMARY KEY AUTOINCREMENT"]
1157
- end
1158
-
1159
- it "should support add_primary_key with composite primary keys" do
1160
- @db.alter_table(:cats) do
1161
- add_primary_key [:id, :type]
1162
- end
1163
- @db.sqls.must_equal ["ALTER TABLE cats ADD PRIMARY KEY (id, type)"]
1164
-
1165
- @db.alter_table(:cats) do
1166
- add_primary_key [:id, :type], :name => :cpk
1167
- end
1168
- @db.sqls.must_equal ["ALTER TABLE cats ADD CONSTRAINT cpk PRIMARY KEY (id, type)"]
1169
- end
1170
-
1171
- it "should set primary key column NOT NULL when using add_primary_key if database doesn't handle it" do
1172
- def @db.can_add_primary_key_constraint_on_nullable_columns?; false end
1173
- @db.alter_table(:cats) do
1174
- add_primary_key :id
1175
- end
1176
- @db.sqls.must_equal ["ALTER TABLE cats ADD COLUMN id integer NOT NULL PRIMARY KEY AUTOINCREMENT"]
1177
- end
1178
-
1179
- it "should set primary key column NOT NULL when adding primary key constraint if database doesn't handle it" do
1180
- def @db.can_add_primary_key_constraint_on_nullable_columns?; false end
1181
- @db.alter_table(:cats) do
1182
- add_primary_key [:id, :type]
1183
- end
1184
- @db.sqls.must_equal ["ALTER TABLE cats ALTER COLUMN id SET NOT NULL", "ALTER TABLE cats ALTER COLUMN type SET NOT NULL", "ALTER TABLE cats ADD PRIMARY KEY (id, type)"]
1185
- end
1186
-
1187
- it "should support drop_column" do
1188
- @db.alter_table(:cats) do
1189
- drop_column :score
1190
- end
1191
- @db.sqls.must_equal ["ALTER TABLE cats DROP COLUMN score"]
1192
- end
1193
-
1194
- it "should support drop_column with :cascade=>true option" do
1195
- @db.alter_table(:cats) do
1196
- drop_column :score, :cascade=>true
1197
- end
1198
- @db.sqls.must_equal ["ALTER TABLE cats DROP COLUMN score CASCADE"]
1199
- end
1200
-
1201
- it "should support drop_constraint" do
1202
- @db.alter_table(:cats) do
1203
- drop_constraint :valid_score
1204
- end
1205
- @db.sqls.must_equal ["ALTER TABLE cats DROP CONSTRAINT valid_score"]
1206
- end
1207
-
1208
- it "should support drop_constraint with :cascade=>true option" do
1209
- @db.alter_table(:cats) do
1210
- drop_constraint :valid_score, :cascade=>true
1211
- end
1212
- @db.sqls.must_equal ["ALTER TABLE cats DROP CONSTRAINT valid_score CASCADE"]
1213
- end
1214
-
1215
- it "should support drop_foreign_key" do
1216
- def @db.foreign_key_list(table_name)
1217
- [{:name=>:cats_node_id_fkey, :columns=>[:node_id]}]
1218
- end
1219
- @db.alter_table(:cats) do
1220
- drop_foreign_key :node_id
1221
- end
1222
- @db.sqls.must_equal ["ALTER TABLE cats DROP CONSTRAINT cats_node_id_fkey", "ALTER TABLE cats DROP COLUMN node_id"]
1223
- end
1224
-
1225
- it "should support drop_foreign_key with :foreign_key_constraint_name option" do
1226
- @db.alter_table(:cats) do
1227
- drop_foreign_key :node_id, :foreign_key_constraint_name=>:foo
1228
- end
1229
- @db.sqls.must_equal ["ALTER TABLE cats DROP CONSTRAINT foo", "ALTER TABLE cats DROP COLUMN node_id"]
1230
- end
1231
-
1232
- it "should support drop_foreign_key with :name option" do
1233
- @db.alter_table(:cats) do
1234
- drop_foreign_key :node_id, :name=>:foo
1235
- end
1236
- @db.sqls.must_equal ["ALTER TABLE cats DROP CONSTRAINT foo", "ALTER TABLE cats DROP COLUMN node_id"]
1237
- end
1238
-
1239
- it "should support drop_foreign_key with composite foreign keys" do
1240
- def @db.foreign_key_list(table_name)
1241
- [{:name=>:cats_node_id_prop_id_fkey, :columns=>[:node_id, :prop_id]}]
1242
- end
1243
- @db.alter_table(:cats) do
1244
- drop_foreign_key [:node_id, :prop_id]
1245
- end
1246
- @db.sqls.must_equal ["ALTER TABLE cats DROP CONSTRAINT cats_node_id_prop_id_fkey"]
1247
-
1248
- @db.alter_table(:cats) do
1249
- drop_foreign_key [:node_id, :prop_id], :name => :cfk
1250
- end
1251
- @db.sqls.must_equal ["ALTER TABLE cats DROP CONSTRAINT cfk"]
1252
- end
1253
-
1254
- it "should have drop_foreign_key raise Error if no name is found" do
1255
- def @db.foreign_key_list(table_name)
1256
- [{:name=>:cats_node_id_fkey, :columns=>[:foo_id]}]
1257
- end
1258
- lambda{@db.alter_table(:cats){drop_foreign_key :node_id}}.must_raise(Sequel::Error)
1259
- end
1260
-
1261
- it "should have drop_foreign_key raise Error if multiple foreign keys found" do
1262
- def @db.foreign_key_list(table_name)
1263
- [{:name=>:cats_node_id_fkey, :columns=>[:node_id]}, {:name=>:cats_node_id_fkey2, :columns=>[:node_id]}]
1264
- end
1265
- lambda{@db.alter_table(:cats){drop_foreign_key :node_id}}.must_raise(Sequel::Error)
1266
- end
1267
-
1268
- it "should support drop_index" do
1269
- @db.alter_table(:cats) do
1270
- drop_index :name
1271
- end
1272
- @db.sqls.must_equal ["DROP INDEX cats_name_index"]
1273
- end
1274
-
1275
- it "should support drop_index with a given name" do
1276
- @db.alter_table(:cats) do
1277
- drop_index :name, :name=>:blah_blah
1278
- end
1279
- @db.sqls.must_equal ["DROP INDEX blah_blah"]
1280
- end
1281
-
1282
- it "should support rename_column" do
1283
- @db.alter_table(:cats) do
1284
- rename_column :name, :old_name
1285
- end
1286
- @db.sqls.must_equal ["ALTER TABLE cats RENAME COLUMN name TO old_name"]
1287
- end
1288
-
1289
- it "should support set_column_default" do
1290
- @db.alter_table(:cats) do
1291
- set_column_default :score, 3
1292
- end
1293
- @db.sqls.must_equal ["ALTER TABLE cats ALTER COLUMN score SET DEFAULT 3"]
1294
- end
1295
-
1296
- it "should support set_column_type" do
1297
- @db.alter_table(:cats) do
1298
- set_column_type :score, :real
1299
- end
1300
- @db.sqls.must_equal ["ALTER TABLE cats ALTER COLUMN score TYPE real"]
1301
- end
1302
-
1303
- it "should support set_column_type with options" do
1304
- @db.alter_table(:cats) do
1305
- set_column_type :score, :integer, :unsigned=>true
1306
- set_column_type :score, :varchar, :size=>30
1307
- set_column_type :score, :enum, :elements=>['a', 'b']
1308
- end
1309
- @db.sqls.must_equal ["ALTER TABLE cats ALTER COLUMN score TYPE integer UNSIGNED",
1310
- "ALTER TABLE cats ALTER COLUMN score TYPE varchar(30)",
1311
- "ALTER TABLE cats ALTER COLUMN score TYPE enum('a', 'b')"]
1312
- end
1313
-
1314
- it "should combine operations into a single query if the database supports it" do
1315
- @db.define_singleton_method(:supports_combining_alter_table_ops?){true}
1316
- @db.alter_table(:cats) do
1317
- add_column :a, Integer
1318
- drop_column :b
1319
- set_column_not_null :c
1320
- rename_column :d, :e
1321
- set_column_default :f, 'g'
1322
- set_column_type :h, Integer
1323
- add_constraint(:i){a > 1}
1324
- drop_constraint :j
1325
- end
1326
- @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"]
1327
- end
1328
-
1329
- it "should combine operations into consecutive groups of combinable operations if the database supports combining operations" do
1330
- @db.define_singleton_method(:supports_combining_alter_table_ops?){true}
1331
- @db.alter_table(:cats) do
1332
- add_column :a, Integer
1333
- drop_column :b
1334
- set_column_not_null :c
1335
- rename_column :d, :e
1336
- add_index :e
1337
- set_column_default :f, 'g'
1338
- set_column_type :h, Integer
1339
- add_constraint(:i){a > 1}
1340
- drop_constraint :j
1341
- end
1342
- @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",
1343
- "CREATE INDEX cats_e_index ON cats (e)",
1344
- "ALTER TABLE cats ALTER COLUMN f SET DEFAULT 'g', ALTER COLUMN h TYPE integer, ADD CONSTRAINT i CHECK (a > 1), DROP CONSTRAINT j"]
1345
- end
1346
-
1347
- end
1348
-
1349
- describe "Database#create_table" do
1350
- before do
1351
- @db = Sequel.mock
1352
- end
1353
-
1354
- it "should construct proper SQL" do
1355
- @db.create_table :test do
1356
- primary_key :id, :integer, :null => false
1357
- column :name, :text
1358
- index :name, :unique => true
1359
- end
1360
- @db.sqls.must_equal ['CREATE TABLE test (id integer NOT NULL PRIMARY KEY AUTOINCREMENT, name text)',
1361
- 'CREATE UNIQUE INDEX test_name_index ON test (name)']
1362
- end
1363
-
1364
- it "should create a temporary table" do
1365
- @db.create_table :test_tmp, :temp => true do
1366
- primary_key :id, :integer, :null => false
1367
- column :name, :text
1368
- index :name, :unique => true
1369
- end
1370
-
1371
- @db.sqls.must_equal ['CREATE TEMPORARY TABLE test_tmp (id integer NOT NULL PRIMARY KEY AUTOINCREMENT, name text)',
1372
- 'CREATE UNIQUE INDEX test_tmp_name_index ON test_tmp (name)']
1373
- end
1374
- end
1375
-
1376
- describe "Database#alter_table" do
1377
- before do
1378
- @db = Sequel.mock
1379
- end
1380
-
1381
- it "should construct proper SQL" do
1382
- @db.alter_table :xyz do
1383
- add_column :aaa, :text, :null => false, :unique => true
1384
- drop_column :bbb
1385
- rename_column :ccc, :ddd
1386
- set_column_type :eee, :integer
1387
- set_column_default :hhh, 'abcd'
1388
- add_index :fff, :unique => true
1389
- drop_index :ggg
1390
- end
1391
-
1392
- @db.sqls.must_equal ['ALTER TABLE xyz ADD COLUMN aaa text NOT NULL UNIQUE',
1393
- 'ALTER TABLE xyz DROP COLUMN bbb',
1394
- 'ALTER TABLE xyz RENAME COLUMN ccc TO ddd',
1395
- 'ALTER TABLE xyz ALTER COLUMN eee TYPE integer',
1396
- "ALTER TABLE xyz ALTER COLUMN hhh SET DEFAULT 'abcd'",
1397
- 'CREATE UNIQUE INDEX xyz_fff_index ON xyz (fff)',
1398
- 'DROP INDEX xyz_ggg_index']
1399
- end
1400
- end
1401
-
1402
- describe "Database#add_column" do
1403
- it "should construct proper SQL" do
1404
- db = Sequel.mock
1405
- db.add_column(:test, :name, :text, :unique => true).must_be_nil
1406
- db.sqls.must_equal ['ALTER TABLE test ADD COLUMN name text UNIQUE']
1407
- end
1408
- end
1409
-
1410
- describe "Database#drop_column" do
1411
- before do
1412
- @db = Sequel.mock
1413
- end
1414
-
1415
- it "should construct proper SQL" do
1416
- @db.drop_column(:test, :name).must_be_nil
1417
- @db.sqls.must_equal ['ALTER TABLE test DROP COLUMN name']
1418
- end
1419
-
1420
- it "should use CASCADE for :cascade=>true option" do
1421
- @db.drop_column :test, :name, :cascade=>true
1422
- @db.sqls.must_equal ['ALTER TABLE test DROP COLUMN name CASCADE']
1423
- end
1424
- end
1425
-
1426
- describe "Database#rename_column" do
1427
- before do
1428
- @db = Sequel.mock
1429
- end
1430
-
1431
- it "should construct proper SQL" do
1432
- @db.rename_column(:test, :abc, :def).must_be_nil
1433
- @db.sqls.must_equal ['ALTER TABLE test RENAME COLUMN abc TO def']
1434
- end
1435
- end
1436
-
1437
- describe "Database#set_column_type" do
1438
- before do
1439
- @db = Sequel.mock
1440
- end
1441
-
1442
- it "should construct proper SQL" do
1443
- @db.set_column_type(:test, :name, :integer).must_be_nil
1444
- @db.sqls.must_equal ['ALTER TABLE test ALTER COLUMN name TYPE integer']
1445
- end
1446
- end
1447
-
1448
- describe "Database#set_column_default" do
1449
- before do
1450
- @db = Sequel.mock
1451
- end
1452
-
1453
- it "should construct proper SQL" do
1454
- @db.set_column_default(:test, :name, 'zyx').must_be_nil
1455
- @db.sqls.must_equal ["ALTER TABLE test ALTER COLUMN name SET DEFAULT 'zyx'"]
1456
- end
1457
- end
1458
-
1459
- describe "Database#add_index" do
1460
- before do
1461
- @db = Sequel.mock
1462
- end
1463
-
1464
- it "should construct proper SQL" do
1465
- @db.add_index(:test, :name, :unique => true).must_be_nil
1466
- @db.sqls.must_equal ['CREATE UNIQUE INDEX test_name_index ON test (name)']
1467
- end
1468
-
1469
- it "should accept multiple columns" do
1470
- @db.add_index :test, [:one, :two]
1471
- @db.sqls.must_equal ['CREATE INDEX test_one_two_index ON test (one, two)']
1472
- end
1473
- end
1474
-
1475
- describe "Database#drop_index" do
1476
- before do
1477
- @db = Sequel.mock
1478
- end
1479
-
1480
- it "should construct proper SQL" do
1481
- @db.drop_index(:test, :name).must_be_nil
1482
- @db.sqls.must_equal ['DROP INDEX test_name_index']
1483
- end
1484
-
1485
- end
1486
-
1487
- describe "Database#drop_table" do
1488
- before do
1489
- @db = Sequel.mock
1490
- end
1491
-
1492
- it "should construct proper SQL" do
1493
- @db.drop_table(:test).must_be_nil
1494
- @db.sqls.must_equal ['DROP TABLE test']
1495
- end
1496
-
1497
- it "should accept multiple table names" do
1498
- @db.drop_table :a, :bb, :ccc
1499
- @db.sqls.must_equal ['DROP TABLE a', 'DROP TABLE bb', 'DROP TABLE ccc']
1500
- end
1501
- end
1502
-
1503
- describe "Database#rename_table" do
1504
- before do
1505
- @db = Sequel.mock
1506
- end
1507
-
1508
- it "should construct proper SQL" do
1509
- @db.rename_table(:abc, :xyz).must_be_nil
1510
- @db.sqls.must_equal ['ALTER TABLE abc RENAME TO xyz']
1511
- end
1512
- end
1513
-
1514
- describe "Database#create_view" do
1515
- before do
1516
- @db = Sequel.mock
1517
- end
1518
-
1519
- it "should construct proper SQL with raw SQL" do
1520
- @db.create_view(:test, "SELECT * FROM xyz").must_be_nil
1521
- @db.sqls.must_equal ['CREATE VIEW test AS SELECT * FROM xyz']
1522
- @db.create_view Sequel.identifier(:test), "SELECT * FROM xyz"
1523
- @db.sqls.must_equal ['CREATE VIEW test AS SELECT * FROM xyz']
1524
- end
1525
-
1526
- it "should construct proper SQL with dataset" do
1527
- @db.create_view :test, @db[:items].select(:a, :b).order(:c)
1528
- @db.sqls.must_equal ['CREATE VIEW test AS SELECT a, b FROM items ORDER BY c']
1529
- end
1530
-
1531
- it "should handle :columns option" do
1532
- @db.create_view :test, @db[:items].select(:a, :b).order(:c), :columns=>[:d, :e]
1533
- @db.sqls.must_equal ['CREATE VIEW test (d, e) AS SELECT a, b FROM items ORDER BY c']
1534
- @db.create_view :test, @db[:items].select(:a, :b).order(:c), :columns=>%w'd e'
1535
- @db.sqls.must_equal ['CREATE VIEW test (d, e) AS SELECT a, b FROM items ORDER BY c']
1536
- @db.create_view :test, @db[:items].select(:a, :b).order(:c), :columns=>[Sequel.identifier('d'), Sequel.lit('e')]
1537
- @db.sqls.must_equal ['CREATE VIEW test (d, e) AS SELECT a, b FROM items ORDER BY c']
1538
- end
1539
-
1540
- it "should handle :check option" do
1541
- @db.create_view :test, @db[:items].select(:a, :b).order(:c), :check=>true
1542
- @db.sqls.must_equal ['CREATE VIEW test AS SELECT a, b FROM items ORDER BY c WITH CHECK OPTION']
1543
- @db.create_view :test, @db[:items].select(:a, :b).order(:c), :check=>:local
1544
- @db.sqls.must_equal ['CREATE VIEW test AS SELECT a, b FROM items ORDER BY c WITH LOCAL CHECK OPTION']
1545
- end
1546
-
1547
- with_symbol_splitting "should handle create_or_replace_view with splittable symbols" do
1548
- @db.create_or_replace_view :sch__test, "SELECT * FROM xyz"
1549
- @db.sqls.must_equal ['DROP VIEW sch.test', 'CREATE VIEW sch.test AS SELECT * FROM xyz']
1550
- end
1551
-
1552
- it "should handle create_or_replace_view" do
1553
- @db.create_or_replace_view :test, @db[:items].select(:a, :b).order(:c)
1554
- @db.sqls.must_equal ['DROP VIEW test', 'CREATE VIEW test AS SELECT a, b FROM items ORDER BY c']
1555
- @db.create_or_replace_view Sequel.identifier(:test), @db[:items].select(:a, :b).order(:c)
1556
- @db.sqls.must_equal ['DROP VIEW test', 'CREATE VIEW test AS SELECT a, b FROM items ORDER BY c']
1557
- end
1558
-
1559
- it "should use CREATE OR REPLACE VIEW if such syntax is supported" do
1560
- def @db.supports_create_or_replace_view?() true end
1561
- @db.create_or_replace_view :test, @db[:items]
1562
- @db.sqls.must_equal ['CREATE OR REPLACE VIEW test AS SELECT * FROM items']
1563
- end
1564
- end
1565
-
1566
- describe "Database#drop_view" do
1567
- before do
1568
- @db = Sequel.mock
1569
- end
1570
-
1571
- with_symbol_splitting "should construct proper SQL for splittable symbols" do
1572
- @db.drop_view(:sch__test).must_be_nil
1573
- @db.sqls.must_equal ['DROP VIEW sch.test']
1574
- end
1575
-
1576
- it "should construct proper SQL" do
1577
- @db.drop_view :test
1578
- @db.drop_view Sequel.identifier(:test)
1579
- @db.drop_view Sequel.qualify(:sch, :test)
1580
- @db.sqls.must_equal ['DROP VIEW test', 'DROP VIEW test', 'DROP VIEW sch.test']
1581
- end
1582
-
1583
- it "should drop multiple views at once" do
1584
- @db.drop_view :cats, :dogs
1585
- @db.sqls.must_equal ['DROP VIEW cats', 'DROP VIEW dogs']
1586
- end
1587
-
1588
- it "should support the :cascade option" do
1589
- @db.drop_view :cats, :dogs, :cascade=>true
1590
- @db.sqls.must_equal ['DROP VIEW cats CASCADE', 'DROP VIEW dogs CASCADE']
1591
- end
1592
-
1593
- it "should support the :if_exists option" do
1594
- @db.drop_view :cats, :dogs, :if_exists=>true
1595
- @db.sqls.must_equal ['DROP VIEW IF EXISTS cats', 'DROP VIEW IF EXISTS dogs']
1596
- end
1597
- end
1598
-
1599
- describe "Database#alter_table_sql" do
1600
- it "should raise error for an invalid op" do
1601
- proc {Sequel.mock.send(:alter_table_sql, :mau, :op => :blah)}.must_raise(Sequel::Error)
1602
- end
1603
- end
1604
-
1605
- describe "Schema Parser" do
1606
- before do
1607
- @sqls = []
1608
- @db = Sequel::Database.new
1609
- end
1610
-
1611
- it "should raise an error if there are no columns" do
1612
- @db.define_singleton_method(:schema_parse_table) do |t, opts|
1613
- []
1614
- end
1615
- proc{@db.schema(:x)}.must_raise(Sequel::Error)
1616
- end
1617
-
1618
- it "should cache data by default" do
1619
- @db.define_singleton_method(:schema_parse_table) do |t, opts|
1620
- [[:a, {}]]
1621
- end
1622
- @db.schema(:x).must_be_same_as(@db.schema(:x))
1623
- end
1624
-
1625
- it "should not cache data if :reload=>true is given" do
1626
- @db.define_singleton_method(:schema_parse_table) do |t, opts|
1627
- [[:a, {}]]
1628
- end
1629
- @db.schema(:x).wont_be_same_as(@db.schema(:x, :reload=>true))
1630
- end
1631
-
1632
- it "should not cache schema metadata if cache_schema is false" do
1633
- @db.cache_schema = false
1634
- @db.define_singleton_method(:schema_parse_table) do |t, opts|
1635
- [[:a, {}]]
1636
- end
1637
- @db.schema(:x).wont_be_same_as(@db.schema(:x))
1638
- end
1639
-
1640
- it "should freeze string values in resulting hash" do
1641
- @db.define_singleton_method(:schema_parse_table) do |t, opts|
1642
- [[:a, {:oid=>1, :db_type=>'integer'.dup, :default=>"'a'".dup, :ruby_default=>'a'.dup}]]
1643
- end
1644
- c = @db.schema(:x)[0][1]
1645
- c[:db_type].frozen?.must_equal true
1646
- c[:default].frozen?.must_equal true
1647
- c[:ruby_default].frozen?.must_equal true
1648
- end
1649
-
1650
- it "should provide options if given a table name" do
1651
- c = nil
1652
- @db.define_singleton_method(:schema_parse_table) do |t, opts|
1653
- c = [t, opts]
1654
- [[:a, {:db_type=>t.to_s}]]
1655
- end
1656
- @db.schema(:x)
1657
- c.must_equal ["x", {}]
1658
- @db.schema(Sequel[:s][:x])
1659
- c.must_equal ["x", {:schema=>"s"}]
1660
- ds = @db[Sequel[:s][:y]]
1661
- @db.schema(ds)
1662
- c.must_equal ["y", {:schema=>"s", :dataset=>ds}]
1663
- end
1664
-
1665
- with_symbol_splitting "should provide options if given a table name with splittable symbols" do
1666
- c = nil
1667
- @db.define_singleton_method(:schema_parse_table) do |t, opts|
1668
- c = [t, opts]
1669
- [[:a, {:db_type=>t.to_s}]]
1670
- end
1671
- @db.schema(:s__x)
1672
- c.must_equal ["x", {:schema=>"s"}]
1673
- ds = @db[:s__y]
1674
- @db.schema(ds)
1675
- c.must_equal ["y", {:schema=>"s", :dataset=>ds}]
1676
- end
1677
-
1678
- it "should parse the schema correctly for a single table" do
1679
- sqls = @sqls
1680
- proc{@db.schema(:x)}.must_raise(Sequel::Error)
1681
- @db.define_singleton_method(:schema_parse_table) do |t, opts|
1682
- sqls << t
1683
- [[:a, {:db_type=>t.to_s}]]
1684
- end
1685
- @db.schema(:x).must_equal [[:a, {:db_type=>"x", :ruby_default=>nil}]]
1686
- @sqls.must_equal ['x']
1687
- @db.schema(:x).must_equal [[:a, {:db_type=>"x", :ruby_default=>nil}]]
1688
- @sqls.must_equal ['x']
1689
- @db.schema(:x, :reload=>true).must_equal [[:a, {:db_type=>"x", :ruby_default=>nil}]]
1690
- @sqls.must_equal ['x', 'x']
1691
- end
1692
-
1693
- it "should dedup :db_type strings" do
1694
- @db.define_singleton_method(:schema_parse_table) do |t, opts|
1695
- [[:a, {:db_type=>t.to_s.dup}], [:b, {:db_type=>t.to_s.dup}]]
1696
- end
1697
- sch = @db.schema(:x)
1698
- sch.must_equal [[:a, {:db_type=>"x", :ruby_default=>nil}], [:b, {:db_type=>"x", :ruby_default=>nil}]]
1699
- sch[0][1][:db_type].must_be_same_as(sch[1][1][:db_type])
1700
- end if RUBY_VERSION >= '2.5'
1701
-
1702
- it "should set :auto_increment to true by default if unset and a single integer primary key is used" do
1703
- @db.define_singleton_method(:schema_parse_table){|*| [[:a, {:primary_key=>true, :db_type=>'integer'}]]}
1704
- @db.schema(:x).first.last[:auto_increment].must_equal true
1705
- end
1706
-
1707
- it "should not set :auto_increment if already set" do
1708
- @db.define_singleton_method(:schema_parse_table){|*| [[:a, {:primary_key=>true, :db_type=>'integer', :auto_increment=>false}]]}
1709
- @db.schema(:x).first.last[:auto_increment].must_equal false
1710
- end
1711
-
1712
- it "should set :auto_increment to false by default if unset and a single nonintegery primary key is used" do
1713
- @db.define_singleton_method(:schema_parse_table){|*| [[:a, {:primary_key=>true, :db_type=>'varchar'}]]}
1714
- @db.schema(:x).first.last[:auto_increment].must_equal false
1715
- end
1716
-
1717
- it "should set :auto_increment to false by default if unset and a composite primary key" do
1718
- @db.define_singleton_method(:schema_parse_table){|*| [[:a, {:primary_key=>true, :db_type=>'integer'}], [:b, {:primary_key=>true, :db_type=>'integer'}]]}
1719
- @db.schema(:x).first.last[:auto_increment].must_equal false
1720
- @db.schema(:x).last.last[:auto_increment].must_equal false
1721
- end
1722
-
1723
- it "should set :auto_increment to true by default if set and not the first column" do
1724
- @db.define_singleton_method(:schema_parse_table){|*| [[:b, {}], [:a, {:primary_key=>true, :db_type=>'integer'}]]}
1725
- @db.schema(:x).last.last[:auto_increment].must_equal true
1726
- end
1727
-
1728
- it "should convert various types of table name arguments" do
1729
- @db.define_singleton_method(:schema_parse_table) do |t, opts|
1730
- [[t, opts]]
1731
- end
1732
- s1 = @db.schema(:x)
1733
- s1.must_equal [['x', {:ruby_default=>nil}]]
1734
- @db.schema(:x).object_id.must_equal s1.object_id
1735
- @db.schema(Sequel.identifier(:x)).object_id.must_equal s1.object_id
1736
-
1737
- s2 = @db.schema(Sequel[:x][:y])
1738
- s2.must_equal [['y', {:schema=>'x', :ruby_default=>nil}]]
1739
- @db.schema(Sequel[:x][:y]).object_id.must_equal s2.object_id
1740
- @db.schema(Sequel.qualify(:x, :y)).object_id.must_equal s2.object_id
1741
-
1742
- s2 = @db.schema(Sequel.qualify(:v, Sequel[:x][:y]))
1743
- s2.must_equal [['y', {:schema=>'x', :ruby_default=>nil, :information_schema_schema=>Sequel.identifier('v')}]]
1744
- @db.schema(Sequel.qualify(:v, Sequel[:x][:y])).object_id.must_equal s2.object_id
1745
- @db.schema(Sequel.qualify(Sequel[:v][:x], :y)).object_id.must_equal s2.object_id
1746
-
1747
- s2 = @db.schema(Sequel.qualify(Sequel[:u][:v], Sequel[:x][:y]))
1748
- s2.must_equal [['y', {:schema=>'x', :ruby_default=>nil, :information_schema_schema=>Sequel.qualify('u', 'v')}]]
1749
- @db.schema(Sequel.qualify(Sequel[:u][:v], Sequel[:x][:y])).object_id.must_equal s2.object_id
1750
- @db.schema(Sequel.qualify(Sequel.qualify(:u, :v), Sequel.qualify(:x, :y))).object_id.must_equal s2.object_id
1751
- end
1752
-
1753
- with_symbol_splitting "should convert splittable symbol arguments" do
1754
- @db.define_singleton_method(:schema_parse_table) do |t, opts|
1755
- [[t, opts]]
1756
- end
1757
- s1 = @db.schema(:x)
1758
- s1.must_equal [['x', {:ruby_default=>nil}]]
1759
- @db.schema(:x).object_id.must_equal s1.object_id
1760
- @db.schema(Sequel.identifier(:x)).object_id.must_equal s1.object_id
1761
-
1762
- s2 = @db.schema(:x__y)
1763
- s2.must_equal [['y', {:schema=>'x', :ruby_default=>nil}]]
1764
- @db.schema(:x__y).object_id.must_equal s2.object_id
1765
- @db.schema(Sequel.qualify(:x, :y)).object_id.must_equal s2.object_id
1766
-
1767
- s2 = @db.schema(Sequel.qualify(:v, :x__y))
1768
- s2.must_equal [['y', {:schema=>'x', :ruby_default=>nil, :information_schema_schema=>Sequel.identifier('v')}]]
1769
- @db.schema(Sequel.qualify(:v, :x__y)).object_id.must_equal s2.object_id
1770
- @db.schema(Sequel.qualify(:v__x, :y)).object_id.must_equal s2.object_id
1771
-
1772
- s2 = @db.schema(Sequel.qualify(:u__v, :x__y))
1773
- s2.must_equal [['y', {:schema=>'x', :ruby_default=>nil, :information_schema_schema=>Sequel.qualify('u', 'v')}]]
1774
- @db.schema(Sequel.qualify(:u__v, :x__y)).object_id.must_equal s2.object_id
1775
- @db.schema(Sequel.qualify(Sequel.qualify(:u, :v), Sequel.qualify(:x, :y))).object_id.must_equal s2.object_id
1776
- end
1777
-
1778
- it "should correctly parse all supported data types" do
1779
- sm = Module.new do
1780
- def schema_parse_table(t, opts)
1781
- [[:x, {:db_type=>t.to_s, :type=>schema_column_type(t.to_s)}]]
1782
- end
1783
- end
1784
- @db.extend(sm)
1785
- @db.schema(:tinyint).first.last[:type].must_equal :integer
1786
- @db.schema(:int).first.last[:type].must_equal :integer
1787
- @db.schema(:integer).first.last[:type].must_equal :integer
1788
- @db.schema(:bigint).first.last[:type].must_equal :integer
1789
- @db.schema(:smallint).first.last[:type].must_equal :integer
1790
- @db.schema(:character).first.last[:type].must_equal :string
1791
- @db.schema(:"character varying").first.last[:type].must_equal :string
1792
- @db.schema(:varchar).first.last[:type].must_equal :string
1793
- @db.schema(:"varchar(255)").first.last[:type].must_equal :string
1794
- @db.schema(:"varchar(255)").first.last[:max_length].must_equal 255
1795
- @db.schema(:text).first.last[:type].must_equal :string
1796
- @db.schema(:date).first.last[:type].must_equal :date
1797
- @db.schema(:datetime).first.last[:type].must_equal :datetime
1798
- @db.schema(:smalldatetime).first.last[:type].must_equal :datetime
1799
- @db.schema(:timestamp).first.last[:type].must_equal :datetime
1800
- @db.schema(:"timestamp with time zone").first.last[:type].must_equal :datetime
1801
- @db.schema(:"timestamp without time zone").first.last[:type].must_equal :datetime
1802
- @db.schema(:time).first.last[:type].must_equal :time
1803
- @db.schema(:"time with time zone").first.last[:type].must_equal :time
1804
- @db.schema(:"time without time zone").first.last[:type].must_equal :time
1805
- @db.schema(:bool).first.last[:type].must_equal :boolean
1806
- @db.schema(:boolean).first.last[:type].must_equal :boolean
1807
- @db.schema(:real).first.last[:type].must_equal :float
1808
- @db.schema(:float).first.last[:type].must_equal :float
1809
- @db.schema(:"float unsigned").first.last[:type].must_equal :float
1810
- @db.schema(:double).first.last[:type].must_equal :float
1811
- @db.schema(:"double(1,2)").first.last[:type].must_equal :float
1812
- @db.schema(:"double(1,2) unsigned").first.last[:type].must_equal :float
1813
- @db.schema(:"double precision").first.last[:type].must_equal :float
1814
- @db.schema(:number).first.last[:type].must_equal :decimal
1815
- @db.schema(:numeric).first.last[:type].must_equal :decimal
1816
- @db.schema(:decimal).first.last[:type].must_equal :decimal
1817
- @db.schema(:"number(10,0)").first.last[:type].must_equal :integer
1818
- @db.schema(:"numeric(10, 10)").first.last[:type].must_equal :decimal
1819
- @db.schema(:"decimal(10,1)").first.last[:type].must_equal :decimal
1820
- @db.schema(:bytea).first.last[:type].must_equal :blob
1821
- @db.schema(:blob).first.last[:type].must_equal :blob
1822
- @db.schema(:image).first.last[:type].must_equal :blob
1823
- @db.schema(:nchar).first.last[:type].must_equal :string
1824
- @db.schema(:nvarchar).first.last[:type].must_equal :string
1825
- @db.schema(:ntext).first.last[:type].must_equal :string
1826
- @db.schema(:clob).first.last[:type].must_equal :string
1827
- @db.schema(:ntext).first.last[:type].must_equal :string
1828
- @db.schema(:smalldatetime).first.last[:type].must_equal :datetime
1829
- @db.schema(:binary).first.last[:type].must_equal :blob
1830
- @db.schema(:varbinary).first.last[:type].must_equal :blob
1831
- @db.schema(:enum).first.last[:type].must_equal :enum
1832
-
1833
- @db = Sequel.mock(:host=>'postgres')
1834
- @db.extend(sm)
1835
- @db.schema(:interval).first.last[:type].must_equal :interval
1836
- @db.schema(:citext).first.last[:type].must_equal :string
1837
-
1838
- @db = Sequel.mock(:host=>'mysql')
1839
- @db.extend(sm)
1840
- @db.schema(:set).first.last[:type].must_equal :set
1841
- @db.schema(:mediumint).first.last[:type].must_equal :integer
1842
- @db.schema(:mediumtext).first.last[:type].must_equal :string
1843
- end
1844
- end