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
@@ -1,70 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
2
-
3
- describe "Sequel::Deprecated" do
4
- before do
5
- @d = Sequel::Deprecation
6
- @prev_prefix = @d.prefix
7
- @prev_output = @d.output
8
- @prev_backtrace_filter = @d.backtrace_filter
9
- @output = []
10
- def @output.puts(s)
11
- self << s
12
- end
13
- @d.prefix = false
14
- @d.output = @output
15
- @d.backtrace_filter = false
16
- end
17
- after do
18
- @d.prefix = @prev_prefix
19
- @d.output = @prev_output
20
- @d.backtrace_filter = @prev_backtrace_filter
21
- end
22
-
23
- it "should output full messages to the given output" do
24
- @d.deprecate("foo")
25
- @output.must_equal ['foo']
26
- end
27
-
28
- it "should consider two arguments to be a method name and additional text" do
29
- @d.deprecate("foo", "Use bar instead")
30
- @output.must_equal ['foo is deprecated and will be removed in a future version of Sequel. Use bar instead.']
31
- end
32
-
33
- it "should include a prefix if set" do
34
- @d.prefix = "DEPWARN: "
35
- @d.deprecate("foo")
36
- @output.must_equal ['DEPWARN: foo']
37
- end
38
-
39
- it "should not output anything if output is false" do
40
- @d.output = false
41
- @d.deprecate("foo")
42
- end
43
-
44
- it "should include full backtrace if backtrace_filter is true" do
45
- @d.backtrace_filter = true
46
- @d.deprecate("foo")
47
- @output.first.must_equal 'foo'
48
- (4..100).must_include(@output.count)
49
- end
50
-
51
- it "should include given lines of backtrace if backtrace_filter is an integer" do
52
- @d.backtrace_filter = 1
53
- @d.deprecate("foo")
54
- @output.first.must_equal 'foo'
55
- @output.count.must_equal 2
56
-
57
- @output.clear
58
- @d.backtrace_filter = 3
59
- @d.deprecate("foo")
60
- @output.first.must_equal 'foo'
61
- @output.count.must_equal 4
62
- end
63
-
64
- it "should select backtrace lines if backtrace_filter is a proc" do
65
- @d.backtrace_filter = lambda{|line, line_no| line_no < 3 && line =~ /./}
66
- @d.deprecate("foo")
67
- @output.first.must_equal 'foo'
68
- @output.count.must_equal 4
69
- end
70
- end
@@ -1,1243 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
2
-
3
- describe "Blockless Ruby Filters" do
4
- before do
5
- db = Sequel::Database.new
6
- @d = db[:items]
7
- def @d.l(*args, &block)
8
- literal(filter_expr(*args, &block))
9
- end
10
- def @d.lit(*args)
11
- literal(*args)
12
- end
13
- end
14
-
15
- it "should support boolean columns directly" do
16
- @d.l(:x).must_equal 'x'
17
- end
18
-
19
- it "should support qualified columns" do
20
- @d.l(:x__y).must_equal 'x.y'
21
- end
22
-
23
- it "should support NOT with SQL functions" do
24
- @d.l(~Sequel.function(:is_blah)).must_equal 'NOT is_blah()'
25
- @d.l(~Sequel.function(:is_blah, :x)).must_equal 'NOT is_blah(x)'
26
- @d.l(~Sequel.function(:is_blah, :x__y)).must_equal 'NOT is_blah(x.y)'
27
- @d.l(~Sequel.function(:is_blah, :x, :x__y)).must_equal 'NOT is_blah(x, x.y)'
28
- end
29
-
30
- it "should handle multiple ~" do
31
- @d.l(~Sequel.~(:x)).must_equal 'x'
32
- @d.l(~~Sequel.~(:x)).must_equal 'NOT x'
33
- @d.l(~~Sequel.&(:x, :y)).must_equal '(x AND y)'
34
- @d.l(~~Sequel.|(:x, :y)).must_equal '(x OR y)'
35
- end
36
-
37
- it "should support = via Hash" do
38
- @d.l(:x => 100).must_equal '(x = 100)'
39
- @d.l(:x => 'a').must_equal '(x = \'a\')'
40
- @d.l(:x => true).must_equal '(x IS TRUE)'
41
- @d.l(:x => false).must_equal '(x IS FALSE)'
42
- @d.l(:x => nil).must_equal '(x IS NULL)'
43
- @d.l(:x => [1,2,3]).must_equal '(x IN (1, 2, 3))'
44
- end
45
-
46
- it "should use = 't' and != 't' OR IS NULL if IS TRUE is not supported" do
47
- meta_def(@d, :supports_is_true?){false}
48
- @d.l(:x => true).must_equal "(x = 't')"
49
- @d.l(~Sequel.expr(:x => true)).must_equal "((x != 't') OR (x IS NULL))"
50
- @d.l(:x => false).must_equal "(x = 'f')"
51
- @d.l(~Sequel.expr(:x => false)).must_equal "((x != 'f') OR (x IS NULL))"
52
- end
53
-
54
- it "should support != via inverted Hash" do
55
- @d.l(~Sequel.expr(:x => 100)).must_equal '(x != 100)'
56
- @d.l(~Sequel.expr(:x => 'a')).must_equal '(x != \'a\')'
57
- @d.l(~Sequel.expr(:x => true)).must_equal '(x IS NOT TRUE)'
58
- @d.l(~Sequel.expr(:x => false)).must_equal '(x IS NOT FALSE)'
59
- @d.l(~Sequel.expr(:x => nil)).must_equal '(x IS NOT NULL)'
60
- end
61
-
62
- it "should support = and similar operations via =~ method" do
63
- @d.l{x =~ 100}.must_equal '(x = 100)'
64
- @d.l{x =~ 'a'}.must_equal '(x = \'a\')'
65
- @d.l{x =~ true}.must_equal '(x IS TRUE)'
66
- @d.l{x =~ false}.must_equal '(x IS FALSE)'
67
- @d.l{x =~ nil}.must_equal '(x IS NULL)'
68
- @d.l{x =~ (1...5)}.must_equal '((x >= 1) AND (x < 5))'
69
- @d.l{x =~ [1,2,3]}.must_equal '(x IN (1, 2, 3))'
70
-
71
- @d.l{(x + y) =~ 100}.must_equal '((x + y) = 100)'
72
- @d.l{(x + y) =~ 'a'}.must_equal '((x + y) = \'a\')'
73
- @d.l{(x + y) =~ true}.must_equal '((x + y) IS TRUE)'
74
- @d.l{(x + y) =~ false}.must_equal '((x + y) IS FALSE)'
75
- @d.l{(x + y) =~ nil}.must_equal '((x + y) IS NULL)'
76
- @d.l{(x + y) =~ (1...5)}.must_equal '(((x + y) >= 1) AND ((x + y) < 5))'
77
- @d.l{(x + y) =~ [1,2,3]}.must_equal '((x + y) IN (1, 2, 3))'
78
-
79
- def @d.supports_regexp?; true end
80
- @d.l{x =~ /blah/}.must_equal '(x ~ \'blah\')'
81
- @d.l{(x + y) =~ /blah/}.must_equal '((x + y) ~ \'blah\')'
82
- end
83
-
84
- if RUBY_VERSION >= '1.9'
85
- it "should support != and similar inversions via !~ method" do
86
- @d.l{x !~ 100}.must_equal '(x != 100)'
87
- @d.l{x !~ 'a'}.must_equal '(x != \'a\')'
88
- @d.l{x !~ true}.must_equal '(x IS NOT TRUE)'
89
- @d.l{x !~ false}.must_equal '(x IS NOT FALSE)'
90
- @d.l{x !~ nil}.must_equal '(x IS NOT NULL)'
91
- @d.l{x !~ (1...5)}.must_equal '((x < 1) OR (x >= 5))'
92
- @d.l{x !~ [1,2,3]}.must_equal '(x NOT IN (1, 2, 3))'
93
-
94
- @d.l{(x + y) !~ 100}.must_equal '((x + y) != 100)'
95
- @d.l{(x + y) !~ 'a'}.must_equal '((x + y) != \'a\')'
96
- @d.l{(x + y) !~ true}.must_equal '((x + y) IS NOT TRUE)'
97
- @d.l{(x + y) !~ false}.must_equal '((x + y) IS NOT FALSE)'
98
- @d.l{(x + y) !~ nil}.must_equal '((x + y) IS NOT NULL)'
99
- @d.l{(x + y) !~ (1...5)}.must_equal '(((x + y) < 1) OR ((x + y) >= 5))'
100
- @d.l{(x + y) !~ [1,2,3]}.must_equal '((x + y) NOT IN (1, 2, 3))'
101
-
102
- def @d.supports_regexp?; true end
103
- @d.l{x !~ /blah/}.must_equal '(x !~ \'blah\')'
104
- @d.l{(x + y) !~ /blah/}.must_equal '((x + y) !~ \'blah\')'
105
- end
106
- end
107
-
108
- it "should support ~ via Hash and Regexp (if supported by database)" do
109
- def @d.supports_regexp?; true end
110
- @d.l(:x => /blah/).must_equal '(x ~ \'blah\')'
111
- end
112
-
113
- it "should support !~ via inverted Hash and Regexp" do
114
- def @d.supports_regexp?; true end
115
- @d.l(~Sequel.expr(:x => /blah/)).must_equal '(x !~ \'blah\')'
116
- end
117
-
118
- it "should support negating ranges" do
119
- @d.l(~Sequel.expr(:x => 1..5)).must_equal '((x < 1) OR (x > 5))'
120
- @d.l(~Sequel.expr(:x => 1...5)).must_equal '((x < 1) OR (x >= 5))'
121
- end
122
-
123
- it "should support negating IN with Dataset or Array" do
124
- @d.l(~Sequel.expr(:x => @d.select(:i))).must_equal '(x NOT IN (SELECT i FROM items))'
125
- @d.l(~Sequel.expr(:x => [1,2,3])).must_equal '(x NOT IN (1, 2, 3))'
126
- end
127
-
128
- it "should not add ~ method to string expressions" do
129
- proc{~Sequel.expr(:x).sql_string}.must_raise(NoMethodError)
130
- end
131
-
132
- it "should allow mathematical or string operations on true, false, or nil" do
133
- @d.lit(Sequel.expr(:x) + 1).must_equal '(x + 1)'
134
- @d.lit(Sequel.expr(:x) - true).must_equal "(x - 't')"
135
- @d.lit(Sequel.expr(:x) / false).must_equal "(x / 'f')"
136
- @d.lit(Sequel.expr(:x) * nil).must_equal '(x * NULL)'
137
- @d.lit(Sequel.join([:x, nil])).must_equal '(x || NULL)'
138
- end
139
-
140
- it "should allow mathematical or string operations on boolean complex expressions" do
141
- @d.lit(Sequel.expr(:x) + (Sequel.expr(:y) + 1)).must_equal '(x + y + 1)'
142
- @d.lit(Sequel.expr(:x) - ~Sequel.expr(:y)).must_equal '(x - NOT y)'
143
- @d.lit(Sequel.expr(:x) / (Sequel.expr(:y) & :z)).must_equal '(x / (y AND z))'
144
- @d.lit(Sequel.expr(:x) * (Sequel.expr(:y) | :z)).must_equal '(x * (y OR z))'
145
- @d.lit(Sequel.expr(:x) + Sequel.expr(:y).like('a')).must_equal "(x + (y LIKE 'a' ESCAPE '\\'))"
146
- @d.lit(Sequel.expr(:x) - ~Sequel.expr(:y).like('a')).must_equal "(x - (y NOT LIKE 'a' ESCAPE '\\'))"
147
- @d.lit(Sequel.join([:x, ~Sequel.expr(:y).like('a')])).must_equal "(x || (y NOT LIKE 'a' ESCAPE '\\'))"
148
- end
149
-
150
- it "should support AND conditions via &" do
151
- @d.l(Sequel.expr(:x) & :y).must_equal '(x AND y)'
152
- @d.l(Sequel.expr(:x).sql_boolean & :y).must_equal '(x AND y)'
153
- @d.l(Sequel.expr(:x) & :y & :z).must_equal '(x AND y AND z)'
154
- @d.l(Sequel.expr(:x) & {:y => :z}).must_equal '(x AND (y = z))'
155
- @d.l((Sequel.expr(:x) + 200 < 0) & (Sequel.expr(:y) - 200 < 0)).must_equal '(((x + 200) < 0) AND ((y - 200) < 0))'
156
- @d.l(Sequel.expr(:x) & ~Sequel.expr(:y)).must_equal '(x AND NOT y)'
157
- @d.l(~Sequel.expr(:x) & :y).must_equal '(NOT x AND y)'
158
- @d.l(~Sequel.expr(:x) & ~Sequel.expr(:y)).must_equal '(NOT x AND NOT y)'
159
- end
160
-
161
- it "should support OR conditions via |" do
162
- @d.l(Sequel.expr(:x) | :y).must_equal '(x OR y)'
163
- @d.l(Sequel.expr(:x).sql_boolean | :y).must_equal '(x OR y)'
164
- @d.l(Sequel.expr(:x) | :y | :z).must_equal '(x OR y OR z)'
165
- @d.l(Sequel.expr(:x) | {:y => :z}).must_equal '(x OR (y = z))'
166
- @d.l((Sequel.expr(:x).sql_number > 200) | (Sequel.expr(:y).sql_number < 200)).must_equal '((x > 200) OR (y < 200))'
167
- end
168
-
169
- it "should support & | combinations" do
170
- @d.l((Sequel.expr(:x) | :y) & :z).must_equal '((x OR y) AND z)'
171
- @d.l(Sequel.expr(:x) | (Sequel.expr(:y) & :z)).must_equal '(x OR (y AND z))'
172
- @d.l((Sequel.expr(:x) & :w) | (Sequel.expr(:y) & :z)).must_equal '((x AND w) OR (y AND z))'
173
- end
174
-
175
- it "should support & | with ~" do
176
- @d.l(~((Sequel.expr(:x) | :y) & :z)).must_equal '((NOT x AND NOT y) OR NOT z)'
177
- @d.l(~(Sequel.expr(:x) | (Sequel.expr(:y) & :z))).must_equal '(NOT x AND (NOT y OR NOT z))'
178
- @d.l(~((Sequel.expr(:x) & :w) | (Sequel.expr(:y) & :z))).must_equal '((NOT x OR NOT w) AND (NOT y OR NOT z))'
179
- @d.l(~((Sequel.expr(:x).sql_number > 200) | (Sequel.expr(:y) & :z))).must_equal '((x <= 200) AND (NOT y OR NOT z))'
180
- end
181
-
182
- it "should support LiteralString" do
183
- @d.l(Sequel.lit('x')).must_equal '(x)'
184
- @d.l(~Sequel.lit('x')).must_equal 'NOT x'
185
- @d.l(~~Sequel.lit('x')).must_equal 'x'
186
- @d.l(~((Sequel.lit('x') | :y) & :z)).must_equal '((NOT x AND NOT y) OR NOT z)'
187
- @d.l(~(Sequel.expr(:x) | Sequel.lit('y'))).must_equal '(NOT x AND NOT y)'
188
- @d.l(~(Sequel.lit('x') & Sequel.lit('y'))).must_equal '(NOT x OR NOT y)'
189
- @d.l(Sequel.expr(Sequel.lit('y') => Sequel.lit('z')) & Sequel.lit('x')).must_equal '((y = z) AND x)'
190
- @d.l((Sequel.lit('x') > 200) & (Sequel.lit('y') < 200)).must_equal '((x > 200) AND (y < 200))'
191
- @d.l(~(Sequel.lit('x') + 1 > 100)).must_equal '((x + 1) <= 100)'
192
- @d.l(Sequel.lit('x').like('a')).must_equal '(x LIKE \'a\' ESCAPE \'\\\')'
193
- @d.l(Sequel.lit('x') + 1 > 100).must_equal '((x + 1) > 100)'
194
- @d.l((Sequel.lit('x') * :y) < 100.01).must_equal '((x * y) < 100.01)'
195
- @d.l((Sequel.lit('x') - Sequel.expr(:y)/2) >= 100000000000000000000000000000000000).must_equal '((x - (y / 2)) >= 100000000000000000000000000000000000)'
196
- @d.l((Sequel.lit('z') * ((Sequel.lit('x') / :y)/(Sequel.expr(:x) + :y))) <= 100).must_equal '((z * (x / y / (x + y))) <= 100)'
197
- @d.l(~((((Sequel.lit('x') - :y)/(Sequel.expr(:x) + :y))*:z) <= 100)).must_equal '((((x - y) / (x + y)) * z) > 100)'
198
- end
199
-
200
- it "should support hashes by ANDing the conditions" do
201
- @d.l(:x => 100, :y => 'a')[1...-1].split(' AND ').sort.must_equal ['(x = 100)', '(y = \'a\')']
202
- @d.l(:x => true, :y => false)[1...-1].split(' AND ').sort.must_equal ['(x IS TRUE)', '(y IS FALSE)']
203
- @d.l(:x => nil, :y => [1,2,3])[1...-1].split(' AND ').sort.must_equal ['(x IS NULL)', '(y IN (1, 2, 3))']
204
- end
205
-
206
- it "should support arrays with all two pairs the same as hashes" do
207
- @d.l([[:x, 100],[:y, 'a']]).must_equal '((x = 100) AND (y = \'a\'))'
208
- @d.l([[:x, true], [:y, false]]).must_equal '((x IS TRUE) AND (y IS FALSE))'
209
- @d.l([[:x, nil], [:y, [1,2,3]]]).must_equal '((x IS NULL) AND (y IN (1, 2, 3)))'
210
- end
211
-
212
- it "should emulate columns for array values" do
213
- @d.l([:x, :y]=>Sequel.value_list([[1,2], [3,4]])).must_equal '((x, y) IN ((1, 2), (3, 4)))'
214
- @d.l([:x, :y, :z]=>[[1,2,5], [3,4,6]]).must_equal '((x, y, z) IN ((1, 2, 5), (3, 4, 6)))'
215
- end
216
-
217
- it "should emulate multiple column in if not supported" do
218
- meta_def(@d, :supports_multiple_column_in?){false}
219
- @d.l([:x, :y]=>Sequel.value_list([[1,2], [3,4]])).must_equal '(((x = 1) AND (y = 2)) OR ((x = 3) AND (y = 4)))'
220
- @d.l([:x, :y, :z]=>[[1,2,5], [3,4,6]]).must_equal '(((x = 1) AND (y = 2) AND (z = 5)) OR ((x = 3) AND (y = 4) AND (z = 6)))'
221
- end
222
-
223
- it "should support StringExpression#+ for concatenation of SQL strings" do
224
- @d.lit(Sequel.expr(:x).sql_string + :y).must_equal '(x || y)'
225
- @d.lit(Sequel.join([:x]) + :y).must_equal '(x || y)'
226
- @d.lit(Sequel.join([:x, :z], ' ') + :y).must_equal "(x || ' ' || z || y)"
227
- end
228
-
229
- it "should be supported inside blocks" do
230
- @d.l{Sequel.or([[:x, nil], [:y, [1,2,3]]])}.must_equal '((x IS NULL) OR (y IN (1, 2, 3)))'
231
- @d.l{Sequel.~([[:x, nil], [:y, [1,2,3]]])}.must_equal '((x IS NOT NULL) OR (y NOT IN (1, 2, 3)))'
232
- @d.l{~((((Sequel.lit('x') - :y)/(Sequel.expr(:x) + :y))*:z) <= 100)}.must_equal '((((x - y) / (x + y)) * z) > 100)'
233
- @d.l{Sequel.&({:x => :a}, {:y => :z})}.must_equal '((x = a) AND (y = z))'
234
- end
235
-
236
- it "should support &, |, ^, ~, <<, and >> for NumericExpressions" do
237
- @d.l(Sequel.expr(:x).sql_number & 1 > 100).must_equal '((x & 1) > 100)'
238
- @d.l(Sequel.expr(:x).sql_number | 1 > 100).must_equal '((x | 1) > 100)'
239
- @d.l(Sequel.expr(:x).sql_number ^ 1 > 100).must_equal '((x ^ 1) > 100)'
240
- @d.l(~Sequel.expr(:x).sql_number > 100).must_equal '(~x > 100)'
241
- @d.l(Sequel.expr(:x).sql_number << 1 > 100).must_equal '((x << 1) > 100)'
242
- @d.l(Sequel.expr(:x).sql_number >> 1 > 100).must_equal '((x >> 1) > 100)'
243
- @d.l((Sequel.expr(:x) + 1) & 1 > 100).must_equal '(((x + 1) & 1) > 100)'
244
- @d.l((Sequel.expr(:x) + 1) | 1 > 100).must_equal '(((x + 1) | 1) > 100)'
245
- @d.l((Sequel.expr(:x) + 1) ^ 1 > 100).must_equal '(((x + 1) ^ 1) > 100)'
246
- @d.l(~(Sequel.expr(:x) + 1) > 100).must_equal '(~(x + 1) > 100)'
247
- @d.l((Sequel.expr(:x) + 1) << 1 > 100).must_equal '(((x + 1) << 1) > 100)'
248
- @d.l((Sequel.expr(:x) + 1) >> 1 > 100).must_equal '(((x + 1) >> 1) > 100)'
249
- @d.l((Sequel.expr(:x) + 1) & (Sequel.expr(:x) + 2) > 100).must_equal '(((x + 1) & (x + 2)) > 100)'
250
- end
251
-
252
- it "should allow using a Bitwise method on a ComplexExpression that isn't a NumericExpression" do
253
- @d.lit((Sequel.expr(:x) + 1) & (Sequel.expr(:x) + '2')).must_equal "((x + 1) & (x || '2'))"
254
- end
255
-
256
- it "should allow using a Boolean method on a ComplexExpression that isn't a BooleanExpression" do
257
- @d.l(Sequel.expr(:x) & (Sequel.expr(:x) + '2')).must_equal "(x AND (x || '2'))"
258
- end
259
-
260
- it "should raise an error if attempting to invert a ComplexExpression that isn't a BooleanExpression" do
261
- proc{Sequel::SQL::BooleanExpression.invert(Sequel.expr(:x) + 2)}.must_raise(Sequel::Error)
262
- end
263
-
264
- it "should return self on .lit" do
265
- y = Sequel.expr(:x) + 1
266
- y.lit.must_equal y
267
- end
268
-
269
- it "should return have .sql_literal return the literal SQL for the expression" do
270
- y = Sequel.expr(:x) + 1
271
- y.sql_literal(@d).must_equal '(x + 1)'
272
- y.sql_literal(@d).must_equal @d.literal(y)
273
- end
274
-
275
- it "should support SQL::Constants" do
276
- @d.l({:x => Sequel::NULL}).must_equal '(x IS NULL)'
277
- @d.l({:x => Sequel::NOTNULL}).must_equal '(x IS NOT NULL)'
278
- @d.l({:x => Sequel::TRUE}).must_equal '(x IS TRUE)'
279
- @d.l({:x => Sequel::FALSE}).must_equal '(x IS FALSE)'
280
- @d.l({:x => Sequel::SQLTRUE}).must_equal '(x IS TRUE)'
281
- @d.l({:x => Sequel::SQLFALSE}).must_equal '(x IS FALSE)'
282
- end
283
-
284
- it "should support negation of SQL::Constants" do
285
- @d.l(Sequel.~(:x => Sequel::NULL)).must_equal '(x IS NOT NULL)'
286
- @d.l(Sequel.~(:x => Sequel::NOTNULL)).must_equal '(x IS NULL)'
287
- @d.l(Sequel.~(:x => Sequel::TRUE)).must_equal '(x IS NOT TRUE)'
288
- @d.l(Sequel.~(:x => Sequel::FALSE)).must_equal '(x IS NOT FALSE)'
289
- @d.l(Sequel.~(:x => Sequel::SQLTRUE)).must_equal '(x IS NOT TRUE)'
290
- @d.l(Sequel.~(:x => Sequel::SQLFALSE)).must_equal '(x IS NOT FALSE)'
291
- end
292
-
293
- it "should support direct negation of SQL::Constants" do
294
- @d.l({:x => ~Sequel::NULL}).must_equal '(x IS NOT NULL)'
295
- @d.l({:x => ~Sequel::NOTNULL}).must_equal '(x IS NULL)'
296
- @d.l({:x => ~Sequel::TRUE}).must_equal '(x IS FALSE)'
297
- @d.l({:x => ~Sequel::FALSE}).must_equal '(x IS TRUE)'
298
- @d.l({:x => ~Sequel::SQLTRUE}).must_equal '(x IS FALSE)'
299
- @d.l({:x => ~Sequel::SQLFALSE}).must_equal '(x IS TRUE)'
300
- end
301
-
302
- it "should raise an error if trying to invert an invalid SQL::Constant" do
303
- proc{~Sequel::CURRENT_DATE}.must_raise(Sequel::Error)
304
- end
305
-
306
- it "should raise an error if trying to create an invalid complex expression" do
307
- proc{Sequel::SQL::ComplexExpression.new(:BANG, 1, 2)}.must_raise(Sequel::Error)
308
- end
309
-
310
- it "should use a string concatentation for + if given a string" do
311
- @d.lit(Sequel.expr(:x) + '1').must_equal "(x || '1')"
312
- @d.lit(Sequel.expr(:x) + '1' + '1').must_equal "(x || '1' || '1')"
313
- end
314
-
315
- it "should use an addition for + if given a literal string" do
316
- @d.lit(Sequel.expr(:x) + Sequel.lit('1')).must_equal "(x + 1)"
317
- @d.lit(Sequel.expr(:x) + Sequel.lit('1') + Sequel.lit('1')).must_equal "(x + 1 + 1)"
318
- end
319
-
320
- it "should use a bitwise operator for & and | if given an integer" do
321
- @d.lit(Sequel.expr(:x) & 1).must_equal "(x & 1)"
322
- @d.lit(Sequel.expr(:x) | 1).must_equal "(x | 1)"
323
- @d.lit(Sequel.expr(:x) & 1 & 1).must_equal "(x & 1 & 1)"
324
- @d.lit(Sequel.expr(:x) | 1 | 1).must_equal "(x | 1 | 1)"
325
- end
326
-
327
- it "should allow adding a string to an integer expression" do
328
- @d.lit(Sequel.expr(:x) + 1 + 'a').must_equal "(x + 1 + 'a')"
329
- end
330
-
331
- it "should allow adding an integer to an string expression" do
332
- @d.lit(Sequel.expr(:x) + 'a' + 1).must_equal "(x || 'a' || 1)"
333
- end
334
-
335
- it "should allow adding a boolean to an integer expression" do
336
- @d.lit(Sequel.expr(:x) + 1 + true).must_equal "(x + 1 + 't')"
337
- end
338
-
339
- it "should allow adding a boolean to an string expression" do
340
- @d.lit(Sequel.expr(:x) + 'a' + true).must_equal "(x || 'a' || 't')"
341
- end
342
-
343
- it "should allow using a boolean operation with an integer on an boolean expression" do
344
- @d.lit(Sequel.expr(:x) & :a & 1).must_equal "(x AND a AND 1)"
345
- end
346
-
347
- it "should allow using a boolean operation with a string on an boolean expression" do
348
- @d.lit(Sequel.expr(:x) & :a & 'a').must_equal "(x AND a AND 'a')"
349
- end
350
-
351
- it "should allowing AND of boolean expression and literal string" do
352
- @d.lit(Sequel.expr(:x) & :a & Sequel.lit('a')).must_equal "(x AND a AND a)"
353
- end
354
-
355
- it "should allowing + of integer expression and literal string" do
356
- @d.lit(Sequel.expr(:x) + :a + Sequel.lit('a')).must_equal "(x + a + a)"
357
- end
358
-
359
- it "should allowing + of string expression and literal string" do
360
- @d.lit(Sequel.expr(:x) + 'a' + Sequel.lit('a')).must_equal "(x || 'a' || a)"
361
- end
362
-
363
- it "should allow sql_{string,boolean,number} methods on numeric expressions" do
364
- @d.lit((Sequel.expr(:x) + 1).sql_string + 'a').must_equal "((x + 1) || 'a')"
365
- @d.lit((Sequel.expr(:x) + 1).sql_boolean & 1).must_equal "((x + 1) AND 1)"
366
- @d.lit((Sequel.expr(:x) + 1).sql_number + 'a').must_equal "(x + 1 + 'a')"
367
- end
368
-
369
- it "should allow sql_{string,boolean,number} methods on string expressions" do
370
- @d.lit((Sequel.expr(:x) + 'a').sql_string + 'a').must_equal "(x || 'a' || 'a')"
371
- @d.lit((Sequel.expr(:x) + 'a').sql_boolean & 1).must_equal "((x || 'a') AND 1)"
372
- @d.lit((Sequel.expr(:x) + 'a').sql_number + 'a').must_equal "((x || 'a') + 'a')"
373
- end
374
-
375
- it "should allow sql_{string,boolean,number} methods on boolean expressions" do
376
- @d.lit((Sequel.expr(:x) & :y).sql_string + 'a').must_equal "((x AND y) || 'a')"
377
- @d.lit((Sequel.expr(:x) & :y).sql_boolean & 1).must_equal "(x AND y AND 1)"
378
- @d.lit((Sequel.expr(:x) & :y).sql_number + 'a').must_equal "((x AND y) + 'a')"
379
- end
380
-
381
- it "should raise an error if trying to literalize an invalid complex expression" do
382
- ce = Sequel.+(:x, 1)
383
- ce.instance_variable_set(:@op, :BANG)
384
- proc{@d.lit(ce)}.must_raise(Sequel::InvalidOperation)
385
- end
386
-
387
- it "should support equality comparison of two expressions" do
388
- e1 = ~Sequel.like(:comment, '%:hidden:%')
389
- e2 = ~Sequel.like(:comment, '%:hidden:%')
390
- e1.must_equal e2
391
- end
392
-
393
- it "should support expression filter methods on Datasets" do
394
- d = @d.select(:a)
395
-
396
- @d.lit(d + 1).must_equal '((SELECT a FROM items) + 1)'
397
- @d.lit(d - 1).must_equal '((SELECT a FROM items) - 1)'
398
- @d.lit(d * 1).must_equal '((SELECT a FROM items) * 1)'
399
- @d.lit(d / 1).must_equal '((SELECT a FROM items) / 1)'
400
-
401
- @d.lit(d => 1).must_equal '((SELECT a FROM items) = 1)'
402
- @d.lit(Sequel.~(d => 1)).must_equal '((SELECT a FROM items) != 1)'
403
- @d.lit(d > 1).must_equal '((SELECT a FROM items) > 1)'
404
- @d.lit(d < 1).must_equal '((SELECT a FROM items) < 1)'
405
- @d.lit(d >= 1).must_equal '((SELECT a FROM items) >= 1)'
406
- @d.lit(d <= 1).must_equal '((SELECT a FROM items) <= 1)'
407
-
408
- @d.lit(d.as(:b)).must_equal '(SELECT a FROM items) AS b'
409
-
410
- @d.lit(d & :b).must_equal '((SELECT a FROM items) AND b)'
411
- @d.lit(d | :b).must_equal '((SELECT a FROM items) OR b)'
412
- @d.lit(~d).must_equal 'NOT (SELECT a FROM items)'
413
-
414
- @d.lit(d.cast(Integer)).must_equal 'CAST((SELECT a FROM items) AS integer)'
415
- @d.lit(d.cast_numeric).must_equal 'CAST((SELECT a FROM items) AS integer)'
416
- @d.lit(d.cast_string).must_equal 'CAST((SELECT a FROM items) AS varchar(255))'
417
- @d.lit(d.cast_numeric << :b).must_equal '(CAST((SELECT a FROM items) AS integer) << b)'
418
- @d.lit(d.cast_string + :b).must_equal '(CAST((SELECT a FROM items) AS varchar(255)) || b)'
419
-
420
- @d.lit(d.extract(:year)).must_equal 'extract(year FROM (SELECT a FROM items))'
421
- @d.lit(d.sql_boolean & :b).must_equal '((SELECT a FROM items) AND b)'
422
- @d.lit(d.sql_number << :b).must_equal '((SELECT a FROM items) << b)'
423
- @d.lit(d.sql_string + :b).must_equal '((SELECT a FROM items) || b)'
424
-
425
- @d.lit(d.asc).must_equal '(SELECT a FROM items) ASC'
426
- @d.lit(d.desc).must_equal '(SELECT a FROM items) DESC'
427
-
428
- @d.lit(d.like(:b)).must_equal '((SELECT a FROM items) LIKE b ESCAPE \'\\\')'
429
- @d.lit(d.ilike(:b)).must_equal '(UPPER((SELECT a FROM items)) LIKE UPPER(b) ESCAPE \'\\\')'
430
- end
431
-
432
- it "should handled emulated char_length function" do
433
- @d.lit(Sequel.char_length(:a)).must_equal 'char_length(a)'
434
- end
435
-
436
- it "should handled emulated trim function" do
437
- @d.lit(Sequel.trim(:a)).must_equal 'trim(a)'
438
- end
439
-
440
- it "should handled emulated function where only name is emulated" do
441
- dsc = Class.new(Sequel::Dataset)
442
- efm = dsc::EMULATED_FUNCTION_MAP.dup
443
- dsc::EMULATED_FUNCTION_MAP[:trim] = :foo
444
- dsc.new(@d.db).literal(Sequel.trim(:a)).must_equal 'foo(a)'
445
- dsc::EMULATED_FUNCTION_MAP.replace(efm)
446
- end
447
-
448
- it "should handled emulated function needing full emulation" do
449
- dsc = Class.new(Sequel::Dataset) do
450
- def emulate_function?(n) n == :trim end
451
- def emulate_function_sql_append(sql, f)
452
- sql << "#{f.name}FOO(lower(#{f.args.first}))"
453
- end
454
- end
455
- dsc.new(@d.db).literal(Sequel.trim(:a)).must_equal 'trimFOO(lower(a))'
456
- end
457
- end
458
-
459
- describe Sequel::SQL::VirtualRow do
460
- before do
461
- db = Sequel::Database.new
462
- db.quote_identifiers = true
463
- @d = db[:items]
464
- meta_def(@d, :supports_window_functions?){true}
465
- def @d.l(*args, &block)
466
- literal(filter_expr(*args, &block))
467
- end
468
- end
469
-
470
- it "should treat methods without arguments as identifiers" do
471
- @d.l{column}.must_equal '"column"'
472
- end
473
-
474
- it "should treat methods without arguments that have embedded double underscores as qualified identifiers" do
475
- @d.l{table__column}.must_equal '"table"."column"'
476
- end
477
-
478
- it "should treat methods with arguments as functions with the arguments" do
479
- @d.l{function(arg1, 10, 'arg3')}.must_equal 'function("arg1", 10, \'arg3\')'
480
- end
481
-
482
- it "should treat methods with a block and no arguments as a function call with no arguments" do
483
- @d.l{version{}}.must_equal 'version()'
484
- end
485
-
486
- it "should treat methods with a block and a leading argument :* as a function call with the SQL wildcard" do
487
- @d.l{count(:*){}}.must_equal 'count(*)'
488
- end
489
-
490
- it "should support * method on functions to raise error if function already has an argument" do
491
- proc{@d.l{count(1).*}}.must_raise(Sequel::Error)
492
- end
493
-
494
- it "should support * method on functions to use * as the argument" do
495
- @d.l{count{}.*}.must_equal 'count(*)'
496
- @d.literal(Sequel.expr{sum(1) * 2}).must_equal '(sum(1) * 2)'
497
- end
498
-
499
- it "should treat methods with a block and a leading argument :distinct as a function call with DISTINCT and the additional method arguments" do
500
- @d.l{count(:distinct, column1){}}.must_equal 'count(DISTINCT "column1")'
501
- @d.l{count(:distinct, column1, column2){}}.must_equal 'count(DISTINCT "column1", "column2")'
502
- end
503
-
504
- it "should support distinct methods on functions to use DISTINCT before the arguments" do
505
- @d.l{count(column1).distinct}.must_equal 'count(DISTINCT "column1")'
506
- @d.l{count(column1, column2).distinct}.must_equal 'count(DISTINCT "column1", "column2")'
507
- end
508
-
509
- it "should raise an error if an unsupported argument is used with a block" do
510
- proc{@d.where{count(:blah){}}}.must_raise(Sequel::Error)
511
- end
512
-
513
- it "should treat methods with a block and a leading argument :over as a window function call" do
514
- @d.l{rank(:over){}}.must_equal 'rank() OVER ()'
515
- end
516
-
517
- it "should support :partition options for window function calls" do
518
- @d.l{rank(:over, :partition=>column1){}}.must_equal 'rank() OVER (PARTITION BY "column1")'
519
- @d.l{rank(:over, :partition=>[column1, column2]){}}.must_equal 'rank() OVER (PARTITION BY "column1", "column2")'
520
- end
521
-
522
- it "should support :args options for window function calls" do
523
- @d.l{avg(:over, :args=>column1){}}.must_equal 'avg("column1") OVER ()'
524
- @d.l{avg(:over, :args=>[column1, column2]){}}.must_equal 'avg("column1", "column2") OVER ()'
525
- end
526
-
527
- it "should support :order option for window function calls" do
528
- @d.l{rank(:over, :order=>column1){}}.must_equal 'rank() OVER (ORDER BY "column1")'
529
- @d.l{rank(:over, :order=>[column1, column2]){}}.must_equal 'rank() OVER (ORDER BY "column1", "column2")'
530
- end
531
-
532
- it "should support :window option for window function calls" do
533
- @d.l{rank(:over, :window=>:win){}}.must_equal 'rank() OVER ("win")'
534
- end
535
-
536
- it "should support :*=>true option for window function calls" do
537
- @d.l{count(:over, :* =>true){}}.must_equal 'count(*) OVER ()'
538
- end
539
-
540
- it "should support :frame=>:all option for window function calls" do
541
- @d.l{rank(:over, :frame=>:all){}}.must_equal 'rank() OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)'
542
- end
543
-
544
- it "should support :frame=>:rows option for window function calls" do
545
- @d.l{rank(:over, :frame=>:rows){}}.must_equal 'rank() OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)'
546
- end
547
-
548
- it "should support :frame=>'some string' option for window function calls" do
549
- @d.l{rank(:over, :frame=>'RANGE BETWEEN 3 PRECEDING AND CURRENT ROW'){}}.must_equal 'rank() OVER (RANGE BETWEEN 3 PRECEDING AND CURRENT ROW)'
550
- end
551
-
552
- it "should raise an error if an invalid :frame option is used" do
553
- proc{@d.l{rank(:over, :frame=>:blah){}}}.must_raise(Sequel::Error)
554
- end
555
-
556
- it "should support all these options together" do
557
- @d.l{count(:over, :* =>true, :partition=>a, :order=>b, :window=>:win, :frame=>:rows){}}.must_equal 'count(*) OVER ("win" PARTITION BY "a" ORDER BY "b" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)'
558
- end
559
-
560
- it "should support over method on functions to create window functions" do
561
- @d.l{rank{}.over}.must_equal 'rank() OVER ()'
562
- @d.l{sum(c).over(:partition=>a, :order=>b, :window=>:win, :frame=>:rows)}.must_equal 'sum("c") OVER ("win" PARTITION BY "a" ORDER BY "b" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)'
563
- end
564
-
565
- it "should support over method with a Window argument" do
566
- @d.l{sum(c).over(Sequel::SQL::Window.new(:partition=>a, :order=>b, :window=>:win, :frame=>:rows))}.must_equal 'sum("c") OVER ("win" PARTITION BY "a" ORDER BY "b" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)'
567
- end
568
-
569
- it "should raise error if over is called on a function that already has a window " do
570
- proc{@d.l{rank{}.over.over}}.must_raise(Sequel::Error)
571
- end
572
-
573
- it "should raise an error if window functions are not supported" do
574
- class << @d; remove_method :supports_window_functions? end
575
- meta_def(@d, :supports_window_functions?){false}
576
- proc{@d.l{count(:over, :* =>true, :partition=>a, :order=>b, :window=>:win, :frame=>:rows){}}}.must_raise(Sequel::Error)
577
- proc{Sequel.mock.dataset.filter{count(:over, :* =>true, :partition=>a, :order=>b, :window=>:win, :frame=>:rows){}}.sql}.must_raise(Sequel::Error)
578
- end
579
-
580
- it "should handle lateral function calls" do
581
- @d.l{rank{}.lateral}.must_equal 'LATERAL rank()'
582
- end
583
-
584
- it "should handle ordered-set and hypothetical-set function calls" do
585
- @d.l{mode{}.within_group(:a)}.must_equal 'mode() WITHIN GROUP (ORDER BY "a")'
586
- @d.l{mode{}.within_group(:a, :b)}.must_equal 'mode() WITHIN GROUP (ORDER BY "a", "b")'
587
- end
588
-
589
- it "should handle filtered aggregate function calls" do
590
- @d.l{count{}.*.filter(:a, :b)}.must_equal 'count(*) FILTER (WHERE ("a" AND "b"))'
591
- @d.l{count{}.*.filter(:a=>1)}.must_equal 'count(*) FILTER (WHERE ("a" = 1))'
592
- @d.l{count{}.*.filter{b > 1}}.must_equal 'count(*) FILTER (WHERE ("b" > 1))'
593
- @d.l{count{}.*.filter(:a=>1){b > 1}}.must_equal 'count(*) FILTER (WHERE (("a" = 1) AND ("b" > 1)))'
594
- end
595
-
596
- it "should handle fitlered ordered-set and hypothetical-set function calls" do
597
- @d.l{mode{}.within_group(:a).filter(:a=>1)}.must_equal 'mode() WITHIN GROUP (ORDER BY "a") FILTER (WHERE ("a" = 1))'
598
- end
599
-
600
- it "should handle function calls with ordinality" do
601
- @d.l{foo{}.with_ordinality}.must_equal 'foo() WITH ORDINALITY'
602
- end
603
-
604
- it "should support function method on identifiers to create functions" do
605
- @d.l{rank.function}.must_equal 'rank()'
606
- @d.l{sum.function(c)}.must_equal 'sum("c")'
607
- @d.l{sum.function(c, 1)}.must_equal 'sum("c", 1)'
608
- end
609
-
610
- it "should support function method on qualified identifiers to create functions" do
611
- @d.l{sch__rank.function}.must_equal 'sch.rank()'
612
- @d.l{sch__sum.function(c)}.must_equal 'sch.sum("c")'
613
- @d.l{sch__sum.function(c, 1)}.must_equal 'sch.sum("c", 1)'
614
- @d.l{Sequel.qualify(sch__sum, :x__y).function(c, 1)}.must_equal 'sch.sum.x.y("c", 1)'
615
- end
616
-
617
- it "should handle quoted function names" do
618
- def @d.supports_quoted_function_names?; true; end
619
- @d.l{rank.function}.must_equal '"rank"()'
620
- @d.l{sch__rank.function}.must_equal '"sch"."rank"()'
621
- end
622
-
623
- it "should quote function names if a quoted function is used and database supports quoted function names" do
624
- def @d.supports_quoted_function_names?; true; end
625
- @d.l{rank{}.quoted}.must_equal '"rank"()'
626
- @d.l{sch__rank{}.quoted}.must_equal '"sch__rank"()'
627
- end
628
-
629
- it "should not quote function names if an unquoted function is used" do
630
- def @d.supports_quoted_function_names?; true; end
631
- @d.l{rank.function.unquoted}.must_equal 'rank()'
632
- @d.l{sch__rank.function.unquoted}.must_equal 'sch.rank()'
633
- end
634
-
635
- it "should deal with classes without requiring :: prefix" do
636
- @d.l{date < Date.today}.must_equal "(\"date\" < '#{Date.today}')"
637
- @d.l{date < Sequel::CURRENT_DATE}.must_equal "(\"date\" < CURRENT_DATE)"
638
- @d.l{num < Math::PI.to_i}.must_equal "(\"num\" < 3)"
639
- end
640
-
641
- it "should deal with methods added to Object after requiring Sequel" do
642
- class Object
643
- def adsoiwemlsdaf; 42; end
644
- end
645
- Sequel::BasicObject.remove_methods!
646
- @d.l{a > adsoiwemlsdaf}.must_equal '("a" > "adsoiwemlsdaf")'
647
- end
648
-
649
- it "should deal with private methods added to Kernel after requiring Sequel" do
650
- module Kernel
651
- private
652
- def adsoiwemlsdaf2; 42; end
653
- end
654
- Sequel::BasicObject.remove_methods!
655
- @d.l{a > adsoiwemlsdaf2}.must_equal '("a" > "adsoiwemlsdaf2")'
656
- end
657
-
658
- it "should have operator methods defined that produce Sequel expression objects" do
659
- @d.l{|o| o.&({:a=>1}, :b)}.must_equal '(("a" = 1) AND "b")'
660
- @d.l{|o| o.|({:a=>1}, :b)}.must_equal '(("a" = 1) OR "b")'
661
- @d.l{|o| o.+(1, :b) > 2}.must_equal '((1 + "b") > 2)'
662
- @d.l{|o| o.-(1, :b) < 2}.must_equal '((1 - "b") < 2)'
663
- @d.l{|o| o.*(1, :b) >= 2}.must_equal '((1 * "b") >= 2)'
664
- @d.l{|o| o./(1, :b) <= 2}.must_equal '((1 / "b") <= 2)'
665
- @d.l{|o| o.~(:a=>1)}.must_equal '("a" != 1)'
666
- @d.l{|o| o.~([[:a, 1], [:b, 2]])}.must_equal '(("a" != 1) OR ("b" != 2))'
667
- @d.l{|o| o.<(1, :b)}.must_equal '(1 < "b")'
668
- @d.l{|o| o.>(1, :b)}.must_equal '(1 > "b")'
669
- @d.l{|o| o.<=(1, :b)}.must_equal '(1 <= "b")'
670
- @d.l{|o| o.>=(1, :b)}.must_equal '(1 >= "b")'
671
- end
672
-
673
- it "should have have ` produce literal strings" do
674
- @d.l{a > `some SQL`}.must_equal '("a" > some SQL)'
675
- @d.l{|o| o.a > o.`('some SQL')}.must_equal '("a" > some SQL)' #`
676
- end
677
- end
678
-
679
- describe "Sequel core extension replacements" do
680
- before do
681
- @db = Sequel::Database.new
682
- @ds = @db.dataset
683
- def @ds.supports_regexp?; true end
684
- @o = Object.new
685
- def @o.sql_literal(ds) 'foo' end
686
- end
687
-
688
- def l(arg, should)
689
- @ds.literal(arg).must_equal should
690
- end
691
-
692
- it "Sequel.expr should return items wrapped in Sequel objects" do
693
- Sequel.expr(1).must_be_kind_of(Sequel::SQL::NumericExpression)
694
- Sequel.expr('a').must_be_kind_of(Sequel::SQL::StringExpression)
695
- Sequel.expr(true).must_be_kind_of(Sequel::SQL::BooleanExpression)
696
- Sequel.expr(nil).must_be_kind_of(Sequel::SQL::Wrapper)
697
- Sequel.expr({1=>2}).must_be_kind_of(Sequel::SQL::BooleanExpression)
698
- Sequel.expr([[1, 2]]).must_be_kind_of(Sequel::SQL::BooleanExpression)
699
- Sequel.expr([1]).must_be_kind_of(Sequel::SQL::Wrapper)
700
- Sequel.expr{|o| o.a}.must_be_kind_of(Sequel::SQL::Identifier)
701
- Sequel.expr{a}.must_be_kind_of(Sequel::SQL::Identifier)
702
- Sequel.expr(:a).must_be_kind_of(Sequel::SQL::Identifier)
703
- Sequel.expr(:a__b).must_be_kind_of(Sequel::SQL::QualifiedIdentifier)
704
- Sequel.expr(:a___c).must_be_kind_of(Sequel::SQL::AliasedExpression)
705
- Sequel.expr(:a___c).expression.must_be_kind_of(Sequel::SQL::Identifier)
706
- Sequel.expr(:a__b___c).must_be_kind_of(Sequel::SQL::AliasedExpression)
707
- Sequel.expr(:a__b___c).expression.must_be_kind_of(Sequel::SQL::QualifiedIdentifier)
708
- end
709
-
710
- it "Sequel.expr should return an appropriate wrapped object" do
711
- l(Sequel.expr(1) + 1, "(1 + 1)")
712
- l(Sequel.expr('a') + 'b', "('a' || 'b')")
713
- l(Sequel.expr(:b) & nil, "(b AND NULL)")
714
- l(Sequel.expr(nil) & true, "(NULL AND 't')")
715
- l(Sequel.expr(false) & true, "('f' AND 't')")
716
- l(Sequel.expr(true) | false, "('t' OR 'f')")
717
- l(Sequel.expr(@o) + 1, "(foo + 1)")
718
- end
719
-
720
- it "Sequel.expr should handle condition specifiers" do
721
- l(Sequel.expr(:a=>1) & nil, "((a = 1) AND NULL)")
722
- l(Sequel.expr([[:a, 1]]) & nil, "((a = 1) AND NULL)")
723
- l(Sequel.expr([[:a, 1], [:b, 2]]) & nil, "((a = 1) AND (b = 2) AND NULL)")
724
- end
725
-
726
- it "Sequel.expr should handle arrays that are not condition specifiers" do
727
- l(Sequel.expr([1]), "(1)")
728
- l(Sequel.expr([1, 2]), "(1, 2)")
729
- end
730
-
731
- it "Sequel.expr should treat blocks/procs as virtual rows and wrap the output" do
732
- l(Sequel.expr{1} + 1, "(1 + 1)")
733
- l(Sequel.expr{o__a} + 1, "(o.a + 1)")
734
- l(Sequel.expr{[[:a, 1]]} & nil, "((a = 1) AND NULL)")
735
- l(Sequel.expr{|v| @o} + 1, "(foo + 1)")
736
-
737
- l(Sequel.expr(proc{1}) + 1, "(1 + 1)")
738
- l(Sequel.expr(proc{o__a}) + 1, "(o.a + 1)")
739
- l(Sequel.expr(proc{[[:a, 1]]}) & nil, "((a = 1) AND NULL)")
740
- l(Sequel.expr(proc{|v| @o}) + 1, "(foo + 1)")
741
- end
742
-
743
- it "Sequel.expr should handle lambda proc virtual rows" do
744
- l(Sequel.expr(&lambda{1}), "1")
745
- l(Sequel.expr(&lambda{|| 1}), "1")
746
- end
747
-
748
- it "Sequel.expr should raise an error if given an argument and a block" do
749
- proc{Sequel.expr(nil){}}.must_raise(Sequel::Error)
750
- end
751
-
752
- it "Sequel.expr should raise an error if given neither an argument nor a block" do
753
- proc{Sequel.expr}.must_raise(Sequel::Error)
754
- end
755
-
756
- it "Sequel.expr should return existing Sequel expressions directly" do
757
- o = Sequel.expr(1)
758
- Sequel.expr(o).must_be_same_as(o)
759
- o = Sequel.lit('1')
760
- Sequel.expr(o).must_be_same_as(o)
761
- end
762
-
763
- it "Sequel.~ should invert the given object" do
764
- l(Sequel.~(nil), 'NOT NULL')
765
- l(Sequel.~(:a=>1), "(a != 1)")
766
- l(Sequel.~([[:a, 1]]), "(a != 1)")
767
- l(Sequel.~([[:a, 1], [:b, 2]]), "((a != 1) OR (b != 2))")
768
- l(Sequel.~(Sequel.expr([[:a, 1], [:b, 2]]) & nil), "((a != 1) OR (b != 2) OR NOT NULL)")
769
- end
770
-
771
- it "Sequel.case should use a CASE expression" do
772
- l(Sequel.case({:a=>1}, 2), "(CASE WHEN a THEN 1 ELSE 2 END)")
773
- l(Sequel.case({:a=>1}, 2, :b), "(CASE b WHEN a THEN 1 ELSE 2 END)")
774
- l(Sequel.case([[:a, 1]], 2), "(CASE WHEN a THEN 1 ELSE 2 END)")
775
- l(Sequel.case([[:a, 1]], 2, :b), "(CASE b WHEN a THEN 1 ELSE 2 END)")
776
- l(Sequel.case([[:a, 1], [:c, 3]], 2), "(CASE WHEN a THEN 1 WHEN c THEN 3 ELSE 2 END)")
777
- l(Sequel.case([[:a, 1], [:c, 3]], 2, :b), "(CASE b WHEN a THEN 1 WHEN c THEN 3 ELSE 2 END)")
778
- end
779
-
780
- it "Sequel.case should raise an error if not given a condition specifier" do
781
- proc{Sequel.case(1, 2)}.must_raise(Sequel::Error)
782
- end
783
-
784
- it "Sequel.value_list should use an SQL value list" do
785
- l(Sequel.value_list([[1, 2]]), "((1, 2))")
786
- end
787
-
788
- it "Sequel.value_list raise an error if not given an array" do
789
- proc{Sequel.value_list(1)}.must_raise(Sequel::Error)
790
- end
791
-
792
- it "Sequel.negate should negate all entries in conditions specifier and join with AND" do
793
- l(Sequel.negate(:a=>1), "(a != 1)")
794
- l(Sequel.negate([[:a, 1]]), "(a != 1)")
795
- l(Sequel.negate([[:a, 1], [:b, 2]]), "((a != 1) AND (b != 2))")
796
- end
797
-
798
- it "Sequel.negate should raise an error if not given a conditions specifier" do
799
- proc{Sequel.negate(1)}.must_raise(Sequel::Error)
800
- end
801
-
802
- it "Sequel.or should join all entries in conditions specifier with OR" do
803
- l(Sequel.or(:a=>1), "(a = 1)")
804
- l(Sequel.or([[:a, 1]]), "(a = 1)")
805
- l(Sequel.or([[:a, 1], [:b, 2]]), "((a = 1) OR (b = 2))")
806
- end
807
-
808
- it "Sequel.or should raise an error if not given a conditions specifier" do
809
- proc{Sequel.or(1)}.must_raise(Sequel::Error)
810
- end
811
-
812
- it "Sequel.join should should use SQL string concatenation to join array" do
813
- l(Sequel.join([]), "''")
814
- l(Sequel.join(['a']), "('a')")
815
- l(Sequel.join(['a', 'b']), "('a' || 'b')")
816
- l(Sequel.join(['a', 'b'], 'c'), "('a' || 'c' || 'b')")
817
- l(Sequel.join([true, :b], :c), "('t' || c || b)")
818
- l(Sequel.join([false, nil], Sequel.lit('c')), "('f' || c || NULL)")
819
- l(Sequel.join([Sequel.expr('a'), Sequel.lit('d')], 'c'), "('a' || 'c' || d)")
820
- end
821
-
822
- it "Sequel.join should raise an error if not given an array" do
823
- proc{Sequel.join(1)}.must_raise(Sequel::Error)
824
- end
825
-
826
- it "Sequel.& should join all arguments given with AND" do
827
- l(Sequel.&(:a), "a")
828
- l(Sequel.&(:a, :b=>:c), "(a AND (b = c))")
829
- l(Sequel.&(:a, {:b=>:c}, Sequel.lit('d')), "(a AND (b = c) AND d)")
830
- end
831
-
832
- it "Sequel.& should raise an error if given no arguments" do
833
- proc{Sequel.&}.must_raise(Sequel::Error)
834
- end
835
-
836
- it "Sequel.| should join all arguments given with OR" do
837
- l(Sequel.|(:a), "a")
838
- l(Sequel.|(:a, :b=>:c), "(a OR (b = c))")
839
- l(Sequel.|(:a, {:b=>:c}, Sequel.lit('d')), "(a OR (b = c) OR d)")
840
- end
841
-
842
- it "Sequel.| should raise an error if given no arguments" do
843
- proc{Sequel.|}.must_raise(Sequel::Error)
844
- end
845
-
846
- it "Sequel.as should return an aliased expression" do
847
- l(Sequel.as(:a, :b), "a AS b")
848
- end
849
-
850
- it "Sequel.cast should return a CAST expression" do
851
- l(Sequel.cast(:a, :int), "CAST(a AS int)")
852
- l(Sequel.cast(:a, Integer), "CAST(a AS integer)")
853
- end
854
-
855
- it "Sequel.cast_numeric should return a CAST expression treated as a number" do
856
- l(Sequel.cast_numeric(:a), "CAST(a AS integer)")
857
- l(Sequel.cast_numeric(:a, :int), "CAST(a AS int)")
858
- l(Sequel.cast_numeric(:a) << 2, "(CAST(a AS integer) << 2)")
859
- end
860
-
861
- it "Sequel.cast_string should return a CAST expression treated as a string" do
862
- l(Sequel.cast_string(:a), "CAST(a AS varchar(255))")
863
- l(Sequel.cast_string(:a, :text), "CAST(a AS text)")
864
- l(Sequel.cast_string(:a) + 'a', "(CAST(a AS varchar(255)) || 'a')")
865
- end
866
-
867
- it "Sequel.lit should return a literal string" do
868
- l(Sequel.lit('a'), "a")
869
- end
870
-
871
- it "Sequel.lit should return the argument if given a single literal string" do
872
- o = Sequel.lit('a')
873
- Sequel.lit(o).must_be_same_as(o)
874
- end
875
-
876
- it "Sequel.lit should accept multiple arguments for a placeholder literal string" do
877
- l(Sequel.lit('a = ?', 1), "a = 1")
878
- l(Sequel.lit('? = ?', :a, 1), "a = 1")
879
- l(Sequel.lit('a = :a', :a=>1), "a = 1")
880
- end
881
-
882
- it "Sequel.lit should work with an array for the placeholder string" do
883
- l(Sequel.lit(['a = '], 1), "a = 1")
884
- l(Sequel.lit(['', ' = '], :a, 1), "a = 1")
885
- end
886
-
887
- it "Sequel.blob should return an SQL::Blob" do
888
- l(Sequel.blob('a'), "'a'")
889
- Sequel.blob('a').must_be_kind_of(Sequel::SQL::Blob)
890
- end
891
-
892
- it "Sequel.blob should return the given argument if given a blob" do
893
- o = Sequel.blob('a')
894
- Sequel.blob(o).must_be_same_as(o)
895
- end
896
-
897
- it "Sequel.deep_qualify should do a deep qualification into nested structors" do
898
- l(Sequel.deep_qualify(:t, Sequel.+(:c, 1)), "(t.c + 1)")
899
- end
900
-
901
- it "Sequel.qualify should return a qualified identifier" do
902
- l(Sequel.qualify(:t, :c), "t.c")
903
- end
904
-
905
- it "Sequel.identifier should return an identifier" do
906
- l(Sequel.identifier(:t__c), "t__c")
907
- end
908
-
909
- it "Sequel.asc should return an ASC ordered expression" do
910
- l(Sequel.asc(:a), "a ASC")
911
- l(Sequel.asc(:a, :nulls=>:first), "a ASC NULLS FIRST")
912
- end
913
-
914
- it "Sequel.desc should return a DESC ordered expression " do
915
- l(Sequel.desc(:a), "a DESC")
916
- l(Sequel.desc(:a, :nulls=>:last), "a DESC NULLS LAST")
917
- end
918
-
919
- it "Sequel.{+,-,*,/} should accept arguments and use the appropriate operator" do
920
- %w'+ - * /'.each do |op|
921
- l(Sequel.send(op, 1), '1')
922
- l(Sequel.send(op, 1, 2), "(1 #{op} 2)")
923
- l(Sequel.send(op, 1, 2, 3), "(1 #{op} 2 #{op} 3)")
924
- end
925
- end
926
-
927
- it "Sequel.{+,-,*,/} should raise if given no arguments" do
928
- %w'+ - * /'.each do |op|
929
- proc{Sequel.send(op)}.must_raise(Sequel::Error)
930
- end
931
- end
932
-
933
- it "Sequel.like should use a LIKE expression" do
934
- l(Sequel.like('a', 'b'), "('a' LIKE 'b' ESCAPE '\\')")
935
- l(Sequel.like(:a, :b), "(a LIKE b ESCAPE '\\')")
936
- l(Sequel.like(:a, /b/), "(a ~ 'b')")
937
- l(Sequel.like(:a, 'c', /b/), "((a LIKE 'c' ESCAPE '\\') OR (a ~ 'b'))")
938
- end
939
-
940
- it "Sequel.ilike should use an ILIKE expression" do
941
- l(Sequel.ilike('a', 'b'), "(UPPER('a') LIKE UPPER('b') ESCAPE '\\')")
942
- l(Sequel.ilike(:a, :b), "(UPPER(a) LIKE UPPER(b) ESCAPE '\\')")
943
- l(Sequel.ilike(:a, /b/), "(a ~* 'b')")
944
- l(Sequel.ilike(:a, 'c', /b/), "((UPPER(a) LIKE UPPER('c') ESCAPE '\\') OR (a ~* 'b'))")
945
- end
946
-
947
- it "Sequel.subscript should use an SQL subscript" do
948
- l(Sequel.subscript(:a, 1), 'a[1]')
949
- l(Sequel.subscript(:a, 1, 2), 'a[1, 2]')
950
- l(Sequel.subscript(:a, [1, 2]), 'a[1, 2]')
951
- l(Sequel.subscript(:a, 1..2), 'a[1:2]')
952
- l(Sequel.subscript(:a, 1...3), 'a[1:2]')
953
- end
954
-
955
- it "Sequel.function should return an SQL function" do
956
- l(Sequel.function(:a), 'a()')
957
- l(Sequel.function(:a, 1), 'a(1)')
958
- l(Sequel.function(:a, :b, 2), 'a(b, 2)')
959
- end
960
-
961
- it "Sequel.extract should use a date/time extraction" do
962
- l(Sequel.extract(:year, :a), 'extract(year FROM a)')
963
- end
964
-
965
- it "#* with no arguments should use a ColumnAll for Identifier and QualifiedIdentifier" do
966
- l(Sequel.expr(:a).*, 'a.*')
967
- l(Sequel.expr(:a__b).*, 'a.b.*')
968
- end
969
-
970
- it "SQL::Blob should be aliasable and castable by default" do
971
- b = Sequel.blob('a')
972
- l(b.as(:a), "'a' AS a")
973
- l(b.cast(Integer), "CAST('a' AS integer)")
974
- end
975
-
976
- it "SQL::Blob should be convertable to a literal string by default" do
977
- b = Sequel.blob('a ?')
978
- l(b.lit, "a ?")
979
- l(b.lit(1), "a 1")
980
- end
981
- end
982
-
983
- describe "Sequel::SQL::Function#==" do
984
- it "should be true for functions with the same name and arguments, false otherwise" do
985
- a = Sequel.function(:date, :t)
986
- b = Sequel.function(:date, :t)
987
- a.must_equal b
988
- (a == b).must_equal true
989
- c = Sequel.function(:date, :c)
990
- a.wont_equal c
991
- (a == c).must_equal false
992
- d = Sequel.function(:time, :c)
993
- a.wont_equal d
994
- c.wont_equal d
995
- (a == d).must_equal false
996
- (c == d).must_equal false
997
- end
998
- end
999
-
1000
- describe "Sequel::SQL::OrderedExpression" do
1001
- it "should #desc" do
1002
- @oe = Sequel.asc(:column)
1003
- @oe.descending.must_equal false
1004
- @oe.desc.descending.must_equal true
1005
- end
1006
-
1007
- it "should #asc" do
1008
- @oe = Sequel.desc(:column)
1009
- @oe.descending.must_equal true
1010
- @oe.asc.descending.must_equal false
1011
- end
1012
-
1013
- it "should #invert" do
1014
- @oe = Sequel.desc(:column)
1015
- @oe.invert.descending.must_equal false
1016
- @oe.invert.invert.descending.must_equal true
1017
- end
1018
- end
1019
-
1020
- describe "Expression" do
1021
- it "should consider objects == only if they have the same attributes" do
1022
- Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc.must_equal Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc
1023
- Sequel.qualify(:table, :other_column).cast(:type).*(:numeric_column).asc.wont_equal Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc
1024
-
1025
- Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc.must_equal(Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc)
1026
- Sequel.qualify(:table, :other_column).cast(:type).*(:numeric_column).asc.wont_equal(Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc)
1027
- end
1028
-
1029
- it "should use the same hash value for objects that have the same attributes" do
1030
- Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc.hash.must_equal Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc.hash
1031
- Sequel.qualify(:table, :other_column).cast(:type).*(:numeric_column).asc.hash.wont_equal Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc.hash
1032
-
1033
- h = {}
1034
- a = Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc
1035
- b = Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc
1036
- h[a] = 1
1037
- h[b] = 2
1038
- h[a].must_equal 2
1039
- h[b].must_equal 2
1040
- end
1041
- end
1042
-
1043
- describe "Sequel::SQLTime" do
1044
- before do
1045
- @db = Sequel.mock
1046
- end
1047
-
1048
- it ".create should create from hour, minutes, seconds and optional microseconds" do
1049
- @db.literal(Sequel::SQLTime.create(1, 2, 3)).must_equal "'01:02:03.000000'"
1050
- @db.literal(Sequel::SQLTime.create(1, 2, 3, 500000)).must_equal "'01:02:03.500000'"
1051
- end
1052
-
1053
- it "#to_s should include hour, minute, and second by default" do
1054
- Sequel::SQLTime.create(1, 2, 3).to_s.must_equal "01:02:03"
1055
- Sequel::SQLTime.create(1, 2, 3, 500000).to_s.must_equal "01:02:03"
1056
- end
1057
-
1058
- it "#to_s should handle arguments with super" do
1059
- t = Sequel::SQLTime.create(1, 2, 3)
1060
- begin
1061
- Time.now.to_s('%F')
1062
- rescue
1063
- proc{t.to_s('%F')}.must_raise ArgumentError
1064
- else
1065
- t.to_s('%F')
1066
- end
1067
- end
1068
- end
1069
-
1070
- describe "Sequel::SQL::Wrapper" do
1071
- before do
1072
- @ds = Sequel.mock.dataset
1073
- end
1074
-
1075
- it "should wrap objects so they can be used by the Sequel DSL" do
1076
- o = Object.new
1077
- def o.sql_literal(ds) 'foo' end
1078
- s = Sequel::SQL::Wrapper.new(o)
1079
- @ds.literal(s).must_equal "foo"
1080
- @ds.literal(s+1).must_equal "(foo + 1)"
1081
- @ds.literal(s & true).must_equal "(foo AND 't')"
1082
- @ds.literal(s < 1).must_equal "(foo < 1)"
1083
- @ds.literal(s.sql_subscript(1)).must_equal "foo[1]"
1084
- @ds.literal(s.like('a')).must_equal "(foo LIKE 'a' ESCAPE '\\')"
1085
- @ds.literal(s.as(:a)).must_equal "foo AS a"
1086
- @ds.literal(s.cast(Integer)).must_equal "CAST(foo AS integer)"
1087
- @ds.literal(s.desc).must_equal "foo DESC"
1088
- @ds.literal(s.sql_string + '1').must_equal "(foo || '1')"
1089
- end
1090
- end
1091
-
1092
- describe "Sequel::SQL::Blob#to_sequel_blob" do
1093
- it "should return self" do
1094
- c = Sequel::SQL::Blob.new('a')
1095
- c.to_sequel_blob.must_be_same_as(c)
1096
- end
1097
- end
1098
-
1099
- describe Sequel::SQL::Subscript do
1100
- before do
1101
- @s = Sequel::SQL::Subscript.new(:a, [1])
1102
- @ds = Sequel.mock.dataset
1103
- end
1104
-
1105
- it "should have | return a new non-nested subscript" do
1106
- s = (@s | 2)
1107
- @ds.literal(s).must_equal 'a[1, 2]'
1108
- end
1109
-
1110
- it "should have [] return a new nested subscript" do
1111
- s = @s[2]
1112
- @ds.literal(s).must_equal 'a[1][2]'
1113
- end
1114
- end
1115
-
1116
- describe Sequel::SQL::CaseExpression, "#with_merged_expression" do
1117
- it "should return self if it has no expression" do
1118
- c = Sequel.case({1=>0}, 3)
1119
- c.with_merged_expression.must_be_same_as(c)
1120
- end
1121
-
1122
- it "should merge expression into conditions if it has an expression" do
1123
- db = Sequel::Database.new
1124
- c = Sequel.case({1=>0}, 3, 4)
1125
- db.literal(c.with_merged_expression).must_equal db.literal(Sequel.case({{4=>1}=>0}, 3))
1126
- end
1127
- end
1128
-
1129
- describe "Sequel.recursive_map" do
1130
- it "should recursively convert an array using a callable" do
1131
- Sequel.recursive_map(['1'], proc{|s| s.to_i}).must_equal [1]
1132
- Sequel.recursive_map([['1']], proc{|s| s.to_i}).must_equal [[1]]
1133
- end
1134
-
1135
- it "should not call callable if value is nil" do
1136
- Sequel.recursive_map([nil], proc{|s| s.to_i}).must_equal [nil]
1137
- Sequel.recursive_map([[nil]], proc{|s| s.to_i}).must_equal [[nil]]
1138
- end
1139
- end
1140
-
1141
- describe "Sequel.delay" do
1142
- before do
1143
- @o = Class.new do
1144
- def a
1145
- @a ||= 0
1146
- @a += 1
1147
- end
1148
- def _a
1149
- @a if defined?(@a)
1150
- end
1151
-
1152
- attr_accessor :b
1153
- end.new
1154
- end
1155
-
1156
- it "should delay calling the block until literalization" do
1157
- ds = Sequel.mock[:b].where(:a=>Sequel.delay{@o.a})
1158
- @o._a.must_equal nil
1159
- ds.sql.must_equal "SELECT * FROM b WHERE (a = 1)"
1160
- @o._a.must_equal 1
1161
- ds.sql.must_equal "SELECT * FROM b WHERE (a = 2)"
1162
- @o._a.must_equal 2
1163
- end
1164
-
1165
- it "should call the block with the current dataset if it accepts one argument" do
1166
- ds = Sequel.mock[:b].where(Sequel.delay{|x| x.first_source})
1167
- ds.sql.must_equal "SELECT * FROM b WHERE b"
1168
- ds.from(:c).sql.must_equal "SELECT * FROM c WHERE c"
1169
- end
1170
-
1171
- it "should have the condition specifier handling respect delayed evaluations" do
1172
- ds = Sequel.mock[:b].where(:a=>Sequel.delay{@o.b})
1173
- ds.sql.must_equal "SELECT * FROM b WHERE (a IS NULL)"
1174
- @o.b = 1
1175
- ds.sql.must_equal "SELECT * FROM b WHERE (a = 1)"
1176
- @o.b = [1, 2]
1177
- ds.sql.must_equal "SELECT * FROM b WHERE (a IN (1, 2))"
1178
- end
1179
-
1180
- it "should have the condition specifier handling call block with the current dataset if it accepts one argument" do
1181
- ds = Sequel.mock[:b].where(:a=>Sequel.delay{|x| x.first_source})
1182
- ds.sql.must_equal "SELECT * FROM b WHERE (a = b)"
1183
- ds.from(:c).sql.must_equal "SELECT * FROM c WHERE (a = c)"
1184
- end
1185
-
1186
- it "should raise if called without a block" do
1187
- proc{Sequel.delay}.must_raise(Sequel::Error)
1188
- end
1189
- end
1190
-
1191
- describe Sequel do
1192
- before do
1193
- Sequel::JSON = Class.new do
1194
- self::ParserError = Sequel
1195
- def self.parse(json, opts={})
1196
- [json, opts]
1197
- end
1198
- end
1199
- end
1200
- after do
1201
- Sequel.send(:remove_const, :JSON)
1202
- end
1203
-
1204
- it ".parse_json should parse json correctly" do
1205
- Sequel.parse_json('[]').must_equal ['[]', {:create_additions=>false}]
1206
- end
1207
-
1208
- it ".json_parser_error_class should return the related parser error class" do
1209
- Sequel.json_parser_error_class.must_equal Sequel
1210
- end
1211
-
1212
- it ".object_to_json should return a json version of the object" do
1213
- o = Object.new
1214
- def o.to_json(*args); [1, args]; end
1215
- Sequel.object_to_json(o, :foo).must_equal [1, [:foo]]
1216
- end
1217
- end
1218
-
1219
- describe "Sequel::LiteralString" do
1220
- before do
1221
- @s = Sequel::LiteralString.new("? = ?")
1222
- end
1223
-
1224
- it "should have lit return self if no arguments" do
1225
- @s.lit.must_be_same_as(@s)
1226
- end
1227
-
1228
- it "should have lit return self if return a placeholder literal string if arguments" do
1229
- @s.lit(1, 2).must_be_kind_of(Sequel::SQL::PlaceholderLiteralString)
1230
- Sequel.mock.literal(@s.lit(1, :a)).must_equal '1 = a'
1231
- end
1232
-
1233
- it "should have to_sequel_blob convert to blob" do
1234
- @s.to_sequel_blob.must_equal @s
1235
- @s.to_sequel_blob.must_be_kind_of(Sequel::SQL::Blob)
1236
- end
1237
- end
1238
-
1239
- describe "Sequel core extensions" do
1240
- it "should have Sequel.core_extensions? be false by default" do
1241
- Sequel.core_extensions?.must_equal false
1242
- end
1243
- end