sequel 3.21.0 → 3.36.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 (311) hide show
  1. data/CHANGELOG +855 -3
  2. data/MIT-LICENSE +1 -1
  3. data/README.rdoc +23 -7
  4. data/Rakefile +42 -24
  5. data/bin/sequel +26 -8
  6. data/doc/active_record.rdoc +1 -0
  7. data/doc/advanced_associations.rdoc +171 -11
  8. data/doc/association_basics.rdoc +293 -43
  9. data/doc/dataset_basics.rdoc +5 -5
  10. data/doc/dataset_filtering.rdoc +8 -0
  11. data/doc/mass_assignment.rdoc +56 -0
  12. data/doc/migration.rdoc +85 -552
  13. data/doc/model_hooks.rdoc +78 -27
  14. data/doc/object_model.rdoc +541 -0
  15. data/doc/opening_databases.rdoc +97 -50
  16. data/doc/prepared_statements.rdoc +40 -14
  17. data/doc/querying.rdoc +28 -4
  18. data/doc/reflection.rdoc +30 -4
  19. data/doc/release_notes/3.22.0.txt +39 -0
  20. data/doc/release_notes/3.23.0.txt +172 -0
  21. data/doc/release_notes/3.24.0.txt +420 -0
  22. data/doc/release_notes/3.25.0.txt +88 -0
  23. data/doc/release_notes/3.26.0.txt +88 -0
  24. data/doc/release_notes/3.27.0.txt +82 -0
  25. data/doc/release_notes/3.28.0.txt +304 -0
  26. data/doc/release_notes/3.29.0.txt +459 -0
  27. data/doc/release_notes/3.30.0.txt +135 -0
  28. data/doc/release_notes/3.31.0.txt +146 -0
  29. data/doc/release_notes/3.32.0.txt +202 -0
  30. data/doc/release_notes/3.33.0.txt +157 -0
  31. data/doc/release_notes/3.34.0.txt +671 -0
  32. data/doc/release_notes/3.35.0.txt +144 -0
  33. data/doc/release_notes/3.36.0.txt +245 -0
  34. data/doc/schema_modification.rdoc +572 -0
  35. data/doc/sharding.rdoc +95 -3
  36. data/doc/testing.rdoc +129 -0
  37. data/doc/thread_safety.rdoc +17 -0
  38. data/doc/transactions.rdoc +137 -0
  39. data/doc/virtual_rows.rdoc +51 -2
  40. data/lib/sequel/adapters/ado/mssql.rb +18 -6
  41. data/lib/sequel/adapters/ado.rb +40 -18
  42. data/lib/sequel/adapters/amalgalite.rb +17 -9
  43. data/lib/sequel/adapters/db2.rb +175 -86
  44. data/lib/sequel/adapters/dbi.rb +15 -15
  45. data/lib/sequel/adapters/do/mysql.rb +17 -11
  46. data/lib/sequel/adapters/do/postgres.rb +1 -57
  47. data/lib/sequel/adapters/do/sqlite.rb +0 -10
  48. data/lib/sequel/adapters/do.rb +18 -36
  49. data/lib/sequel/adapters/firebird.rb +27 -208
  50. data/lib/sequel/adapters/ibmdb.rb +453 -0
  51. data/lib/sequel/adapters/informix.rb +6 -23
  52. data/lib/sequel/adapters/jdbc/as400.rb +16 -34
  53. data/lib/sequel/adapters/jdbc/db2.rb +47 -0
  54. data/lib/sequel/adapters/jdbc/derby.rb +287 -0
  55. data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
  56. data/lib/sequel/adapters/jdbc/h2.rb +73 -31
  57. data/lib/sequel/adapters/jdbc/hsqldb.rb +184 -0
  58. data/lib/sequel/adapters/jdbc/informix.rb +21 -0
  59. data/lib/sequel/adapters/jdbc/jtds.rb +29 -0
  60. data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
  61. data/lib/sequel/adapters/jdbc/mysql.rb +7 -24
  62. data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
  63. data/lib/sequel/adapters/jdbc/postgresql.rb +58 -48
  64. data/lib/sequel/adapters/jdbc/progress.rb +21 -0
  65. data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
  66. data/lib/sequel/adapters/jdbc/sqlserver.rb +66 -0
  67. data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
  68. data/lib/sequel/adapters/jdbc.rb +265 -94
  69. data/lib/sequel/adapters/mock.rb +361 -0
  70. data/lib/sequel/adapters/mysql.rb +118 -222
  71. data/lib/sequel/adapters/mysql2.rb +58 -57
  72. data/lib/sequel/adapters/odbc/mssql.rb +15 -7
  73. data/lib/sequel/adapters/odbc.rb +28 -9
  74. data/lib/sequel/adapters/openbase.rb +3 -5
  75. data/lib/sequel/adapters/oracle.rb +349 -53
  76. data/lib/sequel/adapters/postgres.rb +356 -107
  77. data/lib/sequel/adapters/shared/access.rb +32 -9
  78. data/lib/sequel/adapters/shared/db2.rb +342 -0
  79. data/lib/sequel/adapters/shared/firebird.rb +221 -0
  80. data/lib/sequel/adapters/shared/informix.rb +53 -0
  81. data/lib/sequel/adapters/shared/mssql.rb +335 -118
  82. data/lib/sequel/adapters/shared/mysql.rb +340 -76
  83. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +155 -0
  84. data/lib/sequel/adapters/shared/oracle.rb +243 -45
  85. data/lib/sequel/adapters/shared/postgres.rb +524 -279
  86. data/lib/sequel/adapters/shared/progress.rb +5 -8
  87. data/lib/sequel/adapters/shared/sqlite.rb +265 -89
  88. data/lib/sequel/adapters/sqlite.rb +101 -39
  89. data/lib/sequel/adapters/swift/mysql.rb +9 -12
  90. data/lib/sequel/adapters/swift/postgres.rb +9 -74
  91. data/lib/sequel/adapters/swift/sqlite.rb +8 -6
  92. data/lib/sequel/adapters/swift.rb +8 -7
  93. data/lib/sequel/adapters/tinytds.rb +161 -21
  94. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +66 -0
  95. data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
  96. data/lib/sequel/ast_transformer.rb +194 -0
  97. data/lib/sequel/connection_pool/sharded_single.rb +11 -1
  98. data/lib/sequel/connection_pool/sharded_threaded.rb +28 -2
  99. data/lib/sequel/connection_pool/single.rb +5 -0
  100. data/lib/sequel/connection_pool/threaded.rb +38 -14
  101. data/lib/sequel/connection_pool.rb +10 -2
  102. data/lib/sequel/core.rb +118 -11
  103. data/lib/sequel/database/connecting.rb +38 -28
  104. data/lib/sequel/database/dataset.rb +4 -4
  105. data/lib/sequel/database/dataset_defaults.rb +63 -2
  106. data/lib/sequel/database/logging.rb +7 -2
  107. data/lib/sequel/database/misc.rb +150 -46
  108. data/lib/sequel/database/query.rb +215 -65
  109. data/lib/sequel/database/schema_generator.rb +64 -20
  110. data/lib/sequel/database/schema_methods.rb +212 -54
  111. data/lib/sequel/dataset/actions.rb +322 -85
  112. data/lib/sequel/dataset/features.rb +96 -8
  113. data/lib/sequel/dataset/graph.rb +38 -11
  114. data/lib/sequel/dataset/misc.rb +50 -23
  115. data/lib/sequel/dataset/mutation.rb +12 -7
  116. data/lib/sequel/dataset/prepared_statements.rb +68 -30
  117. data/lib/sequel/dataset/query.rb +237 -44
  118. data/lib/sequel/dataset/sql.rb +698 -278
  119. data/lib/sequel/dataset.rb +8 -0
  120. data/lib/sequel/exceptions.rb +4 -0
  121. data/lib/sequel/extensions/_pretty_table.rb +79 -0
  122. data/lib/sequel/extensions/arbitrary_servers.rb +108 -0
  123. data/lib/sequel/extensions/columns_introspection.rb +61 -0
  124. data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +16 -34
  125. data/lib/sequel/extensions/migration.rb +97 -11
  126. data/lib/sequel/extensions/named_timezones.rb +5 -0
  127. data/lib/sequel/extensions/null_dataset.rb +90 -0
  128. data/lib/sequel/extensions/pg_array.rb +460 -0
  129. data/lib/sequel/extensions/pg_array_ops.rb +220 -0
  130. data/lib/sequel/extensions/pg_auto_parameterize.rb +169 -0
  131. data/lib/sequel/extensions/pg_hstore.rb +296 -0
  132. data/lib/sequel/extensions/pg_hstore_ops.rb +259 -0
  133. data/lib/sequel/extensions/pg_inet.rb +89 -0
  134. data/lib/sequel/extensions/pg_json.rb +178 -0
  135. data/lib/sequel/extensions/pg_statement_cache.rb +316 -0
  136. data/lib/sequel/extensions/pretty_table.rb +5 -71
  137. data/lib/sequel/extensions/query.rb +1 -1
  138. data/lib/sequel/extensions/query_literals.rb +79 -0
  139. data/lib/sequel/extensions/schema_caching.rb +76 -0
  140. data/lib/sequel/extensions/schema_dumper.rb +251 -37
  141. data/lib/sequel/extensions/select_remove.rb +35 -0
  142. data/lib/sequel/extensions/server_block.rb +139 -0
  143. data/lib/sequel/extensions/sql_expr.rb +4 -110
  144. data/lib/sequel/extensions/thread_local_timezones.rb +1 -1
  145. data/lib/sequel/extensions/to_dot.rb +95 -83
  146. data/lib/sequel/model/associations.rb +1187 -393
  147. data/lib/sequel/model/base.rb +578 -170
  148. data/lib/sequel/model/errors.rb +1 -1
  149. data/lib/sequel/model/exceptions.rb +5 -1
  150. data/lib/sequel/model/inflections.rb +1 -1
  151. data/lib/sequel/model.rb +30 -11
  152. data/lib/sequel/no_core_ext.rb +2 -0
  153. data/lib/sequel/plugins/active_model.rb +13 -1
  154. data/lib/sequel/plugins/association_pks.rb +22 -4
  155. data/lib/sequel/plugins/caching.rb +25 -18
  156. data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
  157. data/lib/sequel/plugins/composition.rb +44 -12
  158. data/lib/sequel/plugins/dataset_associations.rb +100 -0
  159. data/lib/sequel/plugins/defaults_setter.rb +58 -0
  160. data/lib/sequel/plugins/dirty.rb +214 -0
  161. data/lib/sequel/plugins/eager_each.rb +59 -0
  162. data/lib/sequel/plugins/force_encoding.rb +6 -6
  163. data/lib/sequel/plugins/hook_class_methods.rb +1 -1
  164. data/lib/sequel/plugins/identity_map.rb +123 -8
  165. data/lib/sequel/plugins/instance_filters.rb +10 -0
  166. data/lib/sequel/plugins/instance_hooks.rb +1 -1
  167. data/lib/sequel/plugins/json_serializer.rb +58 -6
  168. data/lib/sequel/plugins/list.rb +12 -2
  169. data/lib/sequel/plugins/many_through_many.rb +79 -28
  170. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
  171. data/lib/sequel/plugins/nested_attributes.rb +139 -63
  172. data/lib/sequel/plugins/optimistic_locking.rb +8 -0
  173. data/lib/sequel/plugins/prepared_statements.rb +167 -0
  174. data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
  175. data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
  176. data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
  177. data/lib/sequel/plugins/rcte_tree.rb +29 -15
  178. data/lib/sequel/plugins/schema.rb +7 -2
  179. data/lib/sequel/plugins/serialization.rb +98 -49
  180. data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
  181. data/lib/sequel/plugins/sharding.rb +21 -54
  182. data/lib/sequel/plugins/single_table_inheritance.rb +5 -3
  183. data/lib/sequel/plugins/static_cache.rb +99 -0
  184. data/lib/sequel/plugins/subclasses.rb +10 -2
  185. data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
  186. data/lib/sequel/plugins/timestamps.rb +1 -1
  187. data/lib/sequel/plugins/typecast_on_load.rb +9 -12
  188. data/lib/sequel/plugins/update_primary_key.rb +2 -2
  189. data/lib/sequel/plugins/validation_class_methods.rb +1 -1
  190. data/lib/sequel/plugins/xml_serializer.rb +15 -4
  191. data/lib/sequel/sql.rb +526 -59
  192. data/lib/sequel/timezones.rb +57 -38
  193. data/lib/sequel/version.rb +1 -1
  194. data/spec/adapters/db2_spec.rb +146 -0
  195. data/spec/adapters/firebird_spec.rb +1 -1
  196. data/spec/adapters/mssql_spec.rb +142 -40
  197. data/spec/adapters/mysql_spec.rb +380 -234
  198. data/spec/adapters/oracle_spec.rb +67 -77
  199. data/spec/adapters/postgres_spec.rb +1050 -212
  200. data/spec/adapters/spec_helper.rb +8 -5
  201. data/spec/adapters/sqlite_spec.rb +139 -27
  202. data/spec/core/connection_pool_spec.rb +196 -93
  203. data/spec/core/database_spec.rb +879 -510
  204. data/spec/core/dataset_spec.rb +1415 -1086
  205. data/spec/core/expression_filters_spec.rb +554 -109
  206. data/spec/core/mock_adapter_spec.rb +449 -0
  207. data/spec/core/object_graph_spec.rb +86 -114
  208. data/spec/core/schema_generator_spec.rb +4 -4
  209. data/spec/core/schema_spec.rb +482 -38
  210. data/spec/core/spec_helper.rb +6 -48
  211. data/spec/extensions/active_model_spec.rb +13 -0
  212. data/spec/extensions/arbitrary_servers_spec.rb +110 -0
  213. data/spec/extensions/association_autoreloading_spec.rb +18 -10
  214. data/spec/extensions/association_dependencies_spec.rb +15 -25
  215. data/spec/extensions/association_pks_spec.rb +66 -32
  216. data/spec/extensions/association_proxies_spec.rb +4 -4
  217. data/spec/extensions/caching_spec.rb +47 -51
  218. data/spec/extensions/class_table_inheritance_spec.rb +31 -83
  219. data/spec/extensions/columns_introspection_spec.rb +91 -0
  220. data/spec/extensions/composition_spec.rb +18 -13
  221. data/spec/{core/core_sql_spec.rb → extensions/core_extensions_spec.rb} +119 -139
  222. data/spec/extensions/dataset_associations_spec.rb +199 -0
  223. data/spec/extensions/defaults_setter_spec.rb +64 -0
  224. data/spec/extensions/dirty_spec.rb +155 -0
  225. data/spec/extensions/eager_each_spec.rb +34 -0
  226. data/spec/extensions/force_encoding_spec.rb +4 -2
  227. data/spec/extensions/hook_class_methods_spec.rb +69 -92
  228. data/spec/extensions/identity_map_spec.rb +131 -22
  229. data/spec/extensions/inflector_spec.rb +0 -4
  230. data/spec/extensions/instance_filters_spec.rb +11 -21
  231. data/spec/extensions/instance_hooks_spec.rb +72 -0
  232. data/spec/extensions/json_serializer_spec.rb +49 -6
  233. data/spec/extensions/lazy_attributes_spec.rb +16 -20
  234. data/spec/extensions/list_spec.rb +48 -39
  235. data/spec/extensions/many_through_many_spec.rb +283 -250
  236. data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
  237. data/spec/extensions/migration_spec.rb +140 -35
  238. data/spec/extensions/named_timezones_spec.rb +29 -11
  239. data/spec/extensions/nested_attributes_spec.rb +251 -89
  240. data/spec/extensions/null_dataset_spec.rb +85 -0
  241. data/spec/extensions/optimistic_locking_spec.rb +24 -21
  242. data/spec/extensions/pg_array_ops_spec.rb +105 -0
  243. data/spec/extensions/pg_array_spec.rb +196 -0
  244. data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
  245. data/spec/extensions/pg_hstore_ops_spec.rb +136 -0
  246. data/spec/extensions/pg_hstore_spec.rb +195 -0
  247. data/spec/extensions/pg_inet_spec.rb +44 -0
  248. data/spec/extensions/pg_json_spec.rb +101 -0
  249. data/spec/extensions/pg_statement_cache_spec.rb +209 -0
  250. data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
  251. data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
  252. data/spec/extensions/prepared_statements_spec.rb +87 -0
  253. data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
  254. data/spec/extensions/pretty_table_spec.rb +7 -6
  255. data/spec/extensions/query_literals_spec.rb +168 -0
  256. data/spec/extensions/query_spec.rb +6 -0
  257. data/spec/extensions/rcte_tree_spec.rb +50 -43
  258. data/spec/extensions/schema_caching_spec.rb +41 -0
  259. data/spec/extensions/schema_dumper_spec.rb +429 -22
  260. data/spec/extensions/schema_spec.rb +25 -21
  261. data/spec/extensions/select_remove_spec.rb +38 -0
  262. data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
  263. data/spec/extensions/serialization_spec.rb +85 -43
  264. data/spec/extensions/server_block_spec.rb +90 -0
  265. data/spec/extensions/sharding_spec.rb +69 -143
  266. data/spec/extensions/single_table_inheritance_spec.rb +23 -29
  267. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  268. data/spec/extensions/spec_helper.rb +22 -61
  269. data/spec/extensions/sql_expr_spec.rb +29 -60
  270. data/spec/extensions/static_cache_spec.rb +145 -0
  271. data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
  272. data/spec/extensions/thread_local_timezones_spec.rb +22 -2
  273. data/spec/extensions/timestamps_spec.rb +6 -6
  274. data/spec/extensions/to_dot_spec.rb +4 -7
  275. data/spec/extensions/touch_spec.rb +13 -14
  276. data/spec/extensions/tree_spec.rb +11 -26
  277. data/spec/extensions/typecast_on_load_spec.rb +9 -6
  278. data/spec/extensions/update_primary_key_spec.rb +30 -24
  279. data/spec/extensions/validation_class_methods_spec.rb +30 -51
  280. data/spec/extensions/validation_helpers_spec.rb +16 -35
  281. data/spec/extensions/xml_serializer_spec.rb +29 -4
  282. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
  283. data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
  284. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
  285. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
  286. data/spec/integration/associations_test.rb +659 -21
  287. data/spec/integration/database_test.rb +9 -3
  288. data/spec/integration/dataset_test.rb +605 -91
  289. data/spec/integration/eager_loader_test.rb +19 -21
  290. data/spec/integration/migrator_test.rb +2 -3
  291. data/spec/integration/model_test.rb +81 -2
  292. data/spec/integration/plugin_test.rb +454 -143
  293. data/spec/integration/prepared_statement_test.rb +263 -128
  294. data/spec/integration/schema_test.rb +309 -43
  295. data/spec/integration/spec_helper.rb +40 -30
  296. data/spec/integration/timezone_test.rb +38 -12
  297. data/spec/integration/transaction_test.rb +183 -8
  298. data/spec/integration/type_test.rb +18 -4
  299. data/spec/model/association_reflection_spec.rb +201 -7
  300. data/spec/model/associations_spec.rb +1067 -661
  301. data/spec/model/base_spec.rb +329 -95
  302. data/spec/model/dataset_methods_spec.rb +7 -27
  303. data/spec/model/eager_loading_spec.rb +677 -676
  304. data/spec/model/hooks_spec.rb +349 -67
  305. data/spec/model/model_spec.rb +240 -168
  306. data/spec/model/plugins_spec.rb +24 -13
  307. data/spec/model/record_spec.rb +490 -232
  308. data/spec/model/spec_helper.rb +14 -71
  309. data/spec/model/validations_spec.rb +11 -0
  310. data/spec/rcov.opts +2 -0
  311. metadata +178 -80
@@ -0,0 +1,41 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
+
3
+ describe "schema_caching extension" do
4
+ before do
5
+ @db = Sequel.mock
6
+ @schemas = {'"table"'=>[[:column, {:db_type=>"integer", :default=>"nextval('table_id_seq'::regclass)", :allow_null=>false, :primary_key=>true, :type=>:integer, :ruby_default=>nil}]]}
7
+ @filename = "spec/files/test_schema_#$$.dump"
8
+ @db.instance_variable_set(:@schemas, @schemas)
9
+ end
10
+ after do
11
+ File.delete(@filename) if File.exist?(@filename)
12
+ end
13
+
14
+ it "Database#dump_schema_cache should dump cached schema to the given file" do
15
+ File.exist?(@filename).should be_false
16
+ @db.dump_schema_cache(@filename)
17
+ File.exist?(@filename).should be_true
18
+ File.size(@filename).should > 0
19
+ end
20
+
21
+ it "Database#load_schema_cache should load cached schema from the given file dumped by #dump_schema_cache" do
22
+ @db.dump_schema_cache(@filename)
23
+ db = Sequel::Database.new
24
+ db.load_schema_cache(@filename)
25
+ @db.instance_variable_get(:@schemas).should == @schemas
26
+ end
27
+
28
+ it "Database#dump_schema_cache? should dump cached schema to the given file unless the file exists" do
29
+ File.open(@filename, 'wb'){|f|}
30
+ File.size(@filename).should == 0
31
+ @db.dump_schema_cache?(@filename)
32
+ File.size(@filename).should == 0
33
+ end
34
+
35
+ it "Database#load_schema_cache? should load cached schema from the given file if it exists" do
36
+ db = Sequel::Database.new
37
+ File.exist?(@filename).should be_false
38
+ db.load_schema_cache?(@filename)
39
+ db.instance_variable_get(:@schemas).should == {}
40
+ end
41
+ end
@@ -43,19 +43,17 @@ describe "Sequel::Schema::Generator dump methods" do
43
43
  index [:b, :c], :unique=>true
44
44
  end
45
45
 
46
- t = <<END_CODE
46
+ g.dump_indexes(:add_index=>:t).should == (<<END_CODE).strip
47
47
  add_index :t, [:a]
48
48
  add_index :t, [:c, :e], :name=>:blah
49
49
  add_index :t, [:b, :c], :unique=>true
50
50
  END_CODE
51
- g.dump_indexes(:add_index=>:t).should == t.strip
52
51
 
53
- t = <<END_CODE
54
- drop_index :t, [:a]
55
- drop_index :t, [:c, :e], :name=>:blah
52
+ g.dump_indexes(:drop_index=>:t).should == (<<END_CODE).strip
56
53
  drop_index :t, [:b, :c], :unique=>true
54
+ drop_index :t, [:c, :e], :name=>:blah
55
+ drop_index :t, [:a]
57
56
  END_CODE
58
- g.dump_indexes(:drop_index=>:t).should == t.strip
59
57
  end
60
58
 
61
59
  it "should raise an error if you try to dump a Generator that uses a constraint with a proc" do
@@ -75,15 +73,8 @@ describe "Sequel::Database dump methods" do
75
73
  when :t2
76
74
  [[:c1, {:db_type=>'integer', :primary_key=>true, :allow_null=>false}],
77
75
  [:c2, {:db_type=>'numeric', :primary_key=>true, :allow_null=>false}]]
78
- when :t3
79
- [[:c1, {:db_type=>'date', :default=>"'now()'", :allow_null=>true}],
80
- [:c2, {:db_type=>'datetime', :allow_null=>false}]]
81
76
  when :t5
82
77
  [[:c1, {:db_type=>'blahblah', :allow_null=>true}]]
83
- when :t6
84
- [[:c1, {:db_type=>'bigint', :primary_key=>true, :allow_null=>true}]]
85
- when :t7
86
- [[:c1, {:db_type=>'somedbspecifictype', :primary_key=>true, :allow_null=>false}]]
87
78
  end
88
79
  end
89
80
  end
@@ -101,10 +92,73 @@ describe "Sequel::Database dump methods" do
101
92
  end
102
93
 
103
94
  it "should dump non-Integer primary key columns with explicit :type" do
95
+ @d.meta_def(:schema){|*s| [[:c1, {:db_type=>'bigint', :primary_key=>true, :allow_null=>true}]]}
104
96
  @d.dump_table_schema(:t6).should == "create_table(:t6) do\n primary_key :c1, :type=>Bignum\nend"
105
97
  end
106
98
 
99
+ it "should handle foreign keys" do
100
+ @d.meta_def(:schema){|*s| [[:c1, {:db_type=>'integer', :allow_null=>true}]]}
101
+ @d.meta_def(:foreign_key_list){|*s| [{:columns=>[:c1], :table=>:t2, :key=>[:c2]}]}
102
+ @d.dump_table_schema(:t6).should == "create_table(:t6) do\n foreign_key :c1, :t2, :key=>[:c2]\nend"
103
+ end
104
+
105
+ it "should handle primary keys that are also foreign keys" do
106
+ @d.meta_def(:schema){|*s| [[:c1, {:db_type=>'integer', :primary_key=>true, :allow_null=>true}]]}
107
+ @d.meta_def(:foreign_key_list){|*s| [{:columns=>[:c1], :table=>:t2, :key=>[:c2]}]}
108
+ s = @d.dump_table_schema(:t6)
109
+ s.should =~ /create_table\(:t6\) do\n primary_key :c1, /
110
+ s.should =~ /:table=>:t2/
111
+ s.should =~ /:key=>\[:c2\]/
112
+ end
113
+
114
+ it "should handle foreign key options" do
115
+ @d.meta_def(:schema){|*s| [[:c1, {:db_type=>'integer', :allow_null=>true}]]}
116
+ @d.meta_def(:foreign_key_list){|*s| [{:columns=>[:c1], :table=>:t2, :key=>[:c2], :on_delete=>:restrict, :on_update=>:set_null, :deferrable=>true}]}
117
+ s = @d.dump_table_schema(:t6)
118
+ s.should =~ /create_table\(:t6\) do\n foreign_key :c1, :t2, /
119
+ s.should =~ /:key=>\[:c2\]/
120
+ s.should =~ /:on_delete=>:restrict/
121
+ s.should =~ /:on_update=>:set_null/
122
+ s.should =~ /:deferrable=>true/
123
+ end
124
+
125
+ it "should handle foreign key options in the primary key" do
126
+ @d.meta_def(:schema){|*s| [[:c1, {:db_type=>'integer', :primary_key=>true, :allow_null=>true}]]}
127
+ @d.meta_def(:foreign_key_list){|*s| [{:columns=>[:c1], :table=>:t2, :key=>[:c2], :on_delete=>:restrict, :on_update=>:set_null, :deferrable=>true}]}
128
+ s = @d.dump_table_schema(:t6)
129
+ s.should =~ /create_table\(:t6\) do\n primary_key :c1, /
130
+ s.should =~ /:table=>:t2/
131
+ s.should =~ /:key=>\[:c2\]/
132
+ s.should =~ /:on_delete=>:restrict/
133
+ s.should =~ /:on_update=>:set_null/
134
+ s.should =~ /:deferrable=>true/
135
+ end
136
+
137
+ it "should omit foreign key options that are the same as defaults" do
138
+ @d.meta_def(:schema){|*s| [[:c1, {:db_type=>'integer', :allow_null=>true}]]}
139
+ @d.meta_def(:foreign_key_list){|*s| [{:columns=>[:c1], :table=>:t2, :key=>[:c2], :on_delete=>:no_action, :on_update=>:no_action, :deferrable=>false}]}
140
+ s = @d.dump_table_schema(:t6)
141
+ s.should =~ /create_table\(:t6\) do\n foreign_key :c1, :t2, /
142
+ s.should =~ /:key=>\[:c2\]/
143
+ s.should_not =~ /:on_delete/
144
+ s.should_not =~ /:on_update/
145
+ s.should_not =~ /:deferrable/
146
+ end
147
+
148
+ it "should omit foreign key options that are the same as defaults in the primary key" do
149
+ @d.meta_def(:schema){|*s| [[:c1, {:db_type=>'integer', :primary_key=>true, :allow_null=>true}]]}
150
+ @d.meta_def(:foreign_key_list){|*s| [{:columns=>[:c1], :table=>:t2, :key=>[:c2], :on_delete=>:no_action, :on_update=>:no_action, :deferrable=>false}]}
151
+ s = @d.dump_table_schema(:t6)
152
+ s.should =~ /create_table\(:t6\) do\n primary_key :c1, /
153
+ s.should =~ /:table=>:t2/
154
+ s.should =~ /:key=>\[:c2\]/
155
+ s.should_not =~ /:on_delete/
156
+ s.should_not =~ /:on_update/
157
+ s.should_not =~ /:deferrable/
158
+ end
159
+
107
160
  it "should dump primary key columns with explicit :type equal to the database type when :same_db option is passed" do
161
+ @d.meta_def(:schema){|*s| [[:c1, {:db_type=>'somedbspecifictype', :primary_key=>true, :allow_null=>false}]]}
108
162
  @d.dump_table_schema(:t7, :same_db => true).should == "create_table(:t7) do\n primary_key :c1, :type=>\"somedbspecifictype\"\nend"
109
163
  end
110
164
 
@@ -112,6 +166,12 @@ describe "Sequel::Database dump methods" do
112
166
  @d.dump_table_schema(:t2).should == "create_table(:t2) do\n Integer :c1, :null=>false\n BigDecimal :c2, :null=>false\n \n primary_key [:c1, :c2]\nend"
113
167
  end
114
168
 
169
+ it "should use a composite foreign_key calls if there is a composite foreign key" do
170
+ @d.meta_def(:schema){|*s| [[:c1, {:db_type=>'integer'}], [:c2, {:db_type=>'integer'}]]}
171
+ @d.meta_def(:foreign_key_list){|*s| [{:columns=>[:c1, :c2], :table=>:t2, :key=>[:c3, :c4]}]}
172
+ @d.dump_table_schema(:t1).should == "create_table(:t1) do\n Integer :c1\n Integer :c2\n \n foreign_key [:c1, :c2], :t2, :key=>[:c3, :c4]\nend"
173
+ end
174
+
115
175
  it "should include index information if available" do
116
176
  @d.meta_def(:indexes) do |t|
117
177
  {:i1=>{:columns=>[:c1], :unique=>false},
@@ -138,7 +198,7 @@ Sequel.migration do
138
198
  end
139
199
 
140
200
  down do
141
- drop_table(:t1, :t2)
201
+ drop_table(:t2, :t1)
142
202
  end
143
203
  end
144
204
  END_MIG
@@ -162,6 +222,92 @@ Sequel.migration do
162
222
  end
163
223
  end
164
224
 
225
+ down do
226
+ drop_table(:t2, :t1)
227
+ end
228
+ end
229
+ END_MIG
230
+ end
231
+
232
+ it "should sort table names topologically when dumping a migration with foreign keys" do
233
+ @d.meta_def(:tables){|o| [:t1, :t2]}
234
+ @d.meta_def(:schema) do |t|
235
+ t == :t1 ? [[:c2, {:db_type=>'integer'}]] : [[:c1, {:db_type=>'integer', :primary_key=>true}]]
236
+ end
237
+ @d.meta_def(:foreign_key_list) do |t|
238
+ t == :t1 ? [{:columns=>[:c2], :table=>:t2, :key=>[:c1]}] : []
239
+ end
240
+ @d.dump_schema_migration.should == <<-END_MIG
241
+ Sequel.migration do
242
+ up do
243
+ create_table(:t2) do
244
+ primary_key :c1
245
+ end
246
+
247
+ create_table(:t1) do
248
+ foreign_key :c2, :t2, :key=>[:c1]
249
+ end
250
+ end
251
+
252
+ down do
253
+ drop_table(:t1, :t2)
254
+ end
255
+ end
256
+ END_MIG
257
+ end
258
+
259
+ it "should handle circular dependencies when dumping a migration with foreign keys" do
260
+ @d.meta_def(:tables){|o| [:t1, :t2]}
261
+ @d.meta_def(:schema) do |t|
262
+ t == :t1 ? [[:c2, {:db_type=>'integer'}]] : [[:c1, {:db_type=>'integer'}]]
263
+ end
264
+ @d.meta_def(:foreign_key_list) do |t|
265
+ t == :t1 ? [{:columns=>[:c2], :table=>:t2, :key=>[:c1]}] : [{:columns=>[:c1], :table=>:t1, :key=>[:c2]}]
266
+ end
267
+ @d.dump_schema_migration.should == <<-END_MIG
268
+ Sequel.migration do
269
+ up do
270
+ create_table(:t1) do
271
+ Integer :c2
272
+ end
273
+
274
+ create_table(:t2) do
275
+ foreign_key :c1, :t1, :key=>[:c2]
276
+ end
277
+
278
+ alter_table(:t1) do
279
+ add_foreign_key [:c2], :t2, :key=>[:c1]
280
+ end
281
+ end
282
+
283
+ down do
284
+ drop_table(:t2, :t1)
285
+ end
286
+ end
287
+ END_MIG
288
+ end
289
+
290
+ it "should sort topologically even if the database raises an error when trying to parse foreign keys for a non-existent table" do
291
+ @d.meta_def(:tables){|o| [:t1, :t2]}
292
+ @d.meta_def(:schema) do |t|
293
+ t == :t1 ? [[:c2, {:db_type=>'integer'}]] : [[:c1, {:db_type=>'integer', :primary_key=>true}]]
294
+ end
295
+ @d.meta_def(:foreign_key_list) do |t|
296
+ raise Sequel::DatabaseError unless [:t1, :t2].include?(t)
297
+ t == :t1 ? [{:columns=>[:c2], :table=>:t2, :key=>[:c1]}] : []
298
+ end
299
+ @d.dump_schema_migration.should == <<-END_MIG
300
+ Sequel.migration do
301
+ up do
302
+ create_table(:t2) do
303
+ primary_key :c1
304
+ end
305
+
306
+ create_table(:t1) do
307
+ foreign_key :c2, :t2, :key=>[:c1]
308
+ end
309
+ end
310
+
165
311
  down do
166
312
  drop_table(:t1, :t2)
167
313
  end
@@ -188,7 +334,113 @@ Sequel.migration do
188
334
  end
189
335
 
190
336
  down do
191
- drop_table(:t1, :t2)
337
+ drop_table(:t2, :t1)
338
+ end
339
+ end
340
+ END_MIG
341
+ end
342
+
343
+ it "should honor the :index_names => false option to not include names of indexes" do
344
+ @d.meta_def(:indexes) do |t|
345
+ {:i1=>{:columns=>[:c1], :unique=>false},
346
+ :t1_c2_c1_index=>{:columns=>[:c2, :c1], :unique=>true}}
347
+ end
348
+ @d.dump_table_schema(:t1, :index_names=>false).should == "create_table(:t1, :ignore_index_errors=>true) do\n primary_key :c1\n String :c2, :size=>20\n \n index [:c1]\n index [:c2, :c1], :unique=>true\nend"
349
+ @d.dump_schema_migration(:index_names=>false).should == <<-END_MIG
350
+ Sequel.migration do
351
+ up do
352
+ create_table(:t1, :ignore_index_errors=>true) do
353
+ primary_key :c1
354
+ String :c2, :size=>20
355
+
356
+ index [:c1]
357
+ index [:c2, :c1], :unique=>true
358
+ end
359
+
360
+ create_table(:t2, :ignore_index_errors=>true) do
361
+ Integer :c1, :null=>false
362
+ BigDecimal :c2, :null=>false
363
+
364
+ primary_key [:c1, :c2]
365
+
366
+ index [:c1]
367
+ index [:c2, :c1], :unique=>true
368
+ end
369
+ end
370
+
371
+ down do
372
+ drop_table(:t2, :t1)
373
+ end
374
+ end
375
+ END_MIG
376
+ end
377
+
378
+ it "should make :index_names => :namespace option a noop if there is a global index namespace" do
379
+ @d.meta_def(:indexes) do |t|
380
+ {:i1=>{:columns=>[:c1], :unique=>false},
381
+ :t1_c2_c1_index=>{:columns=>[:c2, :c1], :unique=>false}}
382
+ end
383
+ @d.dump_table_schema(:t1, :index_names=>:namespace).should == "create_table(:t1, :ignore_index_errors=>true) do\n primary_key :c1\n String :c2, :size=>20\n \n index [:c1], :name=>:i1\n index [:c2, :c1]\nend"
384
+ @d.dump_schema_migration(:index_names=>:namespace).should == <<-END_MIG
385
+ Sequel.migration do
386
+ up do
387
+ create_table(:t1, :ignore_index_errors=>true) do
388
+ primary_key :c1
389
+ String :c2, :size=>20
390
+
391
+ index [:c1], :name=>:i1
392
+ index [:c2, :c1]
393
+ end
394
+
395
+ create_table(:t2, :ignore_index_errors=>true) do
396
+ Integer :c1, :null=>false
397
+ BigDecimal :c2, :null=>false
398
+
399
+ primary_key [:c1, :c2]
400
+
401
+ index [:c1], :name=>:i1
402
+ index [:c2, :c1], :name=>:t1_c2_c1_index
403
+ end
404
+ end
405
+
406
+ down do
407
+ drop_table(:t2, :t1)
408
+ end
409
+ end
410
+ END_MIG
411
+ end
412
+
413
+ it "should honor the :index_names => :namespace option to include names of indexes with prepended table name if there is no global index namespace" do
414
+ @d.meta_def(:global_index_namespace?){false}
415
+ @d.meta_def(:indexes) do |t|
416
+ {:i1=>{:columns=>[:c1], :unique=>false},
417
+ :t1_c2_c1_index=>{:columns=>[:c2, :c1], :unique=>false}}
418
+ end
419
+ @d.dump_table_schema(:t1, :index_names=>:namespace).should == "create_table(:t1, :ignore_index_errors=>true) do\n primary_key :c1\n String :c2, :size=>20\n \n index [:c1], :name=>:t1_i1\n index [:c2, :c1]\nend"
420
+ @d.dump_schema_migration(:index_names=>:namespace).should == <<-END_MIG
421
+ Sequel.migration do
422
+ up do
423
+ create_table(:t1, :ignore_index_errors=>true) do
424
+ primary_key :c1
425
+ String :c2, :size=>20
426
+
427
+ index [:c1], :name=>:t1_i1
428
+ index [:c2, :c1]
429
+ end
430
+
431
+ create_table(:t2, :ignore_index_errors=>true) do
432
+ Integer :c1, :null=>false
433
+ BigDecimal :c2, :null=>false
434
+
435
+ primary_key [:c1, :c2]
436
+
437
+ index [:c1], :name=>:t2_i1
438
+ index [:c2, :c1], :name=>:t2_t1_c2_c1_index
439
+ end
440
+ end
441
+
442
+ down do
443
+ drop_table(:t2, :t1)
192
444
  end
193
445
  end
194
446
  END_MIG
@@ -217,12 +469,26 @@ Sequel.migration do
217
469
  end
218
470
 
219
471
  down do
220
- drop_table(:t1, :t2)
472
+ drop_table(:t2, :t1)
221
473
  end
222
474
  end
223
475
  END_MIG
224
476
  end
225
477
 
478
+ it "should have :indexes => false option disable foreign keys as well when dumping a whole migration" do
479
+ @d.meta_def(:foreign_key_list) do |t|
480
+ t == :t1 ? [{:columns=>[:c2], :table=>:t2, :key=>[:c1]}] : []
481
+ end
482
+ @d.dump_schema_migration(:indexes=>false).should_not =~ /foreign_key/
483
+ end
484
+
485
+ it "should have :foreign_keys option override :indexes => false disabling of foreign keys" do
486
+ @d.meta_def(:foreign_key_list) do |t|
487
+ t == :t1 ? [{:columns=>[:c2], :table=>:t2, :key=>[:c1]}] : []
488
+ end
489
+ @d.dump_schema_migration(:indexes=>false, :foreign_keys=>true).should =~ /foreign_key/
490
+ end
491
+
226
492
  it "should support dumping just indexes as a migration" do
227
493
  @d.meta_def(:tables){|o| [:t1]}
228
494
  @d.meta_def(:indexes) do |t|
@@ -237,14 +503,147 @@ Sequel.migration do
237
503
  end
238
504
 
239
505
  down do
506
+ drop_index :t1, [:c2, :c1], :ignore_errors=>true, :unique=>true
240
507
  drop_index :t1, [:c1], :ignore_errors=>true, :name=>:i1
508
+ end
509
+ end
510
+ END_MIG
511
+ end
512
+
513
+ it "should honor the :index_names => false option to not include names of indexes when dumping just indexes as a migration" do
514
+ @d.meta_def(:tables){|o| [:t1]}
515
+ @d.meta_def(:indexes) do |t|
516
+ {:i1=>{:columns=>[:c1], :unique=>false},
517
+ :t1_c2_c1_index=>{:columns=>[:c2, :c1], :unique=>true}}
518
+ end
519
+ @d.dump_indexes_migration(:index_names=>false).should == <<-END_MIG
520
+ Sequel.migration do
521
+ up do
522
+ add_index :t1, [:c1], :ignore_errors=>true
523
+ add_index :t1, [:c2, :c1], :ignore_errors=>true, :unique=>true
524
+ end
525
+
526
+ down do
241
527
  drop_index :t1, [:c2, :c1], :ignore_errors=>true, :unique=>true
528
+ drop_index :t1, [:c1], :ignore_errors=>true
529
+ end
530
+ end
531
+ END_MIG
532
+ end
533
+
534
+ it "should honor the :index_names => :namespace option be a noop if there is a global index namespace" do
535
+ @d.meta_def(:tables){|o| [:t1, :t2]}
536
+ @d.meta_def(:indexes) do |t|
537
+ {:i1=>{:columns=>[:c1], :unique=>false},
538
+ :t1_c2_c1_index=>{:columns=>[:c2, :c1], :unique=>false}}
539
+ end
540
+ @d.dump_indexes_migration(:index_names=>:namespace).should == <<-END_MIG
541
+ Sequel.migration do
542
+ up do
543
+ add_index :t1, [:c1], :ignore_errors=>true, :name=>:i1
544
+ add_index :t1, [:c2, :c1], :ignore_errors=>true
545
+
546
+ add_index :t2, [:c1], :ignore_errors=>true, :name=>:i1
547
+ add_index :t2, [:c2, :c1], :ignore_errors=>true, :name=>:t1_c2_c1_index
548
+ end
549
+
550
+ down do
551
+ drop_index :t2, [:c2, :c1], :ignore_errors=>true, :name=>:t1_c2_c1_index
552
+ drop_index :t2, [:c1], :ignore_errors=>true, :name=>:i1
553
+
554
+ drop_index :t1, [:c2, :c1], :ignore_errors=>true
555
+ drop_index :t1, [:c1], :ignore_errors=>true, :name=>:i1
556
+ end
557
+ end
558
+ END_MIG
559
+ end
560
+
561
+ it "should honor the :index_names => :namespace option to include names of indexes with prepended table name when dumping just indexes as a migration if there is no global index namespace" do
562
+ @d.meta_def(:global_index_namespace?){false}
563
+ @d.meta_def(:tables){|o| [:t1, :t2]}
564
+ @d.meta_def(:indexes) do |t|
565
+ {:i1=>{:columns=>[:c1], :unique=>false},
566
+ :t1_c2_c1_index=>{:columns=>[:c2, :c1], :unique=>false}}
567
+ end
568
+ @d.dump_indexes_migration(:index_names=>:namespace).should == <<-END_MIG
569
+ Sequel.migration do
570
+ up do
571
+ add_index :t1, [:c1], :ignore_errors=>true, :name=>:t1_i1
572
+ add_index :t1, [:c2, :c1], :ignore_errors=>true
573
+
574
+ add_index :t2, [:c1], :ignore_errors=>true, :name=>:t2_i1
575
+ add_index :t2, [:c2, :c1], :ignore_errors=>true, :name=>:t2_t1_c2_c1_index
576
+ end
577
+
578
+ down do
579
+ drop_index :t2, [:c2, :c1], :ignore_errors=>true, :name=>:t2_t1_c2_c1_index
580
+ drop_index :t2, [:c1], :ignore_errors=>true, :name=>:t2_i1
581
+
582
+ drop_index :t1, [:c2, :c1], :ignore_errors=>true
583
+ drop_index :t1, [:c1], :ignore_errors=>true, :name=>:t1_i1
584
+ end
585
+ end
586
+ END_MIG
587
+ end
588
+
589
+ it "should handle missing index parsing support when dumping index migration" do
590
+ @d.meta_def(:tables){|o| [:t1]}
591
+ @d.dump_indexes_migration.should == <<-END_MIG
592
+ Sequel.migration do
593
+ up do
594
+
595
+ end
596
+
597
+ down do
598
+
599
+ end
600
+ end
601
+ END_MIG
602
+ end
603
+
604
+ it "should handle missing foreign key parsing support when dumping foreign key migration" do
605
+ @d.meta_def(:tables){|o| [:t1]}
606
+ @d.dump_foreign_key_migration.should == <<-END_MIG
607
+ Sequel.migration do
608
+ up do
609
+
610
+ end
611
+ end
612
+ END_MIG
613
+ end
614
+
615
+ it "should support dumping just foreign_keys as a migration" do
616
+ @d.meta_def(:tables){|o| [:t1, :t2, :t3]}
617
+ @d.meta_def(:schema) do |t|
618
+ t == :t1 ? [[:c2, {:db_type=>'integer'}]] : [[:c1, {:db_type=>'integer'}]]
619
+ end
620
+ @d.meta_def(:foreign_key_list) do |t, *a|
621
+ case t
622
+ when :t1
623
+ [{:columns=>[:c2], :table=>:t2, :key=>[:c1]}]
624
+ when :t2
625
+ [{:columns=>[:c1, :c3], :table=>:t1, :key=>[:c2, :c4]}]
626
+ else
627
+ []
628
+ end
629
+ end
630
+ @d.dump_foreign_key_migration.should == <<-END_MIG
631
+ Sequel.migration do
632
+ up do
633
+ alter_table(:t1) do
634
+ add_foreign_key [:c2], :t2, :key=>[:c1]
635
+ end
636
+
637
+ alter_table(:t2) do
638
+ add_foreign_key [:c1, :c3], :t1, :key=>[:c2, :c4]
639
+ end
242
640
  end
243
641
  end
244
642
  END_MIG
245
643
  end
246
644
 
247
645
  it "should handle not null values and defaults" do
646
+ @d.meta_def(:schema){|*s| [[:c1, {:db_type=>'date', :default=>"'now()'", :allow_null=>true}], [:c2, {:db_type=>'datetime', :allow_null=>false}]]}
248
647
  @d.dump_table_schema(:t3).should == "create_table(:t3) do\n Date :c1\n DateTime :c2, :null=>false\nend"
249
648
  end
250
649
 
@@ -263,8 +662,8 @@ END_MIG
263
662
  s.each{|_, c| c[:ruby_default] = column_schema_to_ruby_default(c[:default], c[:type])}
264
663
  s
265
664
  end
266
- @d.dump_table_schema(:t4).gsub(/[+-]\d\d:\d\d"\)/, '")').should == "create_table(:t4) do\n TrueClass :c1, :default=>false\n String :c2, :default=>\"blah\"\n Integer :c3, :default=>-1\n Float :c4, :default=>1.0\n BigDecimal :c5, :default=>BigDecimal.new(\"0.1005E3\")\n File :c6, :default=>Sequel::SQL::Blob.new(\"blah\")\n Date :c7, :default=>Date.parse(\"2008-10-29\")\n DateTime :c8, :default=>DateTime.parse(\"2008-10-29T10:20:30\")\n Time :c9, :default=>Time.parse(\"10:20:30\"), :only_time=>true\n String :c10\nend"
267
- @d.dump_table_schema(:t4, :same_db=>true).gsub(/[+-]\d\d:\d\d"\)/, '")').should == "create_table(:t4) do\n column :c1, \"boolean\", :default=>false\n column :c2, \"varchar\", :default=>\"blah\"\n column :c3, \"integer\", :default=>-1\n column :c4, \"float\", :default=>1.0\n column :c5, \"decimal\", :default=>BigDecimal.new(\"0.1005E3\")\n column :c6, \"blob\", :default=>Sequel::SQL::Blob.new(\"blah\")\n column :c7, \"date\", :default=>Date.parse(\"2008-10-29\")\n column :c8, \"datetime\", :default=>DateTime.parse(\"2008-10-29T10:20:30\")\n column :c9, \"time\", :default=>Time.parse(\"10:20:30\")\n column :c10, \"interval\", :default=>\"'6 weeks'\".lit\nend"
665
+ @d.dump_table_schema(:t4).gsub(/[+-]\d\d:\d\d"\)/, '")').should == "create_table(:t4) do\n TrueClass :c1, :default=>false\n String :c2, :default=>\"blah\"\n Integer :c3, :default=>-1\n Float :c4, :default=>1.0\n BigDecimal :c5, :default=>BigDecimal.new(\"0.1005E3\")\n File :c6, :default=>Sequel::SQL::Blob.new(\"blah\")\n Date :c7, :default=>Date.parse(\"2008-10-29\")\n DateTime :c8, :default=>DateTime.parse(\"2008-10-29T10:20:30\")\n Time :c9, :default=>Sequel::SQLTime.parse(\"10:20:30\"), :only_time=>true\n String :c10\nend"
666
+ @d.dump_table_schema(:t4, :same_db=>true).gsub(/[+-]\d\d:\d\d"\)/, '")').should == "create_table(:t4) do\n column :c1, \"boolean\", :default=>false\n column :c2, \"varchar\", :default=>\"blah\"\n column :c3, \"integer\", :default=>-1\n column :c4, \"float\", :default=>1.0\n column :c5, \"decimal\", :default=>BigDecimal.new(\"0.1005E3\")\n column :c6, \"blob\", :default=>Sequel::SQL::Blob.new(\"blah\")\n column :c7, \"date\", :default=>Date.parse(\"2008-10-29\")\n column :c8, \"datetime\", :default=>DateTime.parse(\"2008-10-29T10:20:30\")\n column :c9, \"time\", :default=>Sequel::SQLTime.parse(\"10:20:30\")\n column :c10, \"interval\", :default=>\"'6 weeks'\".lit\nend"
268
667
  end
269
668
 
270
669
  it "should not use a '...'.lit as a fallback if using MySQL with the :same_db option" do
@@ -291,12 +690,14 @@ END_MIG
291
690
  ["double precision", "timestamp with time zone", "timestamp without time zone",
292
691
  "time with time zone", "time without time zone", "character varying(20)"] +
293
692
  %w"nvarchar ntext smalldatetime smallmoney binary varbinary nchar" +
294
- ["timestamp(6) without time zone", "timestamp(6) with time zone", "int(12) unsigned", 'bigint unsigned']
693
+ ["timestamp(6) without time zone", "timestamp(6) with time zone", 'mediumint(10) unsigned', 'int(9) unsigned',
694
+ 'int(10) unsigned', "int(12) unsigned", 'bigint unsigned', 'tinyint(3) unsigned', 'identity', 'int identity'] +
695
+ %w"integer(10)"
295
696
  @d.meta_def(:schema) do |t, *o|
296
697
  i = 0
297
698
  types.map{|x| [:"c#{i+=1}", {:db_type=>x, :allow_null=>true}]}
298
699
  end
299
- table = <<END_MIG
700
+ @d.dump_table_schema(:x).should == (<<END_MIG).chomp
300
701
  create_table(:x) do
301
702
  Integer :c1
302
703
  Integer :c2
@@ -362,9 +763,15 @@ create_table(:x) do
362
763
  DateTime :c62, :size=>6
363
764
  DateTime :c63, :size=>6
364
765
  Integer :c64
365
- Bignum :c65
766
+ Integer :c65
767
+ Bignum :c66
768
+ Bignum :c67
769
+ Bignum :c68
770
+ Integer :c69
771
+ Integer :c70
772
+ Integer :c71
773
+ Integer :c72
366
774
  end
367
775
  END_MIG
368
- @d.dump_table_schema(:x).should == table.chomp
369
776
  end
370
777
  end