sequel 3.47.0 → 3.48.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (243) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +230 -0
  3. data/README.rdoc +31 -40
  4. data/Rakefile +1 -14
  5. data/doc/active_record.rdoc +29 -29
  6. data/doc/association_basics.rdoc +4 -13
  7. data/doc/cheat_sheet.rdoc +8 -6
  8. data/doc/code_order.rdoc +89 -0
  9. data/doc/core_extensions.rdoc +3 -3
  10. data/doc/dataset_basics.rdoc +7 -8
  11. data/doc/dataset_filtering.rdoc +7 -2
  12. data/doc/mass_assignment.rdoc +2 -3
  13. data/doc/migration.rdoc +8 -8
  14. data/doc/model_hooks.rdoc +11 -7
  15. data/doc/object_model.rdoc +2 -2
  16. data/doc/opening_databases.rdoc +5 -14
  17. data/doc/prepared_statements.rdoc +5 -9
  18. data/doc/querying.rdoc +23 -28
  19. data/doc/reflection.rdoc +11 -0
  20. data/doc/release_notes/3.48.0.txt +477 -0
  21. data/doc/schema_modification.rdoc +12 -5
  22. data/doc/security.rdoc +2 -2
  23. data/doc/sharding.rdoc +1 -2
  24. data/doc/sql.rdoc +10 -13
  25. data/doc/testing.rdoc +8 -4
  26. data/doc/transactions.rdoc +2 -2
  27. data/doc/validations.rdoc +40 -17
  28. data/doc/virtual_rows.rdoc +2 -2
  29. data/lib/sequel/adapters/ado.rb +25 -20
  30. data/lib/sequel/adapters/ado/access.rb +1 -0
  31. data/lib/sequel/adapters/ado/mssql.rb +1 -0
  32. data/lib/sequel/adapters/db2.rb +9 -7
  33. data/lib/sequel/adapters/dbi.rb +16 -16
  34. data/lib/sequel/adapters/do.rb +17 -18
  35. data/lib/sequel/adapters/do/mysql.rb +1 -0
  36. data/lib/sequel/adapters/do/postgres.rb +2 -0
  37. data/lib/sequel/adapters/do/sqlite.rb +1 -0
  38. data/lib/sequel/adapters/firebird.rb +5 -7
  39. data/lib/sequel/adapters/ibmdb.rb +23 -20
  40. data/lib/sequel/adapters/informix.rb +8 -2
  41. data/lib/sequel/adapters/jdbc.rb +39 -35
  42. data/lib/sequel/adapters/jdbc/as400.rb +1 -0
  43. data/lib/sequel/adapters/jdbc/cubrid.rb +1 -0
  44. data/lib/sequel/adapters/jdbc/db2.rb +1 -0
  45. data/lib/sequel/adapters/jdbc/derby.rb +1 -0
  46. data/lib/sequel/adapters/jdbc/firebird.rb +1 -0
  47. data/lib/sequel/adapters/jdbc/h2.rb +1 -0
  48. data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -0
  49. data/lib/sequel/adapters/jdbc/informix.rb +1 -0
  50. data/lib/sequel/adapters/jdbc/jtds.rb +1 -0
  51. data/lib/sequel/adapters/jdbc/mssql.rb +1 -0
  52. data/lib/sequel/adapters/jdbc/mysql.rb +1 -0
  53. data/lib/sequel/adapters/jdbc/oracle.rb +1 -0
  54. data/lib/sequel/adapters/jdbc/postgresql.rb +2 -0
  55. data/lib/sequel/adapters/jdbc/progress.rb +1 -0
  56. data/lib/sequel/adapters/jdbc/sqlite.rb +1 -0
  57. data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -0
  58. data/lib/sequel/adapters/mock.rb +30 -31
  59. data/lib/sequel/adapters/mysql.rb +6 -7
  60. data/lib/sequel/adapters/mysql2.rb +5 -6
  61. data/lib/sequel/adapters/odbc.rb +22 -20
  62. data/lib/sequel/adapters/odbc/mssql.rb +1 -0
  63. data/lib/sequel/adapters/openbase.rb +4 -1
  64. data/lib/sequel/adapters/oracle.rb +10 -8
  65. data/lib/sequel/adapters/postgres.rb +12 -10
  66. data/lib/sequel/adapters/shared/access.rb +6 -0
  67. data/lib/sequel/adapters/shared/cubrid.rb +2 -0
  68. data/lib/sequel/adapters/shared/db2.rb +2 -0
  69. data/lib/sequel/adapters/shared/firebird.rb +2 -0
  70. data/lib/sequel/adapters/shared/informix.rb +2 -0
  71. data/lib/sequel/adapters/shared/mssql.rb +14 -8
  72. data/lib/sequel/adapters/shared/mysql.rb +6 -0
  73. data/lib/sequel/adapters/shared/oracle.rb +2 -0
  74. data/lib/sequel/adapters/shared/postgres.rb +14 -4
  75. data/lib/sequel/adapters/shared/progress.rb +1 -0
  76. data/lib/sequel/adapters/shared/sqlite.rb +4 -3
  77. data/lib/sequel/adapters/sqlite.rb +6 -7
  78. data/lib/sequel/adapters/swift.rb +20 -21
  79. data/lib/sequel/adapters/swift/mysql.rb +1 -0
  80. data/lib/sequel/adapters/swift/postgres.rb +2 -0
  81. data/lib/sequel/adapters/swift/sqlite.rb +1 -0
  82. data/lib/sequel/adapters/tinytds.rb +5 -6
  83. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +68 -0
  84. data/lib/sequel/connection_pool.rb +1 -1
  85. data/lib/sequel/core.rb +57 -50
  86. data/lib/sequel/database/connecting.rb +9 -10
  87. data/lib/sequel/database/dataset.rb +11 -6
  88. data/lib/sequel/database/dataset_defaults.rb +61 -69
  89. data/lib/sequel/database/features.rb +21 -0
  90. data/lib/sequel/database/misc.rb +23 -3
  91. data/lib/sequel/database/query.rb +13 -7
  92. data/lib/sequel/database/schema_methods.rb +6 -6
  93. data/lib/sequel/database/transactions.rb +1 -0
  94. data/lib/sequel/dataset/actions.rb +51 -38
  95. data/lib/sequel/dataset/features.rb +1 -0
  96. data/lib/sequel/dataset/graph.rb +9 -33
  97. data/lib/sequel/dataset/misc.rb +30 -5
  98. data/lib/sequel/dataset/mutation.rb +2 -3
  99. data/lib/sequel/dataset/prepared_statements.rb +1 -1
  100. data/lib/sequel/dataset/query.rb +91 -27
  101. data/lib/sequel/dataset/sql.rb +40 -6
  102. data/lib/sequel/deprecated.rb +74 -0
  103. data/lib/sequel/deprecated_core_extensions.rb +135 -0
  104. data/lib/sequel/extensions/columns_introspection.rb +1 -5
  105. data/lib/sequel/extensions/core_extensions.rb +10 -3
  106. data/lib/sequel/extensions/date_arithmetic.rb +1 -0
  107. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +33 -0
  108. data/lib/sequel/extensions/filter_having.rb +58 -0
  109. data/lib/sequel/extensions/graph_each.rb +63 -0
  110. data/lib/sequel/extensions/hash_aliases.rb +44 -0
  111. data/lib/sequel/extensions/looser_typecasting.rb +14 -3
  112. data/lib/sequel/extensions/migration.rb +2 -3
  113. data/lib/sequel/extensions/named_timezones.rb +14 -1
  114. data/lib/sequel/extensions/null_dataset.rb +7 -1
  115. data/lib/sequel/extensions/pagination.rb +15 -5
  116. data/lib/sequel/extensions/pg_auto_parameterize.rb +1 -0
  117. data/lib/sequel/extensions/pg_hstore_ops.rb +48 -14
  118. data/lib/sequel/extensions/pg_json.rb +7 -7
  119. data/lib/sequel/extensions/pg_range_ops.rb +8 -2
  120. data/lib/sequel/extensions/pg_statement_cache.rb +1 -0
  121. data/lib/sequel/extensions/pretty_table.rb +13 -4
  122. data/lib/sequel/extensions/query.rb +21 -4
  123. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +22 -0
  124. data/lib/sequel/extensions/schema_caching.rb +10 -7
  125. data/lib/sequel/extensions/schema_dumper.rb +35 -48
  126. data/lib/sequel/extensions/select_remove.rb +13 -4
  127. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +117 -0
  128. data/lib/sequel/extensions/set_overrides.rb +43 -0
  129. data/lib/sequel/extensions/to_dot.rb +6 -0
  130. data/lib/sequel/model.rb +12 -6
  131. data/lib/sequel/model/associations.rb +80 -38
  132. data/lib/sequel/model/base.rb +137 -52
  133. data/lib/sequel/model/errors.rb +7 -2
  134. data/lib/sequel/plugins/active_model.rb +13 -0
  135. data/lib/sequel/plugins/after_initialize.rb +43 -0
  136. data/lib/sequel/plugins/association_proxies.rb +63 -7
  137. data/lib/sequel/plugins/auto_validations.rb +56 -16
  138. data/lib/sequel/plugins/blacklist_security.rb +63 -0
  139. data/lib/sequel/plugins/class_table_inheritance.rb +9 -0
  140. data/lib/sequel/plugins/constraint_validations.rb +50 -8
  141. data/lib/sequel/plugins/dataset_associations.rb +2 -0
  142. data/lib/sequel/plugins/hook_class_methods.rb +7 -1
  143. data/lib/sequel/plugins/identity_map.rb +4 -0
  144. data/lib/sequel/plugins/json_serializer.rb +32 -13
  145. data/lib/sequel/plugins/optimistic_locking.rb +1 -1
  146. data/lib/sequel/plugins/rcte_tree.rb +4 -4
  147. data/lib/sequel/plugins/scissors.rb +33 -0
  148. data/lib/sequel/plugins/serialization.rb +1 -1
  149. data/lib/sequel/plugins/single_table_inheritance.rb +6 -0
  150. data/lib/sequel/plugins/tree.rb +5 -1
  151. data/lib/sequel/plugins/validation_class_methods.rb +2 -1
  152. data/lib/sequel/plugins/validation_helpers.rb +15 -11
  153. data/lib/sequel/plugins/xml_serializer.rb +12 -3
  154. data/lib/sequel/sql.rb +12 -2
  155. data/lib/sequel/timezones.rb +1 -1
  156. data/lib/sequel/version.rb +1 -1
  157. data/lib/sequel_core.rb +1 -0
  158. data/lib/sequel_model.rb +1 -0
  159. data/spec/adapters/mssql_spec.rb +24 -57
  160. data/spec/adapters/postgres_spec.rb +27 -55
  161. data/spec/adapters/spec_helper.rb +1 -1
  162. data/spec/adapters/sqlite_spec.rb +1 -1
  163. data/spec/bin_spec.rb +251 -0
  164. data/spec/core/database_spec.rb +46 -32
  165. data/spec/core/dataset_spec.rb +233 -181
  166. data/spec/core/deprecated_spec.rb +78 -0
  167. data/spec/core/expression_filters_spec.rb +3 -4
  168. data/spec/core/mock_adapter_spec.rb +9 -9
  169. data/spec/core/object_graph_spec.rb +9 -19
  170. data/spec/core/schema_spec.rb +3 -1
  171. data/spec/core/spec_helper.rb +19 -0
  172. data/spec/core_extensions_spec.rb +80 -30
  173. data/spec/extensions/after_initialize_spec.rb +24 -0
  174. data/spec/extensions/association_proxies_spec.rb +37 -1
  175. data/spec/extensions/auto_validations_spec.rb +20 -4
  176. data/spec/extensions/blacklist_security_spec.rb +87 -0
  177. data/spec/extensions/boolean_readers_spec.rb +2 -1
  178. data/spec/extensions/class_table_inheritance_spec.rb +7 -0
  179. data/spec/extensions/columns_introspection_spec.rb +3 -3
  180. data/spec/extensions/constraint_validations_plugin_spec.rb +83 -5
  181. data/spec/extensions/core_refinements_spec.rb +7 -7
  182. data/spec/extensions/dataset_associations_spec.rb +2 -2
  183. data/spec/extensions/date_arithmetic_spec.rb +1 -1
  184. data/spec/extensions/defaults_setter_spec.rb +2 -1
  185. data/spec/extensions/empty_array_ignore_nulls_spec.rb +24 -0
  186. data/spec/extensions/filter_having_spec.rb +40 -0
  187. data/spec/extensions/graph_each_spec.rb +109 -0
  188. data/spec/extensions/hash_aliases_spec.rb +16 -0
  189. data/spec/extensions/hook_class_methods_spec.rb +2 -2
  190. data/spec/extensions/identity_map_spec.rb +3 -3
  191. data/spec/extensions/json_serializer_spec.rb +19 -19
  192. data/spec/extensions/lazy_attributes_spec.rb +1 -0
  193. data/spec/extensions/list_spec.rb +13 -13
  194. data/spec/extensions/looser_typecasting_spec.rb +10 -3
  195. data/spec/extensions/many_through_many_spec.rb +1 -1
  196. data/spec/extensions/migration_spec.rb +7 -7
  197. data/spec/extensions/named_timezones_spec.rb +6 -0
  198. data/spec/extensions/nested_attributes_spec.rb +2 -2
  199. data/spec/extensions/null_dataset_spec.rb +1 -1
  200. data/spec/extensions/pagination_spec.rb +2 -2
  201. data/spec/extensions/pg_hstore_ops_spec.rb +75 -0
  202. data/spec/extensions/pg_range_ops_spec.rb +4 -2
  203. data/spec/extensions/pg_row_plugin_spec.rb +1 -1
  204. data/spec/extensions/pretty_table_spec.rb +1 -1
  205. data/spec/extensions/query_literals_spec.rb +1 -1
  206. data/spec/extensions/query_spec.rb +3 -3
  207. data/spec/extensions/schema_caching_spec.rb +3 -3
  208. data/spec/extensions/schema_dumper_spec.rb +27 -2
  209. data/spec/extensions/schema_spec.rb +2 -2
  210. data/spec/extensions/scissors_spec.rb +26 -0
  211. data/spec/extensions/select_remove_spec.rb +1 -1
  212. data/spec/extensions/sequel_3_dataset_methods_spec.rb +102 -0
  213. data/spec/extensions/set_overrides_spec.rb +45 -0
  214. data/spec/extensions/single_table_inheritance_spec.rb +10 -0
  215. data/spec/extensions/spec_helper.rb +24 -1
  216. data/spec/extensions/static_cache_spec.rb +1 -1
  217. data/spec/extensions/string_stripper_spec.rb +2 -1
  218. data/spec/extensions/to_dot_spec.rb +1 -1
  219. data/spec/extensions/typecast_on_load_spec.rb +3 -2
  220. data/spec/extensions/update_primary_key_spec.rb +2 -2
  221. data/spec/extensions/validation_class_methods_spec.rb +19 -19
  222. data/spec/extensions/validation_helpers_spec.rb +30 -21
  223. data/spec/extensions/xml_serializer_spec.rb +5 -5
  224. data/spec/integration/associations_test.rb +10 -30
  225. data/spec/integration/dataset_test.rb +20 -24
  226. data/spec/integration/eager_loader_test.rb +5 -5
  227. data/spec/integration/model_test.rb +3 -3
  228. data/spec/integration/plugin_test.rb +7 -39
  229. data/spec/integration/schema_test.rb +4 -38
  230. data/spec/integration/spec_helper.rb +2 -1
  231. data/spec/model/association_reflection_spec.rb +70 -5
  232. data/spec/model/associations_spec.rb +11 -11
  233. data/spec/model/base_spec.rb +25 -8
  234. data/spec/model/class_dataset_methods_spec.rb +143 -0
  235. data/spec/model/dataset_methods_spec.rb +1 -1
  236. data/spec/model/eager_loading_spec.rb +25 -25
  237. data/spec/model/hooks_spec.rb +1 -1
  238. data/spec/model/model_spec.rb +22 -7
  239. data/spec/model/plugins_spec.rb +1 -6
  240. data/spec/model/record_spec.rb +37 -29
  241. data/spec/model/spec_helper.rb +23 -1
  242. data/spec/model/validations_spec.rb +15 -17
  243. metadata +32 -3
@@ -81,7 +81,7 @@ describe "A new Database" do
81
81
 
82
82
  specify "should respect the :identifier_input_method option" do
83
83
  Sequel.identifier_input_method = nil
84
- Sequel::Database.identifier_input_method.should == ""
84
+ Sequel::Database.identifier_input_method.should == false
85
85
  db = Sequel::Database.new(:identifier_input_method=>nil)
86
86
  db.identifier_input_method.should be_nil
87
87
  db.identifier_input_method = :downcase
@@ -104,7 +104,7 @@ describe "A new Database" do
104
104
 
105
105
  specify "should respect the :identifier_output_method option" do
106
106
  Sequel.identifier_output_method = nil
107
- Sequel::Database.identifier_output_method.should == ""
107
+ Sequel::Database.identifier_output_method.should == false
108
108
  db = Sequel::Database.new(:identifier_output_method=>nil)
109
109
  db.identifier_output_method.should be_nil
110
110
  db.identifier_output_method = :downcase
@@ -169,7 +169,7 @@ describe "A new Database" do
169
169
 
170
170
  specify "should respect the identifier_input_method_default method" do
171
171
  class Sequel::Database
172
- @@identifier_input_method = nil
172
+ @identifier_input_method = nil
173
173
  end
174
174
  x = Class.new(Sequel::Database){def identifier_input_method_default; :downcase end}
175
175
  x.new({}).identifier_input_method.should == :downcase
@@ -179,7 +179,7 @@ describe "A new Database" do
179
179
 
180
180
  specify "should respect the identifier_output_method_default method if Sequel.identifier_output_method is not called" do
181
181
  class Sequel::Database
182
- @@identifier_output_method = nil
182
+ @identifier_output_method = nil
183
183
  end
184
184
  x = Class.new(Sequel::Database){def identifier_output_method_default; :upcase end}
185
185
  x.new({}).identifier_output_method.should == :upcase
@@ -227,7 +227,7 @@ describe "Sequel.extension" do
227
227
  end
228
228
 
229
229
  describe "Database#connect" do
230
- specify "should raise Sequel::NotImplemented" do
230
+ qspecify "should raise Sequel::NotImplemented" do
231
231
  proc {Sequel::Database.new.connect(:default)}.should raise_error(Sequel::NotImplemented)
232
232
  end
233
233
  end
@@ -505,31 +505,31 @@ describe "Database#valid_connection?" do
505
505
  end
506
506
 
507
507
  describe "Database#execute" do
508
- specify "should raise Sequel::NotImplemented" do
508
+ qspecify "should raise Sequel::NotImplemented" do
509
509
  proc {Sequel::Database.new.execute('blah blah')}.should raise_error(Sequel::NotImplemented)
510
510
  end
511
511
  end
512
512
 
513
513
  describe "Database#tables" do
514
- specify "should raise Sequel::NotImplemented" do
514
+ qspecify "should raise Sequel::NotImplemented" do
515
515
  proc {Sequel::Database.new.tables}.should raise_error(Sequel::NotImplemented)
516
516
  end
517
517
  end
518
518
 
519
519
  describe "Database#views" do
520
- specify "should raise Sequel::NotImplemented" do
520
+ qspecify "should raise Sequel::NotImplemented" do
521
521
  proc {Sequel::Database.new.views}.should raise_error(Sequel::NotImplemented)
522
522
  end
523
523
  end
524
524
 
525
525
  describe "Database#indexes" do
526
- specify "should raise Sequel::NotImplemented" do
526
+ qspecify "should raise Sequel::NotImplemented" do
527
527
  proc {Sequel::Database.new.indexes(:table)}.should raise_error(Sequel::NotImplemented)
528
528
  end
529
529
  end
530
530
 
531
531
  describe "Database#foreign_key_list" do
532
- specify "should raise Sequel::NotImplemented" do
532
+ qspecify "should raise Sequel::NotImplemented" do
533
533
  proc {Sequel::Database.new.foreign_key_list(:table)}.should raise_error(Sequel::NotImplemented)
534
534
  end
535
535
  end
@@ -611,7 +611,8 @@ describe "Database#test_connection" do
611
611
  end
612
612
 
613
613
  specify "should raise an error if the attempting to connect raises an error" do
614
- proc{Sequel::Database.new{raise Sequel::Error, 'blah'}.test_connection}.should raise_error(Sequel::Error)
614
+ def @db.connect(*) raise Sequel::Error end
615
+ proc{@db.test_connection}.should raise_error(Sequel::Error)
615
616
  end
616
617
  end
617
618
 
@@ -619,7 +620,7 @@ describe "Database#table_exists?" do
619
620
  specify "should test existence by selecting a row from the table's dataset" do
620
621
  db = Sequel.mock(:fetch=>[Sequel::Error, [], [{:a=>1}]])
621
622
  db.table_exists?(:a).should be_false
622
- db.sqls.should == ["SELECT NULL FROM a LIMIT 1"]
623
+ db.sqls.should == ["SELECT NULL AS nil FROM a LIMIT 1"]
623
624
  db.table_exists?(:b).should be_true
624
625
  db.table_exists?(:c).should be_true
625
626
  end
@@ -654,7 +655,7 @@ shared_examples_for "Database#transaction" do
654
655
  'BEGIN', 'SET TRANSACTION ISOLATION LEVEL SERIALIZABLE', 'DROP TABLE serializable', 'COMMIT']
655
656
  end
656
657
 
657
- specify "should support :disconnect=>:retry option for automatically retrying on disconnect" do
658
+ qspecify "should support :disconnect=>:retry option for automatically retrying on disconnect" do
658
659
  a = []
659
660
  @db.transaction(:disconnect=>:retry){a << 1; raise Sequel::DatabaseDisconnectError if a.length < 2}
660
661
  @db.sqls.should == ['BEGIN', 'ROLLBACK', 'BEGIN', 'COMMIT']
@@ -703,14 +704,12 @@ shared_examples_for "Database#transaction" do
703
704
  a.should == [1] * 100
704
705
  end
705
706
 
706
- specify "should raise an error if using :disconnect=>:retry and :retry_on together" do
707
+ qspecify "should raise an error if using :disconnect=>:retry and :retry_on together" do
707
708
  proc{@db.transaction(:disconnect=>:retry, :retry_on=>Sequel::ConstraintViolation){}}.should raise_error(Sequel::Error)
708
709
  @db.sqls.should == []
709
710
  end
710
711
 
711
712
  specify "should raise an error if attempting to use :disconnect=>:retry or :retry_on inside another transaction" do
712
- proc{@db.transaction{@db.transaction(:disconnect=>:retry){}}}.should raise_error(Sequel::Error)
713
- @db.sqls.should == ['BEGIN', 'ROLLBACK']
714
713
  proc{@db.transaction{@db.transaction(:retry_on=>Sequel::ConstraintViolation){}}}.should raise_error(Sequel::Error)
715
714
  @db.sqls.should == ['BEGIN', 'ROLLBACK']
716
715
  end
@@ -1145,7 +1144,7 @@ end
1145
1144
 
1146
1145
  describe "A Database adapter with a scheme" do
1147
1146
  before do
1148
- @ccc = Class.new(Sequel::Database)
1147
+ @ccc = Class.new(Sequel::Mock::Database)
1149
1148
  @ccc.send(:set_adapter_scheme, :ccc)
1150
1149
  end
1151
1150
 
@@ -1210,6 +1209,7 @@ describe "A Database adapter with a scheme" do
1210
1209
 
1211
1210
  # invalid parameters
1212
1211
  proc {Sequel.ccc('abc', 'def')}.should raise_error(Sequel::Error)
1212
+ proc {Sequel.ccc(1)}.should raise_error(Sequel::Error)
1213
1213
 
1214
1214
  c = Sequel.ccc('mydb')
1215
1215
  c.should be_a_kind_of(@ccc)
@@ -1266,6 +1266,7 @@ describe "A Database adapter with a scheme" do
1266
1266
  end
1267
1267
 
1268
1268
  specify "should test the connection if test parameter is truthy" do
1269
+ @ccc.send(:define_method, :connect){}
1269
1270
  proc{Sequel.connect 'ccc:///d%5bb%5d?test=t'}.should raise_error(Sequel::DatabaseConnectionError)
1270
1271
  proc{Sequel.connect 'ccc:///d%5bb%5d?test=1'}.should raise_error(Sequel::DatabaseConnectionError)
1271
1272
  proc{Sequel.connect 'ccc:///d%5bb%5d', :test=>true}.should raise_error(Sequel::DatabaseConnectionError)
@@ -1365,12 +1366,14 @@ describe "A single threaded database" do
1365
1366
  end
1366
1367
 
1367
1368
  specify "should convert an Exception on connection into a DatabaseConnectionError" do
1368
- db = Sequel::Database.new(:single_threaded => true, :servers=>{}){raise Exception}
1369
+ db = Sequel::Database.new(:single_threaded => true, :servers=>{})
1370
+ def db.connect(*) raise Exception end
1369
1371
  proc {db.pool.hold {|c|}}.should raise_error(Sequel::DatabaseConnectionError)
1370
1372
  end
1371
1373
 
1372
1374
  specify "should raise a DatabaseConnectionError if the connection proc returns nil" do
1373
- db = Sequel::Database.new(:single_threaded => true, :servers=>{}){nil}
1375
+ db = Sequel.mock(:single_threaded => true, :servers=>{})
1376
+ def db.connect(*) end
1374
1377
  proc {db.pool.hold {|c|}}.should raise_error(Sequel::DatabaseConnectionError)
1375
1378
  end
1376
1379
  end
@@ -1504,19 +1507,24 @@ describe "Database#get" do
1504
1507
  end
1505
1508
 
1506
1509
  specify "should use Dataset#get to get a single value" do
1507
- @db.get(1).should == 1
1508
- @db.sqls.should == ['SELECT 1 LIMIT 1']
1510
+ @db.get(:a).should == 1
1511
+ @db.sqls.should == ['SELECT a LIMIT 1']
1509
1512
 
1510
- @db.get(Sequel.function(:version))
1511
- @db.sqls.should == ['SELECT version() LIMIT 1']
1513
+ @db.get(Sequel.function(:version).as(:version))
1514
+ @db.sqls.should == ['SELECT version() AS version LIMIT 1']
1512
1515
  end
1513
1516
 
1514
1517
  specify "should accept a block" do
1515
- @db.get{1}
1516
- @db.sqls.should == ['SELECT 1 LIMIT 1']
1518
+ @db.get{a}
1519
+ @db.sqls.should == ['SELECT a LIMIT 1']
1517
1520
 
1518
- @db.get{version(1)}
1519
- @db.sqls.should == ['SELECT version(1) LIMIT 1']
1521
+ @db.get{version(a).as(version)}
1522
+ @db.sqls.should == ['SELECT version(a) AS version LIMIT 1']
1523
+ end
1524
+
1525
+ qspecify "should work when an alias cannot be determined" do
1526
+ @db.get(1).should == 1
1527
+ @db.sqls.should == ['SELECT 1 LIMIT 1']
1520
1528
  end
1521
1529
  end
1522
1530
 
@@ -2033,6 +2041,12 @@ describe "Database#typecast_value" do
2033
2041
  end
2034
2042
  end
2035
2043
 
2044
+ qspecify "should typecast hash and array values to String" do
2045
+ [[], {}].each do |i|
2046
+ @db.typecast_value(:string, i).should be_an_instance_of(String)
2047
+ end
2048
+ end
2049
+
2036
2050
  specify "should typecast time values to SQLTime" do
2037
2051
  t = Time.now
2038
2052
  st = Sequel::SQLTime.local(t.year, t.month, t.day, 1, 2, 3)
@@ -2360,15 +2374,15 @@ describe "Database specific exception classes" do
2360
2374
  specify "should use appropriate exception classes for given SQL states" do
2361
2375
  @db.fetch = ArgumentError
2362
2376
  @db.sql_state = '23502'
2363
- proc{@db.get(1)}.should raise_error(Sequel::NotNullConstraintViolation)
2377
+ proc{@db.get(:a)}.should raise_error(Sequel::NotNullConstraintViolation)
2364
2378
  @db.sql_state = '23503'
2365
- proc{@db.get(1)}.should raise_error(Sequel::ForeignKeyConstraintViolation)
2379
+ proc{@db.get(:a)}.should raise_error(Sequel::ForeignKeyConstraintViolation)
2366
2380
  @db.sql_state = '23505'
2367
- proc{@db.get(1)}.should raise_error(Sequel::UniqueConstraintViolation)
2381
+ proc{@db.get(:a)}.should raise_error(Sequel::UniqueConstraintViolation)
2368
2382
  @db.sql_state = '23513'
2369
- proc{@db.get(1)}.should raise_error(Sequel::CheckConstraintViolation)
2383
+ proc{@db.get(:a)}.should raise_error(Sequel::CheckConstraintViolation)
2370
2384
  @db.sql_state = '40001'
2371
- proc{@db.get(1)}.should raise_error(Sequel::SerializationFailure)
2385
+ proc{@db.get(:a)}.should raise_error(Sequel::SerializationFailure)
2372
2386
  end
2373
2387
  end
2374
2388
 
@@ -2,16 +2,19 @@ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
3
  describe "Dataset" do
4
4
  before do
5
- @dataset = Sequel::Dataset.new("db")
5
+ @dataset = Sequel.mock.dataset
6
6
  end
7
7
 
8
- specify "should accept database and opts in initialize" do
8
+ qspecify "should accept database and opts in initialize" do
9
9
  db = "db"
10
10
  opts = {:from => :test}
11
11
  d = Sequel::Dataset.new(db, opts)
12
12
  d.db.should be(db)
13
13
  d.opts.should be(opts)
14
+ end
14
15
 
16
+ specify "should accept database in initialize" do
17
+ db = "db"
15
18
  d = Sequel::Dataset.new(db)
16
19
  d.db.should be(db)
17
20
  d.opts.should be_a_kind_of(Hash)
@@ -108,7 +111,7 @@ end
108
111
 
109
112
  describe "Dataset#clone" do
110
113
  before do
111
- @dataset = Sequel::Dataset.new(nil).from(:items)
114
+ @dataset = Sequel.mock.dataset.from(:items)
112
115
  end
113
116
 
114
117
  specify "should create an exact copy of the dataset" do
@@ -207,7 +210,7 @@ end
207
210
 
208
211
  describe "A simple dataset" do
209
212
  before do
210
- @dataset = Sequel::Dataset.new(nil).from(:test)
213
+ @dataset = Sequel.mock.dataset.from(:test)
211
214
  end
212
215
 
213
216
  specify "should format a select statement" do
@@ -283,7 +286,7 @@ end
283
286
 
284
287
  describe "A dataset with multiple tables in its FROM clause" do
285
288
  before do
286
- @dataset = Sequel::Dataset.new(nil).from(:t1, :t2)
289
+ @dataset = Sequel.mock.dataset.from(:t1, :t2)
287
290
  end
288
291
 
289
292
  specify "should raise on #update_sql" do
@@ -309,7 +312,7 @@ end
309
312
 
310
313
  describe "Dataset#unused_table_alias" do
311
314
  before do
312
- @ds = Sequel::Dataset.new(nil).from(:test)
315
+ @ds = Sequel.mock.dataset.from(:test)
313
316
  end
314
317
 
315
318
  specify "should return given symbol if it hasn't already been used" do
@@ -409,6 +412,21 @@ describe "Dataset#where" do
409
412
  @dataset.where('price < :price AND id in :ids', :price=>100).select_sql.should == "SELECT * FROM test WHERE (price < 100 AND id in :ids)"
410
413
  end
411
414
 
415
+ qspecify "should handle a mismatched number of placeholders" do
416
+ @dataset.where('price < ? AND id in ?', 100).select_sql.should == "SELECT * FROM test WHERE (price < 100 AND id in NULL)"
417
+ @dataset.where('price < ? AND id in ?', 100, [1, 2, 3], 4).select_sql.should == "SELECT * FROM test WHERE (price < 100 AND id in (1, 2, 3))"
418
+ end
419
+
420
+ specify "should handle placeholders when using an array" do
421
+ @dataset.where(Sequel.lit(['price < ', ' AND id in '], 100, [1, 2, 3])).select_sql.should == "SELECT * FROM test WHERE price < 100 AND id in (1, 2, 3)"
422
+ @dataset.where(Sequel.lit(['price < ', ' AND id in '], 100)).select_sql.should == "SELECT * FROM test WHERE price < 100 AND id in "
423
+ end
424
+
425
+ qspecify "should handle a mismatched number of placeholders when using an array" do
426
+ @dataset.where(Sequel.lit(['a = ', ' AND price < ', ' AND id in '], 100)).select_sql.should == "SELECT * FROM test WHERE a = 100 AND price < AND id in NULL"
427
+ @dataset.where(Sequel.lit(['price < ', ' AND id in '], 100, [1, 2, 3], 4)).select_sql.should == "SELECT * FROM test WHERE price < 100 AND id in (1, 2, 3)"
428
+ end
429
+
412
430
  specify "should handle partial names" do
413
431
  @dataset.where('price < :price AND id = :p', :p=>2, :price=>100).select_sql.should == "SELECT * FROM test WHERE (price < 100 AND id = 2)"
414
432
  end
@@ -467,7 +485,7 @@ describe "Dataset#where" do
467
485
  @dataset.exclude([:id1, :id2] => []).sql.should == "SELECT * FROM test WHERE ((id1 = id1) AND (id2 = id2))"
468
486
  end
469
487
 
470
- specify "should handle all types of IN/NOT IN queries with empty arrays when empty_array_handle_nulls is false" do
488
+ qspecify "should handle all types of IN/NOT IN queries with empty arrays when empty_array_handle_nulls is false" do
471
489
  begin
472
490
  Sequel.empty_array_handle_nulls = false
473
491
  @dataset.filter(:id => []).sql.should == "SELECT * FROM test WHERE (1 = 0)"
@@ -521,7 +539,7 @@ describe "Dataset#where" do
521
539
  db.sqls.should == ["SELECT id1, id2 FROM test WHERE (region = 'Asia')"]
522
540
  end
523
541
 
524
- specify "should handle IN/NOT IN queries with multiple columns and an empty dataset where the database doesn't support it when empty_array_handle nulls is true" do
542
+ qspecify "should handle IN/NOT IN queries with multiple columns and an empty dataset where the database doesn't support it when empty_array_handle nulls is true" do
525
543
  begin
526
544
  Sequel.empty_array_handle_nulls = false
527
545
  meta_def(@dataset, :supports_multiple_column_in?){false}
@@ -618,14 +636,20 @@ end
618
636
 
619
637
  describe "Dataset#or" do
620
638
  before do
621
- @dataset = Sequel::Dataset.new(nil).from(:test)
639
+ @dataset = Sequel.mock.dataset.from(:test)
622
640
  @d1 = @dataset.where(:x => 1)
623
641
  end
624
642
 
625
- specify "should raise if no filter exists" do
643
+ qspecify "should raise if no filter exists" do
626
644
  proc {@dataset.or(:a => 1)}.should raise_error(Sequel::Error)
627
645
  end
628
646
 
647
+ specify "should just clone if given an empty argument" do
648
+ @d1.or({}).sql.should == @d1.sql
649
+ @d1.or([]).sql.should == @d1.sql
650
+ @d1.or('').sql.should == @d1.sql
651
+ end
652
+
629
653
  specify "should add an alternative expression to the where clause" do
630
654
  @d1.or(:y => 2).sql.should == 'SELECT * FROM test WHERE ((x = 1) OR (y = 2))'
631
655
  end
@@ -647,15 +671,19 @@ describe "Dataset#or" do
647
671
  specify "should allow the use of blocks and arguments simultaneously" do
648
672
  @d1.or(Sequel.expr(:zz) < 3){yy > 3}.sql.should == 'SELECT * FROM test WHERE ((x = 1) OR ((zz < 3) AND (yy > 3)))'
649
673
  end
674
+
675
+ qspecify "should modify the having clause if there is already a having clause" do
676
+ @dataset.having(:x => 1).or(:y => 2).sql.should == 'SELECT * FROM test HAVING ((x = 1) OR (y = 2))'
677
+ end
650
678
  end
651
679
 
652
680
  describe "Dataset#and" do
653
681
  before do
654
- @dataset = Sequel::Dataset.new(nil).from(:test)
682
+ @dataset = Sequel.mock.dataset.from(:test)
655
683
  @d1 = @dataset.where(:x => 1)
656
684
  end
657
685
 
658
- specify "should raise if no filter exists" do
686
+ qspecify "should raise if no filter exists" do
659
687
  proc {@dataset.and(:a => 1)}.should raise_error(Sequel::Error)
660
688
  proc {@dataset.where(:a => 1).group(:t).and(:b => 2)}.should_not raise_error(Sequel::Error)
661
689
  @dataset.where(:a => 1).group(:t).and(:b => 2).sql.should == "SELECT * FROM test WHERE ((a = 1) AND (b = 2)) GROUP BY t"
@@ -682,14 +710,14 @@ end
682
710
 
683
711
  describe "Dataset#exclude" do
684
712
  before do
685
- @dataset = Sequel::Dataset.new(nil).from(:test)
713
+ @dataset = Sequel.mock.dataset.from(:test)
686
714
  end
687
715
 
688
716
  specify "should correctly negate the expression when one condition is given" do
689
717
  @dataset.exclude(:region=>'Asia').select_sql.should == "SELECT * FROM test WHERE (region != 'Asia')"
690
718
  end
691
719
 
692
- specify "should affect the having clause if having clause is already used" do
720
+ qspecify "should affect the having clause if having clause is already used" do
693
721
  @dataset.group_and_count(:name).having{count > 2}.exclude{count > 5}.sql.should == "SELECT name, count(*) AS count FROM test GROUP BY name HAVING ((count > 2) AND (count <= 5))"
694
722
  end
695
723
 
@@ -723,7 +751,7 @@ end
723
751
 
724
752
  describe "Dataset#exclude_where" do
725
753
  before do
726
- @dataset = Sequel::Dataset.new(nil).from(:test)
754
+ @dataset = Sequel.mock.dataset.from(:test)
727
755
  end
728
756
 
729
757
  specify "should correctly negate the expression and add it to the where clause" do
@@ -739,16 +767,16 @@ end
739
767
 
740
768
  describe "Dataset#exclude_having" do
741
769
  specify "should correctly negate the expression and add it to the having clause" do
742
- Sequel::Dataset.new(nil).from(:test).exclude_having{count > 2}.exclude_having{count < 0}.sql.should == "SELECT * FROM test HAVING ((count <= 2) AND (count >= 0))"
770
+ Sequel.mock.dataset.from(:test).exclude_having{count > 2}.exclude_having{count < 0}.sql.should == "SELECT * FROM test HAVING ((count <= 2) AND (count >= 0))"
743
771
  end
744
772
  end
745
773
 
746
774
  describe "Dataset#invert" do
747
775
  before do
748
- @d = Sequel::Dataset.new(nil).from(:test)
776
+ @d = Sequel.mock.dataset.from(:test)
749
777
  end
750
778
 
751
- specify "should raise error if the dataset is not filtered" do
779
+ qspecify "should raise error if the dataset is not filtered" do
752
780
  proc{@d.invert}.should raise_error(Sequel::Error)
753
781
  end
754
782
 
@@ -763,7 +791,7 @@ end
763
791
 
764
792
  describe "Dataset#having" do
765
793
  before do
766
- @dataset = Sequel::Dataset.new(nil).from(:test)
794
+ @dataset = Sequel.mock.dataset.from(:test)
767
795
  @grouped = @dataset.group(:region).select(:region, Sequel.function(:sum, :population), Sequel.function(:avg, :gdp))
768
796
  end
769
797
 
@@ -781,14 +809,18 @@ describe "Dataset#having" do
781
809
  @grouped.having{Sequel.function(:sum, :population) > 10}.sql.should == "SELECT region, sum(population), avg(gdp) FROM test GROUP BY region HAVING (sum(population) > 10)"
782
810
  end
783
811
 
784
- specify "should work with and on the having clause" do
812
+ qspecify "should work with and on the having clause" do
785
813
  @grouped.having(Sequel.expr(:a) > 1).and(Sequel.expr(:b) < 2).sql.should == "SELECT region, sum(population), avg(gdp) FROM test GROUP BY region HAVING ((a > 1) AND (b < 2))"
786
814
  end
815
+
816
+ qspecify "should work with filter on the having clause" do
817
+ @grouped.having(Sequel.expr(:a) > 1).filter(Sequel.expr(:b) < 2).sql.should == "SELECT region, sum(population), avg(gdp) FROM test GROUP BY region HAVING ((a > 1) AND (b < 2))"
818
+ end
787
819
  end
788
820
 
789
821
  describe "a grouped dataset" do
790
822
  before do
791
- @dataset = Sequel::Dataset.new(nil).from(:test).group(:type_id)
823
+ @dataset = Sequel.mock.dataset.from(:test).group(:type_id)
792
824
  end
793
825
 
794
826
  specify "should raise when trying to generate an update statement" do
@@ -815,7 +847,7 @@ describe "a grouped dataset" do
815
847
  specify "should format the right statement for counting (as a subquery)" do
816
848
  db = Sequel.mock
817
849
  db[:test].select(:name).group(:name).count
818
- db.sqls.should == ["SELECT COUNT(*) AS count FROM (SELECT name FROM test GROUP BY name) AS t1 LIMIT 1"]
850
+ db.sqls.should == ["SELECT count(*) AS count FROM (SELECT name FROM test GROUP BY name) AS t1 LIMIT 1"]
819
851
  end
820
852
  end
821
853
 
@@ -885,7 +917,7 @@ end
885
917
 
886
918
  describe "Dataset#as" do
887
919
  specify "should set up an alias" do
888
- dataset = Sequel::Dataset.new(nil).from(:test)
920
+ dataset = Sequel.mock.dataset.from(:test)
889
921
  dataset.select(dataset.limit(1).select(:name).as(:n)).sql.should == 'SELECT (SELECT name FROM test LIMIT 1) AS n FROM test'
890
922
  end
891
923
  end
@@ -1110,7 +1142,7 @@ end
1110
1142
 
1111
1143
  describe "Dataset#from" do
1112
1144
  before do
1113
- @dataset = Sequel::Dataset.new(nil)
1145
+ @dataset = Sequel.mock.dataset
1114
1146
  end
1115
1147
 
1116
1148
  specify "should accept a Dataset" do
@@ -1129,7 +1161,7 @@ describe "Dataset#from" do
1129
1161
  @dataset.from(d1, d2).sql.should == "SELECT * FROM (SELECT * FROM a GROUP BY b) AS t1, (SELECT * FROM c GROUP BY d) AS t2"
1130
1162
  end
1131
1163
 
1132
- specify "should accept a hash for aliasing" do
1164
+ qspecify "should accept a hash for aliasing" do
1133
1165
  @dataset.from(:a => :b).sql.should == "SELECT * FROM a AS b"
1134
1166
  @dataset.from(:a => 'b').sql.should == "SELECT * FROM a AS b"
1135
1167
  @dataset.from(@dataset.from(:a).group(:b) => :c).sql.should == "SELECT * FROM (SELECT * FROM a GROUP BY b) AS c"
@@ -1185,7 +1217,7 @@ end
1185
1217
 
1186
1218
  describe "Dataset#select" do
1187
1219
  before do
1188
- @d = Sequel::Dataset.new(nil).from(:test)
1220
+ @d = Sequel.mock.dataset.from(:test)
1189
1221
  end
1190
1222
 
1191
1223
  specify "should accept variable arity" do
@@ -1217,7 +1249,11 @@ describe "Dataset#select" do
1217
1249
  @d.select(Sequel.as([[:b, :c]], :n)).sql.should == 'SELECT (b = c) AS n FROM test'
1218
1250
  end
1219
1251
 
1220
- specify "should accept a hash for AS values" do
1252
+ qspecify "should handle hashes returned from virtual row blocks" do
1253
+ @d.select{{:b=>:c}}.sql.should == 'SELECT b AS c FROM test'
1254
+ end
1255
+
1256
+ qspecify "should accept a hash for AS values" do
1221
1257
  @d.select(:name => 'n', :__ggh => 'age').sql.should =~ /SELECT ((name AS n, __ggh AS age)|(__ggh AS age, name AS n)) FROM test/
1222
1258
  end
1223
1259
 
@@ -1229,7 +1265,7 @@ describe "Dataset#select" do
1229
1265
  specify "should accept arbitrary objects and literalize them correctly" do
1230
1266
  @d.select(1, :a, 't').sql.should == "SELECT 1, a, 't' FROM test"
1231
1267
  @d.select(nil, Sequel.function(:sum, :t), :x___y).sql.should == "SELECT NULL, sum(t), x AS y FROM test"
1232
- @d.select(nil, 1, :x => :y).sql.should == "SELECT NULL, 1, x AS y FROM test"
1268
+ @d.select(nil, 1, Sequel.as(:x, :y)).sql.should == "SELECT NULL, 1, x AS y FROM test"
1233
1269
  end
1234
1270
 
1235
1271
  specify "should accept a block that yields a virtual row" do
@@ -1249,7 +1285,7 @@ end
1249
1285
 
1250
1286
  describe "Dataset#select_group" do
1251
1287
  before do
1252
- @d = Sequel::Dataset.new(nil).from(:test)
1288
+ @d = Sequel.mock.dataset.from(:test)
1253
1289
  end
1254
1290
 
1255
1291
  specify "should set both SELECT and GROUP" do
@@ -1270,7 +1306,7 @@ end
1270
1306
 
1271
1307
  describe "Dataset#select_all" do
1272
1308
  before do
1273
- @d = Sequel::Dataset.new(nil).from(:test)
1309
+ @d = Sequel.mock.dataset.from(:test)
1274
1310
  end
1275
1311
 
1276
1312
  specify "should select the wildcard" do
@@ -1318,10 +1354,10 @@ end
1318
1354
 
1319
1355
  describe "Dataset#select_more" do
1320
1356
  before do
1321
- @d = Sequel::Dataset.new(nil).from(:test)
1357
+ @d = Sequel.mock.dataset.from(:test)
1322
1358
  end
1323
1359
 
1324
- specify "should act like #select for datasets with no selection" do
1360
+ qspecify "should act like #select for datasets with no selection" do
1325
1361
  @d.select_more(:a, :b).sql.should == 'SELECT a, b FROM test'
1326
1362
  @d.select_all.select_more(:a, :b).sql.should == 'SELECT a, b FROM test'
1327
1363
  @d.select(:blah).select_all.select_more(:a, :b).sql.should == 'SELECT a, b FROM test'
@@ -1340,7 +1376,7 @@ end
1340
1376
 
1341
1377
  describe "Dataset#select_append" do
1342
1378
  before do
1343
- @d = Sequel::Dataset.new(nil).from(:test)
1379
+ @d = Sequel.mock.dataset.from(:test)
1344
1380
  end
1345
1381
 
1346
1382
  specify "should select * in addition to columns if no columns selected" do
@@ -1370,7 +1406,7 @@ end
1370
1406
 
1371
1407
  describe "Dataset#order" do
1372
1408
  before do
1373
- @dataset = Sequel::Dataset.new(nil).from(:test)
1409
+ @dataset = Sequel.mock.dataset.from(:test)
1374
1410
  end
1375
1411
 
1376
1412
  specify "should include an ORDER BY clause in the select statement" do
@@ -1418,31 +1454,31 @@ end
1418
1454
 
1419
1455
  describe "Dataset#unfiltered" do
1420
1456
  specify "should remove filtering from the dataset" do
1421
- Sequel::Dataset.new(nil).from(:test).filter(:score=>1).unfiltered.sql.should == 'SELECT * FROM test'
1457
+ Sequel.mock.dataset.from(:test).filter(:score=>1).unfiltered.sql.should == 'SELECT * FROM test'
1422
1458
  end
1423
1459
  end
1424
1460
 
1425
1461
  describe "Dataset#unlimited" do
1426
1462
  specify "should remove limit and offset from the dataset" do
1427
- Sequel::Dataset.new(nil).from(:test).limit(1, 2).unlimited.sql.should == 'SELECT * FROM test'
1463
+ Sequel.mock.dataset.from(:test).limit(1, 2).unlimited.sql.should == 'SELECT * FROM test'
1428
1464
  end
1429
1465
  end
1430
1466
 
1431
1467
  describe "Dataset#ungrouped" do
1432
1468
  specify "should remove group and having clauses from the dataset" do
1433
- Sequel::Dataset.new(nil).from(:test).group(:a).having(:b).ungrouped.sql.should == 'SELECT * FROM test'
1469
+ Sequel.mock.dataset.from(:test).group(:a).having(:b).ungrouped.sql.should == 'SELECT * FROM test'
1434
1470
  end
1435
1471
  end
1436
1472
 
1437
1473
  describe "Dataset#unordered" do
1438
1474
  specify "should remove ordering from the dataset" do
1439
- Sequel::Dataset.new(nil).from(:test).order(:name).unordered.sql.should == 'SELECT * FROM test'
1475
+ Sequel.mock.dataset.from(:test).order(:name).unordered.sql.should == 'SELECT * FROM test'
1440
1476
  end
1441
1477
  end
1442
1478
 
1443
1479
  describe "Dataset#with_sql" do
1444
1480
  before do
1445
- @dataset = Sequel::Dataset.new(nil).from(:test)
1481
+ @dataset = Sequel.mock.dataset.from(:test)
1446
1482
  end
1447
1483
 
1448
1484
  specify "should use static sql" do
@@ -1471,7 +1507,7 @@ end
1471
1507
 
1472
1508
  describe "Dataset#order_by" do
1473
1509
  before do
1474
- @dataset = Sequel::Dataset.new(nil).from(:test)
1510
+ @dataset = Sequel.mock.dataset.from(:test)
1475
1511
  end
1476
1512
 
1477
1513
  specify "should include an ORDER BY clause in the select statement" do
@@ -1497,7 +1533,7 @@ end
1497
1533
 
1498
1534
  describe "Dataset#order_more and order_append" do
1499
1535
  before do
1500
- @dataset = Sequel::Dataset.new(nil).from(:test)
1536
+ @dataset = Sequel.mock.dataset.from(:test)
1501
1537
  end
1502
1538
 
1503
1539
  specify "should include an ORDER BY clause in the select statement" do
@@ -1520,7 +1556,7 @@ end
1520
1556
 
1521
1557
  describe "Dataset#order_prepend" do
1522
1558
  before do
1523
- @dataset = Sequel::Dataset.new(nil).from(:test)
1559
+ @dataset = Sequel.mock.dataset.from(:test)
1524
1560
  end
1525
1561
 
1526
1562
  specify "should include an ORDER BY clause in the select statement" do
@@ -1539,7 +1575,7 @@ end
1539
1575
 
1540
1576
  describe "Dataset#reverse_order" do
1541
1577
  before do
1542
- @dataset = Sequel::Dataset.new(nil).from(:test)
1578
+ @dataset = Sequel.mock.dataset.from(:test)
1543
1579
  end
1544
1580
 
1545
1581
  specify "should use DESC as default order" do
@@ -1587,7 +1623,7 @@ end
1587
1623
 
1588
1624
  describe "Dataset#limit" do
1589
1625
  before do
1590
- @dataset = Sequel::Dataset.new(nil).from(:test)
1626
+ @dataset = Sequel.mock.dataset.from(:test)
1591
1627
  end
1592
1628
 
1593
1629
  specify "should include a LIMIT clause in the select statement" do
@@ -1638,7 +1674,7 @@ end
1638
1674
 
1639
1675
  describe "Dataset#naked" do
1640
1676
  specify "should returned clone dataset without row_proc" do
1641
- d = Sequel::Dataset.new(nil)
1677
+ d = Sequel.mock.dataset
1642
1678
  d.row_proc = Proc.new{|r| r}
1643
1679
  d.naked.row_proc.should be_nil
1644
1680
  d.row_proc.should_not be_nil
@@ -1647,7 +1683,7 @@ end
1647
1683
 
1648
1684
  describe "Dataset#naked!" do
1649
1685
  specify "should remove any existing row_proc" do
1650
- d = Sequel::Dataset.new(nil)
1686
+ d = Sequel.mock.dataset
1651
1687
  d.row_proc = Proc.new{|r| r}
1652
1688
  d.naked!.row_proc.should be_nil
1653
1689
  d.row_proc.should be_nil
@@ -1656,7 +1692,7 @@ end
1656
1692
 
1657
1693
  describe "Dataset#qualified_column_name" do
1658
1694
  before do
1659
- @dataset = Sequel::Dataset.new(nil).from(:test)
1695
+ @dataset = Sequel.mock.dataset.from(:test)
1660
1696
  end
1661
1697
 
1662
1698
  specify "should return the literal value if not given a symbol" do
@@ -1812,7 +1848,7 @@ describe "Dataset#distinct" do
1812
1848
 
1813
1849
  specify "should do a subselect for count" do
1814
1850
  @dataset.distinct.count
1815
- @db.sqls.should == ['SELECT COUNT(*) AS count FROM (SELECT DISTINCT name FROM test) AS t1 LIMIT 1']
1851
+ @db.sqls.should == ['SELECT count(*) AS count FROM (SELECT DISTINCT name FROM test) AS t1 LIMIT 1']
1816
1852
  end
1817
1853
  end
1818
1854
 
@@ -1824,22 +1860,22 @@ describe "Dataset#count" do
1824
1860
 
1825
1861
  specify "should format SQL properly" do
1826
1862
  @dataset.count.should == 1
1827
- @db.sqls.should == ['SELECT COUNT(*) AS count FROM test LIMIT 1']
1863
+ @db.sqls.should == ['SELECT count(*) AS count FROM test LIMIT 1']
1828
1864
  end
1829
1865
 
1830
1866
  specify "should accept an argument" do
1831
1867
  @dataset.count(:foo).should == 1
1832
- @db.sqls.should == ['SELECT COUNT(foo) AS count FROM test LIMIT 1']
1868
+ @db.sqls.should == ['SELECT count(foo) AS count FROM test LIMIT 1']
1833
1869
  end
1834
1870
 
1835
1871
  specify "should work with a nil argument" do
1836
1872
  @dataset.count(nil).should == 1
1837
- @db.sqls.should == ['SELECT COUNT(NULL) AS count FROM test LIMIT 1']
1873
+ @db.sqls.should == ['SELECT count(NULL) AS count FROM test LIMIT 1']
1838
1874
  end
1839
1875
 
1840
1876
  specify "should accept a virtual row block" do
1841
1877
  @dataset.count{foo(bar)}.should == 1
1842
- @db.sqls.should == ['SELECT COUNT(foo(bar)) AS count FROM test LIMIT 1']
1878
+ @db.sqls.should == ['SELECT count(foo(bar)) AS count FROM test LIMIT 1']
1843
1879
  end
1844
1880
 
1845
1881
  specify "should raise an Error if given an argument and a block" do
@@ -1848,52 +1884,52 @@ describe "Dataset#count" do
1848
1884
 
1849
1885
  specify "should include the where clause if it's there" do
1850
1886
  @dataset.filter(Sequel.expr(:abc) < 30).count.should == 1
1851
- @db.sqls.should == ['SELECT COUNT(*) AS count FROM test WHERE (abc < 30) LIMIT 1']
1887
+ @db.sqls.should == ['SELECT count(*) AS count FROM test WHERE (abc < 30) LIMIT 1']
1852
1888
  end
1853
1889
 
1854
1890
  specify "should count properly for datasets with fixed sql" do
1855
1891
  @dataset.opts[:sql] = "select abc from xyz"
1856
1892
  @dataset.count.should == 1
1857
- @db.sqls.should == ["SELECT COUNT(*) AS count FROM (select abc from xyz) AS t1 LIMIT 1"]
1893
+ @db.sqls.should == ["SELECT count(*) AS count FROM (select abc from xyz) AS t1 LIMIT 1"]
1858
1894
  end
1859
1895
 
1860
1896
  specify "should count properly when using UNION, INTERSECT, or EXCEPT" do
1861
1897
  @dataset.union(@dataset).count.should == 1
1862
- @db.sqls.should == ["SELECT COUNT(*) AS count FROM (SELECT * FROM test UNION SELECT * FROM test) AS t1 LIMIT 1"]
1898
+ @db.sqls.should == ["SELECT count(*) AS count FROM (SELECT * FROM test UNION SELECT * FROM test) AS t1 LIMIT 1"]
1863
1899
  @dataset.intersect(@dataset).count.should == 1
1864
- @db.sqls.should == ["SELECT COUNT(*) AS count FROM (SELECT * FROM test INTERSECT SELECT * FROM test) AS t1 LIMIT 1"]
1900
+ @db.sqls.should == ["SELECT count(*) AS count FROM (SELECT * FROM test INTERSECT SELECT * FROM test) AS t1 LIMIT 1"]
1865
1901
  @dataset.except(@dataset).count.should == 1
1866
- @db.sqls.should == ["SELECT COUNT(*) AS count FROM (SELECT * FROM test EXCEPT SELECT * FROM test) AS t1 LIMIT 1"]
1902
+ @db.sqls.should == ["SELECT count(*) AS count FROM (SELECT * FROM test EXCEPT SELECT * FROM test) AS t1 LIMIT 1"]
1867
1903
  end
1868
1904
 
1869
1905
  specify "should return limit if count is greater than it" do
1870
1906
  @dataset.limit(5).count.should == 1
1871
- @db.sqls.should == ["SELECT COUNT(*) AS count FROM (SELECT * FROM test LIMIT 5) AS t1 LIMIT 1"]
1907
+ @db.sqls.should == ["SELECT count(*) AS count FROM (SELECT * FROM test LIMIT 5) AS t1 LIMIT 1"]
1872
1908
  end
1873
1909
 
1874
1910
  specify "should work correctly with offsets" do
1875
1911
  @dataset.limit(nil, 5).count.should == 1
1876
- @db.sqls.should == ["SELECT COUNT(*) AS count FROM (SELECT * FROM test OFFSET 5) AS t1 LIMIT 1"]
1912
+ @db.sqls.should == ["SELECT count(*) AS count FROM (SELECT * FROM test OFFSET 5) AS t1 LIMIT 1"]
1877
1913
  end
1878
1914
 
1879
1915
  it "should work on a graphed_dataset" do
1880
1916
  @dataset.should_receive(:columns).twice.and_return([:a])
1881
1917
  @dataset.graph(@dataset, [:a], :table_alias=>:test2).count.should == 1
1882
- @db.sqls.should == ['SELECT COUNT(*) AS count FROM test LEFT OUTER JOIN test AS test2 USING (a) LIMIT 1']
1918
+ @db.sqls.should == ['SELECT count(*) AS count FROM test LEFT OUTER JOIN test AS test2 USING (a) LIMIT 1']
1883
1919
  end
1884
1920
 
1885
1921
  specify "should not cache the columns value" do
1886
1922
  ds = @dataset.from(:blah).columns(:a)
1887
1923
  ds.columns.should == [:a]
1888
1924
  ds.count.should == 1
1889
- @db.sqls.should == ['SELECT COUNT(*) AS count FROM blah LIMIT 1']
1925
+ @db.sqls.should == ['SELECT count(*) AS count FROM blah LIMIT 1']
1890
1926
  ds.columns.should == [:a]
1891
1927
  end
1892
1928
  end
1893
1929
 
1894
1930
  describe "Dataset#group_and_count" do
1895
1931
  before do
1896
- @ds = Sequel::Dataset.new(nil).from(:test)
1932
+ @ds = Sequel.mock.dataset.from(:test)
1897
1933
  end
1898
1934
 
1899
1935
  specify "should format SQL properly" do
@@ -1941,7 +1977,7 @@ end
1941
1977
 
1942
1978
  describe "Dataset#first_source_alias" do
1943
1979
  before do
1944
- @ds = Sequel::Dataset.new(nil)
1980
+ @ds = Sequel.mock.dataset
1945
1981
  end
1946
1982
 
1947
1983
  specify "should be the entire first source if not aliased" do
@@ -1971,7 +2007,7 @@ end
1971
2007
 
1972
2008
  describe "Dataset#first_source_table" do
1973
2009
  before do
1974
- @ds = Sequel::Dataset.new(nil)
2010
+ @ds = Sequel.mock.dataset
1975
2011
  end
1976
2012
 
1977
2013
  specify "should be the entire first source if not aliased" do
@@ -1994,7 +2030,7 @@ end
1994
2030
 
1995
2031
  describe "Dataset#from_self" do
1996
2032
  before do
1997
- @ds = Sequel::Dataset.new(nil).from(:test).select(:name).limit(1)
2033
+ @ds = Sequel.mock.dataset.from(:test).select(:name).limit(1)
1998
2034
  end
1999
2035
 
2000
2036
  specify "should set up a default alias" do
@@ -2019,7 +2055,7 @@ describe "Dataset#from_self" do
2019
2055
  end
2020
2056
 
2021
2057
  specify "should hoist WITH clauses in current dataset if dataset doesn't support WITH in subselect" do
2022
- ds = Sequel::Dataset.new(nil)
2058
+ ds = Sequel.mock.dataset
2023
2059
  meta_def(ds, :supports_cte?){true}
2024
2060
  meta_def(ds, :supports_cte_in_subselect?){false}
2025
2061
  ds.from(:a).with(:a, ds.from(:b)).from_self.sql.should == 'WITH a AS (SELECT * FROM b) SELECT * FROM (SELECT * FROM a) AS t1'
@@ -2034,7 +2070,7 @@ end
2034
2070
 
2035
2071
  describe "Dataset#join_table" do
2036
2072
  before do
2037
- @d = Sequel::Dataset.new(nil).from(:items)
2073
+ @d = Sequel.mock.dataset.from(:items)
2038
2074
  @d.quote_identifiers = true
2039
2075
  end
2040
2076
 
@@ -2103,7 +2139,7 @@ describe "Dataset#join_table" do
2103
2139
  @d.join(:categories, :category_id=>:id).sql.should == 'SELECT * FROM "items" INNER JOIN "categories" ON ("categories"."category_id" = "items"."id")'
2104
2140
  end
2105
2141
 
2106
- specify "should support aliased tables using the deprecated argument" do
2142
+ qspecify "should support aliased tables using the deprecated argument" do
2107
2143
  @d.from('stats').join('players', {:id => :player_id}, 'p').sql.should == 'SELECT * FROM "stats" INNER JOIN "players" AS "p" ON ("p"."id" = "stats"."player_id")'
2108
2144
  end
2109
2145
 
@@ -2116,7 +2152,7 @@ describe "Dataset#join_table" do
2116
2152
  end
2117
2153
 
2118
2154
  specify "should support using an alias for the FROM when doing the first join with unqualified condition columns" do
2119
- @d.from(:foo=>:f).join_table(:inner, :bar, :id => :bar_id).sql.should == 'SELECT * FROM "foo" AS "f" INNER JOIN "bar" ON ("bar"."id" = "f"."bar_id")'
2155
+ @d.from(Sequel.as(:foo, :f)).join_table(:inner, :bar, :id => :bar_id).sql.should == 'SELECT * FROM "foo" AS "f" INNER JOIN "bar" ON ("bar"."id" = "f"."bar_id")'
2120
2156
  end
2121
2157
 
2122
2158
  specify "should support implicit schemas in from table symbols" do
@@ -2136,6 +2172,11 @@ describe "Dataset#join_table" do
2136
2172
  @d.from('stats').join('players', {:id => :player_id}, :implicit_qualifier=>:p).sql.should == 'SELECT * FROM "stats" INNER JOIN "players" ON ("players"."id" = "p"."player_id")'
2137
2173
  end
2138
2174
 
2175
+ specify "should default :qualify option to default_join_table_qualification" do
2176
+ def @d.default_join_table_qualification; false; end
2177
+ @d.from('stats').join(:players, :id => :player_id).sql.should == 'SELECT * FROM "stats" INNER JOIN "players" ON ("id" = "player_id")'
2178
+ end
2179
+
2139
2180
  specify "should not qualify if :qualify=>false option is given" do
2140
2181
  @d.from('stats').join(:players, {:id => :player_id}, :qualify=>false).sql.should == 'SELECT * FROM "stats" INNER JOIN "players" ON ("id" = "player_id")'
2141
2182
  end
@@ -2152,11 +2193,11 @@ describe "Dataset#join_table" do
2152
2193
  end
2153
2194
 
2154
2195
  specify "should raise error for a table without a source" do
2155
- proc {Sequel::Dataset.new(nil).join('players', :id => :player_id)}.should raise_error(Sequel::Error)
2196
+ proc {Sequel.mock.dataset.join('players', :id => :player_id)}.should raise_error(Sequel::Error)
2156
2197
  end
2157
2198
 
2158
2199
  specify "should support joining datasets" do
2159
- ds = Sequel::Dataset.new(nil).from(:categories)
2200
+ ds = Sequel.mock.dataset.from(:categories)
2160
2201
  @d.join_table(:left_outer, ds, :item_id => :id).sql.should == 'SELECT * FROM "items" LEFT OUTER JOIN (SELECT * FROM categories) AS "t1" ON ("t1"."item_id" = "items"."id")'
2161
2202
  ds.filter!(:active => true)
2162
2203
  @d.join_table(:left_outer, ds, :item_id => :id).sql.should == 'SELECT * FROM "items" LEFT OUTER JOIN (SELECT * FROM categories WHERE (active IS TRUE)) AS "t1" ON ("t1"."item_id" = "items"."id")'
@@ -2164,14 +2205,14 @@ describe "Dataset#join_table" do
2164
2205
  end
2165
2206
 
2166
2207
  specify "should support joining datasets and aliasing the join" do
2167
- ds = Sequel::Dataset.new(nil).from(:categories)
2168
- @d.join_table(:left_outer, ds, {:ds__item_id => :id}, :ds).sql.should == 'SELECT * FROM "items" LEFT OUTER JOIN (SELECT * FROM categories) AS "ds" ON ("ds"."item_id" = "items"."id")'
2208
+ ds = Sequel.mock.dataset.from(:categories)
2209
+ @d.join_table(:left_outer, ds, {:ds__item_id => :id}, :table_alias=>:ds).sql.should == 'SELECT * FROM "items" LEFT OUTER JOIN (SELECT * FROM categories) AS "ds" ON ("ds"."item_id" = "items"."id")'
2169
2210
  end
2170
2211
 
2171
2212
  specify "should support joining multiple datasets" do
2172
- ds = Sequel::Dataset.new(nil).from(:categories)
2173
- ds2 = Sequel::Dataset.new(nil).from(:nodes).select(:name)
2174
- ds3 = Sequel::Dataset.new(nil).from(:attributes).filter("name = 'blah'")
2213
+ ds = Sequel.mock.dataset.from(:categories)
2214
+ ds2 = Sequel.mock.dataset.from(:nodes).select(:name)
2215
+ ds3 = Sequel.mock.dataset.from(:attributes).filter("name = 'blah'")
2175
2216
 
2176
2217
  @d.join_table(:left_outer, ds, :item_id => :id).join_table(:inner, ds2, :node_id=>:id).join_table(:right_outer, ds3, :attribute_id=>:id).sql.should ==
2177
2218
  'SELECT * FROM "items" LEFT OUTER JOIN (SELECT * FROM categories) AS "t1" ON ("t1"."item_id" = "items"."id") ' \
@@ -2180,7 +2221,7 @@ describe "Dataset#join_table" do
2180
2221
  end
2181
2222
 
2182
2223
  specify "should support using an SQL String as the join condition" do
2183
- @d.join(:categories, "c.item_id = items.id", :c).sql.should == 'SELECT * FROM "items" INNER JOIN "categories" AS "c" ON (c.item_id = items.id)'
2224
+ @d.join(:categories, "c.item_id = items.id", :table_alias=>:c).sql.should == 'SELECT * FROM "items" INNER JOIN "categories" AS "c" ON (c.item_id = items.id)'
2184
2225
  end
2185
2226
 
2186
2227
  specify "should support using a boolean column as the join condition" do
@@ -2194,7 +2235,7 @@ describe "Dataset#join_table" do
2194
2235
  specify "should support natural and cross joins" do
2195
2236
  @d.join_table(:natural, :categories).sql.should == 'SELECT * FROM "items" NATURAL JOIN "categories"'
2196
2237
  @d.join_table(:cross, :categories, nil).sql.should == 'SELECT * FROM "items" CROSS JOIN "categories"'
2197
- @d.join_table(:natural, :categories, nil, :c).sql.should == 'SELECT * FROM "items" NATURAL JOIN "categories" AS "c"'
2238
+ @d.join_table(:natural, :categories, nil, :table_alias=>:c).sql.should == 'SELECT * FROM "items" NATURAL JOIN "categories" AS "c"'
2198
2239
  end
2199
2240
 
2200
2241
  specify "should support joins with a USING clause if an array of symbols is used" do
@@ -2210,7 +2251,7 @@ describe "Dataset#join_table" do
2210
2251
  specify "should hoist WITH clauses from subqueries if the dataset doesn't support CTEs in subselects" do
2211
2252
  meta_def(@d, :supports_cte?){true}
2212
2253
  meta_def(@d, :supports_cte_in_subselect?){false}
2213
- @d.join(Sequel::Dataset.new(nil).from(:categories).with(:a, Sequel::Dataset.new(nil).from(:b)), [:id]).sql.should == 'WITH "a" AS (SELECT * FROM b) SELECT * FROM "items" INNER JOIN (SELECT * FROM categories) AS "t1" USING ("id")'
2254
+ @d.join(Sequel.mock.dataset.from(:categories).with(:a, Sequel.mock.dataset.from(:b)), [:id]).sql.should == 'WITH "a" AS (SELECT * FROM b) SELECT * FROM "items" INNER JOIN (SELECT * FROM categories) AS "t1" USING ("id")'
2214
2255
  end
2215
2256
 
2216
2257
  specify "should raise an error if using an array of symbols with a block" do
@@ -2224,19 +2265,19 @@ describe "Dataset#join_table" do
2224
2265
  joins.should == []
2225
2266
  end
2226
2267
 
2227
- @d.from(:items=>:i).join(:categories, nil, :c) do |join_alias, last_join_alias, joins|
2268
+ @d.from(Sequel.as(:items, :i)).join(:categories, nil, :table_alias=>:c) do |join_alias, last_join_alias, joins|
2228
2269
  join_alias.should == :c
2229
2270
  last_join_alias.should == :i
2230
2271
  joins.should == []
2231
2272
  end
2232
2273
 
2233
- @d.from(:items___i).join(:categories, nil, :c) do |join_alias, last_join_alias, joins|
2274
+ @d.from(:items___i).join(:categories, nil, :table_alias=>:c) do |join_alias, last_join_alias, joins|
2234
2275
  join_alias.should == :c
2235
2276
  last_join_alias.should == :i
2236
2277
  joins.should == []
2237
2278
  end
2238
2279
 
2239
- @d.join(:blah).join(:categories, nil, :c) do |join_alias, last_join_alias, joins|
2280
+ @d.join(:blah).join(:categories, nil, :table_alias=>:c) do |join_alias, last_join_alias, joins|
2240
2281
  join_alias.should == :c
2241
2282
  last_join_alias.should == :blah
2242
2283
  joins.should be_a_kind_of(Array)
@@ -2245,7 +2286,7 @@ describe "Dataset#join_table" do
2245
2286
  joins.first.join_type.should == :inner
2246
2287
  end
2247
2288
 
2248
- @d.join_table(:natural, :blah, nil, :b).join(:categories, nil, :c) do |join_alias, last_join_alias, joins|
2289
+ @d.join_table(:natural, :blah, nil, :table_alias=>:b).join(:categories, nil, :table_alias=>:c) do |join_alias, last_join_alias, joins|
2249
2290
  join_alias.should == :c
2250
2291
  last_join_alias.should == :b
2251
2292
  joins.should be_a_kind_of(Array)
@@ -2296,7 +2337,7 @@ describe "Dataset#join_table" do
2296
2337
  end
2297
2338
 
2298
2339
  describe "Dataset#[]=" do
2299
- specify "should perform an update on the specified filter" do
2340
+ qspecify "should perform an update on the specified filter" do
2300
2341
  db = Sequel.mock
2301
2342
  ds = db[:items]
2302
2343
  ds[:a => 1] = {:x => 3}
@@ -2305,7 +2346,7 @@ describe "Dataset#[]=" do
2305
2346
  end
2306
2347
 
2307
2348
  describe "Dataset#set" do
2308
- specify "should act as alias to #update" do
2349
+ qspecify "should act as alias to #update" do
2309
2350
  db = Sequel.mock
2310
2351
  ds = db[:items]
2311
2352
  ds.set({:x => 3})
@@ -2319,7 +2360,7 @@ describe "Dataset#insert_multiple" do
2319
2360
  @ds = @db[:items]
2320
2361
  end
2321
2362
 
2322
- specify "should insert all items in the supplied array" do
2363
+ qspecify "should insert all items in the supplied array" do
2323
2364
  @ds.insert_multiple(['aa', 5, 3, {:a => 2}])
2324
2365
  @db.sqls.should == ["INSERT INTO items VALUES ('aa')",
2325
2366
  "INSERT INTO items VALUES (5)",
@@ -2327,18 +2368,18 @@ describe "Dataset#insert_multiple" do
2327
2368
  "INSERT INTO items (a) VALUES (2)"]
2328
2369
  end
2329
2370
 
2330
- specify "should pass array items through the supplied block if given" do
2371
+ qspecify "should pass array items through the supplied block if given" do
2331
2372
  @ds.insert_multiple(["inevitable", "hello", "the ticking clock"]){|i| i.gsub('l', 'r')}
2332
2373
  @db.sqls.should == ["INSERT INTO items VALUES ('inevitabre')",
2333
2374
  "INSERT INTO items VALUES ('herro')",
2334
2375
  "INSERT INTO items VALUES ('the ticking crock')"]
2335
2376
  end
2336
2377
 
2337
- specify "should return array of inserted ids" do
2378
+ qspecify "should return array of inserted ids" do
2338
2379
  @ds.insert_multiple(['aa', 5, 3, {:a => 2}]).should == [2, 3, 4, 5]
2339
2380
  end
2340
2381
 
2341
- specify "should work exactly like in metioned in the example" do
2382
+ qspecify "should work exactly like in metioned in the example" do
2342
2383
  @ds.insert_multiple([{:x=>1}, {:x=>2}]){|row| row[:y] = row[:x] * 2 ; row }
2343
2384
  sqls = @db.sqls
2344
2385
  ["INSERT INTO items (x, y) VALUES (1, 2)", "INSERT INTO items (y, x) VALUES (2, 1)"].should include(sqls[0])
@@ -2352,38 +2393,38 @@ describe "Dataset aggregate methods" do
2352
2393
  end
2353
2394
 
2354
2395
  specify "should include min" do
2355
- @d.min(:a).should == 'SELECT min(a) FROM test LIMIT 1'
2396
+ @d.min(:a).should == 'SELECT min(a) AS min FROM test LIMIT 1'
2356
2397
  end
2357
2398
 
2358
2399
  specify "should include max" do
2359
- @d.max(:b).should == 'SELECT max(b) FROM test LIMIT 1'
2400
+ @d.max(:b).should == 'SELECT max(b) AS max FROM test LIMIT 1'
2360
2401
  end
2361
2402
 
2362
2403
  specify "should include sum" do
2363
- @d.sum(:c).should == 'SELECT sum(c) FROM test LIMIT 1'
2404
+ @d.sum(:c).should == 'SELECT sum(c) AS sum FROM test LIMIT 1'
2364
2405
  end
2365
2406
 
2366
2407
  specify "should include avg" do
2367
- @d.avg(:d).should == 'SELECT avg(d) FROM test LIMIT 1'
2408
+ @d.avg(:d).should == 'SELECT avg(d) AS avg FROM test LIMIT 1'
2368
2409
  end
2369
2410
 
2370
2411
  specify "should accept qualified columns" do
2371
- @d.avg(:test__bc).should == 'SELECT avg(test.bc) FROM test LIMIT 1'
2412
+ @d.avg(:test__bc).should == 'SELECT avg(test.bc) AS avg FROM test LIMIT 1'
2372
2413
  end
2373
2414
 
2374
2415
  specify "should use a subselect for the same conditions as count" do
2375
2416
  d = @d.order(:a).limit(5)
2376
- d.avg(:a).should == 'SELECT avg(a) FROM (SELECT * FROM test ORDER BY a LIMIT 5) AS t1 LIMIT 1'
2377
- d.sum(:a).should == 'SELECT sum(a) FROM (SELECT * FROM test ORDER BY a LIMIT 5) AS t1 LIMIT 1'
2378
- d.min(:a).should == 'SELECT min(a) FROM (SELECT * FROM test ORDER BY a LIMIT 5) AS t1 LIMIT 1'
2379
- d.max(:a).should == 'SELECT max(a) FROM (SELECT * FROM test ORDER BY a LIMIT 5) AS t1 LIMIT 1'
2417
+ d.avg(:a).should == 'SELECT avg(a) AS avg FROM (SELECT * FROM test ORDER BY a LIMIT 5) AS t1 LIMIT 1'
2418
+ d.sum(:a).should == 'SELECT sum(a) AS sum FROM (SELECT * FROM test ORDER BY a LIMIT 5) AS t1 LIMIT 1'
2419
+ d.min(:a).should == 'SELECT min(a) AS min FROM (SELECT * FROM test ORDER BY a LIMIT 5) AS t1 LIMIT 1'
2420
+ d.max(:a).should == 'SELECT max(a) AS max FROM (SELECT * FROM test ORDER BY a LIMIT 5) AS t1 LIMIT 1'
2380
2421
  end
2381
2422
 
2382
2423
  specify "should accept virtual row blocks" do
2383
- @d.avg{a(b)}.should == 'SELECT avg(a(b)) FROM test LIMIT 1'
2384
- @d.sum{a(b)}.should == 'SELECT sum(a(b)) FROM test LIMIT 1'
2385
- @d.min{a(b)}.should == 'SELECT min(a(b)) FROM test LIMIT 1'
2386
- @d.max{a(b)}.should == 'SELECT max(a(b)) FROM test LIMIT 1'
2424
+ @d.avg{a(b)}.should == 'SELECT avg(a(b)) AS avg FROM test LIMIT 1'
2425
+ @d.sum{a(b)}.should == 'SELECT sum(a(b)) AS sum FROM test LIMIT 1'
2426
+ @d.min{a(b)}.should == 'SELECT min(a(b)) AS min FROM test LIMIT 1'
2427
+ @d.max{a(b)}.should == 'SELECT max(a(b)) AS max FROM test LIMIT 1'
2387
2428
  end
2388
2429
  end
2389
2430
 
@@ -2424,20 +2465,20 @@ describe "Dataset#interval" do
2424
2465
 
2425
2466
  specify "should generate the correct SQL statement" do
2426
2467
  @ds.interval(:stamp)
2427
- @db.sqls.should == ["SELECT (max(stamp) - min(stamp)) FROM test LIMIT 1"]
2468
+ @db.sqls.should == ["SELECT (max(stamp) - min(stamp)) AS interval FROM test LIMIT 1"]
2428
2469
 
2429
2470
  @ds.filter(Sequel.expr(:price) > 100).interval(:stamp)
2430
- @db.sqls.should == ["SELECT (max(stamp) - min(stamp)) FROM test WHERE (price > 100) LIMIT 1"]
2471
+ @db.sqls.should == ["SELECT (max(stamp) - min(stamp)) AS interval FROM test WHERE (price > 100) LIMIT 1"]
2431
2472
  end
2432
2473
 
2433
2474
  specify "should use a subselect for the same conditions as count" do
2434
2475
  @ds.order(:stamp).limit(5).interval(:stamp).should == 1234
2435
- @db.sqls.should == ['SELECT (max(stamp) - min(stamp)) FROM (SELECT * FROM test ORDER BY stamp LIMIT 5) AS t1 LIMIT 1']
2476
+ @db.sqls.should == ['SELECT (max(stamp) - min(stamp)) AS interval FROM (SELECT * FROM test ORDER BY stamp LIMIT 5) AS t1 LIMIT 1']
2436
2477
  end
2437
2478
 
2438
2479
  specify "should accept virtual row blocks" do
2439
2480
  @ds.interval{a(b)}
2440
- @db.sqls.should == ["SELECT (max(a(b)) - min(a(b))) FROM test LIMIT 1"]
2481
+ @db.sqls.should == ["SELECT (max(a(b)) - min(a(b))) AS interval FROM test LIMIT 1"]
2441
2482
  end
2442
2483
  end
2443
2484
 
@@ -2541,25 +2582,28 @@ end
2541
2582
 
2542
2583
  describe "Dataset compound operations" do
2543
2584
  before do
2544
- @a = Sequel::Dataset.new(nil).from(:a).filter(:z => 1)
2545
- @b = Sequel::Dataset.new(nil).from(:b).filter(:z => 2)
2585
+ @a = Sequel.mock.dataset.from(:a).filter(:z => 1)
2586
+ @b = Sequel.mock.dataset.from(:b).filter(:z => 2)
2546
2587
  end
2547
2588
 
2589
+ qspecify "should support ALL with deprecated 2nd argument" do
2590
+ @b.union(@a, true).sql.should == "SELECT * FROM (SELECT * FROM b WHERE (z = 2) UNION ALL SELECT * FROM a WHERE (z = 1)) AS t1"
2591
+ @b.intersect(@a, true).sql.should == "SELECT * FROM (SELECT * FROM b WHERE (z = 2) INTERSECT ALL SELECT * FROM a WHERE (z = 1)) AS t1"
2592
+ @b.except(@a, true).sql.should == "SELECT * FROM (SELECT * FROM b WHERE (z = 2) EXCEPT ALL SELECT * FROM a WHERE (z = 1)) AS t1"
2593
+ end
2594
+
2548
2595
  specify "should support UNION and UNION ALL" do
2549
2596
  @a.union(@b).sql.should == "SELECT * FROM (SELECT * FROM a WHERE (z = 1) UNION SELECT * FROM b WHERE (z = 2)) AS t1"
2550
- @b.union(@a, true).sql.should == "SELECT * FROM (SELECT * FROM b WHERE (z = 2) UNION ALL SELECT * FROM a WHERE (z = 1)) AS t1"
2551
2597
  @b.union(@a, :all=>true).sql.should == "SELECT * FROM (SELECT * FROM b WHERE (z = 2) UNION ALL SELECT * FROM a WHERE (z = 1)) AS t1"
2552
2598
  end
2553
2599
 
2554
2600
  specify "should support INTERSECT and INTERSECT ALL" do
2555
2601
  @a.intersect(@b).sql.should == "SELECT * FROM (SELECT * FROM a WHERE (z = 1) INTERSECT SELECT * FROM b WHERE (z = 2)) AS t1"
2556
- @b.intersect(@a, true).sql.should == "SELECT * FROM (SELECT * FROM b WHERE (z = 2) INTERSECT ALL SELECT * FROM a WHERE (z = 1)) AS t1"
2557
2602
  @b.intersect(@a, :all=>true).sql.should == "SELECT * FROM (SELECT * FROM b WHERE (z = 2) INTERSECT ALL SELECT * FROM a WHERE (z = 1)) AS t1"
2558
2603
  end
2559
2604
 
2560
2605
  specify "should support EXCEPT and EXCEPT ALL" do
2561
2606
  @a.except(@b).sql.should == "SELECT * FROM (SELECT * FROM a WHERE (z = 1) EXCEPT SELECT * FROM b WHERE (z = 2)) AS t1"
2562
- @b.except(@a, true).sql.should == "SELECT * FROM (SELECT * FROM b WHERE (z = 2) EXCEPT ALL SELECT * FROM a WHERE (z = 1)) AS t1"
2563
2607
  @b.except(@a, :all=>true).sql.should == "SELECT * FROM (SELECT * FROM b WHERE (z = 2) EXCEPT ALL SELECT * FROM a WHERE (z = 1)) AS t1"
2564
2608
  end
2565
2609
 
@@ -2582,33 +2626,33 @@ describe "Dataset compound operations" do
2582
2626
  specify "should raise an InvalidOperation if INTERSECT or EXCEPT is used and they are not supported" do
2583
2627
  meta_def(@a, :supports_intersect_except?){false}
2584
2628
  proc{@a.intersect(@b)}.should raise_error(Sequel::InvalidOperation)
2585
- proc{@a.intersect(@b, true)}.should raise_error(Sequel::InvalidOperation)
2629
+ proc{@a.intersect(@b,:all=> true)}.should raise_error(Sequel::InvalidOperation)
2586
2630
  proc{@a.except(@b)}.should raise_error(Sequel::InvalidOperation)
2587
- proc{@a.except(@b, true)}.should raise_error(Sequel::InvalidOperation)
2631
+ proc{@a.except(@b, :all=>true)}.should raise_error(Sequel::InvalidOperation)
2588
2632
  end
2589
2633
 
2590
2634
  specify "should raise an InvalidOperation if INTERSECT ALL or EXCEPT ALL is used and they are not supported" do
2591
2635
  meta_def(@a, :supports_intersect_except_all?){false}
2592
2636
  proc{@a.intersect(@b)}.should_not raise_error
2593
- proc{@a.intersect(@b, true)}.should raise_error(Sequel::InvalidOperation)
2637
+ proc{@a.intersect(@b, :all=>true)}.should raise_error(Sequel::InvalidOperation)
2594
2638
  proc{@a.except(@b)}.should_not raise_error
2595
- proc{@a.except(@b, true)}.should raise_error(Sequel::InvalidOperation)
2639
+ proc{@a.except(@b, :all=>true)}.should raise_error(Sequel::InvalidOperation)
2596
2640
  end
2597
2641
 
2598
2642
  specify "should handle chained compound operations" do
2599
- @a.union(@b).union(@a, true).sql.should == "SELECT * FROM (SELECT * FROM (SELECT * FROM a WHERE (z = 1) UNION SELECT * FROM b WHERE (z = 2)) AS t1 UNION ALL SELECT * FROM a WHERE (z = 1)) AS t1"
2600
- @a.intersect(@b, true).intersect(@a).sql.should == "SELECT * FROM (SELECT * FROM (SELECT * FROM a WHERE (z = 1) INTERSECT ALL SELECT * FROM b WHERE (z = 2)) AS t1 INTERSECT SELECT * FROM a WHERE (z = 1)) AS t1"
2601
- @a.except(@b).except(@a, true).sql.should == "SELECT * FROM (SELECT * FROM (SELECT * FROM a WHERE (z = 1) EXCEPT SELECT * FROM b WHERE (z = 2)) AS t1 EXCEPT ALL SELECT * FROM a WHERE (z = 1)) AS t1"
2643
+ @a.union(@b).union(@a, :all=>true).sql.should == "SELECT * FROM (SELECT * FROM (SELECT * FROM a WHERE (z = 1) UNION SELECT * FROM b WHERE (z = 2)) AS t1 UNION ALL SELECT * FROM a WHERE (z = 1)) AS t1"
2644
+ @a.intersect(@b, :all=>true).intersect(@a).sql.should == "SELECT * FROM (SELECT * FROM (SELECT * FROM a WHERE (z = 1) INTERSECT ALL SELECT * FROM b WHERE (z = 2)) AS t1 INTERSECT SELECT * FROM a WHERE (z = 1)) AS t1"
2645
+ @a.except(@b).except(@a, :all=>true).sql.should == "SELECT * FROM (SELECT * FROM (SELECT * FROM a WHERE (z = 1) EXCEPT SELECT * FROM b WHERE (z = 2)) AS t1 EXCEPT ALL SELECT * FROM a WHERE (z = 1)) AS t1"
2602
2646
  end
2603
2647
 
2604
2648
  specify "should use a subselect when using a compound operation with a dataset that already has a compound operation" do
2605
- @a.union(@b.union(@a, true)).sql.should == "SELECT * FROM (SELECT * FROM a WHERE (z = 1) UNION SELECT * FROM (SELECT * FROM b WHERE (z = 2) UNION ALL SELECT * FROM a WHERE (z = 1)) AS t1) AS t1"
2606
- @a.intersect(@b.intersect(@a), true).sql.should == "SELECT * FROM (SELECT * FROM a WHERE (z = 1) INTERSECT ALL SELECT * FROM (SELECT * FROM b WHERE (z = 2) INTERSECT SELECT * FROM a WHERE (z = 1)) AS t1) AS t1"
2607
- @a.except(@b.except(@a, true)).sql.should == "SELECT * FROM (SELECT * FROM a WHERE (z = 1) EXCEPT SELECT * FROM (SELECT * FROM b WHERE (z = 2) EXCEPT ALL SELECT * FROM a WHERE (z = 1)) AS t1) AS t1"
2649
+ @a.union(@b.union(@a, :all=>true)).sql.should == "SELECT * FROM (SELECT * FROM a WHERE (z = 1) UNION SELECT * FROM (SELECT * FROM b WHERE (z = 2) UNION ALL SELECT * FROM a WHERE (z = 1)) AS t1) AS t1"
2650
+ @a.intersect(@b.intersect(@a), :all=>true).sql.should == "SELECT * FROM (SELECT * FROM a WHERE (z = 1) INTERSECT ALL SELECT * FROM (SELECT * FROM b WHERE (z = 2) INTERSECT SELECT * FROM a WHERE (z = 1)) AS t1) AS t1"
2651
+ @a.except(@b.except(@a, :all=>true)).sql.should == "SELECT * FROM (SELECT * FROM a WHERE (z = 1) EXCEPT SELECT * FROM (SELECT * FROM b WHERE (z = 2) EXCEPT ALL SELECT * FROM a WHERE (z = 1)) AS t1) AS t1"
2608
2652
  end
2609
2653
 
2610
2654
  specify "should order and limit properly when using UNION, INTERSECT, or EXCEPT" do
2611
- @dataset = Sequel::Dataset.new(nil).from(:test)
2655
+ @dataset = Sequel.mock.dataset.from(:test)
2612
2656
  @dataset.union(@dataset).limit(2).sql.should == "SELECT * FROM (SELECT * FROM test UNION SELECT * FROM test) AS t1 LIMIT 2"
2613
2657
  @dataset.limit(2).intersect(@dataset).sql.should == "SELECT * FROM (SELECT * FROM (SELECT * FROM test LIMIT 2) AS t1 INTERSECT SELECT * FROM test) AS t1"
2614
2658
  @dataset.except(@dataset.limit(2)).sql.should == "SELECT * FROM (SELECT * FROM test EXCEPT SELECT * FROM (SELECT * FROM test LIMIT 2) AS t1) AS t1"
@@ -2622,7 +2666,7 @@ describe "Dataset compound operations" do
2622
2666
  end
2623
2667
 
2624
2668
  specify "should hoist WITH clauses in given dataset if dataset doesn't support WITH in subselect" do
2625
- ds = Sequel::Dataset.new(nil)
2669
+ ds = Sequel.mock.dataset
2626
2670
  meta_def(ds, :supports_cte?){true}
2627
2671
  meta_def(ds, :supports_cte_in_subselect?){false}
2628
2672
  ds.from(:a).union(ds.from(:c).with(:c, ds.from(:d)), :from_self=>false).sql.should == 'WITH c AS (SELECT * FROM d) SELECT * FROM a UNION SELECT * FROM c'
@@ -3038,7 +3082,7 @@ end
3038
3082
 
3039
3083
  describe "Dataset" do
3040
3084
  before do
3041
- @d = Sequel::Dataset.new(nil).from(:x)
3085
+ @d = Sequel.mock.dataset.from(:x)
3042
3086
  end
3043
3087
 
3044
3088
  specify "should support self-changing select!" do
@@ -3086,18 +3130,18 @@ describe "Dataset#to_csv" do
3086
3130
  @ds = Sequel.mock(:fetch=>[{:a=>1, :b=>2, :c=>3}, {:a=>4, :b=>5, :c=>6}, {:a=>7, :b=>8, :c=>9}])[:items].columns(:a, :b, :c)
3087
3131
  end
3088
3132
 
3089
- specify "should format a CSV representation of the records" do
3133
+ qspecify "should format a CSV representation of the records" do
3090
3134
  @ds.to_csv.should == "a, b, c\r\n1, 2, 3\r\n4, 5, 6\r\n7, 8, 9\r\n"
3091
3135
  end
3092
3136
 
3093
- specify "should exclude column titles if so specified" do
3137
+ qspecify "should exclude column titles if so specified" do
3094
3138
  @ds.to_csv(false).should == "1, 2, 3\r\n4, 5, 6\r\n7, 8, 9\r\n"
3095
3139
  end
3096
3140
  end
3097
3141
 
3098
3142
  describe "Dataset#update_sql" do
3099
3143
  before do
3100
- @ds = Sequel::Dataset.new(nil).from(:items)
3144
+ @ds = Sequel.mock.dataset.from(:items)
3101
3145
  end
3102
3146
 
3103
3147
  specify "should accept strings" do
@@ -3119,7 +3163,7 @@ end
3119
3163
 
3120
3164
  describe "Dataset#insert_sql" do
3121
3165
  before do
3122
- @ds = Sequel::Dataset.new(nil).from(:items)
3166
+ @ds = Sequel.mock.dataset.from(:items)
3123
3167
  end
3124
3168
 
3125
3169
  specify "should accept hash with symbol keys" do
@@ -3191,13 +3235,13 @@ describe "Dataset#inspect" do
3191
3235
  end
3192
3236
 
3193
3237
  specify "should include the class name and the corresponding SQL statement" do
3194
- Sequel::Dataset.new(nil).from(:blah).inspect.should == '#<Sequel::Dataset: "SELECT * FROM blah">'
3195
- InspectDataset.new(nil).from(:blah).inspect.should == '#<InspectDataset: "SELECT * FROM blah">'
3238
+ Sequel::Dataset.new(Sequel.mock).from(:blah).inspect.should == '#<Sequel::Dataset: "SELECT * FROM blah">'
3239
+ InspectDataset.new(Sequel.mock).from(:blah).inspect.should == '#<InspectDataset: "SELECT * FROM blah">'
3196
3240
  end
3197
3241
 
3198
3242
  specify "should skip anonymous classes" do
3199
- Class.new(Class.new(Sequel::Dataset)).new(nil).from(:blah).inspect.should == '#<Sequel::Dataset: "SELECT * FROM blah">'
3200
- Class.new(InspectDataset).new(nil).from(:blah).inspect.should == '#<InspectDataset: "SELECT * FROM blah">'
3243
+ Class.new(Class.new(Sequel::Dataset)).new(Sequel.mock).from(:blah).inspect.should == '#<Sequel::Dataset: "SELECT * FROM blah">'
3244
+ Class.new(InspectDataset).new(Sequel.mock).from(:blah).inspect.should == '#<InspectDataset: "SELECT * FROM blah">'
3201
3245
  end
3202
3246
  end
3203
3247
 
@@ -3290,7 +3334,7 @@ describe "Dataset default #fetch_rows, #insert, #update, #delete, #with_sql_dele
3290
3334
  @ds = @db[:items]
3291
3335
  end
3292
3336
 
3293
- specify "#fetch_rows should raise a Sequel::NotImplemented" do
3337
+ qspecify "#fetch_rows should raise a Sequel::NotImplemented" do
3294
3338
  proc{@ds.fetch_rows(''){}}.should raise_error(Sequel::NotImplemented)
3295
3339
  end
3296
3340
 
@@ -3535,10 +3579,11 @@ end
3535
3579
 
3536
3580
  describe "Sequel::Dataset #set_defaults" do
3537
3581
  before do
3538
- @ds = Sequel::Dataset.new(nil).from(:items).set_defaults(:x=>1)
3582
+ @ds = Sequel.mock.dataset.from(:items)
3539
3583
  end
3540
3584
 
3541
- specify "should set the default values for inserts" do
3585
+ qspecify "should set the default values for inserts" do
3586
+ @ds = @ds.set_defaults(:x=>1)
3542
3587
  @ds.insert_sql.should == "INSERT INTO items (x) VALUES (1)"
3543
3588
  @ds.insert_sql(:x=>2).should == "INSERT INTO items (x) VALUES (2)"
3544
3589
  @ds.insert_sql(:y=>2).should =~ /INSERT INTO items \([xy], [xy]\) VALUES \([21], [21]\)/
@@ -3546,7 +3591,8 @@ describe "Sequel::Dataset #set_defaults" do
3546
3591
  @ds.set_defaults(:x=>2).insert_sql.should == "INSERT INTO items (x) VALUES (2)"
3547
3592
  end
3548
3593
 
3549
- specify "should set the default values for updates" do
3594
+ qspecify "should set the default values for updates" do
3595
+ @ds = @ds.set_defaults(:x=>1)
3550
3596
  @ds.update_sql.should == "UPDATE items SET x = 1"
3551
3597
  @ds.update_sql(:x=>2).should == "UPDATE items SET x = 2"
3552
3598
  @ds.update_sql(:y=>2).should =~ /UPDATE items SET (x = 1|y = 2), (x = 1|y = 2)/
@@ -3557,10 +3603,11 @@ end
3557
3603
 
3558
3604
  describe "Sequel::Dataset #set_overrides" do
3559
3605
  before do
3560
- @ds = Sequel::Dataset.new(nil).from(:items).set_overrides(:x=>1)
3606
+ @ds = Sequel.mock.dataset.from(:items)
3561
3607
  end
3562
3608
 
3563
- specify "should override the given values for inserts" do
3609
+ qspecify "should override the given values for inserts" do
3610
+ @ds = @ds.set_overrides(:x=>1)
3564
3611
  @ds.insert_sql.should == "INSERT INTO items (x) VALUES (1)"
3565
3612
  @ds.insert_sql(:x=>2).should == "INSERT INTO items (x) VALUES (1)"
3566
3613
  @ds.insert_sql(:y=>2).should =~ /INSERT INTO items \([xy], [xy]\) VALUES \([21], [21]\)/
@@ -3568,7 +3615,8 @@ describe "Sequel::Dataset #set_overrides" do
3568
3615
  @ds.set_overrides(:x=>2).insert_sql.should == "INSERT INTO items (x) VALUES (1)"
3569
3616
  end
3570
3617
 
3571
- specify "should override the given values for updates" do
3618
+ qspecify "should override the given values for updates" do
3619
+ @ds = @ds.set_overrides(:x=>1)
3572
3620
  @ds.update_sql.should == "UPDATE items SET x = 1"
3573
3621
  @ds.update_sql(:x=>2).should == "UPDATE items SET x = 1"
3574
3622
  @ds.update_sql(:y=>2).should =~ /UPDATE items SET (x = 1|y = 2), (x = 1|y = 2)/
@@ -3577,112 +3625,106 @@ describe "Sequel::Dataset #set_overrides" do
3577
3625
  end
3578
3626
  end
3579
3627
 
3580
- describe "Sequel::Dataset#qualify" do
3581
- specify "should qualify to the given table" do
3582
- Sequel::Dataset.new(nil).from(:t).filter{a<b}.qualify(:e).sql.should == 'SELECT e.* FROM t WHERE (e.a < e.b)'
3583
- end
3584
-
3585
- specify "should qualify to the first source if no table if given" do
3586
- Sequel::Dataset.new(nil).from(:t).filter{a<b}.qualify.sql.should == 'SELECT t.* FROM t WHERE (t.a < t.b)'
3628
+ describe "Sequel::Dataset#qualify_to_first_source" do
3629
+ qspecify "should qualify to the first source" do
3630
+ Sequel.mock.dataset.from(:t).filter{a<b}.qualify_to_first_source.sql.should == 'SELECT t.* FROM t WHERE (t.a < t.b)'
3587
3631
  end
3588
3632
  end
3589
3633
 
3590
3634
  describe "Sequel::Dataset#qualify_to" do
3591
- specify "should qualify to the given table" do
3592
- Sequel::Dataset.new(nil).from(:t).filter{a<b}.qualify_to(:e).sql.should == 'SELECT e.* FROM t WHERE (e.a < e.b)'
3635
+ qspecify "should qualify to the given table" do
3636
+ Sequel.mock.dataset.from(:t).filter{a<b}.qualify_to(:e).sql.should == 'SELECT e.* FROM t WHERE (e.a < e.b)'
3593
3637
  end
3594
3638
  end
3595
3639
 
3596
- describe "Sequel::Dataset#qualify_to_first_source" do
3640
+ describe "Sequel::Dataset#qualify" do
3597
3641
  before do
3598
3642
  @ds = Sequel::Database.new[:t]
3599
3643
  end
3600
3644
 
3601
- specify "should qualify_to the first source" do
3602
- @ds.qualify_to_first_source.sql.should == 'SELECT t.* FROM t'
3603
- @ds.should_receive(:qualify_to).with(:t).once
3604
- @ds.qualify_to_first_source
3645
+ specify "should qualify to the table if one is given" do
3646
+ @ds.filter{a<b}.qualify(:e).sql.should == 'SELECT e.* FROM t WHERE (e.a < e.b)'
3605
3647
  end
3606
3648
 
3607
3649
  specify "should handle the select, order, where, having, and group options/clauses" do
3608
- @ds.select(:a).filter(:a=>1).order(:a).group(:a).having(:a).qualify_to_first_source.sql.should == 'SELECT t.a FROM t WHERE (t.a = 1) GROUP BY t.a HAVING t.a ORDER BY t.a'
3650
+ @ds.select(:a).filter(:a=>1).order(:a).group(:a).having(:a).qualify.sql.should == 'SELECT t.a FROM t WHERE (t.a = 1) GROUP BY t.a HAVING t.a ORDER BY t.a'
3609
3651
  end
3610
3652
 
3611
3653
  specify "should handle the select using a table.* if all columns are currently selected" do
3612
- @ds.filter(:a=>1).order(:a).group(:a).having(:a).qualify_to_first_source.sql.should == 'SELECT t.* FROM t WHERE (t.a = 1) GROUP BY t.a HAVING t.a ORDER BY t.a'
3654
+ @ds.filter(:a=>1).order(:a).group(:a).having(:a).qualify.sql.should == 'SELECT t.* FROM t WHERE (t.a = 1) GROUP BY t.a HAVING t.a ORDER BY t.a'
3613
3655
  end
3614
3656
 
3615
- specify "should handle hashes in select option" do
3616
- @ds.select(:a=>:b).qualify_to_first_source.sql.should == 'SELECT t.a AS b FROM t'
3657
+ qspecify "should handle hashes in select option" do
3658
+ @ds.select(:a=>:b).qualify.sql.should == 'SELECT t.a AS b FROM t'
3617
3659
  end
3618
3660
 
3619
3661
  specify "should handle symbols" do
3620
- @ds.select(:a, :b__c, :d___e, :f__g___h).qualify_to_first_source.sql.should == 'SELECT t.a, b.c, t.d AS e, f.g AS h FROM t'
3662
+ @ds.select(:a, :b__c, :d___e, :f__g___h).qualify.sql.should == 'SELECT t.a, b.c, t.d AS e, f.g AS h FROM t'
3621
3663
  end
3622
3664
 
3623
3665
  specify "should handle arrays" do
3624
- @ds.filter(:a=>[:b, :c]).qualify_to_first_source.sql.should == 'SELECT t.* FROM t WHERE (t.a IN (t.b, t.c))'
3666
+ @ds.filter(:a=>[:b, :c]).qualify.sql.should == 'SELECT t.* FROM t WHERE (t.a IN (t.b, t.c))'
3625
3667
  end
3626
3668
 
3627
3669
  specify "should handle hashes" do
3628
- @ds.select(Sequel.case({:b=>{:c=>1}}, false)).qualify_to_first_source.sql.should == "SELECT (CASE WHEN t.b THEN (t.c = 1) ELSE 'f' END) FROM t"
3670
+ @ds.select(Sequel.case({:b=>{:c=>1}}, false)).qualify.sql.should == "SELECT (CASE WHEN t.b THEN (t.c = 1) ELSE 'f' END) FROM t"
3629
3671
  end
3630
3672
 
3631
3673
  specify "should handle SQL::Identifiers" do
3632
- @ds.select{a}.qualify_to_first_source.sql.should == 'SELECT t.a FROM t'
3674
+ @ds.select{a}.qualify.sql.should == 'SELECT t.a FROM t'
3633
3675
  end
3634
3676
 
3635
3677
  specify "should handle SQL::OrderedExpressions" do
3636
- @ds.order(Sequel.desc(:a), Sequel.asc(:b)).qualify_to_first_source.sql.should == 'SELECT t.* FROM t ORDER BY t.a DESC, t.b ASC'
3678
+ @ds.order(Sequel.desc(:a), Sequel.asc(:b)).qualify.sql.should == 'SELECT t.* FROM t ORDER BY t.a DESC, t.b ASC'
3637
3679
  end
3638
3680
 
3639
3681
  specify "should handle SQL::AliasedExpressions" do
3640
- @ds.select(Sequel.expr(:a).as(:b)).qualify_to_first_source.sql.should == 'SELECT t.a AS b FROM t'
3682
+ @ds.select(Sequel.expr(:a).as(:b)).qualify.sql.should == 'SELECT t.a AS b FROM t'
3641
3683
  end
3642
3684
 
3643
3685
  specify "should handle SQL::CaseExpressions" do
3644
- @ds.filter{Sequel.case({a=>b}, c, d)}.qualify_to_first_source.sql.should == 'SELECT t.* FROM t WHERE (CASE t.d WHEN t.a THEN t.b ELSE t.c END)'
3686
+ @ds.filter{Sequel.case({a=>b}, c, d)}.qualify.sql.should == 'SELECT t.* FROM t WHERE (CASE t.d WHEN t.a THEN t.b ELSE t.c END)'
3645
3687
  end
3646
3688
 
3647
3689
  specify "should handle SQL:Casts" do
3648
- @ds.filter{a.cast(:boolean)}.qualify_to_first_source.sql.should == 'SELECT t.* FROM t WHERE CAST(t.a AS boolean)'
3690
+ @ds.filter{a.cast(:boolean)}.qualify.sql.should == 'SELECT t.* FROM t WHERE CAST(t.a AS boolean)'
3649
3691
  end
3650
3692
 
3651
3693
  specify "should handle SQL::Functions" do
3652
- @ds.filter{a(b, 1)}.qualify_to_first_source.sql.should == 'SELECT t.* FROM t WHERE a(t.b, 1)'
3694
+ @ds.filter{a(b, 1)}.qualify.sql.should == 'SELECT t.* FROM t WHERE a(t.b, 1)'
3653
3695
  end
3654
3696
 
3655
3697
  specify "should handle SQL::ComplexExpressions" do
3656
- @ds.filter{(a+b)<(c-3)}.qualify_to_first_source.sql.should == 'SELECT t.* FROM t WHERE ((t.a + t.b) < (t.c - 3))'
3698
+ @ds.filter{(a+b)<(c-3)}.qualify.sql.should == 'SELECT t.* FROM t WHERE ((t.a + t.b) < (t.c - 3))'
3657
3699
  end
3658
3700
 
3659
3701
  specify "should handle SQL::ValueLists" do
3660
- @ds.filter(:a=>Sequel.value_list([:b, :c])).qualify_to_first_source.sql.should == 'SELECT t.* FROM t WHERE (t.a IN (t.b, t.c))'
3702
+ @ds.filter(:a=>Sequel.value_list([:b, :c])).qualify.sql.should == 'SELECT t.* FROM t WHERE (t.a IN (t.b, t.c))'
3661
3703
  end
3662
3704
 
3663
3705
  specify "should handle SQL::Subscripts" do
3664
- @ds.filter{a.sql_subscript(b,3)}.qualify_to_first_source.sql.should == 'SELECT t.* FROM t WHERE t.a[t.b, 3]'
3706
+ @ds.filter{a.sql_subscript(b,3)}.qualify.sql.should == 'SELECT t.* FROM t WHERE t.a[t.b, 3]'
3665
3707
  end
3666
3708
 
3667
3709
  specify "should handle SQL::PlaceholderLiteralStrings" do
3668
- @ds.filter('? > ?', :a, 1).qualify_to_first_source.sql.should == 'SELECT t.* FROM t WHERE (t.a > 1)'
3710
+ @ds.filter('? > ?', :a, 1).qualify.sql.should == 'SELECT t.* FROM t WHERE (t.a > 1)'
3669
3711
  end
3670
3712
 
3671
3713
  specify "should handle SQL::PlaceholderLiteralStrings with named placeholders" do
3672
- @ds.filter(':a > :b', :a=>:c, :b=>1).qualify_to_first_source.sql.should == 'SELECT t.* FROM t WHERE (t.c > 1)'
3714
+ @ds.filter(':a > :b', :a=>:c, :b=>1).qualify.sql.should == 'SELECT t.* FROM t WHERE (t.c > 1)'
3673
3715
  end
3674
3716
 
3675
3717
  specify "should handle SQL::Wrappers" do
3676
- @ds.filter(Sequel::SQL::Wrapper.new(:a)).qualify_to_first_source.sql.should == 'SELECT t.* FROM t WHERE t.a'
3718
+ @ds.filter(Sequel::SQL::Wrapper.new(:a)).qualify.sql.should == 'SELECT t.* FROM t WHERE t.a'
3677
3719
  end
3678
3720
 
3679
3721
  specify "should handle SQL::WindowFunctions" do
3680
3722
  meta_def(@ds, :supports_window_functions?){true}
3681
- @ds.select{sum(:over, :args=>:a, :partition=>:b, :order=>:c){}}.qualify_to_first_source.sql.should == 'SELECT sum(t.a) OVER (PARTITION BY t.b ORDER BY t.c) FROM t'
3723
+ @ds.select{sum(:over, :args=>:a, :partition=>:b, :order=>:c){}}.qualify.sql.should == 'SELECT sum(t.a) OVER (PARTITION BY t.b ORDER BY t.c) FROM t'
3682
3724
  end
3683
3725
 
3684
3726
  specify "should handle all other objects by returning them unchanged" do
3685
- @ds.select("a").filter{a(3)}.filter('blah').order(Sequel.lit('true')).group(Sequel.lit('a > ?', 1)).having(false).qualify_to_first_source.sql.should == "SELECT 'a' FROM t WHERE (a(3) AND (blah)) GROUP BY a > 1 HAVING 'f' ORDER BY true"
3727
+ @ds.select("a").filter{a(3)}.filter('blah').order(Sequel.lit('true')).group(Sequel.lit('a > ?', 1)).having(false).qualify.sql.should == "SELECT 'a' FROM t WHERE (a(3) AND (blah)) GROUP BY a > 1 HAVING 'f' ORDER BY true"
3686
3728
  end
3687
3729
  end
3688
3730
 
@@ -4073,11 +4115,16 @@ describe "Sequel::Dataset#select_map" do
4073
4115
  @ds.db.sqls.should == []
4074
4116
  end
4075
4117
 
4076
- specify "should accept a block" do
4118
+ specify "should handle an expression without a determinable alias" do
4077
4119
  @ds.select_map{a(t__c)}.should == [1, 2]
4078
4120
  @ds.db.sqls.should == ['SELECT a(t.c) FROM t']
4079
4121
  end
4080
4122
 
4123
+ specify "should accept a block" do
4124
+ @ds.select_map{a(t__c).as(b)}.should == [1, 2]
4125
+ @ds.db.sqls.should == ['SELECT a(t.c) AS b FROM t']
4126
+ end
4127
+
4081
4128
  specify "should accept a block with an array of columns" do
4082
4129
  @ds.select_map{[a(t__c).as(c), a(t__c).as(c)]}.should == [[1, 1], [2, 2]]
4083
4130
  @ds.db.sqls.should == ['SELECT a(t.c) AS c, a(t.c) AS c FROM t']
@@ -4147,11 +4194,16 @@ describe "Sequel::Dataset#select_order_map" do
4147
4194
  @ds.db.sqls.should == ['SELECT a FROM t ORDER BY a DESC']
4148
4195
  end
4149
4196
 
4150
- specify "should accept a block" do
4197
+ specify "should handle an expression without a determinable alias" do
4151
4198
  @ds.select_order_map{a(t__c)}.should == [1, 2]
4152
4199
  @ds.db.sqls.should == ['SELECT a(t.c) FROM t ORDER BY a(t.c)']
4153
4200
  end
4154
4201
 
4202
+ specify "should accept a block" do
4203
+ @ds.select_order_map{a(t__c).as(b)}.should == [1, 2]
4204
+ @ds.db.sqls.should == ['SELECT a(t.c) AS b FROM t ORDER BY a(t.c)']
4205
+ end
4206
+
4155
4207
  specify "should accept a block with an array of columns" do
4156
4208
  @ds.select_order_map{[c.desc, a(t__c).as(c)]}.should == [[1, 1], [2, 2]]
4157
4209
  @ds.db.sqls.should == ['SELECT c, a(t.c) AS c FROM t ORDER BY c DESC, a(t.c)']
@@ -4311,7 +4363,7 @@ end
4311
4363
 
4312
4364
  describe "Dataset#lock_style and for_update" do
4313
4365
  before do
4314
- @ds = Sequel::Dataset.new(nil).from(:t)
4366
+ @ds = Sequel.mock.dataset.from(:t)
4315
4367
  end
4316
4368
 
4317
4369
  specify "#for_update should use FOR UPDATE" do
@@ -4334,7 +4386,7 @@ describe "Custom ASTTransformer" do
4334
4386
  (s.is_a?(Symbol) || s.is_a?(String)) ? :"#{s}#{s}" : super
4335
4387
  end
4336
4388
  end.new
4337
- ds = Sequel::Dataset.new(nil).from(:t).cross_join(:a___g).join(:b___h, [:c]).join(:d___i, :e=>:f)
4389
+ ds = Sequel.mock.dataset.from(:t).cross_join(:a___g).join(:b___h, [:c]).join(:d___i, :e=>:f)
4338
4390
  ds.sql.should == 'SELECT * FROM t CROSS JOIN a AS g INNER JOIN b AS h USING (c) INNER JOIN d AS i ON (i.e = h.f)'
4339
4391
  ds.clone(:from=>c.transform(ds.opts[:from]), :join=>c.transform(ds.opts[:join])).sql.should == 'SELECT * FROM tt CROSS JOIN aa AS gg INNER JOIN bb AS hh USING (cc) INNER JOIN dd AS ii ON (ii.ee = hh.ff)'
4340
4392
  end
@@ -4425,7 +4477,7 @@ describe "Dataset extensions" do
4425
4477
  end
4426
4478
  end
4427
4479
  before do
4428
- @ds = Sequel::Dataset.new(nil)
4480
+ @ds = Sequel.mock.dataset
4429
4481
  end
4430
4482
 
4431
4483
  specify "should be able to register an extension with a module Database#extension extend the module" do
@@ -4524,7 +4576,7 @@ describe "Dataset#schema_and_table" do
4524
4576
  @ds.schema_and_table(Sequel.qualify(:t, :s)).should == ['t', 's']
4525
4577
  end
4526
4578
 
4527
- it "should respect default_schema" do
4579
+ qspecify "should respect default_schema" do
4528
4580
  @ds.db.default_schema = :foo
4529
4581
  @ds.schema_and_table(:s).should == ['foo', 's']
4530
4582
  @ds.schema_and_table(:s, nil).should == [nil, 's']
@@ -4564,7 +4616,7 @@ describe "Dataset#split_qualifiers" do
4564
4616
  @ds.split_qualifiers(Sequel.qualify(Sequel.qualify(:d, :t), Sequel.qualify(:s, :s2))).should == ['d', 't', 's', 's2']
4565
4617
  end
4566
4618
 
4567
- it "should respect default_schema" do
4619
+ qspecify "should respect default_schema" do
4568
4620
  @ds.db.default_schema = :foo
4569
4621
  @ds.split_qualifiers(:s).should == ['foo', 's']
4570
4622
  @ds.split_qualifiers(:s, nil).should == ['s']