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
@@ -28,9 +28,47 @@ describe Sequel::Database do
28
28
  end
29
29
  end
30
30
 
31
+ # SEQUEL5: Remove
31
32
  describe "Simple Dataset operations" do
32
33
  before(:all) do
33
- Sequel::DB2.use_clob_as_blob = true
34
+ deprecated do
35
+ Sequel::DB2.use_clob_as_blob = true
36
+ end
37
+ DB.send(:remove_instance_variable, :@use_clob_as_blob) if DB.send(:instance_variable_defined?, :@use_clob_as_blob)
38
+ DB.create_table!(:items) do
39
+ Integer :id, :primary_key => true
40
+ Integer :number
41
+ column :bin_string, 'varchar(20) for bit data'
42
+ column :bin_clob, 'clob'
43
+ end
44
+ @ds = DB[:items]
45
+ end
46
+ after(:each) do
47
+ @ds.delete
48
+ end
49
+ after(:all) do
50
+ deprecated do
51
+ Sequel::DB2.use_clob_as_blob = false
52
+ end
53
+ DB.send(:remove_instance_variable, :@use_clob_as_blob) if DB.send(:instance_variable_defined?, :@use_clob_as_blob)
54
+ DB.drop_table(:items)
55
+ end
56
+
57
+ it "should insert with a primary key specified" do
58
+ @ds.insert(:id => 1, :number => 10)
59
+ @ds.insert(:id => 100, :number => 20)
60
+ @ds.select_hash(:id, :number).must_equal(1 => 10, 100 => 20)
61
+ end
62
+
63
+ it "should insert into binary columns" do
64
+ @ds.insert(:id => 1, :bin_string => Sequel.blob("\1"), :bin_clob => Sequel.blob("\2"))
65
+ @ds.select(:bin_string, :bin_clob).first.must_equal(:bin_string => "\1", :bin_clob => "\2")
66
+ end
67
+ end
68
+
69
+ describe "Simple Dataset operations" do
70
+ before(:all) do
71
+ DB.use_clob_as_blob = true
34
72
  DB.create_table!(:items) do
35
73
  Integer :id, :primary_key => true
36
74
  Integer :number
@@ -43,7 +81,7 @@ describe "Simple Dataset operations" do
43
81
  @ds.delete
44
82
  end
45
83
  after(:all) do
46
- Sequel::DB2.use_clob_as_blob = false
84
+ DB.use_clob_as_blob = false
47
85
  DB.drop_table(:items)
48
86
  end
49
87
 
@@ -88,6 +126,7 @@ describe Sequel::Database do
88
126
  end
89
127
  end
90
128
 
129
+ # SEQUEL5: remove
91
130
  describe "Sequel::IBMDB.convert_smallint_to_bool" do
92
131
  before do
93
132
  @db = DB
@@ -95,55 +134,117 @@ describe "Sequel::IBMDB.convert_smallint_to_bool" do
95
134
  @ds = @db[:booltest]
96
135
  end
97
136
  after do
137
+ deprecated do
138
+ Sequel::IBMDB.convert_smallint_to_bool = true
139
+ end
140
+ @db.drop_table(:booltest)
141
+ end
142
+
143
+ deprecated "should consider smallint datatypes as boolean if set, but not larger smallints" do
144
+ @db.schema(:booltest, :reload=>true).first.last[:type].must_equal :boolean
145
+ @db.schema(:booltest, :reload=>true).first.last[:db_type].must_match /smallint/i
146
+ Sequel::IBMDB.convert_smallint_to_bool = false
147
+ @db.schema(:booltest, :reload=>true).first.last[:type].must_equal :integer
148
+ @db.schema(:booltest, :reload=>true).first.last[:db_type].must_match /smallint/i
149
+ end
150
+
151
+ deprecated "should return smallints as bools and integers as integers when set" do
98
152
  Sequel::IBMDB.convert_smallint_to_bool = true
153
+ @ds.delete
154
+ @ds.insert(:b=>true, :i=>10)
155
+ @ds.all.must_equal [{:b=>true, :i=>10}]
156
+ @ds.delete
157
+ @ds.insert(:b=>false, :i=>0)
158
+ @ds.all.must_equal [{:b=>false, :i=>0}]
159
+ @ds.delete
160
+ @ds.insert(:b=>true, :i=>1)
161
+ @ds.all.must_equal [{:b=>true, :i=>1}]
162
+
163
+ @ds = @ds.with_convert_smallint_to_bool(false)
164
+ @ds.delete
165
+ @ds.insert(:b=>true, :i=>10)
166
+ @ds.all.must_equal [{:b=>1, :i=>10}]
167
+ end
168
+
169
+ deprecated "should return all smallints as integers when unset" do
170
+ Sequel::IBMDB.convert_smallint_to_bool = false
171
+ @ds.delete
172
+ @ds.insert(:b=>true, :i=>10)
173
+ @ds.all.must_equal [{:b=>1, :i=>10}]
174
+ @ds.delete
175
+ @ds.insert(:b=>false, :i=>0)
176
+ @ds.all.must_equal [{:b=>0, :i=>0}]
177
+
178
+ @ds.delete
179
+ @ds.insert(:b=>1, :i=>10)
180
+ @ds.all.must_equal [{:b=>1, :i=>10}]
181
+ @ds.delete
182
+ @ds.insert(:b=>0, :i=>0)
183
+ @ds.all.must_equal [{:b=>0, :i=>0}]
184
+
185
+ @ds = @ds.with_convert_smallint_to_bool(true)
186
+ @ds.delete
187
+ @ds.insert(:b=>true, :i=>10)
188
+ @ds.all.must_equal [{:b=>true, :i=>10}]
189
+ end
190
+ end if DB.adapter_scheme == :ibmdb
191
+
192
+ describe "Sequel::IBMDB::Database#convert_smallint_to_bool" do
193
+ before do
194
+ @db = DB
195
+ @db.create_table!(:booltest){column :b, 'smallint'; column :i, 'integer'}
196
+ @ds = @db[:booltest]
197
+ end
198
+ after do
199
+ @db.convert_smallint_to_bool = nil # SEQUEL5: true
99
200
  @db.drop_table(:booltest)
100
201
  end
101
202
 
102
203
  it "should consider smallint datatypes as boolean if set, but not larger smallints" do
103
204
  @db.schema(:booltest, :reload=>true).first.last[:type].must_equal :boolean
104
205
  @db.schema(:booltest, :reload=>true).first.last[:db_type].must_match /smallint/i
105
- Sequel::IBMDB.convert_smallint_to_bool = false
206
+ @db.convert_smallint_to_bool = false
106
207
  @db.schema(:booltest, :reload=>true).first.last[:type].must_equal :integer
107
208
  @db.schema(:booltest, :reload=>true).first.last[:db_type].must_match /smallint/i
108
209
  end
109
210
 
110
211
  it "should return smallints as bools and integers as integers when set" do
111
- Sequel::IBMDB.convert_smallint_to_bool = true
212
+ @db.convert_smallint_to_bool = true
112
213
  @ds.delete
113
- @ds << {:b=>true, :i=>10}
214
+ @ds.insert(:b=>true, :i=>10)
114
215
  @ds.all.must_equal [{:b=>true, :i=>10}]
115
216
  @ds.delete
116
- @ds << {:b=>false, :i=>0}
217
+ @ds.insert(:b=>false, :i=>0)
117
218
  @ds.all.must_equal [{:b=>false, :i=>0}]
118
219
  @ds.delete
119
- @ds << {:b=>true, :i=>1}
220
+ @ds.insert(:b=>true, :i=>1)
120
221
  @ds.all.must_equal [{:b=>true, :i=>1}]
121
222
 
122
223
  @ds = @ds.with_convert_smallint_to_bool(false)
123
224
  @ds.delete
124
- @ds << {:b=>true, :i=>10}
225
+ @ds.insert(:b=>true, :i=>10)
125
226
  @ds.all.must_equal [{:b=>1, :i=>10}]
126
227
  end
127
228
 
128
229
  it "should return all smallints as integers when unset" do
129
- Sequel::IBMDB.convert_smallint_to_bool = false
230
+ @db.convert_smallint_to_bool = false
130
231
  @ds.delete
131
- @ds << {:b=>true, :i=>10}
232
+ @ds.insert(:b=>true, :i=>10)
132
233
  @ds.all.must_equal [{:b=>1, :i=>10}]
133
234
  @ds.delete
134
- @ds << {:b=>false, :i=>0}
235
+ @ds.insert(:b=>false, :i=>0)
135
236
  @ds.all.must_equal [{:b=>0, :i=>0}]
136
237
 
137
238
  @ds.delete
138
- @ds << {:b=>1, :i=>10}
239
+ @ds.insert(:b=>1, :i=>10)
139
240
  @ds.all.must_equal [{:b=>1, :i=>10}]
140
241
  @ds.delete
141
- @ds << {:b=>0, :i=>0}
242
+ @ds.insert(:b=>0, :i=>0)
142
243
  @ds.all.must_equal [{:b=>0, :i=>0}]
143
244
 
144
245
  @ds = @ds.with_convert_smallint_to_bool(true)
145
246
  @ds.delete
146
- @ds << {:b=>true, :i=>10}
247
+ @ds.insert(:b=>true, :i=>10)
147
248
  @ds.all.must_equal [{:b=>true, :i=>10}]
148
249
  end
149
250
  end if DB.adapter_scheme == :ibmdb
@@ -17,13 +17,13 @@ describe "A MSSQL database" do
17
17
  end
18
18
 
19
19
  it "should be able to read fractional part of timestamp" do
20
- rs = @db["select getutcdate() as full_date, cast(datepart(millisecond, getutcdate()) as int) as milliseconds"].first
21
- rs[:milliseconds].must_equal rs[:full_date].usec/1000
20
+ rs = @db["select getutcdate() as full_date, cast(round(datepart(millisecond, getutcdate()), 0) as int) as milliseconds"].first
21
+ rs[:milliseconds].must_be_close_to(rs[:full_date].usec/1000, 2)
22
22
  end
23
23
 
24
24
  it "should be able to write fractional part of timestamp" do
25
- t = Time.utc(2001, 12, 31, 23, 59, 59, 997000)
26
- (t.usec/1000).must_equal @db["select cast(datepart(millisecond, ?) as int) as milliseconds", t].get
25
+ t = Time.utc(2001, 12, 31, 23, 59, 59, 996000)
26
+ (t.usec/1000).must_equal @db["select cast(round(datepart(millisecond, ?), 0) as int) as milliseconds", t].get
27
27
  end
28
28
 
29
29
  it "should not raise an error when getting the server version" do
@@ -121,30 +121,30 @@ if [:mysql, :mysql2].include?(DB.adapter_scheme)
121
121
  it "should return tinyint(1)s as bools and tinyint(4)s as integers when set" do
122
122
  @db.convert_tinyint_to_bool = true
123
123
  @ds.delete
124
- @ds << {:b=>true, :i=>10}
124
+ @ds.insert(:b=>true, :i=>10)
125
125
  @ds.all.must_equal [{:b=>true, :i=>10}]
126
126
  @ds.delete
127
- @ds << {:b=>false, :i=>0}
127
+ @ds.insert(:b=>false, :i=>0)
128
128
  @ds.all.must_equal [{:b=>false, :i=>0}]
129
129
  @ds.delete
130
- @ds << {:b=>true, :i=>1}
130
+ @ds.insert(:b=>true, :i=>1)
131
131
  @ds.all.must_equal [{:b=>true, :i=>1}]
132
132
  end
133
133
 
134
134
  it "should return all tinyints as integers when unset" do
135
135
  @db.convert_tinyint_to_bool = false
136
136
  @ds.delete
137
- @ds << {:b=>true, :i=>10}
137
+ @ds.insert(:b=>true, :i=>10)
138
138
  @ds.all.must_equal [{:b=>1, :i=>10}]
139
139
  @ds.delete
140
- @ds << {:b=>false, :i=>0}
140
+ @ds.insert(:b=>false, :i=>0)
141
141
  @ds.all.must_equal [{:b=>0, :i=>0}]
142
142
 
143
143
  @ds.delete
144
- @ds << {:b=>1, :i=>10}
144
+ @ds.insert(:b=>1, :i=>10)
145
145
  @ds.all.must_equal [{:b=>1, :i=>10}]
146
146
  @ds.delete
147
- @ds << {:b=>0, :i=>0}
147
+ @ds.insert(:b=>0, :i=>0)
148
148
  @ds.all.must_equal [{:b=>0, :i=>0}]
149
149
  end
150
150
 
@@ -155,7 +155,7 @@ if [:mysql, :mysql2].include?(DB.adapter_scheme)
155
155
  def convert_tinyint_to_bool?() false end #mysql2
156
156
  end
157
157
  ds.delete
158
- ds << {:b=>true, :i=>10}
158
+ ds.insert(:b=>true, :i=>10)
159
159
  ds.all.must_equal [{:b=>1, :i=>10}]
160
160
  @ds.all.must_equal [{:b=>true, :i=>10}]
161
161
  end
@@ -220,8 +220,8 @@ describe "A MySQL dataset" do
220
220
  end if false # SEQUEL5
221
221
 
222
222
  it "should support regexps" do
223
- @d << {:name => 'abc', :value => 1}
224
- @d << {:name => 'bcd', :value => 2}
223
+ @d.insert(:name => 'abc', :value => 1)
224
+ @d.insert(:name => 'bcd', :value => 2)
225
225
  @d.filter(:name => /bc/).count.must_equal 2
226
226
  @d.filter(:name => /^bc/).count.must_equal 1
227
227
  end
@@ -234,7 +234,7 @@ describe "A MySQL dataset" do
234
234
 
235
235
  it "should correctly literalize strings with comment backslashes in them" do
236
236
  @d.delete
237
- @d << {:name => ':\\'}
237
+ @d.insert(:name => ':\\')
238
238
 
239
239
  @d.first[:name].must_equal ':\\'
240
240
  end
@@ -297,6 +297,9 @@ describe "MySQL join expressions" do
297
297
  it "should raise error for :full_outer join requests." do
298
298
  lambda{@ds.join_table(:full_outer, :nodes)}.must_raise(Sequel::Error)
299
299
  end
300
+ it "should raise error for :natural_full join requests." do
301
+ lambda{@ds.join_table(:natural_full, :nodes)}.must_raise(Sequel::Error)
302
+ end
300
303
  it "should support natural left joins" do
301
304
  @ds.join_table(:natural_left, :nodes).sql.must_equal 'SELECT * FROM `nodes` NATURAL LEFT JOIN `nodes`'
302
305
  end
@@ -309,13 +312,13 @@ describe "MySQL join expressions" do
309
312
  it "should support natural right outer joins" do
310
313
  @ds.join_table(:natural_right_outer, :nodes).sql.must_equal 'SELECT * FROM `nodes` NATURAL RIGHT OUTER JOIN `nodes`'
311
314
  end
312
- it "should support natural inner joins" do
315
+ deprecated "should support natural inner joins" do
313
316
  @ds.join_table(:natural_inner, :nodes).sql.must_equal 'SELECT * FROM `nodes` NATURAL LEFT JOIN `nodes`'
314
317
  end
315
318
  it "should support cross joins" do
316
319
  @ds.join_table(:cross, :nodes).sql.must_equal 'SELECT * FROM `nodes` CROSS JOIN `nodes`'
317
320
  end
318
- it "should support cross joins as inner joins if conditions are used" do
321
+ deprecated "should support cross joins as inner joins if conditions are used" do
319
322
  @ds.join_table(:cross, :nodes, :id=>:id).sql.must_equal 'SELECT * FROM `nodes` INNER JOIN `nodes` ON (`nodes`.`id` = `nodes`.`id`)'
320
323
  end
321
324
  it "should support straight joins (force left table to be read before right)" do
@@ -391,7 +394,7 @@ describe "A MySQL database" do
391
394
  @db.add_column :test2, :xyz, :text
392
395
 
393
396
  @db[:test2].columns.must_equal [:name, :value, :xyz]
394
- @db[:test2] << {:name => 'mmm', :value => 111, :xyz => '000'}
397
+ @db[:test2].insert(:name => 'mmm', :value => 111, :xyz => '000')
395
398
  @db[:test2].first[:xyz].must_equal '000'
396
399
 
397
400
  @db[:test2].columns.must_equal [:name, :value, :xyz]
@@ -401,7 +404,7 @@ describe "A MySQL database" do
401
404
 
402
405
  @db[:test2].delete
403
406
  @db.add_column :test2, :xyz, :text
404
- @db[:test2] << {:name => 'mmm', :value => 111, :xyz => 'qqqq'}
407
+ @db[:test2].insert(:name => 'mmm', :value => 111, :xyz => 'qqqq')
405
408
 
406
409
  @db[:test2].columns.must_equal [:name, :value, :xyz]
407
410
  @db.rename_column :test2, :xyz, :zyx, :type => :text
@@ -410,7 +413,7 @@ describe "A MySQL database" do
410
413
 
411
414
  @db[:test2].delete
412
415
  @db.add_column :test2, :tre, :text
413
- @db[:test2] << {:name => 'mmm', :value => 111, :tre => 'qqqq'}
416
+ @db[:test2].insert(:name => 'mmm', :value => 111, :tre => 'qqqq')
414
417
 
415
418
  @db[:test2].columns.must_equal [:name, :value, :zyx, :tre]
416
419
  @db.rename_column :test2, :tre, :ert, :type => :varchar, :size=>255
@@ -419,7 +422,7 @@ describe "A MySQL database" do
419
422
 
420
423
  @db.add_column :test2, :xyz, :float
421
424
  @db[:test2].delete
422
- @db[:test2] << {:name => 'mmm', :value => 111, :xyz => 56.78}
425
+ @db[:test2].insert(:name => 'mmm', :value => 111, :xyz => 56.78)
423
426
  @db.set_column_type :test2, :xyz, :integer
424
427
 
425
428
  @db[:test2].first[:xyz].must_equal 57
@@ -437,15 +440,62 @@ describe "A MySQL database" do
437
440
  end
438
441
  end
439
442
 
443
+ # SEQUEL5: Remove
440
444
  describe "A MySQL database with table options" do
441
445
  before do
442
446
  @options = {:engine=>'MyISAM', :charset=>'latin1', :collate => 'latin1_swedish_ci'}
443
447
 
444
- Sequel::MySQL.default_engine = 'InnoDB'
445
- Sequel::MySQL.default_charset = 'utf8'
446
- Sequel::MySQL.default_collate = 'utf8_general_ci'
448
+ deprecated do
449
+ Sequel::MySQL.default_engine = 'InnoDB'
450
+ Sequel::MySQL.default_charset = 'utf8'
451
+ Sequel::MySQL.default_collate = 'utf8_general_ci'
452
+ end
453
+
454
+ @db = DB
455
+ @db.drop_table?(:items)
456
+
457
+ DB.sqls.clear
458
+ end
459
+ after do
460
+ @db.drop_table?(:items)
461
+
462
+ deprecated do
463
+ Sequel::MySQL.default_engine = nil
464
+ Sequel::MySQL.default_charset = nil
465
+ Sequel::MySQL.default_collate = nil
466
+ end
467
+ end
468
+
469
+ it "should allow to pass custom options (engine, charset, collate) for table creation" do
470
+ @db.create_table(:items, @options){Integer :size; text :name}
471
+ check_sqls do
472
+ @db.sqls.must_equal ["CREATE TABLE `items` (`size` integer, `name` text) ENGINE=MyISAM DEFAULT CHARSET=latin1 DEFAULT COLLATE=latin1_swedish_ci"]
473
+ end
474
+ end
475
+
476
+ it "should use default options if specified (engine, charset, collate) for table creation" do
477
+ @db.create_table(:items){Integer :size; text :name}
478
+ check_sqls do
479
+ @db.sqls.must_equal ["CREATE TABLE `items` (`size` integer, `name` text) ENGINE=InnoDB DEFAULT CHARSET=utf8 DEFAULT COLLATE=utf8_general_ci"]
480
+ end
481
+ end
482
+
483
+ it "should not use default if option has a nil value" do
484
+ @db.create_table(:items, :engine=>nil, :charset=>nil, :collate=>nil){Integer :size; text :name}
485
+ check_sqls do
486
+ @db.sqls.must_equal ["CREATE TABLE `items` (`size` integer, `name` text)"]
487
+ end
488
+ end
489
+ end
490
+
491
+ describe "A MySQL database with table options" do
492
+ before do
493
+ @options = {:engine=>'MyISAM', :charset=>'latin1', :collate => 'latin1_swedish_ci'}
447
494
 
448
495
  @db = DB
496
+ @db.default_engine = 'InnoDB'
497
+ @db.default_charset = 'utf8'
498
+ @db.default_collate = 'utf8_general_ci'
449
499
  @db.drop_table?(:items)
450
500
 
451
501
  DB.sqls.clear
@@ -453,9 +503,9 @@ describe "A MySQL database with table options" do
453
503
  after do
454
504
  @db.drop_table?(:items)
455
505
 
456
- Sequel::MySQL.default_engine = nil
457
- Sequel::MySQL.default_charset = nil
458
- Sequel::MySQL.default_collate = nil
506
+ @db.default_engine = nil
507
+ @db.default_charset = nil
508
+ @db.default_collate = nil
459
509
  end
460
510
 
461
511
  it "should allow to pass custom options (engine, charset, collate) for table creation" do
@@ -707,12 +757,12 @@ describe "A grouped MySQL dataset" do
707
757
  text :name
708
758
  integer :value
709
759
  end
710
- DB[:test2] << {:name => '11', :value => 10}
711
- DB[:test2] << {:name => '11', :value => 20}
712
- DB[:test2] << {:name => '11', :value => 30}
713
- DB[:test2] << {:name => '12', :value => 10}
714
- DB[:test2] << {:name => '12', :value => 20}
715
- DB[:test2] << {:name => '13', :value => 10}
760
+ DB[:test2].insert(:name => '11', :value => 10)
761
+ DB[:test2].insert(:name => '11', :value => 20)
762
+ DB[:test2].insert(:name => '11', :value => 30)
763
+ DB[:test2].insert(:name => '12', :value => 10)
764
+ DB[:test2].insert(:name => '12', :value => 20)
765
+ DB[:test2].insert(:name => '13', :value => 10)
716
766
  end
717
767
  after do
718
768
  DB.drop_table?(:test2)
@@ -1317,6 +1367,10 @@ if DB.adapter_scheme == :mysql2
1317
1367
  it "should correctly handle early returning when streaming results" do
1318
1368
  3.times{@ds.each{|r| break r[:a]}.must_equal 0}
1319
1369
  end
1370
+
1371
+ it "#paged_each should bypass streaming when :stream => false passed in" do
1372
+ DB[:a].order(:a).paged_each(:stream => false){|x| DB[:a].first; break}
1373
+ end
1320
1374
  end
1321
1375
  end
1322
1376
 
@@ -2,6 +2,10 @@ SEQUEL_ADAPTER_TEST = :oracle
2
2
 
3
3
  require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
4
4
 
5
+ unless DB.opts[:autosequence]
6
+ warn "Running oracle adapter specs without :autosequence Database option results in many errors, use the :autosequence Database option when testing"
7
+ end
8
+
5
9
  describe "An Oracle database" do
6
10
  before(:all) do
7
11
  DB.create_table!(:items) do
@@ -117,17 +121,17 @@ describe "An Oracle database" do
117
121
 
118
122
  it "should return the correct record count" do
119
123
  @d.count.must_equal 0
120
- @d << {:name => 'abc', :value => 123}
121
- @d << {:name => 'abc', :value => 456}
122
- @d << {:name => 'def', :value => 789}
124
+ @d.insert(:name => 'abc', :value => 123)
125
+ @d.insert(:name => 'abc', :value => 456)
126
+ @d.insert(:name => 'def', :value => 789)
123
127
  @d.count.must_equal 3
124
128
  end
125
129
 
126
130
  it "should return the correct records" do
127
131
  @d.to_a.must_equal []
128
- @d << {:name => 'abc', :value => 123}
129
- @d << {:name => 'abc', :value => 456}
130
- @d << {:name => 'def', :value => 789}
132
+ @d.insert(:name => 'abc', :value => 123)
133
+ @d.insert(:name => 'abc', :value => 456)
134
+ @d.insert(:name => 'def', :value => 789)
131
135
 
132
136
  @d.order(:value).to_a.must_equal [
133
137
  {:date_created=>nil, :name => 'abc', :value => 123},
@@ -214,9 +218,9 @@ describe "An Oracle database" do
214
218
  end
215
219
 
216
220
  it "should update records correctly" do
217
- @d << {:name => 'abc', :value => 123}
218
- @d << {:name => 'abc', :value => 456}
219
- @d << {:name => 'def', :value => 789}
221
+ @d.insert(:name => 'abc', :value => 123)
222
+ @d.insert(:name => 'abc', :value => 456)
223
+ @d.insert(:name => 'def', :value => 789)
220
224
  @d.filter(:name => 'abc').update(:value => 530)
221
225
 
222
226
  @d[:name => 'def'][:value].must_equal 789
@@ -224,17 +228,17 @@ describe "An Oracle database" do
224
228
  end
225
229
 
226
230
  it "should translate values correctly" do
227
- @d << {:name => 'abc', :value => 456}
228
- @d << {:name => 'def', :value => 789}
231
+ @d.insert(:name => 'abc', :value => 456)
232
+ @d.insert(:name => 'def', :value => 789)
229
233
  @d.filter{value > 500}.update(:date_created => Sequel.lit("to_timestamp('2009-09-09', 'YYYY-MM-DD')"))
230
234
 
231
235
  @d[:name => 'def'][:date_created].strftime('%F').must_equal '2009-09-09'
232
236
  end
233
237
 
234
238
  it "should delete records correctly" do
235
- @d << {:name => 'abc', :value => 123}
236
- @d << {:name => 'abc', :value => 456}
237
- @d << {:name => 'def', :value => 789}
239
+ @d.insert(:name => 'abc', :value => 123)
240
+ @d.insert(:name => 'abc', :value => 456)
241
+ @d.insert(:name => 'def', :value => 789)
238
242
  @d.filter(:name => 'abc').delete
239
243
 
240
244
  @d.count.must_equal 1
@@ -248,7 +252,7 @@ describe "An Oracle database" do
248
252
 
249
253
  it "should support transactions" do
250
254
  DB.transaction do
251
- @d << {:name => 'abc', :value => 1}
255
+ @d.insert(:name => 'abc', :value => 1)
252
256
  end
253
257
 
254
258
  @d.count.must_equal 1
@@ -257,15 +261,15 @@ describe "An Oracle database" do
257
261
  it "should return correct result" do
258
262
  @d1 = DB[:books]
259
263
  @d1.delete
260
- @d1 << {:id => 1, :title => 'aaa', :category_id => 100}
261
- @d1 << {:id => 2, :title => 'bbb', :category_id => 100}
262
- @d1 << {:id => 3, :title => 'ccc', :category_id => 101}
263
- @d1 << {:id => 4, :title => 'ddd', :category_id => 102}
264
+ @d1.insert(:id => 1, :title => 'aaa', :category_id => 100)
265
+ @d1.insert(:id => 2, :title => 'bbb', :category_id => 100)
266
+ @d1.insert(:id => 3, :title => 'ccc', :category_id => 101)
267
+ @d1.insert(:id => 4, :title => 'ddd', :category_id => 102)
264
268
 
265
269
  @d2 = DB[:categories]
266
270
  @d2.delete
267
- @d2 << {:id => 100, :cat_name => 'ruby'}
268
- @d2 << {:id => 101, :cat_name => 'rails'}
271
+ @d2.insert(:id => 100, :cat_name => 'ruby')
272
+ @d2.insert(:id => 101, :cat_name => 'rails')
269
273
 
270
274
  @d1.join(:categories, :id => :category_id).select(Sequel[:books][:id], :title, :cat_name).order(Sequel[:books][:id]).to_a.must_equal [
271
275
  {:id => 1, :title => 'aaa', :cat_name => 'ruby'},
@@ -294,9 +298,9 @@ describe "An Oracle database" do
294
298
  it "should allow columns to be renamed" do
295
299
  @d1 = DB[:books]
296
300
  @d1.delete
297
- @d1 << {:id => 1, :title => 'aaa', :category_id => 100}
298
- @d1 << {:id => 2, :title => 'bbb', :category_id => 100}
299
- @d1 << {:id => 3, :title => 'bbb', :category_id => 100}
301
+ @d1.insert(:id => 1, :title => 'aaa', :category_id => 100)
302
+ @d1.insert(:id => 2, :title => 'bbb', :category_id => 100)
303
+ @d1.insert(:id => 3, :title => 'bbb', :category_id => 100)
300
304
 
301
305
  @d1.select(Sequel.as(:title, :name)).order_by(:id).to_a.must_equal [
302
306
  { :name => 'aaa' },