sequel 4.36.0 → 5.61.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 (760) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +548 -5749
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +265 -159
  5. data/bin/sequel +34 -12
  6. data/doc/advanced_associations.rdoc +228 -187
  7. data/doc/association_basics.rdoc +281 -291
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +86 -51
  10. data/doc/code_order.rdoc +25 -19
  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/fork_safety.rdoc +84 -0
  16. data/doc/mass_assignment.rdoc +74 -31
  17. data/doc/migration.rdoc +59 -51
  18. data/doc/model_dataset_method_design.rdoc +129 -0
  19. data/doc/model_hooks.rdoc +15 -25
  20. data/doc/model_plugins.rdoc +12 -12
  21. data/doc/mssql_stored_procedures.rdoc +3 -3
  22. data/doc/object_model.rdoc +58 -68
  23. data/doc/opening_databases.rdoc +85 -95
  24. data/doc/postgresql.rdoc +263 -38
  25. data/doc/prepared_statements.rdoc +29 -24
  26. data/doc/querying.rdoc +189 -167
  27. data/doc/reflection.rdoc +5 -6
  28. data/doc/release_notes/5.0.0.txt +159 -0
  29. data/doc/release_notes/5.1.0.txt +31 -0
  30. data/doc/release_notes/5.10.0.txt +84 -0
  31. data/doc/release_notes/5.11.0.txt +83 -0
  32. data/doc/release_notes/5.12.0.txt +141 -0
  33. data/doc/release_notes/5.13.0.txt +27 -0
  34. data/doc/release_notes/5.14.0.txt +63 -0
  35. data/doc/release_notes/5.15.0.txt +39 -0
  36. data/doc/release_notes/5.16.0.txt +110 -0
  37. data/doc/release_notes/5.17.0.txt +31 -0
  38. data/doc/release_notes/5.18.0.txt +69 -0
  39. data/doc/release_notes/5.19.0.txt +28 -0
  40. data/doc/release_notes/5.2.0.txt +33 -0
  41. data/doc/release_notes/5.20.0.txt +89 -0
  42. data/doc/release_notes/5.21.0.txt +87 -0
  43. data/doc/release_notes/5.22.0.txt +48 -0
  44. data/doc/release_notes/5.23.0.txt +56 -0
  45. data/doc/release_notes/5.24.0.txt +56 -0
  46. data/doc/release_notes/5.25.0.txt +32 -0
  47. data/doc/release_notes/5.26.0.txt +35 -0
  48. data/doc/release_notes/5.27.0.txt +21 -0
  49. data/doc/release_notes/5.28.0.txt +16 -0
  50. data/doc/release_notes/5.29.0.txt +22 -0
  51. data/doc/release_notes/5.3.0.txt +121 -0
  52. data/doc/release_notes/5.30.0.txt +20 -0
  53. data/doc/release_notes/5.31.0.txt +148 -0
  54. data/doc/release_notes/5.32.0.txt +46 -0
  55. data/doc/release_notes/5.33.0.txt +24 -0
  56. data/doc/release_notes/5.34.0.txt +40 -0
  57. data/doc/release_notes/5.35.0.txt +56 -0
  58. data/doc/release_notes/5.36.0.txt +60 -0
  59. data/doc/release_notes/5.37.0.txt +30 -0
  60. data/doc/release_notes/5.38.0.txt +28 -0
  61. data/doc/release_notes/5.39.0.txt +19 -0
  62. data/doc/release_notes/5.4.0.txt +80 -0
  63. data/doc/release_notes/5.40.0.txt +40 -0
  64. data/doc/release_notes/5.41.0.txt +25 -0
  65. data/doc/release_notes/5.42.0.txt +136 -0
  66. data/doc/release_notes/5.43.0.txt +98 -0
  67. data/doc/release_notes/5.44.0.txt +32 -0
  68. data/doc/release_notes/5.45.0.txt +34 -0
  69. data/doc/release_notes/5.46.0.txt +87 -0
  70. data/doc/release_notes/5.47.0.txt +59 -0
  71. data/doc/release_notes/5.48.0.txt +14 -0
  72. data/doc/release_notes/5.49.0.txt +59 -0
  73. data/doc/release_notes/5.5.0.txt +61 -0
  74. data/doc/release_notes/5.50.0.txt +78 -0
  75. data/doc/release_notes/5.51.0.txt +47 -0
  76. data/doc/release_notes/5.52.0.txt +87 -0
  77. data/doc/release_notes/5.53.0.txt +23 -0
  78. data/doc/release_notes/5.54.0.txt +27 -0
  79. data/doc/release_notes/5.55.0.txt +21 -0
  80. data/doc/release_notes/5.56.0.txt +51 -0
  81. data/doc/release_notes/5.57.0.txt +23 -0
  82. data/doc/release_notes/5.58.0.txt +31 -0
  83. data/doc/release_notes/5.59.0.txt +73 -0
  84. data/doc/release_notes/5.6.0.txt +31 -0
  85. data/doc/release_notes/5.60.0.txt +22 -0
  86. data/doc/release_notes/5.61.0.txt +43 -0
  87. data/doc/release_notes/5.7.0.txt +108 -0
  88. data/doc/release_notes/5.8.0.txt +170 -0
  89. data/doc/release_notes/5.9.0.txt +99 -0
  90. data/doc/schema_modification.rdoc +95 -75
  91. data/doc/security.rdoc +109 -80
  92. data/doc/sharding.rdoc +74 -47
  93. data/doc/sql.rdoc +147 -122
  94. data/doc/testing.rdoc +43 -20
  95. data/doc/thread_safety.rdoc +2 -4
  96. data/doc/transactions.rdoc +97 -18
  97. data/doc/validations.rdoc +52 -50
  98. data/doc/virtual_rows.rdoc +90 -109
  99. data/lib/sequel/adapters/ado/access.rb +15 -17
  100. data/lib/sequel/adapters/ado/mssql.rb +6 -15
  101. data/lib/sequel/adapters/ado.rb +150 -20
  102. data/lib/sequel/adapters/amalgalite.rb +11 -23
  103. data/lib/sequel/adapters/ibmdb.rb +47 -55
  104. data/lib/sequel/adapters/jdbc/db2.rb +29 -39
  105. data/lib/sequel/adapters/jdbc/derby.rb +58 -54
  106. data/lib/sequel/adapters/jdbc/h2.rb +93 -35
  107. data/lib/sequel/adapters/jdbc/hsqldb.rb +24 -31
  108. data/lib/sequel/adapters/jdbc/jtds.rb +2 -10
  109. data/lib/sequel/adapters/jdbc/mssql.rb +3 -11
  110. data/lib/sequel/adapters/jdbc/mysql.rb +17 -20
  111. data/lib/sequel/adapters/jdbc/oracle.rb +22 -18
  112. data/lib/sequel/adapters/jdbc/postgresql.rb +69 -71
  113. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +11 -23
  114. data/lib/sequel/adapters/jdbc/sqlite.rb +47 -11
  115. data/lib/sequel/adapters/jdbc/sqlserver.rb +34 -9
  116. data/lib/sequel/adapters/jdbc/transactions.rb +22 -38
  117. data/lib/sequel/adapters/jdbc.rb +145 -130
  118. data/lib/sequel/adapters/mock.rb +100 -111
  119. data/lib/sequel/adapters/mysql.rb +114 -122
  120. data/lib/sequel/adapters/mysql2.rb +147 -63
  121. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  122. data/lib/sequel/adapters/odbc/mssql.rb +8 -14
  123. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  124. data/lib/sequel/adapters/odbc.rb +20 -25
  125. data/lib/sequel/adapters/oracle.rb +50 -56
  126. data/lib/sequel/adapters/postgres.rb +305 -327
  127. data/lib/sequel/adapters/postgresql.rb +1 -1
  128. data/lib/sequel/adapters/shared/access.rb +74 -78
  129. data/lib/sequel/adapters/shared/db2.rb +118 -71
  130. data/lib/sequel/adapters/shared/mssql.rb +301 -220
  131. data/lib/sequel/adapters/shared/mysql.rb +299 -217
  132. data/lib/sequel/adapters/shared/oracle.rb +226 -65
  133. data/lib/sequel/adapters/shared/postgres.rb +935 -395
  134. data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -126
  135. data/lib/sequel/adapters/shared/sqlite.rb +447 -173
  136. data/lib/sequel/adapters/sqlanywhere.rb +48 -35
  137. data/lib/sequel/adapters/sqlite.rb +156 -111
  138. data/lib/sequel/adapters/tinytds.rb +30 -38
  139. data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
  140. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +3 -6
  141. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +2 -2
  142. data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
  143. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
  144. data/lib/sequel/adapters/utils/replace.rb +1 -4
  145. data/lib/sequel/adapters/utils/stored_procedures.rb +7 -22
  146. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
  147. data/lib/sequel/ast_transformer.rb +17 -89
  148. data/lib/sequel/connection_pool/sharded_single.rb +18 -15
  149. data/lib/sequel/connection_pool/sharded_threaded.rb +130 -111
  150. data/lib/sequel/connection_pool/single.rb +18 -13
  151. data/lib/sequel/connection_pool/threaded.rb +121 -120
  152. data/lib/sequel/connection_pool.rb +48 -29
  153. data/lib/sequel/core.rb +351 -301
  154. data/lib/sequel/database/connecting.rb +69 -57
  155. data/lib/sequel/database/dataset.rb +13 -5
  156. data/lib/sequel/database/dataset_defaults.rb +18 -102
  157. data/lib/sequel/database/features.rb +18 -4
  158. data/lib/sequel/database/logging.rb +12 -11
  159. data/lib/sequel/database/misc.rb +180 -122
  160. data/lib/sequel/database/query.rb +47 -27
  161. data/lib/sequel/database/schema_generator.rb +178 -84
  162. data/lib/sequel/database/schema_methods.rb +172 -97
  163. data/lib/sequel/database/transactions.rb +205 -44
  164. data/lib/sequel/database.rb +17 -2
  165. data/lib/sequel/dataset/actions.rb +339 -155
  166. data/lib/sequel/dataset/dataset_module.rb +46 -0
  167. data/lib/sequel/dataset/features.rb +90 -35
  168. data/lib/sequel/dataset/graph.rb +80 -58
  169. data/lib/sequel/dataset/misc.rb +137 -47
  170. data/lib/sequel/dataset/placeholder_literalizer.rb +63 -25
  171. data/lib/sequel/dataset/prepared_statements.rb +188 -85
  172. data/lib/sequel/dataset/query.rb +530 -222
  173. data/lib/sequel/dataset/sql.rb +590 -368
  174. data/lib/sequel/dataset.rb +26 -16
  175. data/lib/sequel/deprecated.rb +12 -2
  176. data/lib/sequel/exceptions.rb +46 -16
  177. data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
  178. data/lib/sequel/extensions/_model_pg_row.rb +43 -0
  179. data/lib/sequel/extensions/_pretty_table.rb +2 -5
  180. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  181. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  182. data/lib/sequel/extensions/async_thread_pool.rb +438 -0
  183. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  184. data/lib/sequel/extensions/blank.rb +8 -0
  185. data/lib/sequel/extensions/caller_logging.rb +79 -0
  186. data/lib/sequel/extensions/columns_introspection.rb +4 -3
  187. data/lib/sequel/extensions/connection_expiration.rb +20 -10
  188. data/lib/sequel/extensions/connection_validator.rb +11 -10
  189. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  190. data/lib/sequel/extensions/constraint_validations.rb +62 -39
  191. data/lib/sequel/extensions/core_extensions.rb +42 -48
  192. data/lib/sequel/extensions/core_refinements.rb +80 -59
  193. data/lib/sequel/extensions/current_datetime_timestamp.rb +1 -4
  194. data/lib/sequel/extensions/date_arithmetic.rb +98 -39
  195. data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
  196. data/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
  197. data/lib/sequel/extensions/duplicate_columns_handler.rb +21 -14
  198. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  199. data/lib/sequel/extensions/escaped_like.rb +100 -0
  200. data/lib/sequel/extensions/eval_inspect.rb +12 -15
  201. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  202. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  203. data/lib/sequel/extensions/freeze_datasets.rb +3 -0
  204. data/lib/sequel/extensions/from_block.rb +1 -34
  205. data/lib/sequel/extensions/graph_each.rb +4 -4
  206. data/lib/sequel/extensions/identifier_mangling.rb +180 -0
  207. data/lib/sequel/extensions/implicit_subquery.rb +48 -0
  208. data/lib/sequel/extensions/index_caching.rb +109 -0
  209. data/lib/sequel/extensions/inflector.rb +13 -5
  210. data/lib/sequel/extensions/integer64.rb +32 -0
  211. data/lib/sequel/extensions/is_distinct_from.rb +141 -0
  212. data/lib/sequel/extensions/looser_typecasting.rb +17 -8
  213. data/lib/sequel/extensions/migration.rb +119 -78
  214. data/lib/sequel/extensions/named_timezones.rb +88 -23
  215. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -82
  216. data/lib/sequel/extensions/null_dataset.rb +8 -8
  217. data/lib/sequel/extensions/pagination.rb +32 -29
  218. data/lib/sequel/extensions/pg_array.rb +221 -287
  219. data/lib/sequel/extensions/pg_array_ops.rb +17 -9
  220. data/lib/sequel/extensions/pg_enum.rb +63 -23
  221. data/lib/sequel/extensions/pg_extended_date_support.rb +241 -0
  222. data/lib/sequel/extensions/pg_hstore.rb +45 -54
  223. data/lib/sequel/extensions/pg_hstore_ops.rb +58 -6
  224. data/lib/sequel/extensions/pg_inet.rb +31 -12
  225. data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
  226. data/lib/sequel/extensions/pg_interval.rb +56 -29
  227. data/lib/sequel/extensions/pg_json.rb +417 -140
  228. data/lib/sequel/extensions/pg_json_ops.rb +270 -18
  229. data/lib/sequel/extensions/pg_loose_count.rb +4 -2
  230. data/lib/sequel/extensions/pg_multirange.rb +372 -0
  231. data/lib/sequel/extensions/pg_range.rb +131 -191
  232. data/lib/sequel/extensions/pg_range_ops.rb +42 -13
  233. data/lib/sequel/extensions/pg_row.rb +48 -81
  234. data/lib/sequel/extensions/pg_row_ops.rb +33 -14
  235. data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
  236. data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
  237. data/lib/sequel/extensions/query.rb +9 -7
  238. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  239. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  240. data/lib/sequel/extensions/s.rb +60 -0
  241. data/lib/sequel/extensions/schema_caching.rb +10 -1
  242. data/lib/sequel/extensions/schema_dumper.rb +71 -48
  243. data/lib/sequel/extensions/select_remove.rb +4 -4
  244. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
  245. data/lib/sequel/extensions/server_block.rb +51 -27
  246. data/lib/sequel/extensions/split_array_nil.rb +4 -4
  247. data/lib/sequel/extensions/sql_comments.rb +119 -7
  248. data/lib/sequel/extensions/sql_expr.rb +2 -1
  249. data/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
  250. data/lib/sequel/extensions/sqlite_json_ops.rb +255 -0
  251. data/lib/sequel/extensions/string_agg.rb +11 -8
  252. data/lib/sequel/extensions/string_date_time.rb +19 -23
  253. data/lib/sequel/extensions/symbol_aref.rb +55 -0
  254. data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
  255. data/lib/sequel/extensions/symbol_as.rb +23 -0
  256. data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
  257. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  258. data/lib/sequel/extensions/to_dot.rb +10 -4
  259. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  260. data/lib/sequel/model/associations.rb +1006 -284
  261. data/lib/sequel/model/base.rb +560 -805
  262. data/lib/sequel/model/dataset_module.rb +11 -10
  263. data/lib/sequel/model/default_inflections.rb +1 -1
  264. data/lib/sequel/model/errors.rb +10 -3
  265. data/lib/sequel/model/exceptions.rb +8 -10
  266. data/lib/sequel/model/inflections.rb +7 -20
  267. data/lib/sequel/model/plugins.rb +114 -0
  268. data/lib/sequel/model.rb +32 -82
  269. data/lib/sequel/plugins/active_model.rb +30 -14
  270. data/lib/sequel/plugins/after_initialize.rb +1 -1
  271. data/lib/sequel/plugins/association_dependencies.rb +25 -18
  272. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  273. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  274. data/lib/sequel/plugins/association_pks.rb +147 -70
  275. data/lib/sequel/plugins/association_proxies.rb +33 -9
  276. data/lib/sequel/plugins/async_thread_pool.rb +39 -0
  277. data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
  278. data/lib/sequel/plugins/auto_validations.rb +95 -28
  279. data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
  280. data/lib/sequel/plugins/before_after_save.rb +0 -42
  281. data/lib/sequel/plugins/blacklist_security.rb +21 -12
  282. data/lib/sequel/plugins/boolean_readers.rb +5 -5
  283. data/lib/sequel/plugins/boolean_subsets.rb +13 -8
  284. data/lib/sequel/plugins/caching.rb +25 -16
  285. data/lib/sequel/plugins/class_table_inheritance.rb +179 -100
  286. data/lib/sequel/plugins/column_conflicts.rb +16 -3
  287. data/lib/sequel/plugins/column_encryption.rb +728 -0
  288. data/lib/sequel/plugins/column_select.rb +7 -5
  289. data/lib/sequel/plugins/columns_updated.rb +42 -0
  290. data/lib/sequel/plugins/composition.rb +42 -26
  291. data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
  292. data/lib/sequel/plugins/constraint_validations.rb +20 -14
  293. data/lib/sequel/plugins/csv_serializer.rb +56 -35
  294. data/lib/sequel/plugins/dataset_associations.rb +40 -17
  295. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  296. data/lib/sequel/plugins/defaults_setter.rb +65 -10
  297. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  298. data/lib/sequel/plugins/dirty.rb +62 -24
  299. data/lib/sequel/plugins/eager_each.rb +3 -3
  300. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  301. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  302. data/lib/sequel/plugins/enum.rb +124 -0
  303. data/lib/sequel/plugins/error_splitter.rb +17 -12
  304. data/lib/sequel/plugins/finder.rb +246 -0
  305. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  306. data/lib/sequel/plugins/force_encoding.rb +7 -12
  307. data/lib/sequel/plugins/hook_class_methods.rb +37 -54
  308. data/lib/sequel/plugins/input_transformer.rb +18 -10
  309. data/lib/sequel/plugins/insert_conflict.rb +76 -0
  310. data/lib/sequel/plugins/insert_returning_select.rb +2 -2
  311. data/lib/sequel/plugins/instance_filters.rb +10 -8
  312. data/lib/sequel/plugins/instance_hooks.rb +34 -17
  313. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  314. data/lib/sequel/plugins/inverted_subsets.rb +22 -13
  315. data/lib/sequel/plugins/json_serializer.rb +124 -64
  316. data/lib/sequel/plugins/lazy_attributes.rb +21 -14
  317. data/lib/sequel/plugins/list.rb +35 -21
  318. data/lib/sequel/plugins/many_through_many.rb +134 -21
  319. data/lib/sequel/plugins/modification_detection.rb +15 -5
  320. data/lib/sequel/plugins/mssql_optimistic_locking.rb +6 -5
  321. data/lib/sequel/plugins/nested_attributes.rb +61 -31
  322. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  323. data/lib/sequel/plugins/pg_array_associations.rb +103 -53
  324. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +350 -0
  325. data/lib/sequel/plugins/pg_row.rb +5 -51
  326. data/lib/sequel/plugins/prepared_statements.rb +60 -72
  327. data/lib/sequel/plugins/prepared_statements_safe.rb +9 -4
  328. data/lib/sequel/plugins/rcte_tree.rb +68 -82
  329. data/lib/sequel/plugins/require_valid_schema.rb +67 -0
  330. data/lib/sequel/plugins/serialization.rb +43 -46
  331. data/lib/sequel/plugins/serialization_modification_detection.rb +3 -2
  332. data/lib/sequel/plugins/sharding.rb +15 -10
  333. data/lib/sequel/plugins/single_table_inheritance.rb +67 -28
  334. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  335. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  336. data/lib/sequel/plugins/split_values.rb +11 -6
  337. data/lib/sequel/plugins/sql_comments.rb +189 -0
  338. data/lib/sequel/plugins/static_cache.rb +77 -53
  339. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  340. data/lib/sequel/plugins/string_stripper.rb +3 -3
  341. data/lib/sequel/plugins/subclasses.rb +43 -10
  342. data/lib/sequel/plugins/subset_conditions.rb +15 -5
  343. data/lib/sequel/plugins/table_select.rb +2 -2
  344. data/lib/sequel/plugins/tactical_eager_loading.rb +96 -12
  345. data/lib/sequel/plugins/throw_failures.rb +110 -0
  346. data/lib/sequel/plugins/timestamps.rb +20 -8
  347. data/lib/sequel/plugins/touch.rb +19 -8
  348. data/lib/sequel/plugins/tree.rb +62 -32
  349. data/lib/sequel/plugins/typecast_on_load.rb +12 -4
  350. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  351. data/lib/sequel/plugins/unused_associations.rb +521 -0
  352. data/lib/sequel/plugins/update_or_create.rb +4 -4
  353. data/lib/sequel/plugins/update_primary_key.rb +1 -1
  354. data/lib/sequel/plugins/update_refresh.rb +26 -15
  355. data/lib/sequel/plugins/uuid.rb +7 -11
  356. data/lib/sequel/plugins/validate_associated.rb +18 -0
  357. data/lib/sequel/plugins/validation_class_methods.rb +38 -19
  358. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  359. data/lib/sequel/plugins/validation_helpers.rb +57 -41
  360. data/lib/sequel/plugins/whitelist_security.rb +122 -0
  361. data/lib/sequel/plugins/xml_serializer.rb +30 -31
  362. data/lib/sequel/sql.rb +471 -331
  363. data/lib/sequel/timezones.rb +78 -47
  364. data/lib/sequel/version.rb +7 -2
  365. data/lib/sequel.rb +1 -1
  366. metadata +217 -521
  367. data/Rakefile +0 -164
  368. data/doc/active_record.rdoc +0 -928
  369. data/doc/release_notes/1.0.txt +0 -38
  370. data/doc/release_notes/1.1.txt +0 -143
  371. data/doc/release_notes/1.3.txt +0 -101
  372. data/doc/release_notes/1.4.0.txt +0 -53
  373. data/doc/release_notes/1.5.0.txt +0 -155
  374. data/doc/release_notes/2.0.0.txt +0 -298
  375. data/doc/release_notes/2.1.0.txt +0 -271
  376. data/doc/release_notes/2.10.0.txt +0 -328
  377. data/doc/release_notes/2.11.0.txt +0 -215
  378. data/doc/release_notes/2.12.0.txt +0 -534
  379. data/doc/release_notes/2.2.0.txt +0 -253
  380. data/doc/release_notes/2.3.0.txt +0 -88
  381. data/doc/release_notes/2.4.0.txt +0 -106
  382. data/doc/release_notes/2.5.0.txt +0 -137
  383. data/doc/release_notes/2.6.0.txt +0 -157
  384. data/doc/release_notes/2.7.0.txt +0 -166
  385. data/doc/release_notes/2.8.0.txt +0 -171
  386. data/doc/release_notes/2.9.0.txt +0 -97
  387. data/doc/release_notes/3.0.0.txt +0 -221
  388. data/doc/release_notes/3.1.0.txt +0 -406
  389. data/doc/release_notes/3.10.0.txt +0 -286
  390. data/doc/release_notes/3.11.0.txt +0 -254
  391. data/doc/release_notes/3.12.0.txt +0 -304
  392. data/doc/release_notes/3.13.0.txt +0 -210
  393. data/doc/release_notes/3.14.0.txt +0 -118
  394. data/doc/release_notes/3.15.0.txt +0 -78
  395. data/doc/release_notes/3.16.0.txt +0 -45
  396. data/doc/release_notes/3.17.0.txt +0 -58
  397. data/doc/release_notes/3.18.0.txt +0 -120
  398. data/doc/release_notes/3.19.0.txt +0 -67
  399. data/doc/release_notes/3.2.0.txt +0 -268
  400. data/doc/release_notes/3.20.0.txt +0 -41
  401. data/doc/release_notes/3.21.0.txt +0 -87
  402. data/doc/release_notes/3.22.0.txt +0 -39
  403. data/doc/release_notes/3.23.0.txt +0 -172
  404. data/doc/release_notes/3.24.0.txt +0 -420
  405. data/doc/release_notes/3.25.0.txt +0 -88
  406. data/doc/release_notes/3.26.0.txt +0 -88
  407. data/doc/release_notes/3.27.0.txt +0 -82
  408. data/doc/release_notes/3.28.0.txt +0 -304
  409. data/doc/release_notes/3.29.0.txt +0 -459
  410. data/doc/release_notes/3.3.0.txt +0 -192
  411. data/doc/release_notes/3.30.0.txt +0 -135
  412. data/doc/release_notes/3.31.0.txt +0 -146
  413. data/doc/release_notes/3.32.0.txt +0 -202
  414. data/doc/release_notes/3.33.0.txt +0 -157
  415. data/doc/release_notes/3.34.0.txt +0 -671
  416. data/doc/release_notes/3.35.0.txt +0 -144
  417. data/doc/release_notes/3.36.0.txt +0 -245
  418. data/doc/release_notes/3.37.0.txt +0 -338
  419. data/doc/release_notes/3.38.0.txt +0 -234
  420. data/doc/release_notes/3.39.0.txt +0 -237
  421. data/doc/release_notes/3.4.0.txt +0 -325
  422. data/doc/release_notes/3.40.0.txt +0 -73
  423. data/doc/release_notes/3.41.0.txt +0 -155
  424. data/doc/release_notes/3.42.0.txt +0 -74
  425. data/doc/release_notes/3.43.0.txt +0 -105
  426. data/doc/release_notes/3.44.0.txt +0 -152
  427. data/doc/release_notes/3.45.0.txt +0 -179
  428. data/doc/release_notes/3.46.0.txt +0 -122
  429. data/doc/release_notes/3.47.0.txt +0 -270
  430. data/doc/release_notes/3.48.0.txt +0 -477
  431. data/doc/release_notes/3.5.0.txt +0 -510
  432. data/doc/release_notes/3.6.0.txt +0 -366
  433. data/doc/release_notes/3.7.0.txt +0 -179
  434. data/doc/release_notes/3.8.0.txt +0 -151
  435. data/doc/release_notes/3.9.0.txt +0 -233
  436. data/doc/release_notes/4.0.0.txt +0 -262
  437. data/doc/release_notes/4.1.0.txt +0 -85
  438. data/doc/release_notes/4.10.0.txt +0 -226
  439. data/doc/release_notes/4.11.0.txt +0 -147
  440. data/doc/release_notes/4.12.0.txt +0 -105
  441. data/doc/release_notes/4.13.0.txt +0 -169
  442. data/doc/release_notes/4.14.0.txt +0 -68
  443. data/doc/release_notes/4.15.0.txt +0 -56
  444. data/doc/release_notes/4.16.0.txt +0 -36
  445. data/doc/release_notes/4.17.0.txt +0 -38
  446. data/doc/release_notes/4.18.0.txt +0 -36
  447. data/doc/release_notes/4.19.0.txt +0 -45
  448. data/doc/release_notes/4.2.0.txt +0 -129
  449. data/doc/release_notes/4.20.0.txt +0 -79
  450. data/doc/release_notes/4.21.0.txt +0 -94
  451. data/doc/release_notes/4.22.0.txt +0 -72
  452. data/doc/release_notes/4.23.0.txt +0 -65
  453. data/doc/release_notes/4.24.0.txt +0 -99
  454. data/doc/release_notes/4.25.0.txt +0 -181
  455. data/doc/release_notes/4.26.0.txt +0 -44
  456. data/doc/release_notes/4.27.0.txt +0 -78
  457. data/doc/release_notes/4.28.0.txt +0 -57
  458. data/doc/release_notes/4.29.0.txt +0 -41
  459. data/doc/release_notes/4.3.0.txt +0 -40
  460. data/doc/release_notes/4.30.0.txt +0 -37
  461. data/doc/release_notes/4.31.0.txt +0 -57
  462. data/doc/release_notes/4.32.0.txt +0 -132
  463. data/doc/release_notes/4.33.0.txt +0 -88
  464. data/doc/release_notes/4.34.0.txt +0 -86
  465. data/doc/release_notes/4.35.0.txt +0 -130
  466. data/doc/release_notes/4.36.0.txt +0 -116
  467. data/doc/release_notes/4.4.0.txt +0 -92
  468. data/doc/release_notes/4.5.0.txt +0 -34
  469. data/doc/release_notes/4.6.0.txt +0 -30
  470. data/doc/release_notes/4.7.0.txt +0 -103
  471. data/doc/release_notes/4.8.0.txt +0 -175
  472. data/doc/release_notes/4.9.0.txt +0 -190
  473. data/lib/sequel/adapters/cubrid.rb +0 -144
  474. data/lib/sequel/adapters/do/mysql.rb +0 -66
  475. data/lib/sequel/adapters/do/postgres.rb +0 -44
  476. data/lib/sequel/adapters/do/sqlite3.rb +0 -42
  477. data/lib/sequel/adapters/do.rb +0 -158
  478. data/lib/sequel/adapters/jdbc/as400.rb +0 -84
  479. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -64
  480. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -36
  481. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -33
  482. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -33
  483. data/lib/sequel/adapters/odbc/progress.rb +0 -10
  484. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  485. data/lib/sequel/adapters/shared/firebird.rb +0 -247
  486. data/lib/sequel/adapters/shared/informix.rb +0 -54
  487. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -152
  488. data/lib/sequel/adapters/shared/progress.rb +0 -40
  489. data/lib/sequel/adapters/swift/mysql.rb +0 -49
  490. data/lib/sequel/adapters/swift/postgres.rb +0 -47
  491. data/lib/sequel/adapters/swift/sqlite.rb +0 -49
  492. data/lib/sequel/adapters/swift.rb +0 -160
  493. data/lib/sequel/adapters/utils/pg_types.rb +0 -70
  494. data/lib/sequel/dataset/mutation.rb +0 -111
  495. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -5
  496. data/lib/sequel/extensions/filter_having.rb +0 -63
  497. data/lib/sequel/extensions/hash_aliases.rb +0 -49
  498. data/lib/sequel/extensions/meta_def.rb +0 -35
  499. data/lib/sequel/extensions/query_literals.rb +0 -84
  500. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -24
  501. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -122
  502. data/lib/sequel/extensions/set_overrides.rb +0 -76
  503. data/lib/sequel/no_core_ext.rb +0 -3
  504. data/lib/sequel/plugins/association_autoreloading.rb +0 -9
  505. data/lib/sequel/plugins/identifier_columns.rb +0 -47
  506. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -9
  507. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -81
  508. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -119
  509. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -61
  510. data/lib/sequel/plugins/schema.rb +0 -82
  511. data/lib/sequel/plugins/scissors.rb +0 -35
  512. data/spec/adapter_spec.rb +0 -4
  513. data/spec/adapters/db2_spec.rb +0 -160
  514. data/spec/adapters/firebird_spec.rb +0 -411
  515. data/spec/adapters/informix_spec.rb +0 -100
  516. data/spec/adapters/mssql_spec.rb +0 -733
  517. data/spec/adapters/mysql_spec.rb +0 -1319
  518. data/spec/adapters/oracle_spec.rb +0 -313
  519. data/spec/adapters/postgres_spec.rb +0 -3790
  520. data/spec/adapters/spec_helper.rb +0 -49
  521. data/spec/adapters/sqlanywhere_spec.rb +0 -170
  522. data/spec/adapters/sqlite_spec.rb +0 -688
  523. data/spec/bin_spec.rb +0 -258
  524. data/spec/core/connection_pool_spec.rb +0 -1045
  525. data/spec/core/database_spec.rb +0 -2636
  526. data/spec/core/dataset_spec.rb +0 -5175
  527. data/spec/core/deprecated_spec.rb +0 -70
  528. data/spec/core/expression_filters_spec.rb +0 -1247
  529. data/spec/core/mock_adapter_spec.rb +0 -464
  530. data/spec/core/object_graph_spec.rb +0 -303
  531. data/spec/core/placeholder_literalizer_spec.rb +0 -163
  532. data/spec/core/schema_generator_spec.rb +0 -203
  533. data/spec/core/schema_spec.rb +0 -1676
  534. data/spec/core/spec_helper.rb +0 -34
  535. data/spec/core/version_spec.rb +0 -7
  536. data/spec/core_extensions_spec.rb +0 -699
  537. data/spec/core_model_spec.rb +0 -2
  538. data/spec/core_spec.rb +0 -1
  539. data/spec/extensions/accessed_columns_spec.rb +0 -51
  540. data/spec/extensions/active_model_spec.rb +0 -85
  541. data/spec/extensions/after_initialize_spec.rb +0 -24
  542. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  543. data/spec/extensions/association_dependencies_spec.rb +0 -117
  544. data/spec/extensions/association_pks_spec.rb +0 -405
  545. data/spec/extensions/association_proxies_spec.rb +0 -86
  546. data/spec/extensions/auto_validations_spec.rb +0 -192
  547. data/spec/extensions/before_after_save_spec.rb +0 -40
  548. data/spec/extensions/blacklist_security_spec.rb +0 -88
  549. data/spec/extensions/blank_spec.rb +0 -69
  550. data/spec/extensions/boolean_readers_spec.rb +0 -93
  551. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  552. data/spec/extensions/caching_spec.rb +0 -270
  553. data/spec/extensions/class_table_inheritance_spec.rb +0 -444
  554. data/spec/extensions/column_conflicts_spec.rb +0 -60
  555. data/spec/extensions/column_select_spec.rb +0 -108
  556. data/spec/extensions/columns_introspection_spec.rb +0 -91
  557. data/spec/extensions/composition_spec.rb +0 -242
  558. data/spec/extensions/connection_expiration_spec.rb +0 -121
  559. data/spec/extensions/connection_validator_spec.rb +0 -127
  560. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -288
  561. data/spec/extensions/constraint_validations_spec.rb +0 -389
  562. data/spec/extensions/core_refinements_spec.rb +0 -519
  563. data/spec/extensions/csv_serializer_spec.rb +0 -180
  564. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  565. data/spec/extensions/dataset_associations_spec.rb +0 -343
  566. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  567. data/spec/extensions/date_arithmetic_spec.rb +0 -167
  568. data/spec/extensions/defaults_setter_spec.rb +0 -102
  569. data/spec/extensions/delay_add_association_spec.rb +0 -74
  570. data/spec/extensions/dirty_spec.rb +0 -180
  571. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -110
  572. data/spec/extensions/eager_each_spec.rb +0 -66
  573. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  574. data/spec/extensions/error_splitter_spec.rb +0 -18
  575. data/spec/extensions/error_sql_spec.rb +0 -20
  576. data/spec/extensions/eval_inspect_spec.rb +0 -73
  577. data/spec/extensions/filter_having_spec.rb +0 -40
  578. data/spec/extensions/force_encoding_spec.rb +0 -114
  579. data/spec/extensions/from_block_spec.rb +0 -21
  580. data/spec/extensions/graph_each_spec.rb +0 -119
  581. data/spec/extensions/hash_aliases_spec.rb +0 -24
  582. data/spec/extensions/hook_class_methods_spec.rb +0 -429
  583. data/spec/extensions/identifier_columns_spec.rb +0 -17
  584. data/spec/extensions/inflector_spec.rb +0 -183
  585. data/spec/extensions/input_transformer_spec.rb +0 -54
  586. data/spec/extensions/insert_returning_select_spec.rb +0 -46
  587. data/spec/extensions/instance_filters_spec.rb +0 -79
  588. data/spec/extensions/instance_hooks_spec.rb +0 -276
  589. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  590. data/spec/extensions/json_serializer_spec.rb +0 -304
  591. data/spec/extensions/lazy_attributes_spec.rb +0 -170
  592. data/spec/extensions/list_spec.rb +0 -278
  593. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  594. data/spec/extensions/many_through_many_spec.rb +0 -2172
  595. data/spec/extensions/meta_def_spec.rb +0 -21
  596. data/spec/extensions/migration_spec.rb +0 -728
  597. data/spec/extensions/modification_detection_spec.rb +0 -80
  598. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
  599. data/spec/extensions/named_timezones_spec.rb +0 -108
  600. data/spec/extensions/nested_attributes_spec.rb +0 -697
  601. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -65
  602. data/spec/extensions/null_dataset_spec.rb +0 -85
  603. data/spec/extensions/optimistic_locking_spec.rb +0 -128
  604. data/spec/extensions/pagination_spec.rb +0 -118
  605. data/spec/extensions/pg_array_associations_spec.rb +0 -736
  606. data/spec/extensions/pg_array_ops_spec.rb +0 -143
  607. data/spec/extensions/pg_array_spec.rb +0 -390
  608. data/spec/extensions/pg_enum_spec.rb +0 -92
  609. data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
  610. data/spec/extensions/pg_hstore_spec.rb +0 -206
  611. data/spec/extensions/pg_inet_ops_spec.rb +0 -101
  612. data/spec/extensions/pg_inet_spec.rb +0 -52
  613. data/spec/extensions/pg_interval_spec.rb +0 -76
  614. data/spec/extensions/pg_json_ops_spec.rb +0 -275
  615. data/spec/extensions/pg_json_spec.rb +0 -218
  616. data/spec/extensions/pg_loose_count_spec.rb +0 -17
  617. data/spec/extensions/pg_range_ops_spec.rb +0 -58
  618. data/spec/extensions/pg_range_spec.rb +0 -473
  619. data/spec/extensions/pg_row_ops_spec.rb +0 -60
  620. data/spec/extensions/pg_row_plugin_spec.rb +0 -62
  621. data/spec/extensions/pg_row_spec.rb +0 -360
  622. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
  623. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
  624. data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
  625. data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
  626. data/spec/extensions/prepared_statements_spec.rb +0 -103
  627. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
  628. data/spec/extensions/pretty_table_spec.rb +0 -92
  629. data/spec/extensions/query_literals_spec.rb +0 -183
  630. data/spec/extensions/query_spec.rb +0 -102
  631. data/spec/extensions/rcte_tree_spec.rb +0 -392
  632. data/spec/extensions/round_timestamps_spec.rb +0 -43
  633. data/spec/extensions/schema_caching_spec.rb +0 -41
  634. data/spec/extensions/schema_dumper_spec.rb +0 -814
  635. data/spec/extensions/schema_spec.rb +0 -117
  636. data/spec/extensions/scissors_spec.rb +0 -26
  637. data/spec/extensions/select_remove_spec.rb +0 -38
  638. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
  639. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  640. data/spec/extensions/serialization_spec.rb +0 -362
  641. data/spec/extensions/server_block_spec.rb +0 -90
  642. data/spec/extensions/server_logging_spec.rb +0 -45
  643. data/spec/extensions/set_overrides_spec.rb +0 -61
  644. data/spec/extensions/sharding_spec.rb +0 -198
  645. data/spec/extensions/shared_caching_spec.rb +0 -175
  646. data/spec/extensions/single_table_inheritance_spec.rb +0 -297
  647. data/spec/extensions/singular_table_names_spec.rb +0 -22
  648. data/spec/extensions/skip_create_refresh_spec.rb +0 -17
  649. data/spec/extensions/spec_helper.rb +0 -71
  650. data/spec/extensions/split_array_nil_spec.rb +0 -24
  651. data/spec/extensions/split_values_spec.rb +0 -22
  652. data/spec/extensions/sql_comments_spec.rb +0 -27
  653. data/spec/extensions/sql_expr_spec.rb +0 -60
  654. data/spec/extensions/static_cache_spec.rb +0 -361
  655. data/spec/extensions/string_agg_spec.rb +0 -85
  656. data/spec/extensions/string_date_time_spec.rb +0 -95
  657. data/spec/extensions/string_stripper_spec.rb +0 -68
  658. data/spec/extensions/subclasses_spec.rb +0 -66
  659. data/spec/extensions/subset_conditions_spec.rb +0 -38
  660. data/spec/extensions/table_select_spec.rb +0 -71
  661. data/spec/extensions/tactical_eager_loading_spec.rb +0 -136
  662. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  663. data/spec/extensions/timestamps_spec.rb +0 -175
  664. data/spec/extensions/to_dot_spec.rb +0 -154
  665. data/spec/extensions/touch_spec.rb +0 -203
  666. data/spec/extensions/tree_spec.rb +0 -274
  667. data/spec/extensions/typecast_on_load_spec.rb +0 -80
  668. data/spec/extensions/unlimited_update_spec.rb +0 -20
  669. data/spec/extensions/update_or_create_spec.rb +0 -87
  670. data/spec/extensions/update_primary_key_spec.rb +0 -100
  671. data/spec/extensions/update_refresh_spec.rb +0 -53
  672. data/spec/extensions/uuid_spec.rb +0 -106
  673. data/spec/extensions/validate_associated_spec.rb +0 -52
  674. data/spec/extensions/validation_class_methods_spec.rb +0 -1027
  675. data/spec/extensions/validation_helpers_spec.rb +0 -554
  676. data/spec/extensions/xml_serializer_spec.rb +0 -207
  677. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  678. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  679. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  680. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  681. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  682. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  683. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  684. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  685. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  686. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  687. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  688. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  689. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  690. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  691. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  692. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  693. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  694. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  695. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  696. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  697. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  698. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  699. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  700. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  701. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  702. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  703. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  704. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  705. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  706. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  707. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  708. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  709. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  710. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  711. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  712. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  713. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  714. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  715. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  716. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  717. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  718. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  719. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  720. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  721. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  722. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  723. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  724. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  725. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  726. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  727. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  728. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  729. data/spec/guards_helper.rb +0 -55
  730. data/spec/integration/associations_test.rb +0 -2506
  731. data/spec/integration/database_test.rb +0 -113
  732. data/spec/integration/dataset_test.rb +0 -1858
  733. data/spec/integration/eager_loader_test.rb +0 -687
  734. data/spec/integration/migrator_test.rb +0 -262
  735. data/spec/integration/model_test.rb +0 -230
  736. data/spec/integration/plugin_test.rb +0 -2297
  737. data/spec/integration/prepared_statement_test.rb +0 -467
  738. data/spec/integration/schema_test.rb +0 -815
  739. data/spec/integration/spec_helper.rb +0 -56
  740. data/spec/integration/timezone_test.rb +0 -86
  741. data/spec/integration/transaction_test.rb +0 -406
  742. data/spec/integration/type_test.rb +0 -133
  743. data/spec/model/association_reflection_spec.rb +0 -565
  744. data/spec/model/associations_spec.rb +0 -4589
  745. data/spec/model/base_spec.rb +0 -759
  746. data/spec/model/class_dataset_methods_spec.rb +0 -150
  747. data/spec/model/dataset_methods_spec.rb +0 -149
  748. data/spec/model/eager_loading_spec.rb +0 -2197
  749. data/spec/model/hooks_spec.rb +0 -604
  750. data/spec/model/inflector_spec.rb +0 -26
  751. data/spec/model/model_spec.rb +0 -1097
  752. data/spec/model/plugins_spec.rb +0 -299
  753. data/spec/model/record_spec.rb +0 -2162
  754. data/spec/model/spec_helper.rb +0 -46
  755. data/spec/model/validations_spec.rb +0 -193
  756. data/spec/model_no_assoc_spec.rb +0 -1
  757. data/spec/model_spec.rb +0 -1
  758. data/spec/plugin_spec.rb +0 -1
  759. data/spec/sequel_coverage.rb +0 -15
  760. data/spec/spec_config.rb +0 -10
@@ -1,688 +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#insert_conflict" do
375
- before(:all) do
376
- DB.create_table! :ic_test do
377
- primary_key :id
378
- String :name
379
- end
380
- end
381
-
382
- after(:each) do
383
- DB[:ic_test].delete
384
- end
385
-
386
- after(:all) do
387
- DB.drop_table?(:ic_test)
388
- end
389
-
390
- it "Dataset#insert_ignore and insert_constraint should ignore uniqueness violations" do
391
- DB[:ic_test].insert(:id => 1, :name => "one")
392
- proc {DB[:ic_test].insert(:id => 1, :name => "one")}.must_raise Sequel::ConstraintViolation
393
-
394
- DB[:ic_test].insert_ignore.insert(:id => 1, :name => "one")
395
- DB[:ic_test].all.must_equal([{:id => 1, :name => "one"}])
396
-
397
- DB[:ic_test].insert_conflict(:ignore).insert(:id => 1, :name => "one")
398
- DB[:ic_test].all.must_equal([{:id => 1, :name => "one"}])
399
- end
400
-
401
- it "Dataset#insert_constraint should handle replacement" do
402
- DB[:ic_test].insert(:id => 1, :name => "one")
403
-
404
- DB[:ic_test].insert_conflict(:replace).insert(:id => 1, :name => "two")
405
- DB[:ic_test].all.must_equal([{:id => 1, :name => "two"}])
406
- end
407
- end
408
-
409
- describe "SQLite dataset" do
410
- before do
411
- DB.create_table! :test do
412
- primary_key :id
413
- String :name
414
- Float :value
415
- end
416
- DB.create_table! :items do
417
- primary_key :id
418
- String :name
419
- Float :value
420
- end
421
- @d = DB[:items]
422
- @d << {:name => 'abc', :value => 1.23}
423
- @d << {:name => 'def', :value => 4.56}
424
- @d << {:name => 'ghi', :value => 7.89}
425
- end
426
- after do
427
- DB.drop_table?(:test, :items)
428
- end
429
-
430
- it "should be able to insert from a subquery" do
431
- DB[:test] << @d
432
- DB[:test].count.must_equal 3
433
- DB[:test].select(:name, :value).order(:value).to_a.must_equal \
434
- @d.select(:name, :value).order(:value).to_a
435
- end
436
-
437
- it "should support #explain" do
438
- DB[:test].explain.must_be_kind_of(String)
439
- end
440
-
441
- it "should have #explain work when identifier_output_method is modified" do
442
- ds = DB[:test]
443
- ds.identifier_output_method = :upcase
444
- ds.explain.must_be_kind_of(String)
445
- end
446
- end
447
-
448
- describe "A SQLite database" do
449
- before do
450
- @db = DB
451
- @db.create_table! :test2 do
452
- text :name
453
- integer :value
454
- end
455
- end
456
- after do
457
- @db.drop_table?(:test2)
458
- end
459
-
460
- it "should support add_column operations" do
461
- @db.add_column :test2, :xyz, :text
462
-
463
- @db[:test2].columns.must_equal [:name, :value, :xyz]
464
- @db[:test2] << {:name => 'mmm', :value => 111, :xyz=>'000'}
465
- @db[:test2].first.must_equal(:name => 'mmm', :value => 111, :xyz=>'000')
466
- end
467
-
468
- it "should support drop_column operations" do
469
- @db.drop_column :test2, :value
470
- @db[:test2].columns.must_equal [:name]
471
- @db[:test2] << {:name => 'mmm'}
472
- @db[:test2].first.must_equal(:name => 'mmm')
473
- end
474
-
475
- it "should support drop_column operations in a transaction" do
476
- @db.transaction{@db.drop_column :test2, :value}
477
- @db[:test2].columns.must_equal [:name]
478
- @db[:test2] << {:name => 'mmm'}
479
- @db[:test2].first.must_equal(:name => 'mmm')
480
- end
481
-
482
- it "should keep a composite primary key when dropping columns" do
483
- @db.create_table!(:test2){Integer :a; Integer :b; Integer :c; primary_key [:a, :b]}
484
- @db.drop_column :test2, :c
485
- @db[:test2].columns.must_equal [:a, :b]
486
- @db[:test2] << {:a=>1, :b=>2}
487
- @db[:test2] << {:a=>2, :b=>3}
488
- proc{@db[:test2] << {:a=>2, :b=>3}}.must_raise(Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
489
- end
490
-
491
- it "should keep column attributes when dropping a column" do
492
- @db.create_table! :test3 do
493
- primary_key :id
494
- text :name
495
- integer :value
496
- end
497
-
498
- # This lame set of additions and deletions are to test that the primary keys
499
- # don't get messed up when we recreate the database.
500
- @db[:test3] << { :name => "foo", :value => 1}
501
- @db[:test3] << { :name => "foo", :value => 2}
502
- @db[:test3] << { :name => "foo", :value => 3}
503
- @db[:test3].filter(:id => 2).delete
504
-
505
- @db.drop_column :test3, :value
506
-
507
- @db['PRAGMA table_info(?)', :test3][:id][:pk].to_i.must_equal 1
508
- @db[:test3].select(:id).all.must_equal [{:id => 1}, {:id => 3}]
509
- end
510
-
511
- if DB.foreign_keys
512
- it "should keep foreign keys when dropping a column" do
513
- @db.create_table! :test do
514
- primary_key :id
515
- String :name
516
- Integer :value
517
- end
518
- @db.create_table! :test3 do
519
- String :name
520
- Integer :value
521
- foreign_key :test_id, :test, :on_delete => :set_null, :on_update => :cascade
522
- end
523
-
524
- @db[:test3].insert(:name => "abc", :test_id => @db[:test].insert(:name => "foo", :value => 3))
525
- @db[:test3].insert(:name => "def", :test_id => @db[:test].insert(:name => "bar", :value => 4))
526
-
527
- @db.drop_column :test3, :value
528
-
529
- @db[:test].filter(:name => 'bar').delete
530
- @db[:test3][:name => 'def'][:test_id].must_equal nil
531
-
532
- @db[:test].filter(:name => 'foo').update(:id=>100)
533
- @db[:test3][:name => 'abc'][:test_id].must_equal 100
534
-
535
- @db.drop_table? :test, :test3
536
- end
537
- end
538
-
539
- it "should support rename_column operations" do
540
- @db[:test2].delete
541
- @db.add_column :test2, :xyz, :text
542
- @db[:test2] << {:name => 'mmm', :value => 111, :xyz => 'qqqq'}
543
-
544
- @db[:test2].columns.must_equal [:name, :value, :xyz]
545
- @db.rename_column :test2, :xyz, :zyx, :type => :text
546
- @db[:test2].columns.must_equal [:name, :value, :zyx]
547
- @db[:test2].first[:zyx].must_equal 'qqqq'
548
- @db[:test2].count.must_equal 1
549
- end
550
-
551
- it "should preserve defaults when dropping or renaming columns" do
552
- @db.create_table! :test3 do
553
- String :s, :default=>'a'
554
- Integer :i
555
- end
556
-
557
- @db[:test3].insert
558
- @db[:test3].first[:s].must_equal 'a'
559
- @db[:test3].delete
560
- @db.drop_column :test3, :i
561
- @db[:test3].insert
562
- @db[:test3].first[:s].must_equal 'a'
563
- @db[:test3].delete
564
- @db.rename_column :test3, :s, :t
565
- @db[:test3].insert
566
- @db[:test3].first[:t].must_equal 'a'
567
- @db[:test3].delete
568
- end
569
-
570
- it "should handle quoted tables when dropping or renaming columns" do
571
- @db.quote_identifiers = true
572
- table_name = "T T"
573
- @db.drop_table?(table_name)
574
- @db.create_table! table_name do
575
- Integer :"s s"
576
- Integer :"i i"
577
- end
578
-
579
- @db.from(table_name).insert(:"s s"=>1, :"i i"=>2)
580
- @db.from(table_name).all.must_equal [{:"s s"=>1, :"i i"=>2}]
581
- @db.drop_column table_name, :"i i"
582
- @db.from(table_name).all.must_equal [{:"s s"=>1}]
583
- @db.rename_column table_name, :"s s", :"t t"
584
- @db.from(table_name).all.must_equal [{:"t t"=>1}]
585
- @db.drop_table?(table_name)
586
- end
587
-
588
- it "should choose a temporary table name that isn't already used when dropping or renaming columns" do
589
- sqls = []
590
- @db.loggers << (l=Class.new{%w'info error'.each{|m| define_method(m){|sql| sqls << sql}}}.new)
591
- @db.tables.each{|t| @db.drop_table(t) if t.to_s =~ /test3/}
592
- @db.create_table :test3 do
593
- Integer :h
594
- Integer :i
595
- end
596
- @db.create_table :test3_backup0 do
597
- Integer :j
598
- end
599
- @db.create_table :test3_backup1 do
600
- Integer :k
601
- end
602
-
603
- @db[:test3].columns.must_equal [:h, :i]
604
- @db[:test3_backup0].columns.must_equal [:j]
605
- @db[:test3_backup1].columns.must_equal [:k]
606
- sqls.clear
607
- @db.drop_column(:test3, :i)
608
- sqls.any?{|x| x =~ /\AALTER TABLE.*test3.*RENAME TO.*test3_backup2/}.must_equal true
609
- sqls.any?{|x| x =~ /\AALTER TABLE.*test3.*RENAME TO.*test3_backup[01]/}.must_equal false
610
- @db[:test3].columns.must_equal [:h]
611
- @db[:test3_backup0].columns.must_equal [:j]
612
- @db[:test3_backup1].columns.must_equal [:k]
613
-
614
- @db.create_table :test3_backup2 do
615
- Integer :l
616
- end
617
-
618
- sqls.clear
619
- @db.rename_column(:test3, :h, :i)
620
- sqls.any?{|x| x =~ /\AALTER TABLE.*test3.*RENAME TO.*test3_backup3/}.must_equal true
621
- sqls.any?{|x| x =~ /\AALTER TABLE.*test3.*RENAME TO.*test3_backup[012]/}.must_equal false
622
- @db[:test3].columns.must_equal [:i]
623
- @db[:test3_backup0].columns.must_equal [:j]
624
- @db[:test3_backup1].columns.must_equal [:k]
625
- @db[:test3_backup2].columns.must_equal [:l]
626
- @db.loggers.delete(l)
627
- @db.drop_table?(:test3, :test3_backup0, :test3_backup1, :test3_backup2)
628
- end
629
-
630
- it "should support add_index" do
631
- @db.add_index :test2, :value, :unique => true
632
- @db.add_index :test2, [:name, :value]
633
- end
634
-
635
- it "should support drop_index" do
636
- @db.add_index :test2, :value, :unique => true
637
- @db.drop_index :test2, :value
638
- end
639
-
640
- it "should keep applicable indexes when emulating schema methods" do
641
- @db.create_table!(:a){Integer :a; Integer :b}
642
- @db.add_index :a, :a
643
- @db.add_index :a, :b
644
- @db.add_index :a, [:b, :a]
645
- @db.drop_column :a, :b
646
- @db.indexes(:a).must_equal(:a_a_index=>{:unique=>false, :columns=>[:a]})
647
- end
648
-
649
- it "should have support for various #transaction modes" do
650
- sqls = []
651
- @db.loggers << Class.new{%w'info error'.each{|m| define_method(m){|sql| sqls << sql}}}.new
652
-
653
- @db.transaction(:mode => :immediate) do
654
- sqls.last.must_equal "BEGIN IMMEDIATE TRANSACTION"
655
- end
656
- @db.transaction(:mode => :exclusive) do
657
- sqls.last.must_equal "BEGIN EXCLUSIVE TRANSACTION"
658
- end
659
- @db.transaction(:mode => :deferred) do
660
- sqls.last.must_equal "BEGIN DEFERRED TRANSACTION"
661
- end
662
- @db.transaction do
663
- sqls.last.must_equal Sequel::Database::SQL_BEGIN
664
- end
665
-
666
- @db.transaction_mode.must_equal nil
667
- @db.transaction_mode = :immediate
668
- @db.transaction_mode.must_equal :immediate
669
- @db.transaction do
670
- sqls.last.must_equal "BEGIN IMMEDIATE TRANSACTION"
671
- end
672
- @db.transaction(:mode => :exclusive) do
673
- sqls.last.must_equal "BEGIN EXCLUSIVE TRANSACTION"
674
- end
675
-
676
- proc {@db.transaction_mode = :invalid}.must_raise(Sequel::Error)
677
-
678
- @db.transaction_mode.must_equal :immediate
679
- proc {@db.transaction(:mode => :invalid) {}}.must_raise(Sequel::Error)
680
- end
681
-
682
- it "should keep unique constraints when copying tables" do
683
- @db.alter_table(:test2){add_unique_constraint :name}
684
- @db.alter_table(:test2){drop_column :value}
685
- @db[:test2].insert(:name=>'a')
686
- proc{@db[:test2].insert(:name=>'a')}.must_raise(Sequel::ConstraintViolation, Sequel::UniqueConstraintViolation)
687
- end
688
- end