sequel 4.26.0 → 5.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (692) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +405 -5656
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +232 -157
  5. data/bin/sequel +32 -9
  6. data/doc/advanced_associations.rdoc +252 -188
  7. data/doc/association_basics.rdoc +231 -273
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +75 -48
  10. data/doc/code_order.rdoc +28 -10
  11. data/doc/core_extensions.rdoc +104 -63
  12. data/doc/dataset_basics.rdoc +12 -21
  13. data/doc/dataset_filtering.rdoc +99 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/mass_assignment.rdoc +74 -31
  16. data/doc/migration.rdoc +72 -46
  17. data/doc/model_dataset_method_design.rdoc +129 -0
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +12 -12
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +59 -69
  22. data/doc/opening_databases.rdoc +84 -94
  23. data/doc/postgresql.rdoc +268 -38
  24. data/doc/prepared_statements.rdoc +29 -24
  25. data/doc/querying.rdoc +184 -164
  26. data/doc/reflection.rdoc +5 -6
  27. data/doc/release_notes/5.0.0.txt +159 -0
  28. data/doc/release_notes/5.1.0.txt +31 -0
  29. data/doc/release_notes/5.10.0.txt +84 -0
  30. data/doc/release_notes/5.11.0.txt +83 -0
  31. data/doc/release_notes/5.12.0.txt +141 -0
  32. data/doc/release_notes/5.13.0.txt +27 -0
  33. data/doc/release_notes/5.14.0.txt +63 -0
  34. data/doc/release_notes/5.15.0.txt +39 -0
  35. data/doc/release_notes/5.16.0.txt +110 -0
  36. data/doc/release_notes/5.17.0.txt +31 -0
  37. data/doc/release_notes/5.18.0.txt +69 -0
  38. data/doc/release_notes/5.19.0.txt +28 -0
  39. data/doc/release_notes/5.2.0.txt +33 -0
  40. data/doc/release_notes/5.20.0.txt +89 -0
  41. data/doc/release_notes/5.21.0.txt +87 -0
  42. data/doc/release_notes/5.22.0.txt +48 -0
  43. data/doc/release_notes/5.23.0.txt +56 -0
  44. data/doc/release_notes/5.24.0.txt +56 -0
  45. data/doc/release_notes/5.25.0.txt +32 -0
  46. data/doc/release_notes/5.26.0.txt +35 -0
  47. data/doc/release_notes/5.27.0.txt +21 -0
  48. data/doc/release_notes/5.28.0.txt +16 -0
  49. data/doc/release_notes/5.29.0.txt +22 -0
  50. data/doc/release_notes/5.3.0.txt +121 -0
  51. data/doc/release_notes/5.30.0.txt +20 -0
  52. data/doc/release_notes/5.31.0.txt +148 -0
  53. data/doc/release_notes/5.32.0.txt +46 -0
  54. data/doc/release_notes/5.33.0.txt +24 -0
  55. data/doc/release_notes/5.34.0.txt +40 -0
  56. data/doc/release_notes/5.35.0.txt +56 -0
  57. data/doc/release_notes/5.36.0.txt +60 -0
  58. data/doc/release_notes/5.37.0.txt +30 -0
  59. data/doc/release_notes/5.4.0.txt +80 -0
  60. data/doc/release_notes/5.5.0.txt +61 -0
  61. data/doc/release_notes/5.6.0.txt +31 -0
  62. data/doc/release_notes/5.7.0.txt +108 -0
  63. data/doc/release_notes/5.8.0.txt +170 -0
  64. data/doc/release_notes/5.9.0.txt +99 -0
  65. data/doc/schema_modification.rdoc +102 -77
  66. data/doc/security.rdoc +160 -87
  67. data/doc/sharding.rdoc +74 -47
  68. data/doc/sql.rdoc +135 -122
  69. data/doc/testing.rdoc +34 -18
  70. data/doc/thread_safety.rdoc +2 -4
  71. data/doc/transactions.rdoc +101 -19
  72. data/doc/validations.rdoc +64 -51
  73. data/doc/virtual_rows.rdoc +90 -109
  74. data/lib/sequel.rb +3 -1
  75. data/lib/sequel/adapters/ado.rb +154 -22
  76. data/lib/sequel/adapters/ado/access.rb +21 -21
  77. data/lib/sequel/adapters/ado/mssql.rb +8 -15
  78. data/lib/sequel/adapters/amalgalite.rb +17 -25
  79. data/lib/sequel/adapters/ibmdb.rb +52 -58
  80. data/lib/sequel/adapters/jdbc.rb +149 -127
  81. data/lib/sequel/adapters/jdbc/db2.rb +32 -40
  82. data/lib/sequel/adapters/jdbc/derby.rb +56 -58
  83. data/lib/sequel/adapters/jdbc/h2.rb +40 -30
  84. data/lib/sequel/adapters/jdbc/hsqldb.rb +22 -33
  85. data/lib/sequel/adapters/jdbc/jtds.rb +4 -10
  86. data/lib/sequel/adapters/jdbc/mssql.rb +6 -12
  87. data/lib/sequel/adapters/jdbc/mysql.rb +17 -18
  88. data/lib/sequel/adapters/jdbc/oracle.rb +25 -19
  89. data/lib/sequel/adapters/jdbc/postgresql.rb +90 -69
  90. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +14 -24
  91. data/lib/sequel/adapters/jdbc/sqlite.rb +50 -12
  92. data/lib/sequel/adapters/jdbc/sqlserver.rb +36 -9
  93. data/lib/sequel/adapters/jdbc/transactions.rb +25 -39
  94. data/lib/sequel/adapters/mock.rb +104 -113
  95. data/lib/sequel/adapters/mysql.rb +42 -61
  96. data/lib/sequel/adapters/mysql2.rb +126 -35
  97. data/lib/sequel/adapters/odbc.rb +21 -28
  98. data/lib/sequel/adapters/odbc/db2.rb +3 -1
  99. data/lib/sequel/adapters/odbc/mssql.rb +11 -15
  100. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  101. data/lib/sequel/adapters/oracle.rb +62 -68
  102. data/lib/sequel/adapters/postgres.rb +257 -311
  103. data/lib/sequel/adapters/postgresql.rb +3 -1
  104. data/lib/sequel/adapters/shared/access.rb +75 -79
  105. data/lib/sequel/adapters/shared/db2.rb +96 -74
  106. data/lib/sequel/adapters/shared/mssql.rb +258 -213
  107. data/lib/sequel/adapters/shared/mysql.rb +284 -216
  108. data/lib/sequel/adapters/shared/oracle.rb +175 -60
  109. data/lib/sequel/adapters/shared/postgres.rb +829 -383
  110. data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -127
  111. data/lib/sequel/adapters/shared/sqlite.rb +382 -159
  112. data/lib/sequel/adapters/sqlanywhere.rb +53 -38
  113. data/lib/sequel/adapters/sqlite.rb +111 -105
  114. data/lib/sequel/adapters/tinytds.rb +38 -46
  115. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -9
  116. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +7 -5
  117. data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
  118. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
  119. data/lib/sequel/adapters/utils/replace.rb +3 -4
  120. data/lib/sequel/adapters/utils/split_alter_table.rb +2 -0
  121. data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
  122. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
  123. data/lib/sequel/ast_transformer.rb +13 -89
  124. data/lib/sequel/connection_pool.rb +54 -26
  125. data/lib/sequel/connection_pool/sharded_single.rb +19 -12
  126. data/lib/sequel/connection_pool/sharded_threaded.rb +160 -111
  127. data/lib/sequel/connection_pool/single.rb +21 -12
  128. data/lib/sequel/connection_pool/threaded.rb +137 -119
  129. data/lib/sequel/core.rb +352 -320
  130. data/lib/sequel/database.rb +19 -2
  131. data/lib/sequel/database/connecting.rb +70 -55
  132. data/lib/sequel/database/dataset.rb +15 -5
  133. data/lib/sequel/database/dataset_defaults.rb +20 -102
  134. data/lib/sequel/database/features.rb +20 -4
  135. data/lib/sequel/database/logging.rb +25 -7
  136. data/lib/sequel/database/misc.rb +132 -118
  137. data/lib/sequel/database/query.rb +51 -28
  138. data/lib/sequel/database/schema_generator.rb +188 -75
  139. data/lib/sequel/database/schema_methods.rb +161 -92
  140. data/lib/sequel/database/transactions.rb +260 -58
  141. data/lib/sequel/dataset.rb +28 -12
  142. data/lib/sequel/dataset/actions.rb +354 -170
  143. data/lib/sequel/dataset/dataset_module.rb +46 -0
  144. data/lib/sequel/dataset/features.rb +81 -34
  145. data/lib/sequel/dataset/graph.rb +82 -58
  146. data/lib/sequel/dataset/misc.rb +139 -47
  147. data/lib/sequel/dataset/placeholder_literalizer.rb +66 -26
  148. data/lib/sequel/dataset/prepared_statements.rb +188 -85
  149. data/lib/sequel/dataset/query.rb +428 -214
  150. data/lib/sequel/dataset/sql.rb +446 -339
  151. data/lib/sequel/deprecated.rb +14 -2
  152. data/lib/sequel/exceptions.rb +48 -16
  153. data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
  154. data/lib/sequel/extensions/_model_pg_row.rb +43 -0
  155. data/lib/sequel/extensions/_pretty_table.rb +10 -9
  156. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  157. data/lib/sequel/extensions/arbitrary_servers.rb +15 -11
  158. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  159. data/lib/sequel/extensions/blank.rb +2 -0
  160. data/lib/sequel/extensions/caller_logging.rb +79 -0
  161. data/lib/sequel/extensions/columns_introspection.rb +9 -4
  162. data/lib/sequel/extensions/connection_expiration.rb +99 -0
  163. data/lib/sequel/extensions/connection_validator.rb +26 -13
  164. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  165. data/lib/sequel/extensions/constraint_validations.rb +93 -38
  166. data/lib/sequel/extensions/core_extensions.rb +45 -53
  167. data/lib/sequel/extensions/core_refinements.rb +44 -46
  168. data/lib/sequel/extensions/current_datetime_timestamp.rb +5 -4
  169. data/lib/sequel/extensions/dataset_source_alias.rb +4 -0
  170. data/lib/sequel/extensions/date_arithmetic.rb +42 -16
  171. data/lib/sequel/extensions/datetime_parse_to_time.rb +37 -0
  172. data/lib/sequel/extensions/duplicate_columns_handler.rb +94 -0
  173. data/lib/sequel/extensions/empty_array_consider_nulls.rb +7 -3
  174. data/lib/sequel/extensions/error_sql.rb +7 -3
  175. data/lib/sequel/extensions/escaped_like.rb +100 -0
  176. data/lib/sequel/extensions/eval_inspect.rb +14 -15
  177. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  178. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  179. data/lib/sequel/extensions/freeze_datasets.rb +3 -0
  180. data/lib/sequel/extensions/from_block.rb +2 -31
  181. data/lib/sequel/extensions/graph_each.rb +19 -6
  182. data/lib/sequel/extensions/identifier_mangling.rb +180 -0
  183. data/lib/sequel/extensions/implicit_subquery.rb +48 -0
  184. data/lib/sequel/extensions/index_caching.rb +109 -0
  185. data/lib/sequel/extensions/inflector.rb +8 -4
  186. data/lib/sequel/extensions/integer64.rb +32 -0
  187. data/lib/sequel/extensions/looser_typecasting.rb +19 -9
  188. data/lib/sequel/extensions/migration.rb +132 -80
  189. data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +4 -0
  190. data/lib/sequel/extensions/named_timezones.rb +88 -23
  191. data/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
  192. data/lib/sequel/extensions/null_dataset.rb +12 -8
  193. data/lib/sequel/extensions/pagination.rb +35 -28
  194. data/lib/sequel/extensions/pg_array.rb +227 -316
  195. data/lib/sequel/extensions/pg_array_ops.rb +19 -7
  196. data/lib/sequel/extensions/pg_enum.rb +69 -24
  197. data/lib/sequel/extensions/pg_extended_date_support.rb +250 -0
  198. data/lib/sequel/extensions/pg_hstore.rb +50 -59
  199. data/lib/sequel/extensions/pg_hstore_ops.rb +9 -3
  200. data/lib/sequel/extensions/pg_inet.rb +34 -15
  201. data/lib/sequel/extensions/pg_inet_ops.rb +5 -1
  202. data/lib/sequel/extensions/pg_interval.rb +26 -26
  203. data/lib/sequel/extensions/pg_json.rb +422 -141
  204. data/lib/sequel/extensions/pg_json_ops.rb +248 -9
  205. data/lib/sequel/extensions/pg_loose_count.rb +5 -1
  206. data/lib/sequel/extensions/pg_range.rb +162 -146
  207. data/lib/sequel/extensions/pg_range_ops.rb +10 -5
  208. data/lib/sequel/extensions/pg_row.rb +53 -87
  209. data/lib/sequel/extensions/pg_row_ops.rb +36 -13
  210. data/lib/sequel/extensions/pg_static_cache_updater.rb +6 -2
  211. data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
  212. data/lib/sequel/extensions/pretty_table.rb +4 -0
  213. data/lib/sequel/extensions/query.rb +12 -7
  214. data/lib/sequel/extensions/round_timestamps.rb +6 -9
  215. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  216. data/lib/sequel/extensions/s.rb +59 -0
  217. data/lib/sequel/extensions/schema_caching.rb +14 -1
  218. data/lib/sequel/extensions/schema_dumper.rb +83 -55
  219. data/lib/sequel/extensions/select_remove.rb +8 -4
  220. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
  221. data/lib/sequel/extensions/server_block.rb +50 -17
  222. data/lib/sequel/extensions/server_logging.rb +61 -0
  223. data/lib/sequel/extensions/split_array_nil.rb +8 -4
  224. data/lib/sequel/extensions/sql_comments.rb +96 -0
  225. data/lib/sequel/extensions/sql_expr.rb +4 -1
  226. data/lib/sequel/extensions/string_agg.rb +181 -0
  227. data/lib/sequel/extensions/string_date_time.rb +2 -0
  228. data/lib/sequel/extensions/symbol_aref.rb +53 -0
  229. data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
  230. data/lib/sequel/extensions/symbol_as.rb +23 -0
  231. data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
  232. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  233. data/lib/sequel/extensions/thread_local_timezones.rb +4 -0
  234. data/lib/sequel/extensions/to_dot.rb +15 -5
  235. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  236. data/lib/sequel/model.rb +36 -126
  237. data/lib/sequel/model/associations.rb +850 -257
  238. data/lib/sequel/model/base.rb +652 -764
  239. data/lib/sequel/model/dataset_module.rb +13 -10
  240. data/lib/sequel/model/default_inflections.rb +3 -1
  241. data/lib/sequel/model/errors.rb +3 -3
  242. data/lib/sequel/model/exceptions.rb +12 -12
  243. data/lib/sequel/model/inflections.rb +8 -19
  244. data/lib/sequel/model/plugins.rb +111 -0
  245. data/lib/sequel/plugins/accessed_columns.rb +2 -0
  246. data/lib/sequel/plugins/active_model.rb +32 -7
  247. data/lib/sequel/plugins/after_initialize.rb +3 -1
  248. data/lib/sequel/plugins/association_dependencies.rb +27 -18
  249. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  250. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  251. data/lib/sequel/plugins/association_pks.rb +181 -83
  252. data/lib/sequel/plugins/association_proxies.rb +33 -9
  253. data/lib/sequel/plugins/auto_validations.rb +58 -23
  254. data/lib/sequel/plugins/before_after_save.rb +8 -0
  255. data/lib/sequel/plugins/blacklist_security.rb +23 -12
  256. data/lib/sequel/plugins/boolean_readers.rb +9 -6
  257. data/lib/sequel/plugins/boolean_subsets.rb +64 -0
  258. data/lib/sequel/plugins/caching.rb +27 -16
  259. data/lib/sequel/plugins/class_table_inheritance.rb +192 -94
  260. data/lib/sequel/plugins/column_conflicts.rb +18 -3
  261. data/lib/sequel/plugins/column_select.rb +9 -5
  262. data/lib/sequel/plugins/columns_updated.rb +42 -0
  263. data/lib/sequel/plugins/composition.rb +36 -24
  264. data/lib/sequel/plugins/constraint_validations.rb +37 -16
  265. data/lib/sequel/plugins/csv_serializer.rb +58 -35
  266. data/lib/sequel/plugins/dataset_associations.rb +60 -18
  267. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  268. data/lib/sequel/plugins/defaults_setter.rb +74 -13
  269. data/lib/sequel/plugins/delay_add_association.rb +4 -1
  270. data/lib/sequel/plugins/dirty.rb +65 -24
  271. data/lib/sequel/plugins/eager_each.rb +27 -3
  272. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  273. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  274. data/lib/sequel/plugins/error_splitter.rb +19 -12
  275. data/lib/sequel/plugins/finder.rb +246 -0
  276. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  277. data/lib/sequel/plugins/force_encoding.rb +9 -12
  278. data/lib/sequel/plugins/hook_class_methods.rb +39 -54
  279. data/lib/sequel/plugins/input_transformer.rb +20 -10
  280. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  281. data/lib/sequel/plugins/insert_returning_select.rb +4 -2
  282. data/lib/sequel/plugins/instance_filters.rb +12 -8
  283. data/lib/sequel/plugins/instance_hooks.rb +36 -17
  284. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  285. data/lib/sequel/plugins/inverted_subsets.rb +24 -13
  286. data/lib/sequel/plugins/json_serializer.rb +123 -47
  287. data/lib/sequel/plugins/lazy_attributes.rb +20 -14
  288. data/lib/sequel/plugins/list.rb +40 -26
  289. data/lib/sequel/plugins/many_through_many.rb +28 -12
  290. data/lib/sequel/plugins/modification_detection.rb +17 -5
  291. data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -5
  292. data/lib/sequel/plugins/nested_attributes.rb +55 -28
  293. data/lib/sequel/plugins/optimistic_locking.rb +5 -3
  294. data/lib/sequel/plugins/pg_array_associations.rb +52 -18
  295. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +348 -0
  296. data/lib/sequel/plugins/pg_row.rb +7 -51
  297. data/lib/sequel/plugins/prepared_statements.rb +53 -72
  298. data/lib/sequel/plugins/prepared_statements_safe.rb +13 -5
  299. data/lib/sequel/plugins/rcte_tree.rb +43 -63
  300. data/lib/sequel/plugins/serialization.rb +37 -44
  301. data/lib/sequel/plugins/serialization_modification_detection.rb +3 -1
  302. data/lib/sequel/plugins/sharding.rb +17 -10
  303. data/lib/sequel/plugins/single_table_inheritance.rb +62 -28
  304. data/lib/sequel/plugins/singular_table_names.rb +2 -0
  305. data/lib/sequel/plugins/skip_create_refresh.rb +5 -3
  306. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  307. data/lib/sequel/plugins/split_values.rb +13 -6
  308. data/lib/sequel/plugins/static_cache.rb +79 -53
  309. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  310. data/lib/sequel/plugins/string_stripper.rb +5 -3
  311. data/lib/sequel/plugins/subclasses.rb +20 -2
  312. data/lib/sequel/plugins/subset_conditions.rb +48 -0
  313. data/lib/sequel/plugins/table_select.rb +4 -2
  314. data/lib/sequel/plugins/tactical_eager_loading.rb +120 -6
  315. data/lib/sequel/plugins/throw_failures.rb +110 -0
  316. data/lib/sequel/plugins/timestamps.rb +22 -8
  317. data/lib/sequel/plugins/touch.rb +21 -8
  318. data/lib/sequel/plugins/tree.rb +57 -30
  319. data/lib/sequel/plugins/typecast_on_load.rb +14 -4
  320. data/lib/sequel/plugins/unlimited_update.rb +3 -7
  321. data/lib/sequel/plugins/update_or_create.rb +6 -4
  322. data/lib/sequel/plugins/update_primary_key.rb +3 -1
  323. data/lib/sequel/plugins/update_refresh.rb +28 -15
  324. data/lib/sequel/plugins/uuid.rb +70 -0
  325. data/lib/sequel/plugins/validate_associated.rb +20 -0
  326. data/lib/sequel/plugins/validation_class_methods.rb +40 -19
  327. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  328. data/lib/sequel/plugins/validation_helpers.rb +49 -31
  329. data/lib/sequel/plugins/whitelist_security.rb +122 -0
  330. data/lib/sequel/plugins/xml_serializer.rb +31 -30
  331. data/lib/sequel/sql.rb +479 -329
  332. data/lib/sequel/timezones.rb +62 -32
  333. data/lib/sequel/version.rb +10 -3
  334. metadata +177 -477
  335. data/Rakefile +0 -165
  336. data/doc/active_record.rdoc +0 -912
  337. data/doc/release_notes/1.0.txt +0 -38
  338. data/doc/release_notes/1.1.txt +0 -143
  339. data/doc/release_notes/1.3.txt +0 -101
  340. data/doc/release_notes/1.4.0.txt +0 -53
  341. data/doc/release_notes/1.5.0.txt +0 -155
  342. data/doc/release_notes/2.0.0.txt +0 -298
  343. data/doc/release_notes/2.1.0.txt +0 -271
  344. data/doc/release_notes/2.10.0.txt +0 -328
  345. data/doc/release_notes/2.11.0.txt +0 -215
  346. data/doc/release_notes/2.12.0.txt +0 -534
  347. data/doc/release_notes/2.2.0.txt +0 -253
  348. data/doc/release_notes/2.3.0.txt +0 -88
  349. data/doc/release_notes/2.4.0.txt +0 -106
  350. data/doc/release_notes/2.5.0.txt +0 -137
  351. data/doc/release_notes/2.6.0.txt +0 -157
  352. data/doc/release_notes/2.7.0.txt +0 -166
  353. data/doc/release_notes/2.8.0.txt +0 -171
  354. data/doc/release_notes/2.9.0.txt +0 -97
  355. data/doc/release_notes/3.0.0.txt +0 -221
  356. data/doc/release_notes/3.1.0.txt +0 -406
  357. data/doc/release_notes/3.10.0.txt +0 -286
  358. data/doc/release_notes/3.11.0.txt +0 -254
  359. data/doc/release_notes/3.12.0.txt +0 -304
  360. data/doc/release_notes/3.13.0.txt +0 -210
  361. data/doc/release_notes/3.14.0.txt +0 -118
  362. data/doc/release_notes/3.15.0.txt +0 -78
  363. data/doc/release_notes/3.16.0.txt +0 -45
  364. data/doc/release_notes/3.17.0.txt +0 -58
  365. data/doc/release_notes/3.18.0.txt +0 -120
  366. data/doc/release_notes/3.19.0.txt +0 -67
  367. data/doc/release_notes/3.2.0.txt +0 -268
  368. data/doc/release_notes/3.20.0.txt +0 -41
  369. data/doc/release_notes/3.21.0.txt +0 -87
  370. data/doc/release_notes/3.22.0.txt +0 -39
  371. data/doc/release_notes/3.23.0.txt +0 -172
  372. data/doc/release_notes/3.24.0.txt +0 -420
  373. data/doc/release_notes/3.25.0.txt +0 -88
  374. data/doc/release_notes/3.26.0.txt +0 -88
  375. data/doc/release_notes/3.27.0.txt +0 -82
  376. data/doc/release_notes/3.28.0.txt +0 -304
  377. data/doc/release_notes/3.29.0.txt +0 -459
  378. data/doc/release_notes/3.3.0.txt +0 -192
  379. data/doc/release_notes/3.30.0.txt +0 -135
  380. data/doc/release_notes/3.31.0.txt +0 -146
  381. data/doc/release_notes/3.32.0.txt +0 -202
  382. data/doc/release_notes/3.33.0.txt +0 -157
  383. data/doc/release_notes/3.34.0.txt +0 -671
  384. data/doc/release_notes/3.35.0.txt +0 -144
  385. data/doc/release_notes/3.36.0.txt +0 -245
  386. data/doc/release_notes/3.37.0.txt +0 -338
  387. data/doc/release_notes/3.38.0.txt +0 -234
  388. data/doc/release_notes/3.39.0.txt +0 -237
  389. data/doc/release_notes/3.4.0.txt +0 -325
  390. data/doc/release_notes/3.40.0.txt +0 -73
  391. data/doc/release_notes/3.41.0.txt +0 -155
  392. data/doc/release_notes/3.42.0.txt +0 -74
  393. data/doc/release_notes/3.43.0.txt +0 -105
  394. data/doc/release_notes/3.44.0.txt +0 -152
  395. data/doc/release_notes/3.45.0.txt +0 -179
  396. data/doc/release_notes/3.46.0.txt +0 -122
  397. data/doc/release_notes/3.47.0.txt +0 -270
  398. data/doc/release_notes/3.48.0.txt +0 -477
  399. data/doc/release_notes/3.5.0.txt +0 -510
  400. data/doc/release_notes/3.6.0.txt +0 -366
  401. data/doc/release_notes/3.7.0.txt +0 -179
  402. data/doc/release_notes/3.8.0.txt +0 -151
  403. data/doc/release_notes/3.9.0.txt +0 -233
  404. data/doc/release_notes/4.0.0.txt +0 -262
  405. data/doc/release_notes/4.1.0.txt +0 -85
  406. data/doc/release_notes/4.10.0.txt +0 -226
  407. data/doc/release_notes/4.11.0.txt +0 -147
  408. data/doc/release_notes/4.12.0.txt +0 -105
  409. data/doc/release_notes/4.13.0.txt +0 -169
  410. data/doc/release_notes/4.14.0.txt +0 -68
  411. data/doc/release_notes/4.15.0.txt +0 -56
  412. data/doc/release_notes/4.16.0.txt +0 -36
  413. data/doc/release_notes/4.17.0.txt +0 -38
  414. data/doc/release_notes/4.18.0.txt +0 -36
  415. data/doc/release_notes/4.19.0.txt +0 -45
  416. data/doc/release_notes/4.2.0.txt +0 -129
  417. data/doc/release_notes/4.20.0.txt +0 -79
  418. data/doc/release_notes/4.21.0.txt +0 -94
  419. data/doc/release_notes/4.22.0.txt +0 -72
  420. data/doc/release_notes/4.23.0.txt +0 -65
  421. data/doc/release_notes/4.24.0.txt +0 -99
  422. data/doc/release_notes/4.25.0.txt +0 -181
  423. data/doc/release_notes/4.26.0.txt +0 -44
  424. data/doc/release_notes/4.3.0.txt +0 -40
  425. data/doc/release_notes/4.4.0.txt +0 -92
  426. data/doc/release_notes/4.5.0.txt +0 -34
  427. data/doc/release_notes/4.6.0.txt +0 -30
  428. data/doc/release_notes/4.7.0.txt +0 -103
  429. data/doc/release_notes/4.8.0.txt +0 -175
  430. data/doc/release_notes/4.9.0.txt +0 -190
  431. data/lib/sequel/adapters/cubrid.rb +0 -142
  432. data/lib/sequel/adapters/do.rb +0 -156
  433. data/lib/sequel/adapters/do/mysql.rb +0 -64
  434. data/lib/sequel/adapters/do/postgres.rb +0 -42
  435. data/lib/sequel/adapters/do/sqlite3.rb +0 -40
  436. data/lib/sequel/adapters/jdbc/as400.rb +0 -82
  437. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -62
  438. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -34
  439. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -31
  440. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -31
  441. data/lib/sequel/adapters/odbc/progress.rb +0 -8
  442. data/lib/sequel/adapters/shared/cubrid.rb +0 -243
  443. data/lib/sequel/adapters/shared/firebird.rb +0 -245
  444. data/lib/sequel/adapters/shared/informix.rb +0 -52
  445. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -150
  446. data/lib/sequel/adapters/shared/progress.rb +0 -38
  447. data/lib/sequel/adapters/swift.rb +0 -158
  448. data/lib/sequel/adapters/swift/mysql.rb +0 -47
  449. data/lib/sequel/adapters/swift/postgres.rb +0 -45
  450. data/lib/sequel/adapters/swift/sqlite.rb +0 -47
  451. data/lib/sequel/adapters/utils/pg_types.rb +0 -68
  452. data/lib/sequel/dataset/mutation.rb +0 -109
  453. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -3
  454. data/lib/sequel/extensions/filter_having.rb +0 -59
  455. data/lib/sequel/extensions/hash_aliases.rb +0 -45
  456. data/lib/sequel/extensions/meta_def.rb +0 -31
  457. data/lib/sequel/extensions/query_literals.rb +0 -80
  458. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -22
  459. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -118
  460. data/lib/sequel/extensions/set_overrides.rb +0 -72
  461. data/lib/sequel/no_core_ext.rb +0 -1
  462. data/lib/sequel/plugins/association_autoreloading.rb +0 -7
  463. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -7
  464. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -78
  465. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -117
  466. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -59
  467. data/lib/sequel/plugins/schema.rb +0 -80
  468. data/lib/sequel/plugins/scissors.rb +0 -33
  469. data/spec/adapters/db2_spec.rb +0 -160
  470. data/spec/adapters/firebird_spec.rb +0 -411
  471. data/spec/adapters/informix_spec.rb +0 -100
  472. data/spec/adapters/mssql_spec.rb +0 -706
  473. data/spec/adapters/mysql_spec.rb +0 -1287
  474. data/spec/adapters/oracle_spec.rb +0 -313
  475. data/spec/adapters/postgres_spec.rb +0 -3725
  476. data/spec/adapters/spec_helper.rb +0 -43
  477. data/spec/adapters/sqlanywhere_spec.rb +0 -170
  478. data/spec/adapters/sqlite_spec.rb +0 -653
  479. data/spec/bin_spec.rb +0 -254
  480. data/spec/core/connection_pool_spec.rb +0 -1016
  481. data/spec/core/database_spec.rb +0 -2531
  482. data/spec/core/dataset_spec.rb +0 -5098
  483. data/spec/core/deprecated_spec.rb +0 -70
  484. data/spec/core/expression_filters_spec.rb +0 -1243
  485. data/spec/core/mock_adapter_spec.rb +0 -462
  486. data/spec/core/object_graph_spec.rb +0 -303
  487. data/spec/core/placeholder_literalizer_spec.rb +0 -163
  488. data/spec/core/schema_generator_spec.rb +0 -179
  489. data/spec/core/schema_spec.rb +0 -1659
  490. data/spec/core/spec_helper.rb +0 -34
  491. data/spec/core/version_spec.rb +0 -7
  492. data/spec/core_extensions_spec.rb +0 -699
  493. data/spec/extensions/accessed_columns_spec.rb +0 -51
  494. data/spec/extensions/active_model_spec.rb +0 -123
  495. data/spec/extensions/after_initialize_spec.rb +0 -24
  496. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  497. data/spec/extensions/association_dependencies_spec.rb +0 -117
  498. data/spec/extensions/association_pks_spec.rb +0 -365
  499. data/spec/extensions/association_proxies_spec.rb +0 -86
  500. data/spec/extensions/auto_validations_spec.rb +0 -192
  501. data/spec/extensions/blacklist_security_spec.rb +0 -88
  502. data/spec/extensions/blank_spec.rb +0 -69
  503. data/spec/extensions/boolean_readers_spec.rb +0 -93
  504. data/spec/extensions/caching_spec.rb +0 -270
  505. data/spec/extensions/class_table_inheritance_spec.rb +0 -420
  506. data/spec/extensions/column_conflicts_spec.rb +0 -60
  507. data/spec/extensions/column_select_spec.rb +0 -108
  508. data/spec/extensions/columns_introspection_spec.rb +0 -91
  509. data/spec/extensions/composition_spec.rb +0 -242
  510. data/spec/extensions/connection_validator_spec.rb +0 -120
  511. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -274
  512. data/spec/extensions/constraint_validations_spec.rb +0 -325
  513. data/spec/extensions/core_refinements_spec.rb +0 -519
  514. data/spec/extensions/csv_serializer_spec.rb +0 -173
  515. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  516. data/spec/extensions/dataset_associations_spec.rb +0 -311
  517. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  518. data/spec/extensions/date_arithmetic_spec.rb +0 -150
  519. data/spec/extensions/defaults_setter_spec.rb +0 -101
  520. data/spec/extensions/delay_add_association_spec.rb +0 -52
  521. data/spec/extensions/dirty_spec.rb +0 -180
  522. data/spec/extensions/eager_each_spec.rb +0 -42
  523. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  524. data/spec/extensions/error_splitter_spec.rb +0 -18
  525. data/spec/extensions/error_sql_spec.rb +0 -20
  526. data/spec/extensions/eval_inspect_spec.rb +0 -73
  527. data/spec/extensions/filter_having_spec.rb +0 -40
  528. data/spec/extensions/force_encoding_spec.rb +0 -114
  529. data/spec/extensions/from_block_spec.rb +0 -21
  530. data/spec/extensions/graph_each_spec.rb +0 -109
  531. data/spec/extensions/hash_aliases_spec.rb +0 -24
  532. data/spec/extensions/hook_class_methods_spec.rb +0 -429
  533. data/spec/extensions/inflector_spec.rb +0 -183
  534. data/spec/extensions/input_transformer_spec.rb +0 -54
  535. data/spec/extensions/insert_returning_select_spec.rb +0 -46
  536. data/spec/extensions/instance_filters_spec.rb +0 -79
  537. data/spec/extensions/instance_hooks_spec.rb +0 -276
  538. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  539. data/spec/extensions/json_serializer_spec.rb +0 -291
  540. data/spec/extensions/lazy_attributes_spec.rb +0 -170
  541. data/spec/extensions/list_spec.rb +0 -267
  542. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  543. data/spec/extensions/many_through_many_spec.rb +0 -2172
  544. data/spec/extensions/meta_def_spec.rb +0 -21
  545. data/spec/extensions/migration_spec.rb +0 -712
  546. data/spec/extensions/modification_detection_spec.rb +0 -80
  547. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
  548. data/spec/extensions/named_timezones_spec.rb +0 -108
  549. data/spec/extensions/nested_attributes_spec.rb +0 -697
  550. data/spec/extensions/null_dataset_spec.rb +0 -85
  551. data/spec/extensions/optimistic_locking_spec.rb +0 -128
  552. data/spec/extensions/pagination_spec.rb +0 -118
  553. data/spec/extensions/pg_array_associations_spec.rb +0 -736
  554. data/spec/extensions/pg_array_ops_spec.rb +0 -143
  555. data/spec/extensions/pg_array_spec.rb +0 -395
  556. data/spec/extensions/pg_enum_spec.rb +0 -92
  557. data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
  558. data/spec/extensions/pg_hstore_spec.rb +0 -206
  559. data/spec/extensions/pg_inet_ops_spec.rb +0 -101
  560. data/spec/extensions/pg_inet_spec.rb +0 -52
  561. data/spec/extensions/pg_interval_spec.rb +0 -76
  562. data/spec/extensions/pg_json_ops_spec.rb +0 -229
  563. data/spec/extensions/pg_json_spec.rb +0 -218
  564. data/spec/extensions/pg_loose_count_spec.rb +0 -17
  565. data/spec/extensions/pg_range_ops_spec.rb +0 -58
  566. data/spec/extensions/pg_range_spec.rb +0 -404
  567. data/spec/extensions/pg_row_ops_spec.rb +0 -60
  568. data/spec/extensions/pg_row_plugin_spec.rb +0 -62
  569. data/spec/extensions/pg_row_spec.rb +0 -360
  570. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
  571. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
  572. data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
  573. data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
  574. data/spec/extensions/prepared_statements_spec.rb +0 -103
  575. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
  576. data/spec/extensions/pretty_table_spec.rb +0 -92
  577. data/spec/extensions/query_literals_spec.rb +0 -183
  578. data/spec/extensions/query_spec.rb +0 -102
  579. data/spec/extensions/rcte_tree_spec.rb +0 -392
  580. data/spec/extensions/round_timestamps_spec.rb +0 -43
  581. data/spec/extensions/schema_caching_spec.rb +0 -41
  582. data/spec/extensions/schema_dumper_spec.rb +0 -789
  583. data/spec/extensions/schema_spec.rb +0 -117
  584. data/spec/extensions/scissors_spec.rb +0 -26
  585. data/spec/extensions/select_remove_spec.rb +0 -38
  586. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
  587. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  588. data/spec/extensions/serialization_spec.rb +0 -362
  589. data/spec/extensions/server_block_spec.rb +0 -90
  590. data/spec/extensions/set_overrides_spec.rb +0 -61
  591. data/spec/extensions/sharding_spec.rb +0 -198
  592. data/spec/extensions/shared_caching_spec.rb +0 -175
  593. data/spec/extensions/single_table_inheritance_spec.rb +0 -297
  594. data/spec/extensions/singular_table_names_spec.rb +0 -22
  595. data/spec/extensions/skip_create_refresh_spec.rb +0 -17
  596. data/spec/extensions/spec_helper.rb +0 -71
  597. data/spec/extensions/split_array_nil_spec.rb +0 -24
  598. data/spec/extensions/split_values_spec.rb +0 -22
  599. data/spec/extensions/sql_expr_spec.rb +0 -60
  600. data/spec/extensions/static_cache_spec.rb +0 -361
  601. data/spec/extensions/string_date_time_spec.rb +0 -95
  602. data/spec/extensions/string_stripper_spec.rb +0 -68
  603. data/spec/extensions/subclasses_spec.rb +0 -66
  604. data/spec/extensions/table_select_spec.rb +0 -71
  605. data/spec/extensions/tactical_eager_loading_spec.rb +0 -82
  606. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  607. data/spec/extensions/timestamps_spec.rb +0 -175
  608. data/spec/extensions/to_dot_spec.rb +0 -154
  609. data/spec/extensions/touch_spec.rb +0 -203
  610. data/spec/extensions/tree_spec.rb +0 -274
  611. data/spec/extensions/typecast_on_load_spec.rb +0 -80
  612. data/spec/extensions/unlimited_update_spec.rb +0 -20
  613. data/spec/extensions/update_or_create_spec.rb +0 -87
  614. data/spec/extensions/update_primary_key_spec.rb +0 -100
  615. data/spec/extensions/update_refresh_spec.rb +0 -53
  616. data/spec/extensions/validate_associated_spec.rb +0 -52
  617. data/spec/extensions/validation_class_methods_spec.rb +0 -1027
  618. data/spec/extensions/validation_helpers_spec.rb +0 -541
  619. data/spec/extensions/xml_serializer_spec.rb +0 -207
  620. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  621. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  622. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  623. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  624. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  625. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  626. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  627. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  628. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  629. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  630. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  631. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  632. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  633. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  634. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  635. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  636. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  637. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  638. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  639. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  640. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  641. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  642. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  643. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  644. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  645. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  646. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  647. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  648. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  649. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  650. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  651. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  652. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  653. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  654. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  655. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  656. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  657. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  658. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  659. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  660. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  661. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  662. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  663. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  664. data/spec/guards_helper.rb +0 -55
  665. data/spec/integration/associations_test.rb +0 -2454
  666. data/spec/integration/database_test.rb +0 -113
  667. data/spec/integration/dataset_test.rb +0 -1808
  668. data/spec/integration/eager_loader_test.rb +0 -687
  669. data/spec/integration/migrator_test.rb +0 -240
  670. data/spec/integration/model_test.rb +0 -226
  671. data/spec/integration/plugin_test.rb +0 -2240
  672. data/spec/integration/prepared_statement_test.rb +0 -467
  673. data/spec/integration/schema_test.rb +0 -817
  674. data/spec/integration/spec_helper.rb +0 -48
  675. data/spec/integration/timezone_test.rb +0 -86
  676. data/spec/integration/transaction_test.rb +0 -374
  677. data/spec/integration/type_test.rb +0 -133
  678. data/spec/model/association_reflection_spec.rb +0 -525
  679. data/spec/model/associations_spec.rb +0 -4426
  680. data/spec/model/base_spec.rb +0 -759
  681. data/spec/model/class_dataset_methods_spec.rb +0 -146
  682. data/spec/model/dataset_methods_spec.rb +0 -149
  683. data/spec/model/eager_loading_spec.rb +0 -2137
  684. data/spec/model/hooks_spec.rb +0 -604
  685. data/spec/model/inflector_spec.rb +0 -26
  686. data/spec/model/model_spec.rb +0 -982
  687. data/spec/model/plugins_spec.rb +0 -299
  688. data/spec/model/record_spec.rb +0 -2147
  689. data/spec/model/spec_helper.rb +0 -46
  690. data/spec/model/validations_spec.rb +0 -193
  691. data/spec/sequel_coverage.rb +0 -15
  692. data/spec/spec_config.rb +0 -10
@@ -22,30 +22,30 @@ Columns are generally created by specifying the column type as the method
22
22
  name, followed by the column name symbol to use, and after that any options that should be used.
23
23
  If the method is a ruby class name that Sequel recognizes, Sequel will transform it into the appropriate
24
24
  type for the given database. So while you specified +String+, Sequel will actually use +varchar+ or
25
- +text+ depending on the underlying database. Here's a list of all of ruby classes that Sequel will
25
+ +text+ depending on the underlying database. Here's a list of all ruby classes that Sequel will
26
26
  convert to database types:
27
27
 
28
- create_table(:columns_types) do # common database type used
29
- Integer :a0 # integer
30
- String :a1 # varchar(255)
31
- String :a2, :size=>50 # varchar(50)
32
- String :a3, :fixed=>true # char(255)
33
- String :a4, :fixed=>true, :size=>50 # char(50)
34
- String :a5, :text=>true # text
35
- File :b # blob
36
- Fixnum :c # integer
37
- Bignum :d # bigint
38
- Float :e # double precision
39
- BigDecimal :f # numeric
40
- BigDecimal :f2, :size=>10 # numeric(10)
41
- BigDecimal :f3, :size=>[10, 2] # numeric(10, 2)
42
- Date :g # date
43
- DateTime :h # timestamp
44
- Time :i # timestamp
45
- Time :i2, :only_time=>true # time
46
- Numeric :j # numeric
47
- TrueClass :k # boolean
48
- FalseClass :l # boolean
28
+ create_table(:columns_types) do # common database type used
29
+ Integer :a0 # integer
30
+ String :a1 # varchar(255)
31
+ String :a2, size: 50 # varchar(50)
32
+ String :a3, fixed: true # char(255)
33
+ String :a4, fixed: true, size: 50 # char(50)
34
+ String :a5, text: true # text
35
+ File :b # blob
36
+ Fixnum :c # integer
37
+ Bignum :d # bigint
38
+ Float :e # double precision
39
+ BigDecimal :f # numeric
40
+ BigDecimal :f2, size: 10 # numeric(10)
41
+ BigDecimal :f3, size: [10, 2] # numeric(10, 2)
42
+ Date :g # date
43
+ DateTime :h # timestamp
44
+ Time :i # timestamp
45
+ Time :i2, only_time: true # time
46
+ Numeric :j # numeric
47
+ TrueClass :k # boolean
48
+ FalseClass :l # boolean
49
49
  end
50
50
 
51
51
  Note that in addition to the ruby class name, Sequel also pays attention to the column options when
@@ -74,6 +74,11 @@ as the second argument, either as ruby classes, symbols, or strings:
74
74
  column :a6, 'timestamp(6)' # timestamp(6)
75
75
  end
76
76
 
77
+ If you use a ruby class as the type, Sequel will try to guess the appropriate type name for the
78
+ database you are using. If a symbol or string is used as the type, it is used verbatim as the type
79
+ name in SQL, with the exception of :Bignum. Using the symbol :Bignum as a type will use the
80
+ appropriate 64-bit integer type for the database you are using.
81
+
77
82
  === Column options
78
83
 
79
84
  When using the type name as method, the third argument is an options hash, and when using the +column+
@@ -84,7 +89,7 @@ method, the fourth argument is the options hash. The following options are supp
84
89
  options for the index.
85
90
  :null :: Mark the column as allowing NULL values (if true),
86
91
  or not allowing NULL values (if false). If unspecified, will default
87
- to whatever the database default is.
92
+ to whatever the database default is (usually true).
88
93
  :primary_key :: Mark this column as the primary key. This is used instead of the
89
94
  primary key method if you want a non-autoincrementing primary key.
90
95
  :primary_key_constraint_name :: The name to give the primary key constraint.
@@ -93,11 +98,11 @@ method, the fourth argument is the options hash. The following options are supp
93
98
  as +primary_key+ or +foreign_key+.
94
99
  :unique :: Mark the column as unique, generally has the same effect as
95
100
  creating a unique index on the column.
96
- :unique_constraint_name :: The name to give the unique key constraint.
101
+ :unique_constraint_name :: The name to give the unique constraint.
97
102
 
98
103
  === Other methods
99
104
 
100
- In addition to the +column+ method and other methods that create columns, there are a other methods that can be used:
105
+ In addition to the +column+ method and other methods that create columns, there are other methods that can be used:
101
106
 
102
107
  ==== +primary_key+
103
108
 
@@ -107,14 +112,14 @@ You've seen this one used already. It's used to create an autoincrementing inte
107
112
 
108
113
  If you want an autoincrementing 64-bit integer:
109
114
 
110
- create_table(:a0){primary_key :id, :type=>Bignum}
115
+ create_table(:a0){primary_key :id, type: :Bignum}
111
116
 
112
117
  If you want to create a primary key column that doesn't use an autoincrementing integer, you should
113
118
  not use this method. Instead, you should use the :primary_key option to the +column+ method or type
114
119
  method:
115
120
 
116
- create_table(:a1){Integer :id, :primary_key=>true} # Non autoincrementing integer primary key
117
- create_table(:a2){String :name, :primary_key=>true} # varchar(255) primary key
121
+ create_table(:a1){Integer :id, primary_key: true} # Non autoincrementing integer primary key
122
+ create_table(:a2){String :name, primary_key: true} # varchar(255) primary key
118
123
 
119
124
  If you want to create a composite primary key, you should call the +primary_key+ method with an
120
125
  array of column symbols. You can provide a specific name to use for the primary key constraint
@@ -123,8 +128,8 @@ via the :name option:
123
128
  create_table(:items) do
124
129
  Integer :group_id
125
130
  Integer :position
126
- primary_key [:group_id, :position], :name=>:items_pk
127
- end
131
+ primary_key [:group_id, :position], name: :items_pk
132
+ end
128
133
 
129
134
  If provided with an array, +primary_key+ does not create a column, it just sets up the primary key constraint.
130
135
 
@@ -132,7 +137,7 @@ If provided with an array, +primary_key+ does not create a column, it just sets
132
137
 
133
138
  +foreign_key+ is used to create a foreign key column that references a column in another table (or the same table).
134
139
  It takes the column name as the first argument, the table it references as the second argument, and an options hash
135
- as it's third argument. A simple example is:
140
+ as its third argument. A simple example is:
136
141
 
137
142
  create_table(:albums) do
138
143
  primary_key :id
@@ -142,7 +147,7 @@ as it's third argument. A simple example is:
142
147
 
143
148
  +foreign_key+ accepts the same options as +column+. For example, to have a unique foreign key with varchar(16) type:
144
149
 
145
- foreign_key :column_name, :table, :unique=>true, :type=>'varchar(16)'
150
+ foreign_key :column_name, :table, unique: true, type: 'varchar(16)'
146
151
 
147
152
  +foreign_key+ also accepts some specific options:
148
153
 
@@ -154,7 +159,7 @@ as it's third argument. A simple example is:
154
159
  references the primary key of the associated table, at least
155
160
  on most databases.
156
161
  :on_delete :: Specify the behavior of this foreign key column when the row with the primary key
157
- it references is deleted , can be :restrict, :cascade, :set_null, or :set_default.
162
+ it references is deleted, can be :restrict, :cascade, :set_null, or :set_default.
158
163
  You can also use a string, which is used literally.
159
164
  :on_update :: Specify the behavior of this foreign key column when the row with the primary key
160
165
  it references modifies the value of the primary key. Takes the same options as
@@ -181,7 +186,7 @@ When using an array of symbols, you can also provide a :name option to name the
181
186
  String :artist_name
182
187
  String :artist_location
183
188
  String :name
184
- foreign_key [:artist_name, :artist_location], :artists, :name=>'albums_artist_name_location_fkey'
189
+ foreign_key [:artist_name, :artist_location], :artists, name: 'albums_artist_name_location_fkey'
185
190
  end
186
191
 
187
192
  If you want to add a foreign key for a single column with a named constraint, you must use
@@ -191,7 +196,7 @@ the array form with a single symbol:
191
196
  primary_key :id
192
197
  Integer :artist_id
193
198
  String :name
194
- foreign_key [:artist_id], :artists, :name=>'albums_artist_id_fkey'
199
+ foreign_key [:artist_id], :artists, name: 'albums_artist_id_fkey'
195
200
  end
196
201
 
197
202
  ==== +index+
@@ -199,18 +204,18 @@ the array form with a single symbol:
199
204
  +index+ creates indexes on the table. For single columns, calling index is the same as using the
200
205
  <tt>:index</tt> option when creating the column:
201
206
 
202
- create_table(:a){Integer :id, :index=>true}
207
+ create_table(:a){Integer :id, index: true}
203
208
  # Same as:
204
209
  create_table(:a) do
205
210
  Integer :id
206
211
  index :id
207
212
  end
208
213
 
209
- create_table(:a){Integer :id, :index=>{:unique=>true}}
214
+ create_table(:a){Integer :id, index: {unique: true}}
210
215
  # Same as:
211
216
  create_table(:a) do
212
217
  Integer :id
213
- index :id, :unique=>true
218
+ index :id, unique: true
214
219
  end
215
220
 
216
221
  Similar to the +primary_key+ and +foreign_key+ methods, calling +index+ with an array of symbols
@@ -236,11 +241,11 @@ The +unique+ method creates a unique constraint on the table. A unique constrai
236
241
  operates identically to a unique index, so the following three +create_table+ blocks are
237
242
  pretty much identical:
238
243
 
239
- create_table(:a){Integer :a, :unique=>true}
244
+ create_table(:a){Integer :a, unique: true}
240
245
 
241
246
  create_table(:a) do
242
247
  Integer :a
243
- index :a, :unique=>true
248
+ index :a, unique: true
244
249
  end
245
250
 
246
251
  create_table(:a) do
@@ -271,7 +276,7 @@ both take the same options as +index+.
271
276
  String :name
272
277
  constraint(:name_min_length){char_length(name) > 2}
273
278
  end
274
-
279
+
275
280
  Instead of using a block, you can use arguments that will be handled similarly
276
281
  to <tt>Dataset#where</tt>:
277
282
 
@@ -280,7 +285,7 @@ to <tt>Dataset#where</tt>:
280
285
  String :name
281
286
  constraint(:name_length_range, Sequel.function(:char_length, :name)=>3..50)
282
287
  end
283
-
288
+
284
289
  ==== +check+
285
290
 
286
291
  +check+ operates just like +constraint+, except that it doesn't take a name
@@ -291,7 +296,7 @@ and it creates an unnamed constraint:
291
296
  String :name
292
297
  check{char_length(name) > 2}
293
298
  end
294
-
299
+
295
300
  It's recommended that you use the +constraint+ method and provide a name for the
296
301
  constraint, as that makes it easier to drop the constraint later if necessary.
297
302
 
@@ -299,23 +304,23 @@ constraint, as that makes it easier to drop the constraint later if necessary.
299
304
 
300
305
  +create_join_table+ is a shortcut that you can use to create simple many-to-many join tables:
301
306
 
302
- create_join_table(:artist_id=>:artists, :album_id=>:albums)
307
+ create_join_table(artist_id: :artists, album_id: :albums)
303
308
 
304
309
  which expands to:
305
310
 
306
311
  create_table(:albums_artists) do
307
- foreign_key :album_id, :albums, :null=>false
308
- foreign_key :artist_id, :artists, :null=>false
312
+ foreign_key :album_id, :albums
313
+ foreign_key :artist_id, :artists
309
314
  primary_key [:album_id, :artist_id]
310
315
  index [:artist_id, :album_id]
311
316
  end
312
317
 
313
- == <tt>create_table :as=></tt>
318
+ == <tt>create_table :as</tt>
314
319
 
315
320
  To create a table from the result of a SELECT query, instead of passing a block
316
321
  to +create_table+, provide a dataset to the :as option:
317
322
 
318
- create_table(:older_items, :as=>DB[:items].where{updated_at < Date.today << 6})
323
+ create_table(:older_items, as: DB[:items].where{updated_at < Date.today << 6})
319
324
 
320
325
  == +alter_table+
321
326
 
@@ -331,7 +336,7 @@ argument is the column name, the second is the type, and the third is an options
331
336
  hash:
332
337
 
333
338
  alter_table(:albums) do
334
- add_column :copies_sold, Integer, :default=>0
339
+ add_column :copies_sold, Integer, default: 0
335
340
  end
336
341
 
337
342
  === +drop_column+
@@ -369,6 +374,12 @@ Sequel will not add a column, but will add a composite primary key constraint:
369
374
  add_primary_key [:album_id, :artist_id]
370
375
  end
371
376
 
377
+ It is possible to specify a name for the primary key constraint: via the :name option:
378
+
379
+ alter_table(:albums_artists) do
380
+ add_primary_key [:album_id, :artist_id], :name=>:albums_artists_pkey
381
+ end
382
+
372
383
  If you just want to take an existing single column and make it a primary key, call
373
384
  +add_primary_key+ with an array with a single symbol:
374
385
 
@@ -387,18 +398,29 @@ creates a new column:
387
398
  end
388
399
 
389
400
  If you want to add a new foreign key constraint to an existing column, you provide an
390
- array with a single element. It's encouraged to provide a name when adding the constraint,
391
- via the :name option:
401
+ array with a single element:
402
+
403
+ alter_table(:albums) do
404
+ add_foreign_key [:artist_id], :artists
405
+ end
406
+
407
+ It's encouraged to provide a name when adding the constraint, via the :foreign_key_constraint_name
408
+ option if adding the column and the constraint:
392
409
 
393
410
  alter_table(:albums) do
394
- add_foreign_key [:artist_id], :artists, :name=>:albums_artist_id_fkey
411
+ add_foreign_key :artist_id, :artists, foreign_key_constraint_name: :albums_artist_id_fkey
395
412
  end
396
413
 
397
- To set up a multiple column foreign key constraint, use an array with multiple column
398
- symbols:
414
+ or via the :name option if just adding the constraint:
399
415
 
400
416
  alter_table(:albums) do
401
- add_foreign_key [:artist_name, :artist_location], :artists, :name=>:albums_artist_name_location_fkey
417
+ add_foreign_key [:artist_id], :artists, name: :albums_artist_id_fkey
418
+ end
419
+
420
+ To set up a multiple column foreign key constraint, use an array with multiple column symbols:
421
+
422
+ alter_table(:albums) do
423
+ add_foreign_key [:artist_name, :artist_location], :artists, name: :albums_artist_name_location_fkey
402
424
  end
403
425
 
404
426
  === +drop_foreign_key+
@@ -415,13 +437,13 @@ an array. It's encouraged to use the :name option to provide the constraint nam
415
437
  drop, though on some databases Sequel may be able to find the name through introspection:
416
438
 
417
439
  alter_table(:albums) do
418
- drop_foreign_key [:artist_id], :name=>:albums_artist_id_fkey
440
+ drop_foreign_key [:artist_id], name: :albums_artist_id_fkey
419
441
  end
420
442
 
421
443
  An array is also used to drop a composite foreign key constraint:
422
444
 
423
445
  alter_table(:albums) do
424
- drop_foreign_key [:artist_name, :artist_location], :name=>:albums_artist_name_location_fkey
446
+ drop_foreign_key [:artist_name, :artist_location], name: :albums_artist_name_location_fkey
425
447
  end
426
448
 
427
449
  If you do not provide a :name option and Sequel is not able to determine the name
@@ -440,7 +462,7 @@ It accepts the same options as +create_table+'s +index+ method, and you can set
440
462
  a multiple column index using an array:
441
463
 
442
464
  alter_table(:albums_artists) do
443
- add_index [:album_id, :artist_id], :unique=>true
465
+ add_index [:album_id, :artist_id], unique: true
444
466
  end
445
467
 
446
468
  === +drop_index+
@@ -456,7 +478,7 @@ Just like +drop_column+, it is often used in the +down+ block of a migration.
456
478
  To drop an index with a specific name, use the <tt>:name</tt> option:
457
479
 
458
480
  alter_table(:albums) do
459
- drop_index :artist_id, :name=>:artists_id_index
481
+ drop_index :artist_id, name: :artists_id_index
460
482
  end
461
483
 
462
484
  === +add_full_text_index+, +add_spatial_index+
@@ -473,9 +495,9 @@ method:
473
495
  add_constraint(:name_min_length){char_length(name) > 2}
474
496
  end
475
497
 
476
- There is no method to add an unnamed constraint, but you can pass nil as the first
477
- argument of +add_constraint+ to do so. However, it's not recommend to do that
478
- as it is difficult to drop such a constraint.
498
+ There is no method to add an unnamed constraint, but you can pass +nil+ as the first
499
+ argument of +add_constraint+ to do so. However, it's not recommended to do that
500
+ as it is more difficult to drop such a constraint.
479
501
 
480
502
  === +add_unique_constraint+
481
503
 
@@ -486,6 +508,12 @@ method. This usually has the same effect as adding a unique index.
486
508
  add_unique_constraint [:artist_id, :name]
487
509
  end
488
510
 
511
+ You can also specify a name via the :name option when adding the constraint:
512
+
513
+ alter_table(:albums) do
514
+ add_unique_constraint [:artist_id, :name], name: :albums_artist_id_name_ukey
515
+ end
516
+
489
517
  === +drop_constraint+
490
518
 
491
519
  This method drops an existing named constraint:
@@ -501,9 +529,9 @@ For that reason, you should not add unnamed constraints that you ever might need
501
529
  On some databases, you must specify the type of constraint via a <tt>:type</tt> option:
502
530
 
503
531
  alter_table(:albums) do
504
- drop_constraint(:albums_pk, :type=>:primary_key)
505
- drop_constraint(:albums_fk, :type=>:foreign_key)
506
- drop_constraint(:albums_uk, :type=>:unique)
532
+ drop_constraint(:albums_pk, type: :primary_key)
533
+ drop_constraint(:albums_fk, type: :foreign_key)
534
+ drop_constraint(:albums_uk, type: :unique)
507
535
  end
508
536
 
509
537
  === +set_column_default+
@@ -514,17 +542,23 @@ This modifies the default value of a column:
514
542
  set_column_default :copies_sold, 0
515
543
  end
516
544
 
545
+ To remove a default value for a column, use +nil+ as the value:
546
+
547
+ alter_table(:albums) do
548
+ set_column_default :copies_sold, nil
549
+ end
550
+
517
551
  === +set_column_type+
518
552
 
519
553
  This modifies a column's type. Most databases will attempt to convert existing values in
520
554
  the columns to the new type:
521
555
 
522
556
  alter_table(:albums) do
523
- set_column_type :copies_sold, Bignum
557
+ set_column_type :copies_sold, :Bignum
524
558
  end
525
559
 
526
560
  You can specify the type as a string or symbol, in which case it is used verbatim, or as a supported
527
- ruby class, in which case it gets converted to an appropriate database type.
561
+ ruby class or the :Bignum symbol, in which case it gets converted to an appropriate database type.
528
562
 
529
563
  === +set_column_allow_null+
530
564
 
@@ -586,9 +620,6 @@ the table if the table already exists. On some databases, it uses
586
620
  <tt>IF NOT EXISTS</tt>, on others it does a separate query to check for
587
621
  existence.
588
622
 
589
- This should not be used inside migrations, as if the table does not
590
- exist, it may mess up the migration.
591
-
592
623
  === +rename_table+
593
624
 
594
625
  You can rename an existing table using +rename_table+. Like +rename_column+,
@@ -612,9 +643,6 @@ is the same as:
612
643
  primary_key :id
613
644
  end
614
645
 
615
- It should not be used inside migrations, as if the table does not exist, it may
616
- mess up the migration.
617
-
618
646
  === <tt>create_table?</tt>
619
647
 
620
648
  <tt>create_table?</tt> only creates the table if it does
@@ -629,11 +657,9 @@ is the same as:
629
657
  unless table_exists?(:artists)
630
658
  create_table(:artists) do
631
659
  primary_key :id
632
- end
660
+ end
633
661
  end
634
662
 
635
- Like <tt>create_table!</tt>, it should not be used inside migrations.
636
-
637
663
  === +create_view+ and +create_or_replace_view+
638
664
 
639
665
  These can be used to create views. The difference between them is that
@@ -651,4 +677,3 @@ second argument:
651
677
  arguments:
652
678
 
653
679
  drop_view(:gold_albums, :platinum_albums)
654
-
@@ -16,13 +16,11 @@ as it never calls eval on a string that is derived from user input.
16
16
  However, some Sequel methods used for creating methods via metaprogramming
17
17
  could conceivably be abused to do so:
18
18
 
19
- * Sequel::Schema::CreateTableGenerator.add_type_method
20
- * Sequel::Dataset.def_mutation_method
21
19
  * Sequel::Dataset.def_sql_method
22
- * Sequel::Model::Plugins.def_dataset_methods
23
- * Sequel.def_adapter_method (private)
20
+ * Sequel::JDBC.load_driver
21
+ * Sequel::Plugins.def_dataset_methods
22
+ * Sequel::Dataset.prepared_statements_module (private)
24
23
  * Sequel::SQL::Expression.to_s_method (private)
25
- * Sequel::Plugins::HookClassMethods::ClassMethods#add_hook_type
26
24
 
27
25
  As long as you don't call those with user input, you should not be
28
26
  vulnerable to code execution.
@@ -44,34 +42,62 @@ There are basically two kinds of possible SQL injections in Sequel:
44
42
 
45
43
  ==== Full SQL Strings
46
44
 
47
- Some Sequel methods are designed to execute raw SQL, including:
45
+ Some Sequel methods are designed to execute raw SQL strings, including:
48
46
 
49
47
  * Sequel::Database#execute
48
+ * Sequel::Database#execute_ddl
49
+ * Sequel::Database#execute_dui
50
+ * Sequel::Database#execute_insert
50
51
  * Sequel::Database#run
51
52
  * Sequel::Database#<<
52
- * Sequel::Database#[]
53
- * Sequel::Database#fetch
54
- * Sequel::Dataset#with_sql
53
+ * Sequel::Dataset#fetch_rows
54
+ * Sequel::Dataset#with_sql_all
55
+ * Sequel::Dataset#with_sql_delete
56
+ * Sequel::Dataset#with_sql_each
57
+ * Sequel::Dataset#with_sql_first
58
+ * Sequel::Dataset#with_sql_insert
59
+ * Sequel::Dataset#with_sql_single_value
60
+ * Sequel::Dataset#with_sql_update
55
61
 
56
62
  Here are some examples of use:
57
63
 
64
+ DB.execute 'SQL'
65
+ DB.execute_ddl 'SQL'
66
+ DB.execute_dui 'SQL'
67
+ DB.execute_insert 'SQL'
58
68
  DB.run 'SQL'
59
69
  DB << 'SQL'
60
- DB.execute 'SQL'
61
- DB['SQL'].all
62
- DB.fetch('SQL').all
63
- DB.dataset.with_sql('SQL').all
70
+ DB.fetch_rows('SQL'){|row| }
71
+ DB.dataset.with_sql_all('SQL')
72
+ DB.dataset.with_sql_delete('SQL')
73
+ DB.dataset.with_sql_each('SQL'){|row| }
74
+ DB.dataset.with_sql_first('SQL')
75
+ DB.dataset.with_sql_insert('SQL')
76
+ DB.dataset.with_sql_single_value('SQL')
77
+ DB.dataset.with_sql_update('SQL')
64
78
 
65
79
  If you pass a string to these methods that is derived from user input, you open
66
- yourself up to SQL injection. The Sequel::Database#run, Sequel::Database#<<, and
67
- Sequel::Database#execute methods are not designed to work at all with user input.
68
- If you must use them with user input, you should escape the user input manually
69
- via Sequel::Database#literal. Example:
80
+ yourself up to SQL injection. These methods are not designed to work at all
81
+ with user input. If you must call them with user input, you should escape the
82
+ user input manually via Sequel::Database#literal. Example:
70
83
 
71
84
  DB.run "SOME SQL #{DB.literal(params[:user].to_s)}"
72
85
 
73
- With Sequel::Database#[], Sequel::Database#fetch and Sequel::Dataset#with_sql, you should use placeholders,
74
- in which case Sequel automatically literalizes the input:
86
+ ==== Full SQL Strings, With Possible Placeholders
87
+
88
+ Other Sequel methods are designed to support execution of raw SQL strings that may contain placeholders:
89
+
90
+ * Sequel::Database#[]
91
+ * Sequel::Database#fetch
92
+ * Sequel::Dataset#with_sql
93
+
94
+ Here are some examples of use:
95
+
96
+ DB['SQL'].all
97
+ DB.fetch('SQL').all
98
+ DB.dataset.with_sql('SQL').all
99
+
100
+ With these methods you should use placeholders, in which case Sequel automatically escapes the input:
75
101
 
76
102
  DB['SELECT * FROM foo WHERE bar = ?', params[:user].to_s]
77
103
 
@@ -79,19 +105,16 @@ in which case Sequel automatically literalizes the input:
79
105
 
80
106
  Sequel generally treats ruby strings as SQL strings (escaping them correctly), and
81
107
  not as raw SQL. However, you can convert a ruby string to a literal string, and
82
- Sequel will then treat it as raw SQL. This is typically done through String#lit
83
- if the {core_extensions}[rdoc-ref:doc/core_extensions.rdoc] are in use,
84
- or Sequel.lit[rdoc-ref:Sequel::SQL::Builders#lit] if they are not in use.
108
+ Sequel will then treat it as raw SQL. This is typically done through
109
+ Sequel.lit[rdoc-ref:Sequel::SQL::Builders#lit].
85
110
 
86
- 'a'.lit
87
111
  Sequel.lit('a')
88
112
 
89
- Using String#lit or Sequel.lit[rdoc-ref:Sequel::SQL::Builders#lit] to turn a ruby string into a literal string results
113
+ Using Sequel.lit[rdoc-ref:Sequel::SQL::Builders#lit] to turn a ruby string into a literal string results
90
114
  in SQL injection if the string is derived from user input. With both of these
91
115
  methods, the strings can contain placeholders, which you can use to safely include
92
116
  user input inside a literal string:
93
117
 
94
- 'a = ?'.lit(params[:user_id].to_s)
95
118
  Sequel.lit('a = ?', params[:user_id].to_s)
96
119
 
97
120
  Even though they have similar names, note that Sequel::Database#literal operates very differently from
@@ -109,78 +132,117 @@ a ruby string as raw SQL. For example:
109
132
 
110
133
  ==== SQL Filter Fragments
111
134
 
112
- The most common way to use raw SQL with Sequel is in filters:
135
+ Starting in Sequel 5, Sequel does not automatically convert plain strings to
136
+ literal strings in typical code. Instead, you can use Sequel.lit to
137
+ create literal strings:
113
138
 
114
- DB[:table].where("name > 'M'")
139
+ Sequel.lit("name > 'A'")
115
140
 
116
- If a filter method is passed a string as the first argument, it treats the rest of
117
- the arguments (if any) as placeholders to the string. So you should never do:
141
+ To safely include user input as part of an SQL filter fragment, use Sequel.lit
142
+ with placeholders:
118
143
 
119
- DB[:table].where("name > #{params[:id].to_s}") # SQL Injection!
144
+ DB[:table].where(Sequel.lit("name > ?", params[:id].to_s)) # Safe
120
145
 
121
- Instead, you should use a placeholder:
146
+ Be careful to never call Sequel.lit where the first argument is derived from
147
+ user input.
122
148
 
123
- DB[:table].where("name > ?", params[:id].to_s) # Safe
124
-
125
- Note that for that type of query, Sequel generally encourages the following form:
149
+ There are a few uncommon cases where Sequel will still convert
150
+ plain strings to literal strings.
151
+
152
+ ==== SQL Fragment passed to Dataset#lock_style and Model#lock!
153
+
154
+ The Sequel::Dataset#lock_style and Sequel::Model#lock! methods also treat
155
+ an input string as SQL code. These methods should not be called with user input.
156
+
157
+ DB[:table].lock_style(params[:id]) # SQL injection!
158
+ Album.first.lock!(params[:id]) # SQL injection!
159
+
160
+ ==== SQL Type Names
126
161
 
127
- DB[:table].where{|o| o.name > params[:id].to_s} # Safe
162
+ In general, most places where Sequel needs to use an SQL type that should
163
+ be specified by the user, it allows you to use a ruby string, and that
164
+ string is used verbatim as the SQL type. You should not use user input
165
+ for type strings.
128
166
 
129
- Sequel's DSL supports a wide variety of SQL concepts, so it's possible to
130
- code most applications without ever using raw SQL.
167
+ DB[:table].select(Sequel.cast(:a, params[:id])) # SQL injection!
131
168
 
132
- A large number of dataset methods ultimately pass down their arguments to a filter
133
- method, even some you may not expect, so you should be careful. At least the
134
- following methods pass their arguments to a filter method:
169
+ ==== SQL Function Names
170
+
171
+ In most cases, Sequel does not quote SQL function names. You should not use
172
+ user input for function names.
173
+
174
+ DB[:table].select(Sequel.function(params[:id])) # SQL injection!
175
+
176
+ ==== SQL Window Frames
177
+
178
+ For backwards compatibility, Sequel supports regular strings in the
179
+ window function :frame option, which will be treated as a literal string:
180
+
181
+ DB[:table].select{fun(arg).over(:frame=>'SQL Here')}
182
+
183
+ You should make sure the frame argument is not derived from user input,
184
+ or switch to using a hash as the :frame option value.
185
+
186
+ ==== auto_literal_strings extension
187
+
188
+ If the auto_literal_strings extension is used for backwards compatibility,
189
+ then Sequel will treat plain strings as literal strings if they are used
190
+ as the first argument to a filtering method. This can lead to SQL
191
+ injection:
192
+
193
+ DB[:table].where("name > #{params[:id].to_s}")
194
+ # SQL injection when using auto_literal_strings extension
195
+
196
+ If you are using the auto_literal_strings extension, you need to be very careful,
197
+ as the following methods will treat a plain string given as the first argument
198
+ as a literal string:
135
199
 
136
200
  * Sequel::Dataset#where
137
201
  * Sequel::Dataset#having
138
202
  * Sequel::Dataset#filter
139
203
  * Sequel::Dataset#exclude
140
- * Sequel::Dataset#exclude_where
141
204
  * Sequel::Dataset#exclude_having
142
- * Sequel::Dataset#and
143
205
  * Sequel::Dataset#or
144
206
  * Sequel::Dataset#first
145
207
  * Sequel::Dataset#last
146
208
  * Sequel::Dataset#[]
147
- * Sequel::Dataset#[]=
148
-
149
- The Model.find[rdoc-ref:Sequel::Model::ClassMethods#find] and Model.find_or_create[rdoc-ref:Sequel::Model::ClassMethods#find_or_create]
150
- class methods also call down to the filter methods.
151
-
152
- ==== SQL Fragment passed to Dataset#update
153
209
 
154
- Similar to the filter methods, Sequel::Dataset#update also treats a
155
- string argument as raw SQL:
210
+ Even stuff that looks like it may be safe isn't:
156
211
 
157
- DB[:table].update("column = 1")
212
+ DB[:table].first(params[:num_rows])
213
+ # SQL injection when using auto_literal_strings extension
158
214
 
159
- So you should not do:
215
+ The Model.find[rdoc-ref:Sequel::Model::ClassMethods#find] and
216
+ Model.find_or_create[rdoc-ref:Sequel::Model::ClassMethods#find_or_create]
217
+ class methods will also treat string arguments as literal strings if the
218
+ auto_literal_strings extension is used:
160
219
 
161
- DB[:table].update("column = #{params[:value].to_s}") # SQL Injection!
220
+ Album.find(params[:id])
221
+ # SQL injection when using auto_literal_strings extension
162
222
 
163
- Instead, you should do:
223
+ Similar to the filter methods, the auto_literal_strings extension
224
+ also makes Sequel::Dataset#update treats a string argument as raw SQL:
164
225
 
165
- DB[:table].update(:column => params[:value].to_s) # Safe
226
+ DB[:table].update("column = 1")
166
227
 
167
- ==== SQL Fragment passed to Dataset#lock_style
228
+ So you should not do:
168
229
 
169
- The Sequel::Dataset#lock_style method also treats an input string
170
- as SQL code. This method should not be called with user input.
230
+ DB[:table].update(params[:changes])
231
+ # SQL injection when using auto_literal_strings extension
171
232
 
172
- ==== SQL Type Names
233
+ or:
173
234
 
174
- In general, most places where Sequel needs to use an SQL type that should
175
- be specified by the user, it allows you to use a ruby string, and that
176
- string is used verbatim as the SQL type. You should not use user input
177
- for type strings.
235
+ DB[:table].update("column = #{params[:value].to_s}")
236
+ # SQL injection when using auto_literal_strings extension
178
237
 
179
- ==== SQL Function Names
238
+ Instead, you should do:
180
239
 
181
- In most cases, Sequel does not quote SQL function names. You should not use
182
- user input for function names.
240
+ DB[:table].update(:column => params[:value].to_s) # Safe
183
241
 
242
+ Because using the auto_literal_strings extension makes SQL injection
243
+ so much eaiser, it is recommended to not use it, and instead
244
+ use Sequel.lit with placeholders.
245
+
184
246
  === SQL Identifier Injections
185
247
 
186
248
  Usually, Sequel treats ruby symbols as SQL identifiers, and ruby
@@ -200,7 +262,7 @@ the Sequel::Dataset#insert and Sequel::Dataset#update methods:
200
262
  DB[:t].insert('b'=>1) # INSERT INTO "t" ("b") VALUES (1)
201
263
 
202
264
  Note how the identifier is still quoted in these cases. Sequel quotes identifiers by default
203
- on most databases. However, it does not quote identifiers by default on DB2 and Informix.
265
+ on most databases. However, it does not quote identifiers by default on DB2.
204
266
  On those databases using an identifier derived from user input can lead to SQL injection.
205
267
  Similarly, if you turn off identifier quoting manually on other databases, you open yourself
206
268
  up to SQL injection if you use identifiers derived from user input.
@@ -215,19 +277,24 @@ derived from user input unless absolutely necessary.
215
277
 
216
278
  Sequel also allows you to create identifiers using
217
279
  Sequel.identifier[rdoc-ref:Sequel::SQL::Builders#identifier] for plain identifiers,
218
- Sequel.qualify[rdoc-ref:Sequel::SQL::Builders#qualify] for qualified identifiers, and
280
+ Sequel.qualify[rdoc-ref:Sequel::SQL::Builders#qualify] and
281
+ Sequel::SQL::Indentifier#[][rdoc-ref:Sequel::SQL::QualifyingMethods#[]] for qualified identifiers, and
219
282
  Sequel.as[rdoc-ref:Sequel::SQL::Builders#as] for aliased expressions. So if you
220
283
  pass any of those values derived from user input, you are dealing with the same scenario.
221
284
 
222
285
  Note that the issues with SQL identifiers do not just apply to places where
223
286
  strings are used as identifiers, they also apply to all places where Sequel
224
287
  uses symbols as identifiers. However, if you are creating symbols from user input,
225
- you at least have a denial of service vulnerability, and possibly a more serious
226
- vulnerability.
288
+ you at least have a denial of service vulnerability in ruby <2.2, and possibly a
289
+ more serious vulnerability.
290
+
291
+ Note that many Database schema modification methods (e.g. create_table, add_column)
292
+ also allow for SQL identifier injections, and possibly also SQL code injections.
293
+ These methods should never be called with user input.
227
294
 
228
295
  == Denial of Service
229
296
 
230
- Sequel converts some strings to symbols. Because symbols in ruby are not
297
+ Sequel converts some strings to symbols. Because symbols in ruby <2.2 are not
231
298
  garbage collected, if the strings that are converted to symbols are
232
299
  derived from user input, you have a denial of service vulnerability due to
233
300
  memory exhaustion.
@@ -256,7 +323,7 @@ if you allow the user to control the alias name:
256
323
 
257
324
  DB[:table].select(:column.as(params[:alias]))
258
325
 
259
- Then you have a denial of service vulnerability. In general, such a vulnerability
326
+ Then you can have a denial of service vulnerability. In general, such a vulnerability
260
327
  is unlikely, because you are probably indexing into the returned hash(es) by name,
261
328
  and if an alias was used and you didn't expect it, your application wouldn't work.
262
329
 
@@ -302,25 +369,31 @@ they also allow mass assignment:
302
369
  Album.new(params[:album]) # Mass Assignment
303
370
  Album.create(params[:album]) # Mass Assignment
304
371
 
305
- Instead of these methods, it is encouraged to either use the
306
- Model#set_only[rdoc-ref:Sequel::Model::InstanceMethods#set_only],
307
- Model#update_only[rdoc-ref:Sequel::Model::InstanceMethods#update_only],
308
- Model#set_fields[rdoc-ref:Sequel::Model::InstanceMethods#set_fields], or
309
- Model#update_fields[rdoc-ref:Sequel::Model::InstanceMethods#update_fields]
310
- methods, which allow you to specify which fields
311
- to allow on a per-call basis. This pretty much eliminates the chance that the
312
- user will be able to set a column you did not intend to allow:
372
+ When the argument is derived from user input, instead of these methods, it is encouraged to either use
373
+ Model#set_fields[rdoc-ref:Sequel::Model::InstanceMethods#set_fields] or
374
+ Model#update_fields[rdoc-ref:Sequel::Model::InstanceMethods#update_fields],
375
+ which allow you to specify which fields to allow on a per-call basis. This
376
+ pretty much eliminates the chance that the user will be able to set a column
377
+ you did not intend to allow:
313
378
 
314
- album.set_only(params[:album], [:name, :copies_sold])
315
379
  album.set_fields(params[:album], [:name, :copies_sold])
380
+ album.update_fields(params[:album], [:name, :copies_sold])
316
381
 
317
- You can override the columns to allow by default during mass assignment via
318
- the Model.set_allowed_columns[rdoc-ref:Sequel::Model::ClassMethods#set_allowed_columns] class method. This is a good
319
- practice, though being explicit on a per-call basis is still recommended:
382
+ These two methods iterate over the second argument (+:name+ and +:copies_sold+ in
383
+ this example) instead of iterating over the entries in the first argument
384
+ (<tt>params[:album]</tt> in this example).
320
385
 
386
+ If you want to override the columns that Model#set[rdoc-ref:Sequel::Model::InstanceMethods#set]
387
+ allows by default during mass assignment, you can use the whitelist_security plugin, then call
388
+ the set_allowed_columns class method.
389
+
390
+ Album.plugin :whitelist_security
321
391
  Album.set_allowed_columns(:name, :copies_sold)
322
392
  Album.create(params[:album]) # Only name and copies_sold set
323
393
 
394
+ Being explicit on a per-call basis using the set_fields and update_fields methods is recommended
395
+ instead of using the whitelist_security plugin and setting a global whitelist.
396
+
324
397
  For more details on the mass assignment methods, see the {Mass Assignment Guide}[rdoc-ref:doc/mass_assignment.rdoc].
325
398
 
326
399
  == General Parameter Handling
@@ -331,8 +404,8 @@ their type. For example:
331
404
 
332
405
  Album.where(:id=>params[:id])
333
406
 
334
- is probably a bad idea. Assuming you are using a web framework, params\[:id\] could
335
- be a string, an array, a hash, or nil.
407
+ is probably a bad idea. Assuming you are using a web framework, <tt>params[:id]</tt> could
408
+ be a string, an array, a hash, nil, or potentially something else.
336
409
 
337
410
  Assuming that +id+ is an integer field, you probably want to do:
338
411
 
@@ -346,7 +419,7 @@ a string:
346
419
  If you are trying to use an IN clause with a list of id values based on input provided
347
420
  on a web form:
348
421
 
349
- Album.where(:id=>params[:ids].to_a.map{|i| i.to_i})
422
+ Album.where(:id=>params[:ids].to_a.map(&:to_i))
350
423
 
351
424
  Basically, be as explicit as possible. While there aren't any known security issues
352
425
  in Sequel when you do: