sequel 3.47.0 → 3.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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']