sequel 4.46.0 → 4.49.0

Sign up to get free protection for your applications and to get access to all the features.
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' },