sequel 3.48.0 → 4.0.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.
- checksums.yaml +4 -4
- data/CHANGELOG +114 -0
- data/Rakefile +10 -7
- data/doc/association_basics.rdoc +25 -23
- data/doc/code_order.rdoc +7 -0
- data/doc/core_extensions.rdoc +0 -10
- data/doc/object_model.rdoc +4 -1
- data/doc/querying.rdoc +3 -3
- data/doc/release_notes/4.0.0.txt +262 -0
- data/doc/security.rdoc +0 -28
- data/doc/testing.rdoc +8 -14
- data/lib/sequel/adapters/ado.rb +7 -11
- data/lib/sequel/adapters/ado/access.rb +8 -8
- data/lib/sequel/adapters/ado/mssql.rb +4 -4
- data/lib/sequel/adapters/amalgalite.rb +6 -6
- data/lib/sequel/adapters/cubrid.rb +7 -7
- data/lib/sequel/adapters/db2.rb +5 -9
- data/lib/sequel/adapters/dbi.rb +2 -6
- data/lib/sequel/adapters/do.rb +4 -4
- data/lib/sequel/adapters/firebird.rb +4 -4
- data/lib/sequel/adapters/ibmdb.rb +8 -8
- data/lib/sequel/adapters/informix.rb +2 -10
- data/lib/sequel/adapters/jdbc.rb +17 -17
- data/lib/sequel/adapters/jdbc/as400.rb +2 -2
- data/lib/sequel/adapters/jdbc/cubrid.rb +1 -1
- data/lib/sequel/adapters/jdbc/db2.rb +1 -1
- data/lib/sequel/adapters/jdbc/derby.rb +1 -1
- data/lib/sequel/adapters/jdbc/h2.rb +2 -2
- data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -1
- data/lib/sequel/adapters/jdbc/informix.rb +1 -1
- data/lib/sequel/adapters/jdbc/mssql.rb +2 -2
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -1
- data/lib/sequel/adapters/jdbc/oracle.rb +5 -1
- data/lib/sequel/adapters/jdbc/postgresql.rb +3 -3
- data/lib/sequel/adapters/jdbc/sqlite.rb +3 -3
- data/lib/sequel/adapters/jdbc/transactions.rb +3 -3
- data/lib/sequel/adapters/mock.rb +7 -7
- data/lib/sequel/adapters/mysql.rb +3 -3
- data/lib/sequel/adapters/mysql2.rb +4 -4
- data/lib/sequel/adapters/odbc.rb +2 -6
- data/lib/sequel/adapters/odbc/mssql.rb +1 -1
- data/lib/sequel/adapters/openbase.rb +1 -5
- data/lib/sequel/adapters/oracle.rb +13 -17
- data/lib/sequel/adapters/postgres.rb +20 -25
- data/lib/sequel/adapters/shared/cubrid.rb +3 -3
- data/lib/sequel/adapters/shared/db2.rb +2 -2
- data/lib/sequel/adapters/shared/firebird.rb +7 -7
- data/lib/sequel/adapters/shared/mssql.rb +9 -9
- data/lib/sequel/adapters/shared/mysql.rb +29 -13
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +7 -7
- data/lib/sequel/adapters/shared/oracle.rb +22 -13
- data/lib/sequel/adapters/shared/postgres.rb +61 -46
- data/lib/sequel/adapters/shared/sqlite.rb +9 -9
- data/lib/sequel/adapters/sqlite.rb +17 -11
- data/lib/sequel/adapters/swift.rb +3 -3
- data/lib/sequel/adapters/swift/mysql.rb +1 -1
- data/lib/sequel/adapters/swift/sqlite.rb +1 -1
- data/lib/sequel/adapters/tinytds.rb +8 -8
- data/lib/sequel/ast_transformer.rb +3 -1
- data/lib/sequel/connection_pool.rb +4 -2
- data/lib/sequel/connection_pool/sharded_single.rb +2 -2
- data/lib/sequel/connection_pool/sharded_threaded.rb +5 -5
- data/lib/sequel/connection_pool/threaded.rb +7 -7
- data/lib/sequel/core.rb +4 -67
- data/lib/sequel/database.rb +1 -0
- data/lib/sequel/database/connecting.rb +2 -8
- data/lib/sequel/database/dataset.rb +2 -7
- data/lib/sequel/database/dataset_defaults.rb +0 -18
- data/lib/sequel/database/features.rb +4 -4
- data/lib/sequel/database/misc.rb +6 -8
- data/lib/sequel/database/query.rb +5 -61
- data/lib/sequel/database/schema_generator.rb +22 -20
- data/lib/sequel/database/schema_methods.rb +48 -20
- data/lib/sequel/database/transactions.rb +7 -17
- data/lib/sequel/dataset.rb +2 -0
- data/lib/sequel/dataset/actions.rb +23 -91
- data/lib/sequel/dataset/features.rb +1 -4
- data/lib/sequel/dataset/graph.rb +3 -47
- data/lib/sequel/dataset/misc.rb +4 -33
- data/lib/sequel/dataset/prepared_statements.rb +3 -1
- data/lib/sequel/dataset/query.rb +116 -240
- data/lib/sequel/dataset/sql.rb +19 -97
- data/lib/sequel/deprecated.rb +0 -16
- data/lib/sequel/exceptions.rb +0 -3
- data/lib/sequel/extensions/_pretty_table.rb +1 -1
- data/lib/sequel/extensions/columns_introspection.rb +1 -12
- data/lib/sequel/extensions/constraint_validations.rb +3 -3
- data/lib/sequel/extensions/core_extensions.rb +0 -9
- data/lib/sequel/extensions/date_arithmetic.rb +1 -2
- data/lib/sequel/extensions/graph_each.rb +11 -0
- data/lib/sequel/extensions/migration.rb +5 -5
- data/lib/sequel/extensions/null_dataset.rb +11 -13
- data/lib/sequel/extensions/pagination.rb +3 -6
- data/lib/sequel/extensions/pg_array.rb +6 -4
- data/lib/sequel/extensions/pg_array_ops.rb +35 -1
- data/lib/sequel/extensions/pg_json.rb +12 -2
- data/lib/sequel/extensions/pg_json_ops.rb +266 -0
- data/lib/sequel/extensions/pg_range.rb +2 -2
- data/lib/sequel/extensions/pg_range_ops.rb +0 -8
- data/lib/sequel/extensions/pg_row.rb +2 -2
- data/lib/sequel/extensions/pretty_table.rb +0 -4
- data/lib/sequel/extensions/query.rb +3 -8
- data/lib/sequel/extensions/schema_caching.rb +0 -7
- data/lib/sequel/extensions/schema_dumper.rb +10 -17
- data/lib/sequel/extensions/select_remove.rb +0 -4
- data/lib/sequel/extensions/set_overrides.rb +28 -0
- data/lib/sequel/extensions/to_dot.rb +6 -10
- data/lib/sequel/model.rb +6 -7
- data/lib/sequel/model/associations.rb +127 -182
- data/lib/sequel/model/base.rb +88 -211
- data/lib/sequel/model/errors.rb +0 -13
- data/lib/sequel/model/plugins.rb +2 -2
- data/lib/sequel/no_core_ext.rb +0 -1
- data/lib/sequel/plugins/after_initialize.rb +11 -17
- data/lib/sequel/plugins/association_autoreloading.rb +1 -47
- data/lib/sequel/plugins/association_dependencies.rb +2 -2
- data/lib/sequel/plugins/auto_validations.rb +2 -8
- data/lib/sequel/plugins/blacklist_security.rb +32 -2
- data/lib/sequel/plugins/caching.rb +1 -1
- data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
- data/lib/sequel/plugins/composition.rb +10 -8
- data/lib/sequel/plugins/constraint_validations.rb +2 -2
- data/lib/sequel/plugins/dataset_associations.rb +4 -0
- data/lib/sequel/plugins/defaults_setter.rb +8 -6
- data/lib/sequel/plugins/dirty.rb +6 -6
- data/lib/sequel/plugins/force_encoding.rb +13 -8
- data/lib/sequel/plugins/hook_class_methods.rb +1 -7
- data/lib/sequel/plugins/json_serializer.rb +13 -74
- data/lib/sequel/plugins/lazy_attributes.rb +2 -4
- data/lib/sequel/plugins/list.rb +1 -1
- data/lib/sequel/plugins/many_through_many.rb +4 -11
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +1 -49
- data/lib/sequel/plugins/nested_attributes.rb +1 -1
- data/lib/sequel/plugins/optimistic_locking.rb +3 -5
- data/lib/sequel/plugins/pg_array_associations.rb +453 -0
- data/lib/sequel/plugins/pg_typecast_on_load.rb +23 -7
- data/lib/sequel/plugins/prepared_statements.rb +1 -1
- data/lib/sequel/plugins/prepared_statements_associations.rb +20 -14
- data/lib/sequel/plugins/prepared_statements_safe.rb +2 -2
- data/lib/sequel/plugins/rcte_tree.rb +1 -1
- data/lib/sequel/plugins/serialization.rb +5 -4
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +7 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +1 -1
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/touch.rb +2 -2
- data/lib/sequel/plugins/tree.rb +1 -1
- data/lib/sequel/plugins/typecast_on_load.rb +19 -4
- data/lib/sequel/plugins/validation_class_methods.rb +0 -30
- data/lib/sequel/plugins/validation_helpers.rb +13 -31
- data/lib/sequel/plugins/xml_serializer.rb +18 -57
- data/lib/sequel/sql.rb +20 -22
- data/lib/sequel/version.rb +2 -2
- data/spec/adapters/db2_spec.rb +14 -23
- data/spec/adapters/firebird_spec.rb +25 -29
- data/spec/adapters/informix_spec.rb +11 -14
- data/spec/adapters/mssql_spec.rb +71 -77
- data/spec/adapters/mysql_spec.rb +165 -172
- data/spec/adapters/oracle_spec.rb +36 -39
- data/spec/adapters/postgres_spec.rb +175 -100
- data/spec/adapters/spec_helper.rb +13 -11
- data/spec/adapters/sqlite_spec.rb +36 -44
- data/spec/core/connection_pool_spec.rb +2 -1
- data/spec/core/database_spec.rb +55 -55
- data/spec/core/dataset_spec.rb +45 -249
- data/spec/core/deprecated_spec.rb +0 -8
- data/spec/core/expression_filters_spec.rb +23 -5
- data/spec/core/object_graph_spec.rb +4 -66
- data/spec/core/schema_spec.rb +35 -12
- data/spec/core/spec_helper.rb +3 -2
- data/spec/core_extensions_spec.rb +17 -19
- data/spec/extensions/arbitrary_servers_spec.rb +2 -3
- data/spec/extensions/association_dependencies_spec.rb +14 -14
- data/spec/extensions/auto_validations_spec.rb +7 -0
- data/spec/extensions/blacklist_security_spec.rb +5 -5
- data/spec/extensions/blank_spec.rb +2 -0
- data/spec/extensions/class_table_inheritance_spec.rb +2 -2
- data/spec/extensions/columns_introspection_spec.rb +2 -29
- data/spec/extensions/composition_spec.rb +10 -17
- data/spec/extensions/core_refinements_spec.rb +5 -1
- data/spec/extensions/dataset_associations_spec.rb +18 -0
- data/spec/extensions/date_arithmetic_spec.rb +2 -2
- data/spec/extensions/defaults_setter_spec.rb +9 -9
- data/spec/extensions/dirty_spec.rb +0 -5
- data/spec/extensions/eval_inspect_spec.rb +2 -0
- data/spec/extensions/force_encoding_spec.rb +2 -18
- data/spec/extensions/hash_aliases_spec.rb +8 -0
- data/spec/extensions/hook_class_methods_spec.rb +39 -58
- data/spec/extensions/inflector_spec.rb +2 -0
- data/spec/extensions/instance_filters_spec.rb +8 -8
- data/spec/extensions/json_serializer_spec.rb +1 -41
- data/spec/extensions/list_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +106 -109
- data/spec/extensions/migration_spec.rb +2 -0
- data/spec/extensions/named_timezones_spec.rb +1 -0
- data/spec/extensions/pg_array_associations_spec.rb +603 -0
- data/spec/extensions/pg_array_ops_spec.rb +25 -0
- data/spec/extensions/pg_array_spec.rb +9 -1
- data/spec/extensions/pg_hstore_ops_spec.rb +13 -0
- data/spec/extensions/pg_hstore_spec.rb +1 -0
- data/spec/extensions/pg_json_ops_spec.rb +131 -0
- data/spec/extensions/pg_json_spec.rb +10 -4
- data/spec/extensions/pg_range_ops_spec.rb +2 -5
- data/spec/extensions/pg_range_spec.rb +6 -2
- data/spec/extensions/pg_row_ops_spec.rb +2 -0
- data/spec/extensions/prepared_statements_associations_spec.rb +26 -5
- data/spec/extensions/rcte_tree_spec.rb +15 -15
- data/spec/extensions/schema_dumper_spec.rb +0 -1
- data/spec/extensions/schema_spec.rb +9 -9
- data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
- data/spec/extensions/serialization_spec.rb +18 -29
- data/spec/extensions/set_overrides_spec.rb +4 -0
- data/spec/extensions/{many_to_one_pk_lookup_spec.rb → shared_caching_spec.rb} +1 -4
- data/spec/extensions/single_table_inheritance_spec.rb +4 -4
- data/spec/extensions/spec_helper.rb +8 -9
- data/spec/extensions/sql_expr_spec.rb +2 -0
- data/spec/extensions/string_date_time_spec.rb +2 -0
- data/spec/extensions/string_stripper_spec.rb +2 -0
- data/spec/extensions/tactical_eager_loading_spec.rb +12 -12
- data/spec/extensions/thread_local_timezones_spec.rb +2 -0
- data/spec/extensions/timestamps_spec.rb +1 -1
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +24 -24
- data/spec/extensions/tree_spec.rb +7 -7
- data/spec/extensions/typecast_on_load_spec.rb +8 -1
- data/spec/extensions/update_primary_key_spec.rb +10 -10
- data/spec/extensions/validation_class_methods_spec.rb +10 -39
- data/spec/extensions/validation_helpers_spec.rb +29 -47
- data/spec/extensions/xml_serializer_spec.rb +1 -23
- data/spec/integration/associations_test.rb +231 -40
- data/spec/integration/database_test.rb +1 -1
- data/spec/integration/dataset_test.rb +64 -64
- data/spec/integration/eager_loader_test.rb +28 -28
- data/spec/integration/migrator_test.rb +1 -1
- data/spec/integration/model_test.rb +2 -2
- data/spec/integration/plugin_test.rb +21 -21
- data/spec/integration/prepared_statement_test.rb +7 -7
- data/spec/integration/schema_test.rb +115 -110
- data/spec/integration/spec_helper.rb +17 -27
- data/spec/integration/timezone_test.rb +1 -1
- data/spec/integration/transaction_test.rb +10 -10
- data/spec/integration/type_test.rb +2 -2
- data/spec/model/association_reflection_spec.rb +2 -28
- data/spec/model/associations_spec.rb +239 -188
- data/spec/model/base_spec.rb +27 -68
- data/spec/model/dataset_methods_spec.rb +4 -4
- data/spec/model/eager_loading_spec.rb +160 -172
- data/spec/model/hooks_spec.rb +62 -79
- data/spec/model/model_spec.rb +36 -51
- data/spec/model/plugins_spec.rb +5 -19
- data/spec/model/record_spec.rb +125 -151
- data/spec/model/spec_helper.rb +8 -6
- data/spec/model/validations_spec.rb +4 -17
- data/spec/spec_config.rb +2 -10
- metadata +50 -56
- data/lib/sequel/deprecated_core_extensions.rb +0 -135
- data/lib/sequel/extensions/pg_auto_parameterize.rb +0 -185
- data/lib/sequel/extensions/pg_statement_cache.rb +0 -318
- data/lib/sequel/plugins/identity_map.rb +0 -260
- data/lib/sequel_core.rb +0 -2
- data/lib/sequel_model.rb +0 -2
- data/spec/extensions/association_autoreloading_spec.rb +0 -102
- data/spec/extensions/identity_map_spec.rb +0 -337
- data/spec/extensions/pg_auto_parameterize_spec.rb +0 -70
- data/spec/extensions/pg_statement_cache_spec.rb +0 -208
- data/spec/rcov.opts +0 -8
- data/spec/spec_config.rb.example +0 -10
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
SEQUEL_ADAPTER_TEST = :informix
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
INFORMIX_DB = Sequel.connect('informix://localhost/mydb')
|
|
5
|
-
end
|
|
6
|
-
INTEGRATION_DB = INFORMIX_DB unless defined?(INTEGRATION_DB)
|
|
3
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
|
7
4
|
|
|
8
|
-
if
|
|
9
|
-
|
|
5
|
+
if DB.table_exists?(:test)
|
|
6
|
+
DB.drop_table :test
|
|
10
7
|
end
|
|
11
|
-
|
|
8
|
+
DB.create_table :test do
|
|
12
9
|
text :name
|
|
13
10
|
integer :value
|
|
14
11
|
|
|
@@ -17,16 +14,16 @@ end
|
|
|
17
14
|
|
|
18
15
|
describe "A Informix database" do
|
|
19
16
|
specify "should provide disconnect functionality" do
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
DB.execute("select user from dual")
|
|
18
|
+
DB.pool.size.should == 1
|
|
19
|
+
DB.disconnect
|
|
20
|
+
DB.pool.size.should == 0
|
|
24
21
|
end
|
|
25
22
|
end
|
|
26
23
|
|
|
27
24
|
describe "A Informix dataset" do
|
|
28
25
|
before do
|
|
29
|
-
@d =
|
|
26
|
+
@d = DB[:test]
|
|
30
27
|
@d.delete # remove all records
|
|
31
28
|
end
|
|
32
29
|
|
|
@@ -79,7 +76,7 @@ describe "A Informix dataset" do
|
|
|
79
76
|
end
|
|
80
77
|
|
|
81
78
|
specify "should support transactions" do
|
|
82
|
-
|
|
79
|
+
DB.transaction do
|
|
83
80
|
@d << {:name => 'abc', :value => 1}
|
|
84
81
|
end
|
|
85
82
|
|
data/spec/adapters/mssql_spec.rb
CHANGED
|
@@ -1,25 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
require ENV['SEQUEL_MSSQL_SPEC_REQUIRE'] if ENV['SEQUEL_MSSQL_SPEC_REQUIRE']
|
|
1
|
+
SEQUEL_ADAPTER_TEST = :mssql
|
|
4
2
|
|
|
5
|
-
|
|
6
|
-
MSSQL_URL = 'jdbc:sqlserver://localhost;integratedSecurity=true;database=sandbox' unless defined? MSSQL_URL
|
|
7
|
-
MSSQL_DB = Sequel.connect(ENV['SEQUEL_MSSQL_SPEC_DB']||MSSQL_URL)
|
|
8
|
-
end
|
|
9
|
-
INTEGRATION_DB = MSSQL_DB unless defined?(INTEGRATION_DB)
|
|
3
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
|
10
4
|
|
|
11
|
-
def
|
|
5
|
+
def DB.sqls
|
|
12
6
|
(@sqls ||= [])
|
|
13
7
|
end
|
|
14
8
|
logger = Object.new
|
|
15
9
|
def logger.method_missing(m, msg)
|
|
16
|
-
|
|
10
|
+
DB.sqls << msg
|
|
17
11
|
end
|
|
18
|
-
|
|
12
|
+
DB.loggers = [logger]
|
|
19
13
|
|
|
20
14
|
describe "A MSSQL database" do
|
|
21
15
|
before do
|
|
22
|
-
@db =
|
|
16
|
+
@db = DB
|
|
23
17
|
end
|
|
24
18
|
|
|
25
19
|
cspecify "should be able to read fractional part of timestamp", :odbc do
|
|
@@ -40,7 +34,7 @@ end
|
|
|
40
34
|
|
|
41
35
|
describe "A MSSQL database" do
|
|
42
36
|
before do
|
|
43
|
-
@db =
|
|
37
|
+
@db = DB
|
|
44
38
|
@db.create_table! :test3 do
|
|
45
39
|
Integer :value
|
|
46
40
|
Time :time
|
|
@@ -57,7 +51,7 @@ end
|
|
|
57
51
|
|
|
58
52
|
describe "MSSQL" do
|
|
59
53
|
before(:all) do
|
|
60
|
-
@db =
|
|
54
|
+
@db = DB
|
|
61
55
|
@db.create_table!(:test3){Integer :v3}
|
|
62
56
|
@db.create_table!(:test4){Integer :v4}
|
|
63
57
|
@db[:test3].import([:v3], [[1], [2]])
|
|
@@ -82,7 +76,7 @@ end
|
|
|
82
76
|
# CREATE FULLTEXT CATALOG ftscd AS DEFAULT
|
|
83
77
|
describe "MSSQL full_text_search" do
|
|
84
78
|
before do
|
|
85
|
-
@db =
|
|
79
|
+
@db = DB
|
|
86
80
|
@db.drop_table?(:posts)
|
|
87
81
|
end
|
|
88
82
|
after do
|
|
@@ -107,19 +101,19 @@ end if false
|
|
|
107
101
|
|
|
108
102
|
describe "MSSQL Dataset#join_table" do
|
|
109
103
|
specify "should emulate the USING clause with ON" do
|
|
110
|
-
|
|
104
|
+
DB[:items].join(:categories, [:id]).sql.should ==
|
|
111
105
|
'SELECT * FROM [ITEMS] INNER JOIN [CATEGORIES] ON ([CATEGORIES].[ID] = [ITEMS].[ID])'
|
|
112
106
|
['SELECT * FROM [ITEMS] INNER JOIN [CATEGORIES] ON (([CATEGORIES].[ID1] = [ITEMS].[ID1]) AND ([CATEGORIES].[ID2] = [ITEMS].[ID2]))',
|
|
113
107
|
'SELECT * FROM [ITEMS] INNER JOIN [CATEGORIES] ON (([CATEGORIES].[ID2] = [ITEMS].[ID2]) AND ([CATEGORIES].[ID1] = [ITEMS].[ID1]))'].
|
|
114
|
-
should include(
|
|
115
|
-
|
|
108
|
+
should include(DB[:items].join(:categories, [:id1, :id2]).sql)
|
|
109
|
+
DB[:items___i].join(:categories___c, [:id]).sql.should ==
|
|
116
110
|
'SELECT * FROM [ITEMS] AS [I] INNER JOIN [CATEGORIES] AS [C] ON ([C].[ID] = [I].[ID])'
|
|
117
111
|
end
|
|
118
112
|
end
|
|
119
113
|
|
|
120
114
|
describe "MSSQL Dataset#output" do
|
|
121
115
|
before do
|
|
122
|
-
@db =
|
|
116
|
+
@db = DB
|
|
123
117
|
@db.create_table!(:items){String :name; Integer :value}
|
|
124
118
|
@db.create_table!(:out){String :name; Integer :value}
|
|
125
119
|
@ds = @db[:items]
|
|
@@ -197,8 +191,8 @@ end
|
|
|
197
191
|
|
|
198
192
|
describe "MSSQL dataset using #with and #with_recursive" do
|
|
199
193
|
before do
|
|
200
|
-
@db =
|
|
201
|
-
@ds =
|
|
194
|
+
@db = DB
|
|
195
|
+
@ds = DB[:t]
|
|
202
196
|
@ds1 = @ds.with(:t, @db[:x])
|
|
203
197
|
@ds2 = @ds.with_recursive(:t, @db[:x], @db[:t])
|
|
204
198
|
end
|
|
@@ -226,7 +220,7 @@ end
|
|
|
226
220
|
|
|
227
221
|
describe "MSSQL::Dataset#import" do
|
|
228
222
|
before do
|
|
229
|
-
@db =
|
|
223
|
+
@db = DB
|
|
230
224
|
@db.sqls.clear
|
|
231
225
|
@ds = @db[:test]
|
|
232
226
|
end
|
|
@@ -249,7 +243,7 @@ end
|
|
|
249
243
|
|
|
250
244
|
describe "MSSQL joined datasets" do
|
|
251
245
|
before do
|
|
252
|
-
@db =
|
|
246
|
+
@db = DB
|
|
253
247
|
end
|
|
254
248
|
|
|
255
249
|
specify "should format DELETE statements" do
|
|
@@ -265,7 +259,7 @@ end
|
|
|
265
259
|
|
|
266
260
|
describe "Offset support" do
|
|
267
261
|
before do
|
|
268
|
-
@db =
|
|
262
|
+
@db = DB
|
|
269
263
|
@db.create_table!(:i){Integer :id; Integer :parent_id}
|
|
270
264
|
@ds = @db[:i].order(:id)
|
|
271
265
|
@hs = []
|
|
@@ -288,7 +282,7 @@ end
|
|
|
288
282
|
|
|
289
283
|
describe "Common Table Expressions" do
|
|
290
284
|
before do
|
|
291
|
-
@db =
|
|
285
|
+
@db = DB
|
|
292
286
|
@db.create_table!(:i1){Integer :id; Integer :parent_id}
|
|
293
287
|
@db.create_table!(:i2){Integer :id; Integer :parent_id}
|
|
294
288
|
@ds = @db[:i1]
|
|
@@ -360,7 +354,7 @@ end
|
|
|
360
354
|
|
|
361
355
|
describe "MSSSQL::Dataset#insert" do
|
|
362
356
|
before do
|
|
363
|
-
@db =
|
|
357
|
+
@db = DB
|
|
364
358
|
@db.create_table!(:test5){primary_key :xid; Integer :value}
|
|
365
359
|
@db.create_table! :test4 do
|
|
366
360
|
String :name, :size => 20
|
|
@@ -397,13 +391,13 @@ describe "MSSSQL::Dataset#insert" do
|
|
|
397
391
|
end
|
|
398
392
|
|
|
399
393
|
specify "should play nicely with simple_select_all?" do
|
|
400
|
-
|
|
394
|
+
DB[:test4].disable_insert_output.send(:simple_select_all?).should == true
|
|
401
395
|
end
|
|
402
396
|
end
|
|
403
397
|
|
|
404
398
|
describe "MSSSQL::Dataset#into" do
|
|
405
399
|
before do
|
|
406
|
-
@db =
|
|
400
|
+
@db = DB
|
|
407
401
|
end
|
|
408
402
|
|
|
409
403
|
specify "should format SELECT statement" do
|
|
@@ -421,7 +415,7 @@ end
|
|
|
421
415
|
|
|
422
416
|
describe "A MSSQL database" do
|
|
423
417
|
before do
|
|
424
|
-
@db =
|
|
418
|
+
@db = DB
|
|
425
419
|
end
|
|
426
420
|
after do
|
|
427
421
|
@db.drop_table?(:a)
|
|
@@ -447,68 +441,68 @@ end
|
|
|
447
441
|
|
|
448
442
|
describe "MSSQL::Database#rename_table" do
|
|
449
443
|
after do
|
|
450
|
-
|
|
444
|
+
DB.drop_table?(:foo)
|
|
451
445
|
end
|
|
452
446
|
|
|
453
447
|
specify "should work on non-schema bound tables which need escaping" do
|
|
454
|
-
|
|
455
|
-
|
|
448
|
+
DB.quote_identifiers = true
|
|
449
|
+
DB.create_table! :'foo bar' do
|
|
456
450
|
text :name
|
|
457
451
|
end
|
|
458
|
-
|
|
459
|
-
proc {
|
|
452
|
+
DB.drop_table? :foo
|
|
453
|
+
proc { DB.rename_table 'foo bar', 'foo' }.should_not raise_error
|
|
460
454
|
end
|
|
461
455
|
|
|
462
456
|
specify "should work on schema bound tables" do
|
|
463
|
-
|
|
457
|
+
DB.execute(<<-SQL)
|
|
464
458
|
IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'MY')
|
|
465
459
|
EXECUTE sp_executesql N'create schema MY'
|
|
466
460
|
SQL
|
|
467
|
-
|
|
461
|
+
DB.create_table! :MY__foo do
|
|
468
462
|
text :name
|
|
469
463
|
end
|
|
470
|
-
proc {
|
|
471
|
-
proc {
|
|
464
|
+
proc { DB.rename_table :MY__foo, :MY__bar }.should_not raise_error
|
|
465
|
+
proc { DB.rename_table :MY__bar, :foo }.should_not raise_error
|
|
472
466
|
end
|
|
473
467
|
end
|
|
474
468
|
|
|
475
469
|
describe "MSSQL::Dataset#count" do
|
|
476
470
|
specify "should work with a distinct query with an order clause" do
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
471
|
+
DB.create_table!(:items){String :name; Integer :value}
|
|
472
|
+
DB[:items].insert(:name => "name", :value => 1)
|
|
473
|
+
DB[:items].insert(:name => "name", :value => 1)
|
|
474
|
+
DB[:items].select(:name, :value).distinct.order(:name).count.should == 1
|
|
475
|
+
DB[:items].select(:name, :value).group(:name, :value).order(:name).count.should == 1
|
|
482
476
|
end
|
|
483
477
|
end
|
|
484
478
|
|
|
485
479
|
describe "MSSQL::Database#create_table" do
|
|
486
480
|
specify "should support collate with various other column options" do
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
481
|
+
DB.create_table!(:items){ String :name, :size => 128, :collate => :sql_latin1_general_cp1_ci_as, :default => 'foo', :null => false, :unique => true}
|
|
482
|
+
DB[:items].insert
|
|
483
|
+
DB[:items].select_map(:name).should == ["foo"]
|
|
490
484
|
end
|
|
491
485
|
end
|
|
492
486
|
|
|
493
487
|
describe "MSSQL::Database#mssql_unicode_strings = false" do
|
|
494
488
|
before do
|
|
495
|
-
|
|
489
|
+
DB.mssql_unicode_strings = false
|
|
496
490
|
end
|
|
497
491
|
after do
|
|
498
|
-
|
|
499
|
-
|
|
492
|
+
DB.drop_table?(:items)
|
|
493
|
+
DB.mssql_unicode_strings = true
|
|
500
494
|
end
|
|
501
495
|
|
|
502
496
|
specify "should work correctly" do
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
497
|
+
DB.create_table!(:items){String :name}
|
|
498
|
+
DB[:items].mssql_unicode_strings.should == false
|
|
499
|
+
DB[:items].insert(:name=>'foo')
|
|
500
|
+
DB[:items].select_map(:name).should == ['foo']
|
|
507
501
|
end
|
|
508
502
|
|
|
509
503
|
specify "should be overridable at the dataset level" do
|
|
510
|
-
|
|
511
|
-
ds =
|
|
504
|
+
DB.create_table!(:items){String :name}
|
|
505
|
+
ds = DB[:items]
|
|
512
506
|
ds.mssql_unicode_strings.should == false
|
|
513
507
|
ds.mssql_unicode_strings = true
|
|
514
508
|
ds.mssql_unicode_strings.should == true
|
|
@@ -520,7 +514,7 @@ end
|
|
|
520
514
|
describe "A MSSQL database adds index with include" do
|
|
521
515
|
before :all do
|
|
522
516
|
@table_name = :test_index_include
|
|
523
|
-
@db =
|
|
517
|
+
@db = DB
|
|
524
518
|
@db.create_table! @table_name do
|
|
525
519
|
integer :col1
|
|
526
520
|
integer :col2
|
|
@@ -542,34 +536,34 @@ end
|
|
|
542
536
|
|
|
543
537
|
describe "MSSQL::Database#drop_column with a schema" do
|
|
544
538
|
before do
|
|
545
|
-
|
|
539
|
+
DB.run "create schema test" rescue nil
|
|
546
540
|
end
|
|
547
541
|
after do
|
|
548
|
-
|
|
549
|
-
|
|
542
|
+
DB.drop_table(:test__items)
|
|
543
|
+
DB.run "drop schema test" rescue nil
|
|
550
544
|
end
|
|
551
545
|
|
|
552
546
|
specify "drops columns with a default value" do
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
547
|
+
DB.create_table!(:test__items){ Integer :id; String :name, :default => 'widget' }
|
|
548
|
+
DB.drop_column(:test__items, :name)
|
|
549
|
+
DB[:test__items].columns.should == [:id]
|
|
556
550
|
end
|
|
557
551
|
end
|
|
558
552
|
|
|
559
553
|
describe "Database#foreign_key_list" do
|
|
560
554
|
before(:all) do
|
|
561
|
-
|
|
555
|
+
DB.create_table! :items do
|
|
562
556
|
primary_key :id
|
|
563
557
|
integer :sku
|
|
564
558
|
end
|
|
565
|
-
|
|
559
|
+
DB.create_table! :prices do
|
|
566
560
|
integer :item_id
|
|
567
561
|
datetime :valid_from
|
|
568
562
|
float :price
|
|
569
563
|
primary_key [:item_id, :valid_from]
|
|
570
564
|
foreign_key [:item_id], :items, :key => :id, :name => :fk_prices_items
|
|
571
565
|
end
|
|
572
|
-
|
|
566
|
+
DB.create_table! :sales do
|
|
573
567
|
integer :id
|
|
574
568
|
integer :price_item_id
|
|
575
569
|
datetime :price_valid_from
|
|
@@ -577,12 +571,12 @@ describe "Database#foreign_key_list" do
|
|
|
577
571
|
end
|
|
578
572
|
end
|
|
579
573
|
after(:all) do
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
574
|
+
DB.drop_table :sales
|
|
575
|
+
DB.drop_table :prices
|
|
576
|
+
DB.drop_table :items
|
|
583
577
|
end
|
|
584
578
|
it "should support typical foreign keys" do
|
|
585
|
-
|
|
579
|
+
DB.foreign_key_list(:prices).should == [{:name => :fk_prices_items,
|
|
586
580
|
:table => :items,
|
|
587
581
|
:columns => [:item_id],
|
|
588
582
|
:key => [:id],
|
|
@@ -590,7 +584,7 @@ describe "Database#foreign_key_list" do
|
|
|
590
584
|
:on_delete => :no_action }]
|
|
591
585
|
end
|
|
592
586
|
it "should support a foreign key with multiple columns" do
|
|
593
|
-
|
|
587
|
+
DB.foreign_key_list(:sales).should == [{:name => :fk_sales_prices,
|
|
594
588
|
:table => :prices,
|
|
595
589
|
:columns => [:price_item_id, :price_valid_from],
|
|
596
590
|
:key => [:item_id, :valid_from],
|
|
@@ -600,12 +594,12 @@ describe "Database#foreign_key_list" do
|
|
|
600
594
|
|
|
601
595
|
context "with multiple schemas" do
|
|
602
596
|
before(:all) do
|
|
603
|
-
|
|
604
|
-
|
|
597
|
+
DB.execute_ddl "create schema vendor"
|
|
598
|
+
DB.create_table! :vendor__vendors do
|
|
605
599
|
primary_key :id
|
|
606
600
|
varchar :name
|
|
607
601
|
end
|
|
608
|
-
|
|
602
|
+
DB.create_table! :vendor__mapping do
|
|
609
603
|
integer :vendor_id
|
|
610
604
|
integer :item_id
|
|
611
605
|
foreign_key [:vendor_id], :vendor__vendors, :name => :fk_mapping_vendor
|
|
@@ -613,12 +607,12 @@ describe "Database#foreign_key_list" do
|
|
|
613
607
|
end
|
|
614
608
|
end
|
|
615
609
|
after(:all) do
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
610
|
+
DB.drop_table :vendor__mapping
|
|
611
|
+
DB.drop_table :vendor__vendors
|
|
612
|
+
DB.execute_ddl "drop schema vendor"
|
|
619
613
|
end
|
|
620
614
|
it "should support mixed schema bound tables" do
|
|
621
|
-
|
|
615
|
+
DB.foreign_key_list(:vendor__mapping).sort_by{|h| h[:name].to_s}.should == [{:name => :fk_mapping_item, :table => :items, :columns => [:item_id], :key => [:id], :on_update => :no_action, :on_delete => :no_action }, {:name => :fk_mapping_vendor, :table => :vendor__vendors, :columns => [:vendor_id], :key => [:id], :on_update => :no_action, :on_delete => :no_action }]
|
|
622
616
|
end
|
|
623
617
|
end
|
|
624
618
|
end
|
data/spec/adapters/mysql_spec.rb
CHANGED
|
@@ -1,28 +1,21 @@
|
|
|
1
|
+
SEQUEL_ADAPTER_TEST = :mysql
|
|
2
|
+
|
|
1
3
|
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
|
2
4
|
|
|
3
|
-
unless defined?(MYSQL_USER)
|
|
4
|
-
MYSQL_USER = 'root'
|
|
5
|
-
end
|
|
6
|
-
unless defined?(MYSQL_DB)
|
|
7
|
-
MYSQL_URL = (ENV['SEQUEL_MY_SPEC_DB']||"mysql://#{MYSQL_USER}@localhost/sandbox") unless defined? MYSQL_URL
|
|
8
|
-
MYSQL_DB = Sequel.connect(MYSQL_URL)
|
|
9
|
-
end
|
|
10
5
|
unless defined?(MYSQL_SOCKET_FILE)
|
|
11
6
|
MYSQL_SOCKET_FILE = '/tmp/mysql.sock'
|
|
12
7
|
end
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
MYSQL_URI = URI.parse(MYSQL_DB.uri)
|
|
8
|
+
MYSQL_URI = URI.parse(DB.uri)
|
|
16
9
|
|
|
17
|
-
def
|
|
10
|
+
def DB.sqls
|
|
18
11
|
(@sqls ||= [])
|
|
19
12
|
end
|
|
20
13
|
logger = Object.new
|
|
21
14
|
def logger.method_missing(m, msg)
|
|
22
|
-
|
|
15
|
+
DB.sqls << msg
|
|
23
16
|
end
|
|
24
|
-
|
|
25
|
-
|
|
17
|
+
DB.loggers = [logger]
|
|
18
|
+
DB.drop_table?(:items, :dolls, :booltest)
|
|
26
19
|
|
|
27
20
|
SQL_BEGIN = 'BEGIN'
|
|
28
21
|
SQL_ROLLBACK = 'ROLLBACK'
|
|
@@ -30,8 +23,8 @@ SQL_COMMIT = 'COMMIT'
|
|
|
30
23
|
|
|
31
24
|
describe "MySQL", '#create_table' do
|
|
32
25
|
before do
|
|
33
|
-
@db =
|
|
34
|
-
|
|
26
|
+
@db = DB
|
|
27
|
+
DB.sqls.clear
|
|
35
28
|
end
|
|
36
29
|
after do
|
|
37
30
|
@db.drop_table?(:dolls)
|
|
@@ -99,10 +92,10 @@ describe "MySQL", '#create_table' do
|
|
|
99
92
|
end
|
|
100
93
|
end
|
|
101
94
|
|
|
102
|
-
if [:mysql, :mysql2].include?(
|
|
95
|
+
if [:mysql, :mysql2].include?(DB.adapter_scheme)
|
|
103
96
|
describe "Sequel::MySQL::Database#convert_tinyint_to_bool" do
|
|
104
97
|
before do
|
|
105
|
-
@db =
|
|
98
|
+
@db = DB
|
|
106
99
|
@db.create_table(:booltest){column :b, 'tinyint(1)'; column :i, 'tinyint(4)'}
|
|
107
100
|
@ds = @db[:booltest]
|
|
108
101
|
end
|
|
@@ -162,12 +155,12 @@ end
|
|
|
162
155
|
|
|
163
156
|
describe "A MySQL dataset" do
|
|
164
157
|
before do
|
|
165
|
-
|
|
166
|
-
@d =
|
|
167
|
-
|
|
158
|
+
DB.create_table(:items){String :name; Integer :value}
|
|
159
|
+
@d = DB[:items]
|
|
160
|
+
DB.sqls.clear
|
|
168
161
|
end
|
|
169
162
|
after do
|
|
170
|
-
|
|
163
|
+
DB.drop_table?(:items)
|
|
171
164
|
end
|
|
172
165
|
|
|
173
166
|
specify "should quote columns and tables using back-ticks if quoting identifiers" do
|
|
@@ -237,7 +230,7 @@ end
|
|
|
237
230
|
|
|
238
231
|
describe "MySQL datasets" do
|
|
239
232
|
before do
|
|
240
|
-
@d =
|
|
233
|
+
@d = DB[:orders]
|
|
241
234
|
end
|
|
242
235
|
|
|
243
236
|
specify "should correctly quote column references" do
|
|
@@ -253,7 +246,7 @@ end
|
|
|
253
246
|
|
|
254
247
|
describe "Dataset#distinct" do
|
|
255
248
|
before do
|
|
256
|
-
@db =
|
|
249
|
+
@db = DB
|
|
257
250
|
@db.create_table!(:a) do
|
|
258
251
|
Integer :a
|
|
259
252
|
Integer :b
|
|
@@ -276,7 +269,7 @@ end
|
|
|
276
269
|
|
|
277
270
|
describe "MySQL join expressions" do
|
|
278
271
|
before do
|
|
279
|
-
@ds =
|
|
272
|
+
@ds = DB[:nodes]
|
|
280
273
|
end
|
|
281
274
|
|
|
282
275
|
specify "should raise error for :full_outer join requests." do
|
|
@@ -326,7 +319,7 @@ end
|
|
|
326
319
|
|
|
327
320
|
describe "Joined MySQL dataset" do
|
|
328
321
|
before do
|
|
329
|
-
@ds =
|
|
322
|
+
@ds = DB[:nodes]
|
|
330
323
|
end
|
|
331
324
|
|
|
332
325
|
specify "should quote fields correctly" do
|
|
@@ -350,17 +343,17 @@ end
|
|
|
350
343
|
|
|
351
344
|
describe "A MySQL database" do
|
|
352
345
|
after do
|
|
353
|
-
|
|
346
|
+
DB.drop_table?(:test_innodb)
|
|
354
347
|
end
|
|
355
348
|
|
|
356
349
|
specify "should handle the creation and dropping of an InnoDB table with foreign keys" do
|
|
357
|
-
proc{
|
|
350
|
+
proc{DB.create_table!(:test_innodb, :engine=>:InnoDB){primary_key :id; foreign_key :fk, :test_innodb, :key=>:id}}.should_not raise_error
|
|
358
351
|
end
|
|
359
352
|
end
|
|
360
353
|
|
|
361
354
|
describe "A MySQL database" do
|
|
362
355
|
before(:all) do
|
|
363
|
-
@db =
|
|
356
|
+
@db = DB
|
|
364
357
|
@db.create_table! :test2 do
|
|
365
358
|
text :name
|
|
366
359
|
integer :value
|
|
@@ -457,10 +450,10 @@ describe "A MySQL database with table options" do
|
|
|
457
450
|
Sequel::MySQL.default_charset = 'utf8'
|
|
458
451
|
Sequel::MySQL.default_collate = 'utf8_general_ci'
|
|
459
452
|
|
|
460
|
-
@db =
|
|
453
|
+
@db = DB
|
|
461
454
|
@db.drop_table?(:items)
|
|
462
455
|
|
|
463
|
-
|
|
456
|
+
DB.sqls.clear
|
|
464
457
|
end
|
|
465
458
|
after do
|
|
466
459
|
@db.drop_table?(:items)
|
|
@@ -494,9 +487,9 @@ end
|
|
|
494
487
|
|
|
495
488
|
describe "A MySQL database" do
|
|
496
489
|
before do
|
|
497
|
-
@db =
|
|
490
|
+
@db = DB
|
|
498
491
|
@db.drop_table?(:items)
|
|
499
|
-
|
|
492
|
+
DB.sqls.clear
|
|
500
493
|
end
|
|
501
494
|
after do
|
|
502
495
|
@db.drop_table?(:items, :users)
|
|
@@ -596,20 +589,20 @@ describe "A MySQL database" do
|
|
|
596
589
|
end
|
|
597
590
|
|
|
598
591
|
# Socket tests should only be run if the MySQL server is on localhost
|
|
599
|
-
if %w'localhost 127.0.0.1 ::1'.include?(MYSQL_URI.host) and
|
|
592
|
+
if %w'localhost 127.0.0.1 ::1'.include?(MYSQL_URI.host) and DB.adapter_scheme == :mysql
|
|
600
593
|
describe "A MySQL database" do
|
|
601
594
|
specify "should accept a socket option" do
|
|
602
|
-
db = Sequel.mysql(
|
|
595
|
+
db = Sequel.mysql(DB.opts[:database], :host => 'localhost', :user => DB.opts[:user], :password => DB.opts[:password], :socket => MYSQL_SOCKET_FILE)
|
|
603
596
|
proc {db.test_connection}.should_not raise_error
|
|
604
597
|
end
|
|
605
598
|
|
|
606
599
|
specify "should accept a socket option without host option" do
|
|
607
|
-
db = Sequel.mysql(
|
|
600
|
+
db = Sequel.mysql(DB.opts[:database], :user => DB.opts[:user], :password => DB.opts[:password], :socket => MYSQL_SOCKET_FILE)
|
|
608
601
|
proc {db.test_connection}.should_not raise_error
|
|
609
602
|
end
|
|
610
603
|
|
|
611
604
|
specify "should fail to connect with invalid socket" do
|
|
612
|
-
db = Sequel.mysql(
|
|
605
|
+
db = Sequel.mysql(DB.opts[:database], :user => DB.opts[:user], :password => DB.opts[:password], :socket =>'blah')
|
|
613
606
|
proc {db.test_connection}.should raise_error
|
|
614
607
|
end
|
|
615
608
|
end
|
|
@@ -617,93 +610,93 @@ end
|
|
|
617
610
|
|
|
618
611
|
describe "A MySQL database" do
|
|
619
612
|
specify "should accept a read_timeout option when connecting" do
|
|
620
|
-
db = Sequel.connect(
|
|
613
|
+
db = Sequel.connect(DB.opts.merge(:read_timeout=>22342))
|
|
621
614
|
proc {db.test_connection}.should_not raise_error
|
|
622
615
|
end
|
|
623
616
|
|
|
624
617
|
specify "should accept a connect_timeout option when connecting" do
|
|
625
|
-
db = Sequel.connect(
|
|
618
|
+
db = Sequel.connect(DB.opts.merge(:connect_timeout=>22342))
|
|
626
619
|
proc {db.test_connection}.should_not raise_error
|
|
627
620
|
end
|
|
628
621
|
end
|
|
629
622
|
|
|
630
623
|
describe "MySQL foreign key support" do
|
|
631
624
|
after do
|
|
632
|
-
|
|
625
|
+
DB.drop_table?(:testfk, :testpk)
|
|
633
626
|
end
|
|
634
627
|
|
|
635
628
|
specify "should create table without :key" do
|
|
636
|
-
|
|
637
|
-
|
|
629
|
+
DB.create_table!(:testpk){primary_key :id}
|
|
630
|
+
DB.create_table!(:testfk){foreign_key :fk, :testpk}
|
|
638
631
|
end
|
|
639
632
|
|
|
640
633
|
specify "should create table with composite keys without :key" do
|
|
641
|
-
|
|
642
|
-
|
|
634
|
+
DB.create_table!(:testpk){Integer :id; Integer :id2; primary_key([:id, :id2])}
|
|
635
|
+
DB.create_table!(:testfk){Integer :fk; Integer :fk2; foreign_key([:fk, :fk2], :testpk)}
|
|
643
636
|
end
|
|
644
637
|
|
|
645
638
|
specify "should create table with self referential without :key" do
|
|
646
|
-
|
|
639
|
+
DB.create_table!(:testfk){primary_key :id; foreign_key :fk, :testfk}
|
|
647
640
|
end
|
|
648
641
|
|
|
649
642
|
specify "should create table with self referential with composite keys without :key" do
|
|
650
|
-
|
|
643
|
+
DB.create_table!(:testfk){Integer :id; Integer :id2; Integer :fk; Integer :fk2; primary_key([:id, :id2]); foreign_key([:fk, :fk2], :testfk)}
|
|
651
644
|
end
|
|
652
645
|
|
|
653
646
|
specify "should alter table without :key" do
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
647
|
+
DB.create_table!(:testpk){primary_key :id}
|
|
648
|
+
DB.create_table!(:testfk){Integer :id}
|
|
649
|
+
DB.alter_table(:testfk){add_foreign_key :fk, :testpk}
|
|
657
650
|
end
|
|
658
651
|
|
|
659
652
|
specify "should alter table with composite keys without :key" do
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
653
|
+
DB.create_table!(:testpk){Integer :id; Integer :id2; primary_key([:id, :id2])}
|
|
654
|
+
DB.create_table!(:testfk){Integer :fk; Integer :fk2}
|
|
655
|
+
DB.alter_table(:testfk){add_foreign_key([:fk, :fk2], :testpk)}
|
|
663
656
|
end
|
|
664
657
|
|
|
665
658
|
specify "should alter table with self referential without :key" do
|
|
666
|
-
|
|
667
|
-
|
|
659
|
+
DB.create_table!(:testfk){primary_key :id}
|
|
660
|
+
DB.alter_table(:testfk){add_foreign_key :fk, :testfk}
|
|
668
661
|
end
|
|
669
662
|
|
|
670
663
|
specify "should alter table with self referential with composite keys without :key" do
|
|
671
|
-
|
|
672
|
-
|
|
664
|
+
DB.create_table!(:testfk){Integer :id; Integer :id2; Integer :fk; Integer :fk2; primary_key([:id, :id2])}
|
|
665
|
+
DB.alter_table(:testfk){add_foreign_key [:fk, :fk2], :testfk}
|
|
673
666
|
end
|
|
674
667
|
end
|
|
675
668
|
|
|
676
669
|
describe "A grouped MySQL dataset" do
|
|
677
670
|
before do
|
|
678
|
-
|
|
671
|
+
DB.create_table! :test2 do
|
|
679
672
|
text :name
|
|
680
673
|
integer :value
|
|
681
674
|
end
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
675
|
+
DB[:test2] << {:name => '11', :value => 10}
|
|
676
|
+
DB[:test2] << {:name => '11', :value => 20}
|
|
677
|
+
DB[:test2] << {:name => '11', :value => 30}
|
|
678
|
+
DB[:test2] << {:name => '12', :value => 10}
|
|
679
|
+
DB[:test2] << {:name => '12', :value => 20}
|
|
680
|
+
DB[:test2] << {:name => '13', :value => 10}
|
|
688
681
|
end
|
|
689
682
|
after do
|
|
690
|
-
|
|
683
|
+
DB.drop_table?(:test2)
|
|
691
684
|
end
|
|
692
685
|
|
|
693
686
|
specify "should return the correct count for raw sql query" do
|
|
694
|
-
ds =
|
|
687
|
+
ds = DB["select name FROM test2 WHERE name = '11' GROUP BY name"]
|
|
695
688
|
ds.count.should == 1
|
|
696
689
|
end
|
|
697
690
|
|
|
698
691
|
specify "should return the correct count for a normal dataset" do
|
|
699
|
-
ds =
|
|
692
|
+
ds = DB[:test2].select(:name).where(:name => '11').group(:name)
|
|
700
693
|
ds.count.should == 1
|
|
701
694
|
end
|
|
702
695
|
end
|
|
703
696
|
|
|
704
697
|
describe "A MySQL database" do
|
|
705
698
|
before do
|
|
706
|
-
@db =
|
|
699
|
+
@db = DB
|
|
707
700
|
@db.drop_table?(:posts)
|
|
708
701
|
@db.sqls.clear
|
|
709
702
|
end
|
|
@@ -785,18 +778,18 @@ end
|
|
|
785
778
|
|
|
786
779
|
describe "MySQL::Dataset#insert and related methods" do
|
|
787
780
|
before do
|
|
788
|
-
|
|
789
|
-
@d =
|
|
790
|
-
|
|
781
|
+
DB.create_table(:items){String :name; Integer :value}
|
|
782
|
+
@d = DB[:items]
|
|
783
|
+
DB.sqls.clear
|
|
791
784
|
end
|
|
792
785
|
after do
|
|
793
|
-
|
|
786
|
+
DB.drop_table?(:items)
|
|
794
787
|
end
|
|
795
788
|
|
|
796
789
|
specify "#insert should insert record with default values when no arguments given" do
|
|
797
790
|
@d.insert
|
|
798
791
|
check_sqls do
|
|
799
|
-
|
|
792
|
+
DB.sqls.should == ["INSERT INTO `items` () VALUES ()"]
|
|
800
793
|
end
|
|
801
794
|
@d.all.should == [{:name => nil, :value => nil}]
|
|
802
795
|
end
|
|
@@ -804,7 +797,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
|
804
797
|
specify "#insert should insert record with default values when empty hash given" do
|
|
805
798
|
@d.insert({})
|
|
806
799
|
check_sqls do
|
|
807
|
-
|
|
800
|
+
DB.sqls.should == ["INSERT INTO `items` () VALUES ()"]
|
|
808
801
|
end
|
|
809
802
|
@d.all.should == [{:name => nil, :value => nil}]
|
|
810
803
|
end
|
|
@@ -812,23 +805,23 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
|
812
805
|
specify "#insert should insert record with default values when empty array given" do
|
|
813
806
|
@d.insert []
|
|
814
807
|
check_sqls do
|
|
815
|
-
|
|
808
|
+
DB.sqls.should == ["INSERT INTO `items` () VALUES ()"]
|
|
816
809
|
end
|
|
817
810
|
@d.all.should == [{:name => nil, :value => nil}]
|
|
818
811
|
end
|
|
819
812
|
|
|
820
813
|
specify "#on_duplicate_key_update should work with regular inserts" do
|
|
821
|
-
|
|
822
|
-
|
|
814
|
+
DB.add_index :items, :name, :unique=>true
|
|
815
|
+
DB.sqls.clear
|
|
823
816
|
@d.insert(:name => 'abc', :value => 1)
|
|
824
817
|
@d.on_duplicate_key_update(:name, :value => 6).insert(:name => 'abc', :value => 1)
|
|
825
818
|
@d.on_duplicate_key_update(:name, :value => 6).insert(:name => 'def', :value => 2)
|
|
826
819
|
|
|
827
820
|
check_sqls do
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
821
|
+
DB.sqls.length.should == 3
|
|
822
|
+
DB.sqls[0].should =~ /\AINSERT INTO `items` \(`(name|value)`, `(name|value)`\) VALUES \(('abc'|1), (1|'abc')\)\z/
|
|
823
|
+
DB.sqls[1].should =~ /\AINSERT INTO `items` \(`(name|value)`, `(name|value)`\) VALUES \(('abc'|1), (1|'abc')\) ON DUPLICATE KEY UPDATE `name`=VALUES\(`name`\), `value`=6\z/
|
|
824
|
+
DB.sqls[2].should =~ /\AINSERT INTO `items` \(`(name|value)`, `(name|value)`\) VALUES \(('def'|2), (2|'def')\) ON DUPLICATE KEY UPDATE `name`=VALUES\(`name`\), `value`=6\z/
|
|
832
825
|
end
|
|
833
826
|
|
|
834
827
|
@d.all.should == [{:name => 'abc', :value => 6}, {:name => 'def', :value => 2}]
|
|
@@ -838,7 +831,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
|
838
831
|
@d.multi_replace([{:name => 'abc'}, {:name => 'def'}])
|
|
839
832
|
|
|
840
833
|
check_sqls do
|
|
841
|
-
|
|
834
|
+
DB.sqls.should == [
|
|
842
835
|
SQL_BEGIN,
|
|
843
836
|
"REPLACE INTO `items` (`name`) VALUES ('abc'), ('def')",
|
|
844
837
|
SQL_COMMIT
|
|
@@ -855,7 +848,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
|
855
848
|
:commit_every => 2)
|
|
856
849
|
|
|
857
850
|
check_sqls do
|
|
858
|
-
|
|
851
|
+
DB.sqls.should == [
|
|
859
852
|
SQL_BEGIN,
|
|
860
853
|
"REPLACE INTO `items` (`value`) VALUES (1), (2)",
|
|
861
854
|
SQL_COMMIT,
|
|
@@ -878,7 +871,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
|
878
871
|
:slice => 2)
|
|
879
872
|
|
|
880
873
|
check_sqls do
|
|
881
|
-
|
|
874
|
+
DB.sqls.should == [
|
|
882
875
|
SQL_BEGIN,
|
|
883
876
|
"REPLACE INTO `items` (`value`) VALUES (1), (2)",
|
|
884
877
|
SQL_COMMIT,
|
|
@@ -900,7 +893,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
|
900
893
|
@d.multi_insert([{:name => 'abc'}, {:name => 'def'}])
|
|
901
894
|
|
|
902
895
|
check_sqls do
|
|
903
|
-
|
|
896
|
+
DB.sqls.should == [
|
|
904
897
|
SQL_BEGIN,
|
|
905
898
|
"INSERT INTO `items` (`name`) VALUES ('abc'), ('def')",
|
|
906
899
|
SQL_COMMIT
|
|
@@ -917,7 +910,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
|
917
910
|
:commit_every => 2)
|
|
918
911
|
|
|
919
912
|
check_sqls do
|
|
920
|
-
|
|
913
|
+
DB.sqls.should == [
|
|
921
914
|
SQL_BEGIN,
|
|
922
915
|
"INSERT INTO `items` (`value`) VALUES (1), (2)",
|
|
923
916
|
SQL_COMMIT,
|
|
@@ -940,7 +933,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
|
940
933
|
:slice => 2)
|
|
941
934
|
|
|
942
935
|
check_sqls do
|
|
943
|
-
|
|
936
|
+
DB.sqls.should == [
|
|
944
937
|
SQL_BEGIN,
|
|
945
938
|
"INSERT INTO `items` (`value`) VALUES (1), (2)",
|
|
946
939
|
SQL_COMMIT,
|
|
@@ -962,7 +955,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
|
962
955
|
@d.import([:name, :value], [['abc', 1], ['def', 2]])
|
|
963
956
|
|
|
964
957
|
check_sqls do
|
|
965
|
-
|
|
958
|
+
DB.sqls.should == [
|
|
966
959
|
SQL_BEGIN,
|
|
967
960
|
"INSERT INTO `items` (`name`, `value`) VALUES ('abc', 1), ('def', 2)",
|
|
968
961
|
SQL_COMMIT
|
|
@@ -979,7 +972,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
|
979
972
|
@d.insert_ignore.multi_insert([{:name => 'abc'}, {:name => 'def'}])
|
|
980
973
|
|
|
981
974
|
check_sqls do
|
|
982
|
-
|
|
975
|
+
DB.sqls.should == [
|
|
983
976
|
SQL_BEGIN,
|
|
984
977
|
"INSERT IGNORE INTO `items` (`name`) VALUES ('abc'), ('def')",
|
|
985
978
|
SQL_COMMIT
|
|
@@ -994,7 +987,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
|
994
987
|
specify "#insert_ignore should add the IGNORE keyword for single inserts" do
|
|
995
988
|
@d.insert_ignore.insert(:name => 'ghi')
|
|
996
989
|
check_sqls do
|
|
997
|
-
|
|
990
|
+
DB.sqls.should == ["INSERT IGNORE INTO `items` (`name`) VALUES ('ghi')"]
|
|
998
991
|
end
|
|
999
992
|
@d.all.should == [{:name => 'ghi', :value => nil}]
|
|
1000
993
|
end
|
|
@@ -1003,7 +996,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
|
1003
996
|
@d.on_duplicate_key_update.import([:name,:value], [['abc', 1], ['def',2]])
|
|
1004
997
|
|
|
1005
998
|
check_sqls do
|
|
1006
|
-
|
|
999
|
+
DB.sqls.should == [
|
|
1007
1000
|
"SELECT * FROM `items` LIMIT 1",
|
|
1008
1001
|
SQL_BEGIN,
|
|
1009
1002
|
"INSERT INTO `items` (`name`, `value`) VALUES ('abc', 1), ('def', 2) ON DUPLICATE KEY UPDATE `name`=VALUES(`name`), `value`=VALUES(`value`)",
|
|
@@ -1022,7 +1015,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
|
1022
1015
|
)
|
|
1023
1016
|
|
|
1024
1017
|
check_sqls do
|
|
1025
|
-
|
|
1018
|
+
DB.sqls.should == [
|
|
1026
1019
|
SQL_BEGIN,
|
|
1027
1020
|
"INSERT INTO `items` (`name`, `value`) VALUES ('abc', 1), ('def', 2) ON DUPLICATE KEY UPDATE `value`=VALUES(`value`)",
|
|
1028
1021
|
SQL_COMMIT
|
|
@@ -1038,21 +1031,21 @@ end
|
|
|
1038
1031
|
|
|
1039
1032
|
describe "MySQL::Dataset#update and related methods" do
|
|
1040
1033
|
before do
|
|
1041
|
-
|
|
1042
|
-
@d =
|
|
1034
|
+
DB.create_table(:items){String :name; Integer :value; index :name, :unique=>true}
|
|
1035
|
+
@d = DB[:items]
|
|
1043
1036
|
end
|
|
1044
1037
|
after do
|
|
1045
|
-
|
|
1038
|
+
DB.drop_table?(:items)
|
|
1046
1039
|
end
|
|
1047
1040
|
|
|
1048
1041
|
specify "#update_ignore should not raise error where normal update would fail" do
|
|
1049
1042
|
@d.insert(:name => 'cow', :value => 0)
|
|
1050
1043
|
@d.insert(:name => 'cat', :value => 1)
|
|
1051
1044
|
proc{@d.where(:value => 1).update(:name => 'cow')}.should raise_error(Sequel::DatabaseError)
|
|
1052
|
-
|
|
1045
|
+
DB.sqls.clear
|
|
1053
1046
|
@d.update_ignore.where(:value => 1).update(:name => 'cow')
|
|
1054
1047
|
check_sqls do
|
|
1055
|
-
|
|
1048
|
+
DB.sqls.should == ["UPDATE IGNORE `items` SET `name` = 'cow' WHERE (`value` = 1)"]
|
|
1056
1049
|
end
|
|
1057
1050
|
@d.order(:name).all.should == [{:name => 'cat', :value => 1}, {:name => 'cow', :value => 0}]
|
|
1058
1051
|
end
|
|
@@ -1060,16 +1053,16 @@ end
|
|
|
1060
1053
|
|
|
1061
1054
|
describe "MySQL::Dataset#replace" do
|
|
1062
1055
|
before do
|
|
1063
|
-
|
|
1064
|
-
@d =
|
|
1065
|
-
|
|
1056
|
+
DB.create_table(:items){Integer :id, :unique=>true; Integer :value}
|
|
1057
|
+
@d = DB[:items]
|
|
1058
|
+
DB.sqls.clear
|
|
1066
1059
|
end
|
|
1067
1060
|
after do
|
|
1068
|
-
|
|
1061
|
+
DB.drop_table?(:items)
|
|
1069
1062
|
end
|
|
1070
1063
|
|
|
1071
1064
|
specify "should use default values if they exist" do
|
|
1072
|
-
|
|
1065
|
+
DB.alter_table(:items){set_column_default :id, 1; set_column_default :value, 2}
|
|
1073
1066
|
@d.replace
|
|
1074
1067
|
@d.all.should == [{:id=>1, :value=>2}]
|
|
1075
1068
|
@d.replace([])
|
|
@@ -1102,7 +1095,7 @@ end
|
|
|
1102
1095
|
|
|
1103
1096
|
describe "MySQL::Dataset#complex_expression_sql" do
|
|
1104
1097
|
before do
|
|
1105
|
-
@d =
|
|
1098
|
+
@d = DB.dataset
|
|
1106
1099
|
end
|
|
1107
1100
|
|
|
1108
1101
|
specify "should handle string concatenation with CONCAT if more than one record" do
|
|
@@ -1119,28 +1112,28 @@ end
|
|
|
1119
1112
|
|
|
1120
1113
|
describe "MySQL::Dataset#calc_found_rows" do
|
|
1121
1114
|
before do
|
|
1122
|
-
|
|
1115
|
+
DB.create_table!(:items){Integer :a}
|
|
1123
1116
|
end
|
|
1124
1117
|
after do
|
|
1125
|
-
|
|
1118
|
+
DB.drop_table?(:items)
|
|
1126
1119
|
end
|
|
1127
1120
|
|
|
1128
1121
|
specify "should add the SQL_CALC_FOUND_ROWS keyword when selecting" do
|
|
1129
|
-
|
|
1122
|
+
DB[:items].select(:a).calc_found_rows.limit(1).sql.should == \
|
|
1130
1123
|
'SELECT SQL_CALC_FOUND_ROWS `a` FROM `items` LIMIT 1'
|
|
1131
1124
|
end
|
|
1132
1125
|
|
|
1133
1126
|
specify "should count matching rows disregarding LIMIT clause" do
|
|
1134
|
-
|
|
1135
|
-
|
|
1127
|
+
DB[:items].multi_insert([{:a => 1}, {:a => 1}, {:a => 2}])
|
|
1128
|
+
DB.sqls.clear
|
|
1136
1129
|
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1130
|
+
DB.synchronize do
|
|
1131
|
+
DB[:items].calc_found_rows.filter(:a => 1).limit(1).all.should == [{:a => 1}]
|
|
1132
|
+
DB.dataset.select(Sequel.function(:FOUND_ROWS).as(:rows)).all.should == [{:rows => 2 }]
|
|
1140
1133
|
end
|
|
1141
1134
|
|
|
1142
1135
|
check_sqls do
|
|
1143
|
-
|
|
1136
|
+
DB.sqls.should == [
|
|
1144
1137
|
'SELECT SQL_CALC_FOUND_ROWS * FROM `items` WHERE (`a` = 1) LIMIT 1',
|
|
1145
1138
|
'SELECT FOUND_ROWS() AS `rows`',
|
|
1146
1139
|
]
|
|
@@ -1148,34 +1141,34 @@ describe "MySQL::Dataset#calc_found_rows" do
|
|
|
1148
1141
|
end
|
|
1149
1142
|
end
|
|
1150
1143
|
|
|
1151
|
-
if
|
|
1144
|
+
if DB.adapter_scheme == :mysql or DB.adapter_scheme == :jdbc or DB.adapter_scheme == :mysql2
|
|
1152
1145
|
describe "MySQL Stored Procedures" do
|
|
1153
1146
|
before do
|
|
1154
|
-
|
|
1155
|
-
@d =
|
|
1156
|
-
|
|
1147
|
+
DB.create_table(:items){Integer :id; Integer :value}
|
|
1148
|
+
@d = DB[:items]
|
|
1149
|
+
DB.sqls.clear
|
|
1157
1150
|
end
|
|
1158
1151
|
after do
|
|
1159
|
-
|
|
1160
|
-
|
|
1152
|
+
DB.drop_table?(:items)
|
|
1153
|
+
DB.execute('DROP PROCEDURE test_sproc')
|
|
1161
1154
|
end
|
|
1162
1155
|
|
|
1163
1156
|
specify "should be callable on the database object" do
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1157
|
+
DB.execute_ddl('CREATE PROCEDURE test_sproc() BEGIN DELETE FROM items; END')
|
|
1158
|
+
DB[:items].delete
|
|
1159
|
+
DB[:items].insert(:value=>1)
|
|
1160
|
+
DB[:items].count.should == 1
|
|
1161
|
+
DB.call_sproc(:test_sproc)
|
|
1162
|
+
DB[:items].count.should == 0
|
|
1170
1163
|
end
|
|
1171
1164
|
|
|
1172
1165
|
# Mysql2 doesn't support stored procedures that return result sets, probably because
|
|
1173
1166
|
# CLIENT_MULTI_RESULTS is not set.
|
|
1174
|
-
unless
|
|
1167
|
+
unless DB.adapter_scheme == :mysql2
|
|
1175
1168
|
specify "should be callable on the dataset object" do
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
@d =
|
|
1169
|
+
DB.execute_ddl('CREATE PROCEDURE test_sproc(a INTEGER) BEGIN SELECT *, a AS b FROM items; END')
|
|
1170
|
+
DB[:items].delete
|
|
1171
|
+
@d = DB[:items]
|
|
1179
1172
|
@d.call_sproc(:select, :test_sproc, 3).should == []
|
|
1180
1173
|
@d.insert(:value=>1)
|
|
1181
1174
|
@d.call_sproc(:select, :test_sproc, 4).should == [{:id=>nil, :value=>1, :b=>4}]
|
|
@@ -1184,9 +1177,9 @@ if MYSQL_DB.adapter_scheme == :mysql or MYSQL_DB.adapter_scheme == :jdbc or MYSQ
|
|
|
1184
1177
|
end
|
|
1185
1178
|
|
|
1186
1179
|
specify "should be callable on the dataset object with multiple arguments" do
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
@d =
|
|
1180
|
+
DB.execute_ddl('CREATE PROCEDURE test_sproc(a INTEGER, c INTEGER) BEGIN SELECT *, a AS b, c AS d FROM items; END')
|
|
1181
|
+
DB[:items].delete
|
|
1182
|
+
@d = DB[:items]
|
|
1190
1183
|
@d.call_sproc(:select, :test_sproc, 3, 4).should == []
|
|
1191
1184
|
@d.insert(:value=>1)
|
|
1192
1185
|
@d.call_sproc(:select, :test_sproc, 4, 5).should == [{:id=>nil, :value=>1, :b=>4, :d=>5}]
|
|
@@ -1196,58 +1189,58 @@ if MYSQL_DB.adapter_scheme == :mysql or MYSQL_DB.adapter_scheme == :jdbc or MYSQ
|
|
|
1196
1189
|
end
|
|
1197
1190
|
|
|
1198
1191
|
specify "should deal with nil values" do
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1192
|
+
DB.execute_ddl('CREATE PROCEDURE test_sproc(i INTEGER, v INTEGER) BEGIN INSERT INTO items VALUES (i, v); END')
|
|
1193
|
+
DB[:items].delete
|
|
1194
|
+
DB.call_sproc(:test_sproc, :args=>[1, nil])
|
|
1195
|
+
DB[:items].all.should == [{:id=>1, :value=>nil}]
|
|
1203
1196
|
end
|
|
1204
1197
|
end
|
|
1205
1198
|
end
|
|
1206
1199
|
|
|
1207
|
-
if
|
|
1200
|
+
if DB.adapter_scheme == :mysql
|
|
1208
1201
|
describe "MySQL bad date/time conversions" do
|
|
1209
1202
|
after do
|
|
1210
|
-
|
|
1203
|
+
DB.convert_invalid_date_time = false
|
|
1211
1204
|
end
|
|
1212
1205
|
|
|
1213
1206
|
specify "should raise an exception when a bad date/time is used and convert_invalid_date_time is false" do
|
|
1214
|
-
|
|
1215
|
-
proc{
|
|
1216
|
-
proc{
|
|
1217
|
-
proc{
|
|
1207
|
+
DB.convert_invalid_date_time = false
|
|
1208
|
+
proc{DB["SELECT CAST('0000-00-00' AS date)"].single_value}.should raise_error(Sequel::InvalidValue)
|
|
1209
|
+
proc{DB["SELECT CAST('0000-00-00 00:00:00' AS datetime)"].single_value}.should raise_error(Sequel::InvalidValue)
|
|
1210
|
+
proc{DB["SELECT CAST('25:00:00' AS time)"].single_value}.should raise_error(Sequel::InvalidValue)
|
|
1218
1211
|
end
|
|
1219
1212
|
|
|
1220
1213
|
specify "should not use a nil value bad date/time is used and convert_invalid_date_time is nil or :nil" do
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1214
|
+
DB.convert_invalid_date_time = nil
|
|
1215
|
+
DB["SELECT CAST('0000-00-00' AS date)"].single_value.should == nil
|
|
1216
|
+
DB["SELECT CAST('0000-00-00 00:00:00' AS datetime)"].single_value.should == nil
|
|
1217
|
+
DB["SELECT CAST('25:00:00' AS time)"].single_value.should == nil
|
|
1218
|
+
DB.convert_invalid_date_time = :nil
|
|
1219
|
+
DB["SELECT CAST('0000-00-00' AS date)"].single_value.should == nil
|
|
1220
|
+
DB["SELECT CAST('0000-00-00 00:00:00' AS datetime)"].single_value.should == nil
|
|
1221
|
+
DB["SELECT CAST('25:00:00' AS time)"].single_value.should == nil
|
|
1229
1222
|
end
|
|
1230
1223
|
|
|
1231
1224
|
specify "should not use a nil value bad date/time is used and convert_invalid_date_time is :string" do
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1225
|
+
DB.convert_invalid_date_time = :string
|
|
1226
|
+
DB["SELECT CAST('0000-00-00' AS date)"].single_value.should == '0000-00-00'
|
|
1227
|
+
DB["SELECT CAST('0000-00-00 00:00:00' AS datetime)"].single_value.should == '0000-00-00 00:00:00'
|
|
1228
|
+
DB["SELECT CAST('25:00:00' AS time)"].single_value.should == '25:00:00'
|
|
1236
1229
|
end
|
|
1237
1230
|
end
|
|
1238
1231
|
|
|
1239
1232
|
describe "MySQL multiple result sets" do
|
|
1240
1233
|
before do
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
@ds =
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1234
|
+
DB.create_table!(:a){Integer :a}
|
|
1235
|
+
DB.create_table!(:b){Integer :b}
|
|
1236
|
+
@ds = DB['SELECT * FROM a; SELECT * FROM b']
|
|
1237
|
+
DB[:a].insert(10)
|
|
1238
|
+
DB[:a].insert(15)
|
|
1239
|
+
DB[:b].insert(20)
|
|
1240
|
+
DB[:b].insert(25)
|
|
1248
1241
|
end
|
|
1249
1242
|
after do
|
|
1250
|
-
|
|
1243
|
+
DB.drop_table?(:a, :b)
|
|
1251
1244
|
end
|
|
1252
1245
|
|
|
1253
1246
|
specify "should combine all results by default" do
|
|
@@ -1255,14 +1248,14 @@ if MYSQL_DB.adapter_scheme == :mysql
|
|
|
1255
1248
|
end
|
|
1256
1249
|
|
|
1257
1250
|
specify "should work with Database#run" do
|
|
1258
|
-
proc{
|
|
1259
|
-
proc{
|
|
1251
|
+
proc{DB.run('SELECT * FROM a; SELECT * FROM b')}.should_not raise_error
|
|
1252
|
+
proc{DB.run('SELECT * FROM a; SELECT * FROM b')}.should_not raise_error
|
|
1260
1253
|
end
|
|
1261
1254
|
|
|
1262
1255
|
specify "should work with Database#run and other statements" do
|
|
1263
|
-
proc{
|
|
1264
|
-
|
|
1265
|
-
|
|
1256
|
+
proc{DB.run('UPDATE a SET a = 1; SELECT * FROM a; DELETE FROM b')}.should_not raise_error
|
|
1257
|
+
DB[:a].select_order_map(:a).should == [1, 1]
|
|
1258
|
+
DB[:b].all.should == []
|
|
1266
1259
|
end
|
|
1267
1260
|
|
|
1268
1261
|
specify "should split results returned into arrays if split_multiple_result_sets is used" do
|
|
@@ -1283,24 +1276,24 @@ if MYSQL_DB.adapter_scheme == :mysql
|
|
|
1283
1276
|
end
|
|
1284
1277
|
|
|
1285
1278
|
specify "should not allow splitting a graphed dataset" do
|
|
1286
|
-
proc{
|
|
1279
|
+
proc{DB[:a].graph(:b, :b=>:a).split_multiple_result_sets}.should raise_error(Sequel::Error)
|
|
1287
1280
|
end
|
|
1288
1281
|
end
|
|
1289
1282
|
end
|
|
1290
1283
|
|
|
1291
|
-
if
|
|
1284
|
+
if DB.adapter_scheme == :mysql2
|
|
1292
1285
|
describe "Mysql2 streaming" do
|
|
1293
1286
|
before(:all) do
|
|
1294
|
-
|
|
1295
|
-
|
|
1287
|
+
DB.create_table!(:a){Integer :a}
|
|
1288
|
+
DB.transaction do
|
|
1296
1289
|
1000.times do |i|
|
|
1297
|
-
|
|
1290
|
+
DB[:a].insert(i)
|
|
1298
1291
|
end
|
|
1299
1292
|
end
|
|
1300
|
-
@ds =
|
|
1293
|
+
@ds = DB[:a].stream.order(:a)
|
|
1301
1294
|
end
|
|
1302
1295
|
after(:all) do
|
|
1303
|
-
|
|
1296
|
+
DB.drop_table?(:a)
|
|
1304
1297
|
end
|
|
1305
1298
|
|
|
1306
1299
|
specify "should correctly stream results" do
|