sequel 4.10.0 → 4.11.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 +58 -0
- data/doc/association_basics.rdoc +1 -1
- data/doc/cheat_sheet.rdoc +0 -1
- data/doc/core_extensions.rdoc +2 -2
- data/doc/dataset_filtering.rdoc +5 -5
- data/doc/model_hooks.rdoc +9 -0
- data/doc/object_model.rdoc +7 -13
- data/doc/opening_databases.rdoc +3 -1
- data/doc/querying.rdoc +8 -8
- data/doc/release_notes/4.11.0.txt +147 -0
- data/doc/sql.rdoc +11 -7
- data/doc/virtual_rows.rdoc +4 -5
- data/lib/sequel/adapters/ibmdb.rb +24 -16
- data/lib/sequel/adapters/jdbc/h2.rb +5 -0
- data/lib/sequel/adapters/jdbc/hsqldb.rb +5 -0
- data/lib/sequel/adapters/mock.rb +14 -2
- data/lib/sequel/adapters/shared/access.rb +6 -9
- data/lib/sequel/adapters/shared/cubrid.rb +5 -0
- data/lib/sequel/adapters/shared/db2.rb +5 -0
- data/lib/sequel/adapters/shared/firebird.rb +5 -0
- data/lib/sequel/adapters/shared/mssql.rb +23 -16
- data/lib/sequel/adapters/shared/mysql.rb +12 -2
- data/lib/sequel/adapters/shared/oracle.rb +31 -15
- data/lib/sequel/adapters/shared/postgres.rb +28 -4
- data/lib/sequel/adapters/shared/sqlanywhere.rb +5 -0
- data/lib/sequel/adapters/shared/sqlite.rb +12 -1
- data/lib/sequel/ast_transformer.rb +9 -7
- data/lib/sequel/connection_pool.rb +10 -4
- data/lib/sequel/database/features.rb +15 -0
- data/lib/sequel/database/schema_generator.rb +2 -2
- data/lib/sequel/database/schema_methods.rb +21 -3
- data/lib/sequel/database/transactions.rb +8 -4
- data/lib/sequel/dataset/actions.rb +13 -7
- data/lib/sequel/dataset/features.rb +7 -0
- data/lib/sequel/dataset/query.rb +28 -11
- data/lib/sequel/dataset/sql.rb +90 -14
- data/lib/sequel/extensions/constraint_validations.rb +2 -2
- data/lib/sequel/extensions/date_arithmetic.rb +1 -1
- data/lib/sequel/extensions/eval_inspect.rb +12 -6
- data/lib/sequel/extensions/pg_array_ops.rb +11 -2
- data/lib/sequel/extensions/pg_json.rb +130 -23
- data/lib/sequel/extensions/pg_json_ops.rb +196 -28
- data/lib/sequel/extensions/to_dot.rb +5 -7
- data/lib/sequel/model/associations.rb +0 -50
- data/lib/sequel/plugins/class_table_inheritance.rb +49 -21
- data/lib/sequel/plugins/many_through_many.rb +10 -11
- data/lib/sequel/plugins/serialization.rb +4 -1
- data/lib/sequel/plugins/sharding.rb +0 -9
- data/lib/sequel/plugins/single_table_inheritance.rb +4 -2
- data/lib/sequel/plugins/timestamps.rb +2 -2
- data/lib/sequel/sql.rb +166 -44
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/postgres_spec.rb +199 -133
- data/spec/core/connection_pool_spec.rb +6 -0
- data/spec/core/database_spec.rb +12 -0
- data/spec/core/dataset_spec.rb +58 -3
- data/spec/core/expression_filters_spec.rb +67 -5
- data/spec/core/mock_adapter_spec.rb +8 -4
- data/spec/core/schema_spec.rb +7 -0
- data/spec/core_extensions_spec.rb +14 -0
- data/spec/extensions/class_table_inheritance_spec.rb +23 -3
- data/spec/extensions/core_refinements_spec.rb +14 -0
- data/spec/extensions/eval_inspect_spec.rb +8 -4
- data/spec/extensions/pg_array_ops_spec.rb +6 -0
- data/spec/extensions/pg_json_ops_spec.rb +99 -0
- data/spec/extensions/pg_json_spec.rb +104 -4
- data/spec/extensions/serialization_spec.rb +19 -0
- data/spec/extensions/single_table_inheritance_spec.rb +11 -3
- data/spec/extensions/timestamps_spec.rb +10 -0
- data/spec/extensions/to_dot_spec.rb +8 -4
- data/spec/integration/database_test.rb +1 -1
- data/spec/integration/dataset_test.rb +9 -0
- data/spec/integration/schema_test.rb +27 -0
- metadata +4 -2
@@ -8,6 +8,8 @@ describe "pg_json extension" do
|
|
8
8
|
@m = m::JSONDatabaseMethods
|
9
9
|
@hc = m::JSONHash
|
10
10
|
@ac = m::JSONArray
|
11
|
+
@bhc = m::JSONBHash
|
12
|
+
@bac = m::JSONBArray
|
11
13
|
|
12
14
|
# Create subclass in correct namespace for easily overriding methods
|
13
15
|
j = m::JSON = JSON.dup
|
@@ -46,6 +48,14 @@ describe "pg_json extension" do
|
|
46
48
|
@m.db_parse_json('1.1').should == 1.1
|
47
49
|
end
|
48
50
|
|
51
|
+
it "should parse json and non-json plain strings, integers, and floats correctly in db_parse_jsonb" do
|
52
|
+
@m.db_parse_jsonb('{"a": "b", "c": {"d": "e"}}').to_hash.should == {'a'=>'b', 'c'=>{'d'=>'e'}}
|
53
|
+
@m.db_parse_jsonb('[1, [2], {"a": "b"}]').to_a.should == [1, [2], {'a'=>'b'}]
|
54
|
+
@m.db_parse_jsonb('1').should == 1
|
55
|
+
@m.db_parse_jsonb('"b"').should == 'b'
|
56
|
+
@m.db_parse_jsonb('1.1').should == 1.1
|
57
|
+
end
|
58
|
+
|
49
59
|
it "should raise an error when attempting to parse invalid json" do
|
50
60
|
proc{@m.parse_json('')}.should raise_error(Sequel::InvalidValue)
|
51
61
|
proc{@m.parse_json('1')}.should raise_error(Sequel::InvalidValue)
|
@@ -72,6 +82,13 @@ describe "pg_json extension" do
|
|
72
82
|
@db.literal(Sequel.pg_json('a'=>'b')).should == "'{\"a\":\"b\"}'::json"
|
73
83
|
end
|
74
84
|
|
85
|
+
it "should literalize JSONHash and JSONArray to strings correctly" do
|
86
|
+
@db.literal(Sequel.pg_jsonb([])).should == "'[]'::jsonb"
|
87
|
+
@db.literal(Sequel.pg_jsonb([1, [2], {'a'=>'b'}])).should == "'[1,[2],{\"a\":\"b\"}]'::jsonb"
|
88
|
+
@db.literal(Sequel.pg_jsonb({})).should == "'{}'::jsonb"
|
89
|
+
@db.literal(Sequel.pg_jsonb('a'=>'b')).should == "'{\"a\":\"b\"}'::jsonb"
|
90
|
+
end
|
91
|
+
|
75
92
|
it "should have Sequel.pg_json return JSONHash and JSONArray as is" do
|
76
93
|
a = Sequel.pg_json({})
|
77
94
|
Sequel.pg_json(a).should equal(a)
|
@@ -79,22 +96,72 @@ describe "pg_json extension" do
|
|
79
96
|
Sequel.pg_json(a).should equal(a)
|
80
97
|
end
|
81
98
|
|
82
|
-
it "should have
|
99
|
+
it "should have Sequel.pg_json convert jsonb values" do
|
100
|
+
a = {}
|
101
|
+
v = Sequel.pg_json(Sequel.pg_jsonb(a))
|
102
|
+
v.to_hash.should equal(a)
|
103
|
+
v.should be_a_kind_of(@hc)
|
104
|
+
|
105
|
+
a = []
|
106
|
+
v = Sequel.pg_json(Sequel.pg_jsonb(a))
|
107
|
+
v.to_a.should equal(a)
|
108
|
+
v.should be_a_kind_of(@ac)
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should have Sequel.pg_jsonb return JSONBHash and JSONBArray as is" do
|
112
|
+
a = Sequel.pg_jsonb({})
|
113
|
+
Sequel.pg_jsonb(a).should equal(a)
|
114
|
+
a = Sequel.pg_jsonb([])
|
115
|
+
Sequel.pg_jsonb(a).should equal(a)
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should have Sequel.pg_jsonb convert json values" do
|
119
|
+
a = {}
|
120
|
+
v = Sequel.pg_jsonb(Sequel.pg_json(a))
|
121
|
+
v.to_hash.should equal(a)
|
122
|
+
v.should be_a_kind_of(@bhc)
|
123
|
+
|
124
|
+
a = []
|
125
|
+
v = Sequel.pg_jsonb(Sequel.pg_json(a))
|
126
|
+
v.to_a.should equal(a)
|
127
|
+
v.should be_a_kind_of(@bac)
|
128
|
+
end
|
129
|
+
|
130
|
+
it "should have JSONHashBase#to_hash method for getting underlying hash" do
|
83
131
|
Sequel.pg_json({}).to_hash.should be_a_kind_of(Hash)
|
132
|
+
Sequel.pg_jsonb({}).to_hash.should be_a_kind_of(Hash)
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should allow aliasing json objects" do
|
136
|
+
@db.literal(Sequel.pg_json({}).as(:a)).should == "'{}'::json AS a"
|
137
|
+
@db.literal(Sequel.pg_json([]).as(:a)).should == "'[]'::json AS a"
|
138
|
+
@db.literal(Sequel.pg_jsonb({}).as(:a)).should == "'{}'::jsonb AS a"
|
139
|
+
@db.literal(Sequel.pg_jsonb([]).as(:a)).should == "'[]'::jsonb AS a"
|
140
|
+
end
|
141
|
+
|
142
|
+
it "should allow casting json objects" do
|
143
|
+
@db.literal(Sequel.pg_json({}).cast(String)).should == "CAST('{}'::json AS text)"
|
144
|
+
@db.literal(Sequel.pg_json([]).cast(String)).should == "CAST('[]'::json AS text)"
|
145
|
+
@db.literal(Sequel.pg_jsonb({}).cast(String)).should == "CAST('{}'::jsonb AS text)"
|
146
|
+
@db.literal(Sequel.pg_jsonb([]).cast(String)).should == "CAST('[]'::jsonb AS text)"
|
84
147
|
end
|
85
148
|
|
86
|
-
it "should have
|
149
|
+
it "should have JSONArrayBase#to_a method for getting underlying array" do
|
87
150
|
Sequel.pg_json([]).to_a.should be_a_kind_of(Array)
|
151
|
+
Sequel.pg_jsonb([]).to_a.should be_a_kind_of(Array)
|
88
152
|
end
|
89
153
|
|
90
|
-
it "should support using
|
154
|
+
it "should support using JSONHashBase and JSONArrayBase as bound variables" do
|
91
155
|
@db.bound_variable_arg(1, nil).should == 1
|
92
156
|
@db.bound_variable_arg(Sequel.pg_json([1]), nil).should == '[1]'
|
93
157
|
@db.bound_variable_arg(Sequel.pg_json('a'=>'b'), nil).should == '{"a":"b"}'
|
158
|
+
@db.bound_variable_arg(Sequel.pg_jsonb([1]), nil).should == '[1]'
|
159
|
+
@db.bound_variable_arg(Sequel.pg_jsonb('a'=>'b'), nil).should == '{"a":"b"}'
|
94
160
|
end
|
95
161
|
|
96
|
-
it "should support using json[] types in bound variables" do
|
162
|
+
it "should support using json[] and jsonb[] types in bound variables" do
|
97
163
|
@db.bound_variable_arg(Sequel.pg_array([Sequel.pg_json([{"a"=>1}]), Sequel.pg_json("b"=>[1, 2])]), nil).should == '{"[{\\"a\\":1}]","{\\"b\\":[1,2]}"}'
|
164
|
+
@db.bound_variable_arg(Sequel.pg_array([Sequel.pg_jsonb([{"a"=>1}]), Sequel.pg_jsonb("b"=>[1, 2])]), nil).should == '{"[{\\"a\\":1}]","{\\"b\\":[1,2]}"}'
|
98
165
|
end
|
99
166
|
|
100
167
|
it "should parse json type from the schema correctly" do
|
@@ -102,23 +169,56 @@ describe "pg_json extension" do
|
|
102
169
|
@db.schema(:items).map{|e| e[1][:type]}.should == [:integer, :json]
|
103
170
|
end
|
104
171
|
|
172
|
+
it "should parse json type from the schema correctly" do
|
173
|
+
@db.fetch = [{:name=>'id', :db_type=>'integer'}, {:name=>'i', :db_type=>'jsonb'}]
|
174
|
+
@db.schema(:items).map{|e| e[1][:type]}.should == [:integer, :jsonb]
|
175
|
+
end
|
176
|
+
|
105
177
|
it "should support typecasting for the json type" do
|
106
178
|
h = Sequel.pg_json(1=>2)
|
107
179
|
a = Sequel.pg_json([1])
|
108
180
|
@db.typecast_value(:json, h).should equal(h)
|
109
181
|
@db.typecast_value(:json, h.to_hash).should == h
|
110
182
|
@db.typecast_value(:json, h.to_hash).should be_a_kind_of(@hc)
|
183
|
+
@db.typecast_value(:json, Sequel.pg_jsonb(h)).should == h
|
184
|
+
@db.typecast_value(:json, Sequel.pg_jsonb(h)).should be_a_kind_of(@hc)
|
111
185
|
@db.typecast_value(:json, a).should equal(a)
|
112
186
|
@db.typecast_value(:json, a.to_a).should == a
|
113
187
|
@db.typecast_value(:json, a.to_a).should be_a_kind_of(@ac)
|
188
|
+
@db.typecast_value(:json, Sequel.pg_jsonb(a)).should == a
|
189
|
+
@db.typecast_value(:json, Sequel.pg_jsonb(a)).should be_a_kind_of(@ac)
|
114
190
|
@db.typecast_value(:json, '[]').should == Sequel.pg_json([])
|
191
|
+
@db.typecast_value(:json, '[]').should be_a_kind_of(@ac)
|
115
192
|
@db.typecast_value(:json, '{"a": "b"}').should == Sequel.pg_json("a"=>"b")
|
193
|
+
@db.typecast_value(:json, '{"a": "b"}').should be_a_kind_of(@hc)
|
116
194
|
proc{@db.typecast_value(:json, '')}.should raise_error(Sequel::InvalidValue)
|
117
195
|
proc{@db.typecast_value(:json, 1)}.should raise_error(Sequel::InvalidValue)
|
118
196
|
end
|
119
197
|
|
198
|
+
it "should support typecasting for the jsonb type" do
|
199
|
+
h = Sequel.pg_jsonb(1=>2)
|
200
|
+
a = Sequel.pg_jsonb([1])
|
201
|
+
@db.typecast_value(:jsonb, h).should equal(h)
|
202
|
+
@db.typecast_value(:jsonb, h.to_hash).should == h
|
203
|
+
@db.typecast_value(:jsonb, h.to_hash).should be_a_kind_of(@bhc)
|
204
|
+
@db.typecast_value(:jsonb, Sequel.pg_json(h)).should == h
|
205
|
+
@db.typecast_value(:jsonb, Sequel.pg_json(h)).should be_a_kind_of(@bhc)
|
206
|
+
@db.typecast_value(:jsonb, a).should equal(a)
|
207
|
+
@db.typecast_value(:jsonb, a.to_a).should == a
|
208
|
+
@db.typecast_value(:jsonb, a.to_a).should be_a_kind_of(@bac)
|
209
|
+
@db.typecast_value(:jsonb, Sequel.pg_json(a)).should == a
|
210
|
+
@db.typecast_value(:jsonb, Sequel.pg_json(a)).should be_a_kind_of(@bac)
|
211
|
+
@db.typecast_value(:jsonb, '[]').should == Sequel.pg_jsonb([])
|
212
|
+
@db.typecast_value(:jsonb, '[]').should be_a_kind_of(@bac)
|
213
|
+
@db.typecast_value(:jsonb, '{"a": "b"}').should == Sequel.pg_jsonb("a"=>"b")
|
214
|
+
@db.typecast_value(:jsonb, '{"a": "b"}').should be_a_kind_of(@bhc)
|
215
|
+
proc{@db.typecast_value(:jsonb, '')}.should raise_error(Sequel::InvalidValue)
|
216
|
+
proc{@db.typecast_value(:jsonb, 1)}.should raise_error(Sequel::InvalidValue)
|
217
|
+
end
|
218
|
+
|
120
219
|
it "should return correct results for Database#schema_type_class" do
|
121
220
|
@db.schema_type_class(:json).should == [Sequel::Postgres::JSONHash, Sequel::Postgres::JSONArray]
|
221
|
+
@db.schema_type_class(:jsonb).should == [Sequel::Postgres::JSONBHash, Sequel::Postgres::JSONBArray]
|
122
222
|
@db.schema_type_class(:integer).should == Integer
|
123
223
|
end
|
124
224
|
end
|
@@ -300,4 +300,23 @@ describe "Serialization plugin" do
|
|
300
300
|
o.dup.deserialized_values.should == o.deserialized_values
|
301
301
|
o.dup.deserialized_values.should_not equal(o.deserialized_values)
|
302
302
|
end
|
303
|
+
|
304
|
+
it "should have changed_columns include serialized columns if those columns have changed" do
|
305
|
+
@c.plugin :serialization, :yaml, :abc, :def
|
306
|
+
@c.dataset._fetch = {:id => 1, :abc => "--- 1\n", :def => "--- hello\n"}
|
307
|
+
o = @c.first
|
308
|
+
o.changed_columns.should == []
|
309
|
+
o.abc = 1
|
310
|
+
o.changed_columns.should == []
|
311
|
+
o.abc = 1
|
312
|
+
o.changed_columns.should == []
|
313
|
+
o.abc = 2
|
314
|
+
o.changed_columns.should == [:abc]
|
315
|
+
o.def = 'hello'
|
316
|
+
o.changed_columns.should == [:abc]
|
317
|
+
o.def = 'hello'
|
318
|
+
o.changed_columns.should == [:abc]
|
319
|
+
o.def = 'hello2'
|
320
|
+
o.changed_columns.should == [:abc, :def]
|
321
|
+
end
|
303
322
|
end
|
@@ -70,19 +70,27 @@ describe Sequel::Model, "single table inheritance plugin" do
|
|
70
70
|
called.should == false
|
71
71
|
end
|
72
72
|
|
73
|
-
it "should
|
73
|
+
it "should set the model class name when saving" do
|
74
74
|
StiTest.new.save
|
75
75
|
StiTestSub1.new.save
|
76
76
|
StiTestSub2.new.save
|
77
77
|
DB.sqls.should == ["INSERT INTO sti_tests (kind) VALUES ('StiTest')", "SELECT * FROM sti_tests WHERE (id = 10) LIMIT 1", "INSERT INTO sti_tests (kind) VALUES ('StiTestSub1')", "SELECT * FROM sti_tests WHERE ((sti_tests.kind IN ('StiTestSub1')) AND (id = 10)) LIMIT 1", "INSERT INTO sti_tests (kind) VALUES ('StiTestSub2')", "SELECT * FROM sti_tests WHERE ((sti_tests.kind IN ('StiTestSub2')) AND (id = 10)) LIMIT 1"]
|
78
78
|
end
|
79
79
|
|
80
|
-
it "should
|
80
|
+
it "should handle validations on the type column field" do
|
81
|
+
o = StiTestSub1.new
|
82
|
+
def o.validate
|
83
|
+
errors.add(:kind, 'not present') unless kind
|
84
|
+
end
|
85
|
+
o.valid?.should == true
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should override an existing value in the class name field" do
|
81
89
|
StiTest.create(:kind=>'StiTestSub1')
|
82
90
|
DB.sqls.should == ["INSERT INTO sti_tests (kind) VALUES ('StiTestSub1')", "SELECT * FROM sti_tests WHERE (id = 10) LIMIT 1"]
|
83
91
|
end
|
84
92
|
|
85
|
-
it "should
|
93
|
+
it "should handle type column with the same name as existing method names" do
|
86
94
|
StiTest.plugin :single_table_inheritance, :type
|
87
95
|
StiTest.columns :id, :type
|
88
96
|
StiTest.create
|
@@ -22,6 +22,16 @@ describe "Sequel::Plugins::Timestamps" do
|
|
22
22
|
Sequel.datetime_class = Time
|
23
23
|
end
|
24
24
|
|
25
|
+
it "should handle validations on the timestamp fields for new objects" do
|
26
|
+
@c.plugin :timestamps, :update_on_create=>true
|
27
|
+
o = @c.new
|
28
|
+
def o.validate
|
29
|
+
errors.add(model.create_timestamp_field, 'not present') unless send(model.create_timestamp_field)
|
30
|
+
errors.add(model.update_timestamp_field, 'not present') unless send(model.update_timestamp_field)
|
31
|
+
end
|
32
|
+
o.valid?.should == true
|
33
|
+
end
|
34
|
+
|
25
35
|
it "should set the create timestamp field on creation" do
|
26
36
|
o = @c.create
|
27
37
|
@c.db.sqls.should == ["INSERT INTO t (created_at) VALUES ('2009-08-01')"]
|
@@ -108,6 +108,10 @@ END
|
|
108
108
|
dot(@ds.from(Sequel.as(:a, :b))).should == ["1 -> 2 [label=\"from\"];", "2 [label=\"Array\"];", "2 -> 3 [label=\"0\"];", "3 [label=\"AliasedExpression\"];", "3 -> 4 [label=\"expression\"];", "4 [label=\":a\"];", "3 -> 5 [label=\"alias\"];", "5 [label=\":b\"];"]
|
109
109
|
end
|
110
110
|
|
111
|
+
it "should handle SQL::AliasedExpressions with column aliases" do
|
112
|
+
dot(@ds.from(Sequel.as(:a, :b, [:c, :d]))).should == ["1 -> 2 [label=\"from\"];", "2 [label=\"Array\"];", "2 -> 3 [label=\"0\"];", "3 [label=\"AliasedExpression\"];", "3 -> 4 [label=\"expression\"];", "4 [label=\":a\"];", "3 -> 5 [label=\"alias\"];", "5 [label=\":b\"];", "3 -> 6 [label=\"columns\"];", "6 [label=\"Array\"];", "6 -> 7 [label=\"0\"];", "7 [label=\":c\"];", "6 -> 8 [label=\"1\"];", "8 [label=\":d\"];"]
|
113
|
+
end
|
114
|
+
|
111
115
|
it "should handle SQL::CaseExpressions" do
|
112
116
|
dot(@ds.select(Sequel.case({:a=>:b}, :c, :d))).should == ["1 -> 2 [label=\"select\"];", "2 [label=\"Array\"];", "2 -> 3 [label=\"0\"];", "3 [label=\"CaseExpression\"];", "3 -> 4 [label=\"expression\"];", "4 [label=\":d\"];", "3 -> 5 [label=\"conditions\"];", "5 [label=\"Array\"];", "5 -> 6 [label=\"0\"];", "6 [label=\"Array\"];", "6 -> 7 [label=\"0\"];", "7 [label=\":a\"];", "6 -> 8 [label=\"1\"];", "8 [label=\":b\"];", "3 -> 9 [label=\"default\"];", "9 [label=\":c\"];"]
|
113
117
|
end
|
@@ -117,15 +121,15 @@ END
|
|
117
121
|
end
|
118
122
|
|
119
123
|
it "should handle SQL::Function" do
|
120
|
-
dot(@ds.select{a(b)}).should == ["1 -> 2 [label=\"select\"];", "2 [label=\"Array\"];", "2 -> 3 [label=\"0\"];", "3 [label=\"Function: a\"];", "3 -> 4 [label=\"0\"];", "4 [label=\"Identifier\"];", "4 -> 5 [label=\"value\"];", "5 [label=\":b\"];"]
|
124
|
+
dot(@ds.select{a(b)}).should == ["1 -> 2 [label=\"select\"];", "2 [label=\"Array\"];", "2 -> 3 [label=\"0\"];", "3 [label=\"Function: a\"];", "3 -> 4 [label=\"0\"];", "4 [label=\"Identifier\"];", "4 -> 5 [label=\"value\"];", "5 [label=\":b\"];", "3 -> 6 [label=\"args\"];", "6 [label=\"Array\"];", "6 -> 7 [label=\"0\"];", "7 [label=\"Identifier\"];", "7 -> 8 [label=\"value\"];", "8 [label=\":b\"];", "3 -> 9 [label=\"opts\"];", "9 [label=\"Hash\"];"]
|
121
125
|
end
|
122
126
|
|
123
127
|
it "should handle SQL::Subscript" do
|
124
128
|
dot(@ds.select(Sequel.subscript(:a, 1))).should == ["1 -> 2 [label=\"select\"];", "2 [label=\"Array\"];", "2 -> 3 [label=\"0\"];", "3 [label=\"Subscript\"];", "3 -> 4 [label=\"f\"];", "4 [label=\":a\"];", "3 -> 5 [label=\"sub\"];", "5 [label=\"Array\"];", "5 -> 6 [label=\"0\"];", "6 [label=\"1\"];"]
|
125
129
|
end
|
126
130
|
|
127
|
-
it "should handle SQL::
|
128
|
-
dot(@ds.select{sum{}.over(:partition=>:a)}).should == ["1 -> 2 [label=\"select\"];", "2 [label=\"Array\"];", "2 -> 3 [label=\"0\"];", "3 [label=\"
|
131
|
+
it "should handle SQL::Function with a window" do
|
132
|
+
dot(@ds.select{sum{}.over(:partition=>:a)}).should == ["1 -> 2 [label=\"select\"];", "2 [label=\"Array\"];", "2 -> 3 [label=\"0\"];", "3 [label=\"Function: sum\"];", "3 -> 4 [label=\"args\"];", "4 [label=\"Array\"];", "3 -> 5 [label=\"opts\"];", "5 [label=\"Hash\"];", "5 -> 6 [label=\"over\"];", "6 [label=\"Window\"];", "6 -> 7 [label=\"opts\"];", "7 [label=\"Hash\"];", "7 -> 8 [label=\"partition\"];", "8 [label=\":a\"];"]
|
129
133
|
end
|
130
134
|
|
131
135
|
it "should handle SQL::PlaceholderLiteralString" do
|
@@ -137,7 +141,7 @@ END
|
|
137
141
|
end
|
138
142
|
|
139
143
|
it "should handle JOIN USING" do
|
140
|
-
dot(@ds.from(:a).join(:d, [:c], :table_alias=>:c)).should == ["1 -> 2 [label=\"from\"];", "2 [label=\"Array\"];", "2 -> 3 [label=\"0\"];", "3 [label=\":a\"];", "1 -> 4 [label=\"join\"];", "4 [label=\"Array\"];", "4 -> 5 [label=\"0\"];", "5 [label=\"INNER JOIN USING\"];", "5 -> 6 [label=\"table\"];", "6 [label=\":d\"];", "
|
144
|
+
dot(@ds.from(:a).join(:d, [:c], :table_alias=>:c)).should == ["1 -> 2 [label=\"from\"];", "2 [label=\"Array\"];", "2 -> 3 [label=\"0\"];", "3 [label=\":a\"];", "1 -> 4 [label=\"join\"];", "4 [label=\"Array\"];", "4 -> 5 [label=\"0\"];", "5 [label=\"INNER JOIN USING\"];", "5 -> 6 [label=\"table\"];", "6 [label=\"AliasedExpression\"];", "6 -> 7 [label=\"expression\"];", "7 [label=\":d\"];", "6 -> 8 [label=\"alias\"];", "8 [label=\":c\"];", "5 -> 9 [label=\"using\"];", "9 [label=\"Array\"];", "9 -> 10 [label=\"0\"];", "10 [label=\":c\"];"]
|
141
145
|
end
|
142
146
|
|
143
147
|
it "should handle other types" do
|
@@ -21,7 +21,7 @@ describe Sequel::Database do
|
|
21
21
|
end
|
22
22
|
|
23
23
|
specify "should raise Sequel::DatabaseError on invalid SQL" do
|
24
|
-
proc{@db << "
|
24
|
+
proc{@db << "S"}.should raise_error(Sequel::DatabaseError)
|
25
25
|
end
|
26
26
|
|
27
27
|
specify "should have Sequel::DatabaseError#sql give the SQL causing the error" do
|
@@ -293,6 +293,10 @@ describe "Simple Dataset operations" do
|
|
293
293
|
@ds.select(:id___x, :number___n).first.should == {:x=>1, :n=>10}
|
294
294
|
end
|
295
295
|
|
296
|
+
specify "should support table aliases with column aliases" do
|
297
|
+
DB.from(@ds.as(:i, [:x, :n])).first.should == {:x=>1, :n=>10}
|
298
|
+
end if DB.dataset.supports_derived_column_lists?
|
299
|
+
|
296
300
|
specify "should handle true/false properly" do
|
297
301
|
@ds.filter(Sequel::TRUE).select_map(:number).should == [10]
|
298
302
|
@ds.filter(Sequel::FALSE).select_map(:number).should == []
|
@@ -907,6 +911,11 @@ describe "Sequel::Dataset#import and #multi_insert" do
|
|
907
911
|
@ids.import([:i], [[10], [20], [30]], :slice_size=>3)
|
908
912
|
@ids.all.should == [{:i=>10}, {:i=>20}, {:i=>30}]
|
909
913
|
end
|
914
|
+
|
915
|
+
it "should import many rows at once" do
|
916
|
+
@ids.import([:i], (1..1000).to_a.map{|x| [x]})
|
917
|
+
@ids.select_order_map(:i).should == (1..1000).to_a
|
918
|
+
end
|
910
919
|
end
|
911
920
|
|
912
921
|
describe "Sequel::Dataset#import and #multi_insert :return=>:primary_key " do
|
@@ -272,12 +272,14 @@ describe "Database schema modifiers" do
|
|
272
272
|
|
273
273
|
describe "views" do
|
274
274
|
before do
|
275
|
+
@db.drop_view(:items_view2) rescue nil
|
275
276
|
@db.drop_view(:items_view) rescue nil
|
276
277
|
@db.create_table(:items){Integer :number}
|
277
278
|
@ds.insert(:number=>1)
|
278
279
|
@ds.insert(:number=>2)
|
279
280
|
end
|
280
281
|
after do
|
282
|
+
@db.drop_view(:items_view2) rescue nil
|
281
283
|
@db.drop_view(:items_view) rescue nil
|
282
284
|
end
|
283
285
|
|
@@ -286,6 +288,31 @@ describe "Database schema modifiers" do
|
|
286
288
|
@db[:items_view].map(:number).should == [1]
|
287
289
|
end
|
288
290
|
|
291
|
+
specify "should create views with check options correctly" do
|
292
|
+
@db.create_view(:items_view, @ds.where{number > 2}, :check=>true)
|
293
|
+
proc{@db[:items_view].insert(1)}.should raise_error(Sequel::DatabaseError)
|
294
|
+
@db[:items_view].insert(3)
|
295
|
+
@db[:items_view].select_order_map(:number).should == [3]
|
296
|
+
@db.create_view(:items_view2, @db[:items_view].where{number > 1}, :check=>true)
|
297
|
+
proc{@db[:items_view2].insert(1)}.should raise_error(Sequel::DatabaseError)
|
298
|
+
proc{@db[:items_view2].insert(2)}.should raise_error(Sequel::DatabaseError)
|
299
|
+
@db[:items_view2].insert(4)
|
300
|
+
@db[:items_view2].select_order_map(:number).should == [3, 4]
|
301
|
+
@ds.select_order_map(:number).should == [1, 2, 3, 4]
|
302
|
+
end if DB.supports_views_with_check_option?
|
303
|
+
|
304
|
+
specify "should create views with local check options correctly" do
|
305
|
+
@db.create_view(:items_view, @ds.where{number > 2})
|
306
|
+
@db[:items_view].insert(3)
|
307
|
+
@db[:items_view].select_order_map(:number).should == [3]
|
308
|
+
@db.create_view(:items_view2, @db[:items_view].where{number > 1}, :check=>:local)
|
309
|
+
proc{@db[:items_view2].insert(1)}.should raise_error(Sequel::DatabaseError)
|
310
|
+
@db[:items_view2].insert(2)
|
311
|
+
@db[:items_view2].insert(4)
|
312
|
+
@db[:items_view2].select_order_map(:number).should == [3, 4]
|
313
|
+
@ds.select_order_map(:number).should == [1, 2, 2, 3, 4]
|
314
|
+
end if DB.supports_views_with_local_check_option?
|
315
|
+
|
289
316
|
cspecify "should create views with explicit columns correctly", :sqlite do
|
290
317
|
@db.create_view(:items_view, @ds.where(:number=>1), :columns=>[:n])
|
291
318
|
@db[:items_view].map(:n).should == [1]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sequel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: The Database Toolkit for Ruby
|
14
14
|
email: code@jeremyevans.net
|
@@ -127,6 +127,7 @@ extra_rdoc_files:
|
|
127
127
|
- doc/release_notes/4.8.0.txt
|
128
128
|
- doc/release_notes/4.9.0.txt
|
129
129
|
- doc/release_notes/4.10.0.txt
|
130
|
+
- doc/release_notes/4.11.0.txt
|
130
131
|
files:
|
131
132
|
- CHANGELOG
|
132
133
|
- MIT-LICENSE
|
@@ -224,6 +225,7 @@ files:
|
|
224
225
|
- doc/release_notes/4.0.0.txt
|
225
226
|
- doc/release_notes/4.1.0.txt
|
226
227
|
- doc/release_notes/4.10.0.txt
|
228
|
+
- doc/release_notes/4.11.0.txt
|
227
229
|
- doc/release_notes/4.2.0.txt
|
228
230
|
- doc/release_notes/4.3.0.txt
|
229
231
|
- doc/release_notes/4.4.0.txt
|