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
|
@@ -3,13 +3,19 @@ require 'logger'
|
|
|
3
3
|
unless Object.const_defined?('Sequel')
|
|
4
4
|
$:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
|
|
5
5
|
require 'sequel'
|
|
6
|
-
Sequel.quote_identifiers = false
|
|
7
6
|
end
|
|
8
7
|
begin
|
|
9
8
|
require File.join(File.dirname(File.dirname(File.expand_path(__FILE__))), 'spec_config.rb')
|
|
10
9
|
rescue LoadError
|
|
11
10
|
end
|
|
12
11
|
|
|
12
|
+
if ENV['SEQUEL_COLUMNS_INTROSPECTION']
|
|
13
|
+
Sequel.extension :columns_introspection
|
|
14
|
+
Sequel::Dataset.introspect_all_columns
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
Sequel::Model.cache_anonymous_models = false
|
|
18
|
+
|
|
13
19
|
class Sequel::Database
|
|
14
20
|
def log_duration(duration, message)
|
|
15
21
|
log_info(message)
|
|
@@ -26,11 +32,8 @@ end
|
|
|
26
32
|
end
|
|
27
33
|
end
|
|
28
34
|
|
|
29
|
-
def self.log_specify(message, &block)
|
|
30
|
-
specify(message){log{instance_eval(&block)}}
|
|
31
|
-
end
|
|
32
|
-
|
|
33
35
|
def self.cspecify(message, *checked, &block)
|
|
36
|
+
return specify(message, &block) if ENV['SEQUEL_NO_PENDING']
|
|
34
37
|
pending = false
|
|
35
38
|
checked.each do |c|
|
|
36
39
|
case c
|
|
@@ -13,6 +13,7 @@ describe "An SQLite database" do
|
|
|
13
13
|
end
|
|
14
14
|
after do
|
|
15
15
|
@db.foreign_keys = @fk
|
|
16
|
+
@db.case_sensitive_like = true
|
|
16
17
|
Sequel.datetime_class = Time
|
|
17
18
|
end
|
|
18
19
|
|
|
@@ -38,6 +39,16 @@ describe "An SQLite database" do
|
|
|
38
39
|
end
|
|
39
40
|
end
|
|
40
41
|
|
|
42
|
+
specify "should respect case sensitive like false" do
|
|
43
|
+
@db.case_sensitive_like = false
|
|
44
|
+
@db.get(Sequel.like('a', 'A')).to_s.should == '1'
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
specify "should respect case sensitive like true" do
|
|
48
|
+
@db.case_sensitive_like = true
|
|
49
|
+
@db.get(Sequel.like('a', 'A')).to_s.should == '0'
|
|
50
|
+
end
|
|
51
|
+
|
|
41
52
|
specify "should provide the SQLite version as an integer" do
|
|
42
53
|
@db.sqlite_version.should be_a_kind_of(Integer)
|
|
43
54
|
end
|
|
@@ -66,8 +77,19 @@ describe "An SQLite database" do
|
|
|
66
77
|
@db[:fk].all.should == [{:id=>1, :parent_id=>2}]
|
|
67
78
|
end
|
|
68
79
|
|
|
80
|
+
specify "should support a use_timestamp_timezones setting" do
|
|
81
|
+
@db.create_table!(:time){Time :time}
|
|
82
|
+
@db[:time].insert(Time.now)
|
|
83
|
+
@db[:time].get(:time.cast_string).should =~ /[-+]\d\d\d\d\z/
|
|
84
|
+
@db.use_timestamp_timezones = false
|
|
85
|
+
@db[:time].delete
|
|
86
|
+
@db[:time].insert(Time.now)
|
|
87
|
+
@db[:time].get(:time.cast_string).should_not =~ /[-+]\d\d\d\d\z/
|
|
88
|
+
@db.use_timestamp_timezones = true
|
|
89
|
+
end
|
|
90
|
+
|
|
69
91
|
specify "should provide a list of existing tables" do
|
|
70
|
-
@db.drop_table(:testing)
|
|
92
|
+
@db.drop_table?(:testing)
|
|
71
93
|
@db.tables.should be_a_kind_of(Array)
|
|
72
94
|
@db.tables.should_not include(:testing)
|
|
73
95
|
@db.create_table! :testing do
|
|
@@ -128,18 +150,98 @@ describe "An SQLite database" do
|
|
|
128
150
|
end
|
|
129
151
|
end
|
|
130
152
|
|
|
131
|
-
describe "
|
|
153
|
+
describe "SQLite type conversion" do
|
|
132
154
|
before do
|
|
133
|
-
@
|
|
155
|
+
@db = SQLITE_DB
|
|
156
|
+
@integer_booleans = @db.integer_booleans
|
|
157
|
+
@db.integer_booleans = true
|
|
158
|
+
@ds = @db[:items]
|
|
159
|
+
@db.drop_table?(:items)
|
|
160
|
+
end
|
|
161
|
+
after do
|
|
162
|
+
@db.integer_booleans = @integer_booleans
|
|
163
|
+
Sequel.datetime_class = Time
|
|
164
|
+
@db.drop_table?(:items)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
specify "should handle integers in boolean columns" do
|
|
168
|
+
@db.create_table(:items){TrueClass :a}
|
|
169
|
+
@db[:items].insert(false)
|
|
170
|
+
@db[:items].select_map(:a).should == [false]
|
|
171
|
+
@db[:items].select_map(:a+:a).should == [0]
|
|
172
|
+
@db[:items].update(:a=>true)
|
|
173
|
+
@db[:items].select_map(:a).should == [true]
|
|
174
|
+
@db[:items].select_map(:a+:a).should == [2]
|
|
134
175
|
end
|
|
135
176
|
|
|
136
|
-
specify "should handle
|
|
137
|
-
@
|
|
138
|
-
@
|
|
139
|
-
@
|
|
140
|
-
@
|
|
177
|
+
specify "should handle integers/floats/strings/decimals in numeric/decimal columns" do
|
|
178
|
+
@db.create_table(:items){Numeric :a}
|
|
179
|
+
@db[:items].insert(100)
|
|
180
|
+
@db[:items].select_map(:a).should == [BigDecimal.new('100')]
|
|
181
|
+
@db[:items].get(:a).should be_a_kind_of(BigDecimal)
|
|
182
|
+
|
|
183
|
+
@db[:items].update(:a=>100.1)
|
|
184
|
+
@db[:items].select_map(:a).should == [BigDecimal.new('100.1')]
|
|
185
|
+
@db[:items].get(:a).should be_a_kind_of(BigDecimal)
|
|
186
|
+
|
|
187
|
+
@db[:items].update(:a=>'100.1')
|
|
188
|
+
@db[:items].select_map(:a).should == [BigDecimal.new('100.1')]
|
|
189
|
+
@db[:items].get(:a).should be_a_kind_of(BigDecimal)
|
|
190
|
+
|
|
191
|
+
@db[:items].update(:a=>BigDecimal.new('100.1'))
|
|
192
|
+
@db[:items].select_map(:a).should == [BigDecimal.new('100.1')]
|
|
193
|
+
@db[:items].get(:a).should be_a_kind_of(BigDecimal)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
specify "should handle integer/float date columns as julian date" do
|
|
197
|
+
@db.create_table(:items){Date :a}
|
|
198
|
+
i = 2455979
|
|
199
|
+
@db[:items].insert(i)
|
|
200
|
+
@db[:items].first.should == {:a=>Date.jd(i)}
|
|
201
|
+
@db[:items].update(:a=>2455979.1)
|
|
202
|
+
@db[:items].first.should == {:a=>Date.jd(i)}
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
specify "should handle integer/float time columns as seconds" do
|
|
206
|
+
@db.create_table(:items){Time :a, :only_time=>true}
|
|
207
|
+
@db[:items].insert(3661)
|
|
208
|
+
@db[:items].first.should == {:a=>Sequel::SQLTime.create(1, 1, 1)}
|
|
209
|
+
@db[:items].update(:a=>3661.000001)
|
|
210
|
+
@db[:items].first.should == {:a=>Sequel::SQLTime.create(1, 1, 1, 1)}
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
specify "should handle integer datetime columns as unix timestamp" do
|
|
214
|
+
@db.create_table(:items){DateTime :a}
|
|
215
|
+
i = 1329860756
|
|
216
|
+
@db[:items].insert(i)
|
|
217
|
+
@db[:items].first.should == {:a=>Time.at(i)}
|
|
218
|
+
Sequel.datetime_class = DateTime
|
|
219
|
+
@db[:items].first.should == {:a=>DateTime.strptime(i.to_s, '%s')}
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
specify "should handle float datetime columns as julian date" do
|
|
223
|
+
@db.create_table(:items){DateTime :a}
|
|
224
|
+
i = 2455979.5
|
|
225
|
+
@db[:items].insert(i)
|
|
226
|
+
@db[:items].first.should == {:a=>Time.at(1329825600)}
|
|
227
|
+
Sequel.datetime_class = DateTime
|
|
228
|
+
@db[:items].first.should == {:a=>DateTime.jd(2455979.5)}
|
|
141
229
|
end
|
|
142
230
|
|
|
231
|
+
specify "should handle integer/float blob columns" do
|
|
232
|
+
@db.create_table(:items){File :a}
|
|
233
|
+
@db[:items].insert(1)
|
|
234
|
+
@db[:items].first.should == {:a=>Sequel::SQL::Blob.new('1')}
|
|
235
|
+
@db[:items].update(:a=>'1.1')
|
|
236
|
+
@db[:items].first.should == {:a=>Sequel::SQL::Blob.new(1.1.to_s)}
|
|
237
|
+
end
|
|
238
|
+
end if SQLITE_DB.adapter_scheme == :sqlite
|
|
239
|
+
|
|
240
|
+
describe "An SQLite dataset" do
|
|
241
|
+
before do
|
|
242
|
+
@d = SQLITE_DB[:items]
|
|
243
|
+
end
|
|
244
|
+
|
|
143
245
|
specify "should raise errors if given a regexp pattern match" do
|
|
144
246
|
proc{@d.literal(:x.like(/a/))}.should raise_error(Sequel::Error)
|
|
145
247
|
proc{@d.literal(~:x.like(/a/))}.should raise_error(Sequel::Error)
|
|
@@ -164,27 +266,27 @@ end
|
|
|
164
266
|
|
|
165
267
|
describe "An SQLite dataset AS clause" do
|
|
166
268
|
specify "should use a string literal for :col___alias" do
|
|
167
|
-
SQLITE_DB.literal(:c___a).should == "c AS 'a'"
|
|
269
|
+
SQLITE_DB.literal(:c___a).should == "`c` AS 'a'"
|
|
168
270
|
end
|
|
169
271
|
|
|
170
272
|
specify "should use a string literal for :table__col___alias" do
|
|
171
|
-
SQLITE_DB.literal(:t__c___a).should == "t
|
|
273
|
+
SQLITE_DB.literal(:t__c___a).should == "`t`.`c` AS 'a'"
|
|
172
274
|
end
|
|
173
275
|
|
|
174
276
|
specify "should use a string literal for :column.as(:alias)" do
|
|
175
|
-
SQLITE_DB.literal(:c.as(:a)).should == "c AS 'a'"
|
|
277
|
+
SQLITE_DB.literal(:c.as(:a)).should == "`c` AS 'a'"
|
|
176
278
|
end
|
|
177
279
|
|
|
178
280
|
specify "should use a string literal in the SELECT clause" do
|
|
179
|
-
SQLITE_DB[:t].select(:c___a).sql.should == "SELECT c AS 'a' FROM t"
|
|
281
|
+
SQLITE_DB[:t].select(:c___a).sql.should == "SELECT `c` AS 'a' FROM `t`"
|
|
180
282
|
end
|
|
181
283
|
|
|
182
284
|
specify "should use a string literal in the FROM clause" do
|
|
183
|
-
SQLITE_DB[:t___a].sql.should == "SELECT * FROM t AS 'a'"
|
|
285
|
+
SQLITE_DB[:t___a].sql.should == "SELECT * FROM `t` AS 'a'"
|
|
184
286
|
end
|
|
185
287
|
|
|
186
288
|
specify "should use a string literal in the JOIN clause" do
|
|
187
|
-
SQLITE_DB[:t].join_table(:natural, :j, nil, :a).sql.should == "SELECT * FROM t NATURAL JOIN j AS 'a'"
|
|
289
|
+
SQLITE_DB[:t].join_table(:natural, :j, nil, :a).sql.should == "SELECT * FROM `t` NATURAL JOIN `j` AS 'a'"
|
|
188
290
|
end
|
|
189
291
|
end
|
|
190
292
|
|
|
@@ -261,7 +363,7 @@ describe "SQLite dataset" do
|
|
|
261
363
|
@d << {:name => 'ghi', :value => 7.89}
|
|
262
364
|
end
|
|
263
365
|
after do
|
|
264
|
-
SQLITE_DB.drop_table(:test, :items)
|
|
366
|
+
SQLITE_DB.drop_table?(:test, :items)
|
|
265
367
|
end
|
|
266
368
|
|
|
267
369
|
specify "should be able to insert from a subquery" do
|
|
@@ -272,13 +374,13 @@ describe "SQLite dataset" do
|
|
|
272
374
|
end
|
|
273
375
|
|
|
274
376
|
specify "should support #explain" do
|
|
275
|
-
SQLITE_DB[:test].explain.should be_a_kind_of(
|
|
377
|
+
SQLITE_DB[:test].explain.should be_a_kind_of(String)
|
|
276
378
|
end
|
|
277
379
|
|
|
278
380
|
specify "should have #explain work when identifier_output_method is modified" do
|
|
279
381
|
ds = SQLITE_DB[:test]
|
|
280
382
|
ds.identifier_output_method = :upcase
|
|
281
|
-
ds.explain.should be_a_kind_of(
|
|
383
|
+
ds.explain.should be_a_kind_of(String)
|
|
282
384
|
end
|
|
283
385
|
end
|
|
284
386
|
|
|
@@ -313,6 +415,15 @@ describe "A SQLite database" do
|
|
|
313
415
|
@db[:test2].first.should == {:name => 'mmm'}
|
|
314
416
|
end
|
|
315
417
|
|
|
418
|
+
specify "should keep a composite primary key when dropping columns" do
|
|
419
|
+
@db.create_table!(:test2){Integer :a; Integer :b; Integer :c; primary_key [:a, :b]}
|
|
420
|
+
@db.drop_column :test2, :c
|
|
421
|
+
@db[:test2].columns.should == [:a, :b]
|
|
422
|
+
@db[:test2] << {:a=>1, :b=>2}
|
|
423
|
+
@db[:test2] << {:a=>2, :b=>3}
|
|
424
|
+
proc{@db[:test2] << {:a=>2, :b=>3}}.should raise_error(Sequel::Error)
|
|
425
|
+
end
|
|
426
|
+
|
|
316
427
|
specify "should keep column attributes when dropping a column" do
|
|
317
428
|
@db.create_table! :test3 do
|
|
318
429
|
primary_key :id
|
|
@@ -357,7 +468,7 @@ describe "A SQLite database" do
|
|
|
357
468
|
@db[:test].filter(:name => 'foo').update(:id=>100)
|
|
358
469
|
@db[:test3][:name => 'abc'][:test_id].should == 100
|
|
359
470
|
|
|
360
|
-
@db.drop_table :test, :test3
|
|
471
|
+
@db.drop_table? :test, :test3
|
|
361
472
|
end
|
|
362
473
|
end
|
|
363
474
|
|
|
@@ -395,7 +506,7 @@ describe "A SQLite database" do
|
|
|
395
506
|
specify "should handle quoted tables when dropping or renaming columns" do
|
|
396
507
|
@db.quote_identifiers = true
|
|
397
508
|
table_name = "T T"
|
|
398
|
-
@db.drop_table(table_name)
|
|
509
|
+
@db.drop_table?(table_name)
|
|
399
510
|
@db.create_table! table_name do
|
|
400
511
|
Integer :"s s"
|
|
401
512
|
Integer :"i i"
|
|
@@ -412,14 +523,15 @@ describe "A SQLite database" do
|
|
|
412
523
|
specify "should choose a temporary table name that isn't already used when dropping or renaming columns" do
|
|
413
524
|
sqls = []
|
|
414
525
|
@db.loggers << (l=Class.new{%w'info error'.each{|m| define_method(m){|sql| sqls << sql}}}.new)
|
|
415
|
-
@db.
|
|
526
|
+
@db.tables.each{|t| @db.drop_table(t) if t.to_s =~ /test3/}
|
|
527
|
+
@db.create_table :test3 do
|
|
416
528
|
Integer :h
|
|
417
529
|
Integer :i
|
|
418
530
|
end
|
|
419
|
-
@db.create_table
|
|
531
|
+
@db.create_table :test3_backup0 do
|
|
420
532
|
Integer :j
|
|
421
533
|
end
|
|
422
|
-
@db.create_table
|
|
534
|
+
@db.create_table :test3_backup1 do
|
|
423
535
|
Integer :k
|
|
424
536
|
end
|
|
425
537
|
|
|
@@ -428,20 +540,20 @@ describe "A SQLite database" do
|
|
|
428
540
|
@db[:test3_backup1].columns.should == [:k]
|
|
429
541
|
sqls.clear
|
|
430
542
|
@db.drop_column(:test3, :i)
|
|
431
|
-
sqls.any?{|x| x =~ /\
|
|
432
|
-
sqls.any?{|x| x =~ /\
|
|
543
|
+
sqls.any?{|x| x =~ /\AALTER TABLE.*test3.*RENAME TO.*test3_backup2/}.should == true
|
|
544
|
+
sqls.any?{|x| x =~ /\AALTER TABLE.*test3.*RENAME TO.*test3_backup[01]/}.should == false
|
|
433
545
|
@db[:test3].columns.should == [:h]
|
|
434
546
|
@db[:test3_backup0].columns.should == [:j]
|
|
435
547
|
@db[:test3_backup1].columns.should == [:k]
|
|
436
548
|
|
|
437
|
-
@db.create_table
|
|
549
|
+
@db.create_table :test3_backup2 do
|
|
438
550
|
Integer :l
|
|
439
551
|
end
|
|
440
552
|
|
|
441
553
|
sqls.clear
|
|
442
554
|
@db.rename_column(:test3, :h, :i)
|
|
443
|
-
sqls.any?{|x| x =~ /\
|
|
444
|
-
sqls.any?{|x| x =~ /\
|
|
555
|
+
sqls.any?{|x| x =~ /\AALTER TABLE.*test3.*RENAME TO.*test3_backup3/}.should == true
|
|
556
|
+
sqls.any?{|x| x =~ /\AALTER TABLE.*test3.*RENAME TO.*test3_backup[012]/}.should == false
|
|
445
557
|
@db[:test3].columns.should == [:i]
|
|
446
558
|
@db[:test3_backup0].columns.should == [:j]
|
|
447
559
|
@db[:test3_backup1].columns.should == [:k]
|