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
@@ -2,7 +2,7 @@ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
2
2
 
3
3
  describe "DB#create_table" do
4
4
  before do
5
- @db = SchemaDummyDatabase.new
5
+ @db = Sequel.mock
6
6
  end
7
7
 
8
8
  specify "should accept the table name" do
@@ -88,13 +88,11 @@ describe "DB#create_table" do
88
88
  end
89
89
  @db.sqls.should == ['CREATE TABLE cats (id integer PRIMARY KEY AUTOINCREMENT)']
90
90
 
91
- @db.sqls.clear
92
91
  @db.create_table(:cats) do
93
92
  primary_key :id, :serial, :auto_increment => false
94
93
  end
95
94
  @db.sqls.should == ['CREATE TABLE cats (id serial PRIMARY KEY)']
96
95
 
97
- @db.sqls.clear
98
96
  @db.create_table(:cats) do
99
97
  primary_key :id, :type => :serial, :auto_increment => false
100
98
  end
@@ -154,7 +152,6 @@ describe "DB#create_table" do
154
152
  varchar :name
155
153
  end
156
154
  @db.sqls.should == ["CREATE TABLE cats (name varchar(255))"]
157
- @db.sqls.clear
158
155
  @db.create_table(:cats) do
159
156
  varchar :name, :size => 51
160
157
  end
@@ -199,7 +196,6 @@ describe "DB#create_table" do
199
196
  end
200
197
  @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects(id))"]
201
198
 
202
- @db.sqls.clear
203
199
  @db.create_table(:cats) do
204
200
  foreign_key :project_id, :table => :projects, :key => :zzz
205
201
  end
@@ -212,32 +208,30 @@ describe "DB#create_table" do
212
208
  end
213
209
  @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE RESTRICT)"]
214
210
 
215
- @db.sqls.clear
216
211
  @db.create_table(:cats) do
217
212
  foreign_key :project_id, :table => :projects, :on_delete => :cascade
218
213
  end
219
214
  @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE CASCADE)"]
220
215
 
221
- @db.sqls.clear
222
216
  @db.create_table(:cats) do
223
217
  foreign_key :project_id, :table => :projects, :on_delete => :no_action
224
218
  end
225
219
  @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE NO ACTION)"]
226
- @db.sqls.clear
227
220
 
228
- @db.sqls.clear
229
221
  @db.create_table(:cats) do
230
222
  foreign_key :project_id, :table => :projects, :on_delete => :set_null
231
223
  end
232
224
  @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE SET NULL)"]
233
- @db.sqls.clear
234
225
 
235
- @db.sqls.clear
236
226
  @db.create_table(:cats) do
237
227
  foreign_key :project_id, :table => :projects, :on_delete => :set_default
238
228
  end
239
229
  @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE SET DEFAULT)"]
240
- @db.sqls.clear
230
+
231
+ @db.create_table(:cats) do
232
+ foreign_key :project_id, :table => :projects, :on_delete => 'NO ACTION FOO'
233
+ end
234
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE NO ACTION FOO)"]
241
235
  end
242
236
 
243
237
  specify "should accept foreign keys with ON UPDATE clause" do
@@ -246,32 +240,30 @@ describe "DB#create_table" do
246
240
  end
247
241
  @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE RESTRICT)"]
248
242
 
249
- @db.sqls.clear
250
243
  @db.create_table(:cats) do
251
244
  foreign_key :project_id, :table => :projects, :on_update => :cascade
252
245
  end
253
246
  @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE CASCADE)"]
254
247
 
255
- @db.sqls.clear
256
248
  @db.create_table(:cats) do
257
249
  foreign_key :project_id, :table => :projects, :on_update => :no_action
258
250
  end
259
251
  @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE NO ACTION)"]
260
- @db.sqls.clear
261
252
 
262
- @db.sqls.clear
263
253
  @db.create_table(:cats) do
264
254
  foreign_key :project_id, :table => :projects, :on_update => :set_null
265
255
  end
266
256
  @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE SET NULL)"]
267
- @db.sqls.clear
268
257
 
269
- @db.sqls.clear
270
258
  @db.create_table(:cats) do
271
259
  foreign_key :project_id, :table => :projects, :on_update => :set_default
272
260
  end
273
261
  @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE SET DEFAULT)"]
274
- @db.sqls.clear
262
+
263
+ @db.create_table(:cats) do
264
+ foreign_key :project_id, :table => :projects, :on_update => 'SET DEFAULT FOO'
265
+ end
266
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE SET DEFAULT FOO)"]
275
267
  end
276
268
 
277
269
  specify "should accept foreign keys with deferrable option" do
@@ -281,6 +273,13 @@ describe "DB#create_table" do
281
273
  @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects DEFERRABLE INITIALLY DEFERRED)"]
282
274
  end
283
275
 
276
+ specify "should accept collation" do
277
+ @db.create_table(:cats) do
278
+ varchar :name, :collate => :utf8_bin
279
+ end
280
+ @db.sqls.should == ["CREATE TABLE cats (name varchar(255) COLLATE utf8_bin)"]
281
+ end
282
+
284
283
  specify "should accept inline index definition" do
285
284
  @db.create_table(:cats) do
286
285
  integer :id, :index => true
@@ -288,6 +287,13 @@ describe "DB#create_table" do
288
287
  @db.sqls.should == ["CREATE TABLE cats (id integer)", "CREATE INDEX cats_id_index ON cats (id)"]
289
288
  end
290
289
 
290
+ specify "should accept inline index definition with a hash of options" do
291
+ @db.create_table(:cats) do
292
+ integer :id, :index => {:unique=>true}
293
+ end
294
+ @db.sqls.should == ["CREATE TABLE cats (id integer)", "CREATE UNIQUE INDEX cats_id_index ON cats (id)"]
295
+ end
296
+
291
297
  specify "should accept inline index definition for foreign keys" do
292
298
  @db.create_table(:cats) do
293
299
  foreign_key :project_id, :table => :projects, :on_delete => :cascade, :index => true
@@ -296,6 +302,14 @@ describe "DB#create_table" do
296
302
  "CREATE INDEX cats_project_id_index ON cats (project_id)"]
297
303
  end
298
304
 
305
+ specify "should accept inline index definition for foreign keys with a hash of options" do
306
+ @db.create_table(:cats) do
307
+ foreign_key :project_id, :table => :projects, :on_delete => :cascade, :index => {:unique=>true}
308
+ end
309
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE CASCADE)",
310
+ "CREATE UNIQUE INDEX cats_project_id_index ON cats (project_id)"]
311
+ end
312
+
299
313
  specify "should accept index definitions" do
300
314
  @db.create_table(:cats) do
301
315
  integer :id
@@ -361,7 +375,6 @@ describe "DB#create_table" do
361
375
  @db.meta_def(:execute_ddl){|*a| raise Sequel::DatabaseError if /blah/.match(a.first); super(*a)}
362
376
  lambda{@db.create_table(:cats){Integer :id; index :blah; index :id}}.should raise_error(Sequel::DatabaseError)
363
377
  @db.sqls.should == ['CREATE TABLE cats (id integer)']
364
- @db.sqls.clear
365
378
  lambda{@db.create_table(:cats, :ignore_index_errors=>true){Integer :id; index :blah; index :id}}.should_not raise_error(Sequel::DatabaseError)
366
379
  @db.sqls.should == ['CREATE TABLE cats (id integer)', 'CREATE INDEX cats_id_index ON cats (id)']
367
380
  end
@@ -499,7 +512,6 @@ describe "DB#create_table" do
499
512
  foreign_key [:a, :b], :abc, :key => [:real_a, :real_b]
500
513
  end
501
514
  @db.sqls.should == ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc(real_a, real_b))"]
502
- @db.sqls.clear
503
515
 
504
516
  @db.create_table(:cats) do
505
517
  integer :a
@@ -517,7 +529,6 @@ describe "DB#create_table" do
517
529
  end
518
530
  @db.sqls.should == ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc ON DELETE CASCADE)"]
519
531
 
520
- @db.sqls.clear
521
532
  @db.create_table(:cats) do
522
533
  integer :a
523
534
  integer :b
@@ -525,7 +536,6 @@ describe "DB#create_table" do
525
536
  end
526
537
  @db.sqls.should == ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc ON UPDATE NO ACTION)"]
527
538
 
528
- @db.sqls.clear
529
539
  @db.create_table(:cats) do
530
540
  integer :a
531
541
  integer :b
@@ -533,7 +543,6 @@ describe "DB#create_table" do
533
543
  end
534
544
  @db.sqls.should == ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc ON DELETE RESTRICT ON UPDATE SET DEFAULT)"]
535
545
 
536
- @db.sqls.clear
537
546
  @db.create_table(:cats) do
538
547
  integer :a
539
548
  integer :b
@@ -541,28 +550,49 @@ describe "DB#create_table" do
541
550
  end
542
551
  @db.sqls.should == ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc(x, y) ON DELETE SET NULL ON UPDATE SET NULL)"]
543
552
  end
553
+
554
+ specify "should accept an :as option to create a table from the results of a dataset" do
555
+ @db.create_table(:cats, :as=>@db[:a])
556
+ @db.sqls.should == ['CREATE TABLE cats AS SELECT * FROM a']
557
+ end
558
+
559
+ specify "should accept an :as option to create a table from a SELECT string" do
560
+ @db.create_table(:cats, :as=>'SELECT * FROM a')
561
+ @db.sqls.should == ['CREATE TABLE cats AS SELECT * FROM a']
562
+ end
563
+
564
+ specify "should raise an Error if both a block and an :as argument are given" do
565
+ proc{@db.create_table(:cats, :as=>@db[:a]){}}.should raise_error(Sequel::Error)
566
+ end
544
567
  end
545
568
 
546
569
  describe "DB#create_table!" do
547
570
  before do
548
- @db = SchemaDummyDatabase.new
571
+ @db = Sequel.mock
572
+ end
573
+
574
+ specify "should create the table if it does not exist" do
575
+ @db.meta_def(:table_exists?){|a| false}
576
+ @db.create_table!(:cats){|*a|}
577
+ @db.sqls.should == ['CREATE TABLE cats ()']
549
578
  end
550
579
 
551
- specify "should drop the table and then create it" do
552
- @db.create_table!(:cats) {}
580
+ specify "should drop the table before creating it if it already exists" do
581
+ @db.meta_def(:table_exists?){|a| true}
582
+ @db.create_table!(:cats){|*a|}
553
583
  @db.sqls.should == ['DROP TABLE cats', 'CREATE TABLE cats ()']
554
584
  end
555
585
  end
556
586
 
557
587
  describe "DB#create_table?" do
558
588
  before do
559
- @db = SchemaDummyDatabase.new
589
+ @db = Sequel.mock
560
590
  end
561
591
 
562
592
  specify "should not create the table if the table already exists" do
563
593
  @db.meta_def(:table_exists?){|a| true}
564
594
  @db.create_table?(:cats){|*a|}
565
- @db.sqls.should == nil
595
+ @db.sqls.should == []
566
596
  end
567
597
 
568
598
  specify "should create the table if the table doesn't already exist" do
@@ -570,22 +600,161 @@ describe "DB#create_table?" do
570
600
  @db.create_table?(:cats){|*a|}
571
601
  @db.sqls.should == ['CREATE TABLE cats ()']
572
602
  end
603
+
604
+ specify "should use IF NOT EXISTS if the database supports that" do
605
+ @db.meta_def(:supports_create_table_if_not_exists?){true}
606
+ @db.create_table?(:cats){|*a|}
607
+ @db.sqls.should == ['CREATE TABLE IF NOT EXISTS cats ()']
608
+ end
609
+ end
610
+
611
+ describe "DB#create_join_table" do
612
+ before do
613
+ @db = Sequel.mock
614
+ end
615
+
616
+ specify "should take a hash with foreign keys and table name values" do
617
+ @db.create_join_table(:cat_id=>:cats, :dog_id=>:dogs)
618
+ @db.sqls.should == ['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)']
619
+ end
620
+
621
+ specify "should be able to have values be a hash of options" do
622
+ @db.create_join_table(:cat_id=>{:table=>:cats, :null=>true}, :dog_id=>{:table=>:dogs, :default=>0})
623
+ @db.sqls.should == ['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)']
624
+ end
625
+
626
+ specify "should be able to pass a second hash of table options" do
627
+ @db.create_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :temp=>true)
628
+ @db.sqls.should == ['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)']
629
+ end
630
+
631
+ specify "should recognize :name option in table options" do
632
+ @db.create_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :name=>:f)
633
+ @db.sqls.should == ['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)']
634
+ end
635
+
636
+ specify "should recognize :index_options option in table options" do
637
+ @db.create_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :index_options=>{:name=>:foo_index})
638
+ @db.sqls.should == ['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)']
639
+ end
640
+
641
+ specify "should recognize :no_index option in table options" do
642
+ @db.create_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :no_index=>true)
643
+ @db.sqls.should == ['CREATE TABLE cats_dogs (cat_id integer NOT NULL REFERENCES cats, dog_id integer NOT NULL REFERENCES dogs, PRIMARY KEY (cat_id, dog_id))']
644
+ end
645
+
646
+ specify "should recognize :no_primary_key option in table options" do
647
+ @db.create_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :no_primary_key=>true)
648
+ @db.sqls.should == ['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)']
649
+ end
650
+
651
+ specify "should raise an error if the hash doesn't have 2 entries with table names" do
652
+ proc{@db.create_join_table({})}.should raise_error(Sequel::Error)
653
+ proc{@db.create_join_table({:cat_id=>:cats})}.should raise_error(Sequel::Error)
654
+ proc{@db.create_join_table({:cat_id=>:cats, :human_id=>:humans, :dog_id=>:dog})}.should raise_error(Sequel::Error)
655
+ proc{@db.create_join_table({:cat_id=>:cats, :dog_id=>{}})}.should raise_error(Sequel::Error)
656
+ end
657
+ end
658
+
659
+ describe "DB#drop_join_table" do
660
+ before do
661
+ @db = Sequel.mock
662
+ end
663
+
664
+ specify "should take a hash with foreign keys and table name values and drop the table" do
665
+ @db.drop_join_table(:cat_id=>:cats, :dog_id=>:dogs)
666
+ @db.sqls.should == ['DROP TABLE cats_dogs']
667
+ end
668
+
669
+ specify "should be able to have values be a hash of options" do
670
+ @db.drop_join_table(:cat_id=>{:table=>:cats, :null=>true}, :dog_id=>{:table=>:dogs, :default=>0})
671
+ @db.sqls.should == ['DROP TABLE cats_dogs']
672
+ end
673
+
674
+ specify "should respect a second hash of table options" do
675
+ @db.drop_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :cascade=>true)
676
+ @db.sqls.should == ['DROP TABLE cats_dogs CASCADE']
677
+ end
678
+
679
+ specify "should respect :name option for table name" do
680
+ @db.drop_join_table({:cat_id=>:cats, :dog_id=>:dogs}, :name=>:f)
681
+ @db.sqls.should == ['DROP TABLE f']
682
+ end
683
+
684
+ specify "should raise an error if the hash doesn't have 2 entries with table names" do
685
+ proc{@db.drop_join_table({})}.should raise_error(Sequel::Error)
686
+ proc{@db.drop_join_table({:cat_id=>:cats})}.should raise_error(Sequel::Error)
687
+ proc{@db.drop_join_table({:cat_id=>:cats, :human_id=>:humans, :dog_id=>:dog})}.should raise_error(Sequel::Error)
688
+ proc{@db.drop_join_table({:cat_id=>:cats, :dog_id=>{}})}.should raise_error(Sequel::Error)
689
+ end
573
690
  end
574
691
 
575
692
  describe "DB#drop_table" do
576
693
  before do
577
- @db = SchemaDummyDatabase.new
694
+ @db = Sequel.mock
578
695
  end
579
696
 
580
697
  specify "should generate a DROP TABLE statement" do
581
698
  @db.drop_table :cats
582
699
  @db.sqls.should == ['DROP TABLE cats']
583
700
  end
701
+
702
+ specify "should drop multiple tables at once" do
703
+ @db.drop_table :cats, :dogs
704
+ @db.sqls.should == ['DROP TABLE cats', 'DROP TABLE dogs']
705
+ end
706
+
707
+ specify "should take an options hash and support the :cascade option" do
708
+ @db.drop_table :cats, :dogs, :cascade=>true
709
+ @db.sqls.should == ['DROP TABLE cats CASCADE', 'DROP TABLE dogs CASCADE']
710
+ end
711
+ end
712
+
713
+ describe "DB#drop_table?" do
714
+ before do
715
+ @db = Sequel.mock
716
+ end
717
+
718
+ specify "should drop the table if it exists" do
719
+ @db.meta_def(:table_exists?){|a| true}
720
+ @db.drop_table?(:cats)
721
+ @db.sqls.should == ["DROP TABLE cats"]
722
+ end
723
+
724
+ specify "should do nothing if the table does not exist" do
725
+ @db.meta_def(:table_exists?){|a| false}
726
+ @db.drop_table?(:cats)
727
+ @db.sqls.should == []
728
+ end
729
+
730
+ specify "should operate on multiple tables at once" do
731
+ @db.meta_def(:table_exists?){|a| a == :cats}
732
+ @db.drop_table? :cats, :dogs
733
+ @db.sqls.should == ['DROP TABLE cats']
734
+ end
735
+
736
+ specify "should take an options hash and support the :cascade option" do
737
+ @db.meta_def(:table_exists?){|a| true}
738
+ @db.drop_table? :cats, :dogs, :cascade=>true
739
+ @db.sqls.should == ['DROP TABLE cats CASCADE', 'DROP TABLE dogs CASCADE']
740
+ end
741
+
742
+ specify "should use IF NOT EXISTS if the database supports that" do
743
+ @db.meta_def(:supports_drop_table_if_exists?){true}
744
+ @db.drop_table? :cats, :dogs
745
+ @db.sqls.should == ['DROP TABLE IF EXISTS cats', 'DROP TABLE IF EXISTS dogs']
746
+ end
747
+
748
+ specify "should use IF NOT EXISTS with CASCADE if the database supports that" do
749
+ @db.meta_def(:supports_drop_table_if_exists?){true}
750
+ @db.drop_table? :cats, :dogs, :cascade=>true
751
+ @db.sqls.should == ['DROP TABLE IF EXISTS cats CASCADE', 'DROP TABLE IF EXISTS dogs CASCADE']
752
+ end
584
753
  end
585
754
 
586
755
  describe "DB#alter_table" do
587
756
  before do
588
- @db = SchemaDummyDatabase.new
757
+ @db = Sequel.mock
589
758
  end
590
759
 
591
760
  specify "should allow adding not null constraint" do
@@ -629,7 +798,6 @@ describe "DB#alter_table" do
629
798
  end
630
799
  @db.sqls.should == ["ALTER TABLE cats ADD UNIQUE (a, b)"]
631
800
 
632
- @db.sqls.clear
633
801
  @db.alter_table(:cats) do
634
802
  add_unique_constraint [:a, :b], :name => :ab_uniq
635
803
  end
@@ -649,19 +817,16 @@ describe "DB#alter_table" do
649
817
  end
650
818
  @db.sqls.should == ["ALTER TABLE cats ADD FOREIGN KEY (node_id, prop_id) REFERENCES nodes_props"]
651
819
 
652
- @db.sqls.clear
653
820
  @db.alter_table(:cats) do
654
821
  add_foreign_key [:node_id, :prop_id], :nodes_props, :name => :cfk
655
822
  end
656
823
  @db.sqls.should == ["ALTER TABLE cats ADD CONSTRAINT cfk FOREIGN KEY (node_id, prop_id) REFERENCES nodes_props"]
657
824
 
658
- @db.sqls.clear
659
825
  @db.alter_table(:cats) do
660
826
  add_foreign_key [:node_id, :prop_id], :nodes_props, :key => [:nid, :pid]
661
827
  end
662
828
  @db.sqls.should == ["ALTER TABLE cats ADD FOREIGN KEY (node_id, prop_id) REFERENCES nodes_props(nid, pid)"]
663
829
 
664
- @db.sqls.clear
665
830
  @db.alter_table(:cats) do
666
831
  add_foreign_key [:node_id, :prop_id], :nodes_props, :on_delete => :restrict, :on_update => :cascade
667
832
  end
@@ -679,7 +844,7 @@ describe "DB#alter_table" do
679
844
  @db.meta_def(:execute_ddl){|*a| raise Sequel::DatabaseError}
680
845
  lambda{@db.add_index(:cats, :id)}.should raise_error(Sequel::DatabaseError)
681
846
  lambda{@db.add_index(:cats, :id, :ignore_errors=>true)}.should_not raise_error(Sequel::DatabaseError)
682
- @db.sqls.should == nil
847
+ @db.sqls.should == []
683
848
  end
684
849
 
685
850
  specify "should support add_primary_key" do
@@ -695,7 +860,6 @@ describe "DB#alter_table" do
695
860
  end
696
861
  @db.sqls.should == ["ALTER TABLE cats ADD PRIMARY KEY (id, type)"]
697
862
 
698
- @db.sqls.clear
699
863
  @db.alter_table(:cats) do
700
864
  add_primary_key [:id, :type], :name => :cpk
701
865
  end
@@ -709,6 +873,13 @@ describe "DB#alter_table" do
709
873
  @db.sqls.should == ["ALTER TABLE cats DROP COLUMN score"]
710
874
  end
711
875
 
876
+ specify "should support drop_column with :cascade=>true option" do
877
+ @db.alter_table(:cats) do
878
+ drop_column :score, :cascade=>true
879
+ end
880
+ @db.sqls.should == ["ALTER TABLE cats DROP COLUMN score CASCADE"]
881
+ end
882
+
712
883
  specify "should support drop_constraint" do
713
884
  @db.alter_table(:cats) do
714
885
  drop_constraint :valid_score
@@ -716,6 +887,13 @@ describe "DB#alter_table" do
716
887
  @db.sqls.should == ["ALTER TABLE cats DROP CONSTRAINT valid_score"]
717
888
  end
718
889
 
890
+ specify "should support drop_constraint with :cascade=>true option" do
891
+ @db.alter_table(:cats) do
892
+ drop_constraint :valid_score, :cascade=>true
893
+ end
894
+ @db.sqls.should == ["ALTER TABLE cats DROP CONSTRAINT valid_score CASCADE"]
895
+ end
896
+
719
897
  specify "should support drop_index" do
720
898
  @db.alter_table(:cats) do
721
899
  drop_index :name
@@ -763,6 +941,236 @@ describe "DB#alter_table" do
763
941
  end
764
942
  end
765
943
 
944
+ describe "Database#create_table" do
945
+ before do
946
+ @db = Sequel.mock
947
+ end
948
+
949
+ specify "should construct proper SQL" do
950
+ @db.create_table :test do
951
+ primary_key :id, :integer, :null => false
952
+ column :name, :text
953
+ index :name, :unique => true
954
+ end
955
+ @db.sqls.should == ['CREATE TABLE test (id integer NOT NULL PRIMARY KEY AUTOINCREMENT, name text)',
956
+ 'CREATE UNIQUE INDEX test_name_index ON test (name)']
957
+ end
958
+
959
+ specify "should create a temporary table" do
960
+ @db.create_table :test_tmp, :temp => true do
961
+ primary_key :id, :integer, :null => false
962
+ column :name, :text
963
+ index :name, :unique => true
964
+ end
965
+
966
+ @db.sqls.should == ['CREATE TEMPORARY TABLE test_tmp (id integer NOT NULL PRIMARY KEY AUTOINCREMENT, name text)',
967
+ 'CREATE UNIQUE INDEX test_tmp_name_index ON test_tmp (name)']
968
+ end
969
+
970
+ specify "should not use default schema when creating a temporary table" do
971
+ @db.default_schema = :foo
972
+ @db.create_table :test_tmp, :temp => true do
973
+ column :name, :text
974
+ end
975
+ @db.sqls.should == ['CREATE TEMPORARY TABLE test_tmp (name text)']
976
+ end
977
+ end
978
+
979
+ describe "Database#alter_table" do
980
+ before do
981
+ @db = Sequel.mock
982
+ end
983
+
984
+ specify "should construct proper SQL" do
985
+ @db.alter_table :xyz do
986
+ add_column :aaa, :text, :null => false, :unique => true
987
+ drop_column :bbb
988
+ rename_column :ccc, :ddd
989
+ set_column_type :eee, :integer
990
+ set_column_default :hhh, 'abcd'
991
+ add_index :fff, :unique => true
992
+ drop_index :ggg
993
+ end
994
+
995
+ @db.sqls.should == ['ALTER TABLE xyz ADD COLUMN aaa text NOT NULL UNIQUE',
996
+ 'ALTER TABLE xyz DROP COLUMN bbb',
997
+ 'ALTER TABLE xyz RENAME COLUMN ccc TO ddd',
998
+ 'ALTER TABLE xyz ALTER COLUMN eee TYPE integer',
999
+ "ALTER TABLE xyz ALTER COLUMN hhh SET DEFAULT 'abcd'",
1000
+ 'CREATE UNIQUE INDEX xyz_fff_index ON xyz (fff)',
1001
+ 'DROP INDEX xyz_ggg_index']
1002
+ end
1003
+ end
1004
+
1005
+ describe "Database#add_column" do
1006
+ specify "should construct proper SQL" do
1007
+ db = Sequel.mock
1008
+ db.add_column :test, :name, :text, :unique => true
1009
+ db.sqls.should == ['ALTER TABLE test ADD COLUMN name text UNIQUE']
1010
+ end
1011
+ end
1012
+
1013
+ describe "Database#drop_column" do
1014
+ before do
1015
+ @db = Sequel.mock
1016
+ end
1017
+
1018
+ specify "should construct proper SQL" do
1019
+ @db.drop_column :test, :name
1020
+ @db.sqls.should == ['ALTER TABLE test DROP COLUMN name']
1021
+ end
1022
+
1023
+ specify "should use CASCADE for :cascade=>true option" do
1024
+ @db.drop_column :test, :name, :cascade=>true
1025
+ @db.sqls.should == ['ALTER TABLE test DROP COLUMN name CASCADE']
1026
+ end
1027
+ end
1028
+
1029
+ describe "Database#rename_column" do
1030
+ before do
1031
+ @db = Sequel.mock
1032
+ end
1033
+
1034
+ specify "should construct proper SQL" do
1035
+ @db.rename_column :test, :abc, :def
1036
+ @db.sqls.should == ['ALTER TABLE test RENAME COLUMN abc TO def']
1037
+ end
1038
+ end
1039
+
1040
+ describe "Database#set_column_type" do
1041
+ before do
1042
+ @db = Sequel.mock
1043
+ end
1044
+
1045
+ specify "should construct proper SQL" do
1046
+ @db.set_column_type :test, :name, :integer
1047
+ @db.sqls.should == ['ALTER TABLE test ALTER COLUMN name TYPE integer']
1048
+ end
1049
+ end
1050
+
1051
+ describe "Database#set_column_default" do
1052
+ before do
1053
+ @db = Sequel.mock
1054
+ end
1055
+
1056
+ specify "should construct proper SQL" do
1057
+ @db.set_column_default :test, :name, 'zyx'
1058
+ @db.sqls.should == ["ALTER TABLE test ALTER COLUMN name SET DEFAULT 'zyx'"]
1059
+ end
1060
+ end
1061
+
1062
+ describe "Database#add_index" do
1063
+ before do
1064
+ @db = Sequel.mock
1065
+ end
1066
+
1067
+ specify "should construct proper SQL" do
1068
+ @db.add_index :test, :name, :unique => true
1069
+ @db.sqls.should == ['CREATE UNIQUE INDEX test_name_index ON test (name)']
1070
+ end
1071
+
1072
+ specify "should accept multiple columns" do
1073
+ @db.add_index :test, [:one, :two]
1074
+ @db.sqls.should == ['CREATE INDEX test_one_two_index ON test (one, two)']
1075
+ end
1076
+ end
1077
+
1078
+ describe "Database#drop_index" do
1079
+ before do
1080
+ @db = Sequel.mock
1081
+ end
1082
+
1083
+ specify "should construct proper SQL" do
1084
+ @db.drop_index :test, :name
1085
+ @db.sqls.should == ['DROP INDEX test_name_index']
1086
+ end
1087
+
1088
+ end
1089
+
1090
+ describe "Database#drop_table" do
1091
+ before do
1092
+ @db = Sequel.mock
1093
+ end
1094
+
1095
+ specify "should construct proper SQL" do
1096
+ @db.drop_table :test
1097
+ @db.sqls.should == ['DROP TABLE test']
1098
+ end
1099
+
1100
+ specify "should accept multiple table names" do
1101
+ @db.drop_table :a, :bb, :ccc
1102
+ @db.sqls.should == ['DROP TABLE a', 'DROP TABLE bb', 'DROP TABLE ccc']
1103
+ end
1104
+ end
1105
+
1106
+ describe "Database#rename_table" do
1107
+ before do
1108
+ @db = Sequel.mock
1109
+ end
1110
+
1111
+ specify "should construct proper SQL" do
1112
+ @db.rename_table :abc, :xyz
1113
+ @db.sqls.should == ['ALTER TABLE abc RENAME TO xyz']
1114
+ end
1115
+ end
1116
+
1117
+ describe "Database#create_view" do
1118
+ before do
1119
+ @db = Sequel.mock
1120
+ end
1121
+
1122
+ specify "should construct proper SQL with raw SQL" do
1123
+ @db.create_view :test, "SELECT * FROM xyz"
1124
+ @db.sqls.should == ['CREATE VIEW test AS SELECT * FROM xyz']
1125
+ @db.create_view :test.identifier, "SELECT * FROM xyz"
1126
+ @db.sqls.should == ['CREATE VIEW test AS SELECT * FROM xyz']
1127
+ end
1128
+
1129
+ specify "should construct proper SQL with dataset" do
1130
+ @db.create_view :test, @db[:items].select(:a, :b).order(:c)
1131
+ @db.sqls.should == ['CREATE VIEW test AS SELECT a, b FROM items ORDER BY c']
1132
+ @db.create_or_replace_view :sch__test, "SELECT * FROM xyz"
1133
+ @db.sqls.should == ['CREATE OR REPLACE VIEW sch.test AS SELECT * FROM xyz']
1134
+ end
1135
+
1136
+ specify "should construct proper SQL with dataset" do
1137
+ @db.create_or_replace_view :test, @db[:items].select(:a, :b).order(:c)
1138
+ @db.sqls.should == ['CREATE OR REPLACE VIEW test AS SELECT a, b FROM items ORDER BY c']
1139
+ @db.create_or_replace_view :test.identifier, @db[:items].select(:a, :b).order(:c)
1140
+ @db.sqls.should == ['CREATE OR REPLACE VIEW test AS SELECT a, b FROM items ORDER BY c']
1141
+ end
1142
+ end
1143
+
1144
+ describe "Database#drop_view" do
1145
+ before do
1146
+ @db = Sequel.mock
1147
+ end
1148
+
1149
+ specify "should construct proper SQL" do
1150
+ @db.drop_view :test
1151
+ @db.drop_view :test.identifier
1152
+ @db.drop_view :sch__test
1153
+ @db.drop_view :test.qualify(:sch)
1154
+ @db.sqls.should == ['DROP VIEW test', 'DROP VIEW test', 'DROP VIEW sch.test', 'DROP VIEW sch.test']
1155
+ end
1156
+
1157
+ specify "should drop multiple views at once" do
1158
+ @db.drop_view :cats, :dogs
1159
+ @db.sqls.should == ['DROP VIEW cats', 'DROP VIEW dogs']
1160
+ end
1161
+
1162
+ specify "should take an options hash and support the :cascade option" do
1163
+ @db.drop_view :cats, :dogs, :cascade=>true
1164
+ @db.sqls.should == ['DROP VIEW cats CASCADE', 'DROP VIEW dogs CASCADE']
1165
+ end
1166
+ end
1167
+
1168
+ describe "Database#alter_table_sql" do
1169
+ specify "should raise error for an invalid op" do
1170
+ proc {Sequel.mock.send(:alter_table_sql, :mau, :op => :blah)}.should raise_error(Sequel::Error)
1171
+ end
1172
+ end
1173
+
766
1174
  describe "Schema Parser" do
767
1175
  before do
768
1176
  @sqls = []
@@ -776,6 +1184,43 @@ describe "Schema Parser" do
776
1184
  proc{@db.schema(:x)}.should raise_error(Sequel::Error)
777
1185
  end
778
1186
 
1187
+ specify "should cache data by default" do
1188
+ @db.meta_def(:schema_parse_table) do |t, opts|
1189
+ [[:a, {}]]
1190
+ end
1191
+ @db.schema(:x).should equal(@db.schema(:x))
1192
+ end
1193
+
1194
+ specify "should not cache data if :reload=>true is given" do
1195
+ @db.meta_def(:schema_parse_table) do |t, opts|
1196
+ [[:a, {}]]
1197
+ end
1198
+ @db.schema(:x).should_not equal(@db.schema(:x, :reload=>true))
1199
+ end
1200
+
1201
+ specify "should not cache schema metadata if cache_schema is false" do
1202
+ @db.cache_schema = false
1203
+ @db.meta_def(:schema_parse_table) do |t, opts|
1204
+ [[:a, {}]]
1205
+ end
1206
+ @db.schema(:x).should_not equal(@db.schema(:x))
1207
+ end
1208
+
1209
+ specify "should provide options if given a table name" do
1210
+ c = nil
1211
+ @db.meta_def(:schema_parse_table) do |t, opts|
1212
+ c = [t, opts]
1213
+ [[:a, {:db_type=>t.to_s}]]
1214
+ end
1215
+ @db.schema(:x)
1216
+ c.should == ["x", {}]
1217
+ @db.schema(:s__x)
1218
+ c.should == ["x", {:schema=>"s"}]
1219
+ ds = @db[:s__y]
1220
+ @db.schema(ds)
1221
+ c.should == ["y", {:schema=>"s", :dataset=>ds}]
1222
+ end
1223
+
779
1224
  specify "should parse the schema correctly for a single table" do
780
1225
  sqls = @sqls
781
1226
  proc{@db.schema(:x)}.should raise_error(Sequel::Error)
@@ -829,7 +1274,6 @@ describe "Schema Parser" do
829
1274
  @db.schema(:"time with time zone").first.last[:type].should == :time
830
1275
  @db.schema(:"time without time zone").first.last[:type].should == :time
831
1276
  @db.schema(:boolean).first.last[:type].should == :boolean
832
- @db.schema(:bit).first.last[:type].should == :boolean
833
1277
  @db.schema(:real).first.last[:type].should == :float
834
1278
  @db.schema(:float).first.last[:type].should == :float
835
1279
  @db.schema(:double).first.last[:type].should == :float