sequel 5.8.0 → 5.38.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 (510) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +409 -1795
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +4 -4
  5. data/bin/sequel +4 -0
  6. data/doc/advanced_associations.rdoc +136 -18
  7. data/doc/association_basics.rdoc +10 -5
  8. data/doc/cheat_sheet.rdoc +1 -0
  9. data/doc/code_order.rdoc +12 -2
  10. data/doc/dataset_filtering.rdoc +17 -2
  11. data/doc/mass_assignment.rdoc +3 -3
  12. data/doc/model_dataset_method_design.rdoc +1 -1
  13. data/doc/model_plugins.rdoc +1 -1
  14. data/doc/opening_databases.rdoc +30 -8
  15. data/doc/postgresql.rdoc +107 -2
  16. data/doc/release_notes/5.10.0.txt +84 -0
  17. data/doc/release_notes/5.11.0.txt +83 -0
  18. data/doc/release_notes/5.12.0.txt +141 -0
  19. data/doc/release_notes/5.13.0.txt +27 -0
  20. data/doc/release_notes/5.14.0.txt +63 -0
  21. data/doc/release_notes/5.15.0.txt +39 -0
  22. data/doc/release_notes/5.16.0.txt +110 -0
  23. data/doc/release_notes/5.17.0.txt +31 -0
  24. data/doc/release_notes/5.18.0.txt +69 -0
  25. data/doc/release_notes/5.19.0.txt +28 -0
  26. data/doc/release_notes/5.20.0.txt +89 -0
  27. data/doc/release_notes/5.21.0.txt +87 -0
  28. data/doc/release_notes/5.22.0.txt +48 -0
  29. data/doc/release_notes/5.23.0.txt +56 -0
  30. data/doc/release_notes/5.24.0.txt +56 -0
  31. data/doc/release_notes/5.25.0.txt +32 -0
  32. data/doc/release_notes/5.26.0.txt +35 -0
  33. data/doc/release_notes/5.27.0.txt +21 -0
  34. data/doc/release_notes/5.28.0.txt +16 -0
  35. data/doc/release_notes/5.29.0.txt +22 -0
  36. data/doc/release_notes/5.30.0.txt +20 -0
  37. data/doc/release_notes/5.31.0.txt +148 -0
  38. data/doc/release_notes/5.32.0.txt +46 -0
  39. data/doc/release_notes/5.33.0.txt +24 -0
  40. data/doc/release_notes/5.34.0.txt +40 -0
  41. data/doc/release_notes/5.35.0.txt +56 -0
  42. data/doc/release_notes/5.36.0.txt +60 -0
  43. data/doc/release_notes/5.37.0.txt +30 -0
  44. data/doc/release_notes/5.38.0.txt +28 -0
  45. data/doc/release_notes/5.9.0.txt +99 -0
  46. data/doc/security.rdoc +10 -0
  47. data/doc/sharding.rdoc +42 -28
  48. data/doc/sql.rdoc +12 -0
  49. data/doc/testing.rdoc +24 -17
  50. data/doc/transactions.rdoc +78 -0
  51. data/doc/validations.rdoc +2 -2
  52. data/lib/sequel/adapters/ado.rb +26 -18
  53. data/lib/sequel/adapters/ado/access.rb +2 -2
  54. data/lib/sequel/adapters/ado/mssql.rb +5 -8
  55. data/lib/sequel/adapters/amalgalite.rb +1 -1
  56. data/lib/sequel/adapters/jdbc.rb +71 -27
  57. data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
  58. data/lib/sequel/adapters/jdbc/oracle.rb +7 -6
  59. data/lib/sequel/adapters/jdbc/postgresql.rb +17 -28
  60. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +5 -6
  61. data/lib/sequel/adapters/jdbc/sqlite.rb +33 -2
  62. data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -3
  63. data/lib/sequel/adapters/jdbc/transactions.rb +14 -28
  64. data/lib/sequel/adapters/mysql.rb +14 -15
  65. data/lib/sequel/adapters/mysql2.rb +5 -3
  66. data/lib/sequel/adapters/odbc.rb +4 -6
  67. data/lib/sequel/adapters/oracle.rb +7 -7
  68. data/lib/sequel/adapters/postgres.rb +52 -16
  69. data/lib/sequel/adapters/shared/access.rb +16 -12
  70. data/lib/sequel/adapters/shared/db2.rb +5 -0
  71. data/lib/sequel/adapters/shared/mssql.rb +41 -18
  72. data/lib/sequel/adapters/shared/mysql.rb +66 -19
  73. data/lib/sequel/adapters/shared/oracle.rb +29 -23
  74. data/lib/sequel/adapters/shared/postgres.rb +341 -95
  75. data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
  76. data/lib/sequel/adapters/shared/sqlite.rb +174 -21
  77. data/lib/sequel/adapters/sqlanywhere.rb +33 -17
  78. data/lib/sequel/adapters/sqlite.rb +78 -68
  79. data/lib/sequel/adapters/tinytds.rb +14 -6
  80. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +2 -5
  81. data/lib/sequel/adapters/utils/mysql_mysql2.rb +5 -1
  82. data/lib/sequel/connection_pool.rb +2 -6
  83. data/lib/sequel/connection_pool/sharded_single.rb +7 -4
  84. data/lib/sequel/connection_pool/sharded_threaded.rb +32 -21
  85. data/lib/sequel/connection_pool/single.rb +1 -1
  86. data/lib/sequel/connection_pool/threaded.rb +26 -11
  87. data/lib/sequel/core.rb +327 -319
  88. data/lib/sequel/database/connecting.rb +7 -8
  89. data/lib/sequel/database/logging.rb +7 -1
  90. data/lib/sequel/database/misc.rb +68 -34
  91. data/lib/sequel/database/query.rb +6 -4
  92. data/lib/sequel/database/schema_generator.rb +31 -11
  93. data/lib/sequel/database/schema_methods.rb +32 -22
  94. data/lib/sequel/database/transactions.rb +129 -25
  95. data/lib/sequel/dataset.rb +4 -2
  96. data/lib/sequel/dataset/actions.rb +34 -23
  97. data/lib/sequel/dataset/features.rb +34 -0
  98. data/lib/sequel/dataset/graph.rb +27 -11
  99. data/lib/sequel/dataset/misc.rb +17 -3
  100. data/lib/sequel/dataset/placeholder_literalizer.rb +50 -21
  101. data/lib/sequel/dataset/prepared_statements.rb +96 -26
  102. data/lib/sequel/dataset/query.rb +43 -8
  103. data/lib/sequel/dataset/sql.rb +189 -41
  104. data/lib/sequel/deprecated.rb +3 -1
  105. data/lib/sequel/exceptions.rb +2 -0
  106. data/lib/sequel/extensions/_pretty_table.rb +1 -2
  107. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  108. data/lib/sequel/extensions/caller_logging.rb +79 -0
  109. data/lib/sequel/extensions/columns_introspection.rb +1 -2
  110. data/lib/sequel/extensions/connection_expiration.rb +6 -6
  111. data/lib/sequel/extensions/connection_validator.rb +7 -6
  112. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  113. data/lib/sequel/extensions/constraint_validations.rb +53 -28
  114. data/lib/sequel/extensions/core_refinements.rb +2 -0
  115. data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -0
  116. data/lib/sequel/extensions/escaped_like.rb +100 -0
  117. data/lib/sequel/extensions/eval_inspect.rb +3 -1
  118. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  119. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  120. data/lib/sequel/extensions/index_caching.rb +9 -7
  121. data/lib/sequel/extensions/integer64.rb +3 -1
  122. data/lib/sequel/extensions/looser_typecasting.rb +3 -3
  123. data/lib/sequel/extensions/migration.rb +13 -6
  124. data/lib/sequel/extensions/named_timezones.rb +84 -23
  125. data/lib/sequel/extensions/pg_array.rb +87 -79
  126. data/lib/sequel/extensions/pg_array_ops.rb +14 -6
  127. data/lib/sequel/extensions/pg_enum.rb +34 -18
  128. data/lib/sequel/extensions/pg_extended_date_support.rb +34 -14
  129. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  130. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
  131. data/lib/sequel/extensions/pg_inet.rb +15 -5
  132. data/lib/sequel/extensions/pg_interval.rb +2 -0
  133. data/lib/sequel/extensions/pg_json.rb +387 -123
  134. data/lib/sequel/extensions/pg_json_ops.rb +168 -0
  135. data/lib/sequel/extensions/pg_range.rb +20 -10
  136. data/lib/sequel/extensions/pg_range_ops.rb +2 -0
  137. data/lib/sequel/extensions/pg_row.rb +3 -2
  138. data/lib/sequel/extensions/pg_row_ops.rb +24 -0
  139. data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
  140. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  141. data/lib/sequel/extensions/query.rb +1 -0
  142. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  143. data/lib/sequel/extensions/s.rb +2 -0
  144. data/lib/sequel/extensions/schema_dumper.rb +13 -7
  145. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +4 -2
  146. data/lib/sequel/extensions/server_block.rb +18 -7
  147. data/lib/sequel/extensions/sql_comments.rb +2 -2
  148. data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
  149. data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
  150. data/lib/sequel/extensions/to_dot.rb +9 -3
  151. data/lib/sequel/model.rb +3 -1
  152. data/lib/sequel/model/associations.rb +403 -69
  153. data/lib/sequel/model/base.rb +170 -90
  154. data/lib/sequel/model/plugins.rb +105 -0
  155. data/lib/sequel/plugins/after_initialize.rb +1 -1
  156. data/lib/sequel/plugins/association_dependencies.rb +3 -3
  157. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  158. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  159. data/lib/sequel/plugins/association_pks.rb +74 -22
  160. data/lib/sequel/plugins/association_proxies.rb +6 -2
  161. data/lib/sequel/plugins/auto_validations.rb +36 -17
  162. data/lib/sequel/plugins/blacklist_security.rb +1 -2
  163. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  164. data/lib/sequel/plugins/caching.rb +3 -0
  165. data/lib/sequel/plugins/class_table_inheritance.rb +62 -34
  166. data/lib/sequel/plugins/composition.rb +13 -9
  167. data/lib/sequel/plugins/csv_serializer.rb +28 -9
  168. data/lib/sequel/plugins/defaults_setter.rb +2 -2
  169. data/lib/sequel/plugins/dirty.rb +60 -22
  170. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  171. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  172. data/lib/sequel/plugins/finder.rb +2 -2
  173. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  174. data/lib/sequel/plugins/hook_class_methods.rb +17 -5
  175. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  176. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  177. data/lib/sequel/plugins/inverted_subsets.rb +2 -2
  178. data/lib/sequel/plugins/json_serializer.rb +21 -14
  179. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  180. data/lib/sequel/plugins/list.rb +22 -10
  181. data/lib/sequel/plugins/many_through_many.rb +1 -1
  182. data/lib/sequel/plugins/nested_attributes.rb +27 -5
  183. data/lib/sequel/plugins/pg_array_associations.rb +12 -9
  184. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +149 -61
  185. data/lib/sequel/plugins/prepared_statements.rb +6 -12
  186. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
  187. data/lib/sequel/plugins/rcte_tree.rb +20 -22
  188. data/lib/sequel/plugins/sharding.rb +13 -7
  189. data/lib/sequel/plugins/single_table_inheritance.rb +20 -15
  190. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  191. data/lib/sequel/plugins/static_cache.rb +36 -17
  192. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  193. data/lib/sequel/plugins/string_stripper.rb +1 -1
  194. data/lib/sequel/plugins/subclasses.rb +2 -0
  195. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  196. data/lib/sequel/plugins/tactical_eager_loading.rb +73 -2
  197. data/lib/sequel/plugins/throw_failures.rb +110 -0
  198. data/lib/sequel/plugins/tree.rb +49 -31
  199. data/lib/sequel/plugins/typecast_on_load.rb +3 -2
  200. data/lib/sequel/plugins/validation_class_methods.rb +11 -5
  201. data/lib/sequel/plugins/validation_helpers.rb +2 -2
  202. data/lib/sequel/sql.rb +120 -30
  203. data/lib/sequel/timezones.rb +55 -14
  204. data/lib/sequel/version.rb +6 -1
  205. metadata +101 -361
  206. data/Rakefile +0 -151
  207. data/doc/release_notes/4.0.0.txt +0 -262
  208. data/doc/release_notes/4.1.0.txt +0 -85
  209. data/doc/release_notes/4.10.0.txt +0 -226
  210. data/doc/release_notes/4.11.0.txt +0 -147
  211. data/doc/release_notes/4.12.0.txt +0 -105
  212. data/doc/release_notes/4.13.0.txt +0 -169
  213. data/doc/release_notes/4.14.0.txt +0 -68
  214. data/doc/release_notes/4.15.0.txt +0 -56
  215. data/doc/release_notes/4.16.0.txt +0 -36
  216. data/doc/release_notes/4.17.0.txt +0 -38
  217. data/doc/release_notes/4.18.0.txt +0 -36
  218. data/doc/release_notes/4.19.0.txt +0 -45
  219. data/doc/release_notes/4.2.0.txt +0 -129
  220. data/doc/release_notes/4.20.0.txt +0 -79
  221. data/doc/release_notes/4.21.0.txt +0 -94
  222. data/doc/release_notes/4.22.0.txt +0 -72
  223. data/doc/release_notes/4.23.0.txt +0 -65
  224. data/doc/release_notes/4.24.0.txt +0 -99
  225. data/doc/release_notes/4.25.0.txt +0 -181
  226. data/doc/release_notes/4.26.0.txt +0 -44
  227. data/doc/release_notes/4.27.0.txt +0 -78
  228. data/doc/release_notes/4.28.0.txt +0 -57
  229. data/doc/release_notes/4.29.0.txt +0 -41
  230. data/doc/release_notes/4.3.0.txt +0 -40
  231. data/doc/release_notes/4.30.0.txt +0 -37
  232. data/doc/release_notes/4.31.0.txt +0 -57
  233. data/doc/release_notes/4.32.0.txt +0 -132
  234. data/doc/release_notes/4.33.0.txt +0 -88
  235. data/doc/release_notes/4.34.0.txt +0 -86
  236. data/doc/release_notes/4.35.0.txt +0 -130
  237. data/doc/release_notes/4.36.0.txt +0 -116
  238. data/doc/release_notes/4.37.0.txt +0 -50
  239. data/doc/release_notes/4.38.0.txt +0 -67
  240. data/doc/release_notes/4.39.0.txt +0 -127
  241. data/doc/release_notes/4.4.0.txt +0 -92
  242. data/doc/release_notes/4.40.0.txt +0 -179
  243. data/doc/release_notes/4.41.0.txt +0 -77
  244. data/doc/release_notes/4.42.0.txt +0 -221
  245. data/doc/release_notes/4.43.0.txt +0 -87
  246. data/doc/release_notes/4.44.0.txt +0 -125
  247. data/doc/release_notes/4.45.0.txt +0 -370
  248. data/doc/release_notes/4.46.0.txt +0 -404
  249. data/doc/release_notes/4.47.0.txt +0 -56
  250. data/doc/release_notes/4.48.0.txt +0 -293
  251. data/doc/release_notes/4.49.0.txt +0 -222
  252. data/doc/release_notes/4.5.0.txt +0 -34
  253. data/doc/release_notes/4.6.0.txt +0 -30
  254. data/doc/release_notes/4.7.0.txt +0 -103
  255. data/doc/release_notes/4.8.0.txt +0 -175
  256. data/doc/release_notes/4.9.0.txt +0 -190
  257. data/spec/adapter_spec.rb +0 -4
  258. data/spec/adapters/db2_spec.rb +0 -170
  259. data/spec/adapters/mssql_spec.rb +0 -804
  260. data/spec/adapters/mysql_spec.rb +0 -1041
  261. data/spec/adapters/oracle_spec.rb +0 -327
  262. data/spec/adapters/postgres_spec.rb +0 -4000
  263. data/spec/adapters/spec_helper.rb +0 -43
  264. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  265. data/spec/adapters/sqlite_spec.rb +0 -600
  266. data/spec/bin_spec.rb +0 -269
  267. data/spec/core/connection_pool_spec.rb +0 -1228
  268. data/spec/core/database_spec.rb +0 -2673
  269. data/spec/core/dataset_spec.rb +0 -5419
  270. data/spec/core/deprecated_spec.rb +0 -70
  271. data/spec/core/expression_filters_spec.rb +0 -1344
  272. data/spec/core/mock_adapter_spec.rb +0 -722
  273. data/spec/core/object_graph_spec.rb +0 -306
  274. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  275. data/spec/core/schema_generator_spec.rb +0 -214
  276. data/spec/core/schema_spec.rb +0 -1820
  277. data/spec/core/spec_helper.rb +0 -23
  278. data/spec/core/version_spec.rb +0 -7
  279. data/spec/core_extensions_spec.rb +0 -762
  280. data/spec/core_model_spec.rb +0 -2
  281. data/spec/core_spec.rb +0 -1
  282. data/spec/deprecation_helper.rb +0 -30
  283. data/spec/extensions/accessed_columns_spec.rb +0 -51
  284. data/spec/extensions/active_model_spec.rb +0 -99
  285. data/spec/extensions/after_initialize_spec.rb +0 -24
  286. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  287. data/spec/extensions/association_dependencies_spec.rb +0 -125
  288. data/spec/extensions/association_pks_spec.rb +0 -423
  289. data/spec/extensions/association_proxies_spec.rb +0 -100
  290. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  291. data/spec/extensions/auto_validations_spec.rb +0 -202
  292. data/spec/extensions/blacklist_security_spec.rb +0 -95
  293. data/spec/extensions/blank_spec.rb +0 -69
  294. data/spec/extensions/boolean_readers_spec.rb +0 -93
  295. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  296. data/spec/extensions/caching_spec.rb +0 -273
  297. data/spec/extensions/class_table_inheritance_spec.rb +0 -568
  298. data/spec/extensions/column_conflicts_spec.rb +0 -75
  299. data/spec/extensions/column_select_spec.rb +0 -129
  300. data/spec/extensions/columns_introspection_spec.rb +0 -90
  301. data/spec/extensions/columns_updated_spec.rb +0 -35
  302. data/spec/extensions/composition_spec.rb +0 -248
  303. data/spec/extensions/connection_expiration_spec.rb +0 -133
  304. data/spec/extensions/connection_validator_spec.rb +0 -127
  305. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  306. data/spec/extensions/constraint_validations_spec.rb +0 -395
  307. data/spec/extensions/core_refinements_spec.rb +0 -528
  308. data/spec/extensions/csv_serializer_spec.rb +0 -183
  309. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  310. data/spec/extensions/dataset_associations_spec.rb +0 -365
  311. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  312. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  313. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  314. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  315. data/spec/extensions/defaults_setter_spec.rb +0 -141
  316. data/spec/extensions/delay_add_association_spec.rb +0 -73
  317. data/spec/extensions/dirty_spec.rb +0 -189
  318. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  319. data/spec/extensions/eager_each_spec.rb +0 -62
  320. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  321. data/spec/extensions/error_splitter_spec.rb +0 -18
  322. data/spec/extensions/error_sql_spec.rb +0 -20
  323. data/spec/extensions/eval_inspect_spec.rb +0 -74
  324. data/spec/extensions/finder_spec.rb +0 -260
  325. data/spec/extensions/force_encoding_spec.rb +0 -126
  326. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  327. data/spec/extensions/graph_each_spec.rb +0 -113
  328. data/spec/extensions/hook_class_methods_spec.rb +0 -380
  329. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  330. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  331. data/spec/extensions/index_caching_spec.rb +0 -66
  332. data/spec/extensions/inflector_spec.rb +0 -183
  333. data/spec/extensions/input_transformer_spec.rb +0 -69
  334. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  335. data/spec/extensions/instance_filters_spec.rb +0 -79
  336. data/spec/extensions/instance_hooks_spec.rb +0 -246
  337. data/spec/extensions/integer64_spec.rb +0 -22
  338. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  339. data/spec/extensions/json_serializer_spec.rb +0 -336
  340. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  341. data/spec/extensions/list_spec.rb +0 -275
  342. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  343. data/spec/extensions/many_through_many_spec.rb +0 -2177
  344. data/spec/extensions/migration_spec.rb +0 -840
  345. data/spec/extensions/modification_detection_spec.rb +0 -93
  346. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  347. data/spec/extensions/named_timezones_spec.rb +0 -109
  348. data/spec/extensions/nested_attributes_spec.rb +0 -703
  349. data/spec/extensions/null_dataset_spec.rb +0 -85
  350. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  351. data/spec/extensions/pagination_spec.rb +0 -116
  352. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  353. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  354. data/spec/extensions/pg_array_spec.rb +0 -398
  355. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -165
  356. data/spec/extensions/pg_enum_spec.rb +0 -113
  357. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  358. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  359. data/spec/extensions/pg_hstore_spec.rb +0 -219
  360. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  361. data/spec/extensions/pg_inet_spec.rb +0 -72
  362. data/spec/extensions/pg_interval_spec.rb +0 -103
  363. data/spec/extensions/pg_json_ops_spec.rb +0 -289
  364. data/spec/extensions/pg_json_spec.rb +0 -262
  365. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  366. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  367. data/spec/extensions/pg_range_spec.rb +0 -487
  368. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  369. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  370. data/spec/extensions/pg_row_spec.rb +0 -363
  371. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  372. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  373. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  374. data/spec/extensions/prepared_statements_spec.rb +0 -182
  375. data/spec/extensions/pretty_table_spec.rb +0 -123
  376. data/spec/extensions/query_spec.rb +0 -94
  377. data/spec/extensions/rcte_tree_spec.rb +0 -381
  378. data/spec/extensions/round_timestamps_spec.rb +0 -39
  379. data/spec/extensions/s_spec.rb +0 -60
  380. data/spec/extensions/schema_caching_spec.rb +0 -64
  381. data/spec/extensions/schema_dumper_spec.rb +0 -868
  382. data/spec/extensions/select_remove_spec.rb +0 -38
  383. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  384. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  385. data/spec/extensions/serialization_spec.rb +0 -365
  386. data/spec/extensions/server_block_spec.rb +0 -97
  387. data/spec/extensions/server_logging_spec.rb +0 -45
  388. data/spec/extensions/sharding_spec.rb +0 -189
  389. data/spec/extensions/shared_caching_spec.rb +0 -151
  390. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  391. data/spec/extensions/singular_table_names_spec.rb +0 -22
  392. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  393. data/spec/extensions/spec_helper.rb +0 -61
  394. data/spec/extensions/split_array_nil_spec.rb +0 -24
  395. data/spec/extensions/split_values_spec.rb +0 -57
  396. data/spec/extensions/sql_comments_spec.rb +0 -33
  397. data/spec/extensions/sql_expr_spec.rb +0 -59
  398. data/spec/extensions/static_cache_spec.rb +0 -410
  399. data/spec/extensions/string_agg_spec.rb +0 -90
  400. data/spec/extensions/string_date_time_spec.rb +0 -95
  401. data/spec/extensions/string_stripper_spec.rb +0 -68
  402. data/spec/extensions/subclasses_spec.rb +0 -79
  403. data/spec/extensions/subset_conditions_spec.rb +0 -38
  404. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  405. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  406. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  407. data/spec/extensions/table_select_spec.rb +0 -83
  408. data/spec/extensions/tactical_eager_loading_spec.rb +0 -141
  409. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  410. data/spec/extensions/timestamps_spec.rb +0 -209
  411. data/spec/extensions/to_dot_spec.rb +0 -153
  412. data/spec/extensions/touch_spec.rb +0 -226
  413. data/spec/extensions/tree_spec.rb +0 -284
  414. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  415. data/spec/extensions/unlimited_update_spec.rb +0 -21
  416. data/spec/extensions/update_or_create_spec.rb +0 -83
  417. data/spec/extensions/update_primary_key_spec.rb +0 -105
  418. data/spec/extensions/update_refresh_spec.rb +0 -59
  419. data/spec/extensions/uuid_spec.rb +0 -101
  420. data/spec/extensions/validate_associated_spec.rb +0 -52
  421. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  422. data/spec/extensions/validation_contexts_spec.rb +0 -31
  423. data/spec/extensions/validation_helpers_spec.rb +0 -525
  424. data/spec/extensions/whitelist_security_spec.rb +0 -157
  425. data/spec/extensions/xml_serializer_spec.rb +0 -213
  426. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  427. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  428. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  429. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  430. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  431. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  432. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  433. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  434. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  435. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  436. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  437. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  438. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  439. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  440. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  441. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  442. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  443. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  444. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  445. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  446. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  447. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  448. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  449. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  450. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  451. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  452. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  453. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  454. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  455. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  456. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  457. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  458. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  459. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  460. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  461. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  462. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  463. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  464. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  465. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  466. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  467. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  468. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  469. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  470. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  471. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  472. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  473. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  474. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  475. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  476. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  477. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  478. data/spec/guards_helper.rb +0 -58
  479. data/spec/integration/associations_test.rb +0 -2513
  480. data/spec/integration/database_test.rb +0 -113
  481. data/spec/integration/dataset_test.rb +0 -1880
  482. data/spec/integration/eager_loader_test.rb +0 -687
  483. data/spec/integration/migrator_test.rb +0 -262
  484. data/spec/integration/model_test.rb +0 -203
  485. data/spec/integration/plugin_test.rb +0 -2302
  486. data/spec/integration/prepared_statement_test.rb +0 -398
  487. data/spec/integration/schema_test.rb +0 -869
  488. data/spec/integration/spec_helper.rb +0 -64
  489. data/spec/integration/timezone_test.rb +0 -86
  490. data/spec/integration/transaction_test.rb +0 -354
  491. data/spec/integration/type_test.rb +0 -127
  492. data/spec/model/association_reflection_spec.rb +0 -803
  493. data/spec/model/associations_spec.rb +0 -4538
  494. data/spec/model/base_spec.rb +0 -817
  495. data/spec/model/class_dataset_methods_spec.rb +0 -146
  496. data/spec/model/dataset_methods_spec.rb +0 -198
  497. data/spec/model/eager_loading_spec.rb +0 -2262
  498. data/spec/model/hooks_spec.rb +0 -370
  499. data/spec/model/inflector_spec.rb +0 -26
  500. data/spec/model/model_spec.rb +0 -953
  501. data/spec/model/plugins_spec.rb +0 -318
  502. data/spec/model/record_spec.rb +0 -2107
  503. data/spec/model/spec_helper.rb +0 -45
  504. data/spec/model/validations_spec.rb +0 -193
  505. data/spec/model_no_assoc_spec.rb +0 -1
  506. data/spec/model_spec.rb +0 -1
  507. data/spec/plugin_spec.rb +0 -1
  508. data/spec/sequel_coverage.rb +0 -15
  509. data/spec/sequel_warning.rb +0 -4
  510. data/spec/spec_config.rb +0 -12
@@ -0,0 +1,110 @@
1
+ # frozen-string-literal: true
2
+
3
+ module Sequel
4
+ module Plugins
5
+ # The throw_failures plugin throws HookFailed and ValidationFailed exceptions instead
6
+ # of raising them. If there is no matching catch block, the UncaughtThrowError will be rescued
7
+ # and the HookFailed or ValidationFailed exception will be raised normally.
8
+ #
9
+ # If you are setting up the catch blocks to handle these failures, in the failure case this
10
+ # plugin is about 10-15% faster on CRuby and 10x faster on JRuby. If you are not
11
+ # setting up the catch blocks, in the failure case this plugin is about 30% slower on CRuby
12
+ # and 2x slower on JRuby. So this plugin should only be used if you are setting up catch
13
+ # blocks manually.
14
+ #
15
+ # This plugin will setup catch blocks automatically for internally rescued HookFailed
16
+ # exceptions when the model is configured to not raise exceptions on failure (by default,
17
+ # the exceptions are internally rescued in that case.
18
+ #
19
+ # To set up the catch blocks, use the class of the exception:
20
+ #
21
+ # ret = catch(Sequel::ValidationFailed) do
22
+ # model_instance.save
23
+ # end
24
+ # if ret.is_a?(Sequel::ValidationFailed)
25
+ # # handle failure
26
+ # else
27
+ # # handle success
28
+ # end
29
+ #
30
+ # Usage:
31
+ #
32
+ # # Make all model subclass instances throw HookFailed and ValidationFailed exceptions
33
+ # # (called before loading subclasses)
34
+ # Sequel::Model.plugin :throw_failures
35
+ #
36
+ # # Make the Album class throw HookFailed and ValidationFailed exceptions
37
+ # Album.plugin :throw_failures
38
+ module ThrowFailures
39
+ module InstanceMethods
40
+ # Catch any thrown HookFailed exceptions.
41
+ def valid?(opts = OPTS)
42
+ catch_hook_failures{super} || false
43
+ end
44
+
45
+ private
46
+
47
+ # Catch any HookFailed exceptions thrown inside the block, and return
48
+ # nil if there were any.
49
+ def catch_hook_failures
50
+ called = ret = nil
51
+ catch(HookFailed) do
52
+ ret = yield
53
+ called = true
54
+ end
55
+ ret if called
56
+ end
57
+
58
+ # Catch any thrown HookFailed exceptions if not raising on failure.
59
+ def checked_save_failure(opts)
60
+ if raise_on_failure?(opts)
61
+ super
62
+ else
63
+ catch_hook_failures{super}
64
+ end
65
+ end
66
+
67
+ if RUBY_VERSION >= '2.2' && (!defined?(JRUBY_VERSION) || JRUBY_VERSION > '9.1')
68
+ # Throw HookFailed with the generated error. If the throw is not
69
+ # caught, just return the originally generated error.
70
+ def hook_failed_error(msg)
71
+ e = super
72
+ throw HookFailed, e
73
+ rescue UncaughtThrowError
74
+ e
75
+ end
76
+
77
+ # Throw ValidationFailed with the generated error. If the throw is not
78
+ # caught, just return the originally generated error.
79
+ def validation_failed_error
80
+ e = super
81
+ throw ValidationFailed, e
82
+ rescue UncaughtThrowError
83
+ e
84
+ end
85
+ else
86
+ # UncaughtThrowError was added in Ruby 2.2. Older Ruby versions
87
+ # used ArgumentError with "uncaught throw" at the start of the message
88
+
89
+ # :nocov:
90
+ def hook_failed_error(msg)
91
+ e = super
92
+ throw HookFailed, e
93
+ rescue ArgumentError => e2
94
+ raise e2 unless e2.message.start_with?('uncaught throw')
95
+ e
96
+ end
97
+
98
+ def validation_failed_error
99
+ e = super
100
+ throw ValidationFailed, e
101
+ rescue ArgumentError => e2
102
+ raise e2 unless e2.message.start_with?('uncaught throw')
103
+ e
104
+ end
105
+ # :nocov:
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
@@ -32,25 +32,27 @@ module Sequel
32
32
  def self.apply(model, opts=OPTS)
33
33
  opts = opts.dup
34
34
  opts[:class] = model
35
+ opts[:key] ||= :parent_id
35
36
 
36
- model.instance_exec do
37
- @parent_column = (opts[:key] ||= :parent_id)
38
- @tree_order = opts[:order]
39
- end
40
-
41
- par = opts.merge(opts.fetch(:parent, {}))
37
+ par = opts.merge(opts.fetch(:parent, OPTS))
42
38
  parent = par.fetch(:name, :parent)
43
39
 
44
- chi = opts.merge(opts.fetch(:children, {}))
40
+ chi = opts.merge(opts.fetch(:children, OPTS))
45
41
  children = chi.fetch(:name, :children)
46
42
 
47
43
  par[:reciprocal] = children
48
44
  chi[:reciprocal] = parent
49
45
 
50
- model.many_to_one parent, par
51
- model.one_to_many children, chi
46
+ model.instance_exec do
47
+ @parent_column = opts[:key]
48
+ @tree_order = opts[:order]
49
+ @parent_association_name = parent
50
+ @children_association_name = children
52
51
 
53
- model.plugin SingleRoot if opts[:single_root]
52
+ many_to_one parent, par
53
+ one_to_many children, chi
54
+ plugin SingleRoot if opts[:single_root]
55
+ end
54
56
  end
55
57
 
56
58
  module ClassMethods
@@ -61,7 +63,14 @@ module Sequel
61
63
  # parent of the leaf.
62
64
  attr_accessor :parent_column
63
65
 
64
- Plugins.inherited_instance_variables(self, :@parent_column=>nil, :@tree_order=>nil)
66
+ # The association name for the parent association
67
+ attr_reader :parent_association_name
68
+
69
+ # The association name for the children association
70
+ attr_reader :children_association_name
71
+
72
+ Plugins.inherited_instance_variables(self, :@parent_column=>nil, :@tree_order=>nil, :@parent_association_name=>nil, :@children_association_name=>nil)
73
+ Plugins.def_dataset_methods(self, [:roots, :roots_dataset])
65
74
 
66
75
  # Should freeze tree order if it is an array when freezing the model class.
67
76
  def freeze
@@ -69,22 +78,6 @@ module Sequel
69
78
 
70
79
  super
71
80
  end
72
-
73
- # Returns list of all root nodes (those with no parent nodes).
74
- #
75
- # TreeClass.roots # => [root1, root2]
76
- def roots
77
- roots_dataset.all
78
- end
79
-
80
- # Returns the dataset for retrieval of all root nodes
81
- #
82
- # TreeClass.roots_dataset # => Sequel::Dataset instance
83
- def roots_dataset
84
- ds = where(Sequel.or(Array(parent_column).zip([])))
85
- ds = ds.order(*tree_order) if tree_order
86
- ds
87
- end
88
81
  end
89
82
 
90
83
  module InstanceMethods
@@ -93,7 +86,10 @@ module Sequel
93
86
  # subchild1.ancestors # => [child1, root]
94
87
  def ancestors
95
88
  node, nodes = self, []
96
- nodes << node = node.parent while node.parent
89
+ meth = model.parent_association_name
90
+ while par = node.send(meth)
91
+ nodes << node = par
92
+ end
97
93
  nodes
98
94
  end
99
95
 
@@ -101,8 +97,8 @@ module Sequel
101
97
  #
102
98
  # node.descendants # => [child1, child2, subchild1_1, subchild1_2, subchild2_1, subchild2_2]
103
99
  def descendants
104
- nodes = children.dup
105
- children.each{|child| nodes.concat(child.descendants)}
100
+ nodes = send(model.children_association_name).dup
101
+ send(model.children_association_name).each{|child| nodes.concat(child.descendants)}
106
102
  nodes
107
103
  end
108
104
 
@@ -121,7 +117,11 @@ module Sequel
121
117
  #
122
118
  # subchild1.self_and_siblings # => [subchild1, subchild2]
123
119
  def self_and_siblings
124
- parent ? parent.children : model.roots
120
+ if parent = send(model.parent_association_name)
121
+ parent.send(model.children_association_name)
122
+ else
123
+ model.roots
124
+ end
125
125
  end
126
126
 
127
127
  # Returns all siblings of the current node.
@@ -139,6 +139,24 @@ module Sequel
139
139
  end
140
140
  end
141
141
 
142
+ module DatasetMethods
143
+ # Returns list of all root nodes (those with no parent nodes).
144
+ #
145
+ # TreeClass.roots # => [root1, root2]
146
+ def roots
147
+ roots_dataset.all
148
+ end
149
+
150
+ # Returns the dataset for retrieval of all root nodes
151
+ #
152
+ # TreeClass.roots_dataset # => Sequel::Dataset instance
153
+ def roots_dataset
154
+ ds = where(Sequel.or(Array(model.parent_column).zip([])))
155
+ ds = ds.order(*model.tree_order) if model.tree_order
156
+ ds
157
+ end
158
+ end
159
+
142
160
  # Plugin included when :single_root option is passed.
143
161
  module SingleRoot
144
162
  module ClassMethods
@@ -41,7 +41,9 @@ module Sequel
41
41
  # Typecast values using #load_typecast when the values are retrieved
42
42
  # from the database.
43
43
  def call(values)
44
- super.load_typecast
44
+ o = super.load_typecast
45
+ o.send(:_clear_changed_columns, :initialize)
46
+ o
45
47
  end
46
48
 
47
49
  # Freeze typecast on load columns when freezing model class.
@@ -63,7 +65,6 @@ module Sequel
63
65
  set_column_value("#{c}=", v)
64
66
  end
65
67
  end
66
- _changed_columns.clear
67
68
  self
68
69
  end
69
70
 
@@ -188,13 +188,21 @@ module Sequel
188
188
  # Sequel will attempt to insert a NULL value into the database, instead of using the
189
189
  # database's default.
190
190
  # :allow_nil :: Whether to skip the validation if the value is nil.
191
- # :if :: A symbol (indicating an instance_method) or proc (which is instance_execed)
191
+ # :if :: A symbol (indicating an instance_method) or proc (which is used to define an instance method)
192
192
  # skipping this validation if it returns nil or false.
193
193
  # :tag :: The tag to use for this validation.
194
194
  def validates_each(*atts, &block)
195
195
  opts = extract_options!(atts)
196
196
  blank_meth = db.method(:blank_object?).to_proc
197
- blk = if (i = opts[:if]) || (am = opts[:allow_missing]) || (an = opts[:allow_nil]) || (ab = opts[:allow_blank])
197
+ i = opts[:if]
198
+ am = opts[:allow_missing]
199
+ an = opts[:allow_nil]
200
+ ab = opts[:allow_blank]
201
+ blk = if i || am || an || ab
202
+ if i.is_a?(Proc)
203
+ i = Plugins.def_sequel_method(self, "validation_class_methods_if", 0, &i)
204
+ end
205
+
198
206
  proc do |o,a,v|
199
207
  next if i && !validation_if_proc(o, i)
200
208
  next if an && Array(v).all?(&:nil?)
@@ -419,7 +427,7 @@ module Sequel
419
427
  # an empty hash is returned This method is useful when writing methods that
420
428
  # take an options hash as the last parameter.
421
429
  def extract_options!(array)
422
- array.last.is_a?(Hash) ? array.pop : {}
430
+ array.last.is_a?(Hash) ? array.pop : OPTS
423
431
  end
424
432
 
425
433
  # Add the validation reflection to the class's validations.
@@ -434,8 +442,6 @@ module Sequel
434
442
  case i
435
443
  when Symbol
436
444
  o.get_column_value(i)
437
- when Proc
438
- o.instance_exec(&i)
439
445
  else
440
446
  raise(::Sequel::Error, "invalid value for :if validation option")
441
447
  end
@@ -244,7 +244,7 @@ module Sequel
244
244
  def validates_unique(*atts)
245
245
  opts = default_validation_helpers_options(:unique)
246
246
  if atts.last.is_a?(Hash)
247
- opts = Hash[opts].merge!(atts.pop)
247
+ opts = opts.merge(atts.pop)
248
248
  end
249
249
  message = validation_error_message(opts[:message])
250
250
  from_values = opts[:from] == :values
@@ -302,7 +302,7 @@ module Sequel
302
302
  # Merge the given options with the default options for the given type
303
303
  # and call validatable_attributes with the merged options.
304
304
  def validatable_attributes_for_type(type, atts, opts, &block)
305
- validatable_attributes(atts, Hash[default_validation_helpers_options(type)].merge!(opts), &block)
305
+ validatable_attributes(atts, default_validation_helpers_options(type).merge(opts), &block)
306
306
  end
307
307
 
308
308
  # The validation error message to use, as a string. If message
@@ -18,7 +18,8 @@ module Sequel
18
18
  end
19
19
 
20
20
  # Time subclass that gets literalized with only the time value, so it operates
21
- # like a standard SQL time type.
21
+ # like a standard SQL time type. This type does not support timezones, by design,
22
+ # so it will not work correctly with <tt>time with time zone</tt> types.
22
23
  class SQLTime < ::Time
23
24
  @date = nil
24
25
 
@@ -26,12 +27,27 @@ module Sequel
26
27
  # Set the date used for SQLTime instances.
27
28
  attr_writer :date
28
29
 
29
- # use the date explicitly set, or the current date if there is not a
30
+ # Use the date explicitly set, or the current date if there is not a
30
31
  # date set.
31
32
  def date
32
33
  @date || now
33
34
  end
34
35
 
36
+ # Set the correct date and timezone when parsing times.
37
+ def parse(*)
38
+ t = super
39
+
40
+ utc = Sequel.application_timezone == :utc
41
+ d = @date
42
+ if d || utc
43
+ meth = utc ? :utc : :local
44
+ d ||= t
45
+ t = public_send(meth, d.year, d.month, d.day, t.hour, t.min, t.sec, t.usec)
46
+ end
47
+
48
+ t
49
+ end
50
+
35
51
  # Create a new SQLTime instance given an hour, minute, second, and usec.
36
52
  def create(hour, minute, second, usec = 0)
37
53
  t = date
@@ -250,12 +266,12 @@ module Sequel
250
266
  # methods overlap with the standard +BooleanMethods methods+, and they only
251
267
  # make sense for integers, they are only included in +NumericExpression+.
252
268
  #
253
- # :a.sql_number & :b # "a" & "b"
254
- # :a.sql_number | :b # "a" | "b"
255
- # :a.sql_number ^ :b # "a" ^ "b"
256
- # :a.sql_number << :b # "a" << "b"
257
- # :a.sql_number >> :b # "a" >> "b"
258
- # ~:a.sql_number # ~"a"
269
+ # Sequel[:a].sql_number & :b # "a" & "b"
270
+ # Sequel[:a].sql_number | :b # "a" | "b"
271
+ # Sequel[:a].sql_number ^ :b # "a" ^ "b"
272
+ # Sequel[:a].sql_number << :b # "a" << "b"
273
+ # Sequel[:a].sql_number >> :b # "a" >> "b"
274
+ # ~Sequel[:a].sql_number # ~"a"
259
275
  module BitwiseMethods
260
276
  ComplexExpression::BITWISE_OPERATORS.each do |o|
261
277
  module_eval("def #{o}(o) NumericExpression.new(#{o.inspect}, self, o) end", __FILE__, __LINE__)
@@ -339,9 +355,15 @@ module Sequel
339
355
  end
340
356
 
341
357
  # Return an <tt>SQL::CaseExpression</tt> created with the given arguments.
358
+ # The first argument are the <tt>WHEN</tt>/<tt>THEN</tt> conditions,
359
+ # specified as an array or a hash. The second argument is the
360
+ # <tt>ELSE</tt> default value. The third optional argument is the
361
+ # <tt>CASE</tt> expression.
342
362
  #
343
- # Sequel.case([[{a: [2,3]}, 1]], 0) # SQL: CASE WHEN a IN (2, 3) THEN 1 ELSE 0 END
363
+ # Sequel.case({a: 1}, 0) # SQL: CASE WHEN a THEN 1 ELSE 0 END
344
364
  # Sequel.case({a: 1}, 0, :b) # SQL: CASE b WHEN a THEN 1 ELSE 0 END
365
+ # Sequel.case({{a: [2,3]} => 1}, 0) # SQL: CASE WHEN a IN (2, 3) THEN 1 ELSE 0 END
366
+ # Sequel.case([[{a: [2,3]}, 1]], 0) # SQL: CASE WHEN a IN (2, 3) THEN 1 ELSE 0 END
345
367
  def case(*args)
346
368
  SQL::CaseExpression.new(*args)
347
369
  end
@@ -730,10 +752,10 @@ module Sequel
730
752
  # This module includes the inequality methods (>, <, >=, <=) that are defined on objects that can be
731
753
  # used in a numeric or string context in SQL.
732
754
  #
733
- # Sequel.lit('a') > :b # a > "b"
734
- # Sequel.lit('a') < :b # a > "b"
735
- # Sequel.lit('a') >= :b # a >= "b"
736
- # Sequel.lit('a') <= :b # a <= "b"
755
+ # Sequel[:a] > :b # a > "b"
756
+ # Sequel[:a] < :b # a > "b"
757
+ # Sequel[:a] >= :b # a >= "b"
758
+ # Sequel[:a] <= :b # a <= "b"
737
759
  module InequalityMethods
738
760
  ComplexExpression::INEQUALITY_OPERATORS.each do |o|
739
761
  module_eval("def #{o}(o) BooleanExpression.new(#{o.inspect}, self, o) end", __FILE__, __LINE__)
@@ -744,10 +766,10 @@ module Sequel
744
766
  # that are defined on objects that can be used in a numeric context in SQL
745
767
  # (+Symbol+, +LiteralString+, and +SQL::GenericExpression+).
746
768
  #
747
- # :a + :b # "a" + "b"
748
- # :a - :b # "a" - "b"
749
- # :a * :b # "a" * "b"
750
- # :a / :b # "a" / "b"
769
+ # Sequel[:a] + :b # "a" + "b"
770
+ # Sequel[:a] - :b # "a" - "b"
771
+ # Sequel[:a] * :b # "a" * "b"
772
+ # Sequel[:a] / :b # "a" / "b"
751
773
  #
752
774
  # One exception to this is if + is called with a +String+ or +StringExpression+,
753
775
  # in which case the || operator is used instead of the + operator:
@@ -766,8 +788,10 @@ module Sequel
766
788
  def coerce(other)
767
789
  if other.is_a?(Numeric)
768
790
  [SQL::NumericExpression.new(:NOOP, other), self]
769
- else
791
+ elsif defined?(super)
770
792
  super
793
+ else
794
+ [self, other]
771
795
  end
772
796
  end
773
797
 
@@ -998,6 +1022,11 @@ module Sequel
998
1022
  include SQL::AliasMethods
999
1023
  include SQL::CastMethods
1000
1024
 
1025
+ class << self
1026
+ # Alias new to call for usage in conversion procs
1027
+ alias call new
1028
+ end
1029
+
1001
1030
  # Return a LiteralString with the same content if no args are given, otherwise
1002
1031
  # return a SQL::PlaceholderLiteralString with the current string and the given args.
1003
1032
  def lit(*args)
@@ -1059,8 +1088,30 @@ module Sequel
1059
1088
  def self.from_value_pair(l, r)
1060
1089
  case r
1061
1090
  when Range
1062
- new(:AND, new(:>=, l, r.begin), new(r.exclude_end? ? :< : :<=, l, r.end))
1063
- when ::Array, ::Sequel::Dataset
1091
+ unless r.begin.nil?
1092
+ begin_expr = new(:>=, l, r.begin)
1093
+ end
1094
+ unless r.end.nil?
1095
+ end_expr = new(r.exclude_end? ? :< : :<=, l, r.end)
1096
+ end
1097
+ if begin_expr
1098
+ if end_expr
1099
+ new(:AND, begin_expr, end_expr)
1100
+ else
1101
+ begin_expr
1102
+ end
1103
+ elsif end_expr
1104
+ end_expr
1105
+ else
1106
+ new(:'=', 1, 1)
1107
+ end
1108
+ when ::Array
1109
+ r = r.dup.freeze unless r.frozen?
1110
+ new(:IN, l, r)
1111
+ when ::String
1112
+ r = r.dup.freeze unless r.frozen?
1113
+ new(:'=', l, r)
1114
+ when ::Sequel::Dataset
1064
1115
  new(:IN, l, r)
1065
1116
  when NegativeBooleanConstant
1066
1117
  new(:"IS NOT", l, r.constant)
@@ -1092,8 +1143,21 @@ module Sequel
1092
1143
  case op = ce.op
1093
1144
  when :AND, :OR
1094
1145
  BooleanExpression.new(OPERTATOR_INVERSIONS[op], *ce.args.map{|a| BooleanExpression.invert(a)})
1095
- else
1146
+ when :IN, :"NOT IN"
1096
1147
  BooleanExpression.new(OPERTATOR_INVERSIONS[op], *ce.args.dup)
1148
+ else
1149
+ if ce.args.length == 2
1150
+ case ce.args[1]
1151
+ when Function, LiteralString, PlaceholderLiteralString
1152
+ # Special behavior to not push down inversion in this case because doing so
1153
+ # can result in incorrect behavior for ANY/SOME/ALL operators.
1154
+ BooleanExpression.new(:NOT, ce)
1155
+ else
1156
+ BooleanExpression.new(OPERTATOR_INVERSIONS[op], *ce.args.dup)
1157
+ end
1158
+ else
1159
+ BooleanExpression.new(OPERTATOR_INVERSIONS[op], *ce.args.dup)
1160
+ end
1097
1161
  end
1098
1162
  when StringExpression, NumericExpression
1099
1163
  raise(Sequel::Error, "cannot invert #{ce.inspect}")
@@ -1253,6 +1317,7 @@ module Sequel
1253
1317
  CURRENT_DATE = Constant.new(:CURRENT_DATE)
1254
1318
  CURRENT_TIME = Constant.new(:CURRENT_TIME)
1255
1319
  CURRENT_TIMESTAMP = Constant.new(:CURRENT_TIMESTAMP)
1320
+ DEFAULT = Constant.new(:DEFAULT)
1256
1321
  SQLTRUE = TRUE = BooleanConstant.new(true)
1257
1322
  SQLFALSE = FALSE = BooleanConstant.new(false)
1258
1323
  NULL = BooleanConstant.new(nil)
@@ -1366,7 +1431,7 @@ module Sequel
1366
1431
  end
1367
1432
 
1368
1433
  # Return a new function with an OVER clause (making it a window function).
1369
- # See {SQL::Window} for the list of options +over+ can receive.
1434
+ # See Sequel::SQL::Window for the list of options +over+ can receive.
1370
1435
  #
1371
1436
  # Sequel.function(:row_number).over(partition: :col) # row_number() OVER (PARTITION BY col)
1372
1437
  def over(window=OPTS)
@@ -1422,7 +1487,7 @@ module Sequel
1422
1487
 
1423
1488
  # Return a new function call with the given opts merged into the current opts.
1424
1489
  def with_opts(opts)
1425
- self.class.new!(name, args, Hash[@opts].merge!(opts))
1490
+ self.class.new!(name, args, @opts.merge(opts))
1426
1491
  end
1427
1492
  end
1428
1493
 
@@ -1703,7 +1768,7 @@ module Sequel
1703
1768
  # StringExpression.like(:a, 'a%', /^a/i) # (("a" LIKE 'a%' ESCAPE '\') OR ("a" ~* '^a'))
1704
1769
  def self.like(l, *ces)
1705
1770
  l, lre, lci = like_element(l)
1706
- lci = (ces.last.is_a?(Hash) ? ces.pop : {})[:case_insensitive] ? true : lci
1771
+ lci = (ces.last.is_a?(Hash) ? ces.pop : OPTS)[:case_insensitive] ? true : lci
1707
1772
  ces.map! do |ce|
1708
1773
  r, rre, rci = like_element(ce)
1709
1774
  BooleanExpression.new(LIKE_MAP[[lre||rre, lci||rci]], l, r)
@@ -1846,7 +1911,7 @@ module Sequel
1846
1911
  freeze
1847
1912
  end
1848
1913
 
1849
- include(Module.new do
1914
+ m = Module.new do
1850
1915
  # Return an +Identifier+, +QualifiedIdentifier+, or +Function+, depending
1851
1916
  # on arguments and whether a block is provided. Does not currently call the block.
1852
1917
  # See the class level documentation.
@@ -1862,7 +1927,8 @@ module Sequel
1862
1927
  Function.new(m, *args)
1863
1928
  end
1864
1929
  end
1865
- end)
1930
+ end
1931
+ include m
1866
1932
 
1867
1933
  Sequel::VIRTUAL_ROW = new
1868
1934
  end
@@ -1883,16 +1949,40 @@ module Sequel
1883
1949
  # # (PARTITION BY col7 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
1884
1950
  # Sequel::SQL::Window.new(partition: :col7, frame: :rows)
1885
1951
  # # (PARTITION BY col7 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
1886
- # Sequel::SQL::Window.new(partition: :col7, frame: "RANGE CURRENT ROW")
1952
+ # Sequel::SQL::Window.new(partition: :col7, frame: {type: :range, start: current})
1887
1953
  # # (PARTITION BY col7 RANGE CURRENT ROW)
1954
+ # Sequel::SQL::Window.new(partition: :col7, frame: {type: :range, start: 1, end: 1})
1955
+ # # (PARTITION BY col7 RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING)
1956
+ # Sequel::SQL::Window.new(partition: :col7, frame: {type: :range, start: 2, end: [1, :preceding]})
1957
+ # # (PARTITION BY col7 RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING)
1958
+ # Sequel::SQL::Window.new(partition: :col7, frame: {type: :range, start: 1, end: [2, :following]})
1959
+ # # (PARTITION BY col7 RANGE BETWEEN 1 FOLLOWING AND 2 FOLLOWING)
1960
+ # Sequel::SQL::Window.new(partition: :col7, frame: {type: :range, start: :preceding, exclude: :current})
1961
+ # # (PARTITION BY col7 RANGE UNBOUNDED PRECEDING EXCLUDE CURRENT ROW)
1888
1962
  #
1889
1963
  # Sequel::SQL::Window.new(window: :named_window) # you can create a named window with Dataset#window
1890
1964
  # # (named_window)
1891
1965
  class Window < Expression
1892
1966
  # The options for this window. Options currently supported:
1893
- # :frame :: if specified, should be :all, :rows, or a String that is used literally. :all always operates over all rows in the
1894
- # partition, while :rows excludes the current row's later peers. The default is to include
1895
- # all previous rows in the partition up to the current row's last peer.
1967
+ # :frame :: if specified, should be :all, :rows, :range, :groups, a String, or a Hash.
1968
+ # :all :: Always operates over all rows in the partition
1969
+ # :rows :: Includes rows in the partition up to and including the current row
1970
+ # :range, :groups :: Includes rows in the partition up to and including the current group
1971
+ # String :: Used as literal SQL code, try to avoid
1972
+ # Hash :: Hash of options for the frame:
1973
+ # :type :: The type of frame, must be :rows, :range, or :groups (required)
1974
+ # :start :: The start of the frame (required). Possible values:
1975
+ # :preceding :: UNBOUNDED PRECEDING
1976
+ # :following :: UNBOUNDED FOLLOWING
1977
+ # :current :: CURRENT ROW
1978
+ # String, Numeric, or Cast :: Used as the offset of rows/values preceding
1979
+ # Array :: Must have two elements, with first element being String, Numeric, or
1980
+ # Cast and second element being :preceding or :following
1981
+ # :end :: The end of the frame. Can be left out. If present, takes the same values as
1982
+ # :start, except that when a String, Numeric, or Hash, it is used as the offset
1983
+ # for rows following
1984
+ # :exclude :: Which rows to exclude. Possible values are :current, :ties, :group
1985
+ # :no_others.
1896
1986
  # :order :: order on the column(s) given
1897
1987
  # :partition :: partition/group on the column(s) given
1898
1988
  # :window :: base results on a previously specified named window