sequel 5.20.0 → 5.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (511) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +398 -1922
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +7 -7
  5. data/doc/advanced_associations.rdoc +4 -4
  6. data/doc/association_basics.rdoc +80 -16
  7. data/doc/cheat_sheet.rdoc +6 -5
  8. data/doc/code_order.rdoc +10 -12
  9. data/doc/dataset_filtering.rdoc +17 -2
  10. data/doc/fork_safety.rdoc +84 -0
  11. data/doc/migration.rdoc +11 -5
  12. data/doc/model_dataset_method_design.rdoc +1 -1
  13. data/doc/model_plugins.rdoc +1 -1
  14. data/doc/opening_databases.rdoc +10 -2
  15. data/doc/postgresql.rdoc +82 -3
  16. data/doc/querying.rdoc +4 -4
  17. data/doc/release_notes/5.21.0.txt +87 -0
  18. data/doc/release_notes/5.22.0.txt +48 -0
  19. data/doc/release_notes/5.23.0.txt +56 -0
  20. data/doc/release_notes/5.24.0.txt +56 -0
  21. data/doc/release_notes/5.25.0.txt +32 -0
  22. data/doc/release_notes/5.26.0.txt +35 -0
  23. data/doc/release_notes/5.27.0.txt +21 -0
  24. data/doc/release_notes/5.28.0.txt +16 -0
  25. data/doc/release_notes/5.29.0.txt +22 -0
  26. data/doc/release_notes/5.30.0.txt +20 -0
  27. data/doc/release_notes/5.31.0.txt +148 -0
  28. data/doc/release_notes/5.32.0.txt +46 -0
  29. data/doc/release_notes/5.33.0.txt +24 -0
  30. data/doc/release_notes/5.34.0.txt +40 -0
  31. data/doc/release_notes/5.35.0.txt +56 -0
  32. data/doc/release_notes/5.36.0.txt +60 -0
  33. data/doc/release_notes/5.37.0.txt +30 -0
  34. data/doc/release_notes/5.38.0.txt +28 -0
  35. data/doc/release_notes/5.39.0.txt +19 -0
  36. data/doc/release_notes/5.40.0.txt +40 -0
  37. data/doc/release_notes/5.41.0.txt +25 -0
  38. data/doc/release_notes/5.42.0.txt +136 -0
  39. data/doc/release_notes/5.43.0.txt +98 -0
  40. data/doc/release_notes/5.44.0.txt +32 -0
  41. data/doc/release_notes/5.45.0.txt +34 -0
  42. data/doc/release_notes/5.46.0.txt +87 -0
  43. data/doc/release_notes/5.47.0.txt +59 -0
  44. data/doc/release_notes/5.48.0.txt +14 -0
  45. data/doc/release_notes/5.49.0.txt +59 -0
  46. data/doc/sharding.rdoc +2 -0
  47. data/doc/sql.rdoc +13 -1
  48. data/doc/testing.rdoc +20 -7
  49. data/doc/transactions.rdoc +0 -8
  50. data/doc/validations.rdoc +1 -1
  51. data/doc/virtual_rows.rdoc +1 -1
  52. data/lib/sequel/adapters/ado/access.rb +1 -1
  53. data/lib/sequel/adapters/ado.rb +43 -35
  54. data/lib/sequel/adapters/ibmdb.rb +2 -2
  55. data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
  56. data/lib/sequel/adapters/jdbc/postgresql.rb +11 -17
  57. data/lib/sequel/adapters/jdbc/sqlite.rb +29 -0
  58. data/lib/sequel/adapters/jdbc.rb +24 -6
  59. data/lib/sequel/adapters/mysql.rb +1 -1
  60. data/lib/sequel/adapters/mysql2.rb +2 -3
  61. data/lib/sequel/adapters/odbc.rb +8 -6
  62. data/lib/sequel/adapters/oracle.rb +5 -4
  63. data/lib/sequel/adapters/postgres.rb +15 -9
  64. data/lib/sequel/adapters/shared/access.rb +6 -6
  65. data/lib/sequel/adapters/shared/mssql.rb +66 -21
  66. data/lib/sequel/adapters/shared/mysql.rb +27 -10
  67. data/lib/sequel/adapters/shared/oracle.rb +29 -23
  68. data/lib/sequel/adapters/shared/postgres.rb +271 -32
  69. data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
  70. data/lib/sequel/adapters/shared/sqlite.rb +161 -19
  71. data/lib/sequel/adapters/sqlanywhere.rb +1 -1
  72. data/lib/sequel/adapters/sqlite.rb +1 -1
  73. data/lib/sequel/adapters/tinytds.rb +15 -2
  74. data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -1
  75. data/lib/sequel/ast_transformer.rb +6 -0
  76. data/lib/sequel/connection_pool/sharded_single.rb +4 -1
  77. data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
  78. data/lib/sequel/connection_pool/single.rb +1 -1
  79. data/lib/sequel/connection_pool/threaded.rb +2 -2
  80. data/lib/sequel/core.rb +333 -319
  81. data/lib/sequel/database/connecting.rb +3 -4
  82. data/lib/sequel/database/logging.rb +7 -1
  83. data/lib/sequel/database/misc.rb +31 -12
  84. data/lib/sequel/database/query.rb +3 -1
  85. data/lib/sequel/database/schema_generator.rb +53 -51
  86. data/lib/sequel/database/schema_methods.rb +38 -23
  87. data/lib/sequel/database/transactions.rb +17 -18
  88. data/lib/sequel/dataset/actions.rb +14 -9
  89. data/lib/sequel/dataset/features.rb +16 -0
  90. data/lib/sequel/dataset/misc.rb +2 -2
  91. data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
  92. data/lib/sequel/dataset/prepared_statements.rb +2 -0
  93. data/lib/sequel/dataset/query.rb +26 -9
  94. data/lib/sequel/dataset/sql.rb +76 -25
  95. data/lib/sequel/dataset.rb +4 -2
  96. data/lib/sequel/deprecated.rb +3 -1
  97. data/lib/sequel/exceptions.rb +2 -0
  98. data/lib/sequel/extensions/_pretty_table.rb +1 -2
  99. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  100. data/lib/sequel/extensions/async_thread_pool.rb +438 -0
  101. data/lib/sequel/extensions/blank.rb +8 -0
  102. data/lib/sequel/extensions/columns_introspection.rb +1 -2
  103. data/lib/sequel/extensions/connection_expiration.rb +2 -2
  104. data/lib/sequel/extensions/connection_validator.rb +2 -2
  105. data/lib/sequel/extensions/core_refinements.rb +2 -0
  106. data/lib/sequel/extensions/date_arithmetic.rb +36 -24
  107. data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -1
  108. data/lib/sequel/extensions/eval_inspect.rb +2 -0
  109. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  110. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  111. data/lib/sequel/extensions/index_caching.rb +9 -7
  112. data/lib/sequel/extensions/inflector.rb +9 -1
  113. data/lib/sequel/extensions/integer64.rb +2 -0
  114. data/lib/sequel/extensions/migration.rb +11 -3
  115. data/lib/sequel/extensions/named_timezones.rb +56 -8
  116. data/lib/sequel/extensions/pagination.rb +1 -1
  117. data/lib/sequel/extensions/pg_array.rb +5 -0
  118. data/lib/sequel/extensions/pg_array_ops.rb +14 -6
  119. data/lib/sequel/extensions/pg_enum.rb +11 -3
  120. data/lib/sequel/extensions/pg_extended_date_support.rb +2 -2
  121. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  122. data/lib/sequel/extensions/pg_hstore_ops.rb +54 -2
  123. data/lib/sequel/extensions/pg_inet.rb +15 -5
  124. data/lib/sequel/extensions/pg_interval.rb +36 -8
  125. data/lib/sequel/extensions/pg_json.rb +387 -123
  126. data/lib/sequel/extensions/pg_json_ops.rb +238 -0
  127. data/lib/sequel/extensions/pg_loose_count.rb +3 -1
  128. data/lib/sequel/extensions/pg_range.rb +17 -9
  129. data/lib/sequel/extensions/pg_range_ops.rb +2 -0
  130. data/lib/sequel/extensions/pg_row.rb +4 -2
  131. data/lib/sequel/extensions/pg_row_ops.rb +24 -0
  132. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  133. data/lib/sequel/extensions/query.rb +3 -0
  134. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  135. data/lib/sequel/extensions/s.rb +2 -0
  136. data/lib/sequel/extensions/schema_dumper.rb +24 -7
  137. data/lib/sequel/extensions/server_block.rb +18 -7
  138. data/lib/sequel/extensions/sql_comments.rb +2 -2
  139. data/lib/sequel/extensions/string_agg.rb +1 -1
  140. data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
  141. data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
  142. data/lib/sequel/extensions/to_dot.rb +9 -3
  143. data/lib/sequel/model/associations.rb +356 -117
  144. data/lib/sequel/model/base.rb +107 -68
  145. data/lib/sequel/model/errors.rb +10 -1
  146. data/lib/sequel/model/inflections.rb +1 -1
  147. data/lib/sequel/model/plugins.rb +9 -3
  148. data/lib/sequel/model.rb +3 -1
  149. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  150. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  151. data/lib/sequel/plugins/association_pks.rb +60 -18
  152. data/lib/sequel/plugins/association_proxies.rb +8 -2
  153. data/lib/sequel/plugins/async_thread_pool.rb +39 -0
  154. data/lib/sequel/plugins/auto_validations.rb +39 -5
  155. data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
  156. data/lib/sequel/plugins/blacklist_security.rb +1 -2
  157. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  158. data/lib/sequel/plugins/caching.rb +3 -0
  159. data/lib/sequel/plugins/class_table_inheritance.rb +33 -28
  160. data/lib/sequel/plugins/column_encryption.rb +728 -0
  161. data/lib/sequel/plugins/composition.rb +7 -2
  162. data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
  163. data/lib/sequel/plugins/constraint_validations.rb +2 -1
  164. data/lib/sequel/plugins/csv_serializer.rb +28 -9
  165. data/lib/sequel/plugins/dataset_associations.rb +4 -1
  166. data/lib/sequel/plugins/dirty.rb +60 -22
  167. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  168. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  169. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  170. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  171. data/lib/sequel/plugins/json_serializer.rb +57 -35
  172. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  173. data/lib/sequel/plugins/many_through_many.rb +108 -9
  174. data/lib/sequel/plugins/nested_attributes.rb +15 -3
  175. data/lib/sequel/plugins/pg_array_associations.rb +58 -41
  176. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +91 -30
  177. data/lib/sequel/plugins/prepared_statements.rb +15 -12
  178. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
  179. data/lib/sequel/plugins/rcte_tree.rb +43 -35
  180. data/lib/sequel/plugins/serialization.rb +8 -3
  181. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  182. data/lib/sequel/plugins/sharding.rb +11 -5
  183. data/lib/sequel/plugins/single_table_inheritance.rb +22 -15
  184. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  185. data/lib/sequel/plugins/static_cache.rb +9 -4
  186. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  187. data/lib/sequel/plugins/string_stripper.rb +1 -1
  188. data/lib/sequel/plugins/subclasses.rb +2 -0
  189. data/lib/sequel/plugins/throw_failures.rb +1 -1
  190. data/lib/sequel/plugins/timestamps.rb +1 -1
  191. data/lib/sequel/plugins/tree.rb +9 -4
  192. data/lib/sequel/plugins/typecast_on_load.rb +3 -2
  193. data/lib/sequel/plugins/unused_associations.rb +521 -0
  194. data/lib/sequel/plugins/update_or_create.rb +1 -1
  195. data/lib/sequel/plugins/validation_class_methods.rb +5 -1
  196. data/lib/sequel/plugins/validation_helpers.rb +18 -11
  197. data/lib/sequel/plugins/xml_serializer.rb +1 -1
  198. data/lib/sequel/sql.rb +20 -5
  199. data/lib/sequel/timezones.rb +63 -17
  200. data/lib/sequel/version.rb +1 -1
  201. metadata +113 -381
  202. data/Rakefile +0 -151
  203. data/doc/release_notes/4.0.0.txt +0 -262
  204. data/doc/release_notes/4.1.0.txt +0 -85
  205. data/doc/release_notes/4.10.0.txt +0 -226
  206. data/doc/release_notes/4.11.0.txt +0 -147
  207. data/doc/release_notes/4.12.0.txt +0 -105
  208. data/doc/release_notes/4.13.0.txt +0 -169
  209. data/doc/release_notes/4.14.0.txt +0 -68
  210. data/doc/release_notes/4.15.0.txt +0 -56
  211. data/doc/release_notes/4.16.0.txt +0 -36
  212. data/doc/release_notes/4.17.0.txt +0 -38
  213. data/doc/release_notes/4.18.0.txt +0 -36
  214. data/doc/release_notes/4.19.0.txt +0 -45
  215. data/doc/release_notes/4.2.0.txt +0 -129
  216. data/doc/release_notes/4.20.0.txt +0 -79
  217. data/doc/release_notes/4.21.0.txt +0 -94
  218. data/doc/release_notes/4.22.0.txt +0 -72
  219. data/doc/release_notes/4.23.0.txt +0 -65
  220. data/doc/release_notes/4.24.0.txt +0 -99
  221. data/doc/release_notes/4.25.0.txt +0 -181
  222. data/doc/release_notes/4.26.0.txt +0 -44
  223. data/doc/release_notes/4.27.0.txt +0 -78
  224. data/doc/release_notes/4.28.0.txt +0 -57
  225. data/doc/release_notes/4.29.0.txt +0 -41
  226. data/doc/release_notes/4.3.0.txt +0 -40
  227. data/doc/release_notes/4.30.0.txt +0 -37
  228. data/doc/release_notes/4.31.0.txt +0 -57
  229. data/doc/release_notes/4.32.0.txt +0 -132
  230. data/doc/release_notes/4.33.0.txt +0 -88
  231. data/doc/release_notes/4.34.0.txt +0 -86
  232. data/doc/release_notes/4.35.0.txt +0 -130
  233. data/doc/release_notes/4.36.0.txt +0 -116
  234. data/doc/release_notes/4.37.0.txt +0 -50
  235. data/doc/release_notes/4.38.0.txt +0 -67
  236. data/doc/release_notes/4.39.0.txt +0 -127
  237. data/doc/release_notes/4.4.0.txt +0 -92
  238. data/doc/release_notes/4.40.0.txt +0 -179
  239. data/doc/release_notes/4.41.0.txt +0 -77
  240. data/doc/release_notes/4.42.0.txt +0 -221
  241. data/doc/release_notes/4.43.0.txt +0 -87
  242. data/doc/release_notes/4.44.0.txt +0 -125
  243. data/doc/release_notes/4.45.0.txt +0 -370
  244. data/doc/release_notes/4.46.0.txt +0 -404
  245. data/doc/release_notes/4.47.0.txt +0 -56
  246. data/doc/release_notes/4.48.0.txt +0 -293
  247. data/doc/release_notes/4.49.0.txt +0 -222
  248. data/doc/release_notes/4.5.0.txt +0 -34
  249. data/doc/release_notes/4.6.0.txt +0 -30
  250. data/doc/release_notes/4.7.0.txt +0 -103
  251. data/doc/release_notes/4.8.0.txt +0 -175
  252. data/doc/release_notes/4.9.0.txt +0 -190
  253. data/spec/adapter_spec.rb +0 -4
  254. data/spec/adapters/db2_spec.rb +0 -170
  255. data/spec/adapters/mssql_spec.rb +0 -804
  256. data/spec/adapters/mysql_spec.rb +0 -1065
  257. data/spec/adapters/oracle_spec.rb +0 -371
  258. data/spec/adapters/postgres_spec.rb +0 -4125
  259. data/spec/adapters/spec_helper.rb +0 -44
  260. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  261. data/spec/adapters/sqlite_spec.rb +0 -652
  262. data/spec/bin_spec.rb +0 -278
  263. data/spec/core/connection_pool_spec.rb +0 -1250
  264. data/spec/core/database_spec.rb +0 -2865
  265. data/spec/core/dataset_spec.rb +0 -5515
  266. data/spec/core/deprecated_spec.rb +0 -70
  267. data/spec/core/expression_filters_spec.rb +0 -1455
  268. data/spec/core/mock_adapter_spec.rb +0 -722
  269. data/spec/core/object_graph_spec.rb +0 -336
  270. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  271. data/spec/core/schema_generator_spec.rb +0 -214
  272. data/spec/core/schema_spec.rb +0 -1826
  273. data/spec/core/spec_helper.rb +0 -24
  274. data/spec/core/version_spec.rb +0 -14
  275. data/spec/core_extensions_spec.rb +0 -763
  276. data/spec/core_model_spec.rb +0 -2
  277. data/spec/core_spec.rb +0 -1
  278. data/spec/deprecation_helper.rb +0 -30
  279. data/spec/extensions/accessed_columns_spec.rb +0 -51
  280. data/spec/extensions/active_model_spec.rb +0 -99
  281. data/spec/extensions/after_initialize_spec.rb +0 -28
  282. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  283. data/spec/extensions/association_dependencies_spec.rb +0 -125
  284. data/spec/extensions/association_pks_spec.rb +0 -423
  285. data/spec/extensions/association_proxies_spec.rb +0 -100
  286. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  287. data/spec/extensions/auto_validations_spec.rb +0 -229
  288. data/spec/extensions/blacklist_security_spec.rb +0 -95
  289. data/spec/extensions/blank_spec.rb +0 -69
  290. data/spec/extensions/boolean_readers_spec.rb +0 -93
  291. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  292. data/spec/extensions/caching_spec.rb +0 -273
  293. data/spec/extensions/caller_logging_spec.rb +0 -52
  294. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  295. data/spec/extensions/column_conflicts_spec.rb +0 -75
  296. data/spec/extensions/column_select_spec.rb +0 -129
  297. data/spec/extensions/columns_introspection_spec.rb +0 -90
  298. data/spec/extensions/columns_updated_spec.rb +0 -35
  299. data/spec/extensions/composition_spec.rb +0 -248
  300. data/spec/extensions/connection_expiration_spec.rb +0 -151
  301. data/spec/extensions/connection_validator_spec.rb +0 -144
  302. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  303. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  304. data/spec/extensions/constraint_validations_spec.rb +0 -439
  305. data/spec/extensions/core_refinements_spec.rb +0 -528
  306. data/spec/extensions/csv_serializer_spec.rb +0 -183
  307. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  308. data/spec/extensions/dataset_associations_spec.rb +0 -365
  309. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  310. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  311. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  312. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  313. data/spec/extensions/defaults_setter_spec.rb +0 -150
  314. data/spec/extensions/delay_add_association_spec.rb +0 -73
  315. data/spec/extensions/dirty_spec.rb +0 -189
  316. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  317. data/spec/extensions/eager_each_spec.rb +0 -62
  318. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  319. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  320. data/spec/extensions/error_splitter_spec.rb +0 -18
  321. data/spec/extensions/error_sql_spec.rb +0 -20
  322. data/spec/extensions/escaped_like_spec.rb +0 -40
  323. data/spec/extensions/eval_inspect_spec.rb +0 -81
  324. data/spec/extensions/finder_spec.rb +0 -260
  325. data/spec/extensions/force_encoding_spec.rb +0 -126
  326. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  327. data/spec/extensions/graph_each_spec.rb +0 -113
  328. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  329. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  330. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  331. data/spec/extensions/index_caching_spec.rb +0 -66
  332. data/spec/extensions/inflector_spec.rb +0 -183
  333. data/spec/extensions/input_transformer_spec.rb +0 -69
  334. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  335. data/spec/extensions/instance_filters_spec.rb +0 -79
  336. data/spec/extensions/instance_hooks_spec.rb +0 -246
  337. data/spec/extensions/integer64_spec.rb +0 -22
  338. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  339. data/spec/extensions/json_serializer_spec.rb +0 -336
  340. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  341. data/spec/extensions/list_spec.rb +0 -291
  342. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  343. data/spec/extensions/many_through_many_spec.rb +0 -2177
  344. data/spec/extensions/migration_spec.rb +0 -864
  345. data/spec/extensions/modification_detection_spec.rb +0 -93
  346. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  347. data/spec/extensions/named_timezones_spec.rb +0 -111
  348. data/spec/extensions/nested_attributes_spec.rb +0 -767
  349. data/spec/extensions/null_dataset_spec.rb +0 -85
  350. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  351. data/spec/extensions/pagination_spec.rb +0 -116
  352. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  353. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  354. data/spec/extensions/pg_array_spec.rb +0 -398
  355. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -172
  356. data/spec/extensions/pg_enum_spec.rb +0 -118
  357. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  358. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  359. data/spec/extensions/pg_hstore_spec.rb +0 -219
  360. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  361. data/spec/extensions/pg_inet_spec.rb +0 -72
  362. data/spec/extensions/pg_interval_spec.rb +0 -103
  363. data/spec/extensions/pg_json_ops_spec.rb +0 -289
  364. data/spec/extensions/pg_json_spec.rb +0 -262
  365. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  366. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  367. data/spec/extensions/pg_range_spec.rb +0 -519
  368. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  369. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  370. data/spec/extensions/pg_row_spec.rb +0 -363
  371. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  372. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  373. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  374. data/spec/extensions/prepared_statements_spec.rb +0 -177
  375. data/spec/extensions/pretty_table_spec.rb +0 -123
  376. data/spec/extensions/query_spec.rb +0 -94
  377. data/spec/extensions/rcte_tree_spec.rb +0 -381
  378. data/spec/extensions/round_timestamps_spec.rb +0 -39
  379. data/spec/extensions/s_spec.rb +0 -60
  380. data/spec/extensions/schema_caching_spec.rb +0 -64
  381. data/spec/extensions/schema_dumper_spec.rb +0 -870
  382. data/spec/extensions/select_remove_spec.rb +0 -38
  383. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  384. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  385. data/spec/extensions/serialization_spec.rb +0 -365
  386. data/spec/extensions/server_block_spec.rb +0 -97
  387. data/spec/extensions/server_logging_spec.rb +0 -45
  388. data/spec/extensions/sharding_spec.rb +0 -189
  389. data/spec/extensions/shared_caching_spec.rb +0 -151
  390. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  391. data/spec/extensions/singular_table_names_spec.rb +0 -22
  392. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  393. data/spec/extensions/spec_helper.rb +0 -63
  394. data/spec/extensions/split_array_nil_spec.rb +0 -24
  395. data/spec/extensions/split_values_spec.rb +0 -57
  396. data/spec/extensions/sql_comments_spec.rb +0 -33
  397. data/spec/extensions/sql_expr_spec.rb +0 -59
  398. data/spec/extensions/static_cache_spec.rb +0 -471
  399. data/spec/extensions/string_agg_spec.rb +0 -90
  400. data/spec/extensions/string_date_time_spec.rb +0 -95
  401. data/spec/extensions/string_stripper_spec.rb +0 -68
  402. data/spec/extensions/subclasses_spec.rb +0 -79
  403. data/spec/extensions/subset_conditions_spec.rb +0 -38
  404. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  405. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  406. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  407. data/spec/extensions/table_select_spec.rb +0 -83
  408. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  409. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  410. data/spec/extensions/throw_failures_spec.rb +0 -74
  411. data/spec/extensions/timestamps_spec.rb +0 -209
  412. data/spec/extensions/to_dot_spec.rb +0 -153
  413. data/spec/extensions/touch_spec.rb +0 -226
  414. data/spec/extensions/tree_spec.rb +0 -334
  415. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  416. data/spec/extensions/unlimited_update_spec.rb +0 -21
  417. data/spec/extensions/update_or_create_spec.rb +0 -83
  418. data/spec/extensions/update_primary_key_spec.rb +0 -105
  419. data/spec/extensions/update_refresh_spec.rb +0 -59
  420. data/spec/extensions/uuid_spec.rb +0 -101
  421. data/spec/extensions/validate_associated_spec.rb +0 -52
  422. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  423. data/spec/extensions/validation_contexts_spec.rb +0 -31
  424. data/spec/extensions/validation_helpers_spec.rb +0 -525
  425. data/spec/extensions/whitelist_security_spec.rb +0 -157
  426. data/spec/extensions/xml_serializer_spec.rb +0 -213
  427. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  428. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  429. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  430. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  431. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  432. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  433. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  434. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  435. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  436. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  437. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  438. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  439. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  440. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  441. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  442. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  443. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  444. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  445. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  446. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  447. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  448. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  449. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  450. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  451. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  452. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  453. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  454. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  455. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  456. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  457. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  458. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  459. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  460. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  461. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  462. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  463. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  464. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  465. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  466. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  467. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  468. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  469. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  470. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  471. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  472. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  473. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  474. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  475. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  476. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  477. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  478. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  479. data/spec/guards_helper.rb +0 -59
  480. data/spec/integration/associations_test.rb +0 -2597
  481. data/spec/integration/database_test.rb +0 -113
  482. data/spec/integration/dataset_test.rb +0 -1981
  483. data/spec/integration/eager_loader_test.rb +0 -687
  484. data/spec/integration/migrator_test.rb +0 -262
  485. data/spec/integration/model_test.rb +0 -203
  486. data/spec/integration/plugin_test.rb +0 -2396
  487. data/spec/integration/prepared_statement_test.rb +0 -405
  488. data/spec/integration/schema_test.rb +0 -889
  489. data/spec/integration/spec_helper.rb +0 -65
  490. data/spec/integration/timezone_test.rb +0 -86
  491. data/spec/integration/transaction_test.rb +0 -603
  492. data/spec/integration/type_test.rb +0 -127
  493. data/spec/model/association_reflection_spec.rb +0 -803
  494. data/spec/model/associations_spec.rb +0 -4738
  495. data/spec/model/base_spec.rb +0 -875
  496. data/spec/model/class_dataset_methods_spec.rb +0 -146
  497. data/spec/model/dataset_methods_spec.rb +0 -198
  498. data/spec/model/eager_loading_spec.rb +0 -2377
  499. data/spec/model/hooks_spec.rb +0 -370
  500. data/spec/model/inflector_spec.rb +0 -26
  501. data/spec/model/model_spec.rb +0 -956
  502. data/spec/model/plugins_spec.rb +0 -429
  503. data/spec/model/record_spec.rb +0 -2118
  504. data/spec/model/spec_helper.rb +0 -46
  505. data/spec/model/validations_spec.rb +0 -220
  506. data/spec/model_no_assoc_spec.rb +0 -1
  507. data/spec/model_spec.rb +0 -1
  508. data/spec/plugin_spec.rb +0 -1
  509. data/spec/sequel_coverage.rb +0 -15
  510. data/spec/sequel_warning.rb +0 -4
  511. data/spec/spec_config.rb +0 -12
@@ -1,652 +0,0 @@
1
- SEQUEL_ADAPTER_TEST = :sqlite
2
-
3
- require_relative 'spec_helper'
4
-
5
- describe "An SQLite database" do
6
- before do
7
- @db = DB
8
- end
9
- after do
10
- @db.drop_table?(:fk)
11
- @db.use_timestamp_timezones = false
12
- Sequel.datetime_class = Time
13
- end
14
-
15
- it "should support casting to Date by using the date function" do
16
- @db.get(Sequel.cast('2012-10-20 11:12:13', Date)).must_equal '2012-10-20'
17
- end
18
-
19
- it "should support casting to Time or DateTime by using the datetime function" do
20
- @db.get(Sequel.cast('2012-10-20', Time)).must_equal '2012-10-20 00:00:00'
21
- @db.get(Sequel.cast('2012-10-20', DateTime)).must_equal '2012-10-20 00:00:00'
22
- end
23
-
24
- it "should provide the SQLite version as an integer" do
25
- @db.sqlite_version.must_be_kind_of(Integer)
26
- end
27
-
28
- it "should support a use_timestamp_timezones setting" do
29
- @db.use_timestamp_timezones = true
30
- @db.create_table!(:fk){Time :time}
31
- @db[:fk].insert(Time.now)
32
- @db[:fk].get(Sequel.cast(:time, String)).must_match(/[-+]\d\d\d\d\z/)
33
- @db.use_timestamp_timezones = false
34
- @db[:fk].delete
35
- @db[:fk].insert(Time.now)
36
- @db[:fk].get(Sequel.cast(:time, String)).wont_match(/[-+]\d\d\d\d\z/)
37
- end
38
-
39
- it "should provide a list of existing tables" do
40
- @db.drop_table?(:fk)
41
- @db.tables.must_be_kind_of(Array)
42
- @db.tables.wont_include(:fk)
43
- @db.create_table!(:fk){String :name}
44
- @db.tables.must_include(:fk)
45
- end
46
-
47
- cspecify "should support timestamps and datetimes and respect datetime_class", [:jdbc] do
48
- @db.create_table!(:fk){timestamp :t; datetime :d}
49
- @db.use_timestamp_timezones = true
50
- t1 = Time.at(1)
51
- @db[:fk].insert(:t => t1, :d => t1)
52
- @db[:fk].map(:t).must_equal [t1]
53
- @db[:fk].map(:d).must_equal [t1]
54
- Sequel.datetime_class = DateTime
55
- t2 = Sequel.string_to_datetime(t1.iso8601)
56
- @db[:fk].map(:t).must_equal [t2]
57
- @db[:fk].map(:d).must_equal [t2]
58
- end
59
-
60
- it "should support sequential primary keys" do
61
- @db.create_table!(:fk) {primary_key :id; text :name}
62
- @db[:fk].insert(:name => 'abc')
63
- @db[:fk].insert(:name => 'def')
64
- @db[:fk].insert(:name => 'ghi')
65
- @db[:fk].order(:name).all.must_equal [
66
- {:id => 1, :name => 'abc'},
67
- {:id => 2, :name => 'def'},
68
- {:id => 3, :name => 'ghi'}
69
- ]
70
- end
71
-
72
- it "should correctly parse the schema" do
73
- @db.create_table!(:fk) {timestamp :t}
74
- @db.schema(:fk, :reload=>true).must_equal [[:t, {:type=>:datetime, :allow_null=>true, :default=>nil, :ruby_default=>nil, :db_type=>"timestamp", :primary_key=>false}]]
75
- end
76
-
77
- it "should handle and return BigDecimal values for numeric columns" do
78
- DB.create_table!(:fk){numeric :d}
79
- d = DB[:fk]
80
- d.insert(:d=>BigDecimal('80.0'))
81
- d.insert(:d=>BigDecimal('NaN'))
82
- d.insert(:d=>BigDecimal('Infinity'))
83
- d.insert(:d=>BigDecimal('-Infinity'))
84
- ds = d.all
85
- ds.shift.must_equal(:d=>BigDecimal('80.0'))
86
- ds.map{|x| x[:d].to_s}.must_equal %w'NaN Infinity -Infinity'
87
- DB
88
- end
89
- end
90
-
91
- describe "SQLite temporary views" do
92
- before do
93
- @db = DB
94
- @db.drop_view(:items) rescue nil
95
- @db.create_table!(:items){Integer :number}
96
- @db[:items].insert(10)
97
- @db[:items].insert(20)
98
- end
99
- after do
100
- @db.drop_table?(:items)
101
- end
102
-
103
- it "should be supported" do
104
- @db.create_view(:items_view, @db[:items].where(:number=>10), :temp=>true)
105
- @db[:items_view].map(:number).must_equal [10]
106
- @db.disconnect
107
- lambda{@db[:items_view].map(:number)}.must_raise(Sequel::DatabaseError)
108
- end
109
- end
110
-
111
- describe "SQLite VALUES support" do
112
- before do
113
- @db = DB
114
- end
115
-
116
- it "should create a dataset using the VALUES clause via #values" do
117
- @db.values([[1, 2], [3, 4]]).map([:column1, :column2]).must_equal [[1, 2], [3, 4]]
118
- end
119
-
120
- it "should support VALUES with unions" do
121
- @db.values([[1]]).union(@db.values([[3]])).map(&:values).map(&:first).must_equal [1, 3]
122
- end
123
-
124
- it "should support VALUES in CTEs" do
125
- @db[:a].cross_join(:b).with(:a, @db.values([[1, 2]]), :args=>[:c1, :c2]).with(:b, @db.values([[3, 4]]), :args=>[:c3, :c4]).map([:c1, :c2, :c3, :c4]).must_equal [[1, 2, 3, 4]]
126
- end
127
- end if DB.sqlite_version >= 30803
128
-
129
- describe "SQLite type conversion" do
130
- before do
131
- @db = DB
132
- @integer_booleans = @db.integer_booleans
133
- @db.integer_booleans = true
134
- @ds = @db[:items]
135
- @db.drop_table?(:items)
136
- end
137
- after do
138
- @db.integer_booleans = @integer_booleans
139
- Sequel.datetime_class = Time
140
- @db.drop_table?(:items)
141
- end
142
-
143
- it "should handle integers in boolean columns" do
144
- @db.create_table(:items){TrueClass :a}
145
- @db[:items].insert(false)
146
- @db[:items].select_map(:a).must_equal [false]
147
- @db[:items].select_map(Sequel.expr(:a)+:a).must_equal [0]
148
- @db[:items].update(:a=>true)
149
- @db[:items].select_map(:a).must_equal [true]
150
- @db[:items].select_map(Sequel.expr(:a)+:a).must_equal [2]
151
- end
152
-
153
- it "should handle integers/floats/strings/decimals in numeric/decimal columns" do
154
- @db.create_table(:items){Numeric :a}
155
- @db[:items].insert(100)
156
- @db[:items].select_map(:a).must_equal [BigDecimal('100')]
157
- @db[:items].get(:a).must_be_kind_of(BigDecimal)
158
-
159
- @db[:items].update(:a=>100.1)
160
- @db[:items].select_map(:a).must_equal [BigDecimal('100.1')]
161
- @db[:items].get(:a).must_be_kind_of(BigDecimal)
162
-
163
- @db[:items].update(:a=>'100.1')
164
- @db[:items].select_map(:a).must_equal [BigDecimal('100.1')]
165
- @db[:items].get(:a).must_be_kind_of(BigDecimal)
166
-
167
- @db[:items].update(:a=>BigDecimal('100.1'))
168
- @db[:items].select_map(:a).must_equal [BigDecimal('100.1')]
169
- @db[:items].get(:a).must_be_kind_of(BigDecimal)
170
- end
171
-
172
- it "should handle integer/float date columns as julian date" do
173
- @db.create_table(:items){Date :a}
174
- i = 2455979
175
- @db[:items].insert(i)
176
- @db[:items].first.must_equal(:a=>Date.jd(i))
177
- @db[:items].update(:a=>2455979.1)
178
- @db[:items].first.must_equal(:a=>Date.jd(i))
179
- end
180
-
181
- it "should handle integer/float time columns as seconds" do
182
- @db.create_table(:items){Time :a, :only_time=>true}
183
- @db[:items].insert(3661)
184
- @db[:items].first.must_equal(:a=>Sequel::SQLTime.create(1, 1, 1))
185
- @db[:items].update(:a=>3661.000001)
186
- @db[:items].first.must_equal(:a=>Sequel::SQLTime.create(1, 1, 1, 1))
187
- end
188
-
189
- it "should handle integer datetime columns as unix timestamp" do
190
- @db.create_table(:items){DateTime :a}
191
- i = 1329860756
192
- @db[:items].insert(i)
193
- @db[:items].first.must_equal(:a=>Time.at(i))
194
- Sequel.datetime_class = DateTime
195
- @db[:items].first.must_equal(:a=>DateTime.strptime(i.to_s, '%s'))
196
- end
197
-
198
- it "should handle float datetime columns as julian date" do
199
- @db.create_table(:items){DateTime :a}
200
- i = 2455979.5
201
- @db[:items].insert(i)
202
- @db[:items].first.must_equal(:a=>Time.at(1329825600))
203
- Sequel.datetime_class = DateTime
204
- @db[:items].first.must_equal(:a=>DateTime.jd(2455979.5))
205
- end
206
-
207
- it "should handle integer/float blob columns" do
208
- @db.create_table(:items){File :a}
209
- @db[:items].insert(1)
210
- @db[:items].first.must_equal(:a=>Sequel::SQL::Blob.new('1'))
211
- @db[:items].update(:a=>'1.1')
212
- @db[:items].first.must_equal(:a=>Sequel::SQL::Blob.new(1.1.to_s))
213
- end
214
- end if DB.adapter_scheme == :sqlite
215
-
216
- describe "An SQLite dataset" do
217
- before do
218
- @d = DB.dataset
219
- end
220
-
221
- it "should raise errors if given a regexp pattern match" do
222
- proc{@d.literal(Sequel.expr(:x).like(/a/))}.must_raise(Sequel::InvalidOperation)
223
- proc{@d.literal(~Sequel.expr(:x).like(/a/))}.must_raise(Sequel::InvalidOperation)
224
- proc{@d.literal(Sequel.expr(:x).like(/a/i))}.must_raise(Sequel::InvalidOperation)
225
- proc{@d.literal(~Sequel.expr(:x).like(/a/i))}.must_raise(Sequel::InvalidOperation)
226
- end
227
- end
228
-
229
- describe "SQLite::Dataset#delete" do
230
- before do
231
- DB.create_table! :items do
232
- primary_key :id
233
- String :name
234
- Float :value
235
- end
236
- @d = DB[:items]
237
- @d.delete # remove all records
238
- @d.insert(:name => 'abc', :value => 1.23)
239
- @d.insert(:name => 'def', :value => 4.56)
240
- @d.insert(:name => 'ghi', :value => 7.89)
241
- end
242
- after do
243
- DB.drop_table?(:items)
244
- end
245
-
246
- it "should return the number of records affected when filtered" do
247
- @d.count.must_equal 3
248
- @d.filter{value < 3}.delete.must_equal 1
249
- @d.count.must_equal 2
250
-
251
- @d.filter{value < 3}.delete.must_equal 0
252
- @d.count.must_equal 2
253
- end
254
-
255
- it "should return the number of records affected when unfiltered" do
256
- @d.count.must_equal 3
257
- @d.delete.must_equal 3
258
- @d.count.must_equal 0
259
-
260
- @d.delete.must_equal 0
261
- end
262
- end
263
-
264
- describe "SQLite::Dataset#update" do
265
- before do
266
- DB.create_table! :items do
267
- primary_key :id
268
- String :name
269
- Float :value
270
- end
271
- @d = DB[:items]
272
- @d.delete # remove all records
273
- @d.insert(:name => 'abc', :value => 1.23)
274
- @d.insert(:name => 'def', :value => 4.56)
275
- @d.insert(:name => 'ghi', :value => 7.89)
276
- end
277
-
278
- it "should return the number of records affected" do
279
- @d.filter(:name => 'abc').update(:value => 2).must_equal 1
280
-
281
- @d.update(:value => 10).must_equal 3
282
-
283
- @d.filter(:name => 'xxx').update(:value => 23).must_equal 0
284
- end
285
- end
286
-
287
- describe "SQLite::Dataset#insert_conflict" do
288
- before(:all) do
289
- DB.create_table! :ic_test do
290
- primary_key :id
291
- String :name
292
- end
293
- end
294
-
295
- after(:each) do
296
- DB[:ic_test].delete
297
- end
298
-
299
- after(:all) do
300
- DB.drop_table?(:ic_test)
301
- end
302
-
303
- it "Dataset#insert_ignore and insert_constraint should ignore uniqueness violations" do
304
- DB[:ic_test].insert(:id => 1, :name => "one")
305
- proc {DB[:ic_test].insert(:id => 1, :name => "one")}.must_raise Sequel::ConstraintViolation
306
-
307
- DB[:ic_test].insert_ignore.insert(:id => 1, :name => "one")
308
- DB[:ic_test].all.must_equal([{:id => 1, :name => "one"}])
309
-
310
- DB[:ic_test].insert_conflict(:ignore).insert(:id => 1, :name => "one")
311
- DB[:ic_test].all.must_equal([{:id => 1, :name => "one"}])
312
- end
313
-
314
- it "Dataset#insert_constraint should handle replacement" do
315
- DB[:ic_test].insert(:id => 1, :name => "one")
316
-
317
- DB[:ic_test].insert_conflict(:replace).insert(:id => 1, :name => "two")
318
- DB[:ic_test].all.must_equal([{:id => 1, :name => "two"}])
319
- end
320
- end
321
-
322
- describe "SQLite dataset" do
323
- before do
324
- DB.create_table! :test do
325
- primary_key :id
326
- String :name
327
- Float :value
328
- end
329
- DB.create_table! :items do
330
- primary_key :id
331
- String :name
332
- Float :value
333
- end
334
- @d = DB[:items]
335
- @d.insert(:name => 'abc', :value => 1.23)
336
- @d.insert(:name => 'def', :value => 4.56)
337
- @d.insert(:name => 'ghi', :value => 7.89)
338
- end
339
- after do
340
- DB.drop_table?(:test, :items)
341
- end
342
-
343
- it "should be able to insert from a subquery" do
344
- DB[:test].insert(@d)
345
- DB[:test].count.must_equal 3
346
- DB[:test].select(:name, :value).order(:value).to_a.must_equal \
347
- @d.select(:name, :value).order(:value).to_a
348
- end
349
-
350
- it "should support #explain" do
351
- DB[:test].explain.must_be_kind_of(String)
352
- end
353
-
354
- it "should have #explain work when identifier_output_method is modified" do
355
- DB[:test].with_identifier_output_method(:upcase).explain.must_be_kind_of(String)
356
- end if IDENTIFIER_MANGLING
357
- end
358
-
359
- describe "A SQLite database" do
360
- before do
361
- @db = DB
362
- @db.create_table! :test2 do
363
- text :name
364
- integer :value
365
- end
366
- end
367
- after do
368
- @db.drop_table?(:test, :test2, :test3, :test3_backup0, :test3_backup1, :test3_backup2)
369
- end
370
-
371
- it "should support add_column operations" do
372
- @db.add_column :test2, :xyz, :text
373
-
374
- @db[:test2].columns.must_equal [:name, :value, :xyz]
375
- @db[:test2].insert(:name => 'mmm', :value => 111, :xyz=>'000')
376
- @db[:test2].first.must_equal(:name => 'mmm', :value => 111, :xyz=>'000')
377
- end
378
-
379
- it "should support drop_column operations" do
380
- @db.drop_column :test2, :value
381
- @db[:test2].columns.must_equal [:name]
382
- @db[:test2].insert(:name => 'mmm')
383
- @db[:test2].first.must_equal(:name => 'mmm')
384
- end
385
-
386
- it "should support drop_column operations in a transaction" do
387
- @db.transaction{@db.drop_column :test2, :value}
388
- @db[:test2].columns.must_equal [:name]
389
- @db[:test2].insert(:name => 'mmm')
390
- @db[:test2].first.must_equal(:name => 'mmm')
391
- end
392
-
393
- it "should keep a composite primary key when dropping columns" do
394
- @db.create_table!(:test2){Integer :a; Integer :b; Integer :c; primary_key [:a, :b]}
395
- @db.drop_column :test2, :c
396
- @db[:test2].columns.must_equal [:a, :b]
397
- @db[:test2].insert(:a=>1, :b=>2)
398
- @db[:test2].insert(:a=>2, :b=>3)
399
- proc{@db[:test2].insert(:a=>2, :b=>3)}.must_raise(Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
400
- end
401
-
402
- it "should keep column attributes when dropping a column" do
403
- @db.create_table! :test3 do
404
- primary_key :id
405
- text :name
406
- integer :value
407
- end
408
-
409
- # This lame set of additions and deletions are to test that the primary keys
410
- # don't get messed up when we recreate the database.
411
- @db[:test3].insert( :name => "foo", :value => 1)
412
- @db[:test3].insert( :name => "foo", :value => 2)
413
- @db[:test3].insert( :name => "foo", :value => 3)
414
- @db[:test3].filter(:id => 2).delete
415
-
416
- @db.drop_column :test3, :value
417
-
418
- @db['PRAGMA table_info(?)', :test3][:id][:pk].to_i.must_equal 1
419
- @db[:test3].select(:id).all.must_equal [{:id => 1}, {:id => 3}]
420
- end
421
-
422
- it "should keep foreign keys when dropping a column" do
423
- @db.create_table! :test do
424
- primary_key :id
425
- String :name
426
- Integer :value
427
- end
428
- @db.create_table! :test3 do
429
- String :name
430
- Integer :value
431
- foreign_key :test_id, :test, :on_delete => :set_null, :on_update => :cascade
432
- end
433
-
434
- @db[:test3].insert(:name => "abc", :test_id => @db[:test].insert(:name => "foo", :value => 3))
435
- @db[:test3].insert(:name => "def", :test_id => @db[:test].insert(:name => "bar", :value => 4))
436
-
437
- @db.drop_column :test3, :value
438
-
439
- @db[:test].filter(:name => 'bar').delete
440
- @db[:test3][:name => 'def'][:test_id].must_be_nil
441
-
442
- @db[:test].filter(:name => 'foo').update(:id=>100)
443
- @db[:test3][:name => 'abc'][:test_id].must_equal 100
444
- end
445
-
446
- it "should support rename_column operations" do
447
- @db[:test2].delete
448
- @db.add_column :test2, :xyz, :text
449
- @db[:test2].insert(:name => 'mmm', :value => 111, :xyz => 'qqqq')
450
-
451
- @db[:test2].columns.must_equal [:name, :value, :xyz]
452
- @db.rename_column :test2, :xyz, :zyx, :type => :text
453
- @db[:test2].columns.must_equal [:name, :value, :zyx]
454
- @db[:test2].first[:zyx].must_equal 'qqqq'
455
- @db[:test2].count.must_equal 1
456
- end
457
-
458
- it "should preserve defaults when dropping or renaming columns" do
459
- @db.create_table! :test3 do
460
- String :s, :default=>'a'
461
- Integer :i
462
- end
463
-
464
- @db[:test3].insert
465
- @db[:test3].first[:s].must_equal 'a'
466
- @db[:test3].delete
467
- @db.drop_column :test3, :i
468
- @db[:test3].insert
469
- @db[:test3].first[:s].must_equal 'a'
470
- @db[:test3].delete
471
- @db.rename_column :test3, :s, :t
472
- @db[:test3].insert
473
- @db[:test3].first[:t].must_equal 'a'
474
- @db[:test3].delete
475
- end
476
-
477
-
478
- it "should preserve autoincrement after table modification" do
479
- @db.create_table!(:test2) do
480
- primary_key :id
481
- Integer :val, :null => false
482
- end
483
- @db.rename_column(:test2, :val, :value)
484
-
485
- t = @db[:test2]
486
- id1 = t.insert(:value=>1)
487
- t.delete
488
- id2 = t.insert(:value=>1)
489
- id2.must_be :>, id1
490
- end
491
-
492
- it "should handle quoted tables when dropping or renaming columns" do
493
- table_name = "T T"
494
- @db.drop_table?(table_name)
495
- @db.create_table! table_name do
496
- Integer :"s s"
497
- Integer :"i i"
498
- end
499
-
500
- @db.from(table_name).insert(:"s s"=>1, :"i i"=>2)
501
- @db.from(table_name).all.must_equal [{:"s s"=>1, :"i i"=>2}]
502
- @db.drop_column table_name, :"i i"
503
- @db.from(table_name).all.must_equal [{:"s s"=>1}]
504
- @db.rename_column table_name, :"s s", :"t t"
505
- @db.from(table_name).all.must_equal [{:"t t"=>1}]
506
- @db.drop_table?(table_name)
507
- end
508
-
509
- it "should choose a temporary table name that isn't already used when dropping or renaming columns" do
510
- @db.tables.each{|t| @db.drop_table(t) if t.to_s =~ /test3/}
511
- @db.create_table :test3 do
512
- Integer :h
513
- Integer :i
514
- end
515
- @db.create_table :test3_backup0 do
516
- Integer :j
517
- end
518
- @db.create_table :test3_backup1 do
519
- Integer :k
520
- end
521
-
522
- @db[:test3].columns.must_equal [:h, :i]
523
- @db[:test3_backup0].columns.must_equal [:j]
524
- @db[:test3_backup1].columns.must_equal [:k]
525
- @db.drop_column(:test3, :i)
526
- @db[:test3].columns.must_equal [:h]
527
- @db[:test3_backup0].columns.must_equal [:j]
528
- @db[:test3_backup1].columns.must_equal [:k]
529
-
530
- @db.create_table :test3_backup2 do
531
- Integer :l
532
- end
533
-
534
- @db.rename_column(:test3, :h, :i)
535
- @db[:test3].columns.must_equal [:i]
536
- @db[:test3_backup0].columns.must_equal [:j]
537
- @db[:test3_backup1].columns.must_equal [:k]
538
- @db[:test3_backup2].columns.must_equal [:l]
539
- end
540
-
541
- it "should support add_index" do
542
- @db.add_index :test2, :value, :unique => true
543
- @db.add_index :test2, [:name, :value]
544
- end
545
-
546
- it "should support drop_index" do
547
- @db.add_index :test2, :value, :unique => true
548
- @db.drop_index :test2, :value
549
- end
550
-
551
- it "should keep applicable indexes when emulating schema methods" do
552
- @db.create_table!(:test3){Integer :a; Integer :b}
553
- @db.add_index :test3, :a
554
- @db.add_index :test3, :b
555
- @db.add_index :test3, [:b, :a]
556
- @db.drop_column :test3, :b
557
- @db.indexes(:test3)[:test3_a_index].must_equal(:unique=>false, :columns=>[:a])
558
- end
559
-
560
- it "should have support for various #transaction modes" do
561
- @db.transaction(:mode => :immediate){}
562
- @db.transaction(:mode => :exclusive){}
563
- @db.transaction(:mode => :deferred){}
564
- @db.transaction{}
565
-
566
- @db.transaction_mode.must_be_nil
567
- @db.transaction_mode = :immediate
568
- @db.transaction_mode.must_equal :immediate
569
- @db.transaction{}
570
- @db.transaction(:mode => :exclusive){}
571
- proc {@db.transaction_mode = :invalid}.must_raise(Sequel::Error)
572
- @db.transaction_mode.must_equal :immediate
573
- proc {@db.transaction(:mode => :invalid) {}}.must_raise(Sequel::Error)
574
- end
575
-
576
- it "should keep unique constraints when copying tables" do
577
- @db.alter_table(:test2){add_unique_constraint :name}
578
- @db.alter_table(:test2){drop_column :value}
579
- @db[:test2].insert(:name=>'a')
580
- proc{@db[:test2].insert(:name=>'a')}.must_raise(Sequel::ConstraintViolation, Sequel::UniqueConstraintViolation)
581
- end
582
-
583
- it "should not ignore adding new constraints when adding not null constraints" do
584
- @db.alter_table :test2 do
585
- set_column_not_null :value
586
- add_constraint(:value_range1, :value => 3..5)
587
- add_constraint(:value_range2, :value => 0..9)
588
- end
589
-
590
- @db[:test2].insert(:value => 4)
591
- proc{@db[:test2].insert(:value => 1)}.must_raise(Sequel::ConstraintViolation)
592
- proc{@db[:test2].insert(:value => nil)}.must_raise(Sequel::ConstraintViolation)
593
- @db[:test2].select_order_map(:value).must_equal [4]
594
- end
595
-
596
- it "should show unique constraints in Database#indexes" do
597
- @db.alter_table(:test2){add_unique_constraint :name}
598
- @db.indexes(:test2).values.first[:columns].must_equal [:name]
599
- end if DB.sqlite_version >= 30808
600
- end
601
-
602
- describe "SQLite", 'INSERT ON CONFLICT' do
603
- before(:all) do
604
- @db = DB
605
- @db.create_table!(:ic_test){Integer :a; Integer :b; Integer :c; TrueClass :c_is_unique, :default=>false; unique :a, :name=>:ic_test_a_uidx; unique [:b, :c], :name=>:ic_test_b_c_uidx; index [:c], :where=>:c_is_unique, :unique=>true}
606
- @ds = @db[:ic_test]
607
- end
608
- before do
609
- @ds.delete
610
- end
611
- after(:all) do
612
- @db.drop_table?(:ic_test)
613
- end
614
-
615
- it "Dataset#insert_ignore and insert_conflict should ignore uniqueness violations" do
616
- @ds.insert(1, 2, 3, false)
617
- @ds.insert(10, 11, 3, true)
618
- proc{@ds.insert(1, 3, 4, false)}.must_raise Sequel::UniqueConstraintViolation
619
- proc{@ds.insert(11, 12, 3, true)}.must_raise Sequel::UniqueConstraintViolation
620
- @ds.insert_ignore.insert(1, 3, 4, false)
621
- @ds.insert_conflict.insert(1, 3, 4, false)
622
- @ds.insert_conflict.insert(11, 12, 3, true)
623
- @ds.insert_conflict(:target=>:a).insert(1, 3, 4, false)
624
- @ds.insert_conflict(:target=>:c, :conflict_where=>:c_is_unique).insert(11, 12, 3, true)
625
- @ds.all.must_equal [{:a=>1, :b=>2, :c=>3, :c_is_unique=>false}, {:a=>10, :b=>11, :c=>3, :c_is_unique=>true}]
626
- end
627
-
628
- it "Dataset#insert_ignore and insert_conflict should work with multi_insert/import" do
629
- @ds.insert(1, 2, 3, false)
630
- @ds.insert_ignore.multi_insert([{:a=>1, :b=>3, :c=>4}])
631
- @ds.insert_ignore.import([:a, :b, :c], [[1, 3, 4]])
632
- @ds.all.must_equal [{:a=>1, :b=>2, :c=>3, :c_is_unique=>false}]
633
- @ds.insert_conflict(:target=>:a, :update=>{:b=>3}).import([:a, :b, :c], [[1, 3, 4]])
634
- @ds.all.must_equal [{:a=>1, :b=>3, :c=>3, :c_is_unique=>false}]
635
- @ds.insert_conflict(:target=>:a, :update=>{:b=>4}).multi_insert([{:a=>1, :b=>5, :c=>6}])
636
- @ds.all.must_equal [{:a=>1, :b=>4, :c=>3, :c_is_unique=>false}]
637
- end
638
-
639
- it "Dataset#insert_conflict should handle upserts" do
640
- @ds.insert(1, 2, 3, false)
641
- @ds.insert_conflict(:target=>:a, :update=>{:b=>3}).insert(1, 3, 4, false)
642
- @ds.all.must_equal [{:a=>1, :b=>3, :c=>3, :c_is_unique=>false}]
643
- @ds.insert_conflict(:target=>[:b, :c], :update=>{:c=>5}).insert(5, 3, 3, false)
644
- @ds.all.must_equal [{:a=>1, :b=>3, :c=>5, :c_is_unique=>false}]
645
- @ds.insert_conflict(:target=>:a, :update=>{:b=>4}).insert(1, 3, nil, false)
646
- @ds.all.must_equal [{:a=>1, :b=>4, :c=>5, :c_is_unique=>false}]
647
- @ds.insert_conflict(:target=>:a, :update=>{:b=>5}, :update_where=>{Sequel[:ic_test][:b]=>4}).insert(1, 3, 4, false)
648
- @ds.all.must_equal [{:a=>1, :b=>5, :c=>5, :c_is_unique=>false}]
649
- @ds.insert_conflict(:target=>:a, :update=>{:b=>6}, :update_where=>{Sequel[:ic_test][:b]=>4}).insert(1, 3, 4, false)
650
- @ds.all.must_equal [{:a=>1, :b=>5, :c=>5, :c_is_unique=>false}]
651
- end
652
- end if DB.sqlite_version >= 32400