sequel_core 1.5.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/CHANGELOG +116 -0
  2. data/COPYING +19 -19
  3. data/README +83 -32
  4. data/Rakefile +9 -20
  5. data/bin/sequel +43 -112
  6. data/doc/cheat_sheet.rdoc +225 -0
  7. data/doc/dataset_filtering.rdoc +257 -0
  8. data/lib/sequel_core/adapters/adapter_skeleton.rb +4 -2
  9. data/lib/sequel_core/adapters/ado.rb +3 -1
  10. data/lib/sequel_core/adapters/db2.rb +4 -2
  11. data/lib/sequel_core/adapters/dbi.rb +127 -113
  12. data/lib/sequel_core/adapters/informix.rb +4 -2
  13. data/lib/sequel_core/adapters/jdbc.rb +5 -3
  14. data/lib/sequel_core/adapters/mysql.rb +112 -46
  15. data/lib/sequel_core/adapters/odbc.rb +5 -7
  16. data/lib/sequel_core/adapters/odbc_mssql.rb +12 -3
  17. data/lib/sequel_core/adapters/openbase.rb +3 -1
  18. data/lib/sequel_core/adapters/oracle.rb +11 -9
  19. data/lib/sequel_core/adapters/postgres.rb +261 -262
  20. data/lib/sequel_core/adapters/sqlite.rb +72 -22
  21. data/lib/sequel_core/connection_pool.rb +140 -73
  22. data/lib/sequel_core/core_ext.rb +201 -66
  23. data/lib/sequel_core/core_sql.rb +123 -153
  24. data/lib/sequel_core/database/schema.rb +156 -0
  25. data/lib/sequel_core/database.rb +321 -338
  26. data/lib/sequel_core/dataset/callback.rb +11 -12
  27. data/lib/sequel_core/dataset/convenience.rb +213 -240
  28. data/lib/sequel_core/dataset/pagination.rb +58 -43
  29. data/lib/sequel_core/dataset/parse_tree_sequelizer.rb +331 -0
  30. data/lib/sequel_core/dataset/query.rb +41 -0
  31. data/lib/sequel_core/dataset/schema.rb +15 -0
  32. data/lib/sequel_core/dataset/sequelizer.rb +41 -373
  33. data/lib/sequel_core/dataset/sql.rb +741 -632
  34. data/lib/sequel_core/dataset.rb +183 -168
  35. data/lib/sequel_core/deprecated.rb +1 -169
  36. data/lib/sequel_core/exceptions.rb +24 -19
  37. data/lib/sequel_core/migration.rb +44 -52
  38. data/lib/sequel_core/object_graph.rb +43 -42
  39. data/lib/sequel_core/pretty_table.rb +71 -76
  40. data/lib/sequel_core/schema/generator.rb +163 -105
  41. data/lib/sequel_core/schema/sql.rb +250 -93
  42. data/lib/sequel_core/schema.rb +2 -8
  43. data/lib/sequel_core/sql.rb +394 -0
  44. data/lib/sequel_core/worker.rb +37 -27
  45. data/lib/sequel_core.rb +99 -45
  46. data/spec/adapters/informix_spec.rb +0 -1
  47. data/spec/adapters/mysql_spec.rb +177 -124
  48. data/spec/adapters/oracle_spec.rb +0 -1
  49. data/spec/adapters/postgres_spec.rb +98 -58
  50. data/spec/adapters/sqlite_spec.rb +45 -4
  51. data/spec/blockless_filters_spec.rb +269 -0
  52. data/spec/connection_pool_spec.rb +21 -18
  53. data/spec/core_ext_spec.rb +169 -19
  54. data/spec/core_sql_spec.rb +56 -49
  55. data/spec/database_spec.rb +78 -17
  56. data/spec/dataset_spec.rb +300 -428
  57. data/spec/migration_spec.rb +1 -1
  58. data/spec/object_graph_spec.rb +5 -11
  59. data/spec/rcov.opts +1 -1
  60. data/spec/schema_generator_spec.rb +16 -4
  61. data/spec/schema_spec.rb +89 -10
  62. data/spec/sequelizer_spec.rb +56 -56
  63. data/spec/spec.opts +0 -5
  64. data/spec/spec_config.rb +7 -0
  65. data/spec/spec_config.rb.example +5 -5
  66. data/spec/spec_helper.rb +6 -0
  67. data/spec/worker_spec.rb +1 -1
  68. metadata +78 -63
@@ -1,23 +1,19 @@
1
- require File.join(File.dirname(__FILE__), '../../lib/sequel_core')
2
1
  require File.join(File.dirname(__FILE__), '../spec_helper.rb')
3
2
 
4
3
  unless defined?(POSTGRES_DB)
5
- POSTGRES_DB = Sequel.connect(ENV['SEQUEL_PG_SPEC_DB']||'postgres://postgres:postgres@localhost:5432/reality_spec')
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
6
  end
7
7
 
8
- POSTGRES_DB.drop_table(:test) if POSTGRES_DB.table_exists?(:test)
9
- POSTGRES_DB.drop_table(:test2) if POSTGRES_DB.table_exists?(:test2)
10
- POSTGRES_DB.drop_table(:test3) if POSTGRES_DB.table_exists?(:test3)
11
-
12
- POSTGRES_DB.create_table :test do
8
+ POSTGRES_DB.create_table! :test do
13
9
  text :name
14
10
  integer :value, :index => true
15
11
  end
16
- POSTGRES_DB.create_table :test2 do
12
+ POSTGRES_DB.create_table! :test2 do
17
13
  text :name
18
14
  integer :value
19
15
  end
20
- POSTGRES_DB.create_table :test3 do
16
+ POSTGRES_DB.create_table! :test3 do
21
17
  integer :value
22
18
  timestamp :time
23
19
  end
@@ -37,6 +33,18 @@ context "A PostgreSQL database" do
37
33
  specify "should provide the server version" do
38
34
  @db.server_version.should > 70000
39
35
  end
36
+
37
+ specify "should raise Sequel::Error on error" do
38
+ proc{@db << "SELECT 1 + 'a'"}.should raise_error(Sequel::Error)
39
+ end
40
+
41
+ specify "should correctly parse the schema" do
42
+ @db.schema(:test3, :reload=>true).should == [[:value, {:type=>:integer, :allow_null=>true, :max_chars=>0, :default=>nil, :db_type=>"integer", :numeric_precision=>32}], [:time, {:type=>:datetime, :allow_null=>true, :max_chars=>0, :default=>nil, :db_type=>"timestamp without time zone", :numeric_precision=>0}]]
43
+ end
44
+
45
+ specify "should get the schema all database tables if no table name is used" do
46
+ @db.schema(:test3, :reload=>true).should == @db.schema(nil, :reload=>true)[:test3]
47
+ end
40
48
  end
41
49
 
42
50
  context "A PostgreSQL dataset" do
@@ -93,62 +101,64 @@ context "A PostgreSQL dataset" do
93
101
  proc {@d.literal(false)}.should_not raise_error
94
102
  end
95
103
 
96
- specify "should quote columns using double quotes" do
104
+ specify "should quote columns and tables using double quotes if quoting identifiers" do
105
+ @d.quote_identifiers = true
97
106
  @d.select(:name).sql.should == \
98
- 'SELECT "name" FROM test'
107
+ 'SELECT "name" FROM "test"'
99
108
 
100
109
  @d.select('COUNT(*)'.lit).sql.should == \
101
- 'SELECT COUNT(*) FROM test'
110
+ 'SELECT COUNT(*) FROM "test"'
102
111
 
103
112
  @d.select(:max[:value]).sql.should == \
104
- 'SELECT max("value") FROM test'
113
+ 'SELECT max("value") FROM "test"'
105
114
 
106
115
  @d.select(:NOW[]).sql.should == \
107
- 'SELECT NOW() FROM test'
116
+ 'SELECT NOW() FROM "test"'
108
117
 
109
118
  @d.select(:max[:items__value]).sql.should == \
110
- 'SELECT max(items."value") FROM test'
119
+ 'SELECT max("items"."value") FROM "test"'
111
120
 
112
121
  @d.order(:name.desc).sql.should == \
113
- 'SELECT * FROM test ORDER BY "name" DESC'
122
+ 'SELECT * FROM "test" ORDER BY "name" DESC'
114
123
 
115
124
  @d.select('test.name AS item_name'.lit).sql.should == \
116
- 'SELECT test.name AS item_name FROM test'
125
+ 'SELECT test.name AS item_name FROM "test"'
117
126
 
118
127
  @d.select('"name"'.lit).sql.should == \
119
- 'SELECT "name" FROM test'
128
+ 'SELECT "name" FROM "test"'
120
129
 
121
130
  @d.select('max(test."name") AS "max_name"'.lit).sql.should == \
122
- 'SELECT max(test."name") AS "max_name" FROM test'
131
+ 'SELECT max(test."name") AS "max_name" FROM "test"'
123
132
 
124
133
  @d.select(:test[:abc, 'hello']).sql.should == \
125
- "SELECT test(\"abc\", 'hello') FROM test"
134
+ "SELECT test(\"abc\", 'hello') FROM \"test\""
126
135
 
127
136
  @d.select(:test[:abc__def, 'hello']).sql.should == \
128
- "SELECT test(abc.\"def\", 'hello') FROM test"
137
+ "SELECT test(\"abc\".\"def\", 'hello') FROM \"test\""
129
138
 
130
139
  @d.select(:test[:abc__def, 'hello'].as(:x2)).sql.should == \
131
- "SELECT test(abc.\"def\", 'hello') AS \"x2\" FROM test"
140
+ "SELECT test(\"abc\".\"def\", 'hello') AS \"x2\" FROM \"test\""
132
141
 
133
142
  @d.insert_sql(:value => 333).should == \
134
- 'INSERT INTO test ("value") VALUES (333)'
143
+ 'INSERT INTO "test" ("value") VALUES (333)'
135
144
 
136
145
  @d.insert_sql(:x => :y).should == \
137
- 'INSERT INTO test ("x") VALUES ("y")'
146
+ 'INSERT INTO "test" ("x") VALUES ("y")'
138
147
  end
139
148
 
140
- specify "should quote fields correctly when reversing the order" do
149
+ specify "should quote fields correctly when reversing the order if quoting identifiers" do
150
+ @d.quote_identifiers = true
141
151
  @d.reverse_order(:name).sql.should == \
142
- 'SELECT * FROM test ORDER BY "name" DESC'
152
+ 'SELECT * FROM "test" ORDER BY "name" DESC'
143
153
 
144
154
  @d.reverse_order(:name.desc).sql.should == \
145
- 'SELECT * FROM test ORDER BY "name"'
155
+ 'SELECT * FROM "test" ORDER BY "name"'
146
156
 
147
157
  @d.reverse_order(:name, :test.desc).sql.should == \
148
- 'SELECT * FROM test ORDER BY "name" DESC, "test"'
158
+ 'SELECT * FROM "test" ORDER BY "name" DESC, "test"'
149
159
 
150
160
  @d.reverse_order(:name.desc, :test).sql.should == \
151
- 'SELECT * FROM test ORDER BY "name", "test" DESC'
161
+ 'SELECT * FROM "test" ORDER BY "name", "test" DESC'
152
162
  end
153
163
 
154
164
  specify "should support transactions" do
@@ -159,6 +169,39 @@ context "A PostgreSQL dataset" do
159
169
  @d.count.should == 1
160
170
  end
161
171
 
172
+ specify "should correctly rollback transactions" do
173
+ proc do
174
+ POSTGRES_DB.transaction do
175
+ @d << {:name => 'abc', :value => 1}
176
+ raise Interrupt, 'asdf'
177
+ end
178
+ end.should raise_error(Interrupt)
179
+
180
+ @d.count.should == 0
181
+ end
182
+
183
+ specify "should handle returning inside of the block by committing" do
184
+ def POSTGRES_DB.ret_commit
185
+ transaction do
186
+ self[:test] << {:name => 'abc'}
187
+ return
188
+ self[:test] << {:name => 'd'}
189
+ end
190
+ end
191
+ @d.count.should == 0
192
+ POSTGRES_DB.ret_commit
193
+ @d.count.should == 1
194
+ POSTGRES_DB.ret_commit
195
+ @d.count.should == 2
196
+ proc do
197
+ POSTGRES_DB.transaction do
198
+ raise Interrupt, 'asdf'
199
+ end
200
+ end.should raise_error(Interrupt)
201
+
202
+ @d.count.should == 2
203
+ end
204
+
162
205
  specify "should support regexps" do
163
206
  @d << {:name => 'abc', :value => 1}
164
207
  @d << {:name => 'bcd', :value => 2}
@@ -167,8 +210,8 @@ context "A PostgreSQL dataset" do
167
210
  end
168
211
 
169
212
  specify "should consider strings containing backslashes to be escaped string literals" do
170
- PGconn.quote("\\dingo").should == "E'\\\\dingo'" # literally, E'\\dingo'
171
- PGconn.quote("dingo").should == "'dingo'"
213
+ @d.literal("\\dingo").should == "'\\\\dingo'" # literally, E'\\dingo'
214
+ @d.literal("dingo").should == "'dingo'"
172
215
  end
173
216
  end
174
217
 
@@ -191,22 +234,21 @@ context "A PostgreSQL database" do
191
234
  @db = POSTGRES_DB
192
235
  end
193
236
 
194
- specify "should support add_column operations" do
237
+ specify "should support column operations" do
238
+ @db.create_table!(:test2){text :name; integer :value}
239
+ @db[:test2] << {}
240
+ @db[:test2].columns.should == [:name, :value]
241
+
195
242
  @db.add_column :test2, :xyz, :text, :default => '000'
196
-
197
243
  @db[:test2].columns.should == [:name, :value, :xyz]
198
244
  @db[:test2] << {:name => 'mmm', :value => 111}
199
245
  @db[:test2].first[:xyz].should == '000'
200
- end
201
246
 
202
- specify "should support drop_column operations" do
203
247
  @db[:test2].columns.should == [:name, :value, :xyz]
204
248
  @db.drop_column :test2, :xyz
205
249
 
206
250
  @db[:test2].columns.should == [:name, :value]
207
- end
208
251
 
209
- specify "should support rename_column operations" do
210
252
  @db[:test2].delete
211
253
  @db.add_column :test2, :xyz, :text, :default => '000'
212
254
  @db[:test2] << {:name => 'mmm', :value => 111, :xyz => 'qqqq'}
@@ -215,9 +257,7 @@ context "A PostgreSQL database" do
215
257
  @db.rename_column :test2, :xyz, :zyx
216
258
  @db[:test2].columns.should == [:name, :value, :zyx]
217
259
  @db[:test2].first[:zyx].should == 'qqqq'
218
- end
219
260
 
220
- specify "should support set_column_type operations" do
221
261
  @db.add_column :test2, :xyz, :float
222
262
  @db[:test2].delete
223
263
  @db[:test2] << {:name => 'mmm', :value => 111, :xyz => 56.78}
@@ -238,8 +278,8 @@ context "A PostgreSQL database" do
238
278
  full_text_index [:title, :body]
239
279
  end
240
280
  POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
241
- "CREATE TABLE posts (\"title\" text, \"body\" text)",
242
- "CREATE INDEX posts_title_body_index ON posts USING gin (to_tsvector(\"title\" || \"body\"))"
281
+ "CREATE TABLE posts (title text, body text)",
282
+ "CREATE INDEX posts_title_body_index ON posts USING gin (to_tsvector(title || body))"
243
283
  ]
244
284
  end
245
285
 
@@ -250,20 +290,20 @@ context "A PostgreSQL database" do
250
290
  full_text_index [:title, :body], :language => 'french'
251
291
  end
252
292
  POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
253
- "CREATE TABLE posts (\"title\" text, \"body\" text)",
254
- "CREATE INDEX posts_title_body_index ON posts USING gin (to_tsvector('french', \"title\" || \"body\"))"
293
+ "CREATE TABLE posts (title text, body text)",
294
+ "CREATE INDEX posts_title_body_index ON posts USING gin (to_tsvector('french', title || body))"
255
295
  ]
256
296
  end
257
297
 
258
298
  specify "should support full_text_search" do
259
299
  POSTGRES_DB[:posts].full_text_search(:title, 'ruby').sql.should ==
260
- "SELECT * FROM posts WHERE (to_tsvector(\"title\") @@ to_tsquery('ruby'))"
300
+ "SELECT * FROM posts WHERE (to_tsvector(title) @@ to_tsquery('ruby'))"
261
301
 
262
302
  POSTGRES_DB[:posts].full_text_search([:title, :body], ['ruby', 'sequel']).sql.should ==
263
- "SELECT * FROM posts WHERE (to_tsvector(\"title\" || \"body\") @@ to_tsquery('ruby | sequel'))"
303
+ "SELECT * FROM posts WHERE (to_tsvector(title || body) @@ to_tsquery('ruby | sequel'))"
264
304
 
265
305
  POSTGRES_DB[:posts].full_text_search(:title, 'ruby', :language => 'french').sql.should ==
266
- "SELECT * FROM posts WHERE (to_tsvector('french', \"title\") @@ to_tsquery('french', 'ruby'))"
306
+ "SELECT * FROM posts WHERE (to_tsvector('french', title) @@ to_tsquery('french', 'ruby'))"
267
307
  end
268
308
 
269
309
  specify "should support spatial indexes" do
@@ -272,8 +312,8 @@ context "A PostgreSQL database" do
272
312
  spatial_index [:geom]
273
313
  end
274
314
  POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
275
- "CREATE TABLE posts (\"geom\" geometry)",
276
- "CREATE INDEX posts_geom_index ON posts USING gist (\"geom\")"
315
+ "CREATE TABLE posts (geom geometry)",
316
+ "CREATE INDEX posts_geom_index ON posts USING gist (geom)"
277
317
  ]
278
318
  end
279
319
 
@@ -283,8 +323,8 @@ context "A PostgreSQL database" do
283
323
  index :title, :type => 'hash'
284
324
  end
285
325
  POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
286
- "CREATE TABLE posts (\"title\" varchar(5))",
287
- "CREATE INDEX posts_title_index ON posts USING hash (\"title\")"
326
+ "CREATE TABLE posts (title varchar(5))",
327
+ "CREATE INDEX posts_title_index ON posts USING hash (title)"
288
328
  ]
289
329
  end
290
330
 
@@ -294,8 +334,8 @@ context "A PostgreSQL database" do
294
334
  index :title, :type => 'hash', :unique => true
295
335
  end
296
336
  POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
297
- "CREATE TABLE posts (\"title\" varchar(5))",
298
- "CREATE UNIQUE INDEX posts_title_index ON posts USING hash (\"title\")"
337
+ "CREATE TABLE posts (title varchar(5))",
338
+ "CREATE UNIQUE INDEX posts_title_index ON posts USING hash (title)"
299
339
  ]
300
340
  end
301
341
 
@@ -305,8 +345,8 @@ context "A PostgreSQL database" do
305
345
  index :title, :where => {:something => 5}
306
346
  end
307
347
  POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
308
- "CREATE TABLE posts (\"title\" varchar(5))",
309
- "CREATE INDEX posts_title_index ON posts (\"title\") WHERE (\"something\" = 5)"
348
+ "CREATE TABLE posts (title varchar(5))",
349
+ "CREATE INDEX posts_title_index ON posts (title) WHERE (something = 5)"
310
350
  ]
311
351
  end
312
352
  end
@@ -320,8 +360,8 @@ context "Postgres::Dataset#multi_insert_sql / #import" do
320
360
  @ds.db.meta_def(:server_version) {80199}
321
361
 
322
362
  @ds.multi_insert_sql([:x, :y], [[1, 2], [3, 4]]).should == [
323
- 'INSERT INTO test ("x", "y") VALUES (1, 2)',
324
- 'INSERT INTO test ("x", "y") VALUES (3, 4)'
363
+ 'INSERT INTO test (x, y) VALUES (1, 2)',
364
+ 'INSERT INTO test (x, y) VALUES (3, 4)'
325
365
  ]
326
366
  end
327
367
 
@@ -329,13 +369,13 @@ context "Postgres::Dataset#multi_insert_sql / #import" do
329
369
  @ds.db.meta_def(:server_version) {80200}
330
370
 
331
371
  @ds.multi_insert_sql([:x, :y], [[1, 2], [3, 4]]).should == [
332
- 'INSERT INTO test ("x", "y") VALUES (1, 2), (3, 4)'
372
+ 'INSERT INTO test (x, y) VALUES (1, 2), (3, 4)'
333
373
  ]
334
374
 
335
375
  @ds.db.meta_def(:server_version) {80201}
336
376
 
337
377
  @ds.multi_insert_sql([:x, :y], [[1, 2], [3, 4]]).should == [
338
- 'INSERT INTO test ("x", "y") VALUES (1, 2), (3, 4)'
378
+ 'INSERT INTO test (x, y) VALUES (1, 2), (3, 4)'
339
379
  ]
340
380
  end
341
381
  end
@@ -1,4 +1,3 @@
1
- require File.join(File.dirname(__FILE__), '../../lib/sequel_core')
2
1
  require File.join(File.dirname(__FILE__), '../spec_helper.rb')
3
2
 
4
3
  unless defined?(SQLITE_DB)
@@ -17,9 +16,12 @@ end
17
16
  SQLITE_DB.create_table(:time) {timestamp :t}
18
17
 
19
18
  context "An SQLite database" do
20
- setup do
19
+ before do
21
20
  @db = Sequel.connect('sqlite:/')
22
21
  end
22
+ after do
23
+ @db.disconnect
24
+ end
23
25
 
24
26
  specify "should provide a list of existing tables" do
25
27
  @db.tables.should == []
@@ -37,13 +39,15 @@ context "An SQLite database" do
37
39
  specify "should support setting pragma values" do
38
40
  @db.pragma_set(:auto_vacuum, '1')
39
41
  @db.pragma_get(:auto_vacuum).should == '1'
42
+ @db.pragma_set(:auto_vacuum, '2')
43
+ @db.pragma_get(:auto_vacuum).should == '2'
40
44
  end
41
45
 
42
46
  specify "should support getting and setting the auto_vacuum pragma" do
43
47
  @db.auto_vacuum = :full
44
48
  @db.auto_vacuum.should == :full
45
- @db.auto_vacuum = :none
46
- @db.auto_vacuum.should == :none
49
+ @db.auto_vacuum = :incremental
50
+ @db.auto_vacuum.should == :incremental
47
51
 
48
52
  proc {@db.auto_vacuum = :invalid}.should raise_error(Sequel::Error)
49
53
  end
@@ -123,6 +127,29 @@ context "An SQLite database" do
123
127
  @db.tables.should == [:t]
124
128
  end
125
129
 
130
+ specify "should handle returning inside of transaction by committing" do
131
+ @db.create_table(:items){text :name}
132
+ def @db.ret_commit
133
+ transaction do
134
+ self[:items] << {:name => 'abc'}
135
+ return
136
+ self[:items] << {:name => 'd'}
137
+ end
138
+ end
139
+ @db[:items].count.should == 0
140
+ @db.ret_commit
141
+ @db[:items].count.should == 1
142
+ @db.ret_commit
143
+ @db[:items].count.should == 2
144
+ proc do
145
+ @db.transaction do
146
+ raise Interrupt, 'asdf'
147
+ end
148
+ end.should raise_error(Interrupt)
149
+
150
+ @db[:items].count.should == 2
151
+ end
152
+
126
153
  specify "should provide disconnect functionality" do
127
154
  @db.tables
128
155
  @db.pool.size.should == 1
@@ -162,6 +189,20 @@ context "An SQLite database" do
162
189
  proc {@db.single_value 'blah blah'}.should raise_error(
163
190
  Sequel::Error::InvalidStatement, "blah blah\r\nnear \"blah\": syntax error")
164
191
  end
192
+
193
+ specify "should not swallow non-SQLite based exceptions" do
194
+ proc {@db.pool.hold{raise Interrupt, "test"}}.should raise_error(Interrupt)
195
+ end
196
+
197
+ specify "should correctly parse the schema" do
198
+ @db.create_table(:time) {timestamp :t}
199
+ @db.schema(:time, :reload=>true).should == [[:t, {:type=>:datetime, :allow_null=>true, :max_chars=>nil, :default=>nil, :db_type=>"timestamp", :numeric_precision=>nil, :primary_key=>false}]]
200
+ end
201
+
202
+ specify "should get the schema all database tables if no table name is used" do
203
+ @db.create_table(:time) {timestamp :t}
204
+ @db.schema(:time, :reload=>true).should == @db.schema(nil, :reload=>true)[:time]
205
+ end
165
206
  end
166
207
 
167
208
  context "An SQLite dataset" do