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
@@ -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
|