sequel 4.26.0 → 5.37.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 (692) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +405 -5656
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +232 -157
  5. data/bin/sequel +32 -9
  6. data/doc/advanced_associations.rdoc +252 -188
  7. data/doc/association_basics.rdoc +231 -273
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +75 -48
  10. data/doc/code_order.rdoc +28 -10
  11. data/doc/core_extensions.rdoc +104 -63
  12. data/doc/dataset_basics.rdoc +12 -21
  13. data/doc/dataset_filtering.rdoc +99 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/mass_assignment.rdoc +74 -31
  16. data/doc/migration.rdoc +72 -46
  17. data/doc/model_dataset_method_design.rdoc +129 -0
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +12 -12
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +59 -69
  22. data/doc/opening_databases.rdoc +84 -94
  23. data/doc/postgresql.rdoc +268 -38
  24. data/doc/prepared_statements.rdoc +29 -24
  25. data/doc/querying.rdoc +184 -164
  26. data/doc/reflection.rdoc +5 -6
  27. data/doc/release_notes/5.0.0.txt +159 -0
  28. data/doc/release_notes/5.1.0.txt +31 -0
  29. data/doc/release_notes/5.10.0.txt +84 -0
  30. data/doc/release_notes/5.11.0.txt +83 -0
  31. data/doc/release_notes/5.12.0.txt +141 -0
  32. data/doc/release_notes/5.13.0.txt +27 -0
  33. data/doc/release_notes/5.14.0.txt +63 -0
  34. data/doc/release_notes/5.15.0.txt +39 -0
  35. data/doc/release_notes/5.16.0.txt +110 -0
  36. data/doc/release_notes/5.17.0.txt +31 -0
  37. data/doc/release_notes/5.18.0.txt +69 -0
  38. data/doc/release_notes/5.19.0.txt +28 -0
  39. data/doc/release_notes/5.2.0.txt +33 -0
  40. data/doc/release_notes/5.20.0.txt +89 -0
  41. data/doc/release_notes/5.21.0.txt +87 -0
  42. data/doc/release_notes/5.22.0.txt +48 -0
  43. data/doc/release_notes/5.23.0.txt +56 -0
  44. data/doc/release_notes/5.24.0.txt +56 -0
  45. data/doc/release_notes/5.25.0.txt +32 -0
  46. data/doc/release_notes/5.26.0.txt +35 -0
  47. data/doc/release_notes/5.27.0.txt +21 -0
  48. data/doc/release_notes/5.28.0.txt +16 -0
  49. data/doc/release_notes/5.29.0.txt +22 -0
  50. data/doc/release_notes/5.3.0.txt +121 -0
  51. data/doc/release_notes/5.30.0.txt +20 -0
  52. data/doc/release_notes/5.31.0.txt +148 -0
  53. data/doc/release_notes/5.32.0.txt +46 -0
  54. data/doc/release_notes/5.33.0.txt +24 -0
  55. data/doc/release_notes/5.34.0.txt +40 -0
  56. data/doc/release_notes/5.35.0.txt +56 -0
  57. data/doc/release_notes/5.36.0.txt +60 -0
  58. data/doc/release_notes/5.37.0.txt +30 -0
  59. data/doc/release_notes/5.4.0.txt +80 -0
  60. data/doc/release_notes/5.5.0.txt +61 -0
  61. data/doc/release_notes/5.6.0.txt +31 -0
  62. data/doc/release_notes/5.7.0.txt +108 -0
  63. data/doc/release_notes/5.8.0.txt +170 -0
  64. data/doc/release_notes/5.9.0.txt +99 -0
  65. data/doc/schema_modification.rdoc +102 -77
  66. data/doc/security.rdoc +160 -87
  67. data/doc/sharding.rdoc +74 -47
  68. data/doc/sql.rdoc +135 -122
  69. data/doc/testing.rdoc +34 -18
  70. data/doc/thread_safety.rdoc +2 -4
  71. data/doc/transactions.rdoc +101 -19
  72. data/doc/validations.rdoc +64 -51
  73. data/doc/virtual_rows.rdoc +90 -109
  74. data/lib/sequel.rb +3 -1
  75. data/lib/sequel/adapters/ado.rb +154 -22
  76. data/lib/sequel/adapters/ado/access.rb +21 -21
  77. data/lib/sequel/adapters/ado/mssql.rb +8 -15
  78. data/lib/sequel/adapters/amalgalite.rb +17 -25
  79. data/lib/sequel/adapters/ibmdb.rb +52 -58
  80. data/lib/sequel/adapters/jdbc.rb +149 -127
  81. data/lib/sequel/adapters/jdbc/db2.rb +32 -40
  82. data/lib/sequel/adapters/jdbc/derby.rb +56 -58
  83. data/lib/sequel/adapters/jdbc/h2.rb +40 -30
  84. data/lib/sequel/adapters/jdbc/hsqldb.rb +22 -33
  85. data/lib/sequel/adapters/jdbc/jtds.rb +4 -10
  86. data/lib/sequel/adapters/jdbc/mssql.rb +6 -12
  87. data/lib/sequel/adapters/jdbc/mysql.rb +17 -18
  88. data/lib/sequel/adapters/jdbc/oracle.rb +25 -19
  89. data/lib/sequel/adapters/jdbc/postgresql.rb +90 -69
  90. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +14 -24
  91. data/lib/sequel/adapters/jdbc/sqlite.rb +50 -12
  92. data/lib/sequel/adapters/jdbc/sqlserver.rb +36 -9
  93. data/lib/sequel/adapters/jdbc/transactions.rb +25 -39
  94. data/lib/sequel/adapters/mock.rb +104 -113
  95. data/lib/sequel/adapters/mysql.rb +42 -61
  96. data/lib/sequel/adapters/mysql2.rb +126 -35
  97. data/lib/sequel/adapters/odbc.rb +21 -28
  98. data/lib/sequel/adapters/odbc/db2.rb +3 -1
  99. data/lib/sequel/adapters/odbc/mssql.rb +11 -15
  100. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  101. data/lib/sequel/adapters/oracle.rb +62 -68
  102. data/lib/sequel/adapters/postgres.rb +257 -311
  103. data/lib/sequel/adapters/postgresql.rb +3 -1
  104. data/lib/sequel/adapters/shared/access.rb +75 -79
  105. data/lib/sequel/adapters/shared/db2.rb +96 -74
  106. data/lib/sequel/adapters/shared/mssql.rb +258 -213
  107. data/lib/sequel/adapters/shared/mysql.rb +284 -216
  108. data/lib/sequel/adapters/shared/oracle.rb +175 -60
  109. data/lib/sequel/adapters/shared/postgres.rb +829 -383
  110. data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -127
  111. data/lib/sequel/adapters/shared/sqlite.rb +382 -159
  112. data/lib/sequel/adapters/sqlanywhere.rb +53 -38
  113. data/lib/sequel/adapters/sqlite.rb +111 -105
  114. data/lib/sequel/adapters/tinytds.rb +38 -46
  115. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -9
  116. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +7 -5
  117. data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
  118. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
  119. data/lib/sequel/adapters/utils/replace.rb +3 -4
  120. data/lib/sequel/adapters/utils/split_alter_table.rb +2 -0
  121. data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
  122. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
  123. data/lib/sequel/ast_transformer.rb +13 -89
  124. data/lib/sequel/connection_pool.rb +54 -26
  125. data/lib/sequel/connection_pool/sharded_single.rb +19 -12
  126. data/lib/sequel/connection_pool/sharded_threaded.rb +160 -111
  127. data/lib/sequel/connection_pool/single.rb +21 -12
  128. data/lib/sequel/connection_pool/threaded.rb +137 -119
  129. data/lib/sequel/core.rb +352 -320
  130. data/lib/sequel/database.rb +19 -2
  131. data/lib/sequel/database/connecting.rb +70 -55
  132. data/lib/sequel/database/dataset.rb +15 -5
  133. data/lib/sequel/database/dataset_defaults.rb +20 -102
  134. data/lib/sequel/database/features.rb +20 -4
  135. data/lib/sequel/database/logging.rb +25 -7
  136. data/lib/sequel/database/misc.rb +132 -118
  137. data/lib/sequel/database/query.rb +51 -28
  138. data/lib/sequel/database/schema_generator.rb +188 -75
  139. data/lib/sequel/database/schema_methods.rb +161 -92
  140. data/lib/sequel/database/transactions.rb +260 -58
  141. data/lib/sequel/dataset.rb +28 -12
  142. data/lib/sequel/dataset/actions.rb +354 -170
  143. data/lib/sequel/dataset/dataset_module.rb +46 -0
  144. data/lib/sequel/dataset/features.rb +81 -34
  145. data/lib/sequel/dataset/graph.rb +82 -58
  146. data/lib/sequel/dataset/misc.rb +139 -47
  147. data/lib/sequel/dataset/placeholder_literalizer.rb +66 -26
  148. data/lib/sequel/dataset/prepared_statements.rb +188 -85
  149. data/lib/sequel/dataset/query.rb +428 -214
  150. data/lib/sequel/dataset/sql.rb +446 -339
  151. data/lib/sequel/deprecated.rb +14 -2
  152. data/lib/sequel/exceptions.rb +48 -16
  153. data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
  154. data/lib/sequel/extensions/_model_pg_row.rb +43 -0
  155. data/lib/sequel/extensions/_pretty_table.rb +10 -9
  156. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  157. data/lib/sequel/extensions/arbitrary_servers.rb +15 -11
  158. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  159. data/lib/sequel/extensions/blank.rb +2 -0
  160. data/lib/sequel/extensions/caller_logging.rb +79 -0
  161. data/lib/sequel/extensions/columns_introspection.rb +9 -4
  162. data/lib/sequel/extensions/connection_expiration.rb +99 -0
  163. data/lib/sequel/extensions/connection_validator.rb +26 -13
  164. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  165. data/lib/sequel/extensions/constraint_validations.rb +93 -38
  166. data/lib/sequel/extensions/core_extensions.rb +45 -53
  167. data/lib/sequel/extensions/core_refinements.rb +44 -46
  168. data/lib/sequel/extensions/current_datetime_timestamp.rb +5 -4
  169. data/lib/sequel/extensions/dataset_source_alias.rb +4 -0
  170. data/lib/sequel/extensions/date_arithmetic.rb +42 -16
  171. data/lib/sequel/extensions/datetime_parse_to_time.rb +37 -0
  172. data/lib/sequel/extensions/duplicate_columns_handler.rb +94 -0
  173. data/lib/sequel/extensions/empty_array_consider_nulls.rb +7 -3
  174. data/lib/sequel/extensions/error_sql.rb +7 -3
  175. data/lib/sequel/extensions/escaped_like.rb +100 -0
  176. data/lib/sequel/extensions/eval_inspect.rb +14 -15
  177. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  178. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  179. data/lib/sequel/extensions/freeze_datasets.rb +3 -0
  180. data/lib/sequel/extensions/from_block.rb +2 -31
  181. data/lib/sequel/extensions/graph_each.rb +19 -6
  182. data/lib/sequel/extensions/identifier_mangling.rb +180 -0
  183. data/lib/sequel/extensions/implicit_subquery.rb +48 -0
  184. data/lib/sequel/extensions/index_caching.rb +109 -0
  185. data/lib/sequel/extensions/inflector.rb +8 -4
  186. data/lib/sequel/extensions/integer64.rb +32 -0
  187. data/lib/sequel/extensions/looser_typecasting.rb +19 -9
  188. data/lib/sequel/extensions/migration.rb +132 -80
  189. data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +4 -0
  190. data/lib/sequel/extensions/named_timezones.rb +88 -23
  191. data/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
  192. data/lib/sequel/extensions/null_dataset.rb +12 -8
  193. data/lib/sequel/extensions/pagination.rb +35 -28
  194. data/lib/sequel/extensions/pg_array.rb +227 -316
  195. data/lib/sequel/extensions/pg_array_ops.rb +19 -7
  196. data/lib/sequel/extensions/pg_enum.rb +69 -24
  197. data/lib/sequel/extensions/pg_extended_date_support.rb +250 -0
  198. data/lib/sequel/extensions/pg_hstore.rb +50 -59
  199. data/lib/sequel/extensions/pg_hstore_ops.rb +9 -3
  200. data/lib/sequel/extensions/pg_inet.rb +34 -15
  201. data/lib/sequel/extensions/pg_inet_ops.rb +5 -1
  202. data/lib/sequel/extensions/pg_interval.rb +26 -26
  203. data/lib/sequel/extensions/pg_json.rb +422 -141
  204. data/lib/sequel/extensions/pg_json_ops.rb +248 -9
  205. data/lib/sequel/extensions/pg_loose_count.rb +5 -1
  206. data/lib/sequel/extensions/pg_range.rb +162 -146
  207. data/lib/sequel/extensions/pg_range_ops.rb +10 -5
  208. data/lib/sequel/extensions/pg_row.rb +53 -87
  209. data/lib/sequel/extensions/pg_row_ops.rb +36 -13
  210. data/lib/sequel/extensions/pg_static_cache_updater.rb +6 -2
  211. data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
  212. data/lib/sequel/extensions/pretty_table.rb +4 -0
  213. data/lib/sequel/extensions/query.rb +12 -7
  214. data/lib/sequel/extensions/round_timestamps.rb +6 -9
  215. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  216. data/lib/sequel/extensions/s.rb +59 -0
  217. data/lib/sequel/extensions/schema_caching.rb +14 -1
  218. data/lib/sequel/extensions/schema_dumper.rb +83 -55
  219. data/lib/sequel/extensions/select_remove.rb +8 -4
  220. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
  221. data/lib/sequel/extensions/server_block.rb +50 -17
  222. data/lib/sequel/extensions/server_logging.rb +61 -0
  223. data/lib/sequel/extensions/split_array_nil.rb +8 -4
  224. data/lib/sequel/extensions/sql_comments.rb +96 -0
  225. data/lib/sequel/extensions/sql_expr.rb +4 -1
  226. data/lib/sequel/extensions/string_agg.rb +181 -0
  227. data/lib/sequel/extensions/string_date_time.rb +2 -0
  228. data/lib/sequel/extensions/symbol_aref.rb +53 -0
  229. data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
  230. data/lib/sequel/extensions/symbol_as.rb +23 -0
  231. data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
  232. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  233. data/lib/sequel/extensions/thread_local_timezones.rb +4 -0
  234. data/lib/sequel/extensions/to_dot.rb +15 -5
  235. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  236. data/lib/sequel/model.rb +36 -126
  237. data/lib/sequel/model/associations.rb +850 -257
  238. data/lib/sequel/model/base.rb +652 -764
  239. data/lib/sequel/model/dataset_module.rb +13 -10
  240. data/lib/sequel/model/default_inflections.rb +3 -1
  241. data/lib/sequel/model/errors.rb +3 -3
  242. data/lib/sequel/model/exceptions.rb +12 -12
  243. data/lib/sequel/model/inflections.rb +8 -19
  244. data/lib/sequel/model/plugins.rb +111 -0
  245. data/lib/sequel/plugins/accessed_columns.rb +2 -0
  246. data/lib/sequel/plugins/active_model.rb +32 -7
  247. data/lib/sequel/plugins/after_initialize.rb +3 -1
  248. data/lib/sequel/plugins/association_dependencies.rb +27 -18
  249. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  250. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  251. data/lib/sequel/plugins/association_pks.rb +181 -83
  252. data/lib/sequel/plugins/association_proxies.rb +33 -9
  253. data/lib/sequel/plugins/auto_validations.rb +58 -23
  254. data/lib/sequel/plugins/before_after_save.rb +8 -0
  255. data/lib/sequel/plugins/blacklist_security.rb +23 -12
  256. data/lib/sequel/plugins/boolean_readers.rb +9 -6
  257. data/lib/sequel/plugins/boolean_subsets.rb +64 -0
  258. data/lib/sequel/plugins/caching.rb +27 -16
  259. data/lib/sequel/plugins/class_table_inheritance.rb +192 -94
  260. data/lib/sequel/plugins/column_conflicts.rb +18 -3
  261. data/lib/sequel/plugins/column_select.rb +9 -5
  262. data/lib/sequel/plugins/columns_updated.rb +42 -0
  263. data/lib/sequel/plugins/composition.rb +36 -24
  264. data/lib/sequel/plugins/constraint_validations.rb +37 -16
  265. data/lib/sequel/plugins/csv_serializer.rb +58 -35
  266. data/lib/sequel/plugins/dataset_associations.rb +60 -18
  267. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  268. data/lib/sequel/plugins/defaults_setter.rb +74 -13
  269. data/lib/sequel/plugins/delay_add_association.rb +4 -1
  270. data/lib/sequel/plugins/dirty.rb +65 -24
  271. data/lib/sequel/plugins/eager_each.rb +27 -3
  272. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  273. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  274. data/lib/sequel/plugins/error_splitter.rb +19 -12
  275. data/lib/sequel/plugins/finder.rb +246 -0
  276. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  277. data/lib/sequel/plugins/force_encoding.rb +9 -12
  278. data/lib/sequel/plugins/hook_class_methods.rb +39 -54
  279. data/lib/sequel/plugins/input_transformer.rb +20 -10
  280. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  281. data/lib/sequel/plugins/insert_returning_select.rb +4 -2
  282. data/lib/sequel/plugins/instance_filters.rb +12 -8
  283. data/lib/sequel/plugins/instance_hooks.rb +36 -17
  284. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  285. data/lib/sequel/plugins/inverted_subsets.rb +24 -13
  286. data/lib/sequel/plugins/json_serializer.rb +123 -47
  287. data/lib/sequel/plugins/lazy_attributes.rb +20 -14
  288. data/lib/sequel/plugins/list.rb +40 -26
  289. data/lib/sequel/plugins/many_through_many.rb +28 -12
  290. data/lib/sequel/plugins/modification_detection.rb +17 -5
  291. data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -5
  292. data/lib/sequel/plugins/nested_attributes.rb +55 -28
  293. data/lib/sequel/plugins/optimistic_locking.rb +5 -3
  294. data/lib/sequel/plugins/pg_array_associations.rb +52 -18
  295. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +348 -0
  296. data/lib/sequel/plugins/pg_row.rb +7 -51
  297. data/lib/sequel/plugins/prepared_statements.rb +53 -72
  298. data/lib/sequel/plugins/prepared_statements_safe.rb +13 -5
  299. data/lib/sequel/plugins/rcte_tree.rb +43 -63
  300. data/lib/sequel/plugins/serialization.rb +37 -44
  301. data/lib/sequel/plugins/serialization_modification_detection.rb +3 -1
  302. data/lib/sequel/plugins/sharding.rb +17 -10
  303. data/lib/sequel/plugins/single_table_inheritance.rb +62 -28
  304. data/lib/sequel/plugins/singular_table_names.rb +2 -0
  305. data/lib/sequel/plugins/skip_create_refresh.rb +5 -3
  306. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  307. data/lib/sequel/plugins/split_values.rb +13 -6
  308. data/lib/sequel/plugins/static_cache.rb +79 -53
  309. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  310. data/lib/sequel/plugins/string_stripper.rb +5 -3
  311. data/lib/sequel/plugins/subclasses.rb +20 -2
  312. data/lib/sequel/plugins/subset_conditions.rb +48 -0
  313. data/lib/sequel/plugins/table_select.rb +4 -2
  314. data/lib/sequel/plugins/tactical_eager_loading.rb +120 -6
  315. data/lib/sequel/plugins/throw_failures.rb +110 -0
  316. data/lib/sequel/plugins/timestamps.rb +22 -8
  317. data/lib/sequel/plugins/touch.rb +21 -8
  318. data/lib/sequel/plugins/tree.rb +57 -30
  319. data/lib/sequel/plugins/typecast_on_load.rb +14 -4
  320. data/lib/sequel/plugins/unlimited_update.rb +3 -7
  321. data/lib/sequel/plugins/update_or_create.rb +6 -4
  322. data/lib/sequel/plugins/update_primary_key.rb +3 -1
  323. data/lib/sequel/plugins/update_refresh.rb +28 -15
  324. data/lib/sequel/plugins/uuid.rb +70 -0
  325. data/lib/sequel/plugins/validate_associated.rb +20 -0
  326. data/lib/sequel/plugins/validation_class_methods.rb +40 -19
  327. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  328. data/lib/sequel/plugins/validation_helpers.rb +49 -31
  329. data/lib/sequel/plugins/whitelist_security.rb +122 -0
  330. data/lib/sequel/plugins/xml_serializer.rb +31 -30
  331. data/lib/sequel/sql.rb +479 -329
  332. data/lib/sequel/timezones.rb +62 -32
  333. data/lib/sequel/version.rb +10 -3
  334. metadata +177 -477
  335. data/Rakefile +0 -165
  336. data/doc/active_record.rdoc +0 -912
  337. data/doc/release_notes/1.0.txt +0 -38
  338. data/doc/release_notes/1.1.txt +0 -143
  339. data/doc/release_notes/1.3.txt +0 -101
  340. data/doc/release_notes/1.4.0.txt +0 -53
  341. data/doc/release_notes/1.5.0.txt +0 -155
  342. data/doc/release_notes/2.0.0.txt +0 -298
  343. data/doc/release_notes/2.1.0.txt +0 -271
  344. data/doc/release_notes/2.10.0.txt +0 -328
  345. data/doc/release_notes/2.11.0.txt +0 -215
  346. data/doc/release_notes/2.12.0.txt +0 -534
  347. data/doc/release_notes/2.2.0.txt +0 -253
  348. data/doc/release_notes/2.3.0.txt +0 -88
  349. data/doc/release_notes/2.4.0.txt +0 -106
  350. data/doc/release_notes/2.5.0.txt +0 -137
  351. data/doc/release_notes/2.6.0.txt +0 -157
  352. data/doc/release_notes/2.7.0.txt +0 -166
  353. data/doc/release_notes/2.8.0.txt +0 -171
  354. data/doc/release_notes/2.9.0.txt +0 -97
  355. data/doc/release_notes/3.0.0.txt +0 -221
  356. data/doc/release_notes/3.1.0.txt +0 -406
  357. data/doc/release_notes/3.10.0.txt +0 -286
  358. data/doc/release_notes/3.11.0.txt +0 -254
  359. data/doc/release_notes/3.12.0.txt +0 -304
  360. data/doc/release_notes/3.13.0.txt +0 -210
  361. data/doc/release_notes/3.14.0.txt +0 -118
  362. data/doc/release_notes/3.15.0.txt +0 -78
  363. data/doc/release_notes/3.16.0.txt +0 -45
  364. data/doc/release_notes/3.17.0.txt +0 -58
  365. data/doc/release_notes/3.18.0.txt +0 -120
  366. data/doc/release_notes/3.19.0.txt +0 -67
  367. data/doc/release_notes/3.2.0.txt +0 -268
  368. data/doc/release_notes/3.20.0.txt +0 -41
  369. data/doc/release_notes/3.21.0.txt +0 -87
  370. data/doc/release_notes/3.22.0.txt +0 -39
  371. data/doc/release_notes/3.23.0.txt +0 -172
  372. data/doc/release_notes/3.24.0.txt +0 -420
  373. data/doc/release_notes/3.25.0.txt +0 -88
  374. data/doc/release_notes/3.26.0.txt +0 -88
  375. data/doc/release_notes/3.27.0.txt +0 -82
  376. data/doc/release_notes/3.28.0.txt +0 -304
  377. data/doc/release_notes/3.29.0.txt +0 -459
  378. data/doc/release_notes/3.3.0.txt +0 -192
  379. data/doc/release_notes/3.30.0.txt +0 -135
  380. data/doc/release_notes/3.31.0.txt +0 -146
  381. data/doc/release_notes/3.32.0.txt +0 -202
  382. data/doc/release_notes/3.33.0.txt +0 -157
  383. data/doc/release_notes/3.34.0.txt +0 -671
  384. data/doc/release_notes/3.35.0.txt +0 -144
  385. data/doc/release_notes/3.36.0.txt +0 -245
  386. data/doc/release_notes/3.37.0.txt +0 -338
  387. data/doc/release_notes/3.38.0.txt +0 -234
  388. data/doc/release_notes/3.39.0.txt +0 -237
  389. data/doc/release_notes/3.4.0.txt +0 -325
  390. data/doc/release_notes/3.40.0.txt +0 -73
  391. data/doc/release_notes/3.41.0.txt +0 -155
  392. data/doc/release_notes/3.42.0.txt +0 -74
  393. data/doc/release_notes/3.43.0.txt +0 -105
  394. data/doc/release_notes/3.44.0.txt +0 -152
  395. data/doc/release_notes/3.45.0.txt +0 -179
  396. data/doc/release_notes/3.46.0.txt +0 -122
  397. data/doc/release_notes/3.47.0.txt +0 -270
  398. data/doc/release_notes/3.48.0.txt +0 -477
  399. data/doc/release_notes/3.5.0.txt +0 -510
  400. data/doc/release_notes/3.6.0.txt +0 -366
  401. data/doc/release_notes/3.7.0.txt +0 -179
  402. data/doc/release_notes/3.8.0.txt +0 -151
  403. data/doc/release_notes/3.9.0.txt +0 -233
  404. data/doc/release_notes/4.0.0.txt +0 -262
  405. data/doc/release_notes/4.1.0.txt +0 -85
  406. data/doc/release_notes/4.10.0.txt +0 -226
  407. data/doc/release_notes/4.11.0.txt +0 -147
  408. data/doc/release_notes/4.12.0.txt +0 -105
  409. data/doc/release_notes/4.13.0.txt +0 -169
  410. data/doc/release_notes/4.14.0.txt +0 -68
  411. data/doc/release_notes/4.15.0.txt +0 -56
  412. data/doc/release_notes/4.16.0.txt +0 -36
  413. data/doc/release_notes/4.17.0.txt +0 -38
  414. data/doc/release_notes/4.18.0.txt +0 -36
  415. data/doc/release_notes/4.19.0.txt +0 -45
  416. data/doc/release_notes/4.2.0.txt +0 -129
  417. data/doc/release_notes/4.20.0.txt +0 -79
  418. data/doc/release_notes/4.21.0.txt +0 -94
  419. data/doc/release_notes/4.22.0.txt +0 -72
  420. data/doc/release_notes/4.23.0.txt +0 -65
  421. data/doc/release_notes/4.24.0.txt +0 -99
  422. data/doc/release_notes/4.25.0.txt +0 -181
  423. data/doc/release_notes/4.26.0.txt +0 -44
  424. data/doc/release_notes/4.3.0.txt +0 -40
  425. data/doc/release_notes/4.4.0.txt +0 -92
  426. data/doc/release_notes/4.5.0.txt +0 -34
  427. data/doc/release_notes/4.6.0.txt +0 -30
  428. data/doc/release_notes/4.7.0.txt +0 -103
  429. data/doc/release_notes/4.8.0.txt +0 -175
  430. data/doc/release_notes/4.9.0.txt +0 -190
  431. data/lib/sequel/adapters/cubrid.rb +0 -142
  432. data/lib/sequel/adapters/do.rb +0 -156
  433. data/lib/sequel/adapters/do/mysql.rb +0 -64
  434. data/lib/sequel/adapters/do/postgres.rb +0 -42
  435. data/lib/sequel/adapters/do/sqlite3.rb +0 -40
  436. data/lib/sequel/adapters/jdbc/as400.rb +0 -82
  437. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -62
  438. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -34
  439. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -31
  440. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -31
  441. data/lib/sequel/adapters/odbc/progress.rb +0 -8
  442. data/lib/sequel/adapters/shared/cubrid.rb +0 -243
  443. data/lib/sequel/adapters/shared/firebird.rb +0 -245
  444. data/lib/sequel/adapters/shared/informix.rb +0 -52
  445. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -150
  446. data/lib/sequel/adapters/shared/progress.rb +0 -38
  447. data/lib/sequel/adapters/swift.rb +0 -158
  448. data/lib/sequel/adapters/swift/mysql.rb +0 -47
  449. data/lib/sequel/adapters/swift/postgres.rb +0 -45
  450. data/lib/sequel/adapters/swift/sqlite.rb +0 -47
  451. data/lib/sequel/adapters/utils/pg_types.rb +0 -68
  452. data/lib/sequel/dataset/mutation.rb +0 -109
  453. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -3
  454. data/lib/sequel/extensions/filter_having.rb +0 -59
  455. data/lib/sequel/extensions/hash_aliases.rb +0 -45
  456. data/lib/sequel/extensions/meta_def.rb +0 -31
  457. data/lib/sequel/extensions/query_literals.rb +0 -80
  458. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -22
  459. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -118
  460. data/lib/sequel/extensions/set_overrides.rb +0 -72
  461. data/lib/sequel/no_core_ext.rb +0 -1
  462. data/lib/sequel/plugins/association_autoreloading.rb +0 -7
  463. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -7
  464. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -78
  465. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -117
  466. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -59
  467. data/lib/sequel/plugins/schema.rb +0 -80
  468. data/lib/sequel/plugins/scissors.rb +0 -33
  469. data/spec/adapters/db2_spec.rb +0 -160
  470. data/spec/adapters/firebird_spec.rb +0 -411
  471. data/spec/adapters/informix_spec.rb +0 -100
  472. data/spec/adapters/mssql_spec.rb +0 -706
  473. data/spec/adapters/mysql_spec.rb +0 -1287
  474. data/spec/adapters/oracle_spec.rb +0 -313
  475. data/spec/adapters/postgres_spec.rb +0 -3725
  476. data/spec/adapters/spec_helper.rb +0 -43
  477. data/spec/adapters/sqlanywhere_spec.rb +0 -170
  478. data/spec/adapters/sqlite_spec.rb +0 -653
  479. data/spec/bin_spec.rb +0 -254
  480. data/spec/core/connection_pool_spec.rb +0 -1016
  481. data/spec/core/database_spec.rb +0 -2531
  482. data/spec/core/dataset_spec.rb +0 -5098
  483. data/spec/core/deprecated_spec.rb +0 -70
  484. data/spec/core/expression_filters_spec.rb +0 -1243
  485. data/spec/core/mock_adapter_spec.rb +0 -462
  486. data/spec/core/object_graph_spec.rb +0 -303
  487. data/spec/core/placeholder_literalizer_spec.rb +0 -163
  488. data/spec/core/schema_generator_spec.rb +0 -179
  489. data/spec/core/schema_spec.rb +0 -1659
  490. data/spec/core/spec_helper.rb +0 -34
  491. data/spec/core/version_spec.rb +0 -7
  492. data/spec/core_extensions_spec.rb +0 -699
  493. data/spec/extensions/accessed_columns_spec.rb +0 -51
  494. data/spec/extensions/active_model_spec.rb +0 -123
  495. data/spec/extensions/after_initialize_spec.rb +0 -24
  496. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  497. data/spec/extensions/association_dependencies_spec.rb +0 -117
  498. data/spec/extensions/association_pks_spec.rb +0 -365
  499. data/spec/extensions/association_proxies_spec.rb +0 -86
  500. data/spec/extensions/auto_validations_spec.rb +0 -192
  501. data/spec/extensions/blacklist_security_spec.rb +0 -88
  502. data/spec/extensions/blank_spec.rb +0 -69
  503. data/spec/extensions/boolean_readers_spec.rb +0 -93
  504. data/spec/extensions/caching_spec.rb +0 -270
  505. data/spec/extensions/class_table_inheritance_spec.rb +0 -420
  506. data/spec/extensions/column_conflicts_spec.rb +0 -60
  507. data/spec/extensions/column_select_spec.rb +0 -108
  508. data/spec/extensions/columns_introspection_spec.rb +0 -91
  509. data/spec/extensions/composition_spec.rb +0 -242
  510. data/spec/extensions/connection_validator_spec.rb +0 -120
  511. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -274
  512. data/spec/extensions/constraint_validations_spec.rb +0 -325
  513. data/spec/extensions/core_refinements_spec.rb +0 -519
  514. data/spec/extensions/csv_serializer_spec.rb +0 -173
  515. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  516. data/spec/extensions/dataset_associations_spec.rb +0 -311
  517. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  518. data/spec/extensions/date_arithmetic_spec.rb +0 -150
  519. data/spec/extensions/defaults_setter_spec.rb +0 -101
  520. data/spec/extensions/delay_add_association_spec.rb +0 -52
  521. data/spec/extensions/dirty_spec.rb +0 -180
  522. data/spec/extensions/eager_each_spec.rb +0 -42
  523. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  524. data/spec/extensions/error_splitter_spec.rb +0 -18
  525. data/spec/extensions/error_sql_spec.rb +0 -20
  526. data/spec/extensions/eval_inspect_spec.rb +0 -73
  527. data/spec/extensions/filter_having_spec.rb +0 -40
  528. data/spec/extensions/force_encoding_spec.rb +0 -114
  529. data/spec/extensions/from_block_spec.rb +0 -21
  530. data/spec/extensions/graph_each_spec.rb +0 -109
  531. data/spec/extensions/hash_aliases_spec.rb +0 -24
  532. data/spec/extensions/hook_class_methods_spec.rb +0 -429
  533. data/spec/extensions/inflector_spec.rb +0 -183
  534. data/spec/extensions/input_transformer_spec.rb +0 -54
  535. data/spec/extensions/insert_returning_select_spec.rb +0 -46
  536. data/spec/extensions/instance_filters_spec.rb +0 -79
  537. data/spec/extensions/instance_hooks_spec.rb +0 -276
  538. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  539. data/spec/extensions/json_serializer_spec.rb +0 -291
  540. data/spec/extensions/lazy_attributes_spec.rb +0 -170
  541. data/spec/extensions/list_spec.rb +0 -267
  542. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  543. data/spec/extensions/many_through_many_spec.rb +0 -2172
  544. data/spec/extensions/meta_def_spec.rb +0 -21
  545. data/spec/extensions/migration_spec.rb +0 -712
  546. data/spec/extensions/modification_detection_spec.rb +0 -80
  547. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
  548. data/spec/extensions/named_timezones_spec.rb +0 -108
  549. data/spec/extensions/nested_attributes_spec.rb +0 -697
  550. data/spec/extensions/null_dataset_spec.rb +0 -85
  551. data/spec/extensions/optimistic_locking_spec.rb +0 -128
  552. data/spec/extensions/pagination_spec.rb +0 -118
  553. data/spec/extensions/pg_array_associations_spec.rb +0 -736
  554. data/spec/extensions/pg_array_ops_spec.rb +0 -143
  555. data/spec/extensions/pg_array_spec.rb +0 -395
  556. data/spec/extensions/pg_enum_spec.rb +0 -92
  557. data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
  558. data/spec/extensions/pg_hstore_spec.rb +0 -206
  559. data/spec/extensions/pg_inet_ops_spec.rb +0 -101
  560. data/spec/extensions/pg_inet_spec.rb +0 -52
  561. data/spec/extensions/pg_interval_spec.rb +0 -76
  562. data/spec/extensions/pg_json_ops_spec.rb +0 -229
  563. data/spec/extensions/pg_json_spec.rb +0 -218
  564. data/spec/extensions/pg_loose_count_spec.rb +0 -17
  565. data/spec/extensions/pg_range_ops_spec.rb +0 -58
  566. data/spec/extensions/pg_range_spec.rb +0 -404
  567. data/spec/extensions/pg_row_ops_spec.rb +0 -60
  568. data/spec/extensions/pg_row_plugin_spec.rb +0 -62
  569. data/spec/extensions/pg_row_spec.rb +0 -360
  570. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
  571. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
  572. data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
  573. data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
  574. data/spec/extensions/prepared_statements_spec.rb +0 -103
  575. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
  576. data/spec/extensions/pretty_table_spec.rb +0 -92
  577. data/spec/extensions/query_literals_spec.rb +0 -183
  578. data/spec/extensions/query_spec.rb +0 -102
  579. data/spec/extensions/rcte_tree_spec.rb +0 -392
  580. data/spec/extensions/round_timestamps_spec.rb +0 -43
  581. data/spec/extensions/schema_caching_spec.rb +0 -41
  582. data/spec/extensions/schema_dumper_spec.rb +0 -789
  583. data/spec/extensions/schema_spec.rb +0 -117
  584. data/spec/extensions/scissors_spec.rb +0 -26
  585. data/spec/extensions/select_remove_spec.rb +0 -38
  586. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
  587. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  588. data/spec/extensions/serialization_spec.rb +0 -362
  589. data/spec/extensions/server_block_spec.rb +0 -90
  590. data/spec/extensions/set_overrides_spec.rb +0 -61
  591. data/spec/extensions/sharding_spec.rb +0 -198
  592. data/spec/extensions/shared_caching_spec.rb +0 -175
  593. data/spec/extensions/single_table_inheritance_spec.rb +0 -297
  594. data/spec/extensions/singular_table_names_spec.rb +0 -22
  595. data/spec/extensions/skip_create_refresh_spec.rb +0 -17
  596. data/spec/extensions/spec_helper.rb +0 -71
  597. data/spec/extensions/split_array_nil_spec.rb +0 -24
  598. data/spec/extensions/split_values_spec.rb +0 -22
  599. data/spec/extensions/sql_expr_spec.rb +0 -60
  600. data/spec/extensions/static_cache_spec.rb +0 -361
  601. data/spec/extensions/string_date_time_spec.rb +0 -95
  602. data/spec/extensions/string_stripper_spec.rb +0 -68
  603. data/spec/extensions/subclasses_spec.rb +0 -66
  604. data/spec/extensions/table_select_spec.rb +0 -71
  605. data/spec/extensions/tactical_eager_loading_spec.rb +0 -82
  606. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  607. data/spec/extensions/timestamps_spec.rb +0 -175
  608. data/spec/extensions/to_dot_spec.rb +0 -154
  609. data/spec/extensions/touch_spec.rb +0 -203
  610. data/spec/extensions/tree_spec.rb +0 -274
  611. data/spec/extensions/typecast_on_load_spec.rb +0 -80
  612. data/spec/extensions/unlimited_update_spec.rb +0 -20
  613. data/spec/extensions/update_or_create_spec.rb +0 -87
  614. data/spec/extensions/update_primary_key_spec.rb +0 -100
  615. data/spec/extensions/update_refresh_spec.rb +0 -53
  616. data/spec/extensions/validate_associated_spec.rb +0 -52
  617. data/spec/extensions/validation_class_methods_spec.rb +0 -1027
  618. data/spec/extensions/validation_helpers_spec.rb +0 -541
  619. data/spec/extensions/xml_serializer_spec.rb +0 -207
  620. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  621. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  622. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  623. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  624. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  625. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  626. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  627. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  628. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  629. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  630. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  631. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  632. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  633. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  634. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  635. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  636. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  637. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  638. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  639. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  640. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  641. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  642. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  643. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  644. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  645. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  646. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  647. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  648. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  649. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  650. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  651. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  652. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  653. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  654. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  655. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  656. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  657. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  658. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  659. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  660. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  661. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  662. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  663. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  664. data/spec/guards_helper.rb +0 -55
  665. data/spec/integration/associations_test.rb +0 -2454
  666. data/spec/integration/database_test.rb +0 -113
  667. data/spec/integration/dataset_test.rb +0 -1808
  668. data/spec/integration/eager_loader_test.rb +0 -687
  669. data/spec/integration/migrator_test.rb +0 -240
  670. data/spec/integration/model_test.rb +0 -226
  671. data/spec/integration/plugin_test.rb +0 -2240
  672. data/spec/integration/prepared_statement_test.rb +0 -467
  673. data/spec/integration/schema_test.rb +0 -817
  674. data/spec/integration/spec_helper.rb +0 -48
  675. data/spec/integration/timezone_test.rb +0 -86
  676. data/spec/integration/transaction_test.rb +0 -374
  677. data/spec/integration/type_test.rb +0 -133
  678. data/spec/model/association_reflection_spec.rb +0 -525
  679. data/spec/model/associations_spec.rb +0 -4426
  680. data/spec/model/base_spec.rb +0 -759
  681. data/spec/model/class_dataset_methods_spec.rb +0 -146
  682. data/spec/model/dataset_methods_spec.rb +0 -149
  683. data/spec/model/eager_loading_spec.rb +0 -2137
  684. data/spec/model/hooks_spec.rb +0 -604
  685. data/spec/model/inflector_spec.rb +0 -26
  686. data/spec/model/model_spec.rb +0 -982
  687. data/spec/model/plugins_spec.rb +0 -299
  688. data/spec/model/record_spec.rb +0 -2147
  689. data/spec/model/spec_helper.rb +0 -46
  690. data/spec/model/validations_spec.rb +0 -193
  691. data/spec/sequel_coverage.rb +0 -15
  692. data/spec/spec_config.rb +0 -10
@@ -1,43 +0,0 @@
1
- require 'rubygems'
2
- require 'logger'
3
-
4
- if ENV['COVERAGE']
5
- require File.join(File.dirname(File.expand_path(__FILE__)), "../sequel_coverage")
6
- SimpleCov.sequel_coverage(:group=>%r{lib/sequel/adapters})
7
- end
8
-
9
- unless Object.const_defined?('Sequel')
10
- $:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
11
- require 'sequel'
12
- end
13
- begin
14
- require File.join(File.dirname(File.dirname(File.expand_path(__FILE__))), 'spec_config.rb')
15
- rescue LoadError
16
- end
17
-
18
- Sequel::Database.extension :columns_introspection if ENV['SEQUEL_COLUMNS_INTROSPECTION']
19
- Sequel::Model.cache_associations = false if ENV['SEQUEL_NO_CACHE_ASSOCIATIONS']
20
- Sequel.cache_anonymous_models = false
21
-
22
- class Sequel::Database
23
- def log_duration(duration, message)
24
- log_info(message)
25
- end
26
- end
27
-
28
- require './spec/guards_helper'
29
-
30
- class Minitest::HooksSpec
31
- def check_sqls
32
- yield unless ENV['SEQUEL_NO_CHECK_SQLS']
33
- end
34
- def self.check_sqls
35
- yield unless ENV['SEQUEL_NO_CHECK_SQLS']
36
- end
37
- end
38
-
39
- unless defined?(DB)
40
- env_var = "SEQUEL_#{SEQUEL_ADAPTER_TEST.to_s.upcase}_URL"
41
- env_var = ENV.has_key?(env_var) ? env_var : 'SEQUEL_INTEGRATION_URL'
42
- DB = Sequel.connect(ENV[env_var])
43
- end
@@ -1,170 +0,0 @@
1
- SEQUEL_ADAPTER_TEST = :sqlanywhere
2
-
3
- require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
4
-
5
- if DB.table_exists?(:test)
6
- DB.drop_table(:test)
7
- end
8
-
9
- describe "Convert smallint to boolean" do
10
- before do
11
- @db = DB
12
- end
13
- after do
14
- Sequel::SqlAnywhere.convert_smallint_to_bool = true
15
- @db.convert_smallint_to_bool = true
16
- end
17
-
18
- describe "Sequel::SqlAnywhere.convert_smallint_to_bool" do
19
- before do
20
- @db.create_table!(:booltest){column :b, 'smallint'; column :i, 'integer'}
21
- @ds = @db[:booltest]
22
- end
23
- after do
24
- @db.drop_table(:booltest)
25
- end
26
-
27
- it "should consider smallint datatypes as boolean if set, but if not, as larger smallints" do
28
- @db.create_table!(:booltest){column :b, 'smallint'; column :i, 'integer'}
29
- @db.schema(:booltest, :reload=>true).first.last[:type].must_equal :boolean
30
- @db.schema(:booltest, :reload=>true).first.last[:db_type].must_match /smallint/i
31
-
32
- Sequel::SqlAnywhere.convert_smallint_to_bool = false
33
- @db2 = Sequel.connect(DB.url)
34
- @db2.schema(:booltest, :reload=>true).first.last[:type].must_equal :integer
35
- @db2.schema(:booltest, :reload=>true).first.last[:db_type].must_match /smallint/i
36
-
37
- @db.schema(:booltest, :reload=>true).first.last[:type].must_equal :boolean
38
- @db.schema(:booltest, :reload=>true).first.last[:db_type].must_match /smallint/i
39
-
40
- @db2.disconnect
41
- end
42
-
43
- describe "datasets" do
44
- it "should return smallints as bools and integers as integers when set" do
45
- @ds.delete
46
- @ds << {:b=>true, :i=>10}
47
- @ds.all.must_equal [{:b=>true, :i=>10}]
48
- @ds.delete
49
- @ds << {:b=>false, :i=>0}
50
- @ds.all.must_equal [{:b=>false, :i=>0}]
51
- @ds.delete
52
- @ds << {:b=>true, :i=>1}
53
- @ds.all.must_equal [{:b=>true, :i=>1}]
54
- end
55
-
56
- it "should return all smallints as integers when unset" do
57
- Sequel::SqlAnywhere.convert_smallint_to_bool = false
58
- @db2 = Sequel.connect(DB.url)
59
- @ds2 = @db2[:booltest]
60
- @ds2.delete
61
- @ds2 << {:b=>true, :i=>10}
62
- @ds2.all.must_equal [{:b=>1, :i=>10}]
63
- @ds2.delete
64
- @ds2 << {:b=>false, :i=>0}
65
- @ds2.all.must_equal [{:b=>0, :i=>0}]
66
-
67
- @ds2.delete
68
- @ds2 << {:b=>1, :i=>10}
69
- @ds2.all.must_equal [{:b=>1, :i=>10}]
70
- @ds2.delete
71
- @ds2 << {:b=>0, :i=>0}
72
- @ds2.all.must_equal [{:b=>0, :i=>0}]
73
-
74
- @db2.disconnect
75
- end
76
- end
77
- end
78
-
79
- describe "Database#convert_smallint_to_bool" do
80
- before do
81
- @db.create_table!(:booltest){column :b, 'smallint'; column :i, 'integer'}
82
- end
83
- after do
84
- @db.drop_table(:booltest)
85
- end
86
-
87
- it "should consider smallint datatypes as boolean if set, but not larger smallints" do
88
- @db.schema(:booltest, :reload=>true).first.last[:type].must_equal :boolean
89
- @db.schema(:booltest, :reload=>true).first.last[:db_type].must_match /smallint/i
90
- @db.convert_smallint_to_bool = false
91
- @db.schema(:booltest, :reload=>true).first.last[:type].must_equal :integer
92
- @db.schema(:booltest, :reload=>true).first.last[:db_type].must_match /smallint/i
93
- end
94
-
95
- describe "datasets" do
96
- it "should return smallints as bools and integers as integers when set" do
97
- @ds = @db[:booltest]
98
- @ds.delete
99
- @ds << {:b=>true, :i=>10}
100
- @ds.all.must_equal [{:b=>true, :i=>10}]
101
- @ds.delete
102
- @ds << {:b=>false, :i=>0}
103
- @ds.all.must_equal [{:b=>false, :i=>0}]
104
- @ds.delete
105
- @ds << {:b=>true, :i=>1}
106
- @ds.all.must_equal [{:b=>true, :i=>1}]
107
- end
108
-
109
- it "should return all smallints as integers when unset" do
110
- @db2 = Sequel.connect(DB.url)
111
- @db2.convert_smallint_to_bool = false
112
- @ds2 = @db2[:booltest]
113
- @ds2.delete
114
- @ds2 << {:b=>true, :i=>10}
115
- @ds2.all.must_equal [{:b=>1, :i=>10}]
116
- @ds2.delete
117
- @ds2 << {:b=>false, :i=>0}
118
- @ds2.all.must_equal [{:b=>0, :i=>0}]
119
-
120
- @ds2.delete
121
- @ds2 << {:b=>1, :i=>10}
122
- @ds2.all.must_equal [{:b=>1, :i=>10}]
123
- @ds2.delete
124
- @ds2 << {:b=>0, :i=>0}
125
- @ds2.all.must_equal [{:b=>0, :i=>0}]
126
-
127
- @db2.disconnect
128
- end
129
- end
130
- end
131
-
132
- describe "Dataset#convert_smallint_to_bool" do
133
- before do
134
- @db.create_table!(:booltest){column :b, 'smallint'; column :i, 'integer'}
135
- @ds = @db[:booltest]
136
- end
137
- after do
138
- @db.drop_table(:booltest)
139
- end
140
-
141
- it "should return smallints as bools and integers as integers when set" do
142
- @ds.delete
143
- @ds << {:b=>true, :i=>10}
144
- @ds.all.must_equal [{:b=>true, :i=>10}]
145
- @ds.delete
146
- @ds << {:b=>false, :i=>0}
147
- @ds.all.must_equal [{:b=>false, :i=>0}]
148
- @ds.delete
149
- @ds << {:b=>true, :i=>1}
150
- @ds.all.must_equal [{:b=>true, :i=>1}]
151
- end
152
-
153
- it "should return all smallints as integers when unset" do
154
- @ds.convert_smallint_to_bool = false
155
- @ds.delete
156
- @ds << {:b=>true, :i=>10}
157
- @ds.all.must_equal [{:b=>1, :i=>10}]
158
- @ds.delete
159
- @ds << {:b=>false, :i=>0}
160
- @ds.all.must_equal [{:b=>0, :i=>0}]
161
-
162
- @ds.delete
163
- @ds << {:b=>1, :i=>10}
164
- @ds.all.must_equal [{:b=>1, :i=>10}]
165
- @ds.delete
166
- @ds << {:b=>0, :i=>0}
167
- @ds.all.must_equal [{:b=>0, :i=>0}]
168
- end
169
- end
170
- end
@@ -1,653 +0,0 @@
1
- SEQUEL_ADAPTER_TEST = :sqlite
2
-
3
- require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
4
-
5
- describe "An SQLite database" do
6
- before do
7
- @db = DB
8
- @fk = @db.foreign_keys
9
- end
10
- after do
11
- @db.drop_table?(:fk)
12
- @db.auto_vacuum = :none
13
- @db.run 'VACUUM'
14
- @db.foreign_keys = @fk
15
- @db.case_sensitive_like = true
16
- @db.use_timestamp_timezones = false
17
- Sequel.datetime_class = Time
18
- end
19
-
20
- it "should support getting setting pragma values" do
21
- @db.pragma_set(:auto_vacuum, '0')
22
- @db.run 'VACUUM'
23
- @db.pragma_get(:auto_vacuum).to_s.must_equal '0'
24
- @db.pragma_set(:auto_vacuum, '1')
25
- @db.run 'VACUUM'
26
- @db.pragma_get(:auto_vacuum).to_s.must_equal '1'
27
- @db.pragma_set(:auto_vacuum, '2')
28
- @db.run 'VACUUM'
29
- @db.pragma_get(:auto_vacuum).to_s.must_equal '2'
30
- end
31
-
32
- it "should support getting and setting the auto_vacuum pragma" do
33
- @db.auto_vacuum = :full
34
- @db.run 'VACUUM'
35
- @db.auto_vacuum.must_equal :full
36
- @db.auto_vacuum = :incremental
37
- @db.run 'VACUUM'
38
- @db.auto_vacuum.must_equal :incremental
39
-
40
- proc {@db.auto_vacuum = :invalid}.must_raise(Sequel::Error)
41
- end
42
-
43
- it "should respect case sensitive like false" do
44
- @db.case_sensitive_like = false
45
- @db.get(Sequel.like('a', 'A')).to_s.must_equal '1'
46
- end
47
-
48
- it "should respect case sensitive like true" do
49
- @db.case_sensitive_like = true
50
- @db.get(Sequel.like('a', 'A')).to_s.must_equal '0'
51
- end
52
-
53
- it "should support casting to Date by using the date function" do
54
- @db.get(Sequel.cast('2012-10-20 11:12:13', Date)).must_equal '2012-10-20'
55
- end
56
-
57
- it "should support casting to Time or DateTime by using the datetime function" do
58
- @db.get(Sequel.cast('2012-10-20', Time)).must_equal '2012-10-20 00:00:00'
59
- @db.get(Sequel.cast('2012-10-20', DateTime)).must_equal '2012-10-20 00:00:00'
60
- end
61
-
62
- it "should provide the SQLite version as an integer" do
63
- @db.sqlite_version.must_be_kind_of(Integer)
64
- end
65
-
66
- it "should support setting and getting the foreign_keys pragma" do
67
- (@db.sqlite_version >= 30619 ? [true, false] : [nil]).must_include(@db.foreign_keys)
68
- @db.foreign_keys = true
69
- @db.foreign_keys = false
70
- end
71
-
72
- it "should enforce foreign key integrity if foreign_keys pragma is set" do
73
- @db.foreign_keys = true
74
- @db.create_table!(:fk){primary_key :id; foreign_key :parent_id, :fk}
75
- @db[:fk].insert(1, nil)
76
- @db[:fk].insert(2, 1)
77
- @db[:fk].insert(3, 3)
78
- proc{@db[:fk].insert(4, 5)}.must_raise(Sequel::ForeignKeyConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
79
- end if DB.sqlite_version >= 30619
80
-
81
- it "should not enforce foreign key integrity if foreign_keys pragma is unset" do
82
- @db.foreign_keys = false
83
- @db.create_table!(:fk){primary_key :id; foreign_key :parent_id, :fk}
84
- @db[:fk].insert(1, 2)
85
- @db[:fk].all.must_equal [{:id=>1, :parent_id=>2}]
86
- end
87
-
88
- it "should support a use_timestamp_timezones setting" do
89
- @db.use_timestamp_timezones = true
90
- @db.create_table!(:fk){Time :time}
91
- @db[:fk].insert(Time.now)
92
- @db[:fk].get(Sequel.cast(:time, String)).must_match(/[-+]\d\d\d\d\z/)
93
- @db.use_timestamp_timezones = false
94
- @db[:fk].delete
95
- @db[:fk].insert(Time.now)
96
- @db[:fk].get(Sequel.cast(:time, String)).wont_match(/[-+]\d\d\d\d\z/)
97
- end
98
-
99
- it "should provide a list of existing tables" do
100
- @db.drop_table?(:fk)
101
- @db.tables.must_be_kind_of(Array)
102
- @db.tables.wont_include(:fk)
103
- @db.create_table!(:fk){String :name}
104
- @db.tables.must_include(:fk)
105
- end
106
-
107
- it "should support getting and setting the synchronous pragma" do
108
- @db.synchronous = :off
109
- @db.synchronous.must_equal :off
110
- @db.synchronous = :normal
111
- @db.synchronous.must_equal :normal
112
- @db.synchronous = :full
113
- @db.synchronous.must_equal :full
114
-
115
- proc {@db.synchronous = :invalid}.must_raise(Sequel::Error)
116
- end
117
-
118
- it "should support getting and setting the temp_store pragma" do
119
- @db.temp_store = :default
120
- @db.temp_store.must_equal :default
121
- @db.temp_store = :file
122
- @db.temp_store.must_equal :file
123
- @db.temp_store = :memory
124
- @db.temp_store.must_equal :memory
125
-
126
- proc {@db.temp_store = :invalid}.must_raise(Sequel::Error)
127
- end
128
-
129
- cspecify "should support timestamps and datetimes and respect datetime_class", [:do], [:jdbc], [:swift] do
130
- @db.create_table!(:fk){timestamp :t; datetime :d}
131
- @db.use_timestamp_timezones = true
132
- t1 = Time.at(1)
133
- @db[:fk] << {:t => t1, :d => t1}
134
- @db[:fk].map(:t).must_equal [t1]
135
- @db[:fk].map(:d).must_equal [t1]
136
- Sequel.datetime_class = DateTime
137
- t2 = Sequel.string_to_datetime(t1.iso8601)
138
- @db[:fk].map(:t).must_equal [t2]
139
- @db[:fk].map(:d).must_equal [t2]
140
- end
141
-
142
- it "should support sequential primary keys" do
143
- @db.create_table!(:fk) {primary_key :id; text :name}
144
- @db[:fk] << {:name => 'abc'}
145
- @db[:fk] << {:name => 'def'}
146
- @db[:fk] << {:name => 'ghi'}
147
- @db[:fk].order(:name).all.must_equal [
148
- {:id => 1, :name => 'abc'},
149
- {:id => 2, :name => 'def'},
150
- {:id => 3, :name => 'ghi'}
151
- ]
152
- end
153
-
154
- it "should correctly parse the schema" do
155
- @db.create_table!(:fk) {timestamp :t}
156
- @db.schema(:fk, :reload=>true).must_equal [[:t, {:type=>:datetime, :allow_null=>true, :default=>nil, :ruby_default=>nil, :db_type=>"timestamp", :primary_key=>false}]]
157
- end
158
-
159
- it "should handle and return BigDecimal values for numeric columns" do
160
- DB.create_table!(:fk){numeric :d}
161
- d = DB[:fk]
162
- d.insert(:d=>BigDecimal.new('80.0'))
163
- d.insert(:d=>BigDecimal.new('NaN'))
164
- d.insert(:d=>BigDecimal.new('Infinity'))
165
- d.insert(:d=>BigDecimal.new('-Infinity'))
166
- ds = d.all
167
- ds.shift.must_equal(:d=>BigDecimal.new('80.0'))
168
- ds.map{|x| x[:d].to_s}.must_equal %w'NaN Infinity -Infinity'
169
- DB
170
- end
171
- end
172
-
173
- describe "SQLite temporary views" do
174
- before do
175
- @db = DB
176
- @db.drop_view(:items) rescue nil
177
- @db.create_table!(:items){Integer :number}
178
- @db[:items].insert(10)
179
- @db[:items].insert(20)
180
- end
181
- after do
182
- @db.drop_table?(:items)
183
- end
184
-
185
- it "should be supported" do
186
- @db.create_view(:items_view, @db[:items].where(:number=>10), :temp=>true)
187
- @db[:items_view].map(:number).must_equal [10]
188
- @db.disconnect
189
- lambda{@db[:items_view].map(:number)}.must_raise(Sequel::DatabaseError)
190
- end
191
- end
192
-
193
- describe "SQLite type conversion" do
194
- before do
195
- @db = DB
196
- @integer_booleans = @db.integer_booleans
197
- @db.integer_booleans = true
198
- @ds = @db[:items]
199
- @db.drop_table?(:items)
200
- end
201
- after do
202
- @db.integer_booleans = @integer_booleans
203
- Sequel.datetime_class = Time
204
- @db.drop_table?(:items)
205
- end
206
-
207
- it "should handle integers in boolean columns" do
208
- @db.create_table(:items){TrueClass :a}
209
- @db[:items].insert(false)
210
- @db[:items].select_map(:a).must_equal [false]
211
- @db[:items].select_map(Sequel.expr(:a)+:a).must_equal [0]
212
- @db[:items].update(:a=>true)
213
- @db[:items].select_map(:a).must_equal [true]
214
- @db[:items].select_map(Sequel.expr(:a)+:a).must_equal [2]
215
- end
216
-
217
- it "should handle integers/floats/strings/decimals in numeric/decimal columns" do
218
- @db.create_table(:items){Numeric :a}
219
- @db[:items].insert(100)
220
- @db[:items].select_map(:a).must_equal [BigDecimal.new('100')]
221
- @db[:items].get(:a).must_be_kind_of(BigDecimal)
222
-
223
- @db[:items].update(:a=>100.1)
224
- @db[:items].select_map(:a).must_equal [BigDecimal.new('100.1')]
225
- @db[:items].get(:a).must_be_kind_of(BigDecimal)
226
-
227
- @db[:items].update(:a=>'100.1')
228
- @db[:items].select_map(:a).must_equal [BigDecimal.new('100.1')]
229
- @db[:items].get(:a).must_be_kind_of(BigDecimal)
230
-
231
- @db[:items].update(:a=>BigDecimal.new('100.1'))
232
- @db[:items].select_map(:a).must_equal [BigDecimal.new('100.1')]
233
- @db[:items].get(:a).must_be_kind_of(BigDecimal)
234
- end
235
-
236
- it "should handle integer/float date columns as julian date" do
237
- @db.create_table(:items){Date :a}
238
- i = 2455979
239
- @db[:items].insert(i)
240
- @db[:items].first.must_equal(:a=>Date.jd(i))
241
- @db[:items].update(:a=>2455979.1)
242
- @db[:items].first.must_equal(:a=>Date.jd(i))
243
- end
244
-
245
- it "should handle integer/float time columns as seconds" do
246
- @db.create_table(:items){Time :a, :only_time=>true}
247
- @db[:items].insert(3661)
248
- @db[:items].first.must_equal(:a=>Sequel::SQLTime.create(1, 1, 1))
249
- @db[:items].update(:a=>3661.000001)
250
- @db[:items].first.must_equal(:a=>Sequel::SQLTime.create(1, 1, 1, 1))
251
- end
252
-
253
- it "should handle integer datetime columns as unix timestamp" do
254
- @db.create_table(:items){DateTime :a}
255
- i = 1329860756
256
- @db[:items].insert(i)
257
- @db[:items].first.must_equal(:a=>Time.at(i))
258
- Sequel.datetime_class = DateTime
259
- @db[:items].first.must_equal(:a=>DateTime.strptime(i.to_s, '%s'))
260
- end
261
-
262
- it "should handle float datetime columns as julian date" do
263
- @db.create_table(:items){DateTime :a}
264
- i = 2455979.5
265
- @db[:items].insert(i)
266
- @db[:items].first.must_equal(:a=>Time.at(1329825600))
267
- Sequel.datetime_class = DateTime
268
- @db[:items].first.must_equal(:a=>DateTime.jd(2455979.5))
269
- end
270
-
271
- it "should handle integer/float blob columns" do
272
- @db.create_table(:items){File :a}
273
- @db[:items].insert(1)
274
- @db[:items].first.must_equal(:a=>Sequel::SQL::Blob.new('1'))
275
- @db[:items].update(:a=>'1.1')
276
- @db[:items].first.must_equal(:a=>Sequel::SQL::Blob.new(1.1.to_s))
277
- end
278
- end if DB.adapter_scheme == :sqlite
279
-
280
- describe "An SQLite dataset" do
281
- before do
282
- @d = DB[:items]
283
- end
284
-
285
- it "should raise errors if given a regexp pattern match" do
286
- proc{@d.literal(Sequel.expr(:x).like(/a/))}.must_raise(Sequel::InvalidOperation)
287
- proc{@d.literal(~Sequel.expr(:x).like(/a/))}.must_raise(Sequel::InvalidOperation)
288
- proc{@d.literal(Sequel.expr(:x).like(/a/i))}.must_raise(Sequel::InvalidOperation)
289
- proc{@d.literal(~Sequel.expr(:x).like(/a/i))}.must_raise(Sequel::InvalidOperation)
290
- end
291
- end
292
-
293
- describe "An SQLite dataset AS clause" do
294
- it "should use a string literal for :col___alias" do
295
- DB.literal(:c___a).must_equal "`c` AS 'a'"
296
- end
297
-
298
- it "should use a string literal for :table__col___alias" do
299
- DB.literal(:t__c___a).must_equal "`t`.`c` AS 'a'"
300
- end
301
-
302
- it "should use a string literal for :column.as(:alias)" do
303
- DB.literal(Sequel.as(:c, :a)).must_equal "`c` AS 'a'"
304
- end
305
-
306
- it "should use a string literal in the SELECT clause" do
307
- DB[:t].select(:c___a).sql.must_equal "SELECT `c` AS 'a' FROM `t`"
308
- end
309
-
310
- it "should use a string literal in the FROM clause" do
311
- DB[:t___a].sql.must_equal "SELECT * FROM `t` AS 'a'"
312
- end
313
-
314
- it "should use a string literal in the JOIN clause" do
315
- DB[:t].join_table(:natural, :j, nil, :table_alias=>:a).sql.must_equal "SELECT * FROM `t` NATURAL JOIN `j` AS 'a'"
316
- end
317
- end
318
-
319
- describe "SQLite::Dataset#delete" do
320
- before do
321
- DB.create_table! :items do
322
- primary_key :id
323
- String :name
324
- Float :value
325
- end
326
- @d = DB[:items]
327
- @d.delete # remove all records
328
- @d << {:name => 'abc', :value => 1.23}
329
- @d << {:name => 'def', :value => 4.56}
330
- @d << {:name => 'ghi', :value => 7.89}
331
- end
332
-
333
- it "should return the number of records affected when filtered" do
334
- @d.count.must_equal 3
335
- @d.filter{value < 3}.delete.must_equal 1
336
- @d.count.must_equal 2
337
-
338
- @d.filter{value < 3}.delete.must_equal 0
339
- @d.count.must_equal 2
340
- end
341
-
342
- it "should return the number of records affected when unfiltered" do
343
- @d.count.must_equal 3
344
- @d.delete.must_equal 3
345
- @d.count.must_equal 0
346
-
347
- @d.delete.must_equal 0
348
- end
349
- end
350
-
351
- describe "SQLite::Dataset#update" do
352
- before do
353
- DB.create_table! :items do
354
- primary_key :id
355
- String :name
356
- Float :value
357
- end
358
- @d = DB[:items]
359
- @d.delete # remove all records
360
- @d << {:name => 'abc', :value => 1.23}
361
- @d << {:name => 'def', :value => 4.56}
362
- @d << {:name => 'ghi', :value => 7.89}
363
- end
364
-
365
- it "should return the number of records affected" do
366
- @d.filter(:name => 'abc').update(:value => 2).must_equal 1
367
-
368
- @d.update(:value => 10).must_equal 3
369
-
370
- @d.filter(:name => 'xxx').update(:value => 23).must_equal 0
371
- end
372
- end
373
-
374
- describe "SQLite dataset" do
375
- before do
376
- DB.create_table! :test do
377
- primary_key :id
378
- String :name
379
- Float :value
380
- end
381
- DB.create_table! :items do
382
- primary_key :id
383
- String :name
384
- Float :value
385
- end
386
- @d = DB[:items]
387
- @d << {:name => 'abc', :value => 1.23}
388
- @d << {:name => 'def', :value => 4.56}
389
- @d << {:name => 'ghi', :value => 7.89}
390
- end
391
- after do
392
- DB.drop_table?(:test, :items)
393
- end
394
-
395
- it "should be able to insert from a subquery" do
396
- DB[:test] << @d
397
- DB[:test].count.must_equal 3
398
- DB[:test].select(:name, :value).order(:value).to_a.must_equal \
399
- @d.select(:name, :value).order(:value).to_a
400
- end
401
-
402
- it "should support #explain" do
403
- DB[:test].explain.must_be_kind_of(String)
404
- end
405
-
406
- it "should have #explain work when identifier_output_method is modified" do
407
- ds = DB[:test]
408
- ds.identifier_output_method = :upcase
409
- ds.explain.must_be_kind_of(String)
410
- end
411
- end
412
-
413
- describe "A SQLite database" do
414
- before do
415
- @db = DB
416
- @db.create_table! :test2 do
417
- text :name
418
- integer :value
419
- end
420
- end
421
- after do
422
- @db.drop_table?(:test2)
423
- end
424
-
425
- it "should support add_column operations" do
426
- @db.add_column :test2, :xyz, :text
427
-
428
- @db[:test2].columns.must_equal [:name, :value, :xyz]
429
- @db[:test2] << {:name => 'mmm', :value => 111, :xyz=>'000'}
430
- @db[:test2].first.must_equal(:name => 'mmm', :value => 111, :xyz=>'000')
431
- end
432
-
433
- it "should support drop_column operations" do
434
- @db.drop_column :test2, :value
435
- @db[:test2].columns.must_equal [:name]
436
- @db[:test2] << {:name => 'mmm'}
437
- @db[:test2].first.must_equal(:name => 'mmm')
438
- end
439
-
440
- it "should support drop_column operations in a transaction" do
441
- @db.transaction{@db.drop_column :test2, :value}
442
- @db[:test2].columns.must_equal [:name]
443
- @db[:test2] << {:name => 'mmm'}
444
- @db[:test2].first.must_equal(:name => 'mmm')
445
- end
446
-
447
- it "should keep a composite primary key when dropping columns" do
448
- @db.create_table!(:test2){Integer :a; Integer :b; Integer :c; primary_key [:a, :b]}
449
- @db.drop_column :test2, :c
450
- @db[:test2].columns.must_equal [:a, :b]
451
- @db[:test2] << {:a=>1, :b=>2}
452
- @db[:test2] << {:a=>2, :b=>3}
453
- proc{@db[:test2] << {:a=>2, :b=>3}}.must_raise(Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
454
- end
455
-
456
- it "should keep column attributes when dropping a column" do
457
- @db.create_table! :test3 do
458
- primary_key :id
459
- text :name
460
- integer :value
461
- end
462
-
463
- # This lame set of additions and deletions are to test that the primary keys
464
- # don't get messed up when we recreate the database.
465
- @db[:test3] << { :name => "foo", :value => 1}
466
- @db[:test3] << { :name => "foo", :value => 2}
467
- @db[:test3] << { :name => "foo", :value => 3}
468
- @db[:test3].filter(:id => 2).delete
469
-
470
- @db.drop_column :test3, :value
471
-
472
- @db['PRAGMA table_info(?)', :test3][:id][:pk].to_i.must_equal 1
473
- @db[:test3].select(:id).all.must_equal [{:id => 1}, {:id => 3}]
474
- end
475
-
476
- if DB.foreign_keys
477
- it "should keep foreign keys when dropping a column" do
478
- @db.create_table! :test do
479
- primary_key :id
480
- String :name
481
- Integer :value
482
- end
483
- @db.create_table! :test3 do
484
- String :name
485
- Integer :value
486
- foreign_key :test_id, :test, :on_delete => :set_null, :on_update => :cascade
487
- end
488
-
489
- @db[:test3].insert(:name => "abc", :test_id => @db[:test].insert(:name => "foo", :value => 3))
490
- @db[:test3].insert(:name => "def", :test_id => @db[:test].insert(:name => "bar", :value => 4))
491
-
492
- @db.drop_column :test3, :value
493
-
494
- @db[:test].filter(:name => 'bar').delete
495
- @db[:test3][:name => 'def'][:test_id].must_equal nil
496
-
497
- @db[:test].filter(:name => 'foo').update(:id=>100)
498
- @db[:test3][:name => 'abc'][:test_id].must_equal 100
499
-
500
- @db.drop_table? :test, :test3
501
- end
502
- end
503
-
504
- it "should support rename_column operations" do
505
- @db[:test2].delete
506
- @db.add_column :test2, :xyz, :text
507
- @db[:test2] << {:name => 'mmm', :value => 111, :xyz => 'qqqq'}
508
-
509
- @db[:test2].columns.must_equal [:name, :value, :xyz]
510
- @db.rename_column :test2, :xyz, :zyx, :type => :text
511
- @db[:test2].columns.must_equal [:name, :value, :zyx]
512
- @db[:test2].first[:zyx].must_equal 'qqqq'
513
- @db[:test2].count.must_equal 1
514
- end
515
-
516
- it "should preserve defaults when dropping or renaming columns" do
517
- @db.create_table! :test3 do
518
- String :s, :default=>'a'
519
- Integer :i
520
- end
521
-
522
- @db[:test3].insert
523
- @db[:test3].first[:s].must_equal 'a'
524
- @db[:test3].delete
525
- @db.drop_column :test3, :i
526
- @db[:test3].insert
527
- @db[:test3].first[:s].must_equal 'a'
528
- @db[:test3].delete
529
- @db.rename_column :test3, :s, :t
530
- @db[:test3].insert
531
- @db[:test3].first[:t].must_equal 'a'
532
- @db[:test3].delete
533
- end
534
-
535
- it "should handle quoted tables when dropping or renaming columns" do
536
- @db.quote_identifiers = true
537
- table_name = "T T"
538
- @db.drop_table?(table_name)
539
- @db.create_table! table_name do
540
- Integer :"s s"
541
- Integer :"i i"
542
- end
543
-
544
- @db.from(table_name).insert(:"s s"=>1, :"i i"=>2)
545
- @db.from(table_name).all.must_equal [{:"s s"=>1, :"i i"=>2}]
546
- @db.drop_column table_name, :"i i"
547
- @db.from(table_name).all.must_equal [{:"s s"=>1}]
548
- @db.rename_column table_name, :"s s", :"t t"
549
- @db.from(table_name).all.must_equal [{:"t t"=>1}]
550
- @db.drop_table?(table_name)
551
- end
552
-
553
- it "should choose a temporary table name that isn't already used when dropping or renaming columns" do
554
- sqls = []
555
- @db.loggers << (l=Class.new{%w'info error'.each{|m| define_method(m){|sql| sqls << sql}}}.new)
556
- @db.tables.each{|t| @db.drop_table(t) if t.to_s =~ /test3/}
557
- @db.create_table :test3 do
558
- Integer :h
559
- Integer :i
560
- end
561
- @db.create_table :test3_backup0 do
562
- Integer :j
563
- end
564
- @db.create_table :test3_backup1 do
565
- Integer :k
566
- end
567
-
568
- @db[:test3].columns.must_equal [:h, :i]
569
- @db[:test3_backup0].columns.must_equal [:j]
570
- @db[:test3_backup1].columns.must_equal [:k]
571
- sqls.clear
572
- @db.drop_column(:test3, :i)
573
- sqls.any?{|x| x =~ /\AALTER TABLE.*test3.*RENAME TO.*test3_backup2/}.must_equal true
574
- sqls.any?{|x| x =~ /\AALTER TABLE.*test3.*RENAME TO.*test3_backup[01]/}.must_equal false
575
- @db[:test3].columns.must_equal [:h]
576
- @db[:test3_backup0].columns.must_equal [:j]
577
- @db[:test3_backup1].columns.must_equal [:k]
578
-
579
- @db.create_table :test3_backup2 do
580
- Integer :l
581
- end
582
-
583
- sqls.clear
584
- @db.rename_column(:test3, :h, :i)
585
- sqls.any?{|x| x =~ /\AALTER TABLE.*test3.*RENAME TO.*test3_backup3/}.must_equal true
586
- sqls.any?{|x| x =~ /\AALTER TABLE.*test3.*RENAME TO.*test3_backup[012]/}.must_equal false
587
- @db[:test3].columns.must_equal [:i]
588
- @db[:test3_backup0].columns.must_equal [:j]
589
- @db[:test3_backup1].columns.must_equal [:k]
590
- @db[:test3_backup2].columns.must_equal [:l]
591
- @db.loggers.delete(l)
592
- @db.drop_table?(:test3, :test3_backup0, :test3_backup1, :test3_backup2)
593
- end
594
-
595
- it "should support add_index" do
596
- @db.add_index :test2, :value, :unique => true
597
- @db.add_index :test2, [:name, :value]
598
- end
599
-
600
- it "should support drop_index" do
601
- @db.add_index :test2, :value, :unique => true
602
- @db.drop_index :test2, :value
603
- end
604
-
605
- it "should keep applicable indexes when emulating schema methods" do
606
- @db.create_table!(:a){Integer :a; Integer :b}
607
- @db.add_index :a, :a
608
- @db.add_index :a, :b
609
- @db.add_index :a, [:b, :a]
610
- @db.drop_column :a, :b
611
- @db.indexes(:a).must_equal(:a_a_index=>{:unique=>false, :columns=>[:a]})
612
- end
613
-
614
- it "should have support for various #transaction modes" do
615
- sqls = []
616
- @db.loggers << Class.new{%w'info error'.each{|m| define_method(m){|sql| sqls << sql}}}.new
617
-
618
- @db.transaction(:mode => :immediate) do
619
- sqls.last.must_equal "BEGIN IMMEDIATE TRANSACTION"
620
- end
621
- @db.transaction(:mode => :exclusive) do
622
- sqls.last.must_equal "BEGIN EXCLUSIVE TRANSACTION"
623
- end
624
- @db.transaction(:mode => :deferred) do
625
- sqls.last.must_equal "BEGIN DEFERRED TRANSACTION"
626
- end
627
- @db.transaction do
628
- sqls.last.must_equal Sequel::Database::SQL_BEGIN
629
- end
630
-
631
- @db.transaction_mode.must_equal nil
632
- @db.transaction_mode = :immediate
633
- @db.transaction_mode.must_equal :immediate
634
- @db.transaction do
635
- sqls.last.must_equal "BEGIN IMMEDIATE TRANSACTION"
636
- end
637
- @db.transaction(:mode => :exclusive) do
638
- sqls.last.must_equal "BEGIN EXCLUSIVE TRANSACTION"
639
- end
640
-
641
- proc {@db.transaction_mode = :invalid}.must_raise(Sequel::Error)
642
-
643
- @db.transaction_mode.must_equal :immediate
644
- proc {@db.transaction(:mode => :invalid) {}}.must_raise(Sequel::Error)
645
- end
646
-
647
- it "should keep unique constraints when copying tables" do
648
- @db.alter_table(:test2){add_unique_constraint :name}
649
- @db.alter_table(:test2){drop_column :value}
650
- @db[:test2].insert(:name=>'a')
651
- proc{@db[:test2].insert(:name=>'a')}.must_raise(Sequel::ConstraintViolation, Sequel::UniqueConstraintViolation)
652
- end
653
- end