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,815 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
2
-
3
- describe "Database schema parser" do
4
- before do
5
- @iom = DB.identifier_output_method
6
- @iim = DB.identifier_input_method
7
- @qi = DB.quote_identifiers?
8
- end
9
- after do
10
- DB.identifier_output_method = @iom
11
- DB.identifier_input_method = @iim
12
- DB.quote_identifiers = @qi
13
- DB.drop_table?(:items)
14
- end
15
-
16
- it "should handle a database with a identifier methods" do
17
- DB.identifier_output_method = :reverse
18
- DB.identifier_input_method = :reverse
19
- DB.quote_identifiers = true
20
- DB.create_table!(:items){Integer :number}
21
- begin
22
- DB.schema(:items, :reload=>true).must_be_kind_of(Array)
23
- DB.schema(:items, :reload=>true).first.first.must_equal :number
24
- ensure
25
- DB.drop_table(:items)
26
- end
27
- end
28
-
29
- it "should handle a dataset with identifier methods different than the database's" do
30
- DB.identifier_output_method = :reverse
31
- DB.identifier_input_method = :reverse
32
- DB.quote_identifiers = true
33
- DB.create_table!(:items){Integer :number}
34
- DB.identifier_output_method = @iom
35
- DB.identifier_input_method = @iim
36
- ds = DB[:items]
37
- ds.identifier_output_method = :reverse
38
- ds.identifier_input_method = :reverse
39
- begin
40
- DB.schema(ds, :reload=>true).must_be_kind_of(Array)
41
- DB.schema(ds, :reload=>true).first.first.must_equal :number
42
- ensure
43
- DB.identifier_output_method = :reverse
44
- DB.identifier_input_method = :reverse
45
- DB.drop_table(:items)
46
- end
47
- end
48
-
49
- it "should not issue an sql query if the schema has been loaded unless :reload is true" do
50
- DB.create_table!(:items){Integer :number}
51
- DB.schema(:items, :reload=>true)
52
- DB.schema(:items)
53
- DB.schema(:items, :reload=>true)
54
- end
55
-
56
- it "Model schema should include columns in the table, even if they aren't selected" do
57
- DB.create_table!(:items){String :a; Integer :number}
58
- m = Sequel::Model(DB[:items].select(:a))
59
- m.columns.must_equal [:a]
60
- m.db_schema[:number][:type].must_equal :integer
61
- end
62
-
63
- it "should raise an error when the table doesn't exist" do
64
- proc{DB.schema(:no_table)}.must_raise(Sequel::Error, Sequel::DatabaseError)
65
- end
66
-
67
- it "should return the schema correctly" do
68
- DB.create_table!(:items){Integer :number}
69
- schema = DB.schema(:items, :reload=>true)
70
- schema.must_be_kind_of(Array)
71
- schema.length.must_equal 1
72
- col = schema.first
73
- col.must_be_kind_of(Array)
74
- col.length.must_equal 2
75
- col.first.must_equal :number
76
- col_info = col.last
77
- col_info.must_be_kind_of(Hash)
78
- col_info[:type].must_equal :integer
79
- DB.schema(:items)
80
- end
81
-
82
- it "should parse primary keys from the schema properly" do
83
- DB.create_table!(:items){Integer :number}
84
- DB.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.must_equal []
85
- DB.create_table!(:items){primary_key :number}
86
- DB.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.must_equal [:number]
87
- DB.create_table!(:items){Integer :number1; Integer :number2; primary_key [:number1, :number2]}
88
- DB.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.must_equal [:number1, :number2]
89
- end
90
-
91
- cspecify "should parse autoincrementing primary keys from the schema properly", :sqlite, :oracle do
92
- DB.create_table!(:items){Integer :number}
93
- DB.schema(:items).collect{|k,v| k if v[:primary_key] && v[:auto_increment]}.compact.must_equal []
94
- DB.create_table!(:items){primary_key :number}
95
- DB.schema(:items).collect{|k,v| k if v[:primary_key] && v[:auto_increment]}.compact.must_equal [:number]
96
- DB.create_table!(:items){Integer :number, :primary_key=>true}
97
- DB.schema(:items).collect{|k,v| k if v[:primary_key] && v[:auto_increment]}.compact.must_equal []
98
- end
99
-
100
- it "should parse NULL/NOT NULL from the schema properly" do
101
- DB.create_table!(:items){Integer :number, :null=>true}
102
- DB.schema(:items).first.last[:allow_null].must_equal true
103
- DB.create_table!(:items){Integer :number, :null=>false}
104
- DB.schema(:items).first.last[:allow_null].must_equal false
105
- end
106
-
107
- it "should parse defaults from the schema properly" do
108
- DB.create_table!(:items){Integer :number}
109
- DB.schema(:items).first.last[:ruby_default].must_equal nil
110
- DB.create_table!(:items){Integer :number, :default=>0}
111
- DB.schema(:items).first.last[:ruby_default].must_equal 0
112
- DB.create_table!(:items){String :a, :default=>"blah"}
113
- DB.schema(:items).first.last[:ruby_default].must_equal 'blah'
114
- end
115
-
116
- it "should make :default nil for a NULL default" do
117
- DB.create_table!(:items){Integer :number}
118
- DB.schema(:items).first.last[:default].must_equal nil
119
- DB.create_table!(:items){Integer :number, :default=>0}
120
- DB.schema(:items).first.last[:default].wont_equal nil
121
- end
122
-
123
- it "should parse current timestamp defaults from the schema properly" do
124
- DB.create_table!(:items){Time :a, :default=>Sequel::CURRENT_TIMESTAMP}
125
- DB.schema(:items).first.last[:ruby_default].must_equal Sequel::CURRENT_TIMESTAMP
126
- end
127
-
128
- cspecify "should parse current date defaults from the schema properly", :mysql, :oracle do
129
- DB.create_table!(:items){Date :a, :default=>Sequel::CURRENT_DATE}
130
- DB.schema(:items).first.last[:ruby_default].must_equal Sequel::CURRENT_DATE
131
- end
132
-
133
- cspecify "should parse types from the schema properly", [:jdbc, :db2], :oracle do
134
- DB.create_table!(:items){Integer :number}
135
- DB.schema(:items).first.last[:type].must_equal :integer
136
- DB.create_table!(:items){Fixnum :number}
137
- DB.schema(:items).first.last[:type].must_equal :integer
138
- DB.create_table!(:items){Bignum :number}
139
- DB.schema(:items).first.last[:type].must_equal :integer
140
- DB.create_table!(:items){Float :number}
141
- DB.schema(:items).first.last[:type].must_equal :float
142
- DB.create_table!(:items){BigDecimal :number, :size=>[11, 2]}
143
- DB.schema(:items).first.last[:type].must_equal :decimal
144
- DB.create_table!(:items){Numeric :number, :size=>[12, 0]}
145
- DB.schema(:items).first.last[:type].must_equal :integer
146
- DB.create_table!(:items){String :number}
147
- DB.schema(:items).first.last[:type].must_equal :string
148
- DB.create_table!(:items){Date :number}
149
- DB.schema(:items).first.last[:type].must_equal :date
150
- DB.create_table!(:items){Time :number}
151
- DB.schema(:items).first.last[:type].must_equal :datetime
152
- DB.create_table!(:items){DateTime :number}
153
- DB.schema(:items).first.last[:type].must_equal :datetime
154
- DB.create_table!(:items){File :number}
155
- DB.schema(:items).first.last[:type].must_equal :blob
156
- DB.create_table!(:items){TrueClass :number}
157
- DB.schema(:items).first.last[:type].must_equal :boolean
158
- DB.create_table!(:items){FalseClass :number}
159
- DB.schema(:items).first.last[:type].must_equal :boolean
160
- end
161
-
162
- it "should round trip database types from the schema properly" do
163
- DB.create_table!(:items){String :number, :size=>50}
164
- db_type = DB.schema(:items).first.last[:db_type]
165
- DB.create_table!(:items){column :number, db_type}
166
- DB.schema(:items).first.last[:db_type].must_equal db_type
167
-
168
- DB.create_table!(:items){Numeric :number, :size=>[11,3]}
169
- db_type = DB.schema(:items).first.last[:db_type]
170
- DB.create_table!(:items){column :number, db_type}
171
- DB.schema(:items).first.last[:db_type].must_equal db_type
172
- end
173
-
174
- it "should parse maximum length for string columns" do
175
- DB.create_table!(:items){String :a, :size=>4}
176
- DB.schema(:items).first.last[:max_length].must_equal 4
177
- DB.create_table!(:items){String :a, :fixed=>true, :size=>3}
178
- DB.schema(:items).first.last[:max_length].must_equal 3
179
- end
180
- end if DB.supports_schema_parsing?
181
-
182
- describe "Database index parsing" do
183
- after do
184
- DB.drop_table?(:items)
185
- end
186
-
187
- it "should parse indexes into a hash" do
188
- # Delete :deferrable entry, since not all adapters implement it
189
- f = lambda{h = DB.indexes(:items); h.values.each{|h2| h2.delete(:deferrable)}; h}
190
-
191
- DB.create_table!(:items){Integer :n; Integer :a}
192
- f.call.must_equal({})
193
- DB.add_index(:items, :n)
194
- f.call.must_equal(:items_n_index=>{:columns=>[:n], :unique=>false})
195
- DB.drop_index(:items, :n)
196
- f.call.must_equal({})
197
- DB.add_index(:items, :n, :unique=>true, :name=>:blah_blah_index)
198
- f.call.must_equal(:blah_blah_index=>{:columns=>[:n], :unique=>true})
199
- DB.add_index(:items, [:n, :a])
200
- f.call.must_equal(:blah_blah_index=>{:columns=>[:n], :unique=>true}, :items_n_a_index=>{:columns=>[:n, :a], :unique=>false})
201
- DB.drop_index(:items, :n, :name=>:blah_blah_index)
202
- f.call.must_equal(:items_n_a_index=>{:columns=>[:n, :a], :unique=>false})
203
- DB.drop_index(:items, [:n, :a])
204
- f.call.must_equal({})
205
- end
206
-
207
- it "should not include a primary key index" do
208
- DB.create_table!(:items){primary_key :n}
209
- DB.indexes(:items).must_equal({})
210
- DB.create_table!(:items){Integer :n; Integer :a; primary_key [:n, :a]}
211
- DB.indexes(:items).must_equal({})
212
- end
213
-
214
- cspecify "should not include partial indexes", :sqlite do
215
- DB.create_table!(:items){Integer :n; Integer :a; index :n, :where=>proc{n > 10}}
216
- DB.indexes(:items).must_equal({})
217
- end if DB.supports_partial_indexes?
218
- end if DB.supports_index_parsing?
219
-
220
- describe "Database foreign key parsing" do
221
- before do
222
- @db = DB
223
- @pr = lambda do |table, *expected|
224
- actual = @db.foreign_key_list(table).sort_by{|c| c[:columns].map{|s| s.to_s}.join << (c[:key]||[]).map{|s| s.to_s}.join}.map{|v| v.values_at(:columns, :table, :key)}
225
- actual.zip(expected).each do |a, e|
226
- if e.last.first == :pk
227
- if a.last == nil
228
- a.pop
229
- e.pop
230
- else
231
- e.last.shift
232
- end
233
- end
234
- a.must_equal e
235
- end
236
- actual.length.must_equal expected.length
237
- end
238
- end
239
- after do
240
- @db.drop_table?(:b, :a)
241
- end
242
-
243
- it "should parse foreign key information into an array of hashes" do
244
- @db.create_table!(:a, :engine=>:InnoDB){primary_key :c; Integer :d, :null => false, :unique => true}
245
- @db.create_table!(:b, :engine=>:InnoDB){foreign_key :e, :a}
246
- @pr[:a]
247
- @pr[:b, [[:e], :a, [:pk, :c]]]
248
-
249
- @db.alter_table(:b){add_foreign_key :f, :a, :key=>[:d]}
250
- @pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:d]]]
251
-
252
- @db.alter_table(:b){add_foreign_key [:f], :a, :key=>[:c]}
253
- @pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:c]], [[:f], :a, [:d]]]
254
-
255
- @db.alter_table(:a){add_unique_constraint [:d, :c]}
256
- @db.alter_table(:b){add_foreign_key [:f, :e], :a, :key=>[:d, :c]}
257
- @pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:c]], [[:f], :a, [:d]], [[:f, :e], :a, [:d, :c]]]
258
-
259
- @db.alter_table(:b){drop_foreign_key [:f, :e]}
260
- @pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:c]], [[:f], :a, [:d]]]
261
-
262
- @db.alter_table(:b){drop_foreign_key :e}
263
- @pr[:b, [[:f], :a, [:c]], [[:f], :a, [:d]]]
264
-
265
- proc{@db.alter_table(:b){drop_foreign_key :f}}.must_raise(Sequel::Error, Sequel::DatabaseError)
266
- @pr[:b, [[:f], :a, [:c]], [[:f], :a, [:d]]]
267
- end
268
-
269
- it "should handle composite foreign and primary keys" do
270
- @db.create_table!(:a, :engine=>:InnoDB){Integer :b, :null=>false; Integer :c, :null=>false; Integer :d, :null=>false; primary_key [:b, :c]; unique [:d, :c]}
271
- @db.create_table!(:b, :engine=>:InnoDB){Integer :e, :null=>false; Integer :f, :null=>false; Integer :g, :null=>false; foreign_key [:e, :f], :a; foreign_key [:g, :f], :a, :key=>[:d, :c]}
272
- @pr[:b, [[:e, :f], :a, [:pk, :b, :c]], [[:g, :f], :a, [:d, :c]]]
273
- end
274
-
275
- it "should handle self-referential composite foreign and primary keys" do
276
- @db.create_table!(:a, :engine=>:InnoDB){Integer :b, :null=>false; Integer :c, :null=>false; Integer :d, :null=>false; primary_key [:b, :c]; unique [:d, :b]}
277
- @db.alter_table(:a){add_foreign_key [:b, :d], :a; add_foreign_key [:d, :c], :a; add_foreign_key [:c, :b], :a, :key=>[:d, :b]}
278
- @pr[:a, [[:b, :d], :a, [:pk, :b, :c]], [[:c, :b], :a, [:d, :b]], [[:d, :c], :a, [:pk, :b, :c]]]
279
- end
280
- end if DB.supports_foreign_key_parsing?
281
-
282
- describe "Database schema modifiers" do
283
- before do
284
- @db = DB
285
- @ds = @db[:items]
286
- end
287
- after do
288
- # Use instead of drop_table? to work around issues on jdbc/db2
289
- @db.drop_table(:items) rescue nil
290
- @db.drop_table(:items2) rescue nil
291
- end
292
-
293
- it "should create tables correctly" do
294
- @db.create_table!(:items){Integer :number}
295
- @db.table_exists?(:items).must_equal true
296
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:number]
297
- @ds.insert([10])
298
- @ds.columns!.must_equal [:number]
299
- end
300
-
301
- it "should create tables from select statements correctly" do
302
- @db.create_table!(:items){Integer :number}
303
- @ds.insert([10])
304
- @db.create_table(:items2, :as=>@db[:items])
305
- @db.schema(:items2, :reload=>true).map{|x| x.first}.must_equal [:number]
306
- @db[:items2].columns.must_equal [:number]
307
- @db[:items2].all.must_equal [{:number=>10}]
308
- end
309
-
310
- it "should not raise an error if table doesn't exist when using drop_table :if_exists" do
311
- @db.drop_table(:items, :if_exists=>true)
312
- end if DB.supports_drop_table_if_exists?
313
-
314
- describe "views" do
315
- before do
316
- @db.drop_view(:items_view2) rescue nil
317
- @db.drop_view(:items_view) rescue nil
318
- @db.create_table!(:items){Integer :number}
319
- @ds.insert(:number=>1)
320
- @ds.insert(:number=>2)
321
- end
322
- after do
323
- @db.drop_view(:items_view2) rescue nil
324
- @db.drop_view(:items_view) rescue nil
325
- end
326
-
327
- it "should create views correctly" do
328
- @db.create_view(:items_view, @ds.where(:number=>1))
329
- @db[:items_view].map(:number).must_equal [1]
330
- end
331
-
332
- it "should create views with check options correctly" do
333
- @db.create_view(:items_view, @ds.where{number > 2}, :check=>true)
334
- proc{@db[:items_view].insert(1)}.must_raise(Sequel::DatabaseError)
335
- @db[:items_view].insert(3)
336
- @db[:items_view].select_order_map(:number).must_equal [3]
337
- @db.create_view(:items_view2, @db[:items_view].where{number > 1}, :check=>true)
338
- proc{@db[:items_view2].insert(1)}.must_raise(Sequel::DatabaseError)
339
- proc{@db[:items_view2].insert(2)}.must_raise(Sequel::DatabaseError)
340
- @db[:items_view2].insert(4)
341
- @db[:items_view2].select_order_map(:number).must_equal [3, 4]
342
- @ds.select_order_map(:number).must_equal [1, 2, 3, 4]
343
- end if DB.supports_views_with_check_option?
344
-
345
- it "should create views with local check options correctly" do
346
- @db.create_view(:items_view, @ds.where{number > 2})
347
- @db[:items_view].insert(3)
348
- @db[:items_view].select_order_map(:number).must_equal [3]
349
- @db.create_view(:items_view2, @db[:items_view].where{number > 1}, :check=>:local)
350
- proc{@db[:items_view2].insert(1)}.must_raise(Sequel::DatabaseError)
351
- @db[:items_view2].insert(2)
352
- @db[:items_view2].insert(4)
353
- @db[:items_view2].select_order_map(:number).must_equal [3, 4]
354
- @ds.select_order_map(:number).must_equal [1, 2, 2, 3, 4]
355
- end if DB.supports_views_with_local_check_option?
356
-
357
- cspecify "should create views with explicit columns correctly", :sqlite do
358
- @db.create_view(:items_view, @ds.where(:number=>1), :columns=>[:n])
359
- @db[:items_view].map(:n).must_equal [1]
360
- end
361
-
362
- it "should drop views correctly" do
363
- @db.create_view(:items_view, @ds.where(:number=>1))
364
- @db.drop_view(:items_view)
365
- proc{@db[:items_view].map(:number)}.must_raise(Sequel::DatabaseError)
366
- end
367
-
368
- it "should not raise an error if view doesn't exist when using drop_view :if_exists" do
369
- @db.drop_view(:items_view, :if_exists=>true)
370
- end if DB.supports_drop_table_if_exists?
371
-
372
- it "should create or replace views correctly" do
373
- @db.create_or_replace_view(:items_view, @ds.where(:number=>1))
374
- @db[:items_view].map(:number).must_equal [1]
375
- @db.create_or_replace_view(:items_view, @ds.where(:number=>2))
376
- @db[:items_view].map(:number).must_equal [2]
377
- end
378
- end
379
-
380
- it "should handle create table in a rolled back transaction" do
381
- @db.drop_table?(:items)
382
- @db.transaction(:rollback=>:always){@db.create_table(:items){Integer :number}}
383
- @db.table_exists?(:items).must_equal false
384
- end if DB.supports_transactional_ddl?
385
-
386
- describe "join tables" do
387
- after do
388
- @db.drop_join_table(:cat_id=>:cats, :dog_id=>:dogs) if @db.table_exists?(:cats_dogs)
389
- @db.drop_table(:cats, :dogs)
390
- @db.table_exists?(:cats_dogs).must_equal false
391
- end
392
-
393
- it "should create join tables correctly" do
394
- @db.create_table!(:cats){primary_key :id}
395
- @db.create_table!(:dogs){primary_key :id}
396
- @db.create_join_table(:cat_id=>:cats, :dog_id=>:dogs)
397
- @db.table_exists?(:cats_dogs).must_equal true
398
- end
399
- end
400
-
401
- it "should create temporary tables without raising an exception" do
402
- @db.create_table!(:items_temp, :temp=>true){Integer :number}
403
- end
404
-
405
- it "should have create_table? only create the table if it doesn't already exist" do
406
- @db.create_table!(:items){String :a}
407
- @db.create_table?(:items){String :b}
408
- @db[:items].columns.must_equal [:a]
409
- @db.drop_table?(:items)
410
- @db.create_table?(:items){String :b}
411
- @db[:items].columns.must_equal [:b]
412
- end
413
-
414
- it "should have create_table? work correctly with indexes" do
415
- @db.create_table!(:items){String :a, :index=>true}
416
- @db.create_table?(:items){String :b, :index=>true}
417
- @db[:items].columns.must_equal [:a]
418
- @db.drop_table?(:items)
419
- @db.create_table?(:items){String :b, :index=>true}
420
- @db[:items].columns.must_equal [:b]
421
- end
422
-
423
- it "should rename tables correctly" do
424
- @db.drop_table?(:items)
425
- @db.create_table!(:items2){Integer :number}
426
- @db.rename_table(:items2, :items)
427
- @db.table_exists?(:items).must_equal true
428
- @db.table_exists?(:items2).must_equal false
429
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:number]
430
- @ds.insert([10])
431
- @ds.columns!.must_equal [:number]
432
- end
433
-
434
- it "should allow creating indexes with tables" do
435
- @db.create_table!(:items){Integer :number; index :number}
436
- @db.table_exists?(:items).must_equal true
437
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:number]
438
- @ds.insert([10])
439
- @ds.columns!.must_equal [:number]
440
- end
441
-
442
- it "should allow creating partial indexes with tables" do
443
- @db.create_table!(:items){Integer :number; index :number, :where=>proc{number > 10}}
444
- @db.table_exists?(:items).must_equal true
445
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:number]
446
- @ds.insert([10])
447
- @ds.columns!.must_equal [:number]
448
- end if DB.supports_partial_indexes?
449
-
450
- it "should handle combination of default, unique, and not null" do
451
- @db.create_table!(:items){Integer :number, :default=>0, :null=>false, :unique=>true}
452
- @db.table_exists?(:items).must_equal true
453
- @db.schema(:items, :reload=>true).map{|x| x.last}.first.values_at(:ruby_default, :allow_null).must_equal [0, false]
454
- @ds.insert([10])
455
- end
456
-
457
- it "should be able to specify constraint names for column constraints" do
458
- @db.create_table!(:items2){primary_key :id, :primary_key_constraint_name=>:foo_pk}
459
- @db.create_table!(:items){foreign_key :id, :items2, :unique=>true, :foreign_key_constraint_name => :foo_fk, :unique_constraint_name => :foo_uk, :null=>false}
460
- @db.alter_table(:items){drop_constraint :foo_fk, :type=>:foreign_key; drop_constraint :foo_uk, :type=>:unique}
461
- @db.alter_table(:items2){drop_constraint :foo_pk, :type=>:primary_key}
462
- end
463
-
464
- it "should handle foreign keys correctly when creating tables" do
465
- @db.create_table!(:items) do
466
- primary_key :id
467
- foreign_key :item_id, :items
468
- unique [:item_id, :id]
469
- foreign_key [:id, :item_id], :items, :key=>[:item_id, :id]
470
- end
471
- @db.table_exists?(:items).must_equal true
472
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :item_id]
473
- @ds.columns!.must_equal [:id, :item_id]
474
- end
475
-
476
- it "should add columns to tables correctly" do
477
- @db.create_table!(:items){Integer :number}
478
- @ds.insert(:number=>10)
479
- @db.alter_table(:items){add_column :name, String}
480
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:number, :name]
481
- @ds.columns!.must_equal [:number, :name]
482
- @ds.all.must_equal [{:number=>10, :name=>nil}]
483
- end
484
-
485
- cspecify "should add primary key columns to tables correctly", :derby do
486
- @db.create_table!(:items){Integer :number}
487
- @ds.insert(:number=>10)
488
- @db.alter_table(:items){add_primary_key :id}
489
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:number, :id]
490
- @ds.columns!.must_equal [:number, :id]
491
- @ds.map(:number).must_equal [10]
492
- proc{@ds.insert(:id=>@ds.map(:id).first)}.must_raise Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError
493
- end
494
-
495
- it "should drop primary key constraints from tables correctly" do
496
- @db.create_table!(:items){Integer :number; primary_key [:number], :name=>:items_pk}
497
- @ds.insert(:number=>10)
498
- @db.alter_table(:items){drop_constraint :items_pk, :type=>:primary_key}
499
- @ds.map(:number).must_equal [10]
500
- @ds.insert(10)
501
- end
502
-
503
- it "should add foreign key columns to tables correctly" do
504
- @db.create_table!(:items){primary_key :id}
505
- @ds.insert
506
- i = @ds.get(:id)
507
- @db.alter_table(:items){add_foreign_key :item_id, :items}
508
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :item_id]
509
- @ds.columns!.must_equal [:id, :item_id]
510
- @ds.all.must_equal [{:id=>i, :item_id=>nil}]
511
- end
512
-
513
- it "should not allow NULLs in a primary key" do
514
- @db.create_table!(:items){String :id, :primary_key=>true}
515
- proc{@ds.insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
516
- end
517
-
518
- it "should rename columns correctly" do
519
- @db.create_table!(:items){Integer :id}
520
- @ds.insert(:id=>10)
521
- @db.alter_table(:items){rename_column :id, :id2}
522
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id2]
523
- @ds.columns!.must_equal [:id2]
524
- @ds.all.must_equal [{:id2=>10}]
525
- end
526
-
527
- it "should rename columns with defaults correctly" do
528
- @db.create_table!(:items){String :n, :default=>'blah'}
529
- @ds.insert
530
- @db.alter_table(:items){rename_column :n, :n2}
531
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:n2]
532
- @ds.columns!.must_equal [:n2]
533
- @ds.insert
534
- @ds.all.must_equal [{:n2=>'blah'}, {:n2=>'blah'}]
535
- end
536
-
537
- it "should rename columns with not null constraints" do
538
- @db.create_table!(:items, :engine=>:InnoDB){String :n, :null=>false}
539
- @ds.insert(:n=>'blah')
540
- @db.alter_table(:items){rename_column :n, :n2}
541
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:n2]
542
- @ds.columns!.must_equal [:n2]
543
- @ds.insert(:n2=>'blah')
544
- @ds.all.must_equal [{:n2=>'blah'}, {:n2=>'blah'}]
545
- proc{@ds.insert(:n=>nil)}.must_raise(Sequel::DatabaseError)
546
- end
547
-
548
- it "should rename columns when the table is referenced by a foreign key" do
549
- @db.create_table!(:items2){primary_key :id; Integer :a}
550
- @db.create_table!(:items){Integer :id, :primary_key=>true; foreign_key :items_id, :items2}
551
- @db[:items2].insert(:a=>10)
552
- @ds.insert(:id=>1)
553
- @db.alter_table(:items2){rename_column :a, :b}
554
- @db[:items2].insert(:b=>20)
555
- @ds.insert(:id=>2)
556
- @db[:items2].select_order_map([:id, :b]).must_equal [[1, 10], [2, 20]]
557
- end
558
-
559
- cspecify "should rename primary_key columns correctly", :db2 do
560
- @db.create_table!(:items){Integer :id, :primary_key=>true}
561
- @ds.insert(:id=>10)
562
- @db.alter_table(:items){rename_column :id, :id2}
563
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id2]
564
- @ds.columns!.must_equal [:id2]
565
- @ds.all.must_equal [{:id2=>10}]
566
- end
567
-
568
- cspecify "should set column NULL/NOT NULL correctly", [:jdbc, :db2], [:db2] do
569
- @db.create_table!(:items, :engine=>:InnoDB){Integer :id}
570
- @ds.insert(:id=>10)
571
- @db.alter_table(:items){set_column_allow_null :id, false}
572
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id]
573
- @ds.columns!.must_equal [:id]
574
- proc{@ds.insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
575
- @db.alter_table(:items){set_column_allow_null :id, true}
576
- @ds.insert(:id=>nil)
577
- @ds.all.must_equal [{:id=>10}, {:id=>nil}]
578
- end
579
-
580
- it "should set column defaults correctly" do
581
- @db.create_table!(:items){Integer :id}
582
- @ds.insert(:id=>10)
583
- @db.alter_table(:items){set_column_default :id, 20}
584
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id]
585
- @ds.columns!.must_equal [:id]
586
- @ds.insert
587
- @ds.all.must_equal [{:id=>10}, {:id=>20}]
588
- end
589
-
590
- cspecify "should set column types correctly", [:jdbc, :db2], [:db2], :oracle do
591
- @db.create_table!(:items){Integer :id}
592
- @ds.insert(:id=>10)
593
- @db.alter_table(:items){set_column_type :id, String}
594
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id]
595
- @ds.columns!.must_equal [:id]
596
- @ds.insert(:id=>'20')
597
- @ds.order(:id).all.must_equal [{:id=>"10"}, {:id=>"20"}]
598
- end
599
-
600
- cspecify "should set column types without modifying NULL/NOT NULL", [:jdbc, :db2], [:db2], :oracle, :derby do
601
- @db.create_table!(:items){Integer :id, :null=>false, :default=>2}
602
- proc{@ds.insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
603
- @db.alter_table(:items){set_column_type :id, String}
604
- proc{@ds.insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
605
-
606
- @db.create_table!(:items){Integer :id}
607
- @ds.insert(:id=>nil)
608
- @db.alter_table(:items){set_column_type :id, String}
609
- @ds.insert(:id=>nil)
610
- @ds.map(:id).must_equal [nil, nil]
611
- end
612
-
613
- cspecify "should set column types without modifying defaults", [:jdbc, :db2], [:db2], :oracle, :derby do
614
- @db.create_table!(:items){Integer :id, :default=>0}
615
- @ds.insert
616
- @ds.map(:id).must_equal [0]
617
- @db.alter_table(:items){set_column_type :id, String}
618
- @ds.insert
619
- @ds.map(:id).must_equal ['0', '0']
620
-
621
- @db.create_table!(:items){String :id, :default=>'a'}
622
- @ds.insert
623
- @ds.map(:id).must_equal %w'a'
624
- @db.alter_table(:items){set_column_type :id, String, :size=>1}
625
- @ds.insert
626
- @ds.map(:id).must_equal %w'a a'
627
- end
628
-
629
- it "should add unnamed unique constraints and foreign key table constraints correctly" do
630
- @db.create_table!(:items, :engine=>:InnoDB){Integer :id, :null => false; Integer :item_id, :null => false}
631
- @db.alter_table(:items) do
632
- add_unique_constraint [:item_id, :id]
633
- add_foreign_key [:id, :item_id], :items, :key=>[:item_id, :id]
634
- end
635
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :item_id]
636
- @ds.columns!.must_equal [:id, :item_id]
637
- @ds.insert(1, 1)
638
- proc{@ds.insert(1, 1)}.must_raise Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError
639
- proc{@ds.insert(1, 2)}.must_raise Sequel::ForeignKeyConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError
640
- end
641
-
642
- it "should add named unique constraints and foreign key table constraints correctly" do
643
- @db.create_table!(:items, :engine=>:InnoDB){Integer :id, :null=>false; Integer :item_id, :null=>false}
644
- @db.alter_table(:items) do
645
- add_unique_constraint [:item_id, :id], :name=>:unique_iii
646
- add_foreign_key [:id, :item_id], :items, :key=>[:item_id, :id], :name=>:fk_iii
647
- end
648
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :item_id]
649
- @ds.columns!.must_equal [:id, :item_id]
650
- @ds.insert(1, 1)
651
- proc{@ds.insert(1, 1)}.must_raise Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError
652
- proc{@ds.insert(1, 2)}.must_raise Sequel::ForeignKeyConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError
653
- end
654
-
655
- it "should drop unique constraints and foreign key table constraints correctly" do
656
- @db.create_table!(:items) do
657
- Integer :id
658
- Integer :item_id
659
- unique [:item_id, :id], :name=>:items_uk
660
- foreign_key [:id, :item_id], :items, :key=>[:item_id, :id], :name=>:items_fk
661
- end
662
- @db.alter_table(:items) do
663
- drop_constraint(:items_fk, :type=>:foreign_key)
664
- drop_constraint(:items_uk, :type=>:unique)
665
- end
666
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :item_id]
667
- @ds.columns!.must_equal [:id, :item_id]
668
- @ds.insert(1, 2)
669
- @ds.insert(1, 2)
670
- end
671
-
672
- it "should remove columns from tables correctly" do
673
- @db.create_table!(:items) do
674
- primary_key :id
675
- Integer :i
676
- end
677
- @ds.insert(:i=>10)
678
- @db.drop_column(:items, :i)
679
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id]
680
- end
681
-
682
- it "should remove columns with defaults from tables correctly" do
683
- @db.create_table!(:items) do
684
- primary_key :id
685
- Integer :i, :default=>20
686
- end
687
- @ds.insert(:i=>10)
688
- @db.drop_column(:items, :i)
689
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id]
690
- end
691
-
692
- it "should remove foreign key columns from tables correctly" do
693
- @db.create_table!(:items, :engine=>:InnoDB) do
694
- primary_key :id
695
- Integer :i
696
- foreign_key :item_id, :items
697
- end
698
- @ds.insert(:i=>10)
699
- @db.alter_table(:items){drop_foreign_key :item_id}
700
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :i]
701
- end if DB.supports_foreign_key_parsing?
702
-
703
- it "should remove multiple columns in a single alter_table block" do
704
- @db.create_table!(:items) do
705
- primary_key :id
706
- String :name
707
- Integer :number
708
- end
709
- @ds.insert(:number=>10)
710
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id, :name, :number]
711
- @db.alter_table(:items) do
712
- drop_column :name
713
- drop_column :number
714
- end
715
- @db.schema(:items, :reload=>true).map{|x| x.first}.must_equal [:id]
716
- end
717
-
718
- cspecify "should work correctly with many operations in a single alter_table call", [:jdbc, :db2], [:db2] do
719
- @db.create_table!(:items) do
720
- primary_key :id
721
- String :name2
722
- String :number2
723
- constraint :bar, Sequel.~(:id=>nil)
724
- end
725
- @ds.insert(:name2=>'A12')
726
- @db.alter_table(:items) do
727
- add_column :number, Integer
728
- drop_column :number2
729
- rename_column :name2, :name
730
- drop_constraint :bar
731
- set_column_not_null :name
732
- set_column_default :name, 'A13'
733
- add_constraint :foo, Sequel.like(:name, 'A%')
734
- end
735
- @db[:items].first.must_equal(:id=>1, :name=>'A12', :number=>nil)
736
- @db[:items].delete
737
- proc{@db[:items].insert(:name=>nil)}.must_raise(Sequel::NotNullConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
738
- @db[:items].insert(:number=>1)
739
- @db[:items].get(:name).must_equal 'A13'
740
- end
741
-
742
- it "should support deferrable foreign key constraints" do
743
- @db.create_table!(:items2){Integer :id, :primary_key=>true}
744
- @db.create_table!(:items){foreign_key :id, :items2, :deferrable=>true}
745
- proc{@db[:items].insert(1)}.must_raise(Sequel::ForeignKeyConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
746
- @db.transaction{proc{@db[:items].insert(1)}}.must_raise(Sequel::ForeignKeyConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
747
- end if DB.supports_deferrable_foreign_key_constraints?
748
-
749
- it "should support deferrable unique constraints when creating or altering tables" do
750
- @db.create_table!(:items){Integer :t; unique [:t], :name=>:atest_def, :deferrable=>true, :using=>:btree}
751
- @db[:items].insert(1)
752
- @db[:items].insert(2)
753
- proc{@db[:items].insert(2)}.must_raise(Sequel::DatabaseError, Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
754
- @db.transaction{proc{@db[:items].insert(2)}}.must_raise(Sequel::DatabaseError, Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
755
-
756
- @db.create_table!(:items){Integer :t}
757
- @db.alter_table(:items){add_unique_constraint [:t], :name=>:atest_def, :deferrable=>true, :using=>:btree}
758
- @db[:items].insert(1)
759
- @db[:items].insert(2)
760
- proc{@db[:items].insert(2)}.must_raise(Sequel::DatabaseError, Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
761
- @db.transaction{proc{@db[:items].insert(2)}}.must_raise(Sequel::DatabaseError, Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
762
- end if DB.supports_deferrable_constraints?
763
- end
764
-
765
- describe "Database#tables and #views" do
766
- before do
767
- class ::String
768
- @@xxxxx = 0
769
- def xxxxx
770
- "xxxxx#{@@xxxxx += 1}"
771
- end
772
- end
773
- @db = DB
774
- @db.drop_view(:sequel_test_view) rescue nil
775
- @db.drop_table?(:sequel_test_table)
776
- @db.create_table(:sequel_test_table){Integer :a}
777
- @db.create_view :sequel_test_view, @db[:sequel_test_table]
778
- @iom = @db.identifier_output_method
779
- @iim = @db.identifier_input_method
780
- end
781
- after do
782
- @db.identifier_output_method = @iom
783
- @db.identifier_input_method = @iim
784
- @db.drop_view :sequel_test_view
785
- @db.drop_table :sequel_test_table
786
- end
787
-
788
- it "#tables should return an array of symbols" do
789
- ts = @db.tables
790
- ts.must_be_kind_of(Array)
791
- ts.each{|t| t.must_be_kind_of(Symbol)}
792
- ts.must_include(:sequel_test_table)
793
- ts.wont_include(:sequel_test_view)
794
- end if DB.supports_table_listing?
795
-
796
- it "#tables should respect the database's identifier_output_method" do
797
- @db.identifier_output_method = :xxxxx
798
- @db.identifier_input_method = :xxxxx
799
- @db.tables.each{|t| t.to_s.must_match(/\Ax{5}\d+\z/)}
800
- end if DB.supports_table_listing?
801
-
802
- it "#views should return an array of symbols" do
803
- ts = @db.views
804
- ts.must_be_kind_of(Array)
805
- ts.each{|t| t.must_be_kind_of(Symbol)}
806
- ts.wont_include(:sequel_test_table)
807
- ts.must_include(:sequel_test_view)
808
- end if DB.supports_view_listing?
809
-
810
- it "#views should respect the database's identifier_output_method" do
811
- @db.identifier_output_method = :xxxxx
812
- @db.identifier_input_method = :xxxxx
813
- @db.views.each{|t| t.to_s.must_match(/\Ax{5}\d+\z/)}
814
- end if DB.supports_view_listing?
815
- end