sequel 3.21.0 → 3.41.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 +1131 -3
- data/MIT-LICENSE +1 -1
- data/README.rdoc +106 -65
- data/Rakefile +59 -27
- data/bin/sequel +50 -26
- data/doc/active_record.rdoc +68 -52
- data/doc/advanced_associations.rdoc +201 -75
- data/doc/association_basics.rdoc +327 -79
- data/doc/bin_sequel.rdoc +144 -0
- 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 +576 -0
- data/doc/opening_databases.rdoc +121 -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/release_notes/3.40.0.txt +73 -0
- data/doc/release_notes/3.41.0.txt +155 -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/access.rb +334 -0
- data/lib/sequel/adapters/ado/mssql.rb +18 -12
- data/lib/sequel/adapters/ado.rb +69 -21
- data/lib/sequel/adapters/amalgalite.rb +17 -14
- data/lib/sequel/adapters/cubrid.rb +143 -0
- data/lib/sequel/adapters/db2.rb +178 -85
- data/lib/sequel/adapters/dbi.rb +19 -21
- 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 +20 -39
- data/lib/sequel/adapters/firebird.rb +33 -210
- data/lib/sequel/adapters/ibmdb.rb +452 -0
- data/lib/sequel/adapters/informix.rb +6 -29
- data/lib/sequel/adapters/jdbc/as400.rb +16 -34
- data/lib/sequel/adapters/jdbc/cubrid.rb +52 -0
- data/lib/sequel/adapters/jdbc/db2.rb +78 -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 +68 -31
- data/lib/sequel/adapters/jdbc/hsqldb.rb +189 -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 +16 -28
- 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 +72 -0
- data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
- data/lib/sequel/adapters/jdbc.rb +308 -114
- data/lib/sequel/adapters/mock.rb +372 -0
- data/lib/sequel/adapters/mysql.rb +130 -230
- data/lib/sequel/adapters/mysql2.rb +64 -63
- data/lib/sequel/adapters/odbc/mssql.rb +17 -9
- data/lib/sequel/adapters/odbc.rb +29 -10
- data/lib/sequel/adapters/openbase.rb +7 -11
- data/lib/sequel/adapters/oracle.rb +364 -57
- data/lib/sequel/adapters/postgres.rb +379 -145
- data/lib/sequel/adapters/shared/access.rb +236 -11
- data/lib/sequel/adapters/shared/cubrid.rb +216 -0
- data/lib/sequel/adapters/shared/db2.rb +353 -0
- data/lib/sequel/adapters/shared/firebird.rb +231 -0
- data/lib/sequel/adapters/shared/informix.rb +53 -0
- data/lib/sequel/adapters/shared/mssql.rb +412 -116
- data/lib/sequel/adapters/shared/mysql.rb +396 -89
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +166 -0
- data/lib/sequel/adapters/shared/oracle.rb +262 -45
- data/lib/sequel/adapters/shared/postgres.rb +688 -279
- data/lib/sequel/adapters/shared/progress.rb +5 -8
- data/lib/sequel/adapters/shared/sqlite.rb +317 -96
- data/lib/sequel/adapters/sqlite.rb +109 -46
- 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 +31 -27
- data/lib/sequel/adapters/tinytds.rb +177 -25
- 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/split_alter_table.rb +36 -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 +23 -13
- data/lib/sequel/connection_pool/sharded_threaded.rb +64 -13
- data/lib/sequel/connection_pool/single.rb +11 -3
- data/lib/sequel/connection_pool/threaded.rb +69 -20
- data/lib/sequel/connection_pool.rb +20 -18
- data/lib/sequel/core.rb +143 -11
- data/lib/sequel/database/connecting.rb +66 -29
- 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 +192 -51
- data/lib/sequel/database/query.rb +299 -114
- data/lib/sequel/database/schema_generator.rb +103 -36
- data/lib/sequel/database/schema_methods.rb +310 -69
- 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 +322 -68
- data/lib/sequel/dataset/sql.rb +716 -293
- 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/connection_validator.rb +109 -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 +539 -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 +334 -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 +212 -0
- data/lib/sequel/extensions/pg_range.rb +513 -0
- data/lib/sequel/extensions/pg_range_ops.rb +150 -0
- data/lib/sequel/extensions/pg_row.rb +576 -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 +137 -16
- 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 +77 -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 +168 -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 +57 -12
- 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/touch.rb +18 -6
- 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 +2 -1
- data/lib/sequel/plugins/validation_helpers.rb +57 -4
- data/lib/sequel/plugins/xml_serializer.rb +15 -4
- data/lib/sequel/sql.rb +721 -141
- 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 +53 -39
- data/spec/adapters/mssql_spec.rb +261 -66
- data/spec/adapters/mysql_spec.rb +597 -352
- data/spec/adapters/oracle_spec.rb +92 -117
- data/spec/adapters/postgres_spec.rb +2103 -341
- data/spec/adapters/spec_helper.rb +16 -6
- data/spec/adapters/sqlite_spec.rb +237 -76
- data/spec/core/connection_pool_spec.rb +270 -141
- data/spec/core/database_spec.rb +980 -524
- data/spec/core/dataset_spec.rb +1658 -1243
- data/spec/core/expression_filters_spec.rb +741 -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 +227 -33
- 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/connection_validator_spec.rb +118 -0
- 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 +324 -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 +200 -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 +340 -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 +65 -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 +53 -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 +77 -68
- data/spec/extensions/validation_helpers_spec.rb +48 -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 +25 -5
- data/spec/integration/dataset_test.rb +729 -141
- 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 +871 -160
- data/spec/integration/prepared_statement_test.rb +272 -128
- data/spec/integration/schema_test.rb +377 -57
- data/spec/integration/spec_helper.rb +49 -32
- data/spec/integration/timezone_test.rb +38 -12
- data/spec/integration/transaction_test.rb +183 -8
- data/spec/integration/type_test.rb +40 -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 +223 -81
- data/spec/core/core_sql_spec.rb +0 -451
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
|
+
|
|
3
|
+
describe "Sequel::Plugins::AssociationPks" do
|
|
4
|
+
before do
|
|
5
|
+
@db = Sequel.mock
|
|
6
|
+
@db.extend_datasets do
|
|
7
|
+
def select_sql
|
|
8
|
+
sql = super
|
|
9
|
+
sql << ' -- prepared' if is_a?(Sequel::Dataset::PreparedStatementMethods)
|
|
10
|
+
sql
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
@Artist = Class.new(Sequel::Model(@db[:artists]))
|
|
14
|
+
@Artist.columns :id, :id2
|
|
15
|
+
@Album= Class.new(Sequel::Model(@db[:albums]))
|
|
16
|
+
@Album.columns :id, :artist_id, :id2, :artist_id2
|
|
17
|
+
@Tag = Class.new(Sequel::Model(@db[:tags]))
|
|
18
|
+
@Tag.columns :id, :id2
|
|
19
|
+
@Artist.plugin :prepared_statements_associations
|
|
20
|
+
@Album.plugin :prepared_statements_associations
|
|
21
|
+
@Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id
|
|
22
|
+
@Album.many_to_one :artist, :class=>@Artist
|
|
23
|
+
@Album.many_to_many :tags, :class=>@Tag, :join_table=>:albums_tags, :left_key=>:album_id
|
|
24
|
+
@Artist.plugin :many_through_many
|
|
25
|
+
@Artist.many_through_many :tags, [[:albums, :artist_id, :id], [:albums_tags, :album_id, :tag_id]], :class=>@Tag
|
|
26
|
+
@db.sqls
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
specify "should run correct SQL for associations" do
|
|
30
|
+
@Artist.load(:id=>1).albums
|
|
31
|
+
@db.sqls.should == ["SELECT * FROM albums WHERE (albums.artist_id = 1) -- prepared"]
|
|
32
|
+
|
|
33
|
+
@Album.load(:id=>1, :artist_id=>2).artist
|
|
34
|
+
@db.sqls.should == ["SELECT * FROM artists WHERE (artists.id = 2) LIMIT 1 -- prepared"]
|
|
35
|
+
|
|
36
|
+
@Album.load(:id=>1, :artist_id=>2).tags
|
|
37
|
+
@db.sqls.should == ["SELECT tags.* FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id = tags.id) AND (albums_tags.album_id = 1)) -- prepared"]
|
|
38
|
+
|
|
39
|
+
@Artist.load(:id=>1).tags
|
|
40
|
+
@db.sqls.should == ["SELECT tags.* FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON ((albums.id = albums_tags.album_id) AND (albums.artist_id = 1)) -- prepared"]
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
specify "should run correct SQL for composite key associations" do
|
|
44
|
+
@Artist.one_to_many :albums, :class=>@Album, :key=>[:artist_id, :artist_id2], :primary_key=>[:id, :id2]
|
|
45
|
+
@Album.many_to_one :artist, :class=>@Artist, :key=>[:artist_id, :artist_id2], :primary_key=>[:id, :id2]
|
|
46
|
+
@Album.many_to_many :tags, :class=>@Tag, :join_table=>:albums_tags, :left_key=>[:album_id, :album_id2], :right_key=>[:tag_id, :tag_id2], :right_primary_key=>[:id, :id2], :left_primary_key=>[:id, :id2]
|
|
47
|
+
@Artist.many_through_many :tags, [[:albums, [:artist_id, :artist_id2], [:id, :id2]], [:albums_tags, [:album_id, :album_id2], [:tag_id, :tag_id2]]], :class=>@Tag, :right_primary_key=>[:id, :id2], :left_primary_key=>[:id, :id2]
|
|
48
|
+
|
|
49
|
+
@Artist.load(:id=>1, :id2=>2).albums
|
|
50
|
+
@db.sqls.should == ["SELECT * FROM albums WHERE ((albums.artist_id = 1) AND (albums.artist_id2 = 2)) -- prepared"]
|
|
51
|
+
|
|
52
|
+
@Album.load(:id=>1, :artist_id=>2, :artist_id2=>3).artist
|
|
53
|
+
@db.sqls.should == ["SELECT * FROM artists WHERE ((artists.id = 2) AND (artists.id2 = 3)) LIMIT 1 -- prepared"]
|
|
54
|
+
|
|
55
|
+
@Album.load(:id=>1, :artist_id=>2, :id2=>3).tags
|
|
56
|
+
@db.sqls.should == ["SELECT tags.* FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id = tags.id) AND (albums_tags.tag_id2 = tags.id2) AND (albums_tags.album_id = 1) AND (albums_tags.album_id2 = 3)) -- prepared"]
|
|
57
|
+
|
|
58
|
+
@Artist.load(:id=>1, :id2=>2).tags
|
|
59
|
+
@db.sqls.should == ["SELECT tags.* FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id = tags.id) AND (albums_tags.tag_id2 = tags.id2)) INNER JOIN albums ON ((albums.id = albums_tags.album_id) AND (albums.id2 = albums_tags.album_id2) AND (albums.artist_id = 1) AND (albums.artist_id2 = 2)) -- prepared"]
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
specify "should not run query if no objects can be associated" do
|
|
63
|
+
@Artist.new.albums.should == []
|
|
64
|
+
@Album.new.artist.should == nil
|
|
65
|
+
@db.sqls.should == []
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
specify "should run a regular query if there is a callback" do
|
|
69
|
+
@Artist.load(:id=>1).albums(proc{|ds| ds})
|
|
70
|
+
@db.sqls.should == ["SELECT * FROM albums WHERE (albums.artist_id = 1)"]
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
specify "should run a regular query if :prepared_statement=>false option is used for the association" do
|
|
74
|
+
@Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id, :prepared_statement=>false
|
|
75
|
+
@Artist.load(:id=>1).albums
|
|
76
|
+
@db.sqls.should == ["SELECT * FROM albums WHERE (albums.artist_id = 1)"]
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
specify "should run a regular query if unrecognized association is used" do
|
|
80
|
+
a = @Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id
|
|
81
|
+
a[:type] = :foo
|
|
82
|
+
@Artist.load(:id=>1).albums
|
|
83
|
+
@db.sqls.should == ["SELECT * FROM albums WHERE (albums.artist_id = 1)"]
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
specify "should run a regular query if a block is used when defining the association" do
|
|
87
|
+
@Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id do |ds| ds end
|
|
88
|
+
@Artist.load(:id=>1).albums
|
|
89
|
+
@db.sqls.should == ["SELECT * FROM albums WHERE (albums.artist_id = 1)"]
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
specify "should run a regular query if :conditions option is used when defining the association" do
|
|
93
|
+
@Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id, :conditions=>{:a=>1}
|
|
94
|
+
@Artist.load(:id=>1).albums
|
|
95
|
+
@db.sqls.should == ["SELECT * FROM albums WHERE ((albums.artist_id = 1) AND (a = 1))"]
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
specify "should run a regular query if :dataset option is used when defining the association" do
|
|
99
|
+
album = @Album
|
|
100
|
+
@Artist.one_to_many :albums, :class=>@Album, :dataset=>proc{album.filter(:artist_id=>id)}
|
|
101
|
+
@Artist.load(:id=>1).albums
|
|
102
|
+
@db.sqls.should == ["SELECT * FROM albums WHERE (artist_id = 1)"]
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
specify "should run a regular query if :cloning an association that doesn't used prepared statements" do
|
|
106
|
+
@Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id, :conditions=>{:a=>1}
|
|
107
|
+
@Artist.one_to_many :oalbums, :clone=>:albums
|
|
108
|
+
@Artist.load(:id=>1).oalbums
|
|
109
|
+
@db.sqls.should == ["SELECT * FROM albums WHERE ((albums.artist_id = 1) AND (a = 1))"]
|
|
110
|
+
end
|
|
111
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
|
+
|
|
3
|
+
describe "prepared_statements_safe plugin" do
|
|
4
|
+
before do
|
|
5
|
+
@db = Sequel.mock(:fetch=>{:id=>1, :name=>'foo', :i=>2}, :autoid=>proc{|sql| 1}, :numrows=>1, :servers=>{:read_only=>{}})
|
|
6
|
+
@c = Class.new(Sequel::Model(@db[:people]))
|
|
7
|
+
@c.columns :id, :name, :i
|
|
8
|
+
@c.instance_variable_set(:@db_schema, {:i=>{}, :name=>{}, :id=>{:primary_key=>true}})
|
|
9
|
+
@c.plugin :prepared_statements_safe
|
|
10
|
+
@p = @c.load(:id=>1, :name=>'foo', :i=>2)
|
|
11
|
+
@db.sqls
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
specify "should load the prepared_statements plugin" do
|
|
15
|
+
@c.plugins.should include(Sequel::Plugins::PreparedStatements)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
specify "should set default values correctly" do
|
|
19
|
+
@c.prepared_statements_column_defaults.should == {:name=>nil, :i=>nil}
|
|
20
|
+
@c.instance_variable_set(:@db_schema, {:i=>{:default=>'f(x)'}, :name=>{:ruby_default=>'foo'}, :id=>{:primary_key=>true}})
|
|
21
|
+
Class.new(@c).prepared_statements_column_defaults.should == {:name=>'foo'}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
specify "should set default values when creating" do
|
|
25
|
+
@c.create
|
|
26
|
+
@db.sqls.first.should =~ /INSERT INTO people \((i|name), (i|name)\) VALUES \(NULL, NULL\)/
|
|
27
|
+
@c.create(:name=>'foo')
|
|
28
|
+
@db.sqls.first.should =~ /INSERT INTO people \((i|name), (i|name)\) VALUES \((NULL|'foo'), (NULL|'foo')\)/
|
|
29
|
+
@c.create(:name=>'foo', :i=>2)
|
|
30
|
+
@db.sqls.first.should =~ /INSERT INTO people \((i|name), (i|name)\) VALUES \((2|'foo'), (2|'foo')\)/
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
specify "should use database default values" do
|
|
34
|
+
@c.instance_variable_set(:@db_schema, {:i=>{:ruby_default=>2}, :name=>{:ruby_default=>'foo'}, :id=>{:primary_key=>true}})
|
|
35
|
+
c = Class.new(@c)
|
|
36
|
+
c.create
|
|
37
|
+
@db.sqls.first.should =~ /INSERT INTO people \((i|name), (i|name)\) VALUES \((2|'foo'), (2|'foo')\)/
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
specify "should not set defaults for unparseable dataset default values" do
|
|
41
|
+
@c.instance_variable_set(:@db_schema, {:i=>{:default=>'f(x)'}, :name=>{:ruby_default=>'foo'}, :id=>{:primary_key=>true}})
|
|
42
|
+
c = Class.new(@c)
|
|
43
|
+
c.create
|
|
44
|
+
@db.sqls.first.should == "INSERT INTO people (name) VALUES ('foo')"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
specify "should save all fields when updating" do
|
|
48
|
+
@p.update(:i=>3)
|
|
49
|
+
@db.sqls.first.should =~ /UPDATE people SET (name = 'foo'|i = 3), (name = 'foo'|i = 3) WHERE \(id = 1\)/
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
specify "should work with abstract classes" do
|
|
53
|
+
c = Class.new(Sequel::Model)
|
|
54
|
+
c.plugin :prepared_statements_safe
|
|
55
|
+
c1 = Class.new(c)
|
|
56
|
+
c1.meta_def(:get_db_schema){@db_schema = {:i=>{:default=>'f(x)'}, :name=>{:ruby_default=>'foo'}, :id=>{:primary_key=>true}}}
|
|
57
|
+
c1.set_dataset(:people)
|
|
58
|
+
c1.prepared_statements_column_defaults.should == {:name=>'foo'}
|
|
59
|
+
Class.new(c1).prepared_statements_column_defaults.should == {:name=>'foo'}
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
|
+
|
|
3
|
+
describe "prepared_statements plugin" do
|
|
4
|
+
before do
|
|
5
|
+
@db = Sequel.mock(:fetch=>{:id=>1, :name=>'foo', :i=>2}, :autoid=>proc{|sql| 1}, :numrows=>1, :servers=>{:read_only=>{}})
|
|
6
|
+
@c = Class.new(Sequel::Model(@db[:people]))
|
|
7
|
+
@c.columns :id, :name, :i
|
|
8
|
+
@c.plugin :prepared_statements
|
|
9
|
+
@p = @c.load(:id=>1, :name=>'foo', :i=>2)
|
|
10
|
+
@ds = @c.dataset
|
|
11
|
+
@db.sqls
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
specify "should correctly lookup by primary key" do
|
|
15
|
+
@c[1].should == @p
|
|
16
|
+
@db.sqls.should == ["SELECT * FROM people WHERE (id = 1) LIMIT 1 -- read_only"]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
specify "should correctly delete instance" do
|
|
20
|
+
@p.destroy.should == @p
|
|
21
|
+
@db.sqls.should == ["DELETE FROM people WHERE (id = 1)"]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
specify "should correctly update instance" do
|
|
25
|
+
@p.update(:name=>'bar').should == @c.load(:id=>1, :name=>'bar', :i => 2)
|
|
26
|
+
@db.sqls.should == ["UPDATE people SET name = 'bar' WHERE (id = 1)"]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
specify "should correctly create instance" do
|
|
30
|
+
@c.create(:name=>'foo').should == @c.load(:id=>1, :name=>'foo', :i => 2)
|
|
31
|
+
@db.sqls.should == ["INSERT INTO people (name) VALUES ('foo')", "SELECT * FROM people WHERE (id = 1) LIMIT 1"]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
specify "should correctly create instance if dataset supports insert_select" do
|
|
35
|
+
ds = @c.instance_dataset
|
|
36
|
+
def ds.supports_insert_select?
|
|
37
|
+
true
|
|
38
|
+
end
|
|
39
|
+
def @ds.supports_insert_select?
|
|
40
|
+
true
|
|
41
|
+
end
|
|
42
|
+
def @ds.insert_select(h)
|
|
43
|
+
{:id=>1, :name=>'foo', :i => 2}
|
|
44
|
+
end
|
|
45
|
+
def @ds.insert_sql(*)
|
|
46
|
+
"#{super}#{' RETURNING *' if opts.has_key?(:returning)}"
|
|
47
|
+
end
|
|
48
|
+
@c.create(:name=>'foo').should == @c.load(:id=>1, :name=>'foo', :i => 2)
|
|
49
|
+
@db.sqls.should == ["INSERT INTO people (name) VALUES ('foo') RETURNING *"]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
specify "should work correctly when subclassing" do
|
|
53
|
+
c = Class.new(@c)
|
|
54
|
+
c[1].should == c.load(:id=>1, :name=>'foo', :i=>2)
|
|
55
|
+
@db.sqls.should == ["SELECT * FROM people WHERE (id = 1) LIMIT 1 -- read_only"]
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
describe " with placeholder type specifiers" do
|
|
59
|
+
before do
|
|
60
|
+
@ds.meta_def(:requires_placeholder_type_specifiers?){true}
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
specify "should correctly handle without schema type" do
|
|
64
|
+
@c[1].should == @p
|
|
65
|
+
@db.sqls.should == ["SELECT * FROM people WHERE (id = 1) LIMIT 1 -- read_only"]
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
specify "should correctly handle with schema type" do
|
|
69
|
+
@c.db_schema[:id][:type] = :integer
|
|
70
|
+
ds = @c.send(:prepared_lookup)
|
|
71
|
+
def ds.literal_symbol_append(sql, v)
|
|
72
|
+
if @opts[:bind_vars] and match = /\A\$(.*)\z/.match(v.to_s)
|
|
73
|
+
s = match[1].split('__')[0].to_sym
|
|
74
|
+
if prepared_arg?(s)
|
|
75
|
+
literal_append(sql, prepared_arg(s))
|
|
76
|
+
else
|
|
77
|
+
sql << v.to_s
|
|
78
|
+
end
|
|
79
|
+
else
|
|
80
|
+
super
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
@c[1].should == @p
|
|
84
|
+
@db.sqls.should == ["SELECT * FROM people WHERE (id = 1) LIMIT 1 -- read_only"]
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
|
+
|
|
3
|
+
describe "prepared_statements_with_pk plugin" do
|
|
4
|
+
before do
|
|
5
|
+
@db = Sequel.mock(:fetch=>{:id=>1, :name=>'foo', :i=>2}, :autoid=>proc{|sql| 1}, :numrows=>1, :servers=>{:read_only=>{}})
|
|
6
|
+
@c = Class.new(Sequel::Model(@db[:people]))
|
|
7
|
+
@c.columns :id, :name, :i
|
|
8
|
+
@c.plugin :prepared_statements_with_pk
|
|
9
|
+
@p = @c.load(:id=>1, :name=>'foo', :i=>2)
|
|
10
|
+
@db.sqls
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
specify "should load the prepared_statements plugin" do
|
|
14
|
+
@c.plugins.should include(Sequel::Plugins::PreparedStatements)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
specify "should correctly lookup by primary key from dataset" do
|
|
18
|
+
@c.dataset.filter(:name=>'foo')[1].should == @p
|
|
19
|
+
@c.db.sqls.should == ["SELECT * FROM people WHERE ((name = 'foo') AND (people.id = 1)) LIMIT 1 -- read_only"]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
specify "should still work correctly if there are multiple conflicting variables" do
|
|
23
|
+
@c.dataset.filter(:name=>'foo').or(:name=>'bar')[1].should == @p
|
|
24
|
+
@c.db.sqls.should == ["SELECT * FROM people WHERE (((name = 'foo') OR (name = 'bar')) AND (people.id = 1)) LIMIT 1 -- read_only"]
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
specify "should still work correctly if the primary key is used elsewhere in the query" do
|
|
28
|
+
@c.dataset.filter{id > 2}[1].should == @p
|
|
29
|
+
@c.db.sqls.should == ["SELECT * FROM people WHERE ((id > 2) AND (people.id = 1)) LIMIT 1 -- read_only"]
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -7,12 +7,7 @@ describe "Dataset#print" do
|
|
|
7
7
|
@output = StringIO.new
|
|
8
8
|
@orig_stdout = $stdout
|
|
9
9
|
$stdout = @output
|
|
10
|
-
@dataset = Sequel
|
|
11
|
-
def @dataset.fetch_rows(sql)
|
|
12
|
-
yield({:a=>1, :b=>2})
|
|
13
|
-
yield({:a=>3, :b=>4})
|
|
14
|
-
yield({:a=>5, :b=>6})
|
|
15
|
-
end
|
|
10
|
+
@dataset = Sequel.mock(:fetch=>[{:a=>1, :b=>2}, {:a=>3, :b=>4}, {:a=>5, :b=>6}])[:items]
|
|
16
11
|
end
|
|
17
12
|
|
|
18
13
|
after do
|
|
@@ -68,6 +63,12 @@ describe "PrettyTable" do
|
|
|
68
63
|
/\n(\|x\|y\|)|(\|y\|x\|)\n/
|
|
69
64
|
end
|
|
70
65
|
|
|
66
|
+
specify "should have #string return the string without printing" do
|
|
67
|
+
Sequel::PrettyTable.string(@data1).should =~ /\n(\|x\|y\|)|(\|y\|x\|)\n/
|
|
68
|
+
@output.rewind
|
|
69
|
+
@output.read.should == ''
|
|
70
|
+
end
|
|
71
|
+
|
|
71
72
|
specify "should calculate the maximum width of each column correctly" do
|
|
72
73
|
Sequel::PrettyTable.print(@data2, [:a, :b])
|
|
73
74
|
@output.rewind
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
|
+
|
|
3
|
+
describe "query_literals extension" do
|
|
4
|
+
before do
|
|
5
|
+
@ds = Sequel::Dataset.new(nil).from(:t).extension(:query_literals)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it "should not use special support if given a block" do
|
|
9
|
+
@ds.select('a, b, c'){d}.sql.should == 'SELECT \'a, b, c\', d FROM t'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "should have #select use literal string if given a single string" do
|
|
13
|
+
@ds.select('a, b, c').sql.should == 'SELECT a, b, c FROM t'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "should have #select use placeholder literal string if given a string and additional arguments" do
|
|
17
|
+
@ds.select('a, b, ?', 1).sql.should == 'SELECT a, b, 1 FROM t'
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "should have #select work the standard way if initial string is a literal string already" do
|
|
21
|
+
@ds.select(Sequel.lit('a, b, ?'), 1).sql.should == 'SELECT a, b, ?, 1 FROM t'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "should have #select work regularly if not given a string as the first argument" do
|
|
25
|
+
@ds.select(:a, 1).sql.should == 'SELECT a, 1 FROM t'
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe 'with existing selection' do
|
|
29
|
+
before do
|
|
30
|
+
@ds = @ds.select(:d)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "should have #select_more use literal string if given a single string" do
|
|
34
|
+
@ds.select_more('a, b, c').sql.should == 'SELECT d, a, b, c FROM t'
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should have #select_ use placeholder literal string if given a string and additional arguments" do
|
|
38
|
+
@ds.select_more('a, b, ?', 1).sql.should == 'SELECT d, a, b, 1 FROM t'
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "should have #select_more work the standard way if initial string is a literal string already" do
|
|
42
|
+
@ds.select_more(Sequel.lit('a, b, ?'), 1).sql.should == 'SELECT d, a, b, ?, 1 FROM t'
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "should have #select_more work regularly if not given a string as the first argument" do
|
|
46
|
+
@ds.select_more(:a, 1).sql.should == 'SELECT d, a, 1 FROM t'
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "should have #select_append use literal string if given a single string" do
|
|
51
|
+
@ds.select_append('a, b, c').sql.should == 'SELECT *, a, b, c FROM t'
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "should have #select_append use placeholder literal string if given a string and additional arguments" do
|
|
55
|
+
@ds.select_append('a, b, ?', 1).sql.should == 'SELECT *, a, b, 1 FROM t'
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "should have #select_append work the standard way if initial string is a literal string already" do
|
|
59
|
+
@ds.select_append(Sequel.lit('a, b, ?'), 1).sql.should == 'SELECT *, a, b, ?, 1 FROM t'
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "should have #select_append work regularly if not given a string as the first argument" do
|
|
63
|
+
@ds.select_append(:a, 1).sql.should == 'SELECT *, a, 1 FROM t'
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "should have #select_group use literal string if given a single string" do
|
|
67
|
+
@ds.select_group('a, b, c').sql.should == 'SELECT a, b, c FROM t GROUP BY a, b, c'
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "should have #select_group use placeholder literal string if given a string and additional arguments" do
|
|
71
|
+
@ds.select_group('a, b, ?', 1).sql.should == 'SELECT a, b, 1 FROM t GROUP BY a, b, 1'
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it "should have #select_group work the standard way if initial string is a literal string already" do
|
|
75
|
+
@ds.select_group(Sequel.lit('a, b, ?'), 1).sql.should == 'SELECT a, b, ?, 1 FROM t GROUP BY a, b, ?, 1'
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "should have #select_group work regularly if not given a string as the first argument" do
|
|
79
|
+
@ds.select_group(:a, 1).sql.should == 'SELECT a, 1 FROM t GROUP BY a, 1'
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it "should have #group use literal string if given a single string" do
|
|
83
|
+
@ds.group('a, b, c').sql.should == 'SELECT * FROM t GROUP BY a, b, c'
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it "should have #group use placeholder literal string if given a string and additional arguments" do
|
|
87
|
+
@ds.group('a, b, ?', 1).sql.should == 'SELECT * FROM t GROUP BY a, b, 1'
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it "should have #group work the standard way if initial string is a literal string already" do
|
|
91
|
+
@ds.group(Sequel.lit('a, b, ?'), 1).sql.should == 'SELECT * FROM t GROUP BY a, b, ?, 1'
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it "should have #group work regularly if not given a string as the first argument" do
|
|
95
|
+
@ds.group(:a, 1).sql.should == 'SELECT * FROM t GROUP BY a, 1'
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
it "should have #group_and_count use literal string if given a single string" do
|
|
99
|
+
@ds.group_and_count('a, b, c').sql.should == 'SELECT a, b, c, count(*) AS count FROM t GROUP BY a, b, c'
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "should have #group_and_count use placeholder literal string if given a string and additional arguments" do
|
|
103
|
+
@ds.group_and_count('a, b, ?', 1).sql.should == 'SELECT a, b, 1, count(*) AS count FROM t GROUP BY a, b, 1'
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it "should have #group_and_count work the standard way if initial string is a literal string already" do
|
|
107
|
+
@ds.group_and_count(Sequel.lit('a, b, ?'), 1).sql.should == 'SELECT a, b, ?, 1, count(*) AS count FROM t GROUP BY a, b, ?, 1'
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
it "should have #group_and_count work regularly if not given a string as the first argument" do
|
|
111
|
+
@ds.group_and_count(:a, 1).sql.should == 'SELECT a, 1, count(*) AS count FROM t GROUP BY a, 1'
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it "should have #order use literal string if given a single string" do
|
|
115
|
+
@ds.order('a, b, c').sql.should == 'SELECT * FROM t ORDER BY a, b, c'
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
it "should have #order use placeholder literal string if given a string and additional arguments" do
|
|
119
|
+
@ds.order('a, b, ?', 1).sql.should == 'SELECT * FROM t ORDER BY a, b, 1'
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it "should have #order work the standard way if initial string is a literal string already" do
|
|
123
|
+
@ds.order(Sequel.lit('a, b, ?'), 1).sql.should == 'SELECT * FROM t ORDER BY a, b, ?, 1'
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
it "should have #order work regularly if not given a string as the first argument" do
|
|
127
|
+
@ds.order(:a, 1).sql.should == 'SELECT * FROM t ORDER BY a, 1'
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
describe 'with existing order' do
|
|
131
|
+
before do
|
|
132
|
+
@ds = @ds.order(:d)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
it "should have #order_more use literal string if given a single string" do
|
|
136
|
+
@ds.order_more('a, b, c').sql.should == 'SELECT * FROM t ORDER BY d, a, b, c'
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
it "should have #order_more use placeholder literal string if given a string and additional arguments" do
|
|
140
|
+
@ds.order_more('a, b, ?', 1).sql.should == 'SELECT * FROM t ORDER BY d, a, b, 1'
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
it "should have #order_more work the standard way if initial string is a literal string already" do
|
|
144
|
+
@ds.order_more(Sequel.lit('a, b, ?'), 1).sql.should == 'SELECT * FROM t ORDER BY d, a, b, ?, 1'
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
it "should have #order_more work regularly if not given a string as the first argument" do
|
|
148
|
+
@ds.order_more(:a, 1).sql.should == 'SELECT * FROM t ORDER BY d, a, 1'
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it "should have #order_prepend use literal string if given a single string" do
|
|
152
|
+
@ds.order_prepend('a, b, c').sql.should == 'SELECT * FROM t ORDER BY a, b, c, d'
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
it "should have #order_append use placeholder literal string if given a string and additional arguments" do
|
|
156
|
+
@ds.order_prepend('a, b, ?', 1).sql.should == 'SELECT * FROM t ORDER BY a, b, 1, d'
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
it "should have #order_append work the standard way if initial string is a literal string already" do
|
|
160
|
+
@ds.order_prepend(Sequel.lit('a, b, ?'), 1).sql.should == 'SELECT * FROM t ORDER BY a, b, ?, 1, d'
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
it "should have #order_append work regularly if not given a string as the first argument" do
|
|
164
|
+
@ds.order_prepend(:a, 1).sql.should == 'SELECT * FROM t ORDER BY a, 1, d'
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
@@ -17,6 +17,12 @@ describe "Dataset#query" do
|
|
|
17
17
|
@d = Sequel::Dataset.new(nil)
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
+
specify "should allow cloning without arguments" do
|
|
21
|
+
q = @d.query {clone}
|
|
22
|
+
q.class.should == @d.class
|
|
23
|
+
q.sql.should == "SELECT *"
|
|
24
|
+
end
|
|
25
|
+
|
|
20
26
|
specify "should support #from" do
|
|
21
27
|
q = @d.query {from :xxx}
|
|
22
28
|
q.class.should == @d.class
|
|
@@ -35,13 +41,13 @@ describe "Dataset#query" do
|
|
|
35
41
|
specify "should support #where" do
|
|
36
42
|
q = @d.query do
|
|
37
43
|
from :zzz
|
|
38
|
-
where
|
|
44
|
+
where{x + 2 > Sequel.expr(:y) + 3}
|
|
39
45
|
end
|
|
40
46
|
q.class.should == @d.class
|
|
41
47
|
q.sql.should == "SELECT * FROM zzz WHERE ((x + 2) > (y + 3))"
|
|
42
48
|
|
|
43
49
|
q = @d.from(:zzz).query do
|
|
44
|
-
where(
|
|
50
|
+
where{(x > 1) & (Sequel.expr(:y) > 2)}
|
|
45
51
|
end
|
|
46
52
|
q.class.should == @d.class
|
|
47
53
|
q.sql.should == "SELECT * FROM zzz WHERE ((x > 1) AND (y > 2))"
|
|
@@ -57,7 +63,7 @@ describe "Dataset#query" do
|
|
|
57
63
|
q = @d.query do
|
|
58
64
|
from :abc
|
|
59
65
|
group_by :id
|
|
60
|
-
having
|
|
66
|
+
having{x >= 2}
|
|
61
67
|
end
|
|
62
68
|
q.class.should == @d.class
|
|
63
69
|
q.sql.should == "SELECT * FROM abc GROUP BY id HAVING (x >= 2)"
|