sequel 3.21.0 → 3.39.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 +1061 -3
- data/MIT-LICENSE +1 -1
- data/README.rdoc +103 -63
- data/Rakefile +59 -27
- data/bin/sequel +50 -26
- data/doc/active_record.rdoc +67 -51
- data/doc/advanced_associations.rdoc +189 -75
- data/doc/association_basics.rdoc +327 -79
- data/doc/cheat_sheet.rdoc +21 -21
- data/doc/core_extensions.rdoc +374 -0
- data/doc/dataset_basics.rdoc +10 -10
- data/doc/dataset_filtering.rdoc +54 -42
- data/doc/mass_assignment.rdoc +56 -0
- data/doc/migration.rdoc +89 -557
- data/doc/model_hooks.rdoc +80 -29
- data/doc/object_model.rdoc +547 -0
- data/doc/opening_databases.rdoc +114 -53
- data/doc/prepared_statements.rdoc +41 -15
- data/doc/querying.rdoc +137 -56
- data/doc/reflection.rdoc +36 -10
- 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/release_notes/3.37.0.txt +338 -0
- data/doc/release_notes/3.38.0.txt +234 -0
- data/doc/release_notes/3.39.0.txt +237 -0
- data/doc/schema_modification.rdoc +585 -0
- data/doc/sharding.rdoc +99 -8
- data/doc/sql.rdoc +154 -112
- data/doc/testing.rdoc +169 -0
- data/doc/thread_safety.rdoc +17 -0
- data/doc/transactions.rdoc +137 -0
- data/doc/validations.rdoc +1 -1
- data/doc/virtual_rows.rdoc +78 -43
- 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 +2 -61
- 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 +56 -0
- data/lib/sequel/adapters/jdbc/derby.rb +325 -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 +40 -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 +77 -52
- 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 +279 -97
- data/lib/sequel/adapters/mock.rb +372 -0
- data/lib/sequel/adapters/mysql.rb +125 -222
- data/lib/sequel/adapters/mysql2.rb +65 -56
- data/lib/sequel/adapters/odbc/mssql.rb +17 -9
- 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 +368 -138
- data/lib/sequel/adapters/shared/access.rb +32 -9
- data/lib/sequel/adapters/shared/db2.rb +343 -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 +401 -116
- data/lib/sequel/adapters/shared/mysql.rb +424 -89
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +155 -0
- data/lib/sequel/adapters/shared/oracle.rb +257 -45
- data/lib/sequel/adapters/shared/postgres.rb +675 -279
- data/lib/sequel/adapters/shared/progress.rb +5 -8
- data/lib/sequel/adapters/shared/sqlite.rb +285 -96
- data/lib/sequel/adapters/sqlite.rb +101 -39
- data/lib/sequel/adapters/swift/mysql.rb +10 -12
- data/lib/sequel/adapters/swift/postgres.rb +13 -79
- data/lib/sequel/adapters/swift/sqlite.rb +9 -6
- data/lib/sequel/adapters/swift.rb +28 -19
- data/lib/sequel/adapters/tinytds.rb +174 -22
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +77 -0
- data/lib/sequel/adapters/utils/pg_types.rb +81 -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 +33 -2
- data/lib/sequel/connection_pool/single.rb +5 -0
- data/lib/sequel/connection_pool/threaded.rb +43 -14
- data/lib/sequel/connection_pool.rb +10 -2
- data/lib/sequel/core.rb +143 -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 +190 -46
- data/lib/sequel/database/query.rb +272 -110
- data/lib/sequel/database/schema_generator.rb +103 -36
- data/lib/sequel/database/schema_methods.rb +300 -67
- data/lib/sequel/dataset/actions.rb +344 -90
- data/lib/sequel/dataset/features.rb +101 -8
- data/lib/sequel/dataset/graph.rb +42 -15
- data/lib/sequel/dataset/misc.rb +52 -25
- data/lib/sequel/dataset/mutation.rb +12 -7
- data/lib/sequel/dataset/prepared_statements.rb +68 -30
- data/lib/sequel/dataset/query.rb +305 -54
- data/lib/sequel/dataset/sql.rb +720 -292
- data/lib/sequel/dataset.rb +8 -0
- data/lib/sequel/exceptions.rb +4 -0
- data/lib/sequel/extensions/_pretty_table.rb +83 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +109 -0
- data/lib/sequel/extensions/blank.rb +4 -0
- data/lib/sequel/extensions/columns_introspection.rb +72 -0
- data/lib/sequel/extensions/constraint_validations.rb +451 -0
- data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +30 -46
- data/lib/sequel/extensions/eval_inspect.rb +173 -0
- data/lib/sequel/extensions/inflector.rb +4 -0
- data/lib/sequel/extensions/looser_typecasting.rb +5 -4
- data/lib/sequel/extensions/migration.rb +100 -11
- data/lib/sequel/extensions/named_timezones.rb +9 -0
- data/lib/sequel/extensions/null_dataset.rb +94 -0
- data/lib/sequel/extensions/pagination.rb +4 -0
- data/lib/sequel/extensions/pg_array.rb +537 -0
- data/lib/sequel/extensions/pg_array_ops.rb +263 -0
- data/lib/sequel/extensions/pg_auto_parameterize.rb +175 -0
- data/lib/sequel/extensions/pg_hstore.rb +313 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +293 -0
- data/lib/sequel/extensions/pg_inet.rb +113 -0
- data/lib/sequel/extensions/pg_interval.rb +191 -0
- data/lib/sequel/extensions/pg_json.rb +208 -0
- data/lib/sequel/extensions/pg_range.rb +512 -0
- data/lib/sequel/extensions/pg_range_ops.rb +150 -0
- data/lib/sequel/extensions/pg_row.rb +572 -0
- data/lib/sequel/extensions/pg_row_ops.rb +182 -0
- data/lib/sequel/extensions/pg_statement_cache.rb +317 -0
- data/lib/sequel/extensions/pretty_table.rb +17 -72
- data/lib/sequel/extensions/query.rb +8 -4
- 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 +282 -76
- data/lib/sequel/extensions/select_remove.rb +39 -0
- data/lib/sequel/extensions/server_block.rb +140 -0
- data/lib/sequel/extensions/split_array_nil.rb +65 -0
- data/lib/sequel/extensions/sql_expr.rb +8 -110
- data/lib/sequel/extensions/string_date_time.rb +4 -0
- data/lib/sequel/extensions/thread_local_timezones.rb +10 -4
- data/lib/sequel/extensions/to_dot.rb +99 -83
- data/lib/sequel/model/associations.rb +1263 -409
- data/lib/sequel/model/base.rb +624 -171
- data/lib/sequel/model/errors.rb +1 -1
- data/lib/sequel/model/exceptions.rb +24 -2
- 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/constraint_validations.rb +198 -0
- data/lib/sequel/plugins/dataset_associations.rb +100 -0
- data/lib/sequel/plugins/defaults_setter.rb +72 -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 +134 -15
- 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 +13 -2
- data/lib/sequel/plugins/many_through_many.rb +103 -51
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
- data/lib/sequel/plugins/nested_attributes.rb +150 -66
- data/lib/sequel/plugins/optimistic_locking.rb +8 -0
- data/lib/sequel/plugins/pg_row.rb +121 -0
- data/lib/sequel/plugins/pg_typecast_on_load.rb +65 -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 +31 -17
- data/lib/sequel/plugins/schema.rb +8 -3
- 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 +29 -3
- data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/tree.rb +3 -3
- 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/validation_helpers.rb +55 -4
- data/lib/sequel/plugins/xml_serializer.rb +15 -4
- data/lib/sequel/sql.rb +649 -122
- data/lib/sequel/timezones.rb +67 -40
- 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 +194 -66
- data/spec/adapters/mysql_spec.rb +475 -306
- data/spec/adapters/oracle_spec.rb +92 -117
- data/spec/adapters/postgres_spec.rb +1982 -325
- data/spec/adapters/spec_helper.rb +9 -6
- data/spec/adapters/sqlite_spec.rb +203 -75
- data/spec/core/connection_pool_spec.rb +218 -93
- data/spec/core/database_spec.rb +956 -522
- data/spec/core/dataset_spec.rb +1631 -1242
- data/spec/core/expression_filters_spec.rb +690 -334
- data/spec/core/mock_adapter_spec.rb +453 -0
- data/spec/core/object_graph_spec.rb +88 -129
- data/spec/core/schema_generator_spec.rb +4 -4
- data/spec/core/schema_spec.rb +556 -53
- data/spec/core/spec_helper.rb +7 -48
- data/spec/core_extensions_spec.rb +626 -0
- 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/boolean_readers_spec.rb +25 -25
- 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/extensions/constraint_validations_plugin_spec.rb +196 -0
- data/spec/extensions/constraint_validations_spec.rb +316 -0
- data/spec/extensions/dataset_associations_spec.rb +199 -0
- data/spec/extensions/defaults_setter_spec.rb +88 -0
- data/spec/extensions/dirty_spec.rb +155 -0
- data/spec/extensions/eager_each_spec.rb +34 -0
- data/spec/extensions/eval_inspect_spec.rb +67 -0
- data/spec/extensions/force_encoding_spec.rb +4 -2
- data/spec/extensions/hook_class_methods_spec.rb +97 -128
- data/spec/extensions/identity_map_spec.rb +142 -24
- 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 -12
- data/spec/extensions/lazy_attributes_spec.rb +16 -20
- data/spec/extensions/list_spec.rb +49 -40
- data/spec/extensions/looser_typecasting_spec.rb +7 -7
- data/spec/extensions/many_through_many_spec.rb +368 -254
- 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 +268 -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 +112 -0
- data/spec/extensions/pg_array_spec.rb +320 -0
- data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +140 -0
- data/spec/extensions/pg_hstore_spec.rb +194 -0
- data/spec/extensions/pg_inet_spec.rb +47 -0
- data/spec/extensions/pg_interval_spec.rb +72 -0
- data/spec/extensions/pg_json_spec.rb +99 -0
- data/spec/extensions/pg_range_ops_spec.rb +56 -0
- data/spec/extensions/pg_range_spec.rb +395 -0
- data/spec/extensions/pg_row_ops_spec.rb +58 -0
- data/spec/extensions/pg_row_plugin_spec.rb +49 -0
- data/spec/extensions/pg_row_spec.rb +323 -0
- data/spec/extensions/pg_statement_cache_spec.rb +208 -0
- data/spec/extensions/pg_typecast_on_load_spec.rb +58 -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 +167 -0
- data/spec/extensions/query_spec.rb +9 -3
- 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 +434 -49
- data/spec/extensions/schema_spec.rb +30 -49
- 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 +86 -48
- 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 +34 -67
- data/spec/extensions/split_array_nil_spec.rb +24 -0
- data/spec/extensions/sql_expr_spec.rb +29 -60
- data/spec/extensions/static_cache_spec.rb +145 -0
- data/spec/extensions/subclasses_spec.rb +14 -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 +8 -11
- 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 +58 -67
- data/spec/extensions/validation_helpers_spec.rb +31 -37
- 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 +11 -5
- data/spec/integration/dataset_test.rb +717 -129
- data/spec/integration/eager_loader_test.rb +38 -54
- data/spec/integration/migrator_test.rb +2 -3
- data/spec/integration/model_test.rb +81 -2
- data/spec/integration/plugin_test.rb +604 -147
- data/spec/integration/prepared_statement_test.rb +272 -128
- data/spec/integration/schema_test.rb +367 -57
- data/spec/integration/spec_helper.rb +42 -32
- data/spec/integration/timezone_test.rb +38 -12
- data/spec/integration/transaction_test.rb +183 -8
- data/spec/integration/type_test.rb +31 -8
- data/spec/model/association_reflection_spec.rb +207 -8
- data/spec/model/associations_spec.rb +1206 -693
- data/spec/model/base_spec.rb +334 -100
- data/spec/model/dataset_methods_spec.rb +45 -27
- data/spec/model/eager_loading_spec.rb +828 -692
- data/spec/model/hooks_spec.rb +355 -67
- data/spec/model/model_spec.rb +251 -179
- data/spec/model/plugins_spec.rb +24 -13
- data/spec/model/record_spec.rb +506 -232
- data/spec/model/spec_helper.rb +16 -77
- data/spec/model/validations_spec.rb +38 -2
- data/spec/rcov.opts +2 -0
- metadata +209 -80
- data/spec/core/core_sql_spec.rb +0 -451
|
@@ -2,218 +2,264 @@ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
|
|
2
2
|
|
|
3
3
|
describe "Prepared Statements and Bound Arguments" do
|
|
4
4
|
before do
|
|
5
|
-
INTEGRATION_DB
|
|
5
|
+
@db = INTEGRATION_DB
|
|
6
|
+
@db.create_table!(:items) do
|
|
6
7
|
primary_key :id
|
|
7
|
-
integer :
|
|
8
|
+
integer :numb
|
|
8
9
|
end
|
|
9
10
|
@c = Class.new(Sequel::Model(:items))
|
|
10
|
-
@ds =
|
|
11
|
-
@ds.insert(:
|
|
12
|
-
@ds.
|
|
13
|
-
prepared_arg_placeholder == '$' ? :"#{sym}__int" : sym
|
|
14
|
-
end
|
|
11
|
+
@ds = @db[:items]
|
|
12
|
+
@ds.insert(:numb=>10)
|
|
13
|
+
@pr = @ds.requires_placeholder_type_specifiers? ? proc{|i| :"#{i}__integer"} : proc{|i| i}
|
|
15
14
|
end
|
|
16
15
|
after do
|
|
17
|
-
|
|
16
|
+
@db.drop_table?(:items)
|
|
18
17
|
end
|
|
19
18
|
|
|
20
|
-
specify "should support bound variables
|
|
21
|
-
@ds.filter(:
|
|
22
|
-
@ds.filter(:
|
|
23
|
-
@ds.filter(:
|
|
19
|
+
specify "should support bound variables when selecting" do
|
|
20
|
+
@ds.filter(:numb=>:$n).call(:each, :n=>10){|h| h.should == {:id=>1, :numb=>10}}
|
|
21
|
+
@ds.filter(:numb=>:$n).call(:select, :n=>10).should == [{:id=>1, :numb=>10}]
|
|
22
|
+
@ds.filter(:numb=>:$n).call(:all, :n=>10).should == [{:id=>1, :numb=>10}]
|
|
23
|
+
@ds.filter(:numb=>:$n).call(:first, :n=>10).should == {:id=>1, :numb=>10}
|
|
24
|
+
@ds.filter(:numb=>:$n).call([:map, :numb], :n=>10).should == [10]
|
|
25
|
+
@ds.filter(:numb=>:$n).call([:to_hash, :id, :numb], :n=>10).should == {1=>10}
|
|
26
|
+
@ds.filter(:numb=>:$n).call([:to_hash_groups, :id, :numb], :n=>10).should == {1=>[10]}
|
|
24
27
|
end
|
|
25
28
|
|
|
26
|
-
specify "should support blocks for select and
|
|
27
|
-
|
|
28
|
-
@ds.filter(:
|
|
29
|
+
specify "should support blocks for each, select, all, and map when using bound variables" do
|
|
30
|
+
a = []
|
|
31
|
+
@ds.filter(:numb=>:$n).call(:each, :n=>10){|r| r[:numb] *= 2; a << r}; a.should == [{:id=>1, :numb=>20}]
|
|
32
|
+
@ds.filter(:numb=>:$n).call(:select, :n=>10){|r| r[:numb] *= 2}.should == [{:id=>1, :numb=>20}]
|
|
33
|
+
@ds.filter(:numb=>:$n).call(:all, :n=>10){|r| r[:numb] *= 2}.should == [{:id=>1, :numb=>20}]
|
|
34
|
+
@ds.filter(:numb=>:$n).call([:map], :n=>10){|r| r[:numb] * 2}.should == [20]
|
|
29
35
|
end
|
|
30
36
|
|
|
31
37
|
specify "should support binding variables before the call with #bind" do
|
|
32
|
-
@ds.filter(:
|
|
33
|
-
@ds.filter(:
|
|
34
|
-
@ds.filter(:
|
|
38
|
+
@ds.filter(:numb=>:$n).bind(:n=>10).call(:select).should == [{:id=>1, :numb=>10}]
|
|
39
|
+
@ds.filter(:numb=>:$n).bind(:n=>10).call(:all).should == [{:id=>1, :numb=>10}]
|
|
40
|
+
@ds.filter(:numb=>:$n).bind(:n=>10).call(:first).should == {:id=>1, :numb=>10}
|
|
35
41
|
|
|
36
|
-
@ds.bind(:n=>10).filter(:
|
|
37
|
-
@ds.bind(:n=>10).filter(:
|
|
38
|
-
@ds.bind(:n=>10).filter(:
|
|
42
|
+
@ds.bind(:n=>10).filter(:numb=>:$n).call(:select).should == [{:id=>1, :numb=>10}]
|
|
43
|
+
@ds.bind(:n=>10).filter(:numb=>:$n).call(:all).should == [{:id=>1, :numb=>10}]
|
|
44
|
+
@ds.bind(:n=>10).filter(:numb=>:$n).call(:first).should == {:id=>1, :numb=>10}
|
|
39
45
|
end
|
|
40
46
|
|
|
41
47
|
specify "should allow overriding variables specified with #bind" do
|
|
42
|
-
@ds.filter(:
|
|
43
|
-
@ds.filter(:
|
|
44
|
-
@ds.filter(:
|
|
48
|
+
@ds.filter(:numb=>:$n).bind(:n=>1).call(:select, :n=>10).should == [{:id=>1, :numb=>10}]
|
|
49
|
+
@ds.filter(:numb=>:$n).bind(:n=>1).call(:all, :n=>10).should == [{:id=>1, :numb=>10}]
|
|
50
|
+
@ds.filter(:numb=>:$n).bind(:n=>1).call(:first, :n=>10).should == {:id=>1, :numb=>10}
|
|
45
51
|
|
|
46
|
-
@ds.filter(:
|
|
47
|
-
@ds.filter(:
|
|
48
|
-
@ds.filter(:
|
|
52
|
+
@ds.filter(:numb=>:$n).bind(:n=>1).bind(:n=>10).call(:select).should == [{:id=>1, :numb=>10}]
|
|
53
|
+
@ds.filter(:numb=>:$n).bind(:n=>1).bind(:n=>10).call(:all).should == [{:id=>1, :numb=>10}]
|
|
54
|
+
@ds.filter(:numb=>:$n).bind(:n=>1).bind(:n=>10).call(:first).should == {:id=>1, :numb=>10}
|
|
49
55
|
end
|
|
50
56
|
|
|
51
57
|
specify "should support placeholder literal strings with call" do
|
|
52
|
-
@ds.filter("
|
|
58
|
+
@ds.filter("numb = ?", :$n).call(:select, :n=>10).should == [{:id=>1, :numb=>10}]
|
|
53
59
|
end
|
|
54
60
|
|
|
55
61
|
specify "should support named placeholder literal strings and handle multiple named placeholders correctly with call" do
|
|
56
|
-
@ds.filter("
|
|
57
|
-
@ds.insert(:
|
|
58
|
-
@ds.insert(:
|
|
59
|
-
@ds.filter("
|
|
62
|
+
@ds.filter("numb = :n", :n=>:$n).call(:select, :n=>10).should == [{:id=>1, :numb=>10}]
|
|
63
|
+
@ds.insert(:numb=>20)
|
|
64
|
+
@ds.insert(:numb=>30)
|
|
65
|
+
@ds.filter("numb > :n1 AND numb < :n2 AND numb = :n3", :n3=>:$n3, :n2=>:$n2, :n1=>:$n1).call(:select, :n3=>20, :n2=>30, :n1=>10).should == [{:id=>2, :numb=>20}]
|
|
60
66
|
end
|
|
61
67
|
|
|
62
68
|
specify "should support datasets with static sql and placeholders with call" do
|
|
63
|
-
|
|
69
|
+
@db["SELECT * FROM items WHERE numb = ?", :$n].call(:select, :n=>10).should == [{:id=>1, :numb=>10}]
|
|
64
70
|
end
|
|
65
71
|
|
|
66
72
|
specify "should support subselects with call" do
|
|
67
|
-
@ds.filter(:id=>:$i).filter(:
|
|
73
|
+
@ds.filter(:id=>:$i).filter(:numb=>@ds.select(:numb).filter(:numb=>:$n)).filter(:id=>:$j).call(:select, :n=>10, :i=>1, :j=>1).should == [{:id=>1, :numb=>10}]
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
specify "should support subselects with exists with call" do
|
|
77
|
+
@ds.filter(:id=>:$i).filter(@ds.select(:numb).filter(:numb=>:$n).exists).filter(:id=>:$j).call(:select, :n=>10, :i=>1, :j=>1).should == [{:id=>1, :numb=>10}]
|
|
68
78
|
end
|
|
69
79
|
|
|
70
80
|
specify "should support subselects with literal strings with call" do
|
|
71
|
-
@ds.filter(:id=>:$i, :
|
|
81
|
+
@ds.filter(:id=>:$i, :numb=>@ds.select(:numb).filter("numb = ?", :$n)).call(:select, :n=>10, :i=>1).should == [{:id=>1, :numb=>10}]
|
|
72
82
|
end
|
|
73
83
|
|
|
74
84
|
specify "should support subselects with static sql and placeholders with call" do
|
|
75
|
-
@ds.filter(:id=>:$i, :
|
|
85
|
+
@ds.filter(:id=>:$i, :numb=>@db["SELECT numb FROM items WHERE numb = ?", :$n]).call(:select, :n=>10, :i=>1).should == [{:id=>1, :numb=>10}]
|
|
76
86
|
end
|
|
77
87
|
|
|
78
88
|
specify "should support subselects of subselects with call" do
|
|
79
|
-
@ds.filter(:id=>:$i).filter(:
|
|
89
|
+
@ds.filter(:id=>:$i).filter(:numb=>@ds.select(:numb).filter(:numb=>@ds.select(:numb).filter(:numb=>:$n))).filter(:id=>:$j).call(:select, :n=>10, :i=>1, :j=>1).should == [{:id=>1, :numb=>10}]
|
|
80
90
|
end
|
|
81
91
|
|
|
82
|
-
|
|
83
|
-
@ds.insert(:
|
|
84
|
-
ds = @ds.limit(
|
|
85
|
-
ds.call(:select, :n=>1, :n2=>0).should == [{:id=>1, :
|
|
86
|
-
ds.call(:select, :n=>1, :n2=>1).should == [{:id=>2, :
|
|
92
|
+
cspecify "should support using a bound variable for a limit and offset", [:jdbc, :db2] do
|
|
93
|
+
@ds.insert(:numb=>20)
|
|
94
|
+
ds = @ds.limit(:$n, :$n2).order(:id)
|
|
95
|
+
ds.call(:select, :n=>1, :n2=>0).should == [{:id=>1, :numb=>10}]
|
|
96
|
+
ds.call(:select, :n=>1, :n2=>1).should == [{:id=>2, :numb=>20}]
|
|
87
97
|
ds.call(:select, :n=>1, :n2=>2).should == []
|
|
88
|
-
ds.call(:select, :n=>2, :n2=>0).should == [{:id=>1, :
|
|
89
|
-
ds.call(:select, :n=>2, :n2=>1).should == [{:id=>2, :
|
|
98
|
+
ds.call(:select, :n=>2, :n2=>0).should == [{:id=>1, :numb=>10}, {:id=>2, :numb=>20}]
|
|
99
|
+
ds.call(:select, :n=>2, :n2=>1).should == [{:id=>2, :numb=>20}]
|
|
90
100
|
end
|
|
91
101
|
|
|
92
102
|
specify "should support bound variables with insert" do
|
|
93
|
-
@ds.call(:insert, {:n=>20}, :
|
|
103
|
+
@ds.call(:insert, {:n=>20}, :numb=>:$n)
|
|
94
104
|
@ds.count.should == 2
|
|
95
|
-
@ds.order(:id).map(:
|
|
105
|
+
@ds.order(:id).map(:numb).should == [10, 20]
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
specify "should support bound variables with NULL values" do
|
|
109
|
+
@ds.delete
|
|
110
|
+
@ds.call(:insert, {:n=>nil}, :numb=>@pr[:$n])
|
|
111
|
+
@ds.count.should == 1
|
|
112
|
+
@ds.map(:numb).should == [nil]
|
|
96
113
|
end
|
|
97
114
|
|
|
98
115
|
specify "should have insert return primary key value when using bound arguments" do
|
|
99
|
-
@ds.call(:insert, {:n=>20}, :
|
|
100
|
-
@ds.filter(:id=>2).first[:
|
|
116
|
+
@ds.call(:insert, {:n=>20}, :numb=>:$n).should == 2
|
|
117
|
+
@ds.filter(:id=>2).first[:numb].should == 20
|
|
101
118
|
end
|
|
102
119
|
|
|
103
120
|
specify "should support bound variables with delete" do
|
|
104
|
-
@ds.filter(:
|
|
121
|
+
@ds.filter(:numb=>:$n).call(:delete, :n=>10).should == 1
|
|
105
122
|
@ds.count.should == 0
|
|
106
123
|
end
|
|
107
124
|
|
|
108
125
|
specify "should support bound variables with update" do
|
|
109
|
-
@ds.filter(:
|
|
110
|
-
@ds.all.should == [{:id=>1, :
|
|
126
|
+
@ds.filter(:numb=>:$n).call(:update, {:n=>10, :nn=>20}, :numb=>Sequel.+(:numb, :$nn)).should == 1
|
|
127
|
+
@ds.all.should == [{:id=>1, :numb=>30}]
|
|
111
128
|
end
|
|
112
129
|
|
|
113
|
-
specify "should support prepared statements
|
|
114
|
-
@ds.filter(:
|
|
115
|
-
|
|
116
|
-
@ds.filter(:
|
|
117
|
-
|
|
118
|
-
@ds.filter(:
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
130
|
+
specify "should support prepared statements when selecting" do
|
|
131
|
+
@ds.filter(:numb=>:$n).prepare(:each, :select_n)
|
|
132
|
+
@db.call(:select_n, :n=>10){|h| h.should == {:id=>1, :numb=>10}}
|
|
133
|
+
@ds.filter(:numb=>:$n).prepare(:select, :select_n)
|
|
134
|
+
@db.call(:select_n, :n=>10).should == [{:id=>1, :numb=>10}]
|
|
135
|
+
@ds.filter(:numb=>:$n).prepare(:all, :select_n)
|
|
136
|
+
@db.call(:select_n, :n=>10).should == [{:id=>1, :numb=>10}]
|
|
137
|
+
@ds.filter(:numb=>:$n).prepare(:first, :select_n)
|
|
138
|
+
@db.call(:select_n, :n=>10).should == {:id=>1, :numb=>10}
|
|
139
|
+
@ds.filter(:numb=>:$n).prepare([:map, :numb], :select_n)
|
|
140
|
+
@db.call(:select_n, :n=>10).should == [10]
|
|
141
|
+
@ds.filter(:numb=>:$n).prepare([:to_hash, :id, :numb], :select_n)
|
|
142
|
+
@db.call(:select_n, :n=>10).should == {1=>10}
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
specify "should support blocks for each, select, all, and map when using prepared statements" do
|
|
146
|
+
a = []
|
|
147
|
+
@ds.filter(:numb=>:$n).prepare(:each, :select_n).call(:n=>10){|r| r[:numb] *= 2; a << r}; a.should == [{:id=>1, :numb=>20}]
|
|
148
|
+
a = []
|
|
149
|
+
@db.call(:select_n, :n=>10){|r| r[:numb] *= 2; a << r}; a.should == [{:id=>1, :numb=>20}]
|
|
150
|
+
@ds.filter(:numb=>:$n).prepare(:select, :select_n).call(:n=>10){|r| r[:numb] *= 2}.should == [{:id=>1, :numb=>20}]
|
|
151
|
+
@db.call(:select_n, :n=>10){|r| r[:numb] *= 2}.should == [{:id=>1, :numb=>20}]
|
|
152
|
+
@ds.filter(:numb=>:$n).prepare(:all, :select_n).call(:n=>10){|r| r[:numb] *= 2}.should == [{:id=>1, :numb=>20}]
|
|
153
|
+
@db.call(:select_n, :n=>10){|r| r[:numb] *= 2}.should == [{:id=>1, :numb=>20}]
|
|
154
|
+
@ds.filter(:numb=>:$n).prepare([:map], :select_n).call(:n=>10){|r| r[:numb] *= 2}.should == [20]
|
|
155
|
+
@db.call(:select_n, :n=>10){|r| r[:numb] *= 2}.should == [20]
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
specify "should support prepared statements being called multiple times with different arguments" do
|
|
159
|
+
@ds.filter(:numb=>:$n).prepare(:select, :select_n)
|
|
160
|
+
@db.call(:select_n, :n=>10).should == [{:id=>1, :numb=>10}]
|
|
161
|
+
@db.call(:select_n, :n=>0).should == []
|
|
162
|
+
@db.call(:select_n, :n=>10).should == [{:id=>1, :numb=>10}]
|
|
125
163
|
end
|
|
126
164
|
|
|
127
165
|
specify "should support placeholder literal strings with prepare" do
|
|
128
|
-
@ds.filter("
|
|
166
|
+
@ds.filter("numb = ?", :$n).prepare(:select, :seq_select).call(:n=>10).should == [{:id=>1, :numb=>10}]
|
|
129
167
|
end
|
|
130
168
|
|
|
131
169
|
specify "should support named placeholder literal strings and handle multiple named placeholders correctly with prepare" do
|
|
132
|
-
@ds.filter("
|
|
133
|
-
@ds.insert(:
|
|
134
|
-
@ds.insert(:
|
|
135
|
-
@ds.filter("
|
|
170
|
+
@ds.filter("numb = :n", :n=>:$n).prepare(:select, :seq_select).call(:n=>10).should == [{:id=>1, :numb=>10}]
|
|
171
|
+
@ds.insert(:numb=>20)
|
|
172
|
+
@ds.insert(:numb=>30)
|
|
173
|
+
@ds.filter("numb > :n1 AND numb < :n2 AND numb = :n3", :n3=>:$n3, :n2=>:$n2, :n1=>:$n1).call(:select, :n3=>20, :n2=>30, :n1=>10).should == [{:id=>2, :numb=>20}]
|
|
136
174
|
end
|
|
137
175
|
|
|
138
176
|
specify "should support datasets with static sql and placeholders with prepare" do
|
|
139
|
-
|
|
177
|
+
@db["SELECT * FROM items WHERE numb = ?", :$n].prepare(:select, :seq_select).call(:n=>10).should == [{:id=>1, :numb=>10}]
|
|
140
178
|
end
|
|
141
179
|
|
|
142
180
|
specify "should support subselects with prepare" do
|
|
143
|
-
@ds.filter(:id=>:$i).filter(:
|
|
181
|
+
@ds.filter(:id=>:$i).filter(:numb=>@ds.select(:numb).filter(:numb=>:$n)).filter(:id=>:$j).prepare(:select, :seq_select).call(:n=>10, :i=>1, :j=>1).should == [{:id=>1, :numb=>10}]
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
specify "should support subselects with exists with prepare" do
|
|
185
|
+
@ds.filter(:id=>:$i).filter(@ds.select(:numb).filter(:numb=>:$n).exists).filter(:id=>:$j).prepare(:select, :seq_select).call(:n=>10, :i=>1, :j=>1).should == [{:id=>1, :numb=>10}]
|
|
144
186
|
end
|
|
145
187
|
|
|
146
188
|
specify "should support subselects with literal strings with prepare" do
|
|
147
|
-
@ds.filter(:id=>:$i, :
|
|
189
|
+
@ds.filter(:id=>:$i, :numb=>@ds.select(:numb).filter("numb = ?", :$n)).prepare(:select, :seq_select).call(:n=>10, :i=>1).should == [{:id=>1, :numb=>10}]
|
|
148
190
|
end
|
|
149
191
|
|
|
150
192
|
specify "should support subselects with static sql and placeholders with prepare" do
|
|
151
|
-
@ds.filter(:id=>:$i, :
|
|
193
|
+
@ds.filter(:id=>:$i, :numb=>@db["SELECT numb FROM items WHERE numb = ?", :$n]).prepare(:select, :seq_select).call(:n=>10, :i=>1).should == [{:id=>1, :numb=>10}]
|
|
152
194
|
end
|
|
153
195
|
|
|
154
196
|
specify "should support subselects of subselects with prepare" do
|
|
155
|
-
@ds.filter(:id=>:$i).filter(:
|
|
197
|
+
@ds.filter(:id=>:$i).filter(:numb=>@ds.select(:numb).filter(:numb=>@ds.select(:numb).filter(:numb=>:$n))).filter(:id=>:$j).prepare(:select, :seq_select).call(:n=>10, :i=>1, :j=>1).should == [{:id=>1, :numb=>10}]
|
|
156
198
|
end
|
|
157
199
|
|
|
158
|
-
|
|
159
|
-
@ds.insert(:
|
|
160
|
-
ps = @ds.limit(
|
|
161
|
-
ps.call(:n=>1, :n2=>0).should == [{:id=>1, :
|
|
162
|
-
ps.call(:n=>1, :n2=>1).should == [{:id=>2, :
|
|
200
|
+
cspecify "should support using a prepared_statement for a limit and offset", :db2 do
|
|
201
|
+
@ds.insert(:numb=>20)
|
|
202
|
+
ps = @ds.limit(:$n, :$n2).order(:id).prepare(:select, :seq_select)
|
|
203
|
+
ps.call(:n=>1, :n2=>0).should == [{:id=>1, :numb=>10}]
|
|
204
|
+
ps.call(:n=>1, :n2=>1).should == [{:id=>2, :numb=>20}]
|
|
163
205
|
ps.call(:n=>1, :n2=>2).should == []
|
|
164
|
-
ps.call(:n=>2, :n2=>0).should == [{:id=>1, :
|
|
165
|
-
ps.call(:n=>2, :n2=>1).should == [{:id=>2, :
|
|
206
|
+
ps.call(:n=>2, :n2=>0).should == [{:id=>1, :numb=>10}, {:id=>2, :numb=>20}]
|
|
207
|
+
ps.call(:n=>2, :n2=>1).should == [{:id=>2, :numb=>20}]
|
|
166
208
|
end
|
|
167
209
|
|
|
168
210
|
specify "should support prepared statements with insert" do
|
|
169
|
-
@ds.prepare(:insert, :insert_n, :
|
|
170
|
-
|
|
211
|
+
@ds.prepare(:insert, :insert_n, :numb=>:$n)
|
|
212
|
+
@db.call(:insert_n, :n=>20)
|
|
171
213
|
@ds.count.should == 2
|
|
172
|
-
@ds.order(:id).map(:
|
|
214
|
+
@ds.order(:id).map(:numb).should == [10, 20]
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
specify "should support prepared statements with NULL values" do
|
|
218
|
+
@ds.delete
|
|
219
|
+
@ds.prepare(:insert, :insert_n, :numb=>@pr[:$n])
|
|
220
|
+
@db.call(:insert_n, :n=>nil)
|
|
221
|
+
@ds.count.should == 1
|
|
222
|
+
@ds.map(:numb).should == [nil]
|
|
173
223
|
end
|
|
174
224
|
|
|
175
225
|
specify "should have insert return primary key value when using prepared statements" do
|
|
176
|
-
@ds.prepare(:insert, :insert_n, :
|
|
177
|
-
|
|
178
|
-
@ds.filter(:id=>2).first[:
|
|
226
|
+
@ds.prepare(:insert, :insert_n, :numb=>:$n)
|
|
227
|
+
@db.call(:insert_n, :n=>20).should == 2
|
|
228
|
+
@ds.filter(:id=>2).first[:numb].should == 20
|
|
179
229
|
end
|
|
180
230
|
|
|
181
231
|
specify "should support prepared statements with delete" do
|
|
182
|
-
@ds.filter(:
|
|
183
|
-
|
|
232
|
+
@ds.filter(:numb=>:$n).prepare(:delete, :delete_n)
|
|
233
|
+
@db.call(:delete_n, :n=>10).should == 1
|
|
184
234
|
@ds.count.should == 0
|
|
185
235
|
end
|
|
186
236
|
|
|
187
237
|
specify "should support prepared statements with update" do
|
|
188
|
-
@ds.filter(:
|
|
189
|
-
|
|
190
|
-
@ds.all.should == [{:id=>1, :
|
|
238
|
+
@ds.filter(:numb=>:$n).prepare(:update, :update_n, :numb=>Sequel.+(:numb, :$nn))
|
|
239
|
+
@db.call(:update_n, :n=>10, :nn=>20).should == 1
|
|
240
|
+
@ds.all.should == [{:id=>1, :numb=>30}]
|
|
191
241
|
end
|
|
192
242
|
|
|
193
243
|
specify "model datasets should return model instances when using select, all, and first with bound variables" do
|
|
194
|
-
@c.filter(:
|
|
195
|
-
@c.filter(:
|
|
196
|
-
@c.filter(:
|
|
244
|
+
@c.filter(:numb=>:$n).call(:select, :n=>10).should == [@c.load(:id=>1, :numb=>10)]
|
|
245
|
+
@c.filter(:numb=>:$n).call(:all, :n=>10).should == [@c.load(:id=>1, :numb=>10)]
|
|
246
|
+
@c.filter(:numb=>:$n).call(:first, :n=>10).should == @c.load(:id=>1, :numb=>10)
|
|
197
247
|
end
|
|
198
248
|
|
|
199
249
|
specify "model datasets should return model instances when using select, all, and first with prepared statements" do
|
|
200
|
-
@c.filter(:
|
|
201
|
-
|
|
202
|
-
@c.filter(:
|
|
203
|
-
|
|
204
|
-
@c.filter(:
|
|
205
|
-
|
|
206
|
-
if INTEGRATION_DB.adapter_scheme == :jdbc and INTEGRATION_DB.database_type == :sqlite
|
|
207
|
-
# Work around for open prepared statements on a table not allowing the
|
|
208
|
-
# dropping of a table when using SQLite over JDBC
|
|
209
|
-
INTEGRATION_DB.synchronize{|c| c.prepared_statements[:select_n][1].close}
|
|
210
|
-
end
|
|
250
|
+
@c.filter(:numb=>:$n).prepare(:select, :select_n1)
|
|
251
|
+
@db.call(:select_n1, :n=>10).should == [@c.load(:id=>1, :numb=>10)]
|
|
252
|
+
@c.filter(:numb=>:$n).prepare(:all, :select_n1)
|
|
253
|
+
@db.call(:select_n1, :n=>10).should == [@c.load(:id=>1, :numb=>10)]
|
|
254
|
+
@c.filter(:numb=>:$n).prepare(:first, :select_n1)
|
|
255
|
+
@db.call(:select_n1, :n=>10).should == @c.load(:id=>1, :numb=>10)
|
|
211
256
|
end
|
|
212
257
|
end
|
|
213
258
|
|
|
214
259
|
describe "Bound Argument Types" do
|
|
215
|
-
before do
|
|
216
|
-
INTEGRATION_DB
|
|
260
|
+
before(:all) do
|
|
261
|
+
@db = INTEGRATION_DB
|
|
262
|
+
@db.create_table!(:items) do
|
|
217
263
|
primary_key :id
|
|
218
264
|
Date :d
|
|
219
265
|
DateTime :dt
|
|
@@ -223,48 +269,146 @@ describe "Bound Argument Types" do
|
|
|
223
269
|
Float :f
|
|
224
270
|
TrueClass :b
|
|
225
271
|
end
|
|
226
|
-
@ds =
|
|
272
|
+
@ds = @db[:items]
|
|
227
273
|
@vs = {:d=>Date.civil(2010, 10, 11), :dt=>DateTime.civil(2010, 10, 12, 13, 14, 15), :f=>1.0, :s=>'str', :t=>Time.at(20101010), :file=>Sequel::SQL::Blob.new('blob'), :b=>true}
|
|
274
|
+
end
|
|
275
|
+
before do
|
|
276
|
+
@ds.delete
|
|
228
277
|
@ds.insert(@vs)
|
|
229
|
-
@ds.meta_def(:ba) do |sym, type|
|
|
230
|
-
prepared_arg_placeholder == '$' ? :"#{sym}__#{type}" : sym
|
|
231
|
-
end
|
|
232
278
|
end
|
|
233
279
|
after do
|
|
234
280
|
Sequel.datetime_class = Time
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
281
|
+
end
|
|
282
|
+
after(:all) do
|
|
283
|
+
@db.drop_table?(:items)
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
cspecify "should handle date type", [:do, :sqlite], :mssql, [:jdbc, :sqlite], :oracle do
|
|
287
|
+
@ds.filter(:d=>:$x).prepare(:first, :ps_date).call(:x=>@vs[:d])[:d].should == @vs[:d]
|
|
239
288
|
end
|
|
240
289
|
|
|
241
|
-
cspecify "should handle
|
|
242
|
-
|
|
290
|
+
cspecify "should handle datetime type", [:do], [:mysql2], [:jdbc, :sqlite], [:tinytds], [:oracle] do
|
|
291
|
+
Sequel.datetime_class = DateTime
|
|
292
|
+
@ds.filter(:dt=>:$x).prepare(:first, :ps_datetime).call(:x=>@vs[:dt])[:dt].should == @vs[:dt]
|
|
243
293
|
end
|
|
244
294
|
|
|
245
|
-
cspecify "should handle datetime type", [:do], [:mysql2], [:
|
|
295
|
+
cspecify "should handle datetime type with fractional seconds", [:do], [:mysql2], [:jdbc, :sqlite], [:tinytds], [:oracle] do
|
|
246
296
|
Sequel.datetime_class = DateTime
|
|
247
|
-
|
|
297
|
+
fract_time = DateTime.parse('2010-10-12 13:14:15.500000')
|
|
298
|
+
@ds.prepare(:update, :ps_datetime_up, :dt=>:$x).call(:x=>fract_time)
|
|
299
|
+
@ds.literal(@ds.filter(:dt=>:$x).prepare(:first, :ps_datetime).call(:x=>fract_time)[:dt]).should == @ds.literal(fract_time)
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
cspecify "should handle time type", [:do], [:jdbc, :sqlite], [:swift], [:oracle] do
|
|
303
|
+
@ds.filter(:t=>:$x).prepare(:first, :ps_time).call(:x=>@vs[:t])[:t].should == @vs[:t]
|
|
248
304
|
end
|
|
249
305
|
|
|
250
|
-
cspecify "should handle time type", [:do], [:jdbc, :sqlite] do
|
|
251
|
-
|
|
306
|
+
cspecify "should handle time type with fractional seconds", [:do], [:jdbc, :sqlite], [:oracle], [:swift, :postgres] do
|
|
307
|
+
fract_time = @vs[:t] + 0.5
|
|
308
|
+
@ds.prepare(:update, :ps_time_up, :t=>:$x).call(:x=>fract_time)
|
|
309
|
+
@ds.literal(@ds.filter(:t=>:$x).prepare(:first, :ps_time).call(:x=>fract_time)[:t]).should == @ds.literal(fract_time)
|
|
252
310
|
end
|
|
253
311
|
|
|
254
|
-
cspecify "should handle blob type", [:
|
|
255
|
-
@ds.
|
|
312
|
+
cspecify "should handle blob type", [:odbc], [:oracle] do
|
|
313
|
+
@ds.delete
|
|
314
|
+
@ds.prepare(:insert, :ps_blob, {:file=>:$x}).call(:x=>@vs[:file])
|
|
315
|
+
@ds.get(:file).should == @vs[:file]
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
cspecify "should handle blob type with nil values", [:oracle], [:tinytds], [:jdbc, proc{|db| defined?(Sequel::JDBC::SQLServer::DatabaseMethods) && db.is_a?(Sequel::JDBC::SQLServer::DatabaseMethods)}] do
|
|
319
|
+
@ds.delete
|
|
320
|
+
@ds.prepare(:insert, :ps_blob, {:file=>:$x}).call(:x=>nil)
|
|
321
|
+
@ds.get(:file).should == nil
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
cspecify "should handle blob type with embedded zeros", [:odbc], [:oracle] do
|
|
325
|
+
zero_blob = Sequel::SQL::Blob.new("a\0"*100)
|
|
326
|
+
@ds.delete
|
|
327
|
+
@ds.prepare(:insert, :ps_blob, {:file=>:$x}).call(:x=>zero_blob)
|
|
328
|
+
@ds.get(:file).should == zero_blob
|
|
256
329
|
end
|
|
257
330
|
|
|
258
331
|
cspecify "should handle float type", [:swift, :sqlite] do
|
|
259
|
-
@ds.filter(:f
|
|
332
|
+
@ds.filter(:f=>:$x).prepare(:first, :ps_float).call(:x=>@vs[:f])[:f].should == @vs[:f]
|
|
260
333
|
end
|
|
261
334
|
|
|
262
335
|
specify "should handle string type" do
|
|
263
|
-
@ds.filter(:s
|
|
336
|
+
@ds.filter(:s=>:$x).prepare(:first, :ps_string).call(:x=>@vs[:s])[:s].should == @vs[:s]
|
|
264
337
|
end
|
|
265
338
|
|
|
266
|
-
cspecify "should handle boolean type", [:do, :sqlite], [:odbc, :mssql], [:jdbc, :sqlite]
|
|
267
|
-
@ds.filter(:b
|
|
339
|
+
cspecify "should handle boolean type", [:do, :sqlite], [:odbc, :mssql], [:jdbc, :sqlite], [:jdbc, :db2], :oracle do
|
|
340
|
+
@ds.filter(:b=>:$x).prepare(:first, :ps_string).call(:x=>@vs[:b])[:b].should == @vs[:b]
|
|
268
341
|
end
|
|
269
|
-
end
|
|
342
|
+
end
|
|
270
343
|
|
|
344
|
+
describe "Dataset#unbind" do
|
|
345
|
+
before do
|
|
346
|
+
@ds = ds = INTEGRATION_DB[:items]
|
|
347
|
+
@ct = proc do |t, v|
|
|
348
|
+
INTEGRATION_DB.create_table!(:items) do
|
|
349
|
+
column :c, t
|
|
350
|
+
end
|
|
351
|
+
ds.insert(:c=>v)
|
|
352
|
+
end
|
|
353
|
+
@u = proc{|ds| ds, bv = ds.unbind; ds.call(:first, bv)}
|
|
354
|
+
end
|
|
355
|
+
after do
|
|
356
|
+
INTEGRATION_DB.drop_table?(:items)
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
specify "should unbind values assigned to equality and inequality statements" do
|
|
360
|
+
@ct[Integer, 10]
|
|
361
|
+
@u[@ds.filter(:c=>10)].should == {:c=>10}
|
|
362
|
+
@u[@ds.exclude(:c=>10)].should == nil
|
|
363
|
+
@u[@ds.filter{c < 10}].should == nil
|
|
364
|
+
@u[@ds.filter{c <= 10}].should == {:c=>10}
|
|
365
|
+
@u[@ds.filter{c > 10}].should == nil
|
|
366
|
+
@u[@ds.filter{c >= 10}].should == {:c=>10}
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
cspecify "should handle numerics and strings", [:odbc], [:swift, :sqlite] do
|
|
370
|
+
@ct[Integer, 10]
|
|
371
|
+
@u[@ds.filter(:c=>10)].should == {:c=>10}
|
|
372
|
+
@ct[Float, 0.0]
|
|
373
|
+
@u[@ds.filter{c < 1}].should == {:c=>0.0}
|
|
374
|
+
@ct[String, 'foo']
|
|
375
|
+
@u[@ds.filter(:c=>'foo')].should == {:c=>'foo'}
|
|
376
|
+
|
|
377
|
+
INTEGRATION_DB.create_table!(:items) do
|
|
378
|
+
BigDecimal :c, :size=>[15,2]
|
|
379
|
+
end
|
|
380
|
+
@ds.insert(:c=>BigDecimal.new('1.1'))
|
|
381
|
+
@u[@ds.filter{c > 0}].should == {:c=>BigDecimal.new('1.1')}
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
cspecify "should handle dates and times", [:do], [:jdbc, :mssql], [:jdbc, :sqlite], [:swift], [:tinytds], :oracle do
|
|
385
|
+
@ct[Date, Date.today]
|
|
386
|
+
@u[@ds.filter(:c=>Date.today)].should == {:c=>Date.today}
|
|
387
|
+
t = Time.now
|
|
388
|
+
@ct[Time, t]
|
|
389
|
+
@u[@ds.filter{c < t + 1}][:c].to_i.should == t.to_i
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
specify "should handle QualifiedIdentifiers" do
|
|
393
|
+
@ct[Integer, 10]
|
|
394
|
+
@u[@ds.filter{items__c > 1}].should == {:c=>10}
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
specify "should handle deep nesting" do
|
|
398
|
+
INTEGRATION_DB.create_table!(:items) do
|
|
399
|
+
Integer :a
|
|
400
|
+
Integer :b
|
|
401
|
+
Integer :c
|
|
402
|
+
Integer :d
|
|
403
|
+
end
|
|
404
|
+
@ds.insert(:a=>2, :b=>0, :c=>3, :d=>5)
|
|
405
|
+
@u[@ds.filter{a > 1}.and{b < 2}.or(:c=>3).and(Sequel.case({~Sequel.expr(:d=>4)=>1}, 0) => 1)].should == {:a=>2, :b=>0, :c=>3, :d=>5}
|
|
406
|
+
@u[@ds.filter{a > 1}.and{b < 2}.or(:c=>3).and(Sequel.case({~Sequel.expr(:d=>5)=>1}, 0) => 1)].should == nil
|
|
407
|
+
end
|
|
408
|
+
|
|
409
|
+
specify "should handle case where the same variable has the same value in multiple places " do
|
|
410
|
+
@ct[Integer, 1]
|
|
411
|
+
@u[@ds.filter{c > 1}.or{c < 1}.invert].should == {:c=>1}
|
|
412
|
+
@u[@ds.filter{c > 1}.or{c < 1}].should == nil
|
|
413
|
+
end
|
|
414
|
+
end
|