sequel 4.46.0 → 4.49.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 (228) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +210 -0
  3. data/Rakefile +1 -1
  4. data/doc/advanced_associations.rdoc +1 -1
  5. data/doc/opening_databases.rdoc +3 -2
  6. data/doc/release_notes/4.47.0.txt +56 -0
  7. data/doc/release_notes/4.48.0.txt +293 -0
  8. data/doc/release_notes/4.49.0.txt +222 -0
  9. data/lib/sequel/adapters/ado/access.rb +2 -1
  10. data/lib/sequel/adapters/do/postgres.rb +5 -2
  11. data/lib/sequel/adapters/ibmdb.rb +30 -8
  12. data/lib/sequel/adapters/jdbc/as400.rb +1 -1
  13. data/lib/sequel/adapters/jdbc/db2.rb +12 -3
  14. data/lib/sequel/adapters/jdbc/derby.rb +4 -5
  15. data/lib/sequel/adapters/jdbc/h2.rb +10 -1
  16. data/lib/sequel/adapters/jdbc/oracle.rb +16 -2
  17. data/lib/sequel/adapters/jdbc/postgresql.rb +46 -20
  18. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +9 -7
  19. data/lib/sequel/adapters/jdbc/sqlserver.rb +20 -6
  20. data/lib/sequel/adapters/jdbc.rb +39 -23
  21. data/lib/sequel/adapters/mock.rb +27 -19
  22. data/lib/sequel/adapters/mysql.rb +17 -16
  23. data/lib/sequel/adapters/mysql2.rb +5 -6
  24. data/lib/sequel/adapters/oracle.rb +5 -9
  25. data/lib/sequel/adapters/postgres.rb +91 -103
  26. data/lib/sequel/adapters/shared/db2.rb +22 -6
  27. data/lib/sequel/adapters/shared/mssql.rb +5 -4
  28. data/lib/sequel/adapters/shared/mysql.rb +79 -25
  29. data/lib/sequel/adapters/shared/oracle.rb +26 -3
  30. data/lib/sequel/adapters/shared/postgres.rb +199 -95
  31. data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
  32. data/lib/sequel/adapters/shared/sqlite.rb +72 -82
  33. data/lib/sequel/adapters/sqlanywhere.rb +4 -1
  34. data/lib/sequel/adapters/sqlite.rb +5 -3
  35. data/lib/sequel/adapters/swift/postgres.rb +5 -2
  36. data/lib/sequel/adapters/tinytds.rb +0 -5
  37. data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -1
  38. data/lib/sequel/adapters/utils/pg_types.rb +2 -76
  39. data/lib/sequel/ast_transformer.rb +1 -1
  40. data/lib/sequel/connection_pool/sharded_single.rb +1 -1
  41. data/lib/sequel/connection_pool/sharded_threaded.rb +1 -1
  42. data/lib/sequel/connection_pool/single.rb +2 -2
  43. data/lib/sequel/connection_pool/threaded.rb +2 -2
  44. data/lib/sequel/connection_pool.rb +9 -2
  45. data/lib/sequel/core.rb +2 -2
  46. data/lib/sequel/database/connecting.rb +8 -8
  47. data/lib/sequel/database/dataset.rb +6 -3
  48. data/lib/sequel/database/dataset_defaults.rb +14 -1
  49. data/lib/sequel/database/misc.rb +1 -1
  50. data/lib/sequel/database/query.rb +3 -0
  51. data/lib/sequel/database/schema_methods.rb +1 -1
  52. data/lib/sequel/dataset/actions.rb +72 -10
  53. data/lib/sequel/dataset/dataset_module.rb +58 -0
  54. data/lib/sequel/dataset/graph.rb +1 -1
  55. data/lib/sequel/dataset/misc.rb +1 -0
  56. data/lib/sequel/dataset/prepared_statements.rb +3 -3
  57. data/lib/sequel/dataset/query.rb +22 -11
  58. data/lib/sequel/dataset.rb +1 -1
  59. data/lib/sequel/exceptions.rb +8 -0
  60. data/lib/sequel/extensions/_model_pg_row.rb +5 -2
  61. data/lib/sequel/extensions/core_extensions.rb +4 -1
  62. data/lib/sequel/extensions/current_datetime_timestamp.rb +2 -1
  63. data/lib/sequel/extensions/date_arithmetic.rb +1 -0
  64. data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -3
  65. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +3 -0
  66. data/lib/sequel/extensions/filter_having.rb +2 -0
  67. data/lib/sequel/extensions/freeze_datasets.rb +2 -0
  68. data/lib/sequel/extensions/from_block.rb +1 -1
  69. data/lib/sequel/extensions/graph_each.rb +2 -2
  70. data/lib/sequel/extensions/hash_aliases.rb +2 -0
  71. data/lib/sequel/extensions/identifier_mangling.rb +0 -7
  72. data/lib/sequel/extensions/meta_def.rb +2 -0
  73. data/lib/sequel/extensions/migration.rb +11 -8
  74. data/lib/sequel/extensions/no_auto_literal_strings.rb +1 -1
  75. data/lib/sequel/extensions/null_dataset.rb +1 -0
  76. data/lib/sequel/extensions/pagination.rb +1 -1
  77. data/lib/sequel/extensions/pg_array.rb +207 -130
  78. data/lib/sequel/extensions/pg_hstore.rb +38 -20
  79. data/lib/sequel/extensions/pg_inet.rb +18 -6
  80. data/lib/sequel/extensions/pg_interval.rb +19 -12
  81. data/lib/sequel/extensions/pg_json.rb +25 -14
  82. data/lib/sequel/extensions/pg_json_ops.rb +2 -2
  83. data/lib/sequel/extensions/pg_range.rb +133 -100
  84. data/lib/sequel/extensions/pg_range_ops.rb +4 -3
  85. data/lib/sequel/extensions/pg_row.rb +68 -39
  86. data/lib/sequel/extensions/pg_row_ops.rb +11 -5
  87. data/lib/sequel/extensions/query_literals.rb +2 -0
  88. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +2 -0
  89. data/lib/sequel/extensions/s.rb +1 -1
  90. data/lib/sequel/extensions/schema_dumper.rb +29 -25
  91. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +3 -1
  92. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +83 -0
  93. data/lib/sequel/extensions/server_block.rb +32 -15
  94. data/lib/sequel/extensions/set_overrides.rb +2 -2
  95. data/lib/sequel/extensions/string_agg.rb +0 -1
  96. data/lib/sequel/extensions/symbol_aref.rb +0 -4
  97. data/lib/sequel/model/associations.rb +35 -7
  98. data/lib/sequel/model/base.rb +113 -87
  99. data/lib/sequel/model/dataset_module.rb +5 -43
  100. data/lib/sequel/model/errors.rb +2 -1
  101. data/lib/sequel/model/inflections.rb +17 -5
  102. data/lib/sequel/model.rb +26 -58
  103. data/lib/sequel/plugins/active_model.rb +2 -2
  104. data/lib/sequel/plugins/association_autoreloading.rb +2 -0
  105. data/lib/sequel/plugins/association_dependencies.rb +3 -3
  106. data/lib/sequel/plugins/association_pks.rb +73 -46
  107. data/lib/sequel/plugins/association_proxies.rb +1 -1
  108. data/lib/sequel/plugins/auto_validations.rb +6 -2
  109. data/lib/sequel/plugins/boolean_readers.rb +2 -2
  110. data/lib/sequel/plugins/boolean_subsets.rb +1 -1
  111. data/lib/sequel/plugins/caching.rb +19 -13
  112. data/lib/sequel/plugins/class_table_inheritance.rb +24 -13
  113. data/lib/sequel/plugins/column_conflicts.rb +7 -2
  114. data/lib/sequel/plugins/column_select.rb +3 -3
  115. data/lib/sequel/plugins/composition.rb +2 -2
  116. data/lib/sequel/plugins/csv_serializer.rb +8 -8
  117. data/lib/sequel/plugins/dataset_associations.rb +25 -13
  118. data/lib/sequel/plugins/defaults_setter.rb +13 -1
  119. data/lib/sequel/plugins/eager_each.rb +1 -1
  120. data/lib/sequel/plugins/force_encoding.rb +2 -2
  121. data/lib/sequel/plugins/hook_class_methods.rb +9 -12
  122. data/lib/sequel/plugins/identifier_columns.rb +2 -0
  123. data/lib/sequel/plugins/instance_filters.rb +3 -1
  124. data/lib/sequel/plugins/instance_hooks.rb +17 -9
  125. data/lib/sequel/plugins/json_serializer.rb +19 -12
  126. data/lib/sequel/plugins/lazy_attributes.rb +8 -7
  127. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +2 -0
  128. data/lib/sequel/plugins/modification_detection.rb +3 -0
  129. data/lib/sequel/plugins/nested_attributes.rb +6 -2
  130. data/lib/sequel/plugins/pg_array_associations.rb +5 -0
  131. data/lib/sequel/plugins/pg_row.rb +4 -2
  132. data/lib/sequel/plugins/pg_typecast_on_load.rb +2 -0
  133. data/lib/sequel/plugins/prepared_statements.rb +1 -0
  134. data/lib/sequel/plugins/rcte_tree.rb +4 -24
  135. data/lib/sequel/plugins/serialization.rb +9 -15
  136. data/lib/sequel/plugins/single_table_inheritance.rb +8 -3
  137. data/lib/sequel/plugins/split_values.rb +6 -5
  138. data/lib/sequel/plugins/static_cache.rb +31 -25
  139. data/lib/sequel/plugins/subset_conditions.rb +3 -1
  140. data/lib/sequel/plugins/table_select.rb +1 -1
  141. data/lib/sequel/plugins/touch.rb +4 -2
  142. data/lib/sequel/plugins/validation_class_methods.rb +5 -6
  143. data/lib/sequel/plugins/validation_helpers.rb +14 -8
  144. data/lib/sequel/plugins/xml_serializer.rb +4 -4
  145. data/lib/sequel/sql.rb +18 -9
  146. data/lib/sequel/version.rb +1 -1
  147. data/spec/adapters/db2_spec.rb +115 -14
  148. data/spec/adapters/mssql_spec.rb +4 -4
  149. data/spec/adapters/mysql_spec.rb +83 -29
  150. data/spec/adapters/oracle_spec.rb +28 -24
  151. data/spec/adapters/postgres_spec.rb +40 -24
  152. data/spec/adapters/sqlanywhere_spec.rb +88 -86
  153. data/spec/adapters/sqlite_spec.rb +29 -24
  154. data/spec/bin_spec.rb +7 -1
  155. data/spec/core/connection_pool_spec.rb +45 -14
  156. data/spec/core/database_spec.rb +155 -0
  157. data/spec/core/dataset_spec.rb +219 -36
  158. data/spec/core/schema_spec.rb +16 -0
  159. data/spec/core/spec_helper.rb +1 -0
  160. data/spec/core_extensions_spec.rb +6 -2
  161. data/spec/extensions/active_model_spec.rb +1 -1
  162. data/spec/extensions/arbitrary_servers_spec.rb +1 -1
  163. data/spec/extensions/association_pks_spec.rb +34 -2
  164. data/spec/extensions/auto_literal_strings_spec.rb +5 -1
  165. data/spec/extensions/auto_validations_spec.rb +2 -0
  166. data/spec/extensions/boolean_readers_spec.rb +1 -1
  167. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  168. data/spec/extensions/class_table_inheritance_spec.rb +106 -19
  169. data/spec/extensions/column_conflicts_spec.rb +11 -0
  170. data/spec/extensions/column_select_spec.rb +1 -0
  171. data/spec/extensions/composition_spec.rb +13 -0
  172. data/spec/extensions/connection_validator_spec.rb +1 -1
  173. data/spec/extensions/dataset_associations_spec.rb +20 -8
  174. data/spec/extensions/defaults_setter_spec.rb +15 -1
  175. data/spec/extensions/filter_having_spec.rb +5 -3
  176. data/spec/extensions/hash_aliases_spec.rb +3 -1
  177. data/spec/extensions/identifier_columns_spec.rb +3 -1
  178. data/spec/extensions/implicit_subquery_spec.rb +4 -2
  179. data/spec/extensions/json_serializer_spec.rb +18 -0
  180. data/spec/extensions/lazy_attributes_spec.rb +3 -3
  181. data/spec/extensions/many_through_many_spec.rb +4 -4
  182. data/spec/extensions/meta_def_spec.rb +9 -0
  183. data/spec/extensions/migration_spec.rb +3 -3
  184. data/spec/extensions/nested_attributes_spec.rb +14 -3
  185. data/spec/extensions/no_auto_literal_strings_spec.rb +8 -4
  186. data/spec/extensions/null_dataset_spec.rb +1 -1
  187. data/spec/extensions/pg_array_associations_spec.rb +29 -18
  188. data/spec/extensions/pg_array_spec.rb +44 -25
  189. data/spec/extensions/pg_hstore_spec.rb +10 -0
  190. data/spec/extensions/pg_inet_spec.rb +26 -0
  191. data/spec/extensions/pg_interval_spec.rb +20 -0
  192. data/spec/extensions/pg_json_spec.rb +24 -0
  193. data/spec/extensions/pg_range_spec.rb +98 -14
  194. data/spec/extensions/pg_row_spec.rb +14 -4
  195. data/spec/extensions/pg_typecast_on_load_spec.rb +11 -9
  196. data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
  197. data/spec/extensions/query_literals_spec.rb +3 -1
  198. data/spec/extensions/schema_dumper_spec.rb +108 -94
  199. data/spec/extensions/sequel_3_dataset_methods_spec.rb +10 -6
  200. data/spec/extensions/sequel_4_dataset_methods_spec.rb +121 -0
  201. data/spec/extensions/serialization_spec.rb +1 -1
  202. data/spec/extensions/server_block_spec.rb +7 -0
  203. data/spec/extensions/single_table_inheritance_spec.rb +17 -1
  204. data/spec/extensions/spec_helper.rb +7 -1
  205. data/spec/extensions/static_cache_spec.rb +75 -24
  206. data/spec/extensions/string_agg_spec.rb +1 -1
  207. data/spec/extensions/touch_spec.rb +9 -0
  208. data/spec/extensions/validation_helpers_spec.rb +10 -5
  209. data/spec/extensions/whitelist_security_spec.rb +26 -0
  210. data/spec/integration/associations_test.rb +8 -0
  211. data/spec/integration/dataset_test.rb +45 -44
  212. data/spec/integration/model_test.rb +53 -4
  213. data/spec/integration/plugin_test.rb +28 -4
  214. data/spec/integration/prepared_statement_test.rb +3 -0
  215. data/spec/integration/schema_test.rb +21 -1
  216. data/spec/integration/transaction_test.rb +40 -40
  217. data/spec/model/association_reflection_spec.rb +43 -1
  218. data/spec/model/associations_spec.rb +29 -9
  219. data/spec/model/class_dataset_methods_spec.rb +20 -4
  220. data/spec/model/dataset_methods_spec.rb +12 -3
  221. data/spec/model/eager_loading_spec.rb +8 -8
  222. data/spec/model/model_spec.rb +45 -1
  223. data/spec/model/plugins_spec.rb +34 -0
  224. data/spec/model/record_spec.rb +1 -1
  225. data/spec/spec_config.rb +2 -0
  226. metadata +11 -4
  227. data/spec/adapters/firebird_spec.rb +0 -405
  228. data/spec/adapters/informix_spec.rb +0 -100
@@ -18,6 +18,16 @@ describe "An empty ConnectionPool" do
18
18
  @cpool = Sequel::ConnectionPool.get_pool(mock_db.call, CONNECTION_POOL_DEFAULTS)
19
19
  end
20
20
 
21
+ deprecated "should support :pool_class option with string" do
22
+ begin
23
+ c = Class.new(Sequel::ConnectionPool)
24
+ Sequel::ConnectionPool::CONNECTION_POOL__MAP[:foo] = c
25
+ Sequel::ConnectionPool.get_pool(mock_db.call, :pool_class=>:foo).must_be_instance_of c
26
+ ensure
27
+ Sequel::ConnectionPool::CONNECTION_POOL__MAP.delete(c)
28
+ end
29
+ end
30
+
21
31
  it "should have no available connections" do
22
32
  @cpool.available_connections.must_equal []
23
33
  end
@@ -26,9 +36,13 @@ describe "An empty ConnectionPool" do
26
36
  @cpool.allocated.must_equal({})
27
37
  end
28
38
 
29
- it "should have a created_count of zero" do
39
+ deprecated "should have a created_count of zero" do
30
40
  @cpool.created_count.must_equal 0
31
41
  end
42
+
43
+ it "should have a size of zero" do
44
+ @cpool.size.must_equal 0
45
+ end
32
46
  end
33
47
 
34
48
  describe "ConnectionPool options" do
@@ -54,11 +68,11 @@ describe "A connection pool handling connections" do
54
68
  @cpool = Sequel::ConnectionPool.get_pool(mock_db.call(proc{|c| msp.call}){:got_connection}, CONNECTION_POOL_DEFAULTS.merge(:max_connections=>@max_size))
55
69
  end
56
70
 
57
- it "#hold should increment #created_count" do
71
+ it "#hold should increment #size" do
58
72
  @cpool.hold do
59
- @cpool.created_count.must_equal 1
60
- @cpool.hold {@cpool.hold {@cpool.created_count.must_equal 1}}
61
- Thread.new{@cpool.hold {_(@cpool.created_count).must_equal 2}}.join
73
+ @cpool.size.must_equal 1
74
+ @cpool.hold {@cpool.hold {@cpool.size.must_equal 1}}
75
+ Thread.new{@cpool.hold {_(@cpool.size).must_equal 2}}.join
62
76
  end
63
77
  end
64
78
 
@@ -100,7 +114,7 @@ describe "A connection pool handling connections" do
100
114
  q = Queue.new
101
115
  50.times{Thread.new{@cpool.hold{q.pop}}}
102
116
  50.times{q.push nil}
103
- @cpool.created_count.must_be :<=, @max_size
117
+ @cpool.size.must_be :<=, @max_size
104
118
  end
105
119
 
106
120
  it "database's disconnect connection method should be called when a disconnect is detected" do
@@ -110,16 +124,16 @@ describe "A connection pool handling connections" do
110
124
  end
111
125
 
112
126
  it "#hold should remove the connection if a DatabaseDisconnectError is raised" do
113
- @cpool.created_count.must_equal 0
127
+ @cpool.size.must_equal 0
114
128
  q, q1 = Queue.new, Queue.new
115
129
  @cpool.hold{Thread.new{@cpool.hold{q1.pop; q.push nil}; q1.pop; q.push nil}; q1.push nil; q.pop; q1.push nil; q.pop}
116
- @cpool.created_count.must_equal 2
130
+ @cpool.size.must_equal 2
117
131
  proc{@cpool.hold{raise Sequel::DatabaseDisconnectError}}.must_raise(Sequel::DatabaseDisconnectError)
118
- @cpool.created_count.must_equal 1
132
+ @cpool.size.must_equal 1
119
133
  proc{@cpool.hold{raise Sequel::DatabaseDisconnectError}}.must_raise(Sequel::DatabaseDisconnectError)
120
- @cpool.created_count.must_equal 0
134
+ @cpool.size.must_equal 0
121
135
  proc{@cpool.hold{raise Sequel::DatabaseDisconnectError}}.must_raise(Sequel::DatabaseDisconnectError)
122
- @cpool.created_count.must_equal 0
136
+ @cpool.size.must_equal 0
123
137
  end
124
138
  end
125
139
 
@@ -127,13 +141,13 @@ describe "A connection pool handling connection errors" do
127
141
  it "#hold should raise a Sequel::DatabaseConnectionError if an exception is raised by the connection_proc" do
128
142
  cpool = Sequel::ConnectionPool.get_pool(mock_db.call{raise Interrupt}, CONNECTION_POOL_DEFAULTS)
129
143
  proc{cpool.hold{:block_return}}.must_raise(Sequel::DatabaseConnectionError)
130
- cpool.created_count.must_equal 0
144
+ cpool.size.must_equal 0
131
145
  end
132
146
 
133
147
  it "#hold should raise a Sequel::DatabaseConnectionError if nil is returned by the connection_proc" do
134
148
  cpool = Sequel::ConnectionPool.get_pool(mock_db.call{nil}, CONNECTION_POOL_DEFAULTS)
135
149
  proc{cpool.hold{:block_return}}.must_raise(Sequel::DatabaseConnectionError)
136
- cpool.created_count.must_equal 0
150
+ cpool.size.must_equal 0
137
151
  end
138
152
  end
139
153
 
@@ -259,6 +273,23 @@ ThreadedConnectionPoolSpecs = shared_description do
259
273
  t.join
260
274
  end
261
275
 
276
+ it "should work when acquire fails and then succeeds" do
277
+ pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:max_connections=>2, :pool_timeout=>0))
278
+ def pool._acquire(*)
279
+ if @called
280
+ super
281
+ else
282
+ @called = true
283
+ nil
284
+ end
285
+ end
286
+ c = nil
287
+ pool.hold do |c1|
288
+ c = c1
289
+ end
290
+ c.wont_be_nil
291
+ end
292
+
262
293
  it "should wait until a connection is available if all are checked out" do
263
294
  pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:max_connections=>1, :pool_timeout=>0.1, :pool_sleep_time=>0))
264
295
  q, q1 = Queue.new, Queue.new
@@ -1083,7 +1114,7 @@ AllConnectionPoolClassesSpecs = shared_description do
1083
1114
  end
1084
1115
  end
1085
1116
 
1086
- Sequel::ConnectionPool::CONNECTION_POOL_MAP.keys.each do |k, v|
1117
+ Sequel::ConnectionPool::CONNECTION_POOL__MAP.keys.each do |k, v|
1087
1118
  opts = {:single_threaded=>k, :servers=>(v ? {} : nil)}
1088
1119
  describe "Connection pool with #{opts.inspect}" do
1089
1120
  before(:all) do
@@ -12,6 +12,12 @@ describe "A new Database" do
12
12
  end
13
13
  end
14
14
 
15
+ deprecated "should support DatasetClass constant" do
16
+ dbc = Class.new(Sequel::Database)
17
+ dbc::DatasetClass = dsc = Class.new(Sequel::Dataset)
18
+ dbc.new.dataset.must_be_kind_of(dsc)
19
+ end
20
+
15
21
  deprecated "should allow dup/clone" do
16
22
  @db.dup.must_be_kind_of @db.class
17
23
  @db.clone.must_be_kind_of @db.class
@@ -511,6 +517,130 @@ describe "Database#extend_datasets" do
511
517
  end
512
518
  end
513
519
 
520
+ describe "Database#extend_datasets custom methods" do
521
+ before do
522
+ @db = Sequel.mock
523
+ end
524
+
525
+ def ds
526
+ @db[:items]
527
+ end
528
+
529
+ it "should have dataset_module support a where method" do
530
+ @db.extend_datasets{where :released, :released}
531
+ ds.released.sql.must_equal 'SELECT * FROM items WHERE released'
532
+ ds.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE (foo AND released)'
533
+ end
534
+
535
+ it "should have dataset_module support a having method" do
536
+ @db.extend_datasets{having(:released){released}}
537
+ ds.released.sql.must_equal 'SELECT * FROM items HAVING released'
538
+ ds.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE foo HAVING released'
539
+ end
540
+
541
+ it "should have dataset_module support an exclude method" do
542
+ @db.extend_datasets{exclude :released, :released}
543
+ ds.released.sql.must_equal 'SELECT * FROM items WHERE NOT released'
544
+ ds.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE (foo AND NOT released)'
545
+ end
546
+
547
+ it "should have dataset_module support an exclude_having method" do
548
+ @db.extend_datasets{exclude_having :released, :released}
549
+ ds.released.sql.must_equal 'SELECT * FROM items HAVING NOT released'
550
+ ds.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE foo HAVING NOT released'
551
+ end
552
+
553
+ it "should have dataset_module support a distinct method" do
554
+ @db.extend_datasets{def supports_distinct_on?; true end; distinct :foo, :baz}
555
+ ds.foo.sql.must_equal 'SELECT DISTINCT ON (baz) * FROM items'
556
+ ds.where(:bar).foo.sql.must_equal 'SELECT DISTINCT ON (baz) * FROM items WHERE bar'
557
+ end
558
+
559
+ it "should have dataset_module support a grep method" do
560
+ @db.extend_datasets{grep :foo, :baz, 'quux%'}
561
+ ds.foo.sql.must_equal 'SELECT * FROM items WHERE ((baz LIKE \'quux%\' ESCAPE \'\\\'))'
562
+ ds.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE (bar AND ((baz LIKE \'quux%\' ESCAPE \'\\\')))'
563
+ end
564
+
565
+ it "should have dataset_module support a group method" do
566
+ @db.extend_datasets{group :foo, :baz}
567
+ ds.foo.sql.must_equal 'SELECT * FROM items GROUP BY baz'
568
+ ds.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar GROUP BY baz'
569
+ end
570
+
571
+ it "should have dataset_module support a group_and_count method" do
572
+ @db.extend_datasets{group_and_count :foo, :baz}
573
+ ds.foo.sql.must_equal 'SELECT baz, count(*) AS count FROM items GROUP BY baz'
574
+ ds.where(:bar).foo.sql.must_equal 'SELECT baz, count(*) AS count FROM items WHERE bar GROUP BY baz'
575
+ end
576
+
577
+ it "should have dataset_module support a group_append method" do
578
+ @db.extend_datasets{group_append :foo, :baz}
579
+ ds.foo.sql.must_equal 'SELECT * FROM items GROUP BY baz'
580
+ ds.group(:bar).foo.sql.must_equal 'SELECT * FROM items GROUP BY bar, baz'
581
+ end
582
+
583
+ it "should have dataset_module support a limit method" do
584
+ @db.extend_datasets{limit :foo, 1}
585
+ ds.foo.sql.must_equal 'SELECT * FROM items LIMIT 1'
586
+ ds.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar LIMIT 1'
587
+ end
588
+
589
+ it "should have dataset_module support a offset method" do
590
+ @db.extend_datasets{offset :foo, 1}
591
+ ds.foo.sql.must_equal 'SELECT * FROM items OFFSET 1'
592
+ ds.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar OFFSET 1'
593
+ end
594
+
595
+ it "should have dataset_module support a order method" do
596
+ @db.extend_datasets{order(:foo){:baz}}
597
+ ds.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz'
598
+ ds.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar ORDER BY baz'
599
+ end
600
+
601
+ it "should have dataset_module support a order_append method" do
602
+ @db.extend_datasets{order_append :foo, :baz}
603
+ ds.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz'
604
+ ds.order(:bar).foo.sql.must_equal 'SELECT * FROM items ORDER BY bar, baz'
605
+ end
606
+
607
+ it "should have dataset_module support a order_prepend method" do
608
+ @db.extend_datasets{order_prepend :foo, :baz}
609
+ ds.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz'
610
+ ds.order(:bar).foo.sql.must_equal 'SELECT * FROM items ORDER BY baz, bar'
611
+ end
612
+
613
+ it "should have dataset_module support a select method" do
614
+ @db.extend_datasets{select :foo, :baz}
615
+ ds.foo.sql.must_equal 'SELECT baz FROM items'
616
+ ds.where(:bar).foo.sql.must_equal 'SELECT baz FROM items WHERE bar'
617
+ end
618
+
619
+ it "should have dataset_module support a select_all method" do
620
+ @db.extend_datasets{select_all :foo, :baz}
621
+ ds.foo.sql.must_equal 'SELECT baz.* FROM items'
622
+ ds.where(:bar).foo.sql.must_equal 'SELECT baz.* FROM items WHERE bar'
623
+ end
624
+
625
+ it "should have dataset_module support a select_append method" do
626
+ @db.extend_datasets{select_append :foo, :baz}
627
+ ds.foo.sql.must_equal 'SELECT *, baz FROM items'
628
+ ds.where(:bar).foo.sql.must_equal 'SELECT *, baz FROM items WHERE bar'
629
+ end
630
+
631
+ it "should have dataset_module support a select_group method" do
632
+ @db.extend_datasets{select_group :foo, :baz}
633
+ ds.foo.sql.must_equal 'SELECT baz FROM items GROUP BY baz'
634
+ ds.where(:bar).foo.sql.must_equal 'SELECT baz FROM items WHERE bar GROUP BY baz'
635
+ end
636
+
637
+ it "should have dataset_module support a server method" do
638
+ @db.extend_datasets{server :foo, :baz}
639
+ ds.foo.opts[:server].must_equal :baz
640
+ ds.where(:bar).foo.opts[:server].must_equal :baz
641
+ end
642
+ end
643
+
514
644
  describe "Database#disconnect_connection" do
515
645
  it "should call close on the connection" do
516
646
  o = Object.new
@@ -2251,6 +2381,31 @@ describe "Database#typecast_value" do
2251
2381
  end
2252
2382
  end
2253
2383
 
2384
+ it "should have an underlying exception class available at cause" do
2385
+ begin
2386
+ @db.typecast_value(:date, 'a')
2387
+ true.must_equal false
2388
+ rescue Sequel::InvalidValue => e
2389
+ e.cause.must_be_kind_of(ArgumentError)
2390
+ end
2391
+ end if RUBY_VERSION >= '2.1'
2392
+
2393
+ it "should have an underlying exception class available at cause when using nested exceptions" do
2394
+ begin
2395
+ begin
2396
+ raise ArgumentError
2397
+ rescue => e1
2398
+ begin
2399
+ raise RuntimeError
2400
+ rescue => e2
2401
+ @db.send(:raise_error, e1)
2402
+ end
2403
+ end
2404
+ rescue Sequel::DatabaseError => e
2405
+ e.cause.must_be_kind_of(ArgumentError)
2406
+ end
2407
+ end if RUBY_VERSION >= '2.1'
2408
+
2254
2409
  it "should include underlying exception class in #inspect" do
2255
2410
  begin
2256
2411
  @db.typecast_value(:date, 'a')