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.
- data/CHANGELOG +855 -3
- data/MIT-LICENSE +1 -1
- data/README.rdoc +23 -7
- data/Rakefile +42 -24
- data/bin/sequel +26 -8
- data/doc/active_record.rdoc +1 -0
- data/doc/advanced_associations.rdoc +171 -11
- data/doc/association_basics.rdoc +293 -43
- data/doc/dataset_basics.rdoc +5 -5
- data/doc/dataset_filtering.rdoc +8 -0
- data/doc/mass_assignment.rdoc +56 -0
- data/doc/migration.rdoc +85 -552
- data/doc/model_hooks.rdoc +78 -27
- data/doc/object_model.rdoc +541 -0
- data/doc/opening_databases.rdoc +97 -50
- data/doc/prepared_statements.rdoc +40 -14
- data/doc/querying.rdoc +28 -4
- data/doc/reflection.rdoc +30 -4
- data/doc/release_notes/3.22.0.txt +39 -0
- data/doc/release_notes/3.23.0.txt +172 -0
- data/doc/release_notes/3.24.0.txt +420 -0
- data/doc/release_notes/3.25.0.txt +88 -0
- data/doc/release_notes/3.26.0.txt +88 -0
- data/doc/release_notes/3.27.0.txt +82 -0
- data/doc/release_notes/3.28.0.txt +304 -0
- data/doc/release_notes/3.29.0.txt +459 -0
- data/doc/release_notes/3.30.0.txt +135 -0
- data/doc/release_notes/3.31.0.txt +146 -0
- data/doc/release_notes/3.32.0.txt +202 -0
- data/doc/release_notes/3.33.0.txt +157 -0
- data/doc/release_notes/3.34.0.txt +671 -0
- data/doc/release_notes/3.35.0.txt +144 -0
- data/doc/release_notes/3.36.0.txt +245 -0
- data/doc/schema_modification.rdoc +572 -0
- data/doc/sharding.rdoc +95 -3
- data/doc/testing.rdoc +129 -0
- data/doc/thread_safety.rdoc +17 -0
- data/doc/transactions.rdoc +137 -0
- data/doc/virtual_rows.rdoc +51 -2
- data/lib/sequel/adapters/ado/mssql.rb +18 -6
- data/lib/sequel/adapters/ado.rb +40 -18
- data/lib/sequel/adapters/amalgalite.rb +17 -9
- data/lib/sequel/adapters/db2.rb +175 -86
- data/lib/sequel/adapters/dbi.rb +15 -15
- data/lib/sequel/adapters/do/mysql.rb +17 -11
- data/lib/sequel/adapters/do/postgres.rb +1 -57
- data/lib/sequel/adapters/do/sqlite.rb +0 -10
- data/lib/sequel/adapters/do.rb +18 -36
- data/lib/sequel/adapters/firebird.rb +27 -208
- data/lib/sequel/adapters/ibmdb.rb +453 -0
- data/lib/sequel/adapters/informix.rb +6 -23
- data/lib/sequel/adapters/jdbc/as400.rb +16 -34
- data/lib/sequel/adapters/jdbc/db2.rb +47 -0
- data/lib/sequel/adapters/jdbc/derby.rb +287 -0
- data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
- data/lib/sequel/adapters/jdbc/h2.rb +73 -31
- data/lib/sequel/adapters/jdbc/hsqldb.rb +184 -0
- data/lib/sequel/adapters/jdbc/informix.rb +21 -0
- data/lib/sequel/adapters/jdbc/jtds.rb +29 -0
- data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
- data/lib/sequel/adapters/jdbc/mysql.rb +7 -24
- data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
- data/lib/sequel/adapters/jdbc/postgresql.rb +58 -48
- data/lib/sequel/adapters/jdbc/progress.rb +21 -0
- data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
- data/lib/sequel/adapters/jdbc/sqlserver.rb +66 -0
- data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
- data/lib/sequel/adapters/jdbc.rb +265 -94
- data/lib/sequel/adapters/mock.rb +361 -0
- data/lib/sequel/adapters/mysql.rb +118 -222
- data/lib/sequel/adapters/mysql2.rb +58 -57
- data/lib/sequel/adapters/odbc/mssql.rb +15 -7
- data/lib/sequel/adapters/odbc.rb +28 -9
- data/lib/sequel/adapters/openbase.rb +3 -5
- data/lib/sequel/adapters/oracle.rb +349 -53
- data/lib/sequel/adapters/postgres.rb +356 -107
- data/lib/sequel/adapters/shared/access.rb +32 -9
- data/lib/sequel/adapters/shared/db2.rb +342 -0
- data/lib/sequel/adapters/shared/firebird.rb +221 -0
- data/lib/sequel/adapters/shared/informix.rb +53 -0
- data/lib/sequel/adapters/shared/mssql.rb +335 -118
- data/lib/sequel/adapters/shared/mysql.rb +340 -76
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +155 -0
- data/lib/sequel/adapters/shared/oracle.rb +243 -45
- data/lib/sequel/adapters/shared/postgres.rb +524 -279
- data/lib/sequel/adapters/shared/progress.rb +5 -8
- data/lib/sequel/adapters/shared/sqlite.rb +265 -89
- data/lib/sequel/adapters/sqlite.rb +101 -39
- data/lib/sequel/adapters/swift/mysql.rb +9 -12
- data/lib/sequel/adapters/swift/postgres.rb +9 -74
- data/lib/sequel/adapters/swift/sqlite.rb +8 -6
- data/lib/sequel/adapters/swift.rb +8 -7
- data/lib/sequel/adapters/tinytds.rb +161 -21
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +66 -0
- data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
- data/lib/sequel/ast_transformer.rb +194 -0
- data/lib/sequel/connection_pool/sharded_single.rb +11 -1
- data/lib/sequel/connection_pool/sharded_threaded.rb +28 -2
- data/lib/sequel/connection_pool/single.rb +5 -0
- data/lib/sequel/connection_pool/threaded.rb +38 -14
- data/lib/sequel/connection_pool.rb +10 -2
- data/lib/sequel/core.rb +118 -11
- data/lib/sequel/database/connecting.rb +38 -28
- data/lib/sequel/database/dataset.rb +4 -4
- data/lib/sequel/database/dataset_defaults.rb +63 -2
- data/lib/sequel/database/logging.rb +7 -2
- data/lib/sequel/database/misc.rb +150 -46
- data/lib/sequel/database/query.rb +215 -65
- data/lib/sequel/database/schema_generator.rb +64 -20
- data/lib/sequel/database/schema_methods.rb +212 -54
- data/lib/sequel/dataset/actions.rb +322 -85
- data/lib/sequel/dataset/features.rb +96 -8
- data/lib/sequel/dataset/graph.rb +38 -11
- data/lib/sequel/dataset/misc.rb +50 -23
- data/lib/sequel/dataset/mutation.rb +12 -7
- data/lib/sequel/dataset/prepared_statements.rb +68 -30
- data/lib/sequel/dataset/query.rb +237 -44
- data/lib/sequel/dataset/sql.rb +698 -278
- data/lib/sequel/dataset.rb +8 -0
- data/lib/sequel/exceptions.rb +4 -0
- data/lib/sequel/extensions/_pretty_table.rb +79 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +108 -0
- data/lib/sequel/extensions/columns_introspection.rb +61 -0
- data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +16 -34
- data/lib/sequel/extensions/migration.rb +97 -11
- data/lib/sequel/extensions/named_timezones.rb +5 -0
- data/lib/sequel/extensions/null_dataset.rb +90 -0
- data/lib/sequel/extensions/pg_array.rb +460 -0
- data/lib/sequel/extensions/pg_array_ops.rb +220 -0
- data/lib/sequel/extensions/pg_auto_parameterize.rb +169 -0
- data/lib/sequel/extensions/pg_hstore.rb +296 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +259 -0
- data/lib/sequel/extensions/pg_inet.rb +89 -0
- data/lib/sequel/extensions/pg_json.rb +178 -0
- data/lib/sequel/extensions/pg_statement_cache.rb +316 -0
- data/lib/sequel/extensions/pretty_table.rb +5 -71
- data/lib/sequel/extensions/query.rb +1 -1
- data/lib/sequel/extensions/query_literals.rb +79 -0
- data/lib/sequel/extensions/schema_caching.rb +76 -0
- data/lib/sequel/extensions/schema_dumper.rb +251 -37
- data/lib/sequel/extensions/select_remove.rb +35 -0
- data/lib/sequel/extensions/server_block.rb +139 -0
- data/lib/sequel/extensions/sql_expr.rb +4 -110
- data/lib/sequel/extensions/thread_local_timezones.rb +1 -1
- data/lib/sequel/extensions/to_dot.rb +95 -83
- data/lib/sequel/model/associations.rb +1187 -393
- data/lib/sequel/model/base.rb +578 -170
- data/lib/sequel/model/errors.rb +1 -1
- data/lib/sequel/model/exceptions.rb +5 -1
- data/lib/sequel/model/inflections.rb +1 -1
- data/lib/sequel/model.rb +30 -11
- data/lib/sequel/no_core_ext.rb +2 -0
- data/lib/sequel/plugins/active_model.rb +13 -1
- data/lib/sequel/plugins/association_pks.rb +22 -4
- data/lib/sequel/plugins/caching.rb +25 -18
- data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
- data/lib/sequel/plugins/composition.rb +44 -12
- data/lib/sequel/plugins/dataset_associations.rb +100 -0
- data/lib/sequel/plugins/defaults_setter.rb +58 -0
- data/lib/sequel/plugins/dirty.rb +214 -0
- data/lib/sequel/plugins/eager_each.rb +59 -0
- data/lib/sequel/plugins/force_encoding.rb +6 -6
- data/lib/sequel/plugins/hook_class_methods.rb +1 -1
- data/lib/sequel/plugins/identity_map.rb +123 -8
- data/lib/sequel/plugins/instance_filters.rb +10 -0
- data/lib/sequel/plugins/instance_hooks.rb +1 -1
- data/lib/sequel/plugins/json_serializer.rb +58 -6
- data/lib/sequel/plugins/list.rb +12 -2
- data/lib/sequel/plugins/many_through_many.rb +79 -28
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
- data/lib/sequel/plugins/nested_attributes.rb +139 -63
- data/lib/sequel/plugins/optimistic_locking.rb +8 -0
- data/lib/sequel/plugins/prepared_statements.rb +167 -0
- data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
- data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
- data/lib/sequel/plugins/rcte_tree.rb +29 -15
- data/lib/sequel/plugins/schema.rb +7 -2
- data/lib/sequel/plugins/serialization.rb +98 -49
- data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
- data/lib/sequel/plugins/sharding.rb +21 -54
- data/lib/sequel/plugins/single_table_inheritance.rb +5 -3
- data/lib/sequel/plugins/static_cache.rb +99 -0
- data/lib/sequel/plugins/subclasses.rb +10 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/typecast_on_load.rb +9 -12
- data/lib/sequel/plugins/update_primary_key.rb +2 -2
- data/lib/sequel/plugins/validation_class_methods.rb +1 -1
- data/lib/sequel/plugins/xml_serializer.rb +15 -4
- data/lib/sequel/sql.rb +526 -59
- data/lib/sequel/timezones.rb +57 -38
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +146 -0
- data/spec/adapters/firebird_spec.rb +1 -1
- data/spec/adapters/mssql_spec.rb +142 -40
- data/spec/adapters/mysql_spec.rb +380 -234
- data/spec/adapters/oracle_spec.rb +67 -77
- data/spec/adapters/postgres_spec.rb +1050 -212
- data/spec/adapters/spec_helper.rb +8 -5
- data/spec/adapters/sqlite_spec.rb +139 -27
- data/spec/core/connection_pool_spec.rb +196 -93
- data/spec/core/database_spec.rb +879 -510
- data/spec/core/dataset_spec.rb +1415 -1086
- data/spec/core/expression_filters_spec.rb +554 -109
- data/spec/core/mock_adapter_spec.rb +449 -0
- data/spec/core/object_graph_spec.rb +86 -114
- data/spec/core/schema_generator_spec.rb +4 -4
- data/spec/core/schema_spec.rb +482 -38
- data/spec/core/spec_helper.rb +6 -48
- data/spec/extensions/active_model_spec.rb +13 -0
- data/spec/extensions/arbitrary_servers_spec.rb +110 -0
- data/spec/extensions/association_autoreloading_spec.rb +18 -10
- data/spec/extensions/association_dependencies_spec.rb +15 -25
- data/spec/extensions/association_pks_spec.rb +66 -32
- data/spec/extensions/association_proxies_spec.rb +4 -4
- data/spec/extensions/caching_spec.rb +47 -51
- data/spec/extensions/class_table_inheritance_spec.rb +31 -83
- data/spec/extensions/columns_introspection_spec.rb +91 -0
- data/spec/extensions/composition_spec.rb +18 -13
- data/spec/{core/core_sql_spec.rb → extensions/core_extensions_spec.rb} +119 -139
- data/spec/extensions/dataset_associations_spec.rb +199 -0
- data/spec/extensions/defaults_setter_spec.rb +64 -0
- data/spec/extensions/dirty_spec.rb +155 -0
- data/spec/extensions/eager_each_spec.rb +34 -0
- data/spec/extensions/force_encoding_spec.rb +4 -2
- data/spec/extensions/hook_class_methods_spec.rb +69 -92
- data/spec/extensions/identity_map_spec.rb +131 -22
- data/spec/extensions/inflector_spec.rb +0 -4
- data/spec/extensions/instance_filters_spec.rb +11 -21
- data/spec/extensions/instance_hooks_spec.rb +72 -0
- data/spec/extensions/json_serializer_spec.rb +49 -6
- data/spec/extensions/lazy_attributes_spec.rb +16 -20
- data/spec/extensions/list_spec.rb +48 -39
- data/spec/extensions/many_through_many_spec.rb +283 -250
- data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
- data/spec/extensions/migration_spec.rb +140 -35
- data/spec/extensions/named_timezones_spec.rb +29 -11
- data/spec/extensions/nested_attributes_spec.rb +251 -89
- data/spec/extensions/null_dataset_spec.rb +85 -0
- data/spec/extensions/optimistic_locking_spec.rb +24 -21
- data/spec/extensions/pg_array_ops_spec.rb +105 -0
- data/spec/extensions/pg_array_spec.rb +196 -0
- data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +136 -0
- data/spec/extensions/pg_hstore_spec.rb +195 -0
- data/spec/extensions/pg_inet_spec.rb +44 -0
- data/spec/extensions/pg_json_spec.rb +101 -0
- data/spec/extensions/pg_statement_cache_spec.rb +209 -0
- data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
- data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
- data/spec/extensions/prepared_statements_spec.rb +87 -0
- data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
- data/spec/extensions/pretty_table_spec.rb +7 -6
- data/spec/extensions/query_literals_spec.rb +168 -0
- data/spec/extensions/query_spec.rb +6 -0
- data/spec/extensions/rcte_tree_spec.rb +50 -43
- data/spec/extensions/schema_caching_spec.rb +41 -0
- data/spec/extensions/schema_dumper_spec.rb +429 -22
- data/spec/extensions/schema_spec.rb +25 -21
- data/spec/extensions/select_remove_spec.rb +38 -0
- data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
- data/spec/extensions/serialization_spec.rb +85 -43
- data/spec/extensions/server_block_spec.rb +90 -0
- data/spec/extensions/sharding_spec.rb +69 -143
- data/spec/extensions/single_table_inheritance_spec.rb +23 -29
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +22 -61
- data/spec/extensions/sql_expr_spec.rb +29 -60
- data/spec/extensions/static_cache_spec.rb +145 -0
- data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
- data/spec/extensions/thread_local_timezones_spec.rb +22 -2
- data/spec/extensions/timestamps_spec.rb +6 -6
- data/spec/extensions/to_dot_spec.rb +4 -7
- data/spec/extensions/touch_spec.rb +13 -14
- data/spec/extensions/tree_spec.rb +11 -26
- data/spec/extensions/typecast_on_load_spec.rb +9 -6
- data/spec/extensions/update_primary_key_spec.rb +30 -24
- data/spec/extensions/validation_class_methods_spec.rb +30 -51
- data/spec/extensions/validation_helpers_spec.rb +16 -35
- data/spec/extensions/xml_serializer_spec.rb +29 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
- data/spec/integration/associations_test.rb +659 -21
- data/spec/integration/database_test.rb +9 -3
- data/spec/integration/dataset_test.rb +605 -91
- data/spec/integration/eager_loader_test.rb +19 -21
- data/spec/integration/migrator_test.rb +2 -3
- data/spec/integration/model_test.rb +81 -2
- data/spec/integration/plugin_test.rb +454 -143
- data/spec/integration/prepared_statement_test.rb +263 -128
- data/spec/integration/schema_test.rb +309 -43
- data/spec/integration/spec_helper.rb +40 -30
- data/spec/integration/timezone_test.rb +38 -12
- data/spec/integration/transaction_test.rb +183 -8
- data/spec/integration/type_test.rb +18 -4
- data/spec/model/association_reflection_spec.rb +201 -7
- data/spec/model/associations_spec.rb +1067 -661
- data/spec/model/base_spec.rb +329 -95
- data/spec/model/dataset_methods_spec.rb +7 -27
- data/spec/model/eager_loading_spec.rb +677 -676
- data/spec/model/hooks_spec.rb +349 -67
- data/spec/model/model_spec.rb +240 -168
- data/spec/model/plugins_spec.rb +24 -13
- data/spec/model/record_spec.rb +490 -232
- data/spec/model/spec_helper.rb +14 -71
- data/spec/model/validations_spec.rb +11 -0
- data/spec/rcov.opts +2 -0
- metadata +178 -80
data/spec/core/schema_spec.rb
CHANGED
|
@@ -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 =
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
552
|
-
@db.
|
|
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 =
|
|
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 ==
|
|
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 =
|
|
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 =
|
|
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 ==
|
|
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
|