sequel_core 2.2.0 → 3.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. metadata +30 -101
  2. data/CHANGELOG +0 -1519
  3. data/COPYING +0 -19
  4. data/README +0 -313
  5. data/Rakefile +0 -158
  6. data/bin/sequel +0 -117
  7. data/doc/cheat_sheet.rdoc +0 -225
  8. data/doc/dataset_filtering.rdoc +0 -182
  9. data/lib/sequel_core.rb +0 -136
  10. data/lib/sequel_core/adapters/adapter_skeleton.rb +0 -68
  11. data/lib/sequel_core/adapters/ado.rb +0 -90
  12. data/lib/sequel_core/adapters/db2.rb +0 -160
  13. data/lib/sequel_core/adapters/dbi.rb +0 -127
  14. data/lib/sequel_core/adapters/informix.rb +0 -89
  15. data/lib/sequel_core/adapters/jdbc.rb +0 -110
  16. data/lib/sequel_core/adapters/mysql.rb +0 -486
  17. data/lib/sequel_core/adapters/odbc.rb +0 -167
  18. data/lib/sequel_core/adapters/odbc_mssql.rb +0 -106
  19. data/lib/sequel_core/adapters/openbase.rb +0 -76
  20. data/lib/sequel_core/adapters/oracle.rb +0 -182
  21. data/lib/sequel_core/adapters/postgres.rb +0 -560
  22. data/lib/sequel_core/adapters/sqlite.rb +0 -270
  23. data/lib/sequel_core/connection_pool.rb +0 -194
  24. data/lib/sequel_core/core_ext.rb +0 -197
  25. data/lib/sequel_core/core_sql.rb +0 -184
  26. data/lib/sequel_core/database.rb +0 -462
  27. data/lib/sequel_core/database/schema.rb +0 -156
  28. data/lib/sequel_core/dataset.rb +0 -457
  29. data/lib/sequel_core/dataset/callback.rb +0 -13
  30. data/lib/sequel_core/dataset/convenience.rb +0 -245
  31. data/lib/sequel_core/dataset/pagination.rb +0 -96
  32. data/lib/sequel_core/dataset/query.rb +0 -41
  33. data/lib/sequel_core/dataset/schema.rb +0 -15
  34. data/lib/sequel_core/dataset/sql.rb +0 -889
  35. data/lib/sequel_core/deprecated.rb +0 -26
  36. data/lib/sequel_core/exceptions.rb +0 -42
  37. data/lib/sequel_core/migration.rb +0 -187
  38. data/lib/sequel_core/object_graph.rb +0 -216
  39. data/lib/sequel_core/pretty_table.rb +0 -71
  40. data/lib/sequel_core/schema.rb +0 -2
  41. data/lib/sequel_core/schema/generator.rb +0 -239
  42. data/lib/sequel_core/schema/sql.rb +0 -326
  43. data/lib/sequel_core/sql.rb +0 -812
  44. data/lib/sequel_core/worker.rb +0 -68
  45. data/spec/adapters/informix_spec.rb +0 -96
  46. data/spec/adapters/mysql_spec.rb +0 -765
  47. data/spec/adapters/oracle_spec.rb +0 -222
  48. data/spec/adapters/postgres_spec.rb +0 -441
  49. data/spec/adapters/sqlite_spec.rb +0 -413
  50. data/spec/connection_pool_spec.rb +0 -363
  51. data/spec/core_ext_spec.rb +0 -156
  52. data/spec/core_sql_spec.rb +0 -427
  53. data/spec/database_spec.rb +0 -963
  54. data/spec/dataset_spec.rb +0 -2933
  55. data/spec/expression_filters_spec.rb +0 -316
  56. data/spec/migration_spec.rb +0 -261
  57. data/spec/object_graph_spec.rb +0 -230
  58. data/spec/pretty_table_spec.rb +0 -58
  59. data/spec/rcov.opts +0 -6
  60. data/spec/schema_generator_spec.rb +0 -122
  61. data/spec/schema_spec.rb +0 -422
  62. data/spec/spec.opts +0 -0
  63. data/spec/spec_config.rb +0 -7
  64. data/spec/spec_config.rb.example +0 -8
  65. data/spec/spec_helper.rb +0 -55
  66. data/spec/worker_spec.rb +0 -96
@@ -1,222 +0,0 @@
1
- require File.join(File.dirname(__FILE__), '../spec_helper.rb')
2
-
3
- unless defined?(ORACLE_DB)
4
- ORACLE_DB = Sequel.connect('oracle://hr:hr@localhost/XE')
5
- end
6
-
7
- if ORACLE_DB.table_exists?(:items)
8
- ORACLE_DB.drop_table :items
9
- end
10
- ORACLE_DB.create_table :items do
11
- varchar2 :name, :size => 50
12
- number :value, :size => 38
13
-
14
- index :value
15
- end
16
-
17
- if ORACLE_DB.table_exists?(:books)
18
- ORACLE_DB.drop_table :books
19
- end
20
- ORACLE_DB.create_table :books do
21
- number :id, :size => 38
22
- varchar2 :title, :size => 50
23
- number :category_id, :size => 38
24
- end
25
-
26
- if ORACLE_DB.table_exists?(:categories)
27
- ORACLE_DB.drop_table :categories
28
- end
29
- ORACLE_DB.create_table :categories do
30
- number :id, :size => 38
31
- varchar2 :cat_name, :size => 50
32
- end
33
-
34
- context "An Oracle database" do
35
- specify "should provide disconnect functionality" do
36
- ORACLE_DB.execute("select user from dual")
37
- ORACLE_DB.pool.size.should == 1
38
- ORACLE_DB.disconnect
39
- ORACLE_DB.pool.size.should == 0
40
- end
41
- end
42
-
43
- context "An Oracle dataset" do
44
- setup do
45
- @d = ORACLE_DB[:items]
46
- @d.delete # remove all records
47
- end
48
-
49
- specify "should return the correct record count" do
50
- @d.count.should == 0
51
- @d << {:name => 'abc', :value => 123}
52
- @d << {:name => 'abc', :value => 456}
53
- @d << {:name => 'def', :value => 789}
54
- @d.count.should == 3
55
- end
56
-
57
- specify "should return the correct records" do
58
- @d.to_a.should == []
59
- @d << {:name => 'abc', :value => 123}
60
- @d << {:name => 'abc', :value => 456}
61
- @d << {:name => 'def', :value => 789}
62
-
63
- @d.order(:value).to_a.should == [
64
- {:name => 'abc', :value => 123},
65
- {:name => 'abc', :value => 456},
66
- {:name => 'def', :value => 789}
67
- ]
68
-
69
- @d.select(:name).uniq.order_by(:name).to_a.should == [
70
- {:name => 'abc'},
71
- {:name => 'def'}
72
- ]
73
-
74
- @d.order(:value.DESC).limit(1).to_a.should == [
75
- {:name => 'def', :value => 789}
76
- ]
77
-
78
- @d.filter(:name => 'abc').to_a.should == [
79
- {:name => 'abc', :value => 123},
80
- {:name => 'abc', :value => 456}
81
- ]
82
-
83
- @d.order(:value.DESC).filter(:name => 'abc').to_a.should == [
84
- {:name => 'abc', :value => 456},
85
- {:name => 'abc', :value => 123}
86
- ]
87
-
88
- @d.filter(:name => 'abc').limit(1).to_a.should == [
89
- {:name => 'abc', :value => 123}
90
- ]
91
-
92
- @d.filter(:name => 'abc').order(:value.DESC).limit(1).to_a.should == [
93
- {:name => 'abc', :value => 456}
94
- ]
95
-
96
- @d.filter(:name => 'abc').order(:value).limit(1).to_a.should == [
97
- {:name => 'abc', :value => 123}
98
- ]
99
-
100
- @d.order(:value).limit(1).to_a.should == [
101
- {:name => 'abc', :value => 123}
102
- ]
103
-
104
- @d.order(:value).limit(1, 1).to_a.should == [
105
- {:name => 'abc', :value => 456}
106
- ]
107
-
108
- @d.order(:value).limit(1, 2).to_a.should == [
109
- {:name => 'def', :value => 789}
110
- ]
111
-
112
- @d.avg(:value).to_i.should == (789+123+456)/3
113
-
114
- @d.max(:value).to_i.should == 789
115
-
116
- @d.select(:name, :AVG[:value]).filter(:name => 'abc').group(:name).to_a.should == [
117
- {:name => 'abc', :"avg(value)" => (456+123)/2.0}
118
- ]
119
-
120
- @d.select(:AVG[:value]).group(:name).order(:name).limit(1).to_a.should == [
121
- {:"avg(value)" => (456+123)/2.0}
122
- ]
123
-
124
- @d.select(:name, :AVG[:value]).group(:name).order(:name).to_a.should == [
125
- {:name => 'abc', :"avg(value)" => (456+123)/2.0},
126
- {:name => 'def', :"avg(value)" => 789*1.0}
127
- ]
128
-
129
- @d.select(:name, :AVG[:value]).group(:name).order(:name).to_a.should == [
130
- {:name => 'abc', :"avg(value)" => (456+123)/2.0},
131
- {:name => 'def', :"avg(value)" => 789*1.0}
132
- ]
133
-
134
- @d.select(:name, :AVG[:value]).group(:name).having(:name => ['abc', 'def']).order(:name).to_a.should == [
135
- {:name => 'abc', :"avg(value)" => (456+123)/2.0},
136
- {:name => 'def', :"avg(value)" => 789*1.0}
137
- ]
138
-
139
- @d.select(:name, :value).filter(:name => 'abc').union(@d.select(:name, :value).filter(:name => 'def')).order(:value).to_a.should == [
140
- {:name => 'abc', :value => 123},
141
- {:name => 'abc', :value => 456},
142
- {:name => 'def', :value => 789}
143
- ]
144
-
145
- end
146
-
147
- specify "should update records correctly" do
148
- @d << {:name => 'abc', :value => 123}
149
- @d << {:name => 'abc', :value => 456}
150
- @d << {:name => 'def', :value => 789}
151
- @d.filter(:name => 'abc').update(:value => 530)
152
-
153
- # the third record should stay the same
154
- # floating-point precision bullshit
155
- @d[:name => 'def'][:value].should == 789
156
- @d.filter(:value => 530).count.should == 2
157
- end
158
-
159
- specify "should delete records correctly" do
160
- @d << {:name => 'abc', :value => 123}
161
- @d << {:name => 'abc', :value => 456}
162
- @d << {:name => 'def', :value => 789}
163
- @d.filter(:name => 'abc').delete
164
-
165
- @d.count.should == 1
166
- @d.first[:name].should == 'def'
167
- end
168
-
169
- specify "should be able to literalize booleans" do
170
- proc {@d.literal(true)}.should_not raise_error
171
- proc {@d.literal(false)}.should_not raise_error
172
- end
173
-
174
- specify "should support transactions" do
175
- ORACLE_DB.transaction do
176
- @d << {:name => 'abc', :value => 1}
177
- end
178
-
179
- @d.count.should == 1
180
- end
181
- end
182
-
183
- context "Joined Oracle dataset" do
184
- setup do
185
- @d1 = ORACLE_DB[:books]
186
- @d1.delete # remove all records
187
- @d1 << {:id => 1, :title => 'aaa', :category_id => 100}
188
- @d1 << {:id => 2, :title => 'bbb', :category_id => 100}
189
- @d1 << {:id => 3, :title => 'ccc', :category_id => 101}
190
- @d1 << {:id => 4, :title => 'ddd', :category_id => 102}
191
-
192
- @d2 = ORACLE_DB[:categories]
193
- @d2.delete # remove all records
194
- @d2 << {:id => 100, :cat_name => 'ruby'}
195
- @d2 << {:id => 101, :cat_name => 'rails'}
196
- end
197
-
198
- specify "should return correct result" do
199
- @d1.join(:categories, :id => :category_id).select(:books__id, :title, :cat_name).order(:books__id).to_a.should == [
200
- {:id => 1, :title => 'aaa', :cat_name => 'ruby'},
201
- {:id => 2, :title => 'bbb', :cat_name => 'ruby'},
202
- {:id => 3, :title => 'ccc', :cat_name => 'rails'}
203
- ]
204
-
205
- @d1.join(:categories, :id => :category_id).select(:books__id, :title, :cat_name).order(:books__id).limit(2, 1).to_a.should == [
206
- {:id => 2, :title => 'bbb', :cat_name => 'ruby'},
207
- {:id => 3, :title => 'ccc', :cat_name => 'rails'},
208
- ]
209
-
210
- @d1.left_outer_join(:categories, :id => :category_id).select(:books__id, :title, :cat_name).order(:books__id).to_a.should == [
211
- {:id => 1, :title => 'aaa', :cat_name => 'ruby'},
212
- {:id => 2, :title => 'bbb', :cat_name => 'ruby'},
213
- {:id => 3, :title => 'ccc', :cat_name => 'rails'},
214
- {:id => 4, :title => 'ddd', :cat_name => nil}
215
- ]
216
-
217
- @d1.left_outer_join(:categories, :id => :category_id).select(:books__id, :title, :cat_name).order(:books__id.DESC).limit(2, 0).to_a.should == [
218
- {:id => 4, :title => 'ddd', :cat_name => nil},
219
- {:id => 3, :title => 'ccc', :cat_name => 'rails'}
220
- ]
221
- end
222
- end
@@ -1,441 +0,0 @@
1
- require File.join(File.dirname(__FILE__), '../spec_helper.rb')
2
-
3
- unless defined?(POSTGRES_DB)
4
- POSTGRES_URL = 'postgres://postgres:postgres@localhost:5432/reality_spec' unless defined? POSTGRES_URL
5
- POSTGRES_DB = Sequel.connect(ENV['SEQUEL_PG_SPEC_DB']||POSTGRES_URL)
6
- end
7
-
8
- POSTGRES_DB.create_table! :test do
9
- text :name
10
- integer :value, :index => true
11
- end
12
- POSTGRES_DB.create_table! :test2 do
13
- text :name
14
- integer :value
15
- end
16
- POSTGRES_DB.create_table! :test3 do
17
- integer :value
18
- timestamp :time
19
- end
20
- POSTGRES_DB.create_table! :test4 do
21
- varchar :name, :size => 20
22
- bytea :value
23
- end
24
-
25
- context "A PostgreSQL database" do
26
- setup do
27
- @db = POSTGRES_DB
28
- end
29
-
30
- specify "should provide disconnect functionality" do
31
- @db.tables
32
- @db.pool.size.should == 1
33
- @db.disconnect
34
- @db.pool.size.should == 0
35
- end
36
-
37
- specify "should provide the server version" do
38
- @db.server_version.should > 70000
39
- end
40
-
41
- specify "should raise Sequel::Error on error" do
42
- proc{@db << "SELECT 1 + 'a'"}.should raise_error(Sequel::Error)
43
- end
44
-
45
- specify "should correctly parse the schema" do
46
- @db.schema(:test3, :reload=>true).should == [
47
- [:value, {:type=>:integer, :allow_null=>true, :max_chars=>nil, :default=>nil, :db_type=>"integer", :numeric_precision=>32}],
48
- [:time, {:type=>:datetime, :allow_null=>true, :max_chars=>nil, :default=>nil, :db_type=>"timestamp without time zone", :numeric_precision=>nil}]
49
- ]
50
- @db.schema(:test4, :reload=>true).should == [
51
- [:name, {:type=>:string, :allow_null=>true, :max_chars=>20, :default=>nil, :db_type=>"character varying", :numeric_precision=>nil}],
52
- [:value, {:type=>:blob, :allow_null=>true, :max_chars=>nil, :default=>nil, :db_type=>"bytea", :numeric_precision=>nil}]
53
- ]
54
- end
55
-
56
- specify "should get the schema all database tables if no table name is used" do
57
- @db.schema(:test3, :reload=>true).should == @db.schema(nil, :reload=>true)[:test3]
58
- end
59
- end
60
-
61
- context "A PostgreSQL dataset" do
62
- setup do
63
- @d = POSTGRES_DB[:test]
64
- @d.delete # remove all records
65
- end
66
-
67
- specify "should return the correct record count" do
68
- @d.count.should == 0
69
- @d << {:name => 'abc', :value => 123}
70
- @d << {:name => 'abc', :value => 456}
71
- @d << {:name => 'def', :value => 789}
72
- @d.count.should == 3
73
- end
74
-
75
- specify "should return the correct records" do
76
- @d.to_a.should == []
77
- @d << {:name => 'abc', :value => 123}
78
- @d << {:name => 'abc', :value => 456}
79
- @d << {:name => 'def', :value => 789}
80
-
81
- @d.order(:value).to_a.should == [
82
- {:name => 'abc', :value => 123},
83
- {:name => 'abc', :value => 456},
84
- {:name => 'def', :value => 789}
85
- ]
86
- end
87
-
88
- specify "should update records correctly" do
89
- @d << {:name => 'abc', :value => 123}
90
- @d << {:name => 'abc', :value => 456}
91
- @d << {:name => 'def', :value => 789}
92
- @d.filter(:name => 'abc').update(:value => 530)
93
-
94
- # the third record should stay the same
95
- # floating-point precision bullshit
96
- @d[:name => 'def'][:value].should == 789
97
- @d.filter(:value => 530).count.should == 2
98
- end
99
-
100
- specify "should delete records correctly" do
101
- @d << {:name => 'abc', :value => 123}
102
- @d << {:name => 'abc', :value => 456}
103
- @d << {:name => 'def', :value => 789}
104
- @d.filter(:name => 'abc').delete
105
-
106
- @d.count.should == 1
107
- @d.first[:name].should == 'def'
108
- end
109
-
110
- specify "should be able to literalize booleans" do
111
- proc {@d.literal(true)}.should_not raise_error
112
- proc {@d.literal(false)}.should_not raise_error
113
- end
114
-
115
- specify "should quote columns and tables using double quotes if quoting identifiers" do
116
- @d.quote_identifiers = true
117
- @d.select(:name).sql.should == \
118
- 'SELECT "name" FROM "test"'
119
-
120
- @d.select('COUNT(*)'.lit).sql.should == \
121
- 'SELECT COUNT(*) FROM "test"'
122
-
123
- @d.select(:max[:value]).sql.should == \
124
- 'SELECT max("value") FROM "test"'
125
-
126
- @d.select(:NOW[]).sql.should == \
127
- 'SELECT NOW() FROM "test"'
128
-
129
- @d.select(:max[:items__value]).sql.should == \
130
- 'SELECT max("items"."value") FROM "test"'
131
-
132
- @d.order(:name.desc).sql.should == \
133
- 'SELECT * FROM "test" ORDER BY "name" DESC'
134
-
135
- @d.select('test.name AS item_name'.lit).sql.should == \
136
- 'SELECT test.name AS item_name FROM "test"'
137
-
138
- @d.select('"name"'.lit).sql.should == \
139
- 'SELECT "name" FROM "test"'
140
-
141
- @d.select('max(test."name") AS "max_name"'.lit).sql.should == \
142
- 'SELECT max(test."name") AS "max_name" FROM "test"'
143
-
144
- @d.select(:test[:abc, 'hello']).sql.should == \
145
- "SELECT test(\"abc\", 'hello') FROM \"test\""
146
-
147
- @d.select(:test[:abc__def, 'hello']).sql.should == \
148
- "SELECT test(\"abc\".\"def\", 'hello') FROM \"test\""
149
-
150
- @d.select(:test[:abc__def, 'hello'].as(:x2)).sql.should == \
151
- "SELECT test(\"abc\".\"def\", 'hello') AS \"x2\" FROM \"test\""
152
-
153
- @d.insert_sql(:value => 333).should == \
154
- 'INSERT INTO "test" ("value") VALUES (333)'
155
-
156
- @d.insert_sql(:x => :y).should == \
157
- 'INSERT INTO "test" ("x") VALUES ("y")'
158
- end
159
-
160
- specify "should quote fields correctly when reversing the order if quoting identifiers" do
161
- @d.quote_identifiers = true
162
- @d.reverse_order(:name).sql.should == \
163
- 'SELECT * FROM "test" ORDER BY "name" DESC'
164
-
165
- @d.reverse_order(:name.desc).sql.should == \
166
- 'SELECT * FROM "test" ORDER BY "name" ASC'
167
-
168
- @d.reverse_order(:name, :test.desc).sql.should == \
169
- 'SELECT * FROM "test" ORDER BY "name" DESC, "test" ASC'
170
-
171
- @d.reverse_order(:name.desc, :test).sql.should == \
172
- 'SELECT * FROM "test" ORDER BY "name" ASC, "test" DESC'
173
- end
174
-
175
- specify "should support transactions" do
176
- POSTGRES_DB.transaction do
177
- @d << {:name => 'abc', :value => 1}
178
- end
179
-
180
- @d.count.should == 1
181
- end
182
-
183
- specify "should have #transaction yield the connection" do
184
- POSTGRES_DB.transaction do |conn|
185
- conn.should be_a_kind_of(Sequel::Postgres::Adapter)
186
- end
187
- end
188
-
189
- specify "should correctly rollback transactions" do
190
- proc do
191
- POSTGRES_DB.transaction do
192
- @d << {:name => 'abc', :value => 1}
193
- raise Interrupt, 'asdf'
194
- end
195
- end.should raise_error(Interrupt)
196
-
197
- @d.count.should == 0
198
- end
199
-
200
- specify "should handle returning inside of the block by committing" do
201
- def POSTGRES_DB.ret_commit
202
- transaction do
203
- self[:test] << {:name => 'abc'}
204
- return
205
- self[:test] << {:name => 'd'}
206
- end
207
- end
208
- @d.count.should == 0
209
- POSTGRES_DB.ret_commit
210
- @d.count.should == 1
211
- POSTGRES_DB.ret_commit
212
- @d.count.should == 2
213
- proc do
214
- POSTGRES_DB.transaction do
215
- raise Interrupt, 'asdf'
216
- end
217
- end.should raise_error(Interrupt)
218
-
219
- @d.count.should == 2
220
- end
221
-
222
- specify "should support nested transactions through savepoints" do
223
- POSTGRES_DB.transaction do
224
- @d << {:name => '1'}
225
- POSTGRES_DB.transaction do
226
- @d << {:name => '2'}
227
- POSTGRES_DB.transaction do
228
- @d << {:name => '3'}
229
- raise Sequel::Error::Rollback
230
- end
231
- @d << {:name => '4'}
232
- POSTGRES_DB.transaction do
233
- @d << {:name => '6'}
234
- POSTGRES_DB.transaction do
235
- @d << {:name => '7'}
236
- end
237
- raise Sequel::Error::Rollback
238
- end
239
- @d << {:name => '5'}
240
- end
241
- end
242
-
243
- @d.count.should == 4
244
- @d.order(:name).map(:name).should == %w{1 2 4 5}
245
- end
246
-
247
- specify "should support regexps" do
248
- @d << {:name => 'abc', :value => 1}
249
- @d << {:name => 'bcd', :value => 2}
250
- @d.filter(:name => /bc/).count.should == 2
251
- @d.filter(:name => /^bc/).count.should == 1
252
- end
253
-
254
- specify "should correctly escape strings" do
255
- POSTGRES_DB['SELECT ? AS a', "\\dingo"].get(:a) == "\\dingo"
256
- end
257
-
258
- specify "should properly escape binary data" do
259
- POSTGRES_DB['SELECT ? AS a', "\1\2\3".to_blob].get(:a) == "\1\2\3"
260
- end
261
-
262
- specify "should retrieve binary data as Blob object" do
263
- d = POSTGRES_DB[:test4]
264
- d << {:name => '123', :value => "\1\2\3".to_blob}
265
- retrieved_binary_value = d[:name => '123'][:value]
266
- retrieved_binary_value.should be_a_kind_of(::Sequel::SQL::Blob)
267
- retrieved_binary_value.should == "\1\2\3"
268
- retrieved_binary_value = d[:value => "\1\2\3".to_blob][:value]
269
- retrieved_binary_value.should be_a_kind_of(::Sequel::SQL::Blob)
270
- retrieved_binary_value.should == "\1\2\3"
271
- end
272
-
273
- specify "should properly receive binary data" do
274
- POSTGRES_DB['SELECT ?::bytea AS a', "a"].get(:a) == "a"
275
- end
276
- end
277
-
278
- context "A PostgreSQL dataaset with a timestamp field" do
279
- setup do
280
- @d = POSTGRES_DB[:test3]
281
- @d.delete
282
- end
283
-
284
- specify "should store milliseconds in time fields" do
285
- t = Time.now
286
- @d << {:value=>1, :time=>t}
287
- @d[:value =>'1'][:time].should == t
288
- @d[:value=>'1'][:time].usec.should == t.usec
289
- end
290
- end
291
-
292
- context "A PostgreSQL database" do
293
- setup do
294
- @db = POSTGRES_DB
295
- end
296
-
297
- specify "should support column operations" do
298
- @db.create_table!(:test2){text :name; integer :value}
299
- @db[:test2] << {}
300
- @db[:test2].columns.should == [:name, :value]
301
-
302
- @db.add_column :test2, :xyz, :text, :default => '000'
303
- @db[:test2].columns.should == [:name, :value, :xyz]
304
- @db[:test2] << {:name => 'mmm', :value => 111}
305
- @db[:test2].first[:xyz].should == '000'
306
-
307
- @db[:test2].columns.should == [:name, :value, :xyz]
308
- @db.drop_column :test2, :xyz
309
-
310
- @db[:test2].columns.should == [:name, :value]
311
-
312
- @db[:test2].delete
313
- @db.add_column :test2, :xyz, :text, :default => '000'
314
- @db[:test2] << {:name => 'mmm', :value => 111, :xyz => 'qqqq'}
315
-
316
- @db[:test2].columns.should == [:name, :value, :xyz]
317
- @db.rename_column :test2, :xyz, :zyx
318
- @db[:test2].columns.should == [:name, :value, :zyx]
319
- @db[:test2].first[:zyx].should == 'qqqq'
320
-
321
- @db.add_column :test2, :xyz, :float
322
- @db[:test2].delete
323
- @db[:test2] << {:name => 'mmm', :value => 111, :xyz => 56.78}
324
- @db.set_column_type :test2, :xyz, :integer
325
-
326
- @db[:test2].first[:xyz].should == 57
327
- end
328
- end
329
-
330
- context "A PostgreSQL database" do
331
- setup do
332
- end
333
-
334
- specify "should support fulltext indexes" do
335
- g = Sequel::Schema::Generator.new(POSTGRES_DB) do
336
- text :title
337
- text :body
338
- full_text_index [:title, :body]
339
- end
340
- POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
341
- "CREATE TABLE posts (title text, body text)",
342
- "CREATE INDEX posts_title_body_index ON posts USING gin (to_tsvector(title || body))"
343
- ]
344
- end
345
-
346
- specify "should support fulltext indexes with a specific language" do
347
- g = Sequel::Schema::Generator.new(POSTGRES_DB) do
348
- text :title
349
- text :body
350
- full_text_index [:title, :body], :language => 'french'
351
- end
352
- POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
353
- "CREATE TABLE posts (title text, body text)",
354
- "CREATE INDEX posts_title_body_index ON posts USING gin (to_tsvector('french', title || body))"
355
- ]
356
- end
357
-
358
- specify "should support full_text_search" do
359
- POSTGRES_DB[:posts].full_text_search(:title, 'ruby').sql.should ==
360
- "SELECT * FROM posts WHERE (to_tsvector(title) @@ to_tsquery('ruby'))"
361
-
362
- POSTGRES_DB[:posts].full_text_search([:title, :body], ['ruby', 'sequel']).sql.should ==
363
- "SELECT * FROM posts WHERE (to_tsvector(title || body) @@ to_tsquery('ruby | sequel'))"
364
-
365
- POSTGRES_DB[:posts].full_text_search(:title, 'ruby', :language => 'french').sql.should ==
366
- "SELECT * FROM posts WHERE (to_tsvector('french', title) @@ to_tsquery('french', 'ruby'))"
367
- end
368
-
369
- specify "should support spatial indexes" do
370
- g = Sequel::Schema::Generator.new(POSTGRES_DB) do
371
- geometry :geom
372
- spatial_index [:geom]
373
- end
374
- POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
375
- "CREATE TABLE posts (geom geometry)",
376
- "CREATE INDEX posts_geom_index ON posts USING gist (geom)"
377
- ]
378
- end
379
-
380
- specify "should support indexes with index type" do
381
- g = Sequel::Schema::Generator.new(POSTGRES_DB) do
382
- varchar :title, :size => 5
383
- index :title, :type => 'hash'
384
- end
385
- POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
386
- "CREATE TABLE posts (title varchar(5))",
387
- "CREATE INDEX posts_title_index ON posts USING hash (title)"
388
- ]
389
- end
390
-
391
- specify "should support unique indexes with index type" do
392
- g = Sequel::Schema::Generator.new(POSTGRES_DB) do
393
- varchar :title, :size => 5
394
- index :title, :type => 'hash', :unique => true
395
- end
396
- POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
397
- "CREATE TABLE posts (title varchar(5))",
398
- "CREATE UNIQUE INDEX posts_title_index ON posts USING hash (title)"
399
- ]
400
- end
401
-
402
- specify "should support partial indexes" do
403
- g = Sequel::Schema::Generator.new(POSTGRES_DB) do
404
- varchar :title, :size => 5
405
- index :title, :where => {:something => 5}
406
- end
407
- POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
408
- "CREATE TABLE posts (title varchar(5))",
409
- "CREATE INDEX posts_title_index ON posts (title) WHERE (something = 5)"
410
- ]
411
- end
412
- end
413
-
414
- context "Postgres::Dataset#multi_insert_sql / #import" do
415
- setup do
416
- @ds = POSTGRES_DB[:test]
417
- end
418
-
419
- specify "should return separate insert statements if server_version < 80200" do
420
- @ds.db.meta_def(:server_version) {80199}
421
-
422
- @ds.multi_insert_sql([:x, :y], [[1, 2], [3, 4]]).should == [
423
- 'INSERT INTO test (x, y) VALUES (1, 2)',
424
- 'INSERT INTO test (x, y) VALUES (3, 4)'
425
- ]
426
- end
427
-
428
- specify "should a single insert statement if server_version >= 80200" do
429
- @ds.db.meta_def(:server_version) {80200}
430
-
431
- @ds.multi_insert_sql([:x, :y], [[1, 2], [3, 4]]).should == [
432
- 'INSERT INTO test (x, y) VALUES (1, 2), (3, 4)'
433
- ]
434
-
435
- @ds.db.meta_def(:server_version) {80201}
436
-
437
- @ds.multi_insert_sql([:x, :y], [[1, 2], [3, 4]]).should == [
438
- 'INSERT INTO test (x, y) VALUES (1, 2), (3, 4)'
439
- ]
440
- end
441
- end