sequel 4.41.0 → 4.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +98 -0
- data/README.rdoc +23 -10
- data/doc/active_record.rdoc +4 -4
- data/doc/advanced_associations.rdoc +2 -2
- data/doc/association_basics.rdoc +5 -2
- data/doc/cheat_sheet.rdoc +3 -3
- data/doc/core_extensions.rdoc +2 -2
- data/doc/dataset_basics.rdoc +4 -4
- data/doc/dataset_filtering.rdoc +1 -1
- data/doc/migration.rdoc +19 -1
- data/doc/prepared_statements.rdoc +2 -2
- data/doc/release_notes/4.42.0.txt +221 -0
- data/doc/testing.rdoc +3 -1
- data/lib/sequel/adapters/ado/access.rb +0 -1
- data/lib/sequel/adapters/ado/mssql.rb +0 -1
- data/lib/sequel/adapters/do/mysql.rb +0 -1
- data/lib/sequel/adapters/do/postgres.rb +0 -1
- data/lib/sequel/adapters/do/sqlite3.rb +0 -1
- data/lib/sequel/adapters/ibmdb.rb +21 -25
- data/lib/sequel/adapters/jdbc.rb +8 -16
- data/lib/sequel/adapters/jdbc/as400.rb +0 -1
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -1
- data/lib/sequel/adapters/jdbc/db2.rb +0 -1
- data/lib/sequel/adapters/jdbc/derby.rb +0 -1
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -1
- data/lib/sequel/adapters/jdbc/h2.rb +0 -1
- data/lib/sequel/adapters/jdbc/hsqldb.rb +0 -1
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -1
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -1
- data/lib/sequel/adapters/jdbc/jtds.rb +0 -1
- data/lib/sequel/adapters/jdbc/mssql.rb +0 -1
- data/lib/sequel/adapters/jdbc/mysql.rb +0 -1
- data/lib/sequel/adapters/jdbc/oracle.rb +0 -1
- data/lib/sequel/adapters/jdbc/postgresql.rb +0 -13
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +0 -1
- data/lib/sequel/adapters/jdbc/sqlite.rb +0 -1
- data/lib/sequel/adapters/jdbc/sqlserver.rb +3 -4
- data/lib/sequel/adapters/mock.rb +54 -12
- data/lib/sequel/adapters/mysql.rb +1 -1
- data/lib/sequel/adapters/mysql2.rb +11 -17
- data/lib/sequel/adapters/odbc/mssql.rb +0 -1
- data/lib/sequel/adapters/oracle.rb +8 -20
- data/lib/sequel/adapters/postgres.rb +11 -29
- data/lib/sequel/adapters/shared/access.rb +5 -12
- data/lib/sequel/adapters/shared/cubrid.rb +4 -13
- data/lib/sequel/adapters/shared/db2.rb +4 -2
- data/lib/sequel/adapters/shared/firebird.rb +2 -4
- data/lib/sequel/adapters/shared/informix.rb +4 -2
- data/lib/sequel/adapters/shared/mssql.rb +3 -5
- data/lib/sequel/adapters/shared/mysql.rb +4 -14
- data/lib/sequel/adapters/shared/oracle.rb +1 -3
- data/lib/sequel/adapters/shared/postgres.rb +16 -38
- data/lib/sequel/adapters/shared/progress.rb +0 -2
- data/lib/sequel/adapters/shared/sqlanywhere.rb +0 -2
- data/lib/sequel/adapters/shared/sqlite.rb +20 -16
- data/lib/sequel/adapters/sqlite.rb +8 -20
- data/lib/sequel/adapters/swift/mysql.rb +0 -1
- data/lib/sequel/adapters/swift/postgres.rb +0 -1
- data/lib/sequel/adapters/swift/sqlite.rb +0 -1
- data/lib/sequel/adapters/tinytds.rb +4 -12
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -2
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +11 -34
- data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +26 -0
- data/lib/sequel/ast_transformer.rb +2 -2
- data/lib/sequel/database/dataset.rb +1 -1
- data/lib/sequel/database/dataset_defaults.rb +0 -66
- data/lib/sequel/database/features.rb +6 -0
- data/lib/sequel/database/misc.rb +31 -17
- data/lib/sequel/database/query.rb +7 -4
- data/lib/sequel/database/schema_methods.rb +1 -1
- data/lib/sequel/dataset.rb +8 -8
- data/lib/sequel/dataset/actions.rb +140 -46
- data/lib/sequel/dataset/features.rb +1 -5
- data/lib/sequel/dataset/graph.rb +7 -8
- data/lib/sequel/dataset/misc.rb +127 -56
- data/lib/sequel/dataset/mutation.rb +9 -20
- data/lib/sequel/dataset/placeholder_literalizer.rb +10 -1
- data/lib/sequel/dataset/prepared_statements.rb +102 -46
- data/lib/sequel/dataset/query.rb +155 -72
- data/lib/sequel/dataset/sql.rb +26 -9
- data/lib/sequel/extensions/columns_introspection.rb +3 -1
- data/lib/sequel/extensions/core_extensions.rb +5 -5
- data/lib/sequel/extensions/core_refinements.rb +5 -5
- data/lib/sequel/extensions/duplicate_columns_handler.rb +4 -2
- data/lib/sequel/extensions/freeze_datasets.rb +69 -0
- data/lib/sequel/extensions/identifier_mangling.rb +196 -0
- data/lib/sequel/extensions/looser_typecasting.rb +11 -7
- data/lib/sequel/extensions/migration.rb +1 -1
- data/lib/sequel/extensions/null_dataset.rb +5 -2
- data/lib/sequel/extensions/pagination.rb +42 -23
- data/lib/sequel/extensions/pg_enum.rb +3 -3
- data/lib/sequel/extensions/query.rb +3 -3
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +15 -8
- data/lib/sequel/model/associations.rb +25 -8
- data/lib/sequel/model/base.rb +88 -29
- data/lib/sequel/model/dataset_module.rb +37 -0
- data/lib/sequel/plugins/association_pks.rb +4 -4
- data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
- data/lib/sequel/plugins/constraint_validations.rb +1 -2
- data/lib/sequel/plugins/csv_serializer.rb +2 -2
- data/lib/sequel/plugins/dataset_associations.rb +8 -8
- data/lib/sequel/plugins/eager_each.rb +2 -2
- data/lib/sequel/plugins/instance_filters.rb +1 -1
- data/lib/sequel/plugins/json_serializer.rb +2 -2
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/list.rb +4 -4
- data/lib/sequel/plugins/prepared_statements.rb +2 -4
- data/lib/sequel/plugins/prepared_statements_associations.rb +1 -3
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +13 -13
- data/lib/sequel/plugins/sharding.rb +1 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +9 -4
- data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
- data/lib/sequel/plugins/validation_class_methods.rb +1 -1
- data/lib/sequel/plugins/validation_helpers.rb +1 -1
- data/lib/sequel/plugins/xml_serializer.rb +2 -2
- data/lib/sequel/sql.rb +69 -36
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +10 -0
- data/spec/adapters/firebird_spec.rb +1 -1
- data/spec/adapters/mssql_spec.rb +4 -5
- data/spec/adapters/mysql_spec.rb +9 -9
- data/spec/adapters/postgres_spec.rb +67 -68
- data/spec/adapters/spec_helper.rb +6 -1
- data/spec/adapters/sqlite_spec.rb +29 -15
- data/spec/core/connection_pool_spec.rb +14 -14
- data/spec/core/database_spec.rb +38 -180
- data/spec/core/dataset_mutation_spec.rb +253 -0
- data/spec/core/dataset_spec.rb +394 -537
- data/spec/core/expression_filters_spec.rb +34 -32
- data/spec/core/mock_adapter_spec.rb +27 -35
- data/spec/core/placeholder_literalizer_spec.rb +2 -4
- data/spec/core/schema_generator_spec.rb +4 -4
- data/spec/core/schema_spec.rb +1 -2
- data/spec/core_extensions_spec.rb +22 -29
- data/spec/extensions/active_model_spec.rb +6 -6
- data/spec/extensions/association_dependencies_spec.rb +2 -2
- data/spec/extensions/blacklist_security_spec.rb +3 -3
- data/spec/extensions/boolean_readers_spec.rb +12 -12
- data/spec/extensions/caching_spec.rb +13 -10
- data/spec/extensions/class_table_inheritance_spec.rb +38 -43
- data/spec/extensions/column_conflicts_spec.rb +1 -3
- data/spec/extensions/columns_introspection_spec.rb +2 -3
- data/spec/extensions/composition_spec.rb +5 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +5 -5
- data/spec/extensions/constraint_validations_spec.rb +14 -8
- data/spec/extensions/core_refinements_spec.rb +22 -29
- data/spec/extensions/csv_serializer_spec.rb +7 -6
- data/spec/extensions/date_arithmetic_spec.rb +15 -15
- data/spec/extensions/defaults_setter_spec.rb +2 -2
- data/spec/extensions/delay_add_association_spec.rb +1 -1
- data/spec/extensions/dirty_spec.rb +19 -10
- data/spec/extensions/duplicate_columns_handler_spec.rb +12 -18
- data/spec/extensions/eager_each_spec.rb +12 -16
- data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
- data/spec/extensions/eval_inspect_spec.rb +4 -3
- data/spec/extensions/force_encoding_spec.rb +12 -12
- data/spec/extensions/freeze_datasets_spec.rb +31 -0
- data/spec/extensions/graph_each_spec.rb +6 -18
- data/spec/extensions/hook_class_methods_spec.rb +7 -7
- data/spec/extensions/identifier_mangling_spec.rb +307 -0
- data/spec/extensions/instance_filters_spec.rb +5 -6
- data/spec/extensions/instance_hooks_spec.rb +12 -12
- data/spec/extensions/json_serializer_spec.rb +12 -15
- data/spec/extensions/lazy_attributes_spec.rb +4 -4
- data/spec/extensions/list_spec.rb +19 -21
- data/spec/extensions/many_through_many_spec.rb +108 -163
- data/spec/extensions/meta_def_spec.rb +7 -2
- data/spec/extensions/migration_spec.rb +10 -12
- data/spec/extensions/mssql_optimistic_locking_spec.rb +4 -3
- data/spec/extensions/named_timezones_spec.rb +4 -3
- data/spec/extensions/nested_attributes_spec.rb +2 -2
- data/spec/extensions/null_dataset_spec.rb +17 -12
- data/spec/extensions/optimistic_locking_spec.rb +4 -5
- data/spec/extensions/pagination_spec.rb +8 -10
- data/spec/extensions/pg_array_associations_spec.rb +28 -27
- data/spec/extensions/pg_array_ops_spec.rb +2 -1
- data/spec/extensions/pg_array_spec.rb +6 -2
- data/spec/extensions/pg_enum_spec.rb +5 -3
- data/spec/extensions/pg_hstore_ops_spec.rb +3 -1
- data/spec/extensions/pg_hstore_spec.rb +7 -6
- data/spec/extensions/pg_inet_ops_spec.rb +2 -1
- data/spec/extensions/pg_inet_spec.rb +2 -1
- data/spec/extensions/pg_interval_spec.rb +2 -1
- data/spec/extensions/pg_json_ops_spec.rb +2 -1
- data/spec/extensions/pg_json_spec.rb +6 -3
- data/spec/extensions/pg_loose_count_spec.rb +1 -0
- data/spec/extensions/pg_range_ops_spec.rb +3 -1
- data/spec/extensions/pg_range_spec.rb +9 -5
- data/spec/extensions/pg_row_ops_spec.rb +2 -1
- data/spec/extensions/pg_row_plugin_spec.rb +4 -6
- data/spec/extensions/pg_row_spec.rb +5 -3
- data/spec/extensions/pg_static_cache_updater_spec.rb +2 -1
- data/spec/extensions/pg_typecast_on_load_spec.rb +1 -1
- data/spec/extensions/prepared_statements_associations_spec.rb +1 -1
- data/spec/extensions/prepared_statements_spec.rb +12 -11
- data/spec/extensions/pretty_table_spec.rb +1 -1
- data/spec/extensions/query_spec.rb +8 -5
- data/spec/extensions/rcte_tree_spec.rb +39 -39
- data/spec/extensions/round_timestamps_spec.rb +2 -2
- data/spec/extensions/schema_dumper_spec.rb +3 -2
- data/spec/extensions/schema_spec.rb +2 -2
- data/spec/extensions/scissors_spec.rb +1 -2
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +30 -17
- data/spec/extensions/serialization_modification_detection_spec.rb +2 -2
- data/spec/extensions/serialization_spec.rb +15 -13
- data/spec/extensions/set_overrides_spec.rb +14 -8
- data/spec/extensions/sharding_spec.rb +9 -18
- data/spec/extensions/shared_caching_spec.rb +3 -4
- data/spec/extensions/single_table_inheritance_spec.rb +11 -11
- data/spec/extensions/skip_create_refresh_spec.rb +2 -1
- data/spec/extensions/spec_helper.rb +1 -1
- data/spec/extensions/split_values_spec.rb +2 -2
- data/spec/extensions/sql_comments_spec.rb +6 -0
- data/spec/extensions/static_cache_spec.rb +7 -9
- data/spec/extensions/string_agg_spec.rb +30 -29
- data/spec/extensions/tactical_eager_loading_spec.rb +4 -5
- data/spec/extensions/thread_local_timezones_spec.rb +2 -2
- data/spec/extensions/timestamps_spec.rb +28 -3
- data/spec/extensions/to_dot_spec.rb +1 -2
- data/spec/extensions/tree_spec.rb +33 -29
- data/spec/extensions/typecast_on_load_spec.rb +1 -1
- data/spec/extensions/unlimited_update_spec.rb +1 -0
- data/spec/extensions/update_primary_key_spec.rb +11 -7
- data/spec/extensions/update_refresh_spec.rb +1 -1
- data/spec/extensions/uuid_spec.rb +0 -1
- data/spec/extensions/validate_associated_spec.rb +1 -1
- data/spec/extensions/validation_class_methods_spec.rb +10 -10
- data/spec/extensions/validation_helpers_spec.rb +10 -10
- data/spec/extensions/xml_serializer_spec.rb +7 -3
- data/spec/integration/associations_test.rb +31 -31
- data/spec/integration/dataset_test.rb +17 -19
- data/spec/integration/eager_loader_test.rb +24 -24
- data/spec/integration/model_test.rb +6 -6
- data/spec/integration/plugin_test.rb +43 -43
- data/spec/integration/prepared_statement_test.rb +6 -6
- data/spec/integration/schema_test.rb +63 -52
- data/spec/integration/spec_helper.rb +6 -1
- data/spec/integration/transaction_test.rb +13 -13
- data/spec/model/association_reflection_spec.rb +17 -17
- data/spec/model/associations_spec.rb +101 -96
- data/spec/model/base_spec.rb +175 -49
- data/spec/model/class_dataset_methods_spec.rb +5 -9
- data/spec/model/dataset_methods_spec.rb +5 -5
- data/spec/model/eager_loading_spec.rb +209 -235
- data/spec/model/hooks_spec.rb +15 -15
- data/spec/model/model_spec.rb +28 -21
- data/spec/model/plugins_spec.rb +4 -5
- data/spec/model/record_spec.rb +59 -57
- data/spec/model/spec_helper.rb +1 -1
- data/spec/model/validations_spec.rb +6 -6
- data/spec/spec_config.rb +1 -1
- metadata +10 -2
|
@@ -2,13 +2,14 @@ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
|
|
|
2
2
|
|
|
3
3
|
describe "Blockless Ruby Filters" do
|
|
4
4
|
before do
|
|
5
|
-
db = Sequel
|
|
6
|
-
@d = db[:items]
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
db = Sequel.mock
|
|
6
|
+
@d = db[:items].with_extend do
|
|
7
|
+
def l(*args, &block)
|
|
8
|
+
literal(filter_expr(*args, &block))
|
|
9
|
+
end
|
|
10
|
+
def lit(*args)
|
|
11
|
+
literal(*args)
|
|
12
|
+
end
|
|
12
13
|
end
|
|
13
14
|
end
|
|
14
15
|
|
|
@@ -62,7 +63,7 @@ describe "Blockless Ruby Filters" do
|
|
|
62
63
|
end
|
|
63
64
|
|
|
64
65
|
it "should use = 't' and != 't' OR IS NULL if IS TRUE is not supported" do
|
|
65
|
-
|
|
66
|
+
@d = @d.with_extend{def supports_is_true?; false end}
|
|
66
67
|
@d.l(:x => true).must_equal "(x = 't')"
|
|
67
68
|
@d.l(~Sequel.expr(:x => true)).must_equal "((x != 't') OR (x IS NULL))"
|
|
68
69
|
@d.l(:x => false).must_equal "(x = 'f')"
|
|
@@ -94,7 +95,7 @@ describe "Blockless Ruby Filters" do
|
|
|
94
95
|
@d.l{(x + y) =~ (1...5)}.must_equal '(((x + y) >= 1) AND ((x + y) < 5))'
|
|
95
96
|
@d.l{(x + y) =~ [1,2,3]}.must_equal '((x + y) IN (1, 2, 3))'
|
|
96
97
|
|
|
97
|
-
|
|
98
|
+
@d = @d.with_extend{def supports_regexp?; true end}
|
|
98
99
|
@d.l{x =~ /blah/}.must_equal '(x ~ \'blah\')'
|
|
99
100
|
@d.l{(x + y) =~ /blah/}.must_equal '((x + y) ~ \'blah\')'
|
|
100
101
|
end
|
|
@@ -117,19 +118,19 @@ describe "Blockless Ruby Filters" do
|
|
|
117
118
|
@d.l{(x + y) !~ (1...5)}.must_equal '(((x + y) < 1) OR ((x + y) >= 5))'
|
|
118
119
|
@d.l{(x + y) !~ [1,2,3]}.must_equal '((x + y) NOT IN (1, 2, 3))'
|
|
119
120
|
|
|
120
|
-
|
|
121
|
+
@d = @d.with_extend{def supports_regexp?; true end}
|
|
121
122
|
@d.l{x !~ /blah/}.must_equal '(x !~ \'blah\')'
|
|
122
123
|
@d.l{(x + y) !~ /blah/}.must_equal '((x + y) !~ \'blah\')'
|
|
123
124
|
end
|
|
124
125
|
end
|
|
125
126
|
|
|
126
127
|
it "should support ~ via Hash and Regexp (if supported by database)" do
|
|
127
|
-
|
|
128
|
+
@d = @d.with_extend{def supports_regexp?; true end}
|
|
128
129
|
@d.l(:x => /blah/).must_equal '(x ~ \'blah\')'
|
|
129
130
|
end
|
|
130
131
|
|
|
131
132
|
it "should support !~ via inverted Hash and Regexp" do
|
|
132
|
-
|
|
133
|
+
@d = @d.with_extend{def supports_regexp?; true end}
|
|
133
134
|
@d.l(~Sequel.expr(:x => /blah/)).must_equal '(x !~ \'blah\')'
|
|
134
135
|
end
|
|
135
136
|
|
|
@@ -265,7 +266,7 @@ describe "Blockless Ruby Filters" do
|
|
|
265
266
|
end
|
|
266
267
|
|
|
267
268
|
it "should emulate multiple column in if not supported" do
|
|
268
|
-
|
|
269
|
+
@d = @d.with_extend{def supports_multiple_column_in?; false end}
|
|
269
270
|
@d.l([:x, :y]=>Sequel.value_list([[1,2], [3,4]])).must_equal '(((x = 1) AND (y = 2)) OR ((x = 3) AND (y = 4)))'
|
|
270
271
|
@d.l([:x, :y, :z]=>[[1,2,5], [3,4,6]]).must_equal '(((x = 1) AND (y = 2) AND (z = 5)) OR ((x = 3) AND (y = 4) AND (z = 6)))'
|
|
271
272
|
end
|
|
@@ -429,8 +430,11 @@ describe "Blockless Ruby Filters" do
|
|
|
429
430
|
end
|
|
430
431
|
|
|
431
432
|
it "should raise an error if trying to literalize an invalid complex expression" do
|
|
432
|
-
ce = Sequel
|
|
433
|
-
ce.
|
|
433
|
+
ce = Sequel::SQL::ComplexExpression.allocate
|
|
434
|
+
ce.instance_eval do
|
|
435
|
+
@op = :BANG
|
|
436
|
+
@args = [:x, 1]
|
|
437
|
+
end
|
|
434
438
|
proc{@d.lit(ce)}.must_raise(Sequel::InvalidOperation)
|
|
435
439
|
end
|
|
436
440
|
|
|
@@ -489,7 +493,9 @@ describe "Blockless Ruby Filters" do
|
|
|
489
493
|
end
|
|
490
494
|
|
|
491
495
|
it "should handled emulated function where only name is emulated" do
|
|
492
|
-
|
|
496
|
+
db = Sequel.mock
|
|
497
|
+
db.extend_datasets{}
|
|
498
|
+
dsc = db.dataset_class
|
|
493
499
|
efm = dsc::EMULATED_FUNCTION_MAP.dup
|
|
494
500
|
dsc::EMULATED_FUNCTION_MAP[:trim] = :foo
|
|
495
501
|
dsc.new(@d.db).literal(Sequel.trim(:a)).must_equal 'foo(a)'
|
|
@@ -509,12 +515,11 @@ end
|
|
|
509
515
|
|
|
510
516
|
describe Sequel::SQL::VirtualRow do
|
|
511
517
|
before do
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
literal(filter_expr(*args, &block))
|
|
518
|
+
@d = Sequel.mock[:items].with_quote_identifiers(true).with_extend do
|
|
519
|
+
def supports_window_functions?; true end
|
|
520
|
+
def l(*args, &block)
|
|
521
|
+
literal(filter_expr(*args, &block))
|
|
522
|
+
end
|
|
518
523
|
end
|
|
519
524
|
end
|
|
520
525
|
|
|
@@ -626,9 +631,7 @@ describe Sequel::SQL::VirtualRow do
|
|
|
626
631
|
end
|
|
627
632
|
|
|
628
633
|
it "should raise an error if window functions are not supported" do
|
|
629
|
-
|
|
630
|
-
meta_def(@d, :supports_window_functions?){false}
|
|
631
|
-
proc{@d.l{count(:over, :* =>true, :partition=>a, :order=>b, :window=>:win, :frame=>:rows){}}}.must_raise(Sequel::Error)
|
|
634
|
+
proc{@d.with_extend{def supports_window_functions?; false end}.l{count(:over, :* =>true, :partition=>a, :order=>b, :window=>:win, :frame=>:rows){}}}.must_raise(Sequel::Error)
|
|
632
635
|
proc{Sequel.mock.dataset.filter{count(:over, :* =>true, :partition=>a, :order=>b, :window=>:win, :frame=>:rows){}}.sql}.must_raise(Sequel::Error)
|
|
633
636
|
end
|
|
634
637
|
|
|
@@ -670,19 +673,19 @@ describe Sequel::SQL::VirtualRow do
|
|
|
670
673
|
end
|
|
671
674
|
|
|
672
675
|
it "should handle quoted function names" do
|
|
673
|
-
|
|
676
|
+
@d = @d.with_extend{def supports_quoted_function_names?; true end}
|
|
674
677
|
@d.l{rank.function}.must_equal '"rank"()'
|
|
675
678
|
@d.l{sch__rank.function}.must_equal '"sch"."rank"()'
|
|
676
679
|
end
|
|
677
680
|
|
|
678
681
|
it "should quote function names if a quoted function is used and database supports quoted function names" do
|
|
679
|
-
|
|
682
|
+
@d = @d.with_extend{def supports_quoted_function_names?; true end}
|
|
680
683
|
@d.l{rank{}.quoted}.must_equal '"rank"()'
|
|
681
684
|
@d.l{sch__rank{}.quoted}.must_equal '"sch__rank"()'
|
|
682
685
|
end
|
|
683
686
|
|
|
684
687
|
it "should not quote function names if an unquoted function is used" do
|
|
685
|
-
|
|
688
|
+
@d = @d.with_extend{def supports_quoted_function_names?; true end}
|
|
686
689
|
@d.l{rank.function.unquoted}.must_equal 'rank()'
|
|
687
690
|
@d.l{sch__rank.function.unquoted}.must_equal 'sch.rank()'
|
|
688
691
|
end
|
|
@@ -734,9 +737,8 @@ end
|
|
|
734
737
|
|
|
735
738
|
describe "Sequel core extension replacements" do
|
|
736
739
|
before do
|
|
737
|
-
@db = Sequel
|
|
738
|
-
@ds = @db.dataset
|
|
739
|
-
def @ds.supports_regexp?; true end
|
|
740
|
+
@db = Sequel.mock
|
|
741
|
+
@ds = @db.dataset.with_extend{def supports_regexp?; true end}
|
|
740
742
|
@o = Object.new
|
|
741
743
|
def @o.sql_literal(ds) 'foo' end
|
|
742
744
|
end
|
|
@@ -1242,7 +1244,7 @@ describe "Sequel.delay" do
|
|
|
1242
1244
|
|
|
1243
1245
|
it "should delay calling the block until literalization" do
|
|
1244
1246
|
ds = Sequel.mock[:b].where(:a=>Sequel.delay{@o.a})
|
|
1245
|
-
@o._a.
|
|
1247
|
+
@o._a.must_be_nil
|
|
1246
1248
|
ds.sql.must_equal "SELECT * FROM b WHERE (a = 1)"
|
|
1247
1249
|
@o._a.must_equal 1
|
|
1248
1250
|
ds.sql.must_equal "SELECT * FROM b WHERE (a = 2)"
|
|
@@ -39,6 +39,7 @@ describe "Sequel Mock Adapter" do
|
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
it "should have constructor accept no arguments" do
|
|
42
|
+
Sequel.require 'adapters/mock'
|
|
42
43
|
Sequel::Mock::Database.new.must_be_kind_of(Sequel::Mock::Database)
|
|
43
44
|
end
|
|
44
45
|
|
|
@@ -56,8 +57,8 @@ describe "Sequel Mock Adapter" do
|
|
|
56
57
|
end
|
|
57
58
|
|
|
58
59
|
it "should return nil for insert/execute_insert by default" do
|
|
59
|
-
Sequel.mock[:t].insert(:a=>1).
|
|
60
|
-
Sequel.mock.execute_insert('INSERT INTO a () DEFAULT VALUES').
|
|
60
|
+
Sequel.mock[:t].insert(:a=>1).must_be_nil
|
|
61
|
+
Sequel.mock.execute_insert('INSERT INTO a () DEFAULT VALUES').must_be_nil
|
|
61
62
|
end
|
|
62
63
|
|
|
63
64
|
it "should be able to set the rows returned by each using :fetch option with a single hash" do
|
|
@@ -149,13 +150,13 @@ describe "Sequel Mock Adapter" do
|
|
|
149
150
|
proc{db[:t].all}.must_raise(Sequel::DatabaseError)
|
|
150
151
|
end
|
|
151
152
|
|
|
152
|
-
it "should be able to set the rows returned by each on a per dataset basis using
|
|
153
|
+
it "should be able to set the rows returned by each on a per dataset basis using with_fetch" do
|
|
153
154
|
rs = []
|
|
154
155
|
db = Sequel.mock(:fetch=>{:a=>1})
|
|
155
156
|
ds = db[:t]
|
|
156
157
|
ds.each{|r| rs << r}
|
|
157
158
|
rs.must_equal [{:a=>1}]
|
|
158
|
-
ds
|
|
159
|
+
ds = ds.with_fetch(:b=>2)
|
|
159
160
|
ds.each{|r| rs << r}
|
|
160
161
|
rs.must_equal [{:a=>1}, {:b=>2}]
|
|
161
162
|
end
|
|
@@ -222,7 +223,7 @@ describe "Sequel Mock Adapter" do
|
|
|
222
223
|
ds = db[:t]
|
|
223
224
|
ds.update(:a=>1).must_equal 2
|
|
224
225
|
ds.delete.must_equal 2
|
|
225
|
-
ds
|
|
226
|
+
ds = ds.with_numrows(3)
|
|
226
227
|
ds.update(:a=>1).must_equal 3
|
|
227
228
|
ds.delete.must_equal 3
|
|
228
229
|
end
|
|
@@ -246,7 +247,7 @@ describe "Sequel Mock Adapter" do
|
|
|
246
247
|
db[:t].insert(:a=>1).must_equal 1
|
|
247
248
|
db[:t].insert(:a=>1).must_equal 3
|
|
248
249
|
db[:t].insert(:a=>1).must_equal 5
|
|
249
|
-
db[:t].insert(:a=>1).
|
|
250
|
+
db[:t].insert(:a=>1).must_be_nil
|
|
250
251
|
end
|
|
251
252
|
|
|
252
253
|
it "should be able to set the autogenerated primary key returned by insert using :autoid option as a proc" do
|
|
@@ -272,7 +273,7 @@ describe "Sequel Mock Adapter" do
|
|
|
272
273
|
db = Sequel.mock(:autoid=>[1, proc{|s| 2}, nil, ArgumentError])
|
|
273
274
|
db[:t].insert.must_equal 1
|
|
274
275
|
db[:t].insert.must_equal 2
|
|
275
|
-
db[:t].insert.
|
|
276
|
+
db[:t].insert.must_be_nil
|
|
276
277
|
proc{db[:t].insert}.must_raise(Sequel::DatabaseError)
|
|
277
278
|
end
|
|
278
279
|
|
|
@@ -288,7 +289,7 @@ describe "Sequel Mock Adapter" do
|
|
|
288
289
|
db = Sequel.mock(:autoid=>1)
|
|
289
290
|
ds = db[:t]
|
|
290
291
|
ds.insert(:a=>1).must_equal 1
|
|
291
|
-
ds
|
|
292
|
+
ds = ds.with_autoid(5)
|
|
292
293
|
ds.insert(:a=>1).must_equal 5
|
|
293
294
|
ds.insert(:a=>1).must_equal 6
|
|
294
295
|
db[:t].insert(:a=>1).must_equal 2
|
|
@@ -335,14 +336,13 @@ describe "Sequel Mock Adapter" do
|
|
|
335
336
|
|
|
336
337
|
it "should allow overriding of server_version" do
|
|
337
338
|
db = Sequel.mock
|
|
338
|
-
db.server_version.
|
|
339
|
+
db.server_version.must_be_nil
|
|
339
340
|
db.server_version = 80102
|
|
340
341
|
db.server_version.must_equal 80102
|
|
341
342
|
end
|
|
342
343
|
|
|
343
|
-
it "should not
|
|
344
|
-
Sequel.mock.send(:
|
|
345
|
-
Sequel.mock.send(:identifier_output_method_default).must_equal nil
|
|
344
|
+
it "should not fold to uppercase by default" do
|
|
345
|
+
Sequel.mock.send(:folds_unquoted_identifiers_to_uppercase?).must_equal false
|
|
346
346
|
end
|
|
347
347
|
|
|
348
348
|
it "should keep a record of all executed SQL in #sqls" do
|
|
@@ -449,29 +449,21 @@ describe "Sequel Mock Adapter" do
|
|
|
449
449
|
end
|
|
450
450
|
|
|
451
451
|
it "should be able to load dialects based on the database name" do
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
Sequel.mock(:host=>'postgres')[:a].full_text_search(:b, 'c').sql.must_equal "SELECT * FROM \"a\" WHERE (to_tsvector(CAST('simple' AS regconfig), (COALESCE(\"b\", ''))) @@ to_tsquery(CAST('simple' AS regconfig), 'c'))"
|
|
468
|
-
Sequel.mock(:host=>'sqlanywhere').from(:a).offset(1).sql.must_equal 'SELECT TOP 2147483647 START AT (1 + 1) * FROM "A"'
|
|
469
|
-
Sequel.mock(:host=>'sqlite')[:a___b].sql.must_equal "SELECT * FROM `a` AS 'b'"
|
|
470
|
-
ensure
|
|
471
|
-
Sequel.quote_identifiers = qi
|
|
472
|
-
Sequel::Database.send(:instance_variable_set, :@identifier_input_method, ii)
|
|
473
|
-
Sequel::Database.send(:instance_variable_set, :@identifier_output_method, io)
|
|
474
|
-
end
|
|
452
|
+
Sequel.mock(:host=>'access').select(Date.new(2011, 12, 13)).sql.must_equal 'SELECT #2011-12-13#'
|
|
453
|
+
Sequel.mock(:host=>'cubrid').from(:a).offset(1).with_quote_identifiers(false).sql.must_equal 'SELECT * FROM a LIMIT 1,4294967295'
|
|
454
|
+
Sequel.mock(:host=>'db2').select(1).sql.must_equal 'SELECT 1 FROM "SYSIBM"."SYSDUMMY1"'
|
|
455
|
+
Sequel.mock(:host=>'firebird')[:A].distinct.limit(1, 2).with_quote_identifiers(false).sql.must_equal 'SELECT DISTINCT FIRST 1 SKIP 2 * FROM A'
|
|
456
|
+
Sequel.mock(:host=>'informix')[:a].distinct.limit(1, 2).sql.upcase.must_equal 'SELECT SKIP 2 FIRST 1 DISTINCT * FROM A'
|
|
457
|
+
Sequel.mock(:host=>'mssql', :identifier_mangling=>false)[:A].full_text_search(:B, 'C').with_quote_identifiers(false).sql.must_equal "SELECT * FROM A WHERE (CONTAINS (B, 'C'))"
|
|
458
|
+
Sequel.mock(:host=>'mysql')[:a].full_text_search(:b, 'c').with_quote_identifiers(false).sql.must_equal "SELECT * FROM a WHERE (MATCH (b) AGAINST ('c'))"
|
|
459
|
+
Sequel.mock(:host=>'oracle')[:a].limit(1).with_quote_identifiers(false).sql.upcase.must_equal 'SELECT * FROM (SELECT * FROM A) T1 WHERE (ROWNUM <= 1)'
|
|
460
|
+
Sequel.mock(:host=>'postgres')[:a].full_text_search(:b, 'c').with_quote_identifiers(false).sql.must_equal "SELECT * FROM a WHERE (to_tsvector(CAST('simple' AS regconfig), (COALESCE(b, ''))) @@ to_tsquery(CAST('simple' AS regconfig), 'c'))"
|
|
461
|
+
Sequel.mock(:host=>'sqlanywhere').from(:A).offset(1).with_quote_identifiers(false).sql.must_equal 'SELECT TOP 2147483647 START AT (1 + 1) * FROM A'
|
|
462
|
+
Sequel.mock(:host=>'sqlite')[:a___b].with_quote_identifiers(false).sql.must_equal "SELECT * FROM a AS 'b'"
|
|
463
|
+
end
|
|
464
|
+
|
|
465
|
+
it "should be able to mock schema calls" do
|
|
466
|
+
Sequel.mock(:host=>'mysql', :fetch=>{:Field=>'a'}).schema(:a).first.first.must_equal :a
|
|
475
467
|
end
|
|
476
468
|
|
|
477
469
|
it "should automatically set version for adapters needing versions" do
|
|
@@ -87,7 +87,7 @@ describe "Dataset::PlaceholderLiteralizer" do
|
|
|
87
87
|
end
|
|
88
88
|
|
|
89
89
|
it "should handle dataset with row procs" do
|
|
90
|
-
@ds
|
|
90
|
+
@ds = @ds.with_row_proc(proc{|r| {:foo=>r[:id]+1}})
|
|
91
91
|
loader = @c.loader(@ds){|pl, ds| ds.where(:a=>pl.arg)}
|
|
92
92
|
loader.first(1).must_equal(:foo=>2)
|
|
93
93
|
@db.sqls.must_equal ["SELECT * FROM items WHERE (a = 1)"]
|
|
@@ -124,9 +124,7 @@ describe "Dataset::PlaceholderLiteralizer" do
|
|
|
124
124
|
it "should support modifying dataset used on per-call basis with #run" do
|
|
125
125
|
loader = @c.loader(@ds){|pl, ds| ds.where(:a=>pl.arg)}
|
|
126
126
|
loader.with_dataset do |ds|
|
|
127
|
-
ds
|
|
128
|
-
ds.row_proc = lambda{|row| [row]}
|
|
129
|
-
ds
|
|
127
|
+
ds.with_row_proc(lambda{|row| [row]})
|
|
130
128
|
end.all(1).must_equal [[@h]]
|
|
131
129
|
@db.sqls.must_equal ["SELECT * FROM items WHERE (a = 1)"]
|
|
132
130
|
end
|
|
@@ -27,7 +27,7 @@ describe Sequel::Schema::Generator do
|
|
|
27
27
|
@columns.first[:name].must_equal :id
|
|
28
28
|
@columns.first[:primary_key].must_equal true
|
|
29
29
|
@columns[3][:name].must_equal :parent_id
|
|
30
|
-
@columns[3][:primary_key].
|
|
30
|
+
@columns[3][:primary_key].must_be_nil
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
it "should respect existing column order if primary_key :keep_order is used" do
|
|
@@ -40,7 +40,7 @@ describe Sequel::Schema::Generator do
|
|
|
40
40
|
columns.last[:name].must_equal :id
|
|
41
41
|
columns.last[:primary_key].must_equal true
|
|
42
42
|
columns.first[:name].must_equal :title
|
|
43
|
-
columns.first[:primary_key].
|
|
43
|
+
columns.first[:primary_key].must_be_nil
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
it "should handle SQL::Identifier and SQL::QualifiedIdentifier as foreign_key arguments" do
|
|
@@ -85,7 +85,7 @@ describe Sequel::Schema::Generator do
|
|
|
85
85
|
end
|
|
86
86
|
|
|
87
87
|
it "uses table for foreign key columns, if specified" do
|
|
88
|
-
@columns[3][:table].
|
|
88
|
+
@columns[3][:table].must_be_nil
|
|
89
89
|
@columns[4][:table].must_equal :nodes
|
|
90
90
|
@constraints[3][:table].must_equal :nodes_props
|
|
91
91
|
end
|
|
@@ -98,7 +98,7 @@ describe Sequel::Schema::Generator do
|
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
it "creates constraints" do
|
|
101
|
-
@constraints[0][:name].
|
|
101
|
+
@constraints[0][:name].must_be_nil
|
|
102
102
|
@constraints[0][:type].must_equal :check
|
|
103
103
|
@constraints[0][:check].must_equal ['price > 100']
|
|
104
104
|
|
data/spec/core/schema_spec.rb
CHANGED
|
@@ -384,11 +384,10 @@ describe "DB#create_table" do
|
|
|
384
384
|
end
|
|
385
385
|
|
|
386
386
|
it "should accept collation" do
|
|
387
|
-
@db.quote_identifiers = true
|
|
388
387
|
@db.create_table(:cats) do
|
|
389
388
|
String :name, :collate => :utf8_bin
|
|
390
389
|
end
|
|
391
|
-
@db.sqls.must_equal ['CREATE TABLE
|
|
390
|
+
@db.sqls.must_equal ['CREATE TABLE cats (name varchar(255) COLLATE utf8_bin)']
|
|
392
391
|
end
|
|
393
392
|
|
|
394
393
|
it "should accept collation as a String, treated literally" do
|
|
@@ -33,14 +33,15 @@ end
|
|
|
33
33
|
|
|
34
34
|
describe "Core extensions" do
|
|
35
35
|
before do
|
|
36
|
-
db = Sequel
|
|
37
|
-
@d = db[:items]
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
db = Sequel.mock
|
|
37
|
+
@d = db[:items].with_extend do
|
|
38
|
+
def supports_regexp?; true end
|
|
39
|
+
def l(*args, &block)
|
|
40
|
+
literal(filter_expr(*args, &block))
|
|
41
|
+
end
|
|
42
|
+
def lit(*args)
|
|
43
|
+
literal(*args)
|
|
44
|
+
end
|
|
44
45
|
end
|
|
45
46
|
end
|
|
46
47
|
|
|
@@ -316,7 +317,7 @@ end
|
|
|
316
317
|
|
|
317
318
|
describe "String#lit" do
|
|
318
319
|
before do
|
|
319
|
-
@ds = Sequel
|
|
320
|
+
@ds = Sequel.mock[:t]
|
|
320
321
|
end
|
|
321
322
|
|
|
322
323
|
it "should return an LiteralString object" do
|
|
@@ -332,16 +333,14 @@ describe "String#lit" do
|
|
|
332
333
|
a = 'DISTINCT ?'.lit(:a)
|
|
333
334
|
a.must_be_kind_of(Sequel::SQL::PlaceholderLiteralString)
|
|
334
335
|
@ds.literal(a).must_equal 'DISTINCT a'
|
|
335
|
-
@ds.
|
|
336
|
-
@ds.literal(a).must_equal 'DISTINCT "a"'
|
|
336
|
+
@ds.with_quote_identifiers(true).literal(a).must_equal 'DISTINCT "a"'
|
|
337
337
|
end
|
|
338
338
|
|
|
339
339
|
it "should handle named placeholders if given a single argument hash" do
|
|
340
340
|
a = 'DISTINCT :b'.lit(:b=>:a)
|
|
341
341
|
a.must_be_kind_of(Sequel::SQL::PlaceholderLiteralString)
|
|
342
342
|
@ds.literal(a).must_equal 'DISTINCT a'
|
|
343
|
-
@ds.
|
|
344
|
-
@ds.literal(a).must_equal 'DISTINCT "a"'
|
|
343
|
+
@ds.with_quote_identifiers(true).literal(a).must_equal 'DISTINCT "a"'
|
|
345
344
|
end
|
|
346
345
|
|
|
347
346
|
it "should treat placeholder literal strings as generic expressions" do
|
|
@@ -445,11 +444,7 @@ end
|
|
|
445
444
|
|
|
446
445
|
describe "Column references" do
|
|
447
446
|
before do
|
|
448
|
-
@ds = Sequel
|
|
449
|
-
def @ds.quoted_identifier_append(sql, c)
|
|
450
|
-
sql << "`#{c}`"
|
|
451
|
-
end
|
|
452
|
-
@ds.quote_identifiers = true
|
|
447
|
+
@ds = Sequel.mock.dataset.with_quote_identifiers(true).with_extend{def quoted_identifier_append(sql, c) sql << "`#{c}`" end}
|
|
453
448
|
end
|
|
454
449
|
|
|
455
450
|
it "should be quoted properly" do
|
|
@@ -520,30 +515,28 @@ end
|
|
|
520
515
|
|
|
521
516
|
describe "Symbol" do
|
|
522
517
|
before do
|
|
523
|
-
@ds = Sequel.mock.dataset
|
|
524
|
-
@ds.quote_identifiers = true
|
|
525
|
-
@ds.identifier_input_method = :upcase
|
|
518
|
+
@ds = Sequel.mock.dataset.with_quote_identifiers(true)
|
|
526
519
|
end
|
|
527
520
|
|
|
528
521
|
it "#identifier should format an identifier" do
|
|
529
|
-
@ds.literal(:xyz__abc.identifier).must_equal '"
|
|
522
|
+
@ds.literal(:xyz__abc.identifier).must_equal '"xyz__abc"'
|
|
530
523
|
end
|
|
531
524
|
|
|
532
525
|
it "#qualify should format a qualified column" do
|
|
533
|
-
@ds.literal(:xyz.qualify(:abc)).must_equal '"
|
|
526
|
+
@ds.literal(:xyz.qualify(:abc)).must_equal '"abc"."xyz"'
|
|
534
527
|
end
|
|
535
528
|
|
|
536
529
|
it "#qualify should work on QualifiedIdentifiers" do
|
|
537
|
-
@ds.literal(:xyz.qualify(:abc).qualify(:def)).must_equal '"
|
|
530
|
+
@ds.literal(:xyz.qualify(:abc).qualify(:def)).must_equal '"def"."abc"."xyz"'
|
|
538
531
|
end
|
|
539
532
|
|
|
540
533
|
it "should be able to qualify an identifier" do
|
|
541
|
-
@ds.literal(:xyz.identifier.qualify(:xyz__abc)).must_equal '"
|
|
534
|
+
@ds.literal(:xyz.identifier.qualify(:xyz__abc)).must_equal '"xyz"."abc"."xyz"'
|
|
542
535
|
end
|
|
543
536
|
|
|
544
537
|
it "should be able to specify a schema.table.column" do
|
|
545
|
-
@ds.literal(:column.qualify(:table.qualify(:schema))).must_equal '"
|
|
546
|
-
@ds.literal(:column.qualify(:table__name.identifier.qualify(:schema))).must_equal '"
|
|
538
|
+
@ds.literal(:column.qualify(:table.qualify(:schema))).must_equal '"schema"."table"."column"'
|
|
539
|
+
@ds.literal(:column.qualify(:table__name.identifier.qualify(:schema))).must_equal '"schema"."table__name"."column"'
|
|
547
540
|
end
|
|
548
541
|
|
|
549
542
|
it "should be able to specify order" do
|
|
@@ -558,13 +551,13 @@ describe "Symbol" do
|
|
|
558
551
|
it "should work correctly with objects" do
|
|
559
552
|
o = Object.new
|
|
560
553
|
def o.sql_literal(ds) "(foo)" end
|
|
561
|
-
@ds.literal(:column.qualify(o)).must_equal '(foo)."
|
|
554
|
+
@ds.literal(:column.qualify(o)).must_equal '(foo)."column"'
|
|
562
555
|
end
|
|
563
556
|
end
|
|
564
557
|
|
|
565
558
|
describe "Symbol" do
|
|
566
559
|
before do
|
|
567
|
-
@ds = Sequel
|
|
560
|
+
@ds = Sequel.mock.dataset
|
|
568
561
|
end
|
|
569
562
|
|
|
570
563
|
it "should support sql_function method" do
|