sequel 3.21.0 → 3.36.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 (311) hide show
  1. data/CHANGELOG +855 -3
  2. data/MIT-LICENSE +1 -1
  3. data/README.rdoc +23 -7
  4. data/Rakefile +42 -24
  5. data/bin/sequel +26 -8
  6. data/doc/active_record.rdoc +1 -0
  7. data/doc/advanced_associations.rdoc +171 -11
  8. data/doc/association_basics.rdoc +293 -43
  9. data/doc/dataset_basics.rdoc +5 -5
  10. data/doc/dataset_filtering.rdoc +8 -0
  11. data/doc/mass_assignment.rdoc +56 -0
  12. data/doc/migration.rdoc +85 -552
  13. data/doc/model_hooks.rdoc +78 -27
  14. data/doc/object_model.rdoc +541 -0
  15. data/doc/opening_databases.rdoc +97 -50
  16. data/doc/prepared_statements.rdoc +40 -14
  17. data/doc/querying.rdoc +28 -4
  18. data/doc/reflection.rdoc +30 -4
  19. data/doc/release_notes/3.22.0.txt +39 -0
  20. data/doc/release_notes/3.23.0.txt +172 -0
  21. data/doc/release_notes/3.24.0.txt +420 -0
  22. data/doc/release_notes/3.25.0.txt +88 -0
  23. data/doc/release_notes/3.26.0.txt +88 -0
  24. data/doc/release_notes/3.27.0.txt +82 -0
  25. data/doc/release_notes/3.28.0.txt +304 -0
  26. data/doc/release_notes/3.29.0.txt +459 -0
  27. data/doc/release_notes/3.30.0.txt +135 -0
  28. data/doc/release_notes/3.31.0.txt +146 -0
  29. data/doc/release_notes/3.32.0.txt +202 -0
  30. data/doc/release_notes/3.33.0.txt +157 -0
  31. data/doc/release_notes/3.34.0.txt +671 -0
  32. data/doc/release_notes/3.35.0.txt +144 -0
  33. data/doc/release_notes/3.36.0.txt +245 -0
  34. data/doc/schema_modification.rdoc +572 -0
  35. data/doc/sharding.rdoc +95 -3
  36. data/doc/testing.rdoc +129 -0
  37. data/doc/thread_safety.rdoc +17 -0
  38. data/doc/transactions.rdoc +137 -0
  39. data/doc/virtual_rows.rdoc +51 -2
  40. data/lib/sequel/adapters/ado/mssql.rb +18 -6
  41. data/lib/sequel/adapters/ado.rb +40 -18
  42. data/lib/sequel/adapters/amalgalite.rb +17 -9
  43. data/lib/sequel/adapters/db2.rb +175 -86
  44. data/lib/sequel/adapters/dbi.rb +15 -15
  45. data/lib/sequel/adapters/do/mysql.rb +17 -11
  46. data/lib/sequel/adapters/do/postgres.rb +1 -57
  47. data/lib/sequel/adapters/do/sqlite.rb +0 -10
  48. data/lib/sequel/adapters/do.rb +18 -36
  49. data/lib/sequel/adapters/firebird.rb +27 -208
  50. data/lib/sequel/adapters/ibmdb.rb +453 -0
  51. data/lib/sequel/adapters/informix.rb +6 -23
  52. data/lib/sequel/adapters/jdbc/as400.rb +16 -34
  53. data/lib/sequel/adapters/jdbc/db2.rb +47 -0
  54. data/lib/sequel/adapters/jdbc/derby.rb +287 -0
  55. data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
  56. data/lib/sequel/adapters/jdbc/h2.rb +73 -31
  57. data/lib/sequel/adapters/jdbc/hsqldb.rb +184 -0
  58. data/lib/sequel/adapters/jdbc/informix.rb +21 -0
  59. data/lib/sequel/adapters/jdbc/jtds.rb +29 -0
  60. data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
  61. data/lib/sequel/adapters/jdbc/mysql.rb +7 -24
  62. data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
  63. data/lib/sequel/adapters/jdbc/postgresql.rb +58 -48
  64. data/lib/sequel/adapters/jdbc/progress.rb +21 -0
  65. data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
  66. data/lib/sequel/adapters/jdbc/sqlserver.rb +66 -0
  67. data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
  68. data/lib/sequel/adapters/jdbc.rb +265 -94
  69. data/lib/sequel/adapters/mock.rb +361 -0
  70. data/lib/sequel/adapters/mysql.rb +118 -222
  71. data/lib/sequel/adapters/mysql2.rb +58 -57
  72. data/lib/sequel/adapters/odbc/mssql.rb +15 -7
  73. data/lib/sequel/adapters/odbc.rb +28 -9
  74. data/lib/sequel/adapters/openbase.rb +3 -5
  75. data/lib/sequel/adapters/oracle.rb +349 -53
  76. data/lib/sequel/adapters/postgres.rb +356 -107
  77. data/lib/sequel/adapters/shared/access.rb +32 -9
  78. data/lib/sequel/adapters/shared/db2.rb +342 -0
  79. data/lib/sequel/adapters/shared/firebird.rb +221 -0
  80. data/lib/sequel/adapters/shared/informix.rb +53 -0
  81. data/lib/sequel/adapters/shared/mssql.rb +335 -118
  82. data/lib/sequel/adapters/shared/mysql.rb +340 -76
  83. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +155 -0
  84. data/lib/sequel/adapters/shared/oracle.rb +243 -45
  85. data/lib/sequel/adapters/shared/postgres.rb +524 -279
  86. data/lib/sequel/adapters/shared/progress.rb +5 -8
  87. data/lib/sequel/adapters/shared/sqlite.rb +265 -89
  88. data/lib/sequel/adapters/sqlite.rb +101 -39
  89. data/lib/sequel/adapters/swift/mysql.rb +9 -12
  90. data/lib/sequel/adapters/swift/postgres.rb +9 -74
  91. data/lib/sequel/adapters/swift/sqlite.rb +8 -6
  92. data/lib/sequel/adapters/swift.rb +8 -7
  93. data/lib/sequel/adapters/tinytds.rb +161 -21
  94. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +66 -0
  95. data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
  96. data/lib/sequel/ast_transformer.rb +194 -0
  97. data/lib/sequel/connection_pool/sharded_single.rb +11 -1
  98. data/lib/sequel/connection_pool/sharded_threaded.rb +28 -2
  99. data/lib/sequel/connection_pool/single.rb +5 -0
  100. data/lib/sequel/connection_pool/threaded.rb +38 -14
  101. data/lib/sequel/connection_pool.rb +10 -2
  102. data/lib/sequel/core.rb +118 -11
  103. data/lib/sequel/database/connecting.rb +38 -28
  104. data/lib/sequel/database/dataset.rb +4 -4
  105. data/lib/sequel/database/dataset_defaults.rb +63 -2
  106. data/lib/sequel/database/logging.rb +7 -2
  107. data/lib/sequel/database/misc.rb +150 -46
  108. data/lib/sequel/database/query.rb +215 -65
  109. data/lib/sequel/database/schema_generator.rb +64 -20
  110. data/lib/sequel/database/schema_methods.rb +212 -54
  111. data/lib/sequel/dataset/actions.rb +322 -85
  112. data/lib/sequel/dataset/features.rb +96 -8
  113. data/lib/sequel/dataset/graph.rb +38 -11
  114. data/lib/sequel/dataset/misc.rb +50 -23
  115. data/lib/sequel/dataset/mutation.rb +12 -7
  116. data/lib/sequel/dataset/prepared_statements.rb +68 -30
  117. data/lib/sequel/dataset/query.rb +237 -44
  118. data/lib/sequel/dataset/sql.rb +698 -278
  119. data/lib/sequel/dataset.rb +8 -0
  120. data/lib/sequel/exceptions.rb +4 -0
  121. data/lib/sequel/extensions/_pretty_table.rb +79 -0
  122. data/lib/sequel/extensions/arbitrary_servers.rb +108 -0
  123. data/lib/sequel/extensions/columns_introspection.rb +61 -0
  124. data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +16 -34
  125. data/lib/sequel/extensions/migration.rb +97 -11
  126. data/lib/sequel/extensions/named_timezones.rb +5 -0
  127. data/lib/sequel/extensions/null_dataset.rb +90 -0
  128. data/lib/sequel/extensions/pg_array.rb +460 -0
  129. data/lib/sequel/extensions/pg_array_ops.rb +220 -0
  130. data/lib/sequel/extensions/pg_auto_parameterize.rb +169 -0
  131. data/lib/sequel/extensions/pg_hstore.rb +296 -0
  132. data/lib/sequel/extensions/pg_hstore_ops.rb +259 -0
  133. data/lib/sequel/extensions/pg_inet.rb +89 -0
  134. data/lib/sequel/extensions/pg_json.rb +178 -0
  135. data/lib/sequel/extensions/pg_statement_cache.rb +316 -0
  136. data/lib/sequel/extensions/pretty_table.rb +5 -71
  137. data/lib/sequel/extensions/query.rb +1 -1
  138. data/lib/sequel/extensions/query_literals.rb +79 -0
  139. data/lib/sequel/extensions/schema_caching.rb +76 -0
  140. data/lib/sequel/extensions/schema_dumper.rb +251 -37
  141. data/lib/sequel/extensions/select_remove.rb +35 -0
  142. data/lib/sequel/extensions/server_block.rb +139 -0
  143. data/lib/sequel/extensions/sql_expr.rb +4 -110
  144. data/lib/sequel/extensions/thread_local_timezones.rb +1 -1
  145. data/lib/sequel/extensions/to_dot.rb +95 -83
  146. data/lib/sequel/model/associations.rb +1187 -393
  147. data/lib/sequel/model/base.rb +578 -170
  148. data/lib/sequel/model/errors.rb +1 -1
  149. data/lib/sequel/model/exceptions.rb +5 -1
  150. data/lib/sequel/model/inflections.rb +1 -1
  151. data/lib/sequel/model.rb +30 -11
  152. data/lib/sequel/no_core_ext.rb +2 -0
  153. data/lib/sequel/plugins/active_model.rb +13 -1
  154. data/lib/sequel/plugins/association_pks.rb +22 -4
  155. data/lib/sequel/plugins/caching.rb +25 -18
  156. data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
  157. data/lib/sequel/plugins/composition.rb +44 -12
  158. data/lib/sequel/plugins/dataset_associations.rb +100 -0
  159. data/lib/sequel/plugins/defaults_setter.rb +58 -0
  160. data/lib/sequel/plugins/dirty.rb +214 -0
  161. data/lib/sequel/plugins/eager_each.rb +59 -0
  162. data/lib/sequel/plugins/force_encoding.rb +6 -6
  163. data/lib/sequel/plugins/hook_class_methods.rb +1 -1
  164. data/lib/sequel/plugins/identity_map.rb +123 -8
  165. data/lib/sequel/plugins/instance_filters.rb +10 -0
  166. data/lib/sequel/plugins/instance_hooks.rb +1 -1
  167. data/lib/sequel/plugins/json_serializer.rb +58 -6
  168. data/lib/sequel/plugins/list.rb +12 -2
  169. data/lib/sequel/plugins/many_through_many.rb +79 -28
  170. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
  171. data/lib/sequel/plugins/nested_attributes.rb +139 -63
  172. data/lib/sequel/plugins/optimistic_locking.rb +8 -0
  173. data/lib/sequel/plugins/prepared_statements.rb +167 -0
  174. data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
  175. data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
  176. data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
  177. data/lib/sequel/plugins/rcte_tree.rb +29 -15
  178. data/lib/sequel/plugins/schema.rb +7 -2
  179. data/lib/sequel/plugins/serialization.rb +98 -49
  180. data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
  181. data/lib/sequel/plugins/sharding.rb +21 -54
  182. data/lib/sequel/plugins/single_table_inheritance.rb +5 -3
  183. data/lib/sequel/plugins/static_cache.rb +99 -0
  184. data/lib/sequel/plugins/subclasses.rb +10 -2
  185. data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
  186. data/lib/sequel/plugins/timestamps.rb +1 -1
  187. data/lib/sequel/plugins/typecast_on_load.rb +9 -12
  188. data/lib/sequel/plugins/update_primary_key.rb +2 -2
  189. data/lib/sequel/plugins/validation_class_methods.rb +1 -1
  190. data/lib/sequel/plugins/xml_serializer.rb +15 -4
  191. data/lib/sequel/sql.rb +526 -59
  192. data/lib/sequel/timezones.rb +57 -38
  193. data/lib/sequel/version.rb +1 -1
  194. data/spec/adapters/db2_spec.rb +146 -0
  195. data/spec/adapters/firebird_spec.rb +1 -1
  196. data/spec/adapters/mssql_spec.rb +142 -40
  197. data/spec/adapters/mysql_spec.rb +380 -234
  198. data/spec/adapters/oracle_spec.rb +67 -77
  199. data/spec/adapters/postgres_spec.rb +1050 -212
  200. data/spec/adapters/spec_helper.rb +8 -5
  201. data/spec/adapters/sqlite_spec.rb +139 -27
  202. data/spec/core/connection_pool_spec.rb +196 -93
  203. data/spec/core/database_spec.rb +879 -510
  204. data/spec/core/dataset_spec.rb +1415 -1086
  205. data/spec/core/expression_filters_spec.rb +554 -109
  206. data/spec/core/mock_adapter_spec.rb +449 -0
  207. data/spec/core/object_graph_spec.rb +86 -114
  208. data/spec/core/schema_generator_spec.rb +4 -4
  209. data/spec/core/schema_spec.rb +482 -38
  210. data/spec/core/spec_helper.rb +6 -48
  211. data/spec/extensions/active_model_spec.rb +13 -0
  212. data/spec/extensions/arbitrary_servers_spec.rb +110 -0
  213. data/spec/extensions/association_autoreloading_spec.rb +18 -10
  214. data/spec/extensions/association_dependencies_spec.rb +15 -25
  215. data/spec/extensions/association_pks_spec.rb +66 -32
  216. data/spec/extensions/association_proxies_spec.rb +4 -4
  217. data/spec/extensions/caching_spec.rb +47 -51
  218. data/spec/extensions/class_table_inheritance_spec.rb +31 -83
  219. data/spec/extensions/columns_introspection_spec.rb +91 -0
  220. data/spec/extensions/composition_spec.rb +18 -13
  221. data/spec/{core/core_sql_spec.rb → extensions/core_extensions_spec.rb} +119 -139
  222. data/spec/extensions/dataset_associations_spec.rb +199 -0
  223. data/spec/extensions/defaults_setter_spec.rb +64 -0
  224. data/spec/extensions/dirty_spec.rb +155 -0
  225. data/spec/extensions/eager_each_spec.rb +34 -0
  226. data/spec/extensions/force_encoding_spec.rb +4 -2
  227. data/spec/extensions/hook_class_methods_spec.rb +69 -92
  228. data/spec/extensions/identity_map_spec.rb +131 -22
  229. data/spec/extensions/inflector_spec.rb +0 -4
  230. data/spec/extensions/instance_filters_spec.rb +11 -21
  231. data/spec/extensions/instance_hooks_spec.rb +72 -0
  232. data/spec/extensions/json_serializer_spec.rb +49 -6
  233. data/spec/extensions/lazy_attributes_spec.rb +16 -20
  234. data/spec/extensions/list_spec.rb +48 -39
  235. data/spec/extensions/many_through_many_spec.rb +283 -250
  236. data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
  237. data/spec/extensions/migration_spec.rb +140 -35
  238. data/spec/extensions/named_timezones_spec.rb +29 -11
  239. data/spec/extensions/nested_attributes_spec.rb +251 -89
  240. data/spec/extensions/null_dataset_spec.rb +85 -0
  241. data/spec/extensions/optimistic_locking_spec.rb +24 -21
  242. data/spec/extensions/pg_array_ops_spec.rb +105 -0
  243. data/spec/extensions/pg_array_spec.rb +196 -0
  244. data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
  245. data/spec/extensions/pg_hstore_ops_spec.rb +136 -0
  246. data/spec/extensions/pg_hstore_spec.rb +195 -0
  247. data/spec/extensions/pg_inet_spec.rb +44 -0
  248. data/spec/extensions/pg_json_spec.rb +101 -0
  249. data/spec/extensions/pg_statement_cache_spec.rb +209 -0
  250. data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
  251. data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
  252. data/spec/extensions/prepared_statements_spec.rb +87 -0
  253. data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
  254. data/spec/extensions/pretty_table_spec.rb +7 -6
  255. data/spec/extensions/query_literals_spec.rb +168 -0
  256. data/spec/extensions/query_spec.rb +6 -0
  257. data/spec/extensions/rcte_tree_spec.rb +50 -43
  258. data/spec/extensions/schema_caching_spec.rb +41 -0
  259. data/spec/extensions/schema_dumper_spec.rb +429 -22
  260. data/spec/extensions/schema_spec.rb +25 -21
  261. data/spec/extensions/select_remove_spec.rb +38 -0
  262. data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
  263. data/spec/extensions/serialization_spec.rb +85 -43
  264. data/spec/extensions/server_block_spec.rb +90 -0
  265. data/spec/extensions/sharding_spec.rb +69 -143
  266. data/spec/extensions/single_table_inheritance_spec.rb +23 -29
  267. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  268. data/spec/extensions/spec_helper.rb +22 -61
  269. data/spec/extensions/sql_expr_spec.rb +29 -60
  270. data/spec/extensions/static_cache_spec.rb +145 -0
  271. data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
  272. data/spec/extensions/thread_local_timezones_spec.rb +22 -2
  273. data/spec/extensions/timestamps_spec.rb +6 -6
  274. data/spec/extensions/to_dot_spec.rb +4 -7
  275. data/spec/extensions/touch_spec.rb +13 -14
  276. data/spec/extensions/tree_spec.rb +11 -26
  277. data/spec/extensions/typecast_on_load_spec.rb +9 -6
  278. data/spec/extensions/update_primary_key_spec.rb +30 -24
  279. data/spec/extensions/validation_class_methods_spec.rb +30 -51
  280. data/spec/extensions/validation_helpers_spec.rb +16 -35
  281. data/spec/extensions/xml_serializer_spec.rb +29 -4
  282. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
  283. data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
  284. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
  285. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
  286. data/spec/integration/associations_test.rb +659 -21
  287. data/spec/integration/database_test.rb +9 -3
  288. data/spec/integration/dataset_test.rb +605 -91
  289. data/spec/integration/eager_loader_test.rb +19 -21
  290. data/spec/integration/migrator_test.rb +2 -3
  291. data/spec/integration/model_test.rb +81 -2
  292. data/spec/integration/plugin_test.rb +454 -143
  293. data/spec/integration/prepared_statement_test.rb +263 -128
  294. data/spec/integration/schema_test.rb +309 -43
  295. data/spec/integration/spec_helper.rb +40 -30
  296. data/spec/integration/timezone_test.rb +38 -12
  297. data/spec/integration/transaction_test.rb +183 -8
  298. data/spec/integration/type_test.rb +18 -4
  299. data/spec/model/association_reflection_spec.rb +201 -7
  300. data/spec/model/associations_spec.rb +1067 -661
  301. data/spec/model/base_spec.rb +329 -95
  302. data/spec/model/dataset_methods_spec.rb +7 -27
  303. data/spec/model/eager_loading_spec.rb +677 -676
  304. data/spec/model/hooks_spec.rb +349 -67
  305. data/spec/model/model_spec.rb +240 -168
  306. data/spec/model/plugins_spec.rb +24 -13
  307. data/spec/model/record_spec.rb +490 -232
  308. data/spec/model/spec_helper.rb +14 -71
  309. data/spec/model/validations_spec.rb +11 -0
  310. data/spec/rcov.opts +2 -0
  311. metadata +178 -80
@@ -3,13 +3,19 @@ require 'logger'
3
3
  unless Object.const_defined?('Sequel')
4
4
  $:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
5
5
  require 'sequel'
6
- Sequel.quote_identifiers = false
7
6
  end
8
7
  begin
9
8
  require File.join(File.dirname(File.dirname(File.expand_path(__FILE__))), 'spec_config.rb')
10
9
  rescue LoadError
11
10
  end
12
11
 
12
+ if ENV['SEQUEL_COLUMNS_INTROSPECTION']
13
+ Sequel.extension :columns_introspection
14
+ Sequel::Dataset.introspect_all_columns
15
+ end
16
+
17
+ Sequel::Model.cache_anonymous_models = false
18
+
13
19
  class Sequel::Database
14
20
  def log_duration(duration, message)
15
21
  log_info(message)
@@ -26,11 +32,8 @@ end
26
32
  end
27
33
  end
28
34
 
29
- def self.log_specify(message, &block)
30
- specify(message){log{instance_eval(&block)}}
31
- end
32
-
33
35
  def self.cspecify(message, *checked, &block)
36
+ return specify(message, &block) if ENV['SEQUEL_NO_PENDING']
34
37
  pending = false
35
38
  checked.each do |c|
36
39
  case c
@@ -13,6 +13,7 @@ describe "An SQLite database" do
13
13
  end
14
14
  after do
15
15
  @db.foreign_keys = @fk
16
+ @db.case_sensitive_like = true
16
17
  Sequel.datetime_class = Time
17
18
  end
18
19
 
@@ -38,6 +39,16 @@ describe "An SQLite database" do
38
39
  end
39
40
  end
40
41
 
42
+ specify "should respect case sensitive like false" do
43
+ @db.case_sensitive_like = false
44
+ @db.get(Sequel.like('a', 'A')).to_s.should == '1'
45
+ end
46
+
47
+ specify "should respect case sensitive like true" do
48
+ @db.case_sensitive_like = true
49
+ @db.get(Sequel.like('a', 'A')).to_s.should == '0'
50
+ end
51
+
41
52
  specify "should provide the SQLite version as an integer" do
42
53
  @db.sqlite_version.should be_a_kind_of(Integer)
43
54
  end
@@ -66,8 +77,19 @@ describe "An SQLite database" do
66
77
  @db[:fk].all.should == [{:id=>1, :parent_id=>2}]
67
78
  end
68
79
 
80
+ specify "should support a use_timestamp_timezones setting" do
81
+ @db.create_table!(:time){Time :time}
82
+ @db[:time].insert(Time.now)
83
+ @db[:time].get(:time.cast_string).should =~ /[-+]\d\d\d\d\z/
84
+ @db.use_timestamp_timezones = false
85
+ @db[:time].delete
86
+ @db[:time].insert(Time.now)
87
+ @db[:time].get(:time.cast_string).should_not =~ /[-+]\d\d\d\d\z/
88
+ @db.use_timestamp_timezones = true
89
+ end
90
+
69
91
  specify "should provide a list of existing tables" do
70
- @db.drop_table(:testing) rescue nil
92
+ @db.drop_table?(:testing)
71
93
  @db.tables.should be_a_kind_of(Array)
72
94
  @db.tables.should_not include(:testing)
73
95
  @db.create_table! :testing do
@@ -128,18 +150,98 @@ describe "An SQLite database" do
128
150
  end
129
151
  end
130
152
 
131
- describe "An SQLite dataset" do
153
+ describe "SQLite type conversion" do
132
154
  before do
133
- @d = SQLITE_DB[:items]
155
+ @db = SQLITE_DB
156
+ @integer_booleans = @db.integer_booleans
157
+ @db.integer_booleans = true
158
+ @ds = @db[:items]
159
+ @db.drop_table?(:items)
160
+ end
161
+ after do
162
+ @db.integer_booleans = @integer_booleans
163
+ Sequel.datetime_class = Time
164
+ @db.drop_table?(:items)
165
+ end
166
+
167
+ specify "should handle integers in boolean columns" do
168
+ @db.create_table(:items){TrueClass :a}
169
+ @db[:items].insert(false)
170
+ @db[:items].select_map(:a).should == [false]
171
+ @db[:items].select_map(:a+:a).should == [0]
172
+ @db[:items].update(:a=>true)
173
+ @db[:items].select_map(:a).should == [true]
174
+ @db[:items].select_map(:a+:a).should == [2]
134
175
  end
135
176
 
136
- specify "should handle string pattern matches correctly" do
137
- @d.literal(:x.like('a')).should == "(x LIKE 'a')"
138
- @d.literal(~:x.like('a')).should == "NOT (x LIKE 'a')"
139
- @d.literal(:x.ilike('a')).should == "(x LIKE 'a')"
140
- @d.literal(~:x.ilike('a')).should == "NOT (x LIKE 'a')"
177
+ specify "should handle integers/floats/strings/decimals in numeric/decimal columns" do
178
+ @db.create_table(:items){Numeric :a}
179
+ @db[:items].insert(100)
180
+ @db[:items].select_map(:a).should == [BigDecimal.new('100')]
181
+ @db[:items].get(:a).should be_a_kind_of(BigDecimal)
182
+
183
+ @db[:items].update(:a=>100.1)
184
+ @db[:items].select_map(:a).should == [BigDecimal.new('100.1')]
185
+ @db[:items].get(:a).should be_a_kind_of(BigDecimal)
186
+
187
+ @db[:items].update(:a=>'100.1')
188
+ @db[:items].select_map(:a).should == [BigDecimal.new('100.1')]
189
+ @db[:items].get(:a).should be_a_kind_of(BigDecimal)
190
+
191
+ @db[:items].update(:a=>BigDecimal.new('100.1'))
192
+ @db[:items].select_map(:a).should == [BigDecimal.new('100.1')]
193
+ @db[:items].get(:a).should be_a_kind_of(BigDecimal)
194
+ end
195
+
196
+ specify "should handle integer/float date columns as julian date" do
197
+ @db.create_table(:items){Date :a}
198
+ i = 2455979
199
+ @db[:items].insert(i)
200
+ @db[:items].first.should == {:a=>Date.jd(i)}
201
+ @db[:items].update(:a=>2455979.1)
202
+ @db[:items].first.should == {:a=>Date.jd(i)}
203
+ end
204
+
205
+ specify "should handle integer/float time columns as seconds" do
206
+ @db.create_table(:items){Time :a, :only_time=>true}
207
+ @db[:items].insert(3661)
208
+ @db[:items].first.should == {:a=>Sequel::SQLTime.create(1, 1, 1)}
209
+ @db[:items].update(:a=>3661.000001)
210
+ @db[:items].first.should == {:a=>Sequel::SQLTime.create(1, 1, 1, 1)}
211
+ end
212
+
213
+ specify "should handle integer datetime columns as unix timestamp" do
214
+ @db.create_table(:items){DateTime :a}
215
+ i = 1329860756
216
+ @db[:items].insert(i)
217
+ @db[:items].first.should == {:a=>Time.at(i)}
218
+ Sequel.datetime_class = DateTime
219
+ @db[:items].first.should == {:a=>DateTime.strptime(i.to_s, '%s')}
220
+ end
221
+
222
+ specify "should handle float datetime columns as julian date" do
223
+ @db.create_table(:items){DateTime :a}
224
+ i = 2455979.5
225
+ @db[:items].insert(i)
226
+ @db[:items].first.should == {:a=>Time.at(1329825600)}
227
+ Sequel.datetime_class = DateTime
228
+ @db[:items].first.should == {:a=>DateTime.jd(2455979.5)}
141
229
  end
142
230
 
231
+ specify "should handle integer/float blob columns" do
232
+ @db.create_table(:items){File :a}
233
+ @db[:items].insert(1)
234
+ @db[:items].first.should == {:a=>Sequel::SQL::Blob.new('1')}
235
+ @db[:items].update(:a=>'1.1')
236
+ @db[:items].first.should == {:a=>Sequel::SQL::Blob.new(1.1.to_s)}
237
+ end
238
+ end if SQLITE_DB.adapter_scheme == :sqlite
239
+
240
+ describe "An SQLite dataset" do
241
+ before do
242
+ @d = SQLITE_DB[:items]
243
+ end
244
+
143
245
  specify "should raise errors if given a regexp pattern match" do
144
246
  proc{@d.literal(:x.like(/a/))}.should raise_error(Sequel::Error)
145
247
  proc{@d.literal(~:x.like(/a/))}.should raise_error(Sequel::Error)
@@ -164,27 +266,27 @@ end
164
266
 
165
267
  describe "An SQLite dataset AS clause" do
166
268
  specify "should use a string literal for :col___alias" do
167
- SQLITE_DB.literal(:c___a).should == "c AS 'a'"
269
+ SQLITE_DB.literal(:c___a).should == "`c` AS 'a'"
168
270
  end
169
271
 
170
272
  specify "should use a string literal for :table__col___alias" do
171
- SQLITE_DB.literal(:t__c___a).should == "t.c AS 'a'"
273
+ SQLITE_DB.literal(:t__c___a).should == "`t`.`c` AS 'a'"
172
274
  end
173
275
 
174
276
  specify "should use a string literal for :column.as(:alias)" do
175
- SQLITE_DB.literal(:c.as(:a)).should == "c AS 'a'"
277
+ SQLITE_DB.literal(:c.as(:a)).should == "`c` AS 'a'"
176
278
  end
177
279
 
178
280
  specify "should use a string literal in the SELECT clause" do
179
- SQLITE_DB[:t].select(:c___a).sql.should == "SELECT c AS 'a' FROM t"
281
+ SQLITE_DB[:t].select(:c___a).sql.should == "SELECT `c` AS 'a' FROM `t`"
180
282
  end
181
283
 
182
284
  specify "should use a string literal in the FROM clause" do
183
- SQLITE_DB[:t___a].sql.should == "SELECT * FROM t AS 'a'"
285
+ SQLITE_DB[:t___a].sql.should == "SELECT * FROM `t` AS 'a'"
184
286
  end
185
287
 
186
288
  specify "should use a string literal in the JOIN clause" do
187
- SQLITE_DB[:t].join_table(:natural, :j, nil, :a).sql.should == "SELECT * FROM t NATURAL JOIN j AS 'a'"
289
+ SQLITE_DB[:t].join_table(:natural, :j, nil, :a).sql.should == "SELECT * FROM `t` NATURAL JOIN `j` AS 'a'"
188
290
  end
189
291
  end
190
292
 
@@ -261,7 +363,7 @@ describe "SQLite dataset" do
261
363
  @d << {:name => 'ghi', :value => 7.89}
262
364
  end
263
365
  after do
264
- SQLITE_DB.drop_table(:test, :items)
366
+ SQLITE_DB.drop_table?(:test, :items)
265
367
  end
266
368
 
267
369
  specify "should be able to insert from a subquery" do
@@ -272,13 +374,13 @@ describe "SQLite dataset" do
272
374
  end
273
375
 
274
376
  specify "should support #explain" do
275
- SQLITE_DB[:test].explain.should be_a_kind_of(Array)
377
+ SQLITE_DB[:test].explain.should be_a_kind_of(String)
276
378
  end
277
379
 
278
380
  specify "should have #explain work when identifier_output_method is modified" do
279
381
  ds = SQLITE_DB[:test]
280
382
  ds.identifier_output_method = :upcase
281
- ds.explain.should be_a_kind_of(Array)
383
+ ds.explain.should be_a_kind_of(String)
282
384
  end
283
385
  end
284
386
 
@@ -313,6 +415,15 @@ describe "A SQLite database" do
313
415
  @db[:test2].first.should == {:name => 'mmm'}
314
416
  end
315
417
 
418
+ specify "should keep a composite primary key when dropping columns" do
419
+ @db.create_table!(:test2){Integer :a; Integer :b; Integer :c; primary_key [:a, :b]}
420
+ @db.drop_column :test2, :c
421
+ @db[:test2].columns.should == [:a, :b]
422
+ @db[:test2] << {:a=>1, :b=>2}
423
+ @db[:test2] << {:a=>2, :b=>3}
424
+ proc{@db[:test2] << {:a=>2, :b=>3}}.should raise_error(Sequel::Error)
425
+ end
426
+
316
427
  specify "should keep column attributes when dropping a column" do
317
428
  @db.create_table! :test3 do
318
429
  primary_key :id
@@ -357,7 +468,7 @@ describe "A SQLite database" do
357
468
  @db[:test].filter(:name => 'foo').update(:id=>100)
358
469
  @db[:test3][:name => 'abc'][:test_id].should == 100
359
470
 
360
- @db.drop_table :test, :test3
471
+ @db.drop_table? :test, :test3
361
472
  end
362
473
  end
363
474
 
@@ -395,7 +506,7 @@ describe "A SQLite database" do
395
506
  specify "should handle quoted tables when dropping or renaming columns" do
396
507
  @db.quote_identifiers = true
397
508
  table_name = "T T"
398
- @db.drop_table(table_name) rescue nil
509
+ @db.drop_table?(table_name)
399
510
  @db.create_table! table_name do
400
511
  Integer :"s s"
401
512
  Integer :"i i"
@@ -412,14 +523,15 @@ describe "A SQLite database" do
412
523
  specify "should choose a temporary table name that isn't already used when dropping or renaming columns" do
413
524
  sqls = []
414
525
  @db.loggers << (l=Class.new{%w'info error'.each{|m| define_method(m){|sql| sqls << sql}}}.new)
415
- @db.create_table! :test3 do
526
+ @db.tables.each{|t| @db.drop_table(t) if t.to_s =~ /test3/}
527
+ @db.create_table :test3 do
416
528
  Integer :h
417
529
  Integer :i
418
530
  end
419
- @db.create_table! :test3_backup0 do
531
+ @db.create_table :test3_backup0 do
420
532
  Integer :j
421
533
  end
422
- @db.create_table! :test3_backup1 do
534
+ @db.create_table :test3_backup1 do
423
535
  Integer :k
424
536
  end
425
537
 
@@ -428,20 +540,20 @@ describe "A SQLite database" do
428
540
  @db[:test3_backup1].columns.should == [:k]
429
541
  sqls.clear
430
542
  @db.drop_column(:test3, :i)
431
- sqls.any?{|x| x =~ /\ACREATE TABLE.*test3_backup2/}.should == true
432
- sqls.any?{|x| x =~ /\ACREATE TABLE.*test3_backup[01]/}.should == false
543
+ sqls.any?{|x| x =~ /\AALTER TABLE.*test3.*RENAME TO.*test3_backup2/}.should == true
544
+ sqls.any?{|x| x =~ /\AALTER TABLE.*test3.*RENAME TO.*test3_backup[01]/}.should == false
433
545
  @db[:test3].columns.should == [:h]
434
546
  @db[:test3_backup0].columns.should == [:j]
435
547
  @db[:test3_backup1].columns.should == [:k]
436
548
 
437
- @db.create_table! :test3_backup2 do
549
+ @db.create_table :test3_backup2 do
438
550
  Integer :l
439
551
  end
440
552
 
441
553
  sqls.clear
442
554
  @db.rename_column(:test3, :h, :i)
443
- sqls.any?{|x| x =~ /\ACREATE TABLE.*test3_backup3/}.should == true
444
- sqls.any?{|x| x =~ /\ACREATE TABLE.*test3_backup[012]/}.should == false
555
+ sqls.any?{|x| x =~ /\AALTER TABLE.*test3.*RENAME TO.*test3_backup3/}.should == true
556
+ sqls.any?{|x| x =~ /\AALTER TABLE.*test3.*RENAME TO.*test3_backup[012]/}.should == false
445
557
  @db[:test3].columns.should == [:i]
446
558
  @db[:test3_backup0].columns.should == [:j]
447
559
  @db[:test3_backup1].columns.should == [:k]