sequel 3.37.0 → 3.38.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -244,7 +244,7 @@ describe Sequel::Model, "many_through_many" do
|
|
244
244
|
end
|
245
245
|
|
246
246
|
it "should support an array for the select option" do
|
247
|
-
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :select=>[:tags
|
247
|
+
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :select=>[Sequel::SQL::ColumnAll.new(:tags), :albums__name]
|
248
248
|
n = @c1.load(:id => 1234)
|
249
249
|
n.tags_dataset.sql.should == 'SELECT tags.*, albums.name FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id = 1234))'
|
250
250
|
n.tags.should == [@c2.load(:id=>1)]
|
@@ -914,12 +914,12 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
|
|
914
914
|
end
|
915
915
|
|
916
916
|
it "should respect the association's :graph_block option" do
|
917
|
-
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], {:table=>:albums, :left=>:id, :right=>:id}, [:albums_tags, :album_id, :tag_id]], :graph_block=>proc{|ja,lja,js| {
|
917
|
+
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], {:table=>:albums, :left=>:id, :right=>:id}, [:albums_tags, :album_id, :tag_id]], :graph_block=>proc{|ja,lja,js| {Sequel.qualify(ja, :active)=>true}}
|
918
918
|
@c1.eager_graph(:tags).sql.should == 'SELECT artists.id, tags.id AS tags_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON ((tags.id = albums_tags.tag_id) AND (tags.active IS TRUE))'
|
919
919
|
end
|
920
920
|
|
921
921
|
it "should respect the association's :block option on through" do
|
922
|
-
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], {:table=>:albums, :left=>:id, :right=>:id, :block=>proc{|ja,lja,js| {
|
922
|
+
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], {:table=>:albums, :left=>:id, :right=>:id, :block=>proc{|ja,lja,js| {Sequel.qualify(ja, :active)=>true}}}, [:albums_tags, :album_id, :tag_id]]
|
923
923
|
@c1.eager_graph(:tags).sql.should == 'SELECT artists.id, tags.id AS tags_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON ((albums.id = albums_artists.album_id) AND (albums.active IS TRUE)) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id)'
|
924
924
|
end
|
925
925
|
|
@@ -943,7 +943,7 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
|
|
943
943
|
end
|
944
944
|
|
945
945
|
it "should only qualify unqualified symbols, identifiers, or ordered versions in association's :order" do
|
946
|
-
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], {:table=>:albums, :left=>:id, :right=>:id}, [:albums_tags, :album_id, :tag_id]], :order=>[:blah__id.identifier
|
946
|
+
@c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], {:table=>:albums, :left=>:id, :right=>:id}, [:albums_tags, :album_id, :tag_id]], :order=>[Sequel.identifier(:blah__id), Sequel.identifier(:blah__id).desc, Sequel.desc(:blah__id), :blah__id, :album_id, Sequel.desc(:album_id), 1, Sequel.lit('RANDOM()'), Sequel.qualify(:b, :a)]
|
947
947
|
@c1.order(:artists__blah2, :artists__blah3).eager_graph(:tags).sql.should == 'SELECT artists.id, tags.id AS tags_id FROM artists LEFT OUTER JOIN albums_artists ON (albums_artists.artist_id = artists.id) LEFT OUTER JOIN albums ON (albums.id = albums_artists.album_id) LEFT OUTER JOIN albums_tags ON (albums_tags.album_id = albums.id) LEFT OUTER JOIN tags ON (tags.id = albums_tags.tag_id) ORDER BY artists.blah2, artists.blah3, tags.blah__id, tags.blah__id DESC, blah.id DESC, blah.id, tags.album_id, tags.album_id DESC, 1, RANDOM(), b.a'
|
948
948
|
end
|
949
949
|
|
@@ -3,7 +3,7 @@ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
3
3
|
describe "Sequel::Postgres::ArrayOp" do
|
4
4
|
before do
|
5
5
|
@db = Sequel.connect('mock://postgres', :quote_identifiers=>false)
|
6
|
-
@a = :a
|
6
|
+
@a = Sequel.pg_array_op(:a)
|
7
7
|
end
|
8
8
|
|
9
9
|
it "should support the standard mathematical operators" do
|
@@ -76,20 +76,28 @@ describe "Sequel::Postgres::ArrayOp" do
|
|
76
76
|
@a.pg_array.should equal(@a)
|
77
77
|
end
|
78
78
|
|
79
|
+
it "Sequel.pg_array_op should return arg for ArrayOp" do
|
80
|
+
Sequel.pg_array_op(@a).should equal(@a)
|
81
|
+
end
|
82
|
+
|
79
83
|
it "should be able to turn expressions into array ops using pg_array" do
|
80
|
-
@db.literal(
|
81
|
-
@db.literal(
|
84
|
+
@db.literal(Sequel.qualify(:b, :a).pg_array.push(3)).should == "(b.a || 3)"
|
85
|
+
@db.literal(Sequel.function(:a, :b).pg_array.push(3)).should == "(a(b) || 3)"
|
82
86
|
end
|
83
87
|
|
84
88
|
it "should be able to turn literal strings into array ops using pg_array" do
|
85
|
-
@db.literal('a'.
|
89
|
+
@db.literal(Sequel.lit('a').pg_array.unnest).should == "unnest(a)"
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should be able to turn symbols into array ops using Sequel.pg_array_op" do
|
93
|
+
@db.literal(Sequel.pg_array_op(:a).unnest).should == "unnest(a)"
|
86
94
|
end
|
87
95
|
|
88
|
-
it "should be able to turn symbols into array ops using pg_array" do
|
89
|
-
@db.literal(:a.
|
96
|
+
it "should be able to turn symbols into array ops using Sequel.pg_array" do
|
97
|
+
@db.literal(Sequel.pg_array(:a).unnest).should == "unnest(a)"
|
90
98
|
end
|
91
99
|
|
92
100
|
it "should allow transforming PGArray instances into ArrayOp instances" do
|
93
|
-
@db.literal([1,2].
|
101
|
+
@db.literal(Sequel.pg_array([1,2]).op.push(3)).should == "(ARRAY[1,2] || 3)"
|
94
102
|
end
|
95
103
|
end
|
@@ -1,17 +1,23 @@
|
|
1
1
|
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
2
2
|
|
3
3
|
describe "pg_array extension" do
|
4
|
+
before(:all) do
|
5
|
+
@pg_types = Sequel::Postgres::PG_TYPES.dup
|
6
|
+
end
|
7
|
+
after(:all) do
|
8
|
+
Sequel::Postgres::PG_TYPES.replace(@pg_types)
|
9
|
+
end
|
10
|
+
|
4
11
|
before do
|
5
12
|
@db = Sequel.connect('mock://postgres', :quote_identifiers=>false)
|
6
|
-
@db.extend(Module.new{def bound_variable_arg(arg, conn) arg end; def get_conversion_procs(conn) {} end})
|
7
13
|
@db.extend_datasets(Module.new{def supports_timestamp_timezones?; false; end; def supports_timestamp_usecs?; false; end})
|
8
14
|
@db.extension(:pg_array)
|
9
15
|
@m = Sequel::Postgres
|
10
|
-
@
|
16
|
+
@converter = @m::PG_TYPES
|
11
17
|
end
|
12
18
|
|
13
19
|
it "should parse single dimensional text arrays" do
|
14
|
-
c = @
|
20
|
+
c = @converter[1009]
|
15
21
|
c.call("{a}").to_a.first.should be_a_kind_of(String)
|
16
22
|
c.call("{}").to_a.should == []
|
17
23
|
c.call("{a}").to_a.should == ['a']
|
@@ -20,7 +26,7 @@ describe "pg_array extension" do
|
|
20
26
|
end
|
21
27
|
|
22
28
|
it "should parse multi-dimensional text arrays" do
|
23
|
-
c = @
|
29
|
+
c = @converter[1009]
|
24
30
|
c.call("{{}}").to_a.should == [[]]
|
25
31
|
c.call("{{a},{b}}").to_a.should == [['a'], ['b']]
|
26
32
|
c.call('{{"a b"},{c}}').to_a.should == [['a b'], ['c']]
|
@@ -29,12 +35,12 @@ describe "pg_array extension" do
|
|
29
35
|
end
|
30
36
|
|
31
37
|
it "should parse text arrays with embedded deliminaters" do
|
32
|
-
c = @
|
38
|
+
c = @converter[1009]
|
33
39
|
c.call('{{"{},","\\",\\,\\\\\\"\\""}}').to_a.should == [['{},', '",,\\""']]
|
34
40
|
end
|
35
41
|
|
36
42
|
it "should parse single dimensional integer arrays" do
|
37
|
-
c = @
|
43
|
+
c = @converter[1007]
|
38
44
|
c.call("{1}").to_a.first.should be_a_kind_of(Integer)
|
39
45
|
c.call("{}").to_a.should == []
|
40
46
|
c.call("{1}").to_a.should == [1]
|
@@ -43,7 +49,7 @@ describe "pg_array extension" do
|
|
43
49
|
end
|
44
50
|
|
45
51
|
it "should parse multiple dimensional integer arrays" do
|
46
|
-
c = @
|
52
|
+
c = @converter[1007]
|
47
53
|
c.call("{{}}").to_a.should == [[]]
|
48
54
|
c.call("{{1}}").to_a.should == [[1]]
|
49
55
|
c.call('{{2},{3}}').to_a.should == [[2], [3]]
|
@@ -51,7 +57,7 @@ describe "pg_array extension" do
|
|
51
57
|
end
|
52
58
|
|
53
59
|
it "should parse single dimensional float arrays" do
|
54
|
-
c = @
|
60
|
+
c = @converter[1022]
|
55
61
|
c.call("{}").to_a.should == []
|
56
62
|
c.call("{1.5}").to_a.should == [1.5]
|
57
63
|
c.call('{2.5,3.5}').to_a.should == [2.5, 3.5]
|
@@ -59,7 +65,7 @@ describe "pg_array extension" do
|
|
59
65
|
end
|
60
66
|
|
61
67
|
it "should parse multiple dimensional float arrays" do
|
62
|
-
c = @
|
68
|
+
c = @converter[1022]
|
63
69
|
c.call("{{}}").to_a.should == [[]]
|
64
70
|
c.call("{{1.5}}").to_a.should == [[1.5]]
|
65
71
|
c.call('{{2.5},{3.5}}').to_a.should == [[2.5], [3.5]]
|
@@ -67,14 +73,14 @@ describe "pg_array extension" do
|
|
67
73
|
end
|
68
74
|
|
69
75
|
it "should parse integers in float arrays as floats" do
|
70
|
-
c = @
|
76
|
+
c = @converter[1022]
|
71
77
|
c.call("{1}").to_a.first.should be_a_kind_of(Float)
|
72
78
|
c.call("{1}").to_a.should == [1.0]
|
73
79
|
c.call('{{{1,2},{3,4}},{{5,6},{7,8}}}').to_a.should == [[[1.0, 2.0], [3.0, 4.0]], [[5.0, 6.0], [7.0, 8.0]]]
|
74
80
|
end
|
75
81
|
|
76
82
|
it "should parse single dimensional decimal arrays" do
|
77
|
-
c = @
|
83
|
+
c = @converter[1231]
|
78
84
|
c.call("{}").to_a.should == []
|
79
85
|
c.call("{1.5}").to_a.should == [BigDecimal.new('1.5')]
|
80
86
|
c.call('{2.5,3.5}').to_a.should == [BigDecimal.new('2.5'), BigDecimal.new('3.5')]
|
@@ -82,7 +88,7 @@ describe "pg_array extension" do
|
|
82
88
|
end
|
83
89
|
|
84
90
|
it "should parse multiple dimensional decimal arrays" do
|
85
|
-
c = @
|
91
|
+
c = @converter[1231]
|
86
92
|
c.call("{{}}").to_a.should == [[]]
|
87
93
|
c.call("{{1.5}}").to_a.should == [[BigDecimal.new('1.5')]]
|
88
94
|
c.call('{{2.5},{3.5}}').to_a.should == [[BigDecimal.new('2.5')], [BigDecimal.new('3.5')]]
|
@@ -90,20 +96,20 @@ describe "pg_array extension" do
|
|
90
96
|
end
|
91
97
|
|
92
98
|
it "should parse decimal values with arbitrary precision" do
|
93
|
-
c = @
|
99
|
+
c = @converter[1231]
|
94
100
|
c.call("{1.000000000000000000005}").to_a.should == [BigDecimal.new('1.000000000000000000005')]
|
95
101
|
c.call("{{1.000000000000000000005,2.000000000000000000005},{3.000000000000000000005,4.000000000000000000005}}").to_a.should == [[BigDecimal.new('1.000000000000000000005'), BigDecimal.new('2.000000000000000000005')], [BigDecimal.new('3.000000000000000000005'), BigDecimal.new('4.000000000000000000005')]]
|
96
102
|
end
|
97
103
|
|
98
104
|
it "should parse integers in decimal arrays as BigDecimals" do
|
99
|
-
c = @
|
105
|
+
c = @converter[1231]
|
100
106
|
c.call("{1}").to_a.first.should be_a_kind_of(BigDecimal)
|
101
107
|
c.call("{1}").to_a.should == [BigDecimal.new('1')]
|
102
108
|
c.call('{{{1,2},{3,4}},{{5,6},{7,8}}}').to_a.should == [[[BigDecimal.new('1'), BigDecimal.new('2')], [BigDecimal.new('3'), BigDecimal.new('4')]], [[BigDecimal.new('5'), BigDecimal.new('6')], [BigDecimal.new('7'), BigDecimal.new('8')]]]
|
103
109
|
end
|
104
110
|
|
105
111
|
it "should parse arrays with NULL values" do
|
106
|
-
@
|
112
|
+
@converter.values_at(1007, 1009, 1022, 1231).each do |c|
|
107
113
|
c.call("{NULL}").should == [nil]
|
108
114
|
c.call("{NULL,NULL}").should == [nil,nil]
|
109
115
|
c.call("{{NULL,NULL},{NULL,NULL}}").should == [[nil,nil],[nil,nil]]
|
@@ -111,7 +117,7 @@ describe "pg_array extension" do
|
|
111
117
|
end
|
112
118
|
|
113
119
|
it 'should parse arrays with "NULL" values' do
|
114
|
-
c = @
|
120
|
+
c = @converter[1009]
|
115
121
|
c.call('{NULL,"NULL",NULL}').to_a.should == [nil, "NULL", nil]
|
116
122
|
c.call('{NULLA,"NULL",NULL}').to_a.should == ["NULLA", "NULL", nil]
|
117
123
|
end
|
@@ -146,15 +152,29 @@ describe "pg_array extension" do
|
|
146
152
|
@db.literal(@m::PGArray.new([nil, "{},[]'\""], :"varchar(255)")).should == "ARRAY[NULL,'{},[]''\"']::varchar(255)[]"
|
147
153
|
end
|
148
154
|
|
149
|
-
it "should have
|
150
|
-
@db.literal([1]
|
151
|
-
@db.literal([1, 2]
|
152
|
-
@db.literal([[[1], [2]], [[3], [4]]]
|
155
|
+
it "should have Sequel.pg_array method for easy PGArray creation" do
|
156
|
+
@db.literal(Sequel.pg_array([1])).should == 'ARRAY[1]'
|
157
|
+
@db.literal(Sequel.pg_array([1, 2], :int4)).should == 'ARRAY[1,2]::int4[]'
|
158
|
+
@db.literal(Sequel.pg_array([[[1], [2]], [[3], [4]]], :real)).should == 'ARRAY[[[1],[2]],[[3],[4]]]::real[]'
|
159
|
+
end
|
160
|
+
|
161
|
+
it "should have Sequel.pg_array return existing PGArrays as-is" do
|
162
|
+
a = Sequel.pg_array([1])
|
163
|
+
Sequel.pg_array(a).should equal(a)
|
164
|
+
end
|
165
|
+
|
166
|
+
it "should have Sequel.pg_array create a new PGArrays if type of existing does not match" do
|
167
|
+
a = Sequel.pg_array([1], :int4)
|
168
|
+
b = Sequel.pg_array(a, :int8)
|
169
|
+
a.should == b
|
170
|
+
a.should_not equal(b)
|
171
|
+
a.array_type.should == :int4
|
172
|
+
b.array_type.should == :int8
|
153
173
|
end
|
154
174
|
|
155
175
|
it "should support using arrays as bound variables" do
|
156
176
|
@db.bound_variable_arg(1, nil).should == 1
|
157
|
-
@db.bound_variable_arg([1,2]
|
177
|
+
@db.bound_variable_arg(Sequel.pg_array([1,2]), nil).should == '{1,2}'
|
158
178
|
@db.bound_variable_arg([1,2], nil).should == '{1,2}'
|
159
179
|
@db.bound_variable_arg([[1,2]], nil).should == '{{1,2}}'
|
160
180
|
@db.bound_variable_arg([1.0,2.0], nil).should == '{1.0,2.0}'
|
@@ -169,45 +189,44 @@ describe "pg_array extension" do
|
|
169
189
|
|
170
190
|
it "should support typecasting of the various array types" do
|
171
191
|
{
|
172
|
-
:integer=>{:class=>Integer, :convert=>['1',
|
173
|
-
:float=>{:db_type=>'double precision', :class=>Float, :convert=>['1.1',
|
174
|
-
:decimal=>{:db_type=>'numeric', :class=>BigDecimal, :convert=>['1.00000000000000000000000001',
|
175
|
-
:string=>{:db_type=>'text', :class=>String, :convert=>[
|
176
|
-
:bigint=>{:class=>Integer, :convert=>['1',
|
177
|
-
:boolean=>{:class=>TrueClass, :convert=>['t',
|
178
|
-
:blob=>{:db_type=>'bytea', :class=>Sequel::SQL::Blob, :convert=>['1', '1',
|
179
|
-
:date=>{:class=>Date, :convert=>['2011-10-12',
|
180
|
-
:time=>{:db_type=>'time without time zone', :class=>Sequel::SQLTime, :convert=>['01:02:03',
|
181
|
-
:datetime=>{:db_type=>'timestamp without time zone', :class=>Time, :convert=>['2011-10-12 01:02:03',
|
182
|
-
:time_timezone=>{:db_type=>'time with time zone', :class=>Sequel::SQLTime, :convert=>['01:02:03',
|
183
|
-
:datetime_timezone=>{:db_type=>'timestamp with time zone', :class=>Time, :convert=>['2011-10-12 01:02:03',
|
192
|
+
:integer=>{:class=>Integer, :convert=>['1', 1, '1']},
|
193
|
+
:float=>{:db_type=>'double precision', :class=>Float, :convert=>['1.1', 1.1, '1.1']},
|
194
|
+
:decimal=>{:db_type=>'numeric', :class=>BigDecimal, :convert=>['1.00000000000000000000000001', BigDecimal.new('1.00000000000000000000000001'), '1.00000000000000000000000001']},
|
195
|
+
:string=>{:db_type=>'text', :class=>String, :convert=>[1, '1', "'1'"]},
|
196
|
+
:bigint=>{:class=>Integer, :convert=>['1', 1, '1']},
|
197
|
+
:boolean=>{:class=>TrueClass, :convert=>['t', true, 'true']},
|
198
|
+
:blob=>{:db_type=>'bytea', :class=>Sequel::SQL::Blob, :convert=>['1', '1', "'1'"]},
|
199
|
+
:date=>{:class=>Date, :convert=>['2011-10-12', Date.new(2011, 10, 12), "'2011-10-12'"]},
|
200
|
+
:time=>{:db_type=>'time without time zone', :class=>Sequel::SQLTime, :convert=>['01:02:03', Sequel::SQLTime.create(1, 2, 3), "'01:02:03'"]},
|
201
|
+
:datetime=>{:db_type=>'timestamp without time zone', :class=>Time, :convert=>['2011-10-12 01:02:03', Time.local(2011, 10, 12, 1, 2, 3), "'2011-10-12 01:02:03'"]},
|
202
|
+
:time_timezone=>{:db_type=>'time with time zone', :class=>Sequel::SQLTime, :convert=>['01:02:03', Sequel::SQLTime.create(1, 2, 3), "'01:02:03'"]},
|
203
|
+
:datetime_timezone=>{:db_type=>'timestamp with time zone', :class=>Time, :convert=>['2011-10-12 01:02:03', Time.local(2011, 10, 12, 1, 2, 3), "'2011-10-12 01:02:03'"]},
|
184
204
|
}.each do |type, h|
|
185
205
|
meth = :"#{type}_array"
|
186
206
|
db_type = h[:db_type]||type
|
187
207
|
klass = h[:class]
|
188
|
-
|
208
|
+
array_in, value, output = h[:convert]
|
189
209
|
|
190
|
-
[
|
210
|
+
[[array_in]].each do |input|
|
191
211
|
v = @db.typecast_value(meth, input)
|
192
212
|
v.should == [value]
|
193
213
|
v.first.should be_a_kind_of(klass)
|
194
214
|
v.array_type.should_not be_nil
|
195
|
-
@db.typecast_value(meth, [value]
|
215
|
+
@db.typecast_value(meth, Sequel.pg_array([value])).should == v
|
196
216
|
@db.typecast_value(meth, v).should equal(v)
|
197
217
|
end
|
198
218
|
|
199
|
-
[
|
219
|
+
[[[array_in]]].each do |input|
|
200
220
|
v = @db.typecast_value(meth, input)
|
201
221
|
v.should == [[value]]
|
202
222
|
v.first.first.should be_a_kind_of(klass)
|
203
223
|
v.array_type.should_not be_nil
|
204
|
-
@db.typecast_value(meth, [[value]]
|
224
|
+
@db.typecast_value(meth, Sequel.pg_array([[value]])).should == v
|
205
225
|
@db.typecast_value(meth, v).should equal(v)
|
206
226
|
end
|
207
227
|
|
208
228
|
@db.literal(@db.typecast_value(meth, [array_in])).should == "ARRAY[#{output}]::#{db_type}[]"
|
209
|
-
@db.typecast_value(meth,
|
210
|
-
@db.literal(@db.typecast_value(meth, '{}')).should == "ARRAY[]::#{db_type}[]"
|
229
|
+
@db.literal(@db.typecast_value(meth, [])).should == "ARRAY[]::#{db_type}[]"
|
211
230
|
end
|
212
231
|
proc{@db.typecast_value(:integer_array, {})}.should raise_error(Sequel::InvalidValue)
|
213
232
|
end
|
@@ -227,18 +246,32 @@ describe "pg_array extension" do
|
|
227
246
|
end
|
228
247
|
|
229
248
|
it "should support using a block as a custom conversion proc given as block" do
|
230
|
-
Sequel::Postgres::PGArray.register('foo'){|s| (s*2).to_i}
|
231
|
-
@
|
249
|
+
Sequel::Postgres::PGArray.register('foo', :oid=>1234){|s| (s*2).to_i}
|
250
|
+
@converter[1234].call('{1}').should == [11]
|
232
251
|
end
|
233
252
|
|
234
253
|
it "should support using a block as a custom conversion proc given as :converter option" do
|
235
|
-
Sequel::Postgres::PGArray.register('foo', :converter=>proc{|s| (s*2).to_i})
|
236
|
-
@
|
254
|
+
Sequel::Postgres::PGArray.register('foo', :oid=>1234, :converter=>proc{|s| (s*2).to_i})
|
255
|
+
@converter[1234].call('{1}').should == [11]
|
237
256
|
end
|
238
257
|
|
239
258
|
it "should support using an existing scaler conversion proc via the :scalar_oid option" do
|
240
|
-
Sequel::Postgres::PGArray.register('foo', :scalar_oid=>16)
|
241
|
-
@
|
259
|
+
Sequel::Postgres::PGArray.register('foo', :oid=>1234, :scalar_oid=>16)
|
260
|
+
@converter[1234].call('{t}').should == [true]
|
261
|
+
end
|
262
|
+
|
263
|
+
it "should support using a given conversion procs hash via the :type_procs option" do
|
264
|
+
h = {16=>proc{|s| "!#{s}"}}
|
265
|
+
Sequel::Postgres::PGArray.register('foo', :oid=>1234, :scalar_oid=>16, :type_procs=>h)
|
266
|
+
h[1234].call('{t}').should == ["!t"]
|
267
|
+
end
|
268
|
+
|
269
|
+
it "should support adding methods to the given module via the :typecast_methods_module option" do
|
270
|
+
m = Module.new
|
271
|
+
Sequel::Postgres::PGArray.register('foo15', :scalar_typecast=>:boolean, :typecast_methods_module=>m)
|
272
|
+
@db.typecast_value(:foo15_array, ['t']).should == ['t']
|
273
|
+
@db.extend(m)
|
274
|
+
@db.typecast_value(:foo15_array, ['t']).should == [true]
|
242
275
|
end
|
243
276
|
|
244
277
|
it "should raise an error if using :scalar_oid option with unexisting scalar conversion proc" do
|
@@ -263,7 +296,7 @@ describe "pg_array extension" do
|
|
263
296
|
Sequel::Postgres::PG_TYPES[2].should be_a_kind_of(Sequel::Postgres::PGArray::JSONCreator)
|
264
297
|
end
|
265
298
|
|
266
|
-
it "should support registering
|
299
|
+
it "should support registering converters with :parser=>:json option" do
|
267
300
|
Sequel::Postgres::PGArray.register('foo', :oid=>4, :parser=>:json){|s| s * 2}
|
268
301
|
Sequel::Postgres::PG_TYPES[4].call('{{1, 2}, {3, 4}}').should == [[2, 4], [6, 8]]
|
269
302
|
end
|
@@ -280,7 +313,7 @@ describe "pg_array extension" do
|
|
280
313
|
end
|
281
314
|
|
282
315
|
it "should set appropriate timestamp conversion procs when getting conversion procs" do
|
283
|
-
procs = @db.
|
316
|
+
procs = @db.conversion_procs
|
284
317
|
procs[1185].call('{"2011-10-20 11:12:13"}').should == [Time.local(2011, 10, 20, 11, 12, 13)]
|
285
318
|
procs[1115].call('{"2011-10-20 11:12:13"}').should == [Time.local(2011, 10, 20, 11, 12, 13)]
|
286
319
|
end
|
@@ -21,8 +21,8 @@ describe "pg_auto_parameterize extension" do
|
|
21
21
|
pr.call(@db[:table], 'SELECT * FROM table WHERE (a = $1::double precision)', 1.1)
|
22
22
|
pr.call(@db[:table], 'SELECT * FROM table WHERE (a = $1::numeric)', BigDecimal.new('1.01'))
|
23
23
|
pr.call(@db[:table], 'SELECT * FROM table WHERE (a = $1)', "a")
|
24
|
-
pr.call(@db[:table], 'SELECT * FROM table WHERE (a = $1::bytea)', "a\0b"
|
25
|
-
pr.call(@db[:table], 'SELECT * FROM table WHERE (a = 1)', '1'
|
24
|
+
pr.call(@db[:table], 'SELECT * FROM table WHERE (a = $1::bytea)', Sequel.blob("a\0b"))
|
25
|
+
pr.call(@db[:table], 'SELECT * FROM table WHERE (a = 1)', Sequel.lit('1'), :nil)
|
26
26
|
pr.call(@db[:table], 'SELECT * FROM table WHERE (a = $1::time)', Sequel::SQLTime.create(1, 2, 3, 500000))
|
27
27
|
pr.call(@db[:table], 'SELECT * FROM table WHERE (a = $1::date)', Date.today)
|
28
28
|
pr.call(@db[:table], 'SELECT * FROM table WHERE (a = $1::timestamp)', DateTime.new(2012, 1, 2, 3, 4, 5))
|
@@ -3,7 +3,7 @@ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
3
3
|
describe "Sequel::Postgres::HStoreOp" do
|
4
4
|
before do
|
5
5
|
@ds = Sequel.connect('mock://postgres', :quote_identifiers=>false).dataset
|
6
|
-
@h = :h
|
6
|
+
@h = Sequel.hstore_op(:h)
|
7
7
|
end
|
8
8
|
|
9
9
|
it "#- should use the - operator" do
|
@@ -117,20 +117,24 @@ describe "Sequel::Postgres::HStoreOp" do
|
|
117
117
|
@ds.literal(@h.avals).should == "avals(h)"
|
118
118
|
end
|
119
119
|
|
120
|
-
it "should
|
121
|
-
|
122
|
-
@ds.literal(:a.sql_function(:b).hstore['a']).should == "(a(b) -> 'a')"
|
120
|
+
it "should have Sequel.hstore_op return HStoreOp instances as-is" do
|
121
|
+
Sequel.hstore_op(@h).should equal(@h)
|
123
122
|
end
|
124
123
|
|
125
|
-
it "should
|
126
|
-
|
124
|
+
it "should have Sequel.hstore return HStoreOp instances" do
|
125
|
+
Sequel.hstore(:h).should == @h
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should be able to turn expressions into hstore ops using hstore" do
|
129
|
+
@ds.literal(Sequel.qualify(:b, :a).hstore['a']).should == "(b.a -> 'a')"
|
130
|
+
@ds.literal(Sequel.function(:a, :b).hstore['a']).should == "(a(b) -> 'a')"
|
127
131
|
end
|
128
132
|
|
129
|
-
it "should be able to turn
|
130
|
-
@ds.literal(
|
133
|
+
it "should be able to turn literal strings into hstore ops using hstore" do
|
134
|
+
@ds.literal(Sequel.lit('a').hstore['a']).should == "(a -> 'a')"
|
131
135
|
end
|
132
136
|
|
133
137
|
it "should allow transforming HStore instances into HStoreOp instances" do
|
134
|
-
@ds.literal(
|
138
|
+
@ds.literal(Sequel.hstore('a'=>'b').op['a']).should == "('\"a\"=>\"b\"'::hstore -> 'a')"
|
135
139
|
end
|
136
140
|
end
|
@@ -3,7 +3,6 @@ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
3
3
|
describe "pg_hstore extension" do
|
4
4
|
before do
|
5
5
|
@db = Sequel.connect('mock://postgres', :quote_identifiers=>false)
|
6
|
-
@db.extend(Module.new{def bound_variable_arg(arg, conn) arg end})
|
7
6
|
@m = Sequel::Postgres
|
8
7
|
@c = @m::HStore
|
9
8
|
@db.extension :pg_hstore
|
@@ -25,28 +24,33 @@ describe "pg_hstore extension" do
|
|
25
24
|
end
|
26
25
|
|
27
26
|
it "should literalize HStores to strings correctly" do
|
28
|
-
@db.literal({}
|
29
|
-
@db.literal(
|
30
|
-
@db.literal(
|
31
|
-
@db.literal(
|
32
|
-
@db.literal(
|
33
|
-
['\'"a"=>"b","c"=>"d"\'::hstore', '\'"c"=>"d","a"=>"b"\'::hstore'].should include(@db.literal(
|
27
|
+
@db.literal(Sequel.hstore({})).should == '\'\'::hstore'
|
28
|
+
@db.literal(Sequel.hstore("a"=>"b")).should == '\'"a"=>"b"\'::hstore'
|
29
|
+
@db.literal(Sequel.hstore("c"=>nil)).should == '\'"c"=>NULL\'::hstore'
|
30
|
+
@db.literal(Sequel.hstore("c"=>'NULL')).should == '\'"c"=>"NULL"\'::hstore'
|
31
|
+
@db.literal(Sequel.hstore('c'=>'\ "\'=>')).should == '\'"c"=>"\\\\ \\"\'\'=>"\'::hstore'
|
32
|
+
['\'"a"=>"b","c"=>"d"\'::hstore', '\'"c"=>"d","a"=>"b"\'::hstore'].should include(@db.literal(Sequel.hstore("a"=>"b","c"=>"d")))
|
34
33
|
end
|
35
34
|
|
36
|
-
it "should have
|
37
|
-
{}.
|
35
|
+
it "should have Sequel.hstore method for creating HStore instances" do
|
36
|
+
Sequel.hstore({}).should be_a_kind_of(@c)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should have Sequel.hstore return HStores as-is" do
|
40
|
+
a = Sequel.hstore({})
|
41
|
+
Sequel.hstore(a).should equal(a)
|
38
42
|
end
|
39
43
|
|
40
44
|
it "should HStore#to_hash method for getting underlying hash" do
|
41
|
-
{}.
|
45
|
+
Sequel.hstore({}).to_hash.should be_a_kind_of(Hash)
|
42
46
|
end
|
43
47
|
|
44
48
|
it "should convert keys and values to strings on creation" do
|
45
|
-
|
49
|
+
Sequel.hstore(1=>2).to_hash.should == {"1"=>"2"}
|
46
50
|
end
|
47
51
|
|
48
52
|
it "should convert keys and values to strings on assignment" do
|
49
|
-
v = {}
|
53
|
+
v = Sequel.hstore({})
|
50
54
|
v[1] = 2
|
51
55
|
v.to_hash.should == {"1"=>"2"}
|
52
56
|
v.store(:'1', 3)
|
@@ -54,92 +58,92 @@ describe "pg_hstore extension" do
|
|
54
58
|
end
|
55
59
|
|
56
60
|
it "should not convert nil values to strings on creation" do
|
57
|
-
|
61
|
+
Sequel.hstore(:foo=>nil).to_hash.should == {"foo"=>nil}
|
58
62
|
end
|
59
63
|
|
60
64
|
it "should not convert nil values to strings on assignment" do
|
61
|
-
v = {}
|
65
|
+
v = Sequel.hstore({})
|
62
66
|
v[:foo] = nil
|
63
67
|
v.to_hash.should == {"foo"=>nil}
|
64
68
|
end
|
65
69
|
|
66
70
|
it "should convert lookups by key to string" do
|
67
|
-
|
68
|
-
|
71
|
+
Sequel.hstore('foo'=>'bar')[:foo].should == 'bar'
|
72
|
+
Sequel.hstore('1'=>'bar')[1].should == 'bar'
|
69
73
|
|
70
|
-
|
71
|
-
|
74
|
+
Sequel.hstore('foo'=>'bar').fetch(:foo).should == 'bar'
|
75
|
+
Sequel.hstore('foo'=>'bar').fetch(:foo2, 2).should == 2
|
72
76
|
k = nil
|
73
|
-
|
77
|
+
Sequel.hstore('foo2'=>'bar').fetch(:foo){|key| k = key }.should == 'foo'
|
74
78
|
k.should == 'foo'
|
75
79
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
80
|
+
Sequel.hstore('foo'=>'bar').has_key?(:foo).should be_true
|
81
|
+
Sequel.hstore('foo'=>'bar').has_key?(:bar).should be_false
|
82
|
+
Sequel.hstore('foo'=>'bar').key?(:foo).should be_true
|
83
|
+
Sequel.hstore('foo'=>'bar').key?(:bar).should be_false
|
84
|
+
Sequel.hstore('foo'=>'bar').member?(:foo).should be_true
|
85
|
+
Sequel.hstore('foo'=>'bar').member?(:bar).should be_false
|
86
|
+
Sequel.hstore('foo'=>'bar').include?(:foo).should be_true
|
87
|
+
Sequel.hstore('foo'=>'bar').include?(:bar).should be_false
|
84
88
|
|
85
|
-
|
89
|
+
Sequel.hstore('foo'=>'bar', '1'=>'2').values_at(:foo3, :foo, :foo2, 1).should == [nil, 'bar', nil, '2']
|
86
90
|
|
87
91
|
if RUBY_VERSION >= '1.9.0'
|
88
|
-
|
89
|
-
|
92
|
+
Sequel.hstore('foo'=>'bar').assoc(:foo).should == ['foo', 'bar']
|
93
|
+
Sequel.hstore('foo'=>'bar').assoc(:foo2).should == nil
|
90
94
|
end
|
91
95
|
end
|
92
96
|
|
93
97
|
it "should convert has_value?/value? lookups to string" do
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
+
Sequel.hstore('foo'=>'bar').has_value?(:bar).should be_true
|
99
|
+
Sequel.hstore('foo'=>'bar').has_value?(:foo).should be_false
|
100
|
+
Sequel.hstore('foo'=>'bar').value?(:bar).should be_true
|
101
|
+
Sequel.hstore('foo'=>'bar').value?(:foo).should be_false
|
98
102
|
end
|
99
103
|
|
100
104
|
it "should handle nil values in has_value?/value? lookups" do
|
101
|
-
|
102
|
-
|
103
|
-
|
105
|
+
Sequel.hstore('foo'=>'').has_value?('').should be_true
|
106
|
+
Sequel.hstore('foo'=>'').has_value?(nil).should be_false
|
107
|
+
Sequel.hstore('foo'=>nil).has_value?(nil).should be_true
|
104
108
|
end
|
105
109
|
|
106
110
|
it "should have underlying hash convert lookups by key to string" do
|
107
|
-
|
108
|
-
|
111
|
+
Sequel.hstore('foo'=>'bar').to_hash[:foo].should == 'bar'
|
112
|
+
Sequel.hstore('1'=>'bar').to_hash[1].should == 'bar'
|
109
113
|
end
|
110
114
|
|
111
115
|
if RUBY_VERSION >= '1.9.0'
|
112
116
|
it "should convert key lookups to string" do
|
113
|
-
|
114
|
-
|
117
|
+
Sequel.hstore('foo'=>'bar').key(:bar).should == 'foo'
|
118
|
+
Sequel.hstore('foo'=>'bar').key(:bar2).should be_nil
|
115
119
|
end
|
116
120
|
|
117
121
|
it "should handle nil values in key lookups" do
|
118
|
-
|
119
|
-
|
120
|
-
|
122
|
+
Sequel.hstore('foo'=>'').key('').should == 'foo'
|
123
|
+
Sequel.hstore('foo'=>'').key(nil).should == nil
|
124
|
+
Sequel.hstore('foo'=>nil).key(nil).should == 'foo'
|
121
125
|
end
|
122
126
|
|
123
127
|
it "should convert rassoc lookups to string" do
|
124
|
-
|
125
|
-
|
128
|
+
Sequel.hstore('foo'=>'bar').rassoc(:bar).should == ['foo', 'bar']
|
129
|
+
Sequel.hstore('foo'=>'bar').rassoc(:bar2).should be_nil
|
126
130
|
end
|
127
131
|
|
128
132
|
it "should handle nil values in rassoc lookups" do
|
129
|
-
|
130
|
-
|
131
|
-
|
133
|
+
Sequel.hstore('foo'=>'').rassoc('').should == ['foo', '']
|
134
|
+
Sequel.hstore('foo'=>'').rassoc(nil).should == nil
|
135
|
+
Sequel.hstore('foo'=>nil).rassoc(nil).should == ['foo', nil]
|
132
136
|
end
|
133
137
|
end
|
134
138
|
|
135
139
|
it "should have delete convert key to string" do
|
136
|
-
v =
|
140
|
+
v = Sequel.hstore('foo'=>'bar')
|
137
141
|
v.delete(:foo).should == 'bar'
|
138
142
|
v.to_hash.should == {}
|
139
143
|
end
|
140
144
|
|
141
145
|
it "should handle #replace with hashes that do not use strings" do
|
142
|
-
v =
|
146
|
+
v = Sequel.hstore('foo'=>'bar')
|
143
147
|
v.replace(:bar=>1)
|
144
148
|
v.should be_a_kind_of(@c)
|
145
149
|
v.should == {'bar'=>'1'}
|
@@ -147,18 +151,18 @@ describe "pg_hstore extension" do
|
|
147
151
|
end
|
148
152
|
|
149
153
|
it "should handle #merge with hashes that do not use strings" do
|
150
|
-
v =
|
154
|
+
v = Sequel.hstore('foo'=>'bar').merge(:bar=>1)
|
151
155
|
v.should be_a_kind_of(@c)
|
152
156
|
v.should == {'foo'=>'bar', 'bar'=>'1'}
|
153
157
|
end
|
154
158
|
|
155
159
|
it "should handle #merge/#update with hashes that do not use strings" do
|
156
|
-
v =
|
160
|
+
v = Sequel.hstore('foo'=>'bar')
|
157
161
|
v.merge!(:bar=>1)
|
158
162
|
v.should be_a_kind_of(@c)
|
159
163
|
v.should == {'foo'=>'bar', 'bar'=>'1'}
|
160
164
|
|
161
|
-
v =
|
165
|
+
v = Sequel.hstore('foo'=>'bar')
|
162
166
|
v.update(:bar=>1)
|
163
167
|
v.should be_a_kind_of(@c)
|
164
168
|
v.should == {'foo'=>'bar', 'bar'=>'1'}
|
@@ -167,11 +171,11 @@ describe "pg_hstore extension" do
|
|
167
171
|
it "should support using hstores as bound variables" do
|
168
172
|
@db.bound_variable_arg(1, nil).should == 1
|
169
173
|
@db.bound_variable_arg({'1'=>'2'}, nil).should == '"1"=>"2"'
|
170
|
-
@db.bound_variable_arg(
|
171
|
-
@db.bound_variable_arg(
|
172
|
-
@db.bound_variable_arg(
|
173
|
-
@db.bound_variable_arg(
|
174
|
-
['"a"=>"b","c"=>"d"', '"c"=>"d","a"=>"b"'].should include(@db.bound_variable_arg(
|
174
|
+
@db.bound_variable_arg(Sequel.hstore('1'=>'2'), nil).should == '"1"=>"2"'
|
175
|
+
@db.bound_variable_arg(Sequel.hstore('1'=>nil), nil).should == '"1"=>NULL'
|
176
|
+
@db.bound_variable_arg(Sequel.hstore('1'=>"NULL"), nil).should == '"1"=>"NULL"'
|
177
|
+
@db.bound_variable_arg(Sequel.hstore('1'=>"'\\ \"=>"), nil).should == '"1"=>"\'\\\\ \\"=>"'
|
178
|
+
['"a"=>"b","c"=>"d"', '"c"=>"d","a"=>"b"'].should include(@db.bound_variable_arg(Sequel.hstore("a"=>"b","c"=>"d"), nil))
|
175
179
|
end
|
176
180
|
|
177
181
|
it "should parse hstore type from the schema correctly" do
|
@@ -180,14 +184,11 @@ describe "pg_hstore extension" do
|
|
180
184
|
end
|
181
185
|
|
182
186
|
it "should support typecasting for the hstore type" do
|
183
|
-
h =
|
187
|
+
h = Sequel.hstore(1=>2)
|
184
188
|
@db.typecast_value(:hstore, h).should equal(h)
|
185
|
-
@db.typecast_value(:hstore, '').should be_a_kind_of(@c)
|
186
|
-
@db.typecast_value(:hstore, '').should == {}.hstore
|
187
|
-
@db.typecast_value(:hstore, '"a"=>"b"').should == {"a"=>"b"}.hstore
|
188
189
|
@db.typecast_value(:hstore, {}).should be_a_kind_of(@c)
|
189
|
-
@db.typecast_value(:hstore, {}).should == {}
|
190
|
-
@db.typecast_value(:hstore, {'a'=>'b'}).should ==
|
190
|
+
@db.typecast_value(:hstore, {}).should == Sequel.hstore({})
|
191
|
+
@db.typecast_value(:hstore, {'a'=>'b'}).should == Sequel.hstore("a"=>"b")
|
191
192
|
proc{@db.typecast_value(:hstore, [])}.should raise_error(Sequel::InvalidValue)
|
192
193
|
end
|
193
194
|
end
|