sequel 3.37.0 → 3.38.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 +56 -0
- data/README.rdoc +82 -58
- data/Rakefile +6 -5
- data/bin/sequel +1 -1
- data/doc/active_record.rdoc +67 -52
- data/doc/advanced_associations.rdoc +33 -48
- data/doc/association_basics.rdoc +41 -51
- data/doc/cheat_sheet.rdoc +21 -21
- data/doc/core_extensions.rdoc +374 -0
- data/doc/dataset_basics.rdoc +5 -5
- data/doc/dataset_filtering.rdoc +47 -43
- data/doc/mass_assignment.rdoc +1 -1
- data/doc/migration.rdoc +4 -5
- data/doc/model_hooks.rdoc +3 -3
- data/doc/object_model.rdoc +31 -25
- data/doc/opening_databases.rdoc +19 -5
- data/doc/prepared_statements.rdoc +2 -2
- data/doc/querying.rdoc +109 -52
- data/doc/reflection.rdoc +6 -6
- data/doc/release_notes/3.38.0.txt +234 -0
- data/doc/schema_modification.rdoc +22 -13
- data/doc/sharding.rdoc +8 -9
- data/doc/sql.rdoc +154 -112
- data/doc/testing.rdoc +47 -7
- data/doc/thread_safety.rdoc +1 -1
- data/doc/transactions.rdoc +1 -1
- data/doc/validations.rdoc +1 -1
- data/doc/virtual_rows.rdoc +29 -43
- data/lib/sequel/adapters/do/postgres.rb +1 -4
- data/lib/sequel/adapters/jdbc.rb +14 -3
- data/lib/sequel/adapters/jdbc/db2.rb +9 -0
- data/lib/sequel/adapters/jdbc/derby.rb +41 -4
- data/lib/sequel/adapters/jdbc/jtds.rb +11 -0
- data/lib/sequel/adapters/jdbc/postgresql.rb +3 -6
- data/lib/sequel/adapters/mock.rb +10 -4
- data/lib/sequel/adapters/postgres.rb +1 -28
- data/lib/sequel/adapters/shared/mssql.rb +23 -13
- data/lib/sequel/adapters/shared/postgres.rb +46 -0
- data/lib/sequel/adapters/swift.rb +21 -13
- data/lib/sequel/adapters/swift/mysql.rb +1 -0
- data/lib/sequel/adapters/swift/postgres.rb +4 -5
- data/lib/sequel/adapters/swift/sqlite.rb +2 -1
- data/lib/sequel/adapters/tinytds.rb +14 -2
- data/lib/sequel/adapters/utils/pg_types.rb +5 -0
- data/lib/sequel/core.rb +29 -17
- data/lib/sequel/database/query.rb +1 -1
- data/lib/sequel/database/schema_generator.rb +3 -0
- data/lib/sequel/dataset/actions.rb +5 -6
- data/lib/sequel/dataset/query.rb +7 -7
- data/lib/sequel/dataset/sql.rb +5 -18
- data/lib/sequel/extensions/core_extensions.rb +8 -12
- data/lib/sequel/extensions/pg_array.rb +59 -33
- data/lib/sequel/extensions/pg_array_ops.rb +32 -4
- data/lib/sequel/extensions/pg_auto_parameterize.rb +1 -1
- data/lib/sequel/extensions/pg_hstore.rb +32 -17
- data/lib/sequel/extensions/pg_hstore_ops.rb +32 -3
- data/lib/sequel/extensions/pg_inet.rb +1 -2
- data/lib/sequel/extensions/pg_interval.rb +0 -1
- data/lib/sequel/extensions/pg_json.rb +41 -23
- data/lib/sequel/extensions/pg_range.rb +36 -11
- data/lib/sequel/extensions/pg_range_ops.rb +32 -4
- data/lib/sequel/extensions/pg_row.rb +572 -0
- data/lib/sequel/extensions/pg_row_ops.rb +164 -0
- data/lib/sequel/extensions/query.rb +3 -3
- data/lib/sequel/extensions/schema_dumper.rb +7 -8
- data/lib/sequel/extensions/select_remove.rb +1 -1
- data/lib/sequel/model/base.rb +1 -0
- data/lib/sequel/no_core_ext.rb +1 -1
- data/lib/sequel/plugins/pg_row.rb +121 -0
- data/lib/sequel/plugins/pg_typecast_on_load.rb +65 -0
- data/lib/sequel/plugins/validation_helpers.rb +31 -0
- data/lib/sequel/sql.rb +64 -44
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/mssql_spec.rb +37 -12
- data/spec/adapters/mysql_spec.rb +39 -75
- data/spec/adapters/oracle_spec.rb +11 -11
- data/spec/adapters/postgres_spec.rb +414 -237
- data/spec/adapters/spec_helper.rb +1 -1
- data/spec/adapters/sqlite_spec.rb +14 -14
- data/spec/core/database_spec.rb +6 -6
- data/spec/core/dataset_spec.rb +169 -205
- data/spec/core/expression_filters_spec.rb +182 -295
- data/spec/core/object_graph_spec.rb +6 -6
- data/spec/core/schema_spec.rb +14 -14
- data/spec/core/spec_helper.rb +1 -0
- data/spec/{extensions/core_extensions_spec.rb → core_extensions_spec.rb} +208 -14
- data/spec/extensions/columns_introspection_spec.rb +5 -5
- data/spec/extensions/hook_class_methods_spec.rb +28 -36
- data/spec/extensions/many_through_many_spec.rb +4 -4
- data/spec/extensions/pg_array_ops_spec.rb +15 -7
- data/spec/extensions/pg_array_spec.rb +81 -48
- data/spec/extensions/pg_auto_parameterize_spec.rb +2 -2
- data/spec/extensions/pg_hstore_ops_spec.rb +13 -9
- data/spec/extensions/pg_hstore_spec.rb +66 -65
- data/spec/extensions/pg_inet_spec.rb +2 -4
- data/spec/extensions/pg_interval_spec.rb +2 -3
- data/spec/extensions/pg_json_spec.rb +20 -18
- data/spec/extensions/pg_range_ops_spec.rb +11 -4
- data/spec/extensions/pg_range_spec.rb +30 -7
- data/spec/extensions/pg_row_ops_spec.rb +48 -0
- data/spec/extensions/pg_row_plugin_spec.rb +45 -0
- data/spec/extensions/pg_row_spec.rb +323 -0
- data/spec/extensions/pg_typecast_on_load_spec.rb +58 -0
- data/spec/extensions/query_literals_spec.rb +11 -11
- data/spec/extensions/query_spec.rb +3 -3
- data/spec/extensions/schema_dumper_spec.rb +20 -4
- data/spec/extensions/schema_spec.rb +18 -41
- data/spec/extensions/select_remove_spec.rb +4 -4
- data/spec/extensions/spec_helper.rb +4 -8
- data/spec/extensions/to_dot_spec.rb +5 -5
- data/spec/extensions/validation_class_methods_spec.rb +28 -16
- data/spec/integration/associations_test.rb +20 -20
- data/spec/integration/dataset_test.rb +98 -98
- data/spec/integration/eager_loader_test.rb +13 -27
- data/spec/integration/plugin_test.rb +5 -5
- data/spec/integration/prepared_statement_test.rb +22 -13
- data/spec/integration/schema_test.rb +28 -18
- data/spec/integration/spec_helper.rb +1 -1
- data/spec/integration/timezone_test.rb +2 -2
- data/spec/integration/type_test.rb +15 -6
- data/spec/model/association_reflection_spec.rb +1 -1
- data/spec/model/associations_spec.rb +4 -4
- data/spec/model/base_spec.rb +5 -5
- data/spec/model/eager_loading_spec.rb +15 -15
- data/spec/model/model_spec.rb +32 -32
- data/spec/model/record_spec.rb +16 -0
- data/spec/model/spec_helper.rb +2 -6
- data/spec/model/validations_spec.rb +1 -1
- metadata +16 -4
|
@@ -2,7 +2,7 @@ require 'rubygems'
|
|
|
2
2
|
require 'logger'
|
|
3
3
|
unless Object.const_defined?('Sequel')
|
|
4
4
|
$:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
|
|
5
|
-
require 'sequel'
|
|
5
|
+
require 'sequel/no_core_ext'
|
|
6
6
|
end
|
|
7
7
|
begin
|
|
8
8
|
require File.join(File.dirname(File.dirname(File.expand_path(__FILE__))), 'spec_config.rb')
|
|
@@ -56,12 +56,12 @@ describe "An SQLite database" do
|
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
specify "should support casting to Date by using the date function" do
|
|
59
|
-
@db.get('2012-10-20 11:12:13'
|
|
59
|
+
@db.get(Sequel.cast('2012-10-20 11:12:13', Date)).should == '2012-10-20'
|
|
60
60
|
end
|
|
61
61
|
|
|
62
62
|
specify "should support casting to Time or DateTime by using the datetime function" do
|
|
63
|
-
@db.get('2012-10-20'
|
|
64
|
-
@db.get('2012-10-20'
|
|
63
|
+
@db.get(Sequel.cast('2012-10-20', Time)).should == '2012-10-20 00:00:00'
|
|
64
|
+
@db.get(Sequel.cast('2012-10-20', DateTime)).should == '2012-10-20 00:00:00'
|
|
65
65
|
end
|
|
66
66
|
|
|
67
67
|
specify "should provide the SQLite version as an integer" do
|
|
@@ -95,11 +95,11 @@ describe "An SQLite database" do
|
|
|
95
95
|
specify "should support a use_timestamp_timezones setting" do
|
|
96
96
|
@db.create_table!(:time){Time :time}
|
|
97
97
|
@db[:time].insert(Time.now)
|
|
98
|
-
@db[:time].get(:time
|
|
98
|
+
@db[:time].get(Sequel.cast(:time, String)).should =~ /[-+]\d\d\d\d\z/
|
|
99
99
|
@db.use_timestamp_timezones = false
|
|
100
100
|
@db[:time].delete
|
|
101
101
|
@db[:time].insert(Time.now)
|
|
102
|
-
@db[:time].get(:time
|
|
102
|
+
@db[:time].get(Sequel.cast(:time, String)).should_not =~ /[-+]\d\d\d\d\z/
|
|
103
103
|
@db.use_timestamp_timezones = true
|
|
104
104
|
end
|
|
105
105
|
|
|
@@ -183,10 +183,10 @@ describe "SQLite type conversion" do
|
|
|
183
183
|
@db.create_table(:items){TrueClass :a}
|
|
184
184
|
@db[:items].insert(false)
|
|
185
185
|
@db[:items].select_map(:a).should == [false]
|
|
186
|
-
@db[:items].select_map(:a+:a).should == [0]
|
|
186
|
+
@db[:items].select_map(Sequel.expr(:a)+:a).should == [0]
|
|
187
187
|
@db[:items].update(:a=>true)
|
|
188
188
|
@db[:items].select_map(:a).should == [true]
|
|
189
|
-
@db[:items].select_map(:a+:a).should == [2]
|
|
189
|
+
@db[:items].select_map(Sequel.expr(:a)+:a).should == [2]
|
|
190
190
|
end
|
|
191
191
|
|
|
192
192
|
specify "should handle integers/floats/strings/decimals in numeric/decimal columns" do
|
|
@@ -258,10 +258,10 @@ describe "An SQLite dataset" do
|
|
|
258
258
|
end
|
|
259
259
|
|
|
260
260
|
specify "should raise errors if given a regexp pattern match" do
|
|
261
|
-
proc{@d.literal(:x.like(/a/))}.should raise_error(Sequel::Error)
|
|
262
|
-
proc{@d.literal(
|
|
263
|
-
proc{@d.literal(:x.like(/a/i))}.should raise_error(Sequel::Error)
|
|
264
|
-
proc{@d.literal(
|
|
261
|
+
proc{@d.literal(Sequel.expr(:x).like(/a/))}.should raise_error(Sequel::Error)
|
|
262
|
+
proc{@d.literal(~Sequel.expr(:x).like(/a/))}.should raise_error(Sequel::Error)
|
|
263
|
+
proc{@d.literal(Sequel.expr(:x).like(/a/i))}.should raise_error(Sequel::Error)
|
|
264
|
+
proc{@d.literal(~Sequel.expr(:x).like(/a/i))}.should raise_error(Sequel::Error)
|
|
265
265
|
end
|
|
266
266
|
end
|
|
267
267
|
|
|
@@ -289,7 +289,7 @@ describe "An SQLite dataset AS clause" do
|
|
|
289
289
|
end
|
|
290
290
|
|
|
291
291
|
specify "should use a string literal for :column.as(:alias)" do
|
|
292
|
-
SQLITE_DB.literal(
|
|
292
|
+
SQLITE_DB.literal(Sequel.as(:c, :a)).should == "`c` AS 'a'"
|
|
293
293
|
end
|
|
294
294
|
|
|
295
295
|
specify "should use a string literal in the SELECT clause" do
|
|
@@ -321,10 +321,10 @@ describe "SQLite::Dataset#delete" do
|
|
|
321
321
|
|
|
322
322
|
specify "should return the number of records affected when filtered" do
|
|
323
323
|
@d.count.should == 3
|
|
324
|
-
@d.filter
|
|
324
|
+
@d.filter{value < 3}.delete.should == 1
|
|
325
325
|
@d.count.should == 2
|
|
326
326
|
|
|
327
|
-
@d.filter
|
|
327
|
+
@d.filter{value < 3}.delete.should == 0
|
|
328
328
|
@d.count.should == 2
|
|
329
329
|
end
|
|
330
330
|
|
data/spec/core/database_spec.rb
CHANGED
|
@@ -369,7 +369,7 @@ describe "Database#dataset" do
|
|
|
369
369
|
end
|
|
370
370
|
|
|
371
371
|
specify "should provide a filtered #from dataset if a block is given" do
|
|
372
|
-
d = @db.from(:mau)
|
|
372
|
+
d = @db.from(:mau){x.sql_number > 100}
|
|
373
373
|
d.should be_a_kind_of(Sequel::Dataset)
|
|
374
374
|
d.sql.should == 'SELECT * FROM mau WHERE (x > 100)'
|
|
375
375
|
end
|
|
@@ -1360,7 +1360,7 @@ describe "Database#fetch" do
|
|
|
1360
1360
|
ds.select_sql.should == 'select * from xyz'
|
|
1361
1361
|
ds.sql.should == 'select * from xyz'
|
|
1362
1362
|
|
|
1363
|
-
ds.filter!
|
|
1363
|
+
ds.filter!{price.sql_number < 100}
|
|
1364
1364
|
ds.select_sql.should == 'select * from xyz'
|
|
1365
1365
|
ds.sql.should == 'select * from xyz'
|
|
1366
1366
|
end
|
|
@@ -1409,7 +1409,7 @@ describe "Database#get" do
|
|
|
1409
1409
|
@db.get(1).should == 1
|
|
1410
1410
|
@db.sqls.should == ['SELECT 1 LIMIT 1']
|
|
1411
1411
|
|
|
1412
|
-
@db.get(:version
|
|
1412
|
+
@db.get(Sequel.function(:version))
|
|
1413
1413
|
@db.sqls.should == ['SELECT version() LIMIT 1']
|
|
1414
1414
|
end
|
|
1415
1415
|
|
|
@@ -1914,7 +1914,7 @@ describe "Database#typecast_value" do
|
|
|
1914
1914
|
end
|
|
1915
1915
|
|
|
1916
1916
|
specify "should typecast string values to String" do
|
|
1917
|
-
[1.0, '1.0', '1.0'
|
|
1917
|
+
[1.0, '1.0', Sequel.blob('1.0')].each do |i|
|
|
1918
1918
|
v = @db.typecast_value(:string, i)
|
|
1919
1919
|
v.should be_an_instance_of(String)
|
|
1920
1920
|
v.should == "1.0"
|
|
@@ -2079,7 +2079,7 @@ describe "Database#column_schema_to_ruby_default" do
|
|
|
2079
2079
|
p["'t'", :boolean].should == true
|
|
2080
2080
|
p["'f'", :boolean].should == false
|
|
2081
2081
|
p["'a'", :string].should == 'a'
|
|
2082
|
-
p["'a'", :blob].should == 'a'
|
|
2082
|
+
p["'a'", :blob].should == Sequel.blob('a')
|
|
2083
2083
|
p["'a'", :blob].should be_a_kind_of(Sequel::SQL::Blob)
|
|
2084
2084
|
p["''", :string].should == ''
|
|
2085
2085
|
p["'\\a''b'", :string].should == "\\a'b"
|
|
@@ -2099,7 +2099,7 @@ describe "Database#column_schema_to_ruby_default" do
|
|
|
2099
2099
|
p["(-1)", :integer].should == -1
|
|
2100
2100
|
p["(-1.0)", :float].should == -1.0
|
|
2101
2101
|
p['(-1.0)', :decimal].should == BigDecimal.new('-1.0')
|
|
2102
|
-
p["'a'::bytea", :blob].should == 'a'
|
|
2102
|
+
p["'a'::bytea", :blob].should == Sequel.blob('a')
|
|
2103
2103
|
p["'a'::bytea", :blob].should be_a_kind_of(Sequel::SQL::Blob)
|
|
2104
2104
|
p["'2009-10-29'::date", :date].should == Date.new(2009,10,29)
|
|
2105
2105
|
p["'2009-10-29 10:20:30.241343'::timestamp without time zone", :datetime].should == DateTime.parse('2009-10-29 10:20:30.241343')
|
data/spec/core/dataset_spec.rb
CHANGED
|
@@ -328,19 +328,19 @@ describe "Dataset#unused_table_alias" do
|
|
|
328
328
|
@ds.unused_table_alias('test').should == :test_0
|
|
329
329
|
@ds.unused_table_alias(:b__t___test).should == :test_0
|
|
330
330
|
@ds.unused_table_alias(:b__test).should == :test_0
|
|
331
|
-
@ds.unused_table_alias(
|
|
332
|
-
@ds.unused_table_alias(:b.as(:test)).should == :test_0
|
|
333
|
-
@ds.unused_table_alias(:b.as(:test
|
|
334
|
-
@ds.unused_table_alias(:b.as('test')).should == :test_0
|
|
335
|
-
@ds.unused_table_alias(:test
|
|
331
|
+
@ds.unused_table_alias(Sequel.qualify(:b, :test)).should == :test_0
|
|
332
|
+
@ds.unused_table_alias(Sequel.expr(:b).as(:test)).should == :test_0
|
|
333
|
+
@ds.unused_table_alias(Sequel.expr(:b).as(Sequel.identifier(:test))).should == :test_0
|
|
334
|
+
@ds.unused_table_alias(Sequel.expr(:b).as('test')).should == :test_0
|
|
335
|
+
@ds.unused_table_alias(Sequel.identifier(:test)).should == :test_0
|
|
336
336
|
end
|
|
337
337
|
end
|
|
338
338
|
|
|
339
339
|
describe "Dataset#exists" do
|
|
340
340
|
before do
|
|
341
341
|
@ds1 = Sequel::Dataset.new(nil).from(:test)
|
|
342
|
-
@ds2 = @ds1.filter(:price
|
|
343
|
-
@ds3 = @ds1.filter(:price
|
|
342
|
+
@ds2 = @ds1.filter(Sequel.expr(:price) < 100)
|
|
343
|
+
@ds3 = @ds1.filter(Sequel.expr(:price) > 50)
|
|
344
344
|
end
|
|
345
345
|
|
|
346
346
|
specify "should work in filters" do
|
|
@@ -380,8 +380,7 @@ describe "Dataset#where" do
|
|
|
380
380
|
end
|
|
381
381
|
|
|
382
382
|
specify "should work with a string with placeholders and arguments for those placeholders" do
|
|
383
|
-
@dataset.where('price < ? AND id in ?', 100, [1, 2, 3]).select_sql.should ==
|
|
384
|
-
"SELECT * FROM test WHERE (price < 100 AND id in (1, 2, 3))"
|
|
383
|
+
@dataset.where('price < ? AND id in ?', 100, [1, 2, 3]).select_sql.should == "SELECT * FROM test WHERE (price < 100 AND id in (1, 2, 3))"
|
|
385
384
|
end
|
|
386
385
|
|
|
387
386
|
specify "should not modify passed array with placeholders" do
|
|
@@ -409,13 +408,11 @@ describe "Dataset#where" do
|
|
|
409
408
|
end
|
|
410
409
|
|
|
411
410
|
specify "should not replace named placeholders that don't exist in the hash" do
|
|
412
|
-
@dataset.where('price < :price AND id in :ids', :price=>100).select_sql.should ==
|
|
413
|
-
"SELECT * FROM test WHERE (price < 100 AND id in :ids)"
|
|
411
|
+
@dataset.where('price < :price AND id in :ids', :price=>100).select_sql.should == "SELECT * FROM test WHERE (price < 100 AND id in :ids)"
|
|
414
412
|
end
|
|
415
413
|
|
|
416
414
|
specify "should handle partial names" do
|
|
417
|
-
@dataset.where('price < :price AND id = :p', :p=>2, :price=>100).select_sql.should ==
|
|
418
|
-
"SELECT * FROM test WHERE (price < 100 AND id = 2)"
|
|
415
|
+
@dataset.where('price < :price AND id = :p', :p=>2, :price=>100).select_sql.should == "SELECT * FROM test WHERE (price < 100 AND id = 2)"
|
|
419
416
|
end
|
|
420
417
|
|
|
421
418
|
specify "should affect select, delete and update statements" do
|
|
@@ -435,69 +432,52 @@ describe "Dataset#where" do
|
|
|
435
432
|
|
|
436
433
|
specify "should be composable using AND operator (for scoping)" do
|
|
437
434
|
# hashes are merged, no problem
|
|
438
|
-
@d1.where(:size => 'big').select_sql.should ==
|
|
439
|
-
"SELECT * FROM test WHERE ((region = 'Asia') AND (size = 'big'))"
|
|
435
|
+
@d1.where(:size => 'big').select_sql.should == "SELECT * FROM test WHERE ((region = 'Asia') AND (size = 'big'))"
|
|
440
436
|
|
|
441
437
|
# hash and string
|
|
442
|
-
@d1.where('population > 1000').select_sql.should ==
|
|
443
|
-
|
|
444
|
-
@d1.where('(a > 1) OR (b < 2)').select_sql.should ==
|
|
445
|
-
"SELECT * FROM test WHERE ((region = 'Asia') AND ((a > 1) OR (b < 2)))"
|
|
438
|
+
@d1.where('population > 1000').select_sql.should == "SELECT * FROM test WHERE ((region = 'Asia') AND (population > 1000))"
|
|
439
|
+
@d1.where('(a > 1) OR (b < 2)').select_sql.should == "SELECT * FROM test WHERE ((region = 'Asia') AND ((a > 1) OR (b < 2)))"
|
|
446
440
|
|
|
447
441
|
# hash and array
|
|
448
|
-
@d1.where('GDP > ?', 1000).select_sql.should ==
|
|
449
|
-
"SELECT * FROM test WHERE ((region = 'Asia') AND (GDP > 1000))"
|
|
442
|
+
@d1.where('GDP > ?', 1000).select_sql.should == "SELECT * FROM test WHERE ((region = 'Asia') AND (GDP > 1000))"
|
|
450
443
|
|
|
451
444
|
# array and array
|
|
452
|
-
@d2.where('GDP > ?', 1000).select_sql.should ==
|
|
453
|
-
"SELECT * FROM test WHERE ((region = 'Asia') AND (GDP > 1000))"
|
|
445
|
+
@d2.where('GDP > ?', 1000).select_sql.should == "SELECT * FROM test WHERE ((region = 'Asia') AND (GDP > 1000))"
|
|
454
446
|
|
|
455
447
|
# array and hash
|
|
456
|
-
@d2.where(:name => ['Japan', 'China']).select_sql.should ==
|
|
457
|
-
"SELECT * FROM test WHERE ((region = 'Asia') AND (name IN ('Japan', 'China')))"
|
|
448
|
+
@d2.where(:name => ['Japan', 'China']).select_sql.should == "SELECT * FROM test WHERE ((region = 'Asia') AND (name IN ('Japan', 'China')))"
|
|
458
449
|
|
|
459
450
|
# array and string
|
|
460
|
-
@d2.where('GDP > ?').select_sql.should ==
|
|
461
|
-
"SELECT * FROM test WHERE ((region = 'Asia') AND (GDP > ?))"
|
|
451
|
+
@d2.where('GDP > ?').select_sql.should == "SELECT * FROM test WHERE ((region = 'Asia') AND (GDP > ?))"
|
|
462
452
|
|
|
463
453
|
# string and string
|
|
464
|
-
@d3.where('b = 2').select_sql.should ==
|
|
465
|
-
"SELECT * FROM test WHERE ((a = 1) AND (b = 2))"
|
|
454
|
+
@d3.where('b = 2').select_sql.should == "SELECT * FROM test WHERE ((a = 1) AND (b = 2))"
|
|
466
455
|
|
|
467
456
|
# string and hash
|
|
468
|
-
@d3.where(:c => 3).select_sql.should ==
|
|
469
|
-
"SELECT * FROM test WHERE ((a = 1) AND (c = 3))"
|
|
457
|
+
@d3.where(:c => 3).select_sql.should == "SELECT * FROM test WHERE ((a = 1) AND (c = 3))"
|
|
470
458
|
|
|
471
459
|
# string and array
|
|
472
|
-
@d3.where('d = ?', 4).select_sql.should ==
|
|
473
|
-
"SELECT * FROM test WHERE ((a = 1) AND (d = 4))"
|
|
460
|
+
@d3.where('d = ?', 4).select_sql.should == "SELECT * FROM test WHERE ((a = 1) AND (d = 4))"
|
|
474
461
|
end
|
|
475
462
|
|
|
476
463
|
specify "should be composable using AND operator (for scoping) with block" do
|
|
477
|
-
@d3.where{
|
|
478
|
-
"SELECT * FROM test WHERE ((a = 1) AND (e < 5))"
|
|
464
|
+
@d3.where{e < 5}.select_sql.should == "SELECT * FROM test WHERE ((a = 1) AND (e < 5))"
|
|
479
465
|
end
|
|
480
466
|
|
|
481
467
|
specify "should accept ranges" do
|
|
482
|
-
@dataset.filter(:id => 4..7).sql.should ==
|
|
483
|
-
|
|
484
|
-
@dataset.filter(:id => 4...7).sql.should ==
|
|
485
|
-
'SELECT * FROM test WHERE ((id >= 4) AND (id < 7))'
|
|
468
|
+
@dataset.filter(:id => 4..7).sql.should == 'SELECT * FROM test WHERE ((id >= 4) AND (id <= 7))'
|
|
469
|
+
@dataset.filter(:id => 4...7).sql.should == 'SELECT * FROM test WHERE ((id >= 4) AND (id < 7))'
|
|
486
470
|
|
|
487
|
-
@dataset.filter(:table__id => 4..7).sql.should ==
|
|
488
|
-
|
|
489
|
-
@dataset.filter(:table__id => 4...7).sql.should ==
|
|
490
|
-
'SELECT * FROM test WHERE ((table.id >= 4) AND (table.id < 7))'
|
|
471
|
+
@dataset.filter(:table__id => 4..7).sql.should == 'SELECT * FROM test WHERE ((table.id >= 4) AND (table.id <= 7))'
|
|
472
|
+
@dataset.filter(:table__id => 4...7).sql.should == 'SELECT * FROM test WHERE ((table.id >= 4) AND (table.id < 7))'
|
|
491
473
|
end
|
|
492
474
|
|
|
493
475
|
specify "should accept nil" do
|
|
494
|
-
@dataset.filter(:owner_id => nil).sql.should ==
|
|
495
|
-
'SELECT * FROM test WHERE (owner_id IS NULL)'
|
|
476
|
+
@dataset.filter(:owner_id => nil).sql.should == 'SELECT * FROM test WHERE (owner_id IS NULL)'
|
|
496
477
|
end
|
|
497
478
|
|
|
498
479
|
specify "should accept a subquery" do
|
|
499
|
-
@dataset.filter('gdp > ?', @d1.select(
|
|
500
|
-
"SELECT * FROM test WHERE (gdp > (SELECT avg(gdp) FROM test WHERE (region = 'Asia')))"
|
|
480
|
+
@dataset.filter('gdp > ?', @d1.select(Sequel.function(:avg, :gdp))).sql.should == "SELECT * FROM test WHERE (gdp > (SELECT avg(gdp) FROM test WHERE (region = 'Asia')))"
|
|
501
481
|
end
|
|
502
482
|
|
|
503
483
|
specify "should handle all types of IN/NOT IN queries with empty arrays" do
|
|
@@ -523,20 +503,22 @@ describe "Dataset#where" do
|
|
|
523
503
|
@dataset.filter(:id => @d1.select(:id)).sql.should == "SELECT * FROM test WHERE (id IN (SELECT id FROM test WHERE (region = 'Asia')))"
|
|
524
504
|
@dataset.filter(:id => [1, 2]).sql.should == "SELECT * FROM test WHERE (id IN (1, 2))"
|
|
525
505
|
@dataset.filter([:id1, :id2] => @d1.select(:id1, :id2)).sql.should == "SELECT * FROM test WHERE ((id1, id2) IN (SELECT id1, id2 FROM test WHERE (region = 'Asia')))"
|
|
526
|
-
@dataset.filter([:id1, :id2] => [[1, 2], [3,4]]
|
|
506
|
+
@dataset.filter([:id1, :id2] => Sequel.value_list([[1, 2], [3,4]])).sql.should == "SELECT * FROM test WHERE ((id1, id2) IN ((1, 2), (3, 4)))"
|
|
527
507
|
@dataset.filter([:id1, :id2] => [[1, 2], [3,4]]).sql.should == "SELECT * FROM test WHERE ((id1, id2) IN ((1, 2), (3, 4)))"
|
|
528
508
|
|
|
529
509
|
@dataset.exclude(:id => @d1.select(:id)).sql.should == "SELECT * FROM test WHERE (id NOT IN (SELECT id FROM test WHERE (region = 'Asia')))"
|
|
530
510
|
@dataset.exclude(:id => [1, 2]).sql.should == "SELECT * FROM test WHERE (id NOT IN (1, 2))"
|
|
531
511
|
@dataset.exclude([:id1, :id2] => @d1.select(:id1, :id2)).sql.should == "SELECT * FROM test WHERE ((id1, id2) NOT IN (SELECT id1, id2 FROM test WHERE (region = 'Asia')))"
|
|
532
|
-
@dataset.exclude([:id1, :id2] => [[1, 2], [3,4]]
|
|
512
|
+
@dataset.exclude([:id1, :id2] => Sequel.value_list([[1, 2], [3,4]])).sql.should == "SELECT * FROM test WHERE ((id1, id2) NOT IN ((1, 2), (3, 4)))"
|
|
533
513
|
@dataset.exclude([:id1, :id2] => [[1, 2], [3,4]]).sql.should == "SELECT * FROM test WHERE ((id1, id2) NOT IN ((1, 2), (3, 4)))"
|
|
534
514
|
end
|
|
535
515
|
|
|
536
516
|
specify "should handle IN/NOT IN queries with multiple columns and an array where the database doesn't support it" do
|
|
537
517
|
@dataset.meta_def(:supports_multiple_column_in?){false}
|
|
538
|
-
@dataset.filter([:id1, :id2] => [[1, 2], [3,4]]
|
|
539
|
-
@dataset.exclude([:id1, :id2] => [[1, 2], [3,4]]
|
|
518
|
+
@dataset.filter([:id1, :id2] => [[1, 2], [3,4]]).sql.should == "SELECT * FROM test WHERE (((id1 = 1) AND (id2 = 2)) OR ((id1 = 3) AND (id2 = 4)))"
|
|
519
|
+
@dataset.exclude([:id1, :id2] => [[1, 2], [3,4]]).sql.should == "SELECT * FROM test WHERE (((id1 != 1) OR (id2 != 2)) AND ((id1 != 3) OR (id2 != 4)))"
|
|
520
|
+
@dataset.filter([:id1, :id2] => Sequel.value_list([[1, 2], [3,4]])).sql.should == "SELECT * FROM test WHERE (((id1 = 1) AND (id2 = 2)) OR ((id1 = 3) AND (id2 = 4)))"
|
|
521
|
+
@dataset.exclude([:id1, :id2] => Sequel.value_list([[1, 2], [3,4]])).sql.should == "SELECT * FROM test WHERE (((id1 != 1) OR (id2 != 2)) AND ((id1 != 3) OR (id2 != 4)))"
|
|
540
522
|
end
|
|
541
523
|
|
|
542
524
|
specify "should handle IN/NOT IN queries with multiple columns and a dataset where the database doesn't support it" do
|
|
@@ -586,35 +568,21 @@ describe "Dataset#where" do
|
|
|
586
568
|
end
|
|
587
569
|
|
|
588
570
|
specify "should accept a subquery for an EXISTS clause" do
|
|
589
|
-
a = @dataset.filter(:price
|
|
590
|
-
@dataset.filter(a.exists).sql.should ==
|
|
591
|
-
'SELECT * FROM test WHERE (EXISTS (SELECT * FROM test WHERE (price < 100)))'
|
|
571
|
+
a = @dataset.filter(Sequel.expr(:price) < 100)
|
|
572
|
+
@dataset.filter(a.exists).sql.should == 'SELECT * FROM test WHERE (EXISTS (SELECT * FROM test WHERE (price < 100)))'
|
|
592
573
|
end
|
|
593
574
|
|
|
594
575
|
specify "should accept proc expressions" do
|
|
595
|
-
d = @d1.select(
|
|
596
|
-
@dataset.filter
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
@dataset.filter
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
@dataset.filter {(:a.sql_number >= 1) & (:b.sql_number <= 2)}.sql.should ==
|
|
603
|
-
'SELECT * FROM test WHERE ((a >= 1) AND (b <= 2))'
|
|
604
|
-
|
|
605
|
-
@dataset.filter {:c.like 'ABC%'}.sql.should ==
|
|
606
|
-
"SELECT * FROM test WHERE (c LIKE 'ABC%')"
|
|
607
|
-
|
|
608
|
-
@dataset.filter {:c.like 'ABC%'}.sql.should ==
|
|
609
|
-
"SELECT * FROM test WHERE (c LIKE 'ABC%')"
|
|
610
|
-
|
|
611
|
-
@dataset.filter {:c.like 'ABC%', '%XYZ'}.sql.should ==
|
|
612
|
-
"SELECT * FROM test WHERE ((c LIKE 'ABC%') OR (c LIKE '%XYZ'))"
|
|
576
|
+
d = @d1.select(Sequel.function(:avg, :gdp))
|
|
577
|
+
@dataset.filter{gdp > d}.sql.should == "SELECT * FROM test WHERE (gdp > (SELECT avg(gdp) FROM test WHERE (region = 'Asia')))"
|
|
578
|
+
@dataset.filter{a < 1}.sql.should == 'SELECT * FROM test WHERE (a < 1)'
|
|
579
|
+
@dataset.filter{(a >= 1) & (b <= 2)}.sql.should == 'SELECT * FROM test WHERE ((a >= 1) AND (b <= 2))'
|
|
580
|
+
@dataset.filter{c.like 'ABC%'}.sql.should == "SELECT * FROM test WHERE (c LIKE 'ABC%')"
|
|
581
|
+
@dataset.filter{c.like 'ABC%', '%XYZ'}.sql.should == "SELECT * FROM test WHERE ((c LIKE 'ABC%') OR (c LIKE '%XYZ'))"
|
|
613
582
|
end
|
|
614
583
|
|
|
615
584
|
specify "should work for grouped datasets" do
|
|
616
|
-
@dataset.group(:a).filter(:b => 1).sql.should ==
|
|
617
|
-
'SELECT * FROM test WHERE (b = 1) GROUP BY a'
|
|
585
|
+
@dataset.group(:a).filter(:b => 1).sql.should == 'SELECT * FROM test WHERE (b = 1) GROUP BY a'
|
|
618
586
|
end
|
|
619
587
|
|
|
620
588
|
specify "should accept true and false as arguments" do
|
|
@@ -633,17 +601,13 @@ describe "Dataset#where" do
|
|
|
633
601
|
end
|
|
634
602
|
|
|
635
603
|
specify "should allow the use of multiple arguments" do
|
|
636
|
-
@dataset.filter(:a, :b).sql.should ==
|
|
637
|
-
|
|
638
|
-
@dataset.filter(:a, :b=>1).sql.should ==
|
|
639
|
-
'SELECT * FROM test WHERE (a AND (b = 1))'
|
|
640
|
-
@dataset.filter(:a, :c.sql_number > 3, :b=>1).sql.should ==
|
|
641
|
-
'SELECT * FROM test WHERE (a AND (c > 3) AND (b = 1))'
|
|
604
|
+
@dataset.filter(:a, :b).sql.should == 'SELECT * FROM test WHERE (a AND b)'
|
|
605
|
+
@dataset.filter(:a, :b=>1).sql.should == 'SELECT * FROM test WHERE (a AND (b = 1))'
|
|
606
|
+
@dataset.filter(:a, Sequel.expr(:c) > 3, :b=>1).sql.should == 'SELECT * FROM test WHERE (a AND (c > 3) AND (b = 1))'
|
|
642
607
|
end
|
|
643
608
|
|
|
644
609
|
specify "should allow the use of blocks and arguments simultaneously" do
|
|
645
|
-
@dataset.filter(:zz
|
|
646
|
-
'SELECT * FROM test WHERE ((zz < 3) AND (yy > 3))'
|
|
610
|
+
@dataset.filter(Sequel.expr(:zz) < 3){yy > 3}.sql.should == 'SELECT * FROM test WHERE ((zz < 3) AND (yy > 3))'
|
|
647
611
|
end
|
|
648
612
|
|
|
649
613
|
specify "should yield a VirtualRow to the block" do
|
|
@@ -667,8 +631,8 @@ describe "Dataset#where" do
|
|
|
667
631
|
end
|
|
668
632
|
|
|
669
633
|
specify "should raise an error if a NumericExpression or StringExpression is used" do
|
|
670
|
-
proc{@dataset.filter(:x + 1)}.should raise_error(Sequel::Error)
|
|
671
|
-
proc{@dataset.filter(:x.sql_string)}.should raise_error(Sequel::Error)
|
|
634
|
+
proc{@dataset.filter(Sequel.expr(:x) + 1)}.should raise_error(Sequel::Error)
|
|
635
|
+
proc{@dataset.filter(Sequel.expr(:x).sql_string)}.should raise_error(Sequel::Error)
|
|
672
636
|
end
|
|
673
637
|
end
|
|
674
638
|
|
|
@@ -688,11 +652,11 @@ describe "Dataset#or" do
|
|
|
688
652
|
|
|
689
653
|
specify "should accept all forms of filters" do
|
|
690
654
|
@d1.or('y > ?', 2).sql.should == 'SELECT * FROM test WHERE ((x = 1) OR (y > 2))'
|
|
691
|
-
@d1.or(:yy
|
|
655
|
+
@d1.or(Sequel.expr(:yy) > 3).sql.should == 'SELECT * FROM test WHERE ((x = 1) OR (yy > 3))'
|
|
692
656
|
end
|
|
693
657
|
|
|
694
658
|
specify "should accept blocks passed to filter" do
|
|
695
|
-
@d1.or{
|
|
659
|
+
@d1.or{yy > 3}.sql.should == 'SELECT * FROM test WHERE ((x = 1) OR (yy > 3))'
|
|
696
660
|
end
|
|
697
661
|
|
|
698
662
|
specify "should correctly add parens to give predictable results" do
|
|
@@ -701,7 +665,7 @@ describe "Dataset#or" do
|
|
|
701
665
|
end
|
|
702
666
|
|
|
703
667
|
specify "should allow the use of blocks and arguments simultaneously" do
|
|
704
|
-
@d1.or(:zz
|
|
668
|
+
@d1.or(Sequel.expr(:zz) < 3){yy > 3}.sql.should == 'SELECT * FROM test WHERE ((x = 1) OR ((zz < 3) AND (yy > 3)))'
|
|
705
669
|
end
|
|
706
670
|
end
|
|
707
671
|
|
|
@@ -723,11 +687,11 @@ describe "Dataset#and" do
|
|
|
723
687
|
|
|
724
688
|
specify "should accept different types of filters" do
|
|
725
689
|
@d1.and('y > ?', 2).sql.should == 'SELECT * FROM test WHERE ((x = 1) AND (y > 2))'
|
|
726
|
-
@d1.and(:yy
|
|
690
|
+
@d1.and(Sequel.expr(:yy) > 3).sql.should == 'SELECT * FROM test WHERE ((x = 1) AND (yy > 3))'
|
|
727
691
|
end
|
|
728
692
|
|
|
729
693
|
specify "should accept blocks passed to filter" do
|
|
730
|
-
@d1.and
|
|
694
|
+
@d1.and{yy > 3}.sql.should == 'SELECT * FROM test WHERE ((x = 1) AND (yy > 3))'
|
|
731
695
|
end
|
|
732
696
|
|
|
733
697
|
specify "should correctly add parens to give predictable results" do
|
|
@@ -768,12 +732,12 @@ describe "Dataset#exclude" do
|
|
|
768
732
|
end
|
|
769
733
|
|
|
770
734
|
specify "should support proc expressions" do
|
|
771
|
-
@dataset.exclude{
|
|
735
|
+
@dataset.exclude{id < 6}.sql.should == 'SELECT * FROM test WHERE (id >= 6)'
|
|
772
736
|
end
|
|
773
737
|
|
|
774
738
|
specify "should allow the use of blocks and arguments simultaneously" do
|
|
775
|
-
@dataset.exclude(:id => (7..11)){
|
|
776
|
-
@dataset.exclude([:id, 1], [:x, 3]){
|
|
739
|
+
@dataset.exclude(:id => (7..11)){id < 6}.sql.should == 'SELECT * FROM test WHERE ((id < 7) OR (id > 11) OR (id >= 6))'
|
|
740
|
+
@dataset.exclude([:id, 1], [:x, 3]){id < 6}.sql.should == 'SELECT * FROM test WHERE ((id != 1) OR (x != 3) OR (id >= 6))'
|
|
777
741
|
end
|
|
778
742
|
end
|
|
779
743
|
|
|
@@ -820,7 +784,7 @@ end
|
|
|
820
784
|
describe "Dataset#having" do
|
|
821
785
|
before do
|
|
822
786
|
@dataset = Sequel::Dataset.new(nil).from(:test)
|
|
823
|
-
@grouped = @dataset.group(:region).select(:region,
|
|
787
|
+
@grouped = @dataset.group(:region).select(:region, Sequel.function(:sum, :population), Sequel.function(:avg, :gdp))
|
|
824
788
|
end
|
|
825
789
|
|
|
826
790
|
specify "should just clone if given an empty argument" do
|
|
@@ -834,11 +798,11 @@ describe "Dataset#having" do
|
|
|
834
798
|
end
|
|
835
799
|
|
|
836
800
|
specify "should support proc expressions" do
|
|
837
|
-
@grouped.having
|
|
801
|
+
@grouped.having{Sequel.function(:sum, :population) > 10}.sql.should == "SELECT region, sum(population), avg(gdp) FROM test GROUP BY region HAVING (sum(population) > 10)"
|
|
838
802
|
end
|
|
839
803
|
|
|
840
804
|
specify "should work with and on the having clause" do
|
|
841
|
-
@grouped.having(
|
|
805
|
+
@grouped.having(Sequel.expr(:a) > 1).and(Sequel.expr(:b) < 2).sql.should == "SELECT region, sum(population), avg(gdp) FROM test GROUP BY region HAVING ((a > 1) AND (b < 2))"
|
|
842
806
|
end
|
|
843
807
|
end
|
|
844
808
|
|
|
@@ -998,7 +962,7 @@ describe "Dataset#literal" do
|
|
|
998
962
|
end
|
|
999
963
|
|
|
1000
964
|
specify "should escape blobs as strings by default" do
|
|
1001
|
-
@dataset.literal('abc'
|
|
965
|
+
@dataset.literal(Sequel.blob('abc')).should == "'abc'"
|
|
1002
966
|
end
|
|
1003
967
|
|
|
1004
968
|
specify "should literalize numbers properly" do
|
|
@@ -1141,8 +1105,8 @@ describe "Dataset#literal" do
|
|
|
1141
1105
|
|
|
1142
1106
|
specify "should not modify literal strings" do
|
|
1143
1107
|
@dataset.quote_identifiers = true
|
|
1144
|
-
@dataset.literal('col1 + 2'
|
|
1145
|
-
@dataset.update_sql(Sequel::SQL::Identifier.new('a'
|
|
1108
|
+
@dataset.literal(Sequel.lit('col1 + 2')).should == 'col1 + 2'
|
|
1109
|
+
@dataset.update_sql(Sequel::SQL::Identifier.new(Sequel.lit('a')) => Sequel.lit('a + 2')).should == 'UPDATE "test" SET a = a + 2'
|
|
1146
1110
|
end
|
|
1147
1111
|
|
|
1148
1112
|
specify "should literalize BigDecimal instances correctly" do
|
|
@@ -1206,8 +1170,8 @@ describe "Dataset#from" do
|
|
|
1206
1170
|
|
|
1207
1171
|
specify "should not treat literal strings or blobs as identifiers" do
|
|
1208
1172
|
@dataset.quote_identifiers = true
|
|
1209
|
-
@dataset.from('a'
|
|
1210
|
-
@dataset.from('a'
|
|
1173
|
+
@dataset.from(Sequel.lit('a')).select_sql.should == "SELECT * FROM a"
|
|
1174
|
+
@dataset.from(Sequel.blob('a')).select_sql.should == "SELECT * FROM 'a'"
|
|
1211
1175
|
end
|
|
1212
1176
|
|
|
1213
1177
|
specify "should remove all FROM tables if called with no arguments" do
|
|
@@ -1215,8 +1179,8 @@ describe "Dataset#from" do
|
|
|
1215
1179
|
end
|
|
1216
1180
|
|
|
1217
1181
|
specify "should accept sql functions" do
|
|
1218
|
-
@dataset.from(
|
|
1219
|
-
@dataset.from(
|
|
1182
|
+
@dataset.from(Sequel.function(:abc, :def)).select_sql.should == "SELECT * FROM abc(def)"
|
|
1183
|
+
@dataset.from(Sequel.function(:a, :i)).select_sql.should == "SELECT * FROM a(i)"
|
|
1220
1184
|
end
|
|
1221
1185
|
|
|
1222
1186
|
specify "should accept :schema__table___alias symbol format" do
|
|
@@ -1254,19 +1218,19 @@ describe "Dataset#select" do
|
|
|
1254
1218
|
end
|
|
1255
1219
|
|
|
1256
1220
|
specify "should accept symbols and literal strings" do
|
|
1257
|
-
@d.select('aaa'
|
|
1258
|
-
@d.select(:a, 'b'
|
|
1259
|
-
@d.select(:test__cc, 'test.d AS e'
|
|
1260
|
-
@d.select('test.d AS e'
|
|
1221
|
+
@d.select(Sequel.lit('aaa')).sql.should == 'SELECT aaa FROM test'
|
|
1222
|
+
@d.select(:a, Sequel.lit('b')).sql.should == 'SELECT a, b FROM test'
|
|
1223
|
+
@d.select(:test__cc, Sequel.lit('test.d AS e')).sql.should == 'SELECT test.cc, test.d AS e FROM test'
|
|
1224
|
+
@d.select(Sequel.lit('test.d AS e'), :test__cc).sql.should == 'SELECT test.d AS e, test.cc FROM test'
|
|
1261
1225
|
@d.select(:test__name___n).sql.should == 'SELECT test.name AS n FROM test'
|
|
1262
1226
|
end
|
|
1263
1227
|
|
|
1264
1228
|
specify "should accept ColumnAlls" do
|
|
1265
|
-
@d.select(:test
|
|
1229
|
+
@d.select(Sequel::SQL::ColumnAll.new(:test)).sql.should == 'SELECT test.* FROM test'
|
|
1266
1230
|
end
|
|
1267
1231
|
|
|
1268
1232
|
specify "should accept QualifiedIdentifiers" do
|
|
1269
|
-
@d.select(:test__name.as(:n)).sql.should == 'SELECT test.name AS n FROM test'
|
|
1233
|
+
@d.select(Sequel.expr(:test__name).as(:n)).sql.should == 'SELECT test.name AS n FROM test'
|
|
1270
1234
|
end
|
|
1271
1235
|
|
|
1272
1236
|
specify "should use the wildcard if no arguments are given" do
|
|
@@ -1288,7 +1252,7 @@ describe "Dataset#select" do
|
|
|
1288
1252
|
|
|
1289
1253
|
specify "should accept arbitrary objects and literalize them correctly" do
|
|
1290
1254
|
@d.select(1, :a, 't').sql.should == "SELECT 1, a, 't' FROM test"
|
|
1291
|
-
@d.select(nil,
|
|
1255
|
+
@d.select(nil, Sequel.function(:sum, :t), :x___y).sql.should == "SELECT NULL, sum(t), x AS y FROM test"
|
|
1292
1256
|
@d.select(nil, 1, :x => :y).sql.should == "SELECT NULL, 1, x AS y FROM test"
|
|
1293
1257
|
end
|
|
1294
1258
|
|
|
@@ -1359,15 +1323,15 @@ describe "Dataset#select_all" do
|
|
|
1359
1323
|
end
|
|
1360
1324
|
|
|
1361
1325
|
specify "should work correctly with SQL::Identifiers" do
|
|
1362
|
-
@d.select_all(:test
|
|
1326
|
+
@d.select_all(Sequel.identifier(:test)).sql.should == 'SELECT test.* FROM test'
|
|
1363
1327
|
end
|
|
1364
1328
|
|
|
1365
1329
|
specify "should work correctly with SQL::QualifiedIdentifier" do
|
|
1366
|
-
@d.select_all(
|
|
1330
|
+
@d.select_all(Sequel.qualify(:sch, :test)).sql.should == 'SELECT sch.test.* FROM test'
|
|
1367
1331
|
end
|
|
1368
1332
|
|
|
1369
1333
|
specify "should work correctly with SQL::AliasedExpressions" do
|
|
1370
|
-
@d.select_all(:test.as(:al)).sql.should == 'SELECT al.* FROM test'
|
|
1334
|
+
@d.select_all(Sequel.expr(:test).as(:al)).sql.should == 'SELECT al.* FROM test'
|
|
1371
1335
|
end
|
|
1372
1336
|
|
|
1373
1337
|
specify "should work correctly with SQL::JoinClauses" do
|
|
@@ -1389,12 +1353,12 @@ describe "Dataset#select_more" do
|
|
|
1389
1353
|
|
|
1390
1354
|
specify "should add to the currently selected columns" do
|
|
1391
1355
|
@d.select(:a).select_more(:b).sql.should == 'SELECT a, b FROM test'
|
|
1392
|
-
@d.select(:a
|
|
1356
|
+
@d.select(Sequel::SQL::ColumnAll.new(:a)).select_more(Sequel::SQL::ColumnAll.new(:b)).sql.should == 'SELECT a.*, b.* FROM test'
|
|
1393
1357
|
end
|
|
1394
1358
|
|
|
1395
1359
|
specify "should accept a block that yields a virtual row" do
|
|
1396
1360
|
@d.select(:a).select_more{|o| o.b}.sql.should == 'SELECT a, b FROM test'
|
|
1397
|
-
@d.select(:a
|
|
1361
|
+
@d.select(Sequel::SQL::ColumnAll.new(:a)).select_more(Sequel::SQL::ColumnAll.new(:b)){b(1)}.sql.should == 'SELECT a.*, b.*, b(1) FROM test'
|
|
1398
1362
|
end
|
|
1399
1363
|
end
|
|
1400
1364
|
|
|
@@ -1411,12 +1375,12 @@ describe "Dataset#select_append" do
|
|
|
1411
1375
|
|
|
1412
1376
|
specify "should add to the currently selected columns" do
|
|
1413
1377
|
@d.select(:a).select_append(:b).sql.should == 'SELECT a, b FROM test'
|
|
1414
|
-
@d.select(:a
|
|
1378
|
+
@d.select(Sequel::SQL::ColumnAll.new(:a)).select_append(Sequel::SQL::ColumnAll.new(:b)).sql.should == 'SELECT a.*, b.* FROM test'
|
|
1415
1379
|
end
|
|
1416
1380
|
|
|
1417
1381
|
specify "should accept a block that yields a virtual row" do
|
|
1418
1382
|
@d.select(:a).select_append{|o| o.b}.sql.should == 'SELECT a, b FROM test'
|
|
1419
|
-
@d.select(:a
|
|
1383
|
+
@d.select(Sequel::SQL::ColumnAll.new(:a)).select_append(Sequel::SQL::ColumnAll.new(:b)){b(1)}.sql.should == 'SELECT a.*, b.*, b(1) FROM test'
|
|
1420
1384
|
end
|
|
1421
1385
|
|
|
1422
1386
|
specify "should select from all from and join tables if SELECT *, column not supported" do
|
|
@@ -1438,11 +1402,11 @@ describe "Dataset#order" do
|
|
|
1438
1402
|
end
|
|
1439
1403
|
|
|
1440
1404
|
specify "should accept multiple arguments" do
|
|
1441
|
-
@dataset.order(:name, :price
|
|
1405
|
+
@dataset.order(:name, Sequel.desc(:price)).sql.should == 'SELECT * FROM test ORDER BY name, price DESC'
|
|
1442
1406
|
end
|
|
1443
1407
|
|
|
1444
1408
|
specify "should accept :nulls options for asc and desc" do
|
|
1445
|
-
@dataset.order(
|
|
1409
|
+
@dataset.order(Sequel.asc(:name, :nulls=>:last), Sequel.desc(:price, :nulls=>:first)).sql.should == 'SELECT * FROM test ORDER BY name ASC NULLS LAST, price DESC NULLS FIRST'
|
|
1446
1410
|
end
|
|
1447
1411
|
|
|
1448
1412
|
specify "should override a previous ordering" do
|
|
@@ -1450,7 +1414,7 @@ describe "Dataset#order" do
|
|
|
1450
1414
|
end
|
|
1451
1415
|
|
|
1452
1416
|
specify "should accept a literal string" do
|
|
1453
|
-
@dataset.order('dada ASC'
|
|
1417
|
+
@dataset.order(Sequel.lit('dada ASC')).sql.should == 'SELECT * FROM test ORDER BY dada ASC'
|
|
1454
1418
|
end
|
|
1455
1419
|
|
|
1456
1420
|
specify "should accept a hash as an expression" do
|
|
@@ -1539,7 +1503,7 @@ describe "Dataset#order_by" do
|
|
|
1539
1503
|
end
|
|
1540
1504
|
|
|
1541
1505
|
specify "should accept multiple arguments" do
|
|
1542
|
-
@dataset.order_by(:name, :price
|
|
1506
|
+
@dataset.order_by(:name, Sequel.desc(:price)).sql.should == 'SELECT * FROM test ORDER BY name, price DESC'
|
|
1543
1507
|
end
|
|
1544
1508
|
|
|
1545
1509
|
specify "should override a previous ordering" do
|
|
@@ -1547,7 +1511,7 @@ describe "Dataset#order_by" do
|
|
|
1547
1511
|
end
|
|
1548
1512
|
|
|
1549
1513
|
specify "should accept a string" do
|
|
1550
|
-
@dataset.order_by('dada ASC'
|
|
1514
|
+
@dataset.order_by(Sequel.lit('dada ASC')).sql.should == 'SELECT * FROM test ORDER BY dada ASC'
|
|
1551
1515
|
end
|
|
1552
1516
|
|
|
1553
1517
|
specify "should accept a nil to remove ordering" do
|
|
@@ -1566,8 +1530,8 @@ describe "Dataset#order_more and order_append" do
|
|
|
1566
1530
|
end
|
|
1567
1531
|
|
|
1568
1532
|
specify "should add to the end of a previous ordering" do
|
|
1569
|
-
@dataset.order(:name).order_more(:stamp
|
|
1570
|
-
@dataset.order(:name).order_append(:stamp
|
|
1533
|
+
@dataset.order(:name).order_more(Sequel.desc(:stamp)).sql.should == 'SELECT * FROM test ORDER BY name, stamp DESC'
|
|
1534
|
+
@dataset.order(:name).order_append(Sequel.desc(:stamp)).sql.should == 'SELECT * FROM test ORDER BY name, stamp DESC'
|
|
1571
1535
|
end
|
|
1572
1536
|
|
|
1573
1537
|
specify "should accept a block that yields a virtual row" do
|
|
@@ -1588,7 +1552,7 @@ describe "Dataset#order_prepend" do
|
|
|
1588
1552
|
end
|
|
1589
1553
|
|
|
1590
1554
|
specify "should add to the beginning of a previous ordering" do
|
|
1591
|
-
@dataset.order(:name).order_prepend(:stamp
|
|
1555
|
+
@dataset.order(:name).order_prepend(Sequel.desc(:stamp)).sql.should == 'SELECT * FROM test ORDER BY stamp DESC, name'
|
|
1592
1556
|
end
|
|
1593
1557
|
|
|
1594
1558
|
specify "should accept a block that yields a virtual row" do
|
|
@@ -1607,24 +1571,24 @@ describe "Dataset#reverse_order" do
|
|
|
1607
1571
|
end
|
|
1608
1572
|
|
|
1609
1573
|
specify "should invert the order given" do
|
|
1610
|
-
@dataset.reverse_order(:name
|
|
1574
|
+
@dataset.reverse_order(Sequel.desc(:name)).sql.should == 'SELECT * FROM test ORDER BY name ASC'
|
|
1611
1575
|
end
|
|
1612
1576
|
|
|
1613
1577
|
specify "should invert the order for ASC expressions" do
|
|
1614
|
-
@dataset.reverse_order(:name
|
|
1578
|
+
@dataset.reverse_order(Sequel.asc(:name)).sql.should == 'SELECT * FROM test ORDER BY name DESC'
|
|
1615
1579
|
end
|
|
1616
1580
|
|
|
1617
1581
|
specify "should accept multiple arguments" do
|
|
1618
|
-
@dataset.reverse_order(:name, :price
|
|
1582
|
+
@dataset.reverse_order(:name, Sequel.desc(:price)).sql.should == 'SELECT * FROM test ORDER BY name DESC, price ASC'
|
|
1619
1583
|
end
|
|
1620
1584
|
|
|
1621
1585
|
specify "should handles NULLS ordering correctly when reversing" do
|
|
1622
|
-
@dataset.reverse_order(
|
|
1586
|
+
@dataset.reverse_order(Sequel.asc(:name, :nulls=>:first), Sequel.desc(:price, :nulls=>:last)).sql.should == 'SELECT * FROM test ORDER BY name DESC NULLS LAST, price ASC NULLS FIRST'
|
|
1623
1587
|
end
|
|
1624
1588
|
|
|
1625
1589
|
specify "should reverse a previous ordering if no arguments are given" do
|
|
1626
1590
|
@dataset.order(:name).reverse_order.sql.should == 'SELECT * FROM test ORDER BY name DESC'
|
|
1627
|
-
@dataset.order(:clumsy
|
|
1591
|
+
@dataset.order(Sequel.desc(:clumsy), :fool).reverse_order.sql.should == 'SELECT * FROM test ORDER BY clumsy ASC, fool DESC'
|
|
1628
1592
|
end
|
|
1629
1593
|
|
|
1630
1594
|
specify "should return an unordered dataset for a dataset with no order" do
|
|
@@ -1659,11 +1623,11 @@ describe "Dataset#limit" do
|
|
|
1659
1623
|
end
|
|
1660
1624
|
|
|
1661
1625
|
specify "should not convert literal strings to integers" do
|
|
1662
|
-
@dataset.limit('6'.lit
|
|
1626
|
+
@dataset.limit(Sequel.lit('6'), Sequel.lit('a() - 1')).sql.should == 'SELECT * FROM test LIMIT 6 OFFSET a() - 1'
|
|
1663
1627
|
end
|
|
1664
1628
|
|
|
1665
1629
|
specify "should not convert other objects" do
|
|
1666
|
-
@dataset.limit(6, :a
|
|
1630
|
+
@dataset.limit(6, Sequel.function(:a) - 1).sql.should == 'SELECT * FROM test LIMIT 6 OFFSET (a() - 1)'
|
|
1667
1631
|
end
|
|
1668
1632
|
|
|
1669
1633
|
specify "should work with fixed sql datasets" do
|
|
@@ -1707,7 +1671,7 @@ describe "Dataset#qualified_column_name" do
|
|
|
1707
1671
|
specify "should return the literal value if not given a symbol" do
|
|
1708
1672
|
@dataset.literal(@dataset.send(:qualified_column_name, 'ccc__b', :items)).should == "'ccc__b'"
|
|
1709
1673
|
@dataset.literal(@dataset.send(:qualified_column_name, 3, :items)).should == '3'
|
|
1710
|
-
@dataset.literal(@dataset.send(:qualified_column_name, 'a'
|
|
1674
|
+
@dataset.literal(@dataset.send(:qualified_column_name, Sequel.lit('a'), :items)).should == 'a'
|
|
1711
1675
|
end
|
|
1712
1676
|
|
|
1713
1677
|
specify "should qualify the column with the supplied table name if given an unqualified symbol" do
|
|
@@ -1719,7 +1683,7 @@ describe "Dataset#qualified_column_name" do
|
|
|
1719
1683
|
end
|
|
1720
1684
|
|
|
1721
1685
|
specify "should handle an aliased identifier" do
|
|
1722
|
-
@dataset.literal(@dataset.send(:qualified_column_name, :ccc, :items.as(:i))).should == 'i.ccc'
|
|
1686
|
+
@dataset.literal(@dataset.send(:qualified_column_name, :ccc, Sequel.expr(:items).as(:i))).should == 'i.ccc'
|
|
1723
1687
|
end
|
|
1724
1688
|
end
|
|
1725
1689
|
|
|
@@ -1852,7 +1816,7 @@ describe "Dataset#distinct" do
|
|
|
1852
1816
|
specify "should use DISTINCT ON if columns are given and DISTINCT ON is supported" do
|
|
1853
1817
|
@dataset.meta_def(:supports_distinct_on?){true}
|
|
1854
1818
|
@dataset.distinct(:a, :b).sql.should == 'SELECT DISTINCT ON (a, b) name FROM test'
|
|
1855
|
-
@dataset.distinct(
|
|
1819
|
+
@dataset.distinct(Sequel.cast(:stamp, :integer), :node_id=>nil).sql.should == 'SELECT DISTINCT ON (CAST(stamp AS integer), (node_id IS NULL)) name FROM test'
|
|
1856
1820
|
end
|
|
1857
1821
|
|
|
1858
1822
|
specify "should do a subselect for count" do
|
|
@@ -1873,7 +1837,7 @@ describe "Dataset#count" do
|
|
|
1873
1837
|
end
|
|
1874
1838
|
|
|
1875
1839
|
specify "should include the where clause if it's there" do
|
|
1876
|
-
@dataset.filter(:abc
|
|
1840
|
+
@dataset.filter(Sequel.expr(:abc) < 30).count.should == 1
|
|
1877
1841
|
@db.sqls.should == ['SELECT COUNT(*) AS count FROM test WHERE (abc < 30) LIMIT 1']
|
|
1878
1842
|
end
|
|
1879
1843
|
|
|
@@ -1931,16 +1895,16 @@ describe "Dataset#group_and_count" do
|
|
|
1931
1895
|
end
|
|
1932
1896
|
|
|
1933
1897
|
specify "should handle identifiers" do
|
|
1934
|
-
@ds.group_and_count(:name___n
|
|
1898
|
+
@ds.group_and_count(Sequel.identifier(:name___n)).sql.should == "SELECT name___n, count(*) AS count FROM test GROUP BY name___n"
|
|
1935
1899
|
end
|
|
1936
1900
|
|
|
1937
1901
|
specify "should handle literal strings" do
|
|
1938
|
-
@ds.group_and_count("name"
|
|
1902
|
+
@ds.group_and_count(Sequel.lit("name")).sql.should == "SELECT name, count(*) AS count FROM test GROUP BY name"
|
|
1939
1903
|
end
|
|
1940
1904
|
|
|
1941
1905
|
specify "should handle aliased expressions" do
|
|
1942
|
-
@ds.group_and_count(:name.as(:n)).sql.should == "SELECT name AS n, count(*) AS count FROM test GROUP BY name"
|
|
1943
|
-
@ds.group_and_count(:name.
|
|
1906
|
+
@ds.group_and_count(Sequel.expr(:name).as(:n)).sql.should == "SELECT name AS n, count(*) AS count FROM test GROUP BY name"
|
|
1907
|
+
@ds.group_and_count(Sequel.identifier(:name).as(:n)).sql.should == "SELECT name AS n, count(*) AS count FROM test GROUP BY name"
|
|
1944
1908
|
end
|
|
1945
1909
|
|
|
1946
1910
|
specify "should take a virtual row block" do
|
|
@@ -1967,22 +1931,22 @@ describe "Dataset#first_source_alias" do
|
|
|
1967
1931
|
|
|
1968
1932
|
specify "should be the entire first source if not aliased" do
|
|
1969
1933
|
@ds.from(:t).first_source_alias.should == :t
|
|
1970
|
-
@ds.from(:t__a
|
|
1934
|
+
@ds.from(Sequel.identifier(:t__a)).first_source_alias.should == Sequel.identifier(:t__a)
|
|
1971
1935
|
@ds.from(:s__t).first_source_alias.should == :s__t
|
|
1972
|
-
@ds.from(
|
|
1936
|
+
@ds.from(Sequel.qualify(:s, :t)).first_source_alias.should == Sequel.qualify(:s, :t)
|
|
1973
1937
|
end
|
|
1974
1938
|
|
|
1975
1939
|
specify "should be the alias if aliased" do
|
|
1976
1940
|
@ds.from(:t___a).first_source_alias.should == :a
|
|
1977
1941
|
@ds.from(:s__t___a).first_source_alias.should == :a
|
|
1978
|
-
@ds.from(:t.as(:a)).first_source_alias.should == :a
|
|
1942
|
+
@ds.from(Sequel.expr(:t).as(:a)).first_source_alias.should == :a
|
|
1979
1943
|
end
|
|
1980
1944
|
|
|
1981
1945
|
specify "should be aliased as first_source" do
|
|
1982
1946
|
@ds.from(:t).first_source.should == :t
|
|
1983
|
-
@ds.from(:t__a
|
|
1947
|
+
@ds.from(Sequel.identifier(:t__a)).first_source.should == Sequel.identifier(:t__a)
|
|
1984
1948
|
@ds.from(:s__t___a).first_source.should == :a
|
|
1985
|
-
@ds.from(:t.as(:a)).first_source.should == :a
|
|
1949
|
+
@ds.from(Sequel.expr(:t).as(:a)).first_source.should == :a
|
|
1986
1950
|
end
|
|
1987
1951
|
|
|
1988
1952
|
specify "should raise exception if table doesn't have a source" do
|
|
@@ -1997,15 +1961,15 @@ describe "Dataset#first_source_table" do
|
|
|
1997
1961
|
|
|
1998
1962
|
specify "should be the entire first source if not aliased" do
|
|
1999
1963
|
@ds.from(:t).first_source_table.should == :t
|
|
2000
|
-
@ds.from(:t__a
|
|
1964
|
+
@ds.from(Sequel.identifier(:t__a)).first_source_table.should == Sequel.identifier(:t__a)
|
|
2001
1965
|
@ds.from(:s__t).first_source_table.should == :s__t
|
|
2002
|
-
@ds.from(
|
|
1966
|
+
@ds.from(Sequel.qualify(:s, :t)).first_source_table.should == Sequel.qualify(:s, :t)
|
|
2003
1967
|
end
|
|
2004
1968
|
|
|
2005
1969
|
specify "should be the unaliased part if aliased" do
|
|
2006
1970
|
@ds.literal(@ds.from(:t___a).first_source_table).should == "t"
|
|
2007
1971
|
@ds.literal(@ds.from(:s__t___a).first_source_table).should == "s.t"
|
|
2008
|
-
@ds.literal(@ds.from(:t.as(:a)).first_source_table).should == "t"
|
|
1972
|
+
@ds.literal(@ds.from(Sequel.expr(:t).as(:a)).first_source_table).should == "t"
|
|
2009
1973
|
end
|
|
2010
1974
|
|
|
2011
1975
|
specify "should raise exception if table doesn't have a source" do
|
|
@@ -2064,7 +2028,7 @@ describe "Dataset#join_table" do
|
|
|
2064
2028
|
end
|
|
2065
2029
|
|
|
2066
2030
|
specify "should include WHERE clause if applicable" do
|
|
2067
|
-
@d.filter(:price
|
|
2031
|
+
@d.filter(Sequel.expr(:price) < 100).join_table(:right_outer, :categories, :category_id => :id).sql.should ==
|
|
2068
2032
|
'SELECT * FROM "items" RIGHT OUTER JOIN "categories" ON ("categories"."category_id" = "items"."id") WHERE ("price" < 100)'
|
|
2069
2033
|
end
|
|
2070
2034
|
|
|
@@ -2128,7 +2092,7 @@ describe "Dataset#join_table" do
|
|
|
2128
2092
|
end
|
|
2129
2093
|
|
|
2130
2094
|
specify "should support aliased tables using an implicit alias" do
|
|
2131
|
-
@d.from('stats').join(:players.as(:p), {:id => :player_id}).sql.should == 'SELECT * FROM "stats" INNER JOIN "players" AS "p" ON ("p"."id" = "stats"."player_id")'
|
|
2095
|
+
@d.from('stats').join(Sequel.expr(:players).as(:p), {:id => :player_id}).sql.should == 'SELECT * FROM "stats" INNER JOIN "players" AS "p" ON ("p"."id" = "stats"."player_id")'
|
|
2132
2096
|
end
|
|
2133
2097
|
|
|
2134
2098
|
specify "should support using an alias for the FROM when doing the first join with unqualified condition columns" do
|
|
@@ -2145,7 +2109,7 @@ describe "Dataset#join_table" do
|
|
|
2145
2109
|
end
|
|
2146
2110
|
|
|
2147
2111
|
specify "should support AliasedExpressions" do
|
|
2148
|
-
@d.from(:s.as(:t)).join(:u.as(:v), {:id => :player_id}).sql.should == 'SELECT * FROM "s" AS "t" INNER JOIN "u" AS "v" ON ("v"."id" = "t"."player_id")'
|
|
2112
|
+
@d.from(Sequel.expr(:s).as(:t)).join(Sequel.expr(:u).as(:v), {:id => :player_id}).sql.should == 'SELECT * FROM "s" AS "t" INNER JOIN "u" AS "v" ON ("v"."id" = "t"."player_id")'
|
|
2149
2113
|
end
|
|
2150
2114
|
|
|
2151
2115
|
specify "should support the :implicit_qualifier option" do
|
|
@@ -2163,7 +2127,7 @@ describe "Dataset#join_table" do
|
|
|
2163
2127
|
specify "should allow for arbitrary conditions in the JOIN clause" do
|
|
2164
2128
|
@d.join_table(:left_outer, :categories, :status => 0).sql.should == 'SELECT * FROM "items" LEFT OUTER JOIN "categories" ON ("categories"."status" = 0)'
|
|
2165
2129
|
@d.join_table(:left_outer, :categories, :categorizable_type => "Post").sql.should == 'SELECT * FROM "items" LEFT OUTER JOIN "categories" ON ("categories"."categorizable_type" = \'Post\')'
|
|
2166
|
-
@d.join_table(:left_outer, :categories, :timestamp =>
|
|
2130
|
+
@d.join_table(:left_outer, :categories, :timestamp => Sequel::CURRENT_TIMESTAMP).sql.should == 'SELECT * FROM "items" LEFT OUTER JOIN "categories" ON ("categories"."timestamp" = CURRENT_TIMESTAMP)'
|
|
2167
2131
|
@d.join_table(:left_outer, :categories, :status => [1, 2, 3]).sql.should == 'SELECT * FROM "items" LEFT OUTER JOIN "categories" ON ("categories"."status" IN (1, 2, 3))'
|
|
2168
2132
|
end
|
|
2169
2133
|
|
|
@@ -2210,7 +2174,7 @@ describe "Dataset#join_table" do
|
|
|
2210
2174
|
end
|
|
2211
2175
|
|
|
2212
2176
|
specify "should support using an expression as the join condition" do
|
|
2213
|
-
@d.join(:categories, :number
|
|
2177
|
+
@d.join(:categories, Sequel.expr(:number) > 10).sql.should == 'SELECT * FROM "items" INNER JOIN "categories" ON ("number" > 10)'
|
|
2214
2178
|
end
|
|
2215
2179
|
|
|
2216
2180
|
specify "should support natural and cross joins" do
|
|
@@ -2289,18 +2253,18 @@ describe "Dataset#join_table" do
|
|
|
2289
2253
|
end
|
|
2290
2254
|
|
|
2291
2255
|
specify "should use the block result as the only condition if no condition is given" do
|
|
2292
|
-
@d.join(:categories){|j,lj,js| {
|
|
2293
|
-
@d.join(:categories){|j,lj,js|
|
|
2256
|
+
@d.join(:categories){|j,lj,js| {Sequel.qualify(j, :b)=>Sequel.qualify(lj, :c)}}.sql.should == 'SELECT * FROM "items" INNER JOIN "categories" ON ("categories"."b" = "items"."c")'
|
|
2257
|
+
@d.join(:categories){|j,lj,js| Sequel.qualify(j, :b) > Sequel.qualify(lj, :c)}.sql.should == 'SELECT * FROM "items" INNER JOIN "categories" ON ("categories"."b" > "items"."c")'
|
|
2294
2258
|
end
|
|
2295
2259
|
|
|
2296
2260
|
specify "should combine the block conditions and argument conditions if both given" do
|
|
2297
|
-
@d.join(:categories, :a=>:d){|j,lj,js| {
|
|
2298
|
-
@d.join(:categories, :a=>:d){|j,lj,js|
|
|
2261
|
+
@d.join(:categories, :a=>:d){|j,lj,js| {Sequel.qualify(j, :b)=>Sequel.qualify(lj, :c)}}.sql.should == 'SELECT * FROM "items" INNER JOIN "categories" ON (("categories"."a" = "items"."d") AND ("categories"."b" = "items"."c"))'
|
|
2262
|
+
@d.join(:categories, :a=>:d){|j,lj,js| Sequel.qualify(j, :b) > Sequel.qualify(lj, :c)}.sql.should == 'SELECT * FROM "items" INNER JOIN "categories" ON (("categories"."a" = "items"."d") AND ("categories"."b" > "items"."c"))'
|
|
2299
2263
|
end
|
|
2300
2264
|
|
|
2301
2265
|
specify "should prefer explicit aliases over implicit" do
|
|
2302
2266
|
@d.from(:items___i).join(:categories___c, {:category_id => :id}, {:table_alias=>:c2, :implicit_qualifier=>:i2}).sql.should == 'SELECT * FROM "items" AS "i" INNER JOIN "categories" AS "c2" ON ("c2"."category_id" = "i2"."id")'
|
|
2303
|
-
@d.from(:items.as(:i)).join(:categories.as(:c), {:category_id => :id}, {:table_alias=>:c2, :implicit_qualifier=>:i2}).sql.should ==
|
|
2267
|
+
@d.from(Sequel.expr(:items).as(:i)).join(Sequel.expr(:categories).as(:c), {:category_id => :id}, {:table_alias=>:c2, :implicit_qualifier=>:i2}).sql.should ==
|
|
2304
2268
|
'SELECT * FROM "items" AS "i" INNER JOIN "categories" AS "c2" ON ("c2"."category_id" = "i2"."id")'
|
|
2305
2269
|
end
|
|
2306
2270
|
|
|
@@ -2313,7 +2277,7 @@ describe "Dataset#join_table" do
|
|
|
2313
2277
|
|
|
2314
2278
|
specify "should raise an error if an invalid option is passed" do
|
|
2315
2279
|
proc{@d.join(:c, [:id], nil)}.should raise_error(Sequel::Error)
|
|
2316
|
-
proc{@d.join(:c, [:id],
|
|
2280
|
+
proc{@d.join(:c, [:id], Sequel.qualify(:d, :c))}.should raise_error(Sequel::Error)
|
|
2317
2281
|
end
|
|
2318
2282
|
end
|
|
2319
2283
|
|
|
@@ -2405,7 +2369,7 @@ describe "Dataset#range" do
|
|
|
2405
2369
|
@ds.range(:stamp)
|
|
2406
2370
|
@db.sqls.should == ["SELECT min(stamp) AS v1, max(stamp) AS v2 FROM test LIMIT 1"]
|
|
2407
2371
|
|
|
2408
|
-
@ds.filter(:price
|
|
2372
|
+
@ds.filter(Sequel.expr(:price) > 100).range(:stamp)
|
|
2409
2373
|
@db.sqls.should == ["SELECT min(stamp) AS v1, max(stamp) AS v2 FROM test WHERE (price > 100) LIMIT 1"]
|
|
2410
2374
|
end
|
|
2411
2375
|
|
|
@@ -2429,7 +2393,7 @@ describe "Dataset#interval" do
|
|
|
2429
2393
|
@ds.interval(:stamp)
|
|
2430
2394
|
@db.sqls.should == ["SELECT (max(stamp) - min(stamp)) FROM test LIMIT 1"]
|
|
2431
2395
|
|
|
2432
|
-
@ds.filter(:price
|
|
2396
|
+
@ds.filter(Sequel.expr(:price) > 100).interval(:stamp)
|
|
2433
2397
|
@db.sqls.should == ["SELECT (max(stamp) - min(stamp)) FROM test WHERE (price > 100) LIMIT 1"]
|
|
2434
2398
|
end
|
|
2435
2399
|
|
|
@@ -2465,20 +2429,20 @@ describe "Dataset #first and #last" do
|
|
|
2465
2429
|
end
|
|
2466
2430
|
|
|
2467
2431
|
specify "should return the first matching record if a block is given without an argument" do
|
|
2468
|
-
@d.first{
|
|
2469
|
-
@d.order(:name).last{
|
|
2432
|
+
@d.first{z > 26}.should == {:s=>'SELECT * FROM test WHERE (z > 26) LIMIT 1'}
|
|
2433
|
+
@d.order(:name).last{z > 26}.should == {:s=>'SELECT * FROM test WHERE (z > 26) ORDER BY name DESC LIMIT 1'}
|
|
2470
2434
|
end
|
|
2471
2435
|
|
|
2472
2436
|
specify "should combine block and standard argument filters if argument is not an Integer" do
|
|
2473
|
-
@d.first(:y=>25){
|
|
2474
|
-
@d.order(:name).last('y = ?', 16){
|
|
2437
|
+
@d.first(:y=>25){z > 26}.should == {:s=>'SELECT * FROM test WHERE ((z > 26) AND (y = 25)) LIMIT 1'}
|
|
2438
|
+
@d.order(:name).last('y = ?', 16){z > 26}.should == {:s=>'SELECT * FROM test WHERE ((z > 26) AND (y = 16)) ORDER BY name DESC LIMIT 1'}
|
|
2475
2439
|
end
|
|
2476
2440
|
|
|
2477
2441
|
specify "should filter and return an array of records if an Integer argument is provided and a block is given" do
|
|
2478
2442
|
i = rand(10) + 10
|
|
2479
|
-
r = @d.order(:a).first(i){
|
|
2443
|
+
r = @d.order(:a).first(i){z > 26}.should == [{:s=>"SELECT * FROM test WHERE (z > 26) ORDER BY a LIMIT #{i}"}]
|
|
2480
2444
|
i = rand(10) + 10
|
|
2481
|
-
r = @d.order(:a).last(i){
|
|
2445
|
+
r = @d.order(:a).last(i){z > 26}.should == [{:s=>"SELECT * FROM test WHERE (z > 26) ORDER BY a DESC LIMIT #{i}"}]
|
|
2482
2446
|
end
|
|
2483
2447
|
|
|
2484
2448
|
specify "#last should raise if no order is given" do
|
|
@@ -2490,9 +2454,9 @@ describe "Dataset #first and #last" do
|
|
|
2490
2454
|
|
|
2491
2455
|
specify "#last should invert the order" do
|
|
2492
2456
|
@d.order(:a).last.should == {:s=>'SELECT * FROM test ORDER BY a DESC LIMIT 1'}
|
|
2493
|
-
@d.order(:b
|
|
2457
|
+
@d.order(Sequel.desc(:b)).last.should == {:s=>'SELECT * FROM test ORDER BY b ASC LIMIT 1'}
|
|
2494
2458
|
@d.order(:c, :d).last.should == {:s=>'SELECT * FROM test ORDER BY c DESC, d DESC LIMIT 1'}
|
|
2495
|
-
@d.order(:e
|
|
2459
|
+
@d.order(Sequel.desc(:e), :f).last.should == {:s=>'SELECT * FROM test ORDER BY e ASC, f DESC LIMIT 1'}
|
|
2496
2460
|
end
|
|
2497
2461
|
end
|
|
2498
2462
|
|
|
@@ -2659,7 +2623,7 @@ describe "Dataset#get" do
|
|
|
2659
2623
|
end
|
|
2660
2624
|
|
|
2661
2625
|
specify "should work with aliased fields" do
|
|
2662
|
-
@d.get(:x__b.as(:name)).should == "SELECT x.b AS name FROM test LIMIT 1"
|
|
2626
|
+
@d.get(Sequel.expr(:x__b).as(:name)).should == "SELECT x.b AS name FROM test LIMIT 1"
|
|
2663
2627
|
end
|
|
2664
2628
|
|
|
2665
2629
|
specify "should accept a block that yields a virtual row" do
|
|
@@ -2897,7 +2861,7 @@ describe "Dataset#multi_insert" do
|
|
|
2897
2861
|
"INSERT INTO sch.tab (name) VALUES ('ghi')",
|
|
2898
2862
|
'COMMIT']
|
|
2899
2863
|
|
|
2900
|
-
@ds = @ds.from(
|
|
2864
|
+
@ds = @ds.from(Sequel.qualify(:sch, :tab))
|
|
2901
2865
|
@ds.multi_insert(@list)
|
|
2902
2866
|
@db.sqls.should == ['BEGIN',
|
|
2903
2867
|
"INSERT INTO sch.tab (name) VALUES ('abc')",
|
|
@@ -2905,7 +2869,7 @@ describe "Dataset#multi_insert" do
|
|
|
2905
2869
|
"INSERT INTO sch.tab (name) VALUES ('ghi')",
|
|
2906
2870
|
'COMMIT']
|
|
2907
2871
|
|
|
2908
|
-
@ds = @ds.from(:sch__tab
|
|
2872
|
+
@ds = @ds.from(Sequel.identifier(:sch__tab))
|
|
2909
2873
|
@ds.multi_insert(@list)
|
|
2910
2874
|
@db.sqls.should == ['BEGIN',
|
|
2911
2875
|
"INSERT INTO sch__tab (name) VALUES ('abc')",
|
|
@@ -2978,7 +2942,7 @@ describe "Dataset" do
|
|
|
2978
2942
|
end
|
|
2979
2943
|
|
|
2980
2944
|
specify "should support self-changing filter! with block" do
|
|
2981
|
-
@d.filter!{
|
|
2945
|
+
@d.filter!{y < 2}
|
|
2982
2946
|
@d.sql.should == "SELECT * FROM x WHERE (y < 2)"
|
|
2983
2947
|
end
|
|
2984
2948
|
|
|
@@ -3029,7 +2993,7 @@ describe "Dataset#update_sql" do
|
|
|
3029
2993
|
end
|
|
3030
2994
|
|
|
3031
2995
|
specify "should accept array subscript references" do
|
|
3032
|
-
@ds.update_sql((:day
|
|
2996
|
+
@ds.update_sql((Sequel.subscript(:day, 1)) => 'd').should == "UPDATE items SET day[1] = 'd'"
|
|
3033
2997
|
end
|
|
3034
2998
|
end
|
|
3035
2999
|
|
|
@@ -3047,7 +3011,7 @@ describe "Dataset#insert_sql" do
|
|
|
3047
3011
|
end
|
|
3048
3012
|
|
|
3049
3013
|
specify "should accept array subscript references" do
|
|
3050
|
-
@ds.insert_sql((:day
|
|
3014
|
+
@ds.insert_sql((Sequel.subscript(:day, 1)) => 'd').should == "INSERT INTO items (day[1]) VALUES ('d')"
|
|
3051
3015
|
end
|
|
3052
3016
|
|
|
3053
3017
|
specify "should raise an Error if the dataset has no sources" do
|
|
@@ -3085,11 +3049,11 @@ describe "Dataset#insert_sql" do
|
|
|
3085
3049
|
end
|
|
3086
3050
|
|
|
3087
3051
|
specify "should accept a single LiteralString" do
|
|
3088
|
-
@ds.insert_sql('VALUES (1, 2, 3)'
|
|
3052
|
+
@ds.insert_sql(Sequel.lit('VALUES (1, 2, 3)')).should == "INSERT INTO items VALUES (1, 2, 3)"
|
|
3089
3053
|
end
|
|
3090
3054
|
|
|
3091
3055
|
specify "should accept an array of columns and an LiteralString" do
|
|
3092
|
-
@ds.insert_sql([:a, :b, :c], 'VALUES (1, 2, 3)'
|
|
3056
|
+
@ds.insert_sql([:a, :b, :c], Sequel.lit('VALUES (1, 2, 3)')).should == "INSERT INTO items (a, b, c) VALUES (1, 2, 3)"
|
|
3093
3057
|
end
|
|
3094
3058
|
|
|
3095
3059
|
specify "should accept an object that responds to values and returns a hash by using that hash as the columns and values" do
|
|
@@ -3427,7 +3391,7 @@ describe "Sequel::Dataset#server" do
|
|
|
3427
3391
|
@ds.all
|
|
3428
3392
|
@ds.server(:i).insert(:a=>1)
|
|
3429
3393
|
@ds.server(:d).delete
|
|
3430
|
-
@ds.server(:u).update(:a
|
|
3394
|
+
@ds.server(:u).update(:a=>Sequel.expr(:a)+1)
|
|
3431
3395
|
@db.sqls.should == ['SELECT * FROM items -- s', 'INSERT INTO items (a) VALUES (1) -- i', 'DELETE FROM items -- d', 'UPDATE items SET a = (a + 1) -- u']
|
|
3432
3396
|
end
|
|
3433
3397
|
end
|
|
@@ -3538,7 +3502,7 @@ describe "Sequel::Dataset#qualify_to_first_source" do
|
|
|
3538
3502
|
end
|
|
3539
3503
|
|
|
3540
3504
|
specify "should handle hashes" do
|
|
3541
|
-
@ds.select({:b=>{:c=>1}}
|
|
3505
|
+
@ds.select(Sequel.case({:b=>{:c=>1}}, false)).qualify_to_first_source.sql.should == "SELECT (CASE WHEN t.b THEN (t.c = 1) ELSE 'f' END) FROM t"
|
|
3542
3506
|
end
|
|
3543
3507
|
|
|
3544
3508
|
specify "should handle SQL::Identifiers" do
|
|
@@ -3546,15 +3510,15 @@ describe "Sequel::Dataset#qualify_to_first_source" do
|
|
|
3546
3510
|
end
|
|
3547
3511
|
|
|
3548
3512
|
specify "should handle SQL::OrderedExpressions" do
|
|
3549
|
-
@ds.order(:a
|
|
3513
|
+
@ds.order(Sequel.desc(:a), Sequel.asc(:b)).qualify_to_first_source.sql.should == 'SELECT t.* FROM t ORDER BY t.a DESC, t.b ASC'
|
|
3550
3514
|
end
|
|
3551
3515
|
|
|
3552
3516
|
specify "should handle SQL::AliasedExpressions" do
|
|
3553
|
-
@ds.select(:a.as(:b)).qualify_to_first_source.sql.should == 'SELECT t.a AS b FROM t'
|
|
3517
|
+
@ds.select(Sequel.expr(:a).as(:b)).qualify_to_first_source.sql.should == 'SELECT t.a AS b FROM t'
|
|
3554
3518
|
end
|
|
3555
3519
|
|
|
3556
3520
|
specify "should handle SQL::CaseExpressions" do
|
|
3557
|
-
@ds.filter{{a=>b}
|
|
3521
|
+
@ds.filter{Sequel.case({a=>b}, c, d)}.qualify_to_first_source.sql.should == 'SELECT t.* FROM t WHERE (CASE t.d WHEN t.a THEN t.b ELSE t.c END)'
|
|
3558
3522
|
end
|
|
3559
3523
|
|
|
3560
3524
|
specify "should handle SQL:Casts" do
|
|
@@ -3570,7 +3534,7 @@ describe "Sequel::Dataset#qualify_to_first_source" do
|
|
|
3570
3534
|
end
|
|
3571
3535
|
|
|
3572
3536
|
specify "should handle SQL::ValueLists" do
|
|
3573
|
-
@ds.filter(:a=>[:b, :c]
|
|
3537
|
+
@ds.filter(:a=>Sequel.value_list([:b, :c])).qualify_to_first_source.sql.should == 'SELECT t.* FROM t WHERE (t.a IN (t.b, t.c))'
|
|
3574
3538
|
end
|
|
3575
3539
|
|
|
3576
3540
|
specify "should handle SQL::Subscripts" do
|
|
@@ -3595,7 +3559,7 @@ describe "Sequel::Dataset#qualify_to_first_source" do
|
|
|
3595
3559
|
end
|
|
3596
3560
|
|
|
3597
3561
|
specify "should handle all other objects by returning them unchanged" do
|
|
3598
|
-
@ds.select("a").filter{a(3)}.filter('blah').order('true'
|
|
3562
|
+
@ds.select("a").filter{a(3)}.filter('blah').order(Sequel.lit('true')).group(Sequel.lit('a > ?', 1)).having(false).qualify_to_first_source.sql.should == "SELECT 'a' FROM t WHERE (a(3) AND (blah)) GROUP BY a > 1 HAVING 'f' ORDER BY true"
|
|
3599
3563
|
end
|
|
3600
3564
|
end
|
|
3601
3565
|
|
|
@@ -3632,7 +3596,7 @@ describe "Sequel::Dataset#unbind" do
|
|
|
3632
3596
|
end
|
|
3633
3597
|
|
|
3634
3598
|
specify "should not unbind literal strings" do
|
|
3635
|
-
@u[@ds.filter(:foo=>'a'
|
|
3599
|
+
@u[@ds.filter(:foo=>Sequel.lit('a'))].should == ["SELECT * FROM t WHERE (foo = a)", {}]
|
|
3636
3600
|
end
|
|
3637
3601
|
|
|
3638
3602
|
specify "should not unbind Identifiers, QualifiedIdentifiers, or Symbols used as booleans" do
|
|
@@ -3652,7 +3616,7 @@ describe "Sequel::Dataset#unbind" do
|
|
|
3652
3616
|
end
|
|
3653
3617
|
|
|
3654
3618
|
specify "should handle deep nesting" do
|
|
3655
|
-
@u[@ds.filter{foo > 1}.and{bar < 2}.or(:baz=>3).and({~
|
|
3619
|
+
@u[@ds.filter{foo > 1}.and{bar < 2}.or(:baz=>3).and(Sequel.case({~Sequel.expr(:x=>4)=>true}, false))].should == ["SELECT * FROM t WHERE ((((foo > $foo) AND (bar < $bar)) OR (baz = $baz)) AND (CASE WHEN (x != $x) THEN 't' ELSE 'f' END))", {:foo=>1, :bar=>2, :baz=>3, :x=>4}]
|
|
3656
3620
|
end
|
|
3657
3621
|
|
|
3658
3622
|
specify "should handle JOIN ON" do
|
|
@@ -3955,8 +3919,8 @@ describe "Sequel::Dataset#select_map" do
|
|
|
3955
3919
|
end
|
|
3956
3920
|
|
|
3957
3921
|
specify "should raise if multiple arguments and can't determine alias" do
|
|
3958
|
-
proc{@ds.select_map([:a
|
|
3959
|
-
proc{@ds.select_map(:a
|
|
3922
|
+
proc{@ds.select_map([Sequel.function(:a), :b])}.should raise_error(Sequel::Error)
|
|
3923
|
+
proc{@ds.select_map(Sequel.function(:a)){b}}.should raise_error(Sequel::Error)
|
|
3960
3924
|
proc{@ds.select_map{[a{}, b]}}.should raise_error(Sequel::Error)
|
|
3961
3925
|
end
|
|
3962
3926
|
|
|
@@ -3966,7 +3930,7 @@ describe "Sequel::Dataset#select_map" do
|
|
|
3966
3930
|
end
|
|
3967
3931
|
|
|
3968
3932
|
specify "should handle other objects" do
|
|
3969
|
-
@ds.select_map("a".
|
|
3933
|
+
@ds.select_map(Sequel.lit("a").as(:b)).should == [1, 2]
|
|
3970
3934
|
@ds.db.sqls.should == ['SELECT a AS b FROM t']
|
|
3971
3935
|
end
|
|
3972
3936
|
|
|
@@ -3998,7 +3962,7 @@ describe "Sequel::Dataset#select_map" do
|
|
|
3998
3962
|
specify "should handle an array of columns" do
|
|
3999
3963
|
@ds.select_map([:c, :c]).should == [[1, 1], [2, 2]]
|
|
4000
3964
|
@ds.db.sqls.should == ['SELECT c, c FROM t']
|
|
4001
|
-
@ds.select_map([:d.as(:c),
|
|
3965
|
+
@ds.select_map([Sequel.expr(:d).as(:c), Sequel.qualify(:b, :c), Sequel.identifier(:c), Sequel.identifier(:c).qualify(:b), :a__c, :a__d___c]).should == [[1, 1, 1, 1, 1, 1], [2, 2, 2, 2, 2, 2]]
|
|
4002
3966
|
@ds.db.sqls.should == ['SELECT d AS c, b.c, c, b.c, a.c, a.d AS c FROM t']
|
|
4003
3967
|
end
|
|
4004
3968
|
|
|
@@ -4024,8 +3988,8 @@ describe "Sequel::Dataset#select_order_map" do
|
|
|
4024
3988
|
end
|
|
4025
3989
|
|
|
4026
3990
|
specify "should raise if multiple arguments and can't determine alias" do
|
|
4027
|
-
proc{@ds.select_order_map([:a
|
|
4028
|
-
proc{@ds.select_order_map(:a
|
|
3991
|
+
proc{@ds.select_order_map([Sequel.function(:a), :b])}.should raise_error(Sequel::Error)
|
|
3992
|
+
proc{@ds.select_order_map(Sequel.function(:a)){b}}.should raise_error(Sequel::Error)
|
|
4029
3993
|
proc{@ds.select_order_map{[a{}, b]}}.should raise_error(Sequel::Error)
|
|
4030
3994
|
end
|
|
4031
3995
|
|
|
@@ -4040,12 +4004,12 @@ describe "Sequel::Dataset#select_order_map" do
|
|
|
4040
4004
|
end
|
|
4041
4005
|
|
|
4042
4006
|
specify "should handle AliasedExpressions" do
|
|
4043
|
-
@ds.select_order_map("a".
|
|
4007
|
+
@ds.select_order_map(Sequel.lit("a").as(:b)).should == [1, 2]
|
|
4044
4008
|
@ds.db.sqls.should == ['SELECT a AS b FROM t ORDER BY a']
|
|
4045
4009
|
end
|
|
4046
4010
|
|
|
4047
4011
|
specify "should handle OrderedExpressions" do
|
|
4048
|
-
@ds.select_order_map(:a
|
|
4012
|
+
@ds.select_order_map(Sequel.desc(:a)).should == [1, 2]
|
|
4049
4013
|
@ds.db.sqls.should == ['SELECT a FROM t ORDER BY a DESC']
|
|
4050
4014
|
end
|
|
4051
4015
|
|
|
@@ -4072,8 +4036,8 @@ describe "Sequel::Dataset#select_order_map" do
|
|
|
4072
4036
|
specify "should handle an array of columns" do
|
|
4073
4037
|
@ds.select_order_map([:c, :c]).should == [[1, 1], [2, 2]]
|
|
4074
4038
|
@ds.db.sqls.should == ['SELECT c, c FROM t ORDER BY c, c']
|
|
4075
|
-
@ds.select_order_map([:d.as(:c),
|
|
4076
|
-
@ds.db.sqls.should == ['SELECT d AS c, b.c, c, b.c, b.c, a.c, a.d AS c FROM t ORDER BY d, b.c, c, b.c, b.c DESC, a.c, a.d DESC']
|
|
4039
|
+
@ds.select_order_map([Sequel.expr(:d).as(:c), Sequel.qualify(:b, :c), Sequel.identifier(:c), Sequel.identifier(:c).qualify(:b), Sequel.identifier(:c).qualify(:b).desc, :a__c, Sequel.desc(:a__d___c), Sequel.desc(Sequel.expr(:a__d___c))]).should == [[1, 1, 1, 1, 1, 1, 1, 1], [2, 2, 2, 2, 2, 2, 2, 2]]
|
|
4040
|
+
@ds.db.sqls.should == ['SELECT d AS c, b.c, c, b.c, b.c, a.c, a.d AS c, a.d AS c FROM t ORDER BY d, b.c, c, b.c, b.c DESC, a.c, a.d DESC, a.d DESC']
|
|
4077
4041
|
end
|
|
4078
4042
|
|
|
4079
4043
|
specify "should handle an array with a single element" do
|
|
@@ -4109,17 +4073,17 @@ describe "Sequel::Dataset#select_hash" do
|
|
|
4109
4073
|
end
|
|
4110
4074
|
|
|
4111
4075
|
specify "should handle SQL::Identifiers in arguments" do
|
|
4112
|
-
@ds.select_hash(:a.identifier
|
|
4076
|
+
@ds.select_hash(Sequel.identifier(:a), Sequel.identifier(:b)).should == {1=>2, 3=>4}
|
|
4113
4077
|
@ds.db.sqls.should == ['SELECT a, b FROM t']
|
|
4114
4078
|
end
|
|
4115
4079
|
|
|
4116
4080
|
specify "should handle SQL::QualifiedIdentifiers in arguments" do
|
|
4117
|
-
@ds.select_hash(
|
|
4081
|
+
@ds.select_hash(Sequel.qualify(:t, :a), Sequel.identifier(:b).qualify(:t)).should == {1=>2, 3=>4}
|
|
4118
4082
|
@ds.db.sqls.should == ['SELECT t.a, t.b FROM t']
|
|
4119
4083
|
end
|
|
4120
4084
|
|
|
4121
4085
|
specify "should handle SQL::AliasedExpressions in arguments" do
|
|
4122
|
-
@ds.select_hash(:c.as(:a), :t.as(:b)).should == {1=>2, 3=>4}
|
|
4086
|
+
@ds.select_hash(Sequel.expr(:c).as(:a), Sequel.expr(:t).as(:b)).should == {1=>2, 3=>4}
|
|
4123
4087
|
@ds.db.sqls.should == ['SELECT c AS a, t AS b FROM t']
|
|
4124
4088
|
end
|
|
4125
4089
|
|
|
@@ -4134,7 +4098,7 @@ describe "Sequel::Dataset#select_hash" do
|
|
|
4134
4098
|
end
|
|
4135
4099
|
|
|
4136
4100
|
specify "should raise an error if the resulting symbol cannot be determined" do
|
|
4137
|
-
proc{@ds.select_hash(:c.as(:a), :b
|
|
4101
|
+
proc{@ds.select_hash(Sequel.expr(:c).as(:a), Sequel.function(:b))}.should raise_error(Sequel::Error)
|
|
4138
4102
|
end
|
|
4139
4103
|
end
|
|
4140
4104
|
|
|
@@ -4165,17 +4129,17 @@ describe "Sequel::Dataset#select_hash_groups" do
|
|
|
4165
4129
|
end
|
|
4166
4130
|
|
|
4167
4131
|
specify "should handle SQL::Identifiers in arguments" do
|
|
4168
|
-
@ds.select_hash_groups(:a.identifier
|
|
4132
|
+
@ds.select_hash_groups(Sequel.identifier(:a), Sequel.identifier(:b)).should == {1=>[2], 3=>[4]}
|
|
4169
4133
|
@ds.db.sqls.should == ['SELECT a, b FROM t']
|
|
4170
4134
|
end
|
|
4171
4135
|
|
|
4172
4136
|
specify "should handle SQL::QualifiedIdentifiers in arguments" do
|
|
4173
|
-
@ds.select_hash_groups(
|
|
4137
|
+
@ds.select_hash_groups(Sequel.qualify(:t, :a), Sequel.identifier(:b).qualify(:t)).should == {1=>[2], 3=>[4]}
|
|
4174
4138
|
@ds.db.sqls.should == ['SELECT t.a, t.b FROM t']
|
|
4175
4139
|
end
|
|
4176
4140
|
|
|
4177
4141
|
specify "should handle SQL::AliasedExpressions in arguments" do
|
|
4178
|
-
@ds.select_hash_groups(:c.as(:a), :t.as(:b)).should == {1=>[2], 3=>[4]}
|
|
4142
|
+
@ds.select_hash_groups(Sequel.expr(:c).as(:a), Sequel.expr(:t).as(:b)).should == {1=>[2], 3=>[4]}
|
|
4179
4143
|
@ds.db.sqls.should == ['SELECT c AS a, t AS b FROM t']
|
|
4180
4144
|
end
|
|
4181
4145
|
|
|
@@ -4190,7 +4154,7 @@ describe "Sequel::Dataset#select_hash_groups" do
|
|
|
4190
4154
|
end
|
|
4191
4155
|
|
|
4192
4156
|
specify "should raise an error if the resulting symbol cannot be determined" do
|
|
4193
|
-
proc{@ds.select_hash_groups(:c.as(:a), :b
|
|
4157
|
+
proc{@ds.select_hash_groups(Sequel.expr(:c).as(:a), Sequel.function(:b))}.should raise_error(Sequel::Error)
|
|
4194
4158
|
end
|
|
4195
4159
|
end
|
|
4196
4160
|
|
|
@@ -4296,8 +4260,8 @@ describe "Dataset emulating bitwise operator support" do
|
|
|
4296
4260
|
|
|
4297
4261
|
it "should work with any numbers of arguments for operators" do
|
|
4298
4262
|
@ds.select(Sequel::SQL::ComplexExpression.new(:&, :x)).sql.should == 'SELECT "x"'
|
|
4299
|
-
@ds.select(:x & 1).sql.should == 'SELECT bitand("x", 1)'
|
|
4300
|
-
@ds.select(:x & 1 & 2).sql.should == 'SELECT bitand(bitand("x", 1), 2)'
|
|
4263
|
+
@ds.select(Sequel.expr(:x) & 1).sql.should == 'SELECT bitand("x", 1)'
|
|
4264
|
+
@ds.select(Sequel.expr(:x) & 1 & 2).sql.should == 'SELECT bitand(bitand("x", 1), 2)'
|
|
4301
4265
|
end
|
|
4302
4266
|
end
|
|
4303
4267
|
|