sequel 4.36.0 → 5.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (760) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +548 -5749
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +265 -159
  5. data/bin/sequel +34 -12
  6. data/doc/advanced_associations.rdoc +228 -187
  7. data/doc/association_basics.rdoc +281 -291
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +86 -51
  10. data/doc/code_order.rdoc +25 -19
  11. data/doc/core_extensions.rdoc +104 -63
  12. data/doc/dataset_basics.rdoc +12 -21
  13. data/doc/dataset_filtering.rdoc +99 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/fork_safety.rdoc +84 -0
  16. data/doc/mass_assignment.rdoc +74 -31
  17. data/doc/migration.rdoc +59 -51
  18. data/doc/model_dataset_method_design.rdoc +129 -0
  19. data/doc/model_hooks.rdoc +15 -25
  20. data/doc/model_plugins.rdoc +12 -12
  21. data/doc/mssql_stored_procedures.rdoc +3 -3
  22. data/doc/object_model.rdoc +58 -68
  23. data/doc/opening_databases.rdoc +85 -95
  24. data/doc/postgresql.rdoc +263 -38
  25. data/doc/prepared_statements.rdoc +29 -24
  26. data/doc/querying.rdoc +189 -167
  27. data/doc/reflection.rdoc +5 -6
  28. data/doc/release_notes/5.0.0.txt +159 -0
  29. data/doc/release_notes/5.1.0.txt +31 -0
  30. data/doc/release_notes/5.10.0.txt +84 -0
  31. data/doc/release_notes/5.11.0.txt +83 -0
  32. data/doc/release_notes/5.12.0.txt +141 -0
  33. data/doc/release_notes/5.13.0.txt +27 -0
  34. data/doc/release_notes/5.14.0.txt +63 -0
  35. data/doc/release_notes/5.15.0.txt +39 -0
  36. data/doc/release_notes/5.16.0.txt +110 -0
  37. data/doc/release_notes/5.17.0.txt +31 -0
  38. data/doc/release_notes/5.18.0.txt +69 -0
  39. data/doc/release_notes/5.19.0.txt +28 -0
  40. data/doc/release_notes/5.2.0.txt +33 -0
  41. data/doc/release_notes/5.20.0.txt +89 -0
  42. data/doc/release_notes/5.21.0.txt +87 -0
  43. data/doc/release_notes/5.22.0.txt +48 -0
  44. data/doc/release_notes/5.23.0.txt +56 -0
  45. data/doc/release_notes/5.24.0.txt +56 -0
  46. data/doc/release_notes/5.25.0.txt +32 -0
  47. data/doc/release_notes/5.26.0.txt +35 -0
  48. data/doc/release_notes/5.27.0.txt +21 -0
  49. data/doc/release_notes/5.28.0.txt +16 -0
  50. data/doc/release_notes/5.29.0.txt +22 -0
  51. data/doc/release_notes/5.3.0.txt +121 -0
  52. data/doc/release_notes/5.30.0.txt +20 -0
  53. data/doc/release_notes/5.31.0.txt +148 -0
  54. data/doc/release_notes/5.32.0.txt +46 -0
  55. data/doc/release_notes/5.33.0.txt +24 -0
  56. data/doc/release_notes/5.34.0.txt +40 -0
  57. data/doc/release_notes/5.35.0.txt +56 -0
  58. data/doc/release_notes/5.36.0.txt +60 -0
  59. data/doc/release_notes/5.37.0.txt +30 -0
  60. data/doc/release_notes/5.38.0.txt +28 -0
  61. data/doc/release_notes/5.39.0.txt +19 -0
  62. data/doc/release_notes/5.4.0.txt +80 -0
  63. data/doc/release_notes/5.40.0.txt +40 -0
  64. data/doc/release_notes/5.41.0.txt +25 -0
  65. data/doc/release_notes/5.42.0.txt +136 -0
  66. data/doc/release_notes/5.43.0.txt +98 -0
  67. data/doc/release_notes/5.44.0.txt +32 -0
  68. data/doc/release_notes/5.45.0.txt +34 -0
  69. data/doc/release_notes/5.46.0.txt +87 -0
  70. data/doc/release_notes/5.47.0.txt +59 -0
  71. data/doc/release_notes/5.48.0.txt +14 -0
  72. data/doc/release_notes/5.49.0.txt +59 -0
  73. data/doc/release_notes/5.5.0.txt +61 -0
  74. data/doc/release_notes/5.50.0.txt +78 -0
  75. data/doc/release_notes/5.51.0.txt +47 -0
  76. data/doc/release_notes/5.52.0.txt +87 -0
  77. data/doc/release_notes/5.53.0.txt +23 -0
  78. data/doc/release_notes/5.54.0.txt +27 -0
  79. data/doc/release_notes/5.55.0.txt +21 -0
  80. data/doc/release_notes/5.56.0.txt +51 -0
  81. data/doc/release_notes/5.57.0.txt +23 -0
  82. data/doc/release_notes/5.58.0.txt +31 -0
  83. data/doc/release_notes/5.59.0.txt +73 -0
  84. data/doc/release_notes/5.6.0.txt +31 -0
  85. data/doc/release_notes/5.60.0.txt +22 -0
  86. data/doc/release_notes/5.61.0.txt +43 -0
  87. data/doc/release_notes/5.7.0.txt +108 -0
  88. data/doc/release_notes/5.8.0.txt +170 -0
  89. data/doc/release_notes/5.9.0.txt +99 -0
  90. data/doc/schema_modification.rdoc +95 -75
  91. data/doc/security.rdoc +109 -80
  92. data/doc/sharding.rdoc +74 -47
  93. data/doc/sql.rdoc +147 -122
  94. data/doc/testing.rdoc +43 -20
  95. data/doc/thread_safety.rdoc +2 -4
  96. data/doc/transactions.rdoc +97 -18
  97. data/doc/validations.rdoc +52 -50
  98. data/doc/virtual_rows.rdoc +90 -109
  99. data/lib/sequel/adapters/ado/access.rb +15 -17
  100. data/lib/sequel/adapters/ado/mssql.rb +6 -15
  101. data/lib/sequel/adapters/ado.rb +150 -20
  102. data/lib/sequel/adapters/amalgalite.rb +11 -23
  103. data/lib/sequel/adapters/ibmdb.rb +47 -55
  104. data/lib/sequel/adapters/jdbc/db2.rb +29 -39
  105. data/lib/sequel/adapters/jdbc/derby.rb +58 -54
  106. data/lib/sequel/adapters/jdbc/h2.rb +93 -35
  107. data/lib/sequel/adapters/jdbc/hsqldb.rb +24 -31
  108. data/lib/sequel/adapters/jdbc/jtds.rb +2 -10
  109. data/lib/sequel/adapters/jdbc/mssql.rb +3 -11
  110. data/lib/sequel/adapters/jdbc/mysql.rb +17 -20
  111. data/lib/sequel/adapters/jdbc/oracle.rb +22 -18
  112. data/lib/sequel/adapters/jdbc/postgresql.rb +69 -71
  113. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +11 -23
  114. data/lib/sequel/adapters/jdbc/sqlite.rb +47 -11
  115. data/lib/sequel/adapters/jdbc/sqlserver.rb +34 -9
  116. data/lib/sequel/adapters/jdbc/transactions.rb +22 -38
  117. data/lib/sequel/adapters/jdbc.rb +145 -130
  118. data/lib/sequel/adapters/mock.rb +100 -111
  119. data/lib/sequel/adapters/mysql.rb +114 -122
  120. data/lib/sequel/adapters/mysql2.rb +147 -63
  121. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  122. data/lib/sequel/adapters/odbc/mssql.rb +8 -14
  123. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  124. data/lib/sequel/adapters/odbc.rb +20 -25
  125. data/lib/sequel/adapters/oracle.rb +50 -56
  126. data/lib/sequel/adapters/postgres.rb +305 -327
  127. data/lib/sequel/adapters/postgresql.rb +1 -1
  128. data/lib/sequel/adapters/shared/access.rb +74 -78
  129. data/lib/sequel/adapters/shared/db2.rb +118 -71
  130. data/lib/sequel/adapters/shared/mssql.rb +301 -220
  131. data/lib/sequel/adapters/shared/mysql.rb +299 -217
  132. data/lib/sequel/adapters/shared/oracle.rb +226 -65
  133. data/lib/sequel/adapters/shared/postgres.rb +935 -395
  134. data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -126
  135. data/lib/sequel/adapters/shared/sqlite.rb +447 -173
  136. data/lib/sequel/adapters/sqlanywhere.rb +48 -35
  137. data/lib/sequel/adapters/sqlite.rb +156 -111
  138. data/lib/sequel/adapters/tinytds.rb +30 -38
  139. data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
  140. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +3 -6
  141. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +2 -2
  142. data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
  143. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
  144. data/lib/sequel/adapters/utils/replace.rb +1 -4
  145. data/lib/sequel/adapters/utils/stored_procedures.rb +7 -22
  146. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
  147. data/lib/sequel/ast_transformer.rb +17 -89
  148. data/lib/sequel/connection_pool/sharded_single.rb +18 -15
  149. data/lib/sequel/connection_pool/sharded_threaded.rb +130 -111
  150. data/lib/sequel/connection_pool/single.rb +18 -13
  151. data/lib/sequel/connection_pool/threaded.rb +121 -120
  152. data/lib/sequel/connection_pool.rb +48 -29
  153. data/lib/sequel/core.rb +351 -301
  154. data/lib/sequel/database/connecting.rb +69 -57
  155. data/lib/sequel/database/dataset.rb +13 -5
  156. data/lib/sequel/database/dataset_defaults.rb +18 -102
  157. data/lib/sequel/database/features.rb +18 -4
  158. data/lib/sequel/database/logging.rb +12 -11
  159. data/lib/sequel/database/misc.rb +180 -122
  160. data/lib/sequel/database/query.rb +47 -27
  161. data/lib/sequel/database/schema_generator.rb +178 -84
  162. data/lib/sequel/database/schema_methods.rb +172 -97
  163. data/lib/sequel/database/transactions.rb +205 -44
  164. data/lib/sequel/database.rb +17 -2
  165. data/lib/sequel/dataset/actions.rb +339 -155
  166. data/lib/sequel/dataset/dataset_module.rb +46 -0
  167. data/lib/sequel/dataset/features.rb +90 -35
  168. data/lib/sequel/dataset/graph.rb +80 -58
  169. data/lib/sequel/dataset/misc.rb +137 -47
  170. data/lib/sequel/dataset/placeholder_literalizer.rb +63 -25
  171. data/lib/sequel/dataset/prepared_statements.rb +188 -85
  172. data/lib/sequel/dataset/query.rb +530 -222
  173. data/lib/sequel/dataset/sql.rb +590 -368
  174. data/lib/sequel/dataset.rb +26 -16
  175. data/lib/sequel/deprecated.rb +12 -2
  176. data/lib/sequel/exceptions.rb +46 -16
  177. data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
  178. data/lib/sequel/extensions/_model_pg_row.rb +43 -0
  179. data/lib/sequel/extensions/_pretty_table.rb +2 -5
  180. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  181. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  182. data/lib/sequel/extensions/async_thread_pool.rb +438 -0
  183. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  184. data/lib/sequel/extensions/blank.rb +8 -0
  185. data/lib/sequel/extensions/caller_logging.rb +79 -0
  186. data/lib/sequel/extensions/columns_introspection.rb +4 -3
  187. data/lib/sequel/extensions/connection_expiration.rb +20 -10
  188. data/lib/sequel/extensions/connection_validator.rb +11 -10
  189. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  190. data/lib/sequel/extensions/constraint_validations.rb +62 -39
  191. data/lib/sequel/extensions/core_extensions.rb +42 -48
  192. data/lib/sequel/extensions/core_refinements.rb +80 -59
  193. data/lib/sequel/extensions/current_datetime_timestamp.rb +1 -4
  194. data/lib/sequel/extensions/date_arithmetic.rb +98 -39
  195. data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
  196. data/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
  197. data/lib/sequel/extensions/duplicate_columns_handler.rb +21 -14
  198. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  199. data/lib/sequel/extensions/escaped_like.rb +100 -0
  200. data/lib/sequel/extensions/eval_inspect.rb +12 -15
  201. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  202. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  203. data/lib/sequel/extensions/freeze_datasets.rb +3 -0
  204. data/lib/sequel/extensions/from_block.rb +1 -34
  205. data/lib/sequel/extensions/graph_each.rb +4 -4
  206. data/lib/sequel/extensions/identifier_mangling.rb +180 -0
  207. data/lib/sequel/extensions/implicit_subquery.rb +48 -0
  208. data/lib/sequel/extensions/index_caching.rb +109 -0
  209. data/lib/sequel/extensions/inflector.rb +13 -5
  210. data/lib/sequel/extensions/integer64.rb +32 -0
  211. data/lib/sequel/extensions/is_distinct_from.rb +141 -0
  212. data/lib/sequel/extensions/looser_typecasting.rb +17 -8
  213. data/lib/sequel/extensions/migration.rb +119 -78
  214. data/lib/sequel/extensions/named_timezones.rb +88 -23
  215. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -82
  216. data/lib/sequel/extensions/null_dataset.rb +8 -8
  217. data/lib/sequel/extensions/pagination.rb +32 -29
  218. data/lib/sequel/extensions/pg_array.rb +221 -287
  219. data/lib/sequel/extensions/pg_array_ops.rb +17 -9
  220. data/lib/sequel/extensions/pg_enum.rb +63 -23
  221. data/lib/sequel/extensions/pg_extended_date_support.rb +241 -0
  222. data/lib/sequel/extensions/pg_hstore.rb +45 -54
  223. data/lib/sequel/extensions/pg_hstore_ops.rb +58 -6
  224. data/lib/sequel/extensions/pg_inet.rb +31 -12
  225. data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
  226. data/lib/sequel/extensions/pg_interval.rb +56 -29
  227. data/lib/sequel/extensions/pg_json.rb +417 -140
  228. data/lib/sequel/extensions/pg_json_ops.rb +270 -18
  229. data/lib/sequel/extensions/pg_loose_count.rb +4 -2
  230. data/lib/sequel/extensions/pg_multirange.rb +372 -0
  231. data/lib/sequel/extensions/pg_range.rb +131 -191
  232. data/lib/sequel/extensions/pg_range_ops.rb +42 -13
  233. data/lib/sequel/extensions/pg_row.rb +48 -81
  234. data/lib/sequel/extensions/pg_row_ops.rb +33 -14
  235. data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
  236. data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
  237. data/lib/sequel/extensions/query.rb +9 -7
  238. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  239. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  240. data/lib/sequel/extensions/s.rb +60 -0
  241. data/lib/sequel/extensions/schema_caching.rb +10 -1
  242. data/lib/sequel/extensions/schema_dumper.rb +71 -48
  243. data/lib/sequel/extensions/select_remove.rb +4 -4
  244. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
  245. data/lib/sequel/extensions/server_block.rb +51 -27
  246. data/lib/sequel/extensions/split_array_nil.rb +4 -4
  247. data/lib/sequel/extensions/sql_comments.rb +119 -7
  248. data/lib/sequel/extensions/sql_expr.rb +2 -1
  249. data/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
  250. data/lib/sequel/extensions/sqlite_json_ops.rb +255 -0
  251. data/lib/sequel/extensions/string_agg.rb +11 -8
  252. data/lib/sequel/extensions/string_date_time.rb +19 -23
  253. data/lib/sequel/extensions/symbol_aref.rb +55 -0
  254. data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
  255. data/lib/sequel/extensions/symbol_as.rb +23 -0
  256. data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
  257. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  258. data/lib/sequel/extensions/to_dot.rb +10 -4
  259. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  260. data/lib/sequel/model/associations.rb +1006 -284
  261. data/lib/sequel/model/base.rb +560 -805
  262. data/lib/sequel/model/dataset_module.rb +11 -10
  263. data/lib/sequel/model/default_inflections.rb +1 -1
  264. data/lib/sequel/model/errors.rb +10 -3
  265. data/lib/sequel/model/exceptions.rb +8 -10
  266. data/lib/sequel/model/inflections.rb +7 -20
  267. data/lib/sequel/model/plugins.rb +114 -0
  268. data/lib/sequel/model.rb +32 -82
  269. data/lib/sequel/plugins/active_model.rb +30 -14
  270. data/lib/sequel/plugins/after_initialize.rb +1 -1
  271. data/lib/sequel/plugins/association_dependencies.rb +25 -18
  272. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  273. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  274. data/lib/sequel/plugins/association_pks.rb +147 -70
  275. data/lib/sequel/plugins/association_proxies.rb +33 -9
  276. data/lib/sequel/plugins/async_thread_pool.rb +39 -0
  277. data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
  278. data/lib/sequel/plugins/auto_validations.rb +95 -28
  279. data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
  280. data/lib/sequel/plugins/before_after_save.rb +0 -42
  281. data/lib/sequel/plugins/blacklist_security.rb +21 -12
  282. data/lib/sequel/plugins/boolean_readers.rb +5 -5
  283. data/lib/sequel/plugins/boolean_subsets.rb +13 -8
  284. data/lib/sequel/plugins/caching.rb +25 -16
  285. data/lib/sequel/plugins/class_table_inheritance.rb +179 -100
  286. data/lib/sequel/plugins/column_conflicts.rb +16 -3
  287. data/lib/sequel/plugins/column_encryption.rb +728 -0
  288. data/lib/sequel/plugins/column_select.rb +7 -5
  289. data/lib/sequel/plugins/columns_updated.rb +42 -0
  290. data/lib/sequel/plugins/composition.rb +42 -26
  291. data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
  292. data/lib/sequel/plugins/constraint_validations.rb +20 -14
  293. data/lib/sequel/plugins/csv_serializer.rb +56 -35
  294. data/lib/sequel/plugins/dataset_associations.rb +40 -17
  295. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  296. data/lib/sequel/plugins/defaults_setter.rb +65 -10
  297. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  298. data/lib/sequel/plugins/dirty.rb +62 -24
  299. data/lib/sequel/plugins/eager_each.rb +3 -3
  300. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  301. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  302. data/lib/sequel/plugins/enum.rb +124 -0
  303. data/lib/sequel/plugins/error_splitter.rb +17 -12
  304. data/lib/sequel/plugins/finder.rb +246 -0
  305. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  306. data/lib/sequel/plugins/force_encoding.rb +7 -12
  307. data/lib/sequel/plugins/hook_class_methods.rb +37 -54
  308. data/lib/sequel/plugins/input_transformer.rb +18 -10
  309. data/lib/sequel/plugins/insert_conflict.rb +76 -0
  310. data/lib/sequel/plugins/insert_returning_select.rb +2 -2
  311. data/lib/sequel/plugins/instance_filters.rb +10 -8
  312. data/lib/sequel/plugins/instance_hooks.rb +34 -17
  313. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  314. data/lib/sequel/plugins/inverted_subsets.rb +22 -13
  315. data/lib/sequel/plugins/json_serializer.rb +124 -64
  316. data/lib/sequel/plugins/lazy_attributes.rb +21 -14
  317. data/lib/sequel/plugins/list.rb +35 -21
  318. data/lib/sequel/plugins/many_through_many.rb +134 -21
  319. data/lib/sequel/plugins/modification_detection.rb +15 -5
  320. data/lib/sequel/plugins/mssql_optimistic_locking.rb +6 -5
  321. data/lib/sequel/plugins/nested_attributes.rb +61 -31
  322. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  323. data/lib/sequel/plugins/pg_array_associations.rb +103 -53
  324. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +350 -0
  325. data/lib/sequel/plugins/pg_row.rb +5 -51
  326. data/lib/sequel/plugins/prepared_statements.rb +60 -72
  327. data/lib/sequel/plugins/prepared_statements_safe.rb +9 -4
  328. data/lib/sequel/plugins/rcte_tree.rb +68 -82
  329. data/lib/sequel/plugins/require_valid_schema.rb +67 -0
  330. data/lib/sequel/plugins/serialization.rb +43 -46
  331. data/lib/sequel/plugins/serialization_modification_detection.rb +3 -2
  332. data/lib/sequel/plugins/sharding.rb +15 -10
  333. data/lib/sequel/plugins/single_table_inheritance.rb +67 -28
  334. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  335. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  336. data/lib/sequel/plugins/split_values.rb +11 -6
  337. data/lib/sequel/plugins/sql_comments.rb +189 -0
  338. data/lib/sequel/plugins/static_cache.rb +77 -53
  339. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  340. data/lib/sequel/plugins/string_stripper.rb +3 -3
  341. data/lib/sequel/plugins/subclasses.rb +43 -10
  342. data/lib/sequel/plugins/subset_conditions.rb +15 -5
  343. data/lib/sequel/plugins/table_select.rb +2 -2
  344. data/lib/sequel/plugins/tactical_eager_loading.rb +96 -12
  345. data/lib/sequel/plugins/throw_failures.rb +110 -0
  346. data/lib/sequel/plugins/timestamps.rb +20 -8
  347. data/lib/sequel/plugins/touch.rb +19 -8
  348. data/lib/sequel/plugins/tree.rb +62 -32
  349. data/lib/sequel/plugins/typecast_on_load.rb +12 -4
  350. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  351. data/lib/sequel/plugins/unused_associations.rb +521 -0
  352. data/lib/sequel/plugins/update_or_create.rb +4 -4
  353. data/lib/sequel/plugins/update_primary_key.rb +1 -1
  354. data/lib/sequel/plugins/update_refresh.rb +26 -15
  355. data/lib/sequel/plugins/uuid.rb +7 -11
  356. data/lib/sequel/plugins/validate_associated.rb +18 -0
  357. data/lib/sequel/plugins/validation_class_methods.rb +38 -19
  358. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  359. data/lib/sequel/plugins/validation_helpers.rb +57 -41
  360. data/lib/sequel/plugins/whitelist_security.rb +122 -0
  361. data/lib/sequel/plugins/xml_serializer.rb +30 -31
  362. data/lib/sequel/sql.rb +471 -331
  363. data/lib/sequel/timezones.rb +78 -47
  364. data/lib/sequel/version.rb +7 -2
  365. data/lib/sequel.rb +1 -1
  366. metadata +217 -521
  367. data/Rakefile +0 -164
  368. data/doc/active_record.rdoc +0 -928
  369. data/doc/release_notes/1.0.txt +0 -38
  370. data/doc/release_notes/1.1.txt +0 -143
  371. data/doc/release_notes/1.3.txt +0 -101
  372. data/doc/release_notes/1.4.0.txt +0 -53
  373. data/doc/release_notes/1.5.0.txt +0 -155
  374. data/doc/release_notes/2.0.0.txt +0 -298
  375. data/doc/release_notes/2.1.0.txt +0 -271
  376. data/doc/release_notes/2.10.0.txt +0 -328
  377. data/doc/release_notes/2.11.0.txt +0 -215
  378. data/doc/release_notes/2.12.0.txt +0 -534
  379. data/doc/release_notes/2.2.0.txt +0 -253
  380. data/doc/release_notes/2.3.0.txt +0 -88
  381. data/doc/release_notes/2.4.0.txt +0 -106
  382. data/doc/release_notes/2.5.0.txt +0 -137
  383. data/doc/release_notes/2.6.0.txt +0 -157
  384. data/doc/release_notes/2.7.0.txt +0 -166
  385. data/doc/release_notes/2.8.0.txt +0 -171
  386. data/doc/release_notes/2.9.0.txt +0 -97
  387. data/doc/release_notes/3.0.0.txt +0 -221
  388. data/doc/release_notes/3.1.0.txt +0 -406
  389. data/doc/release_notes/3.10.0.txt +0 -286
  390. data/doc/release_notes/3.11.0.txt +0 -254
  391. data/doc/release_notes/3.12.0.txt +0 -304
  392. data/doc/release_notes/3.13.0.txt +0 -210
  393. data/doc/release_notes/3.14.0.txt +0 -118
  394. data/doc/release_notes/3.15.0.txt +0 -78
  395. data/doc/release_notes/3.16.0.txt +0 -45
  396. data/doc/release_notes/3.17.0.txt +0 -58
  397. data/doc/release_notes/3.18.0.txt +0 -120
  398. data/doc/release_notes/3.19.0.txt +0 -67
  399. data/doc/release_notes/3.2.0.txt +0 -268
  400. data/doc/release_notes/3.20.0.txt +0 -41
  401. data/doc/release_notes/3.21.0.txt +0 -87
  402. data/doc/release_notes/3.22.0.txt +0 -39
  403. data/doc/release_notes/3.23.0.txt +0 -172
  404. data/doc/release_notes/3.24.0.txt +0 -420
  405. data/doc/release_notes/3.25.0.txt +0 -88
  406. data/doc/release_notes/3.26.0.txt +0 -88
  407. data/doc/release_notes/3.27.0.txt +0 -82
  408. data/doc/release_notes/3.28.0.txt +0 -304
  409. data/doc/release_notes/3.29.0.txt +0 -459
  410. data/doc/release_notes/3.3.0.txt +0 -192
  411. data/doc/release_notes/3.30.0.txt +0 -135
  412. data/doc/release_notes/3.31.0.txt +0 -146
  413. data/doc/release_notes/3.32.0.txt +0 -202
  414. data/doc/release_notes/3.33.0.txt +0 -157
  415. data/doc/release_notes/3.34.0.txt +0 -671
  416. data/doc/release_notes/3.35.0.txt +0 -144
  417. data/doc/release_notes/3.36.0.txt +0 -245
  418. data/doc/release_notes/3.37.0.txt +0 -338
  419. data/doc/release_notes/3.38.0.txt +0 -234
  420. data/doc/release_notes/3.39.0.txt +0 -237
  421. data/doc/release_notes/3.4.0.txt +0 -325
  422. data/doc/release_notes/3.40.0.txt +0 -73
  423. data/doc/release_notes/3.41.0.txt +0 -155
  424. data/doc/release_notes/3.42.0.txt +0 -74
  425. data/doc/release_notes/3.43.0.txt +0 -105
  426. data/doc/release_notes/3.44.0.txt +0 -152
  427. data/doc/release_notes/3.45.0.txt +0 -179
  428. data/doc/release_notes/3.46.0.txt +0 -122
  429. data/doc/release_notes/3.47.0.txt +0 -270
  430. data/doc/release_notes/3.48.0.txt +0 -477
  431. data/doc/release_notes/3.5.0.txt +0 -510
  432. data/doc/release_notes/3.6.0.txt +0 -366
  433. data/doc/release_notes/3.7.0.txt +0 -179
  434. data/doc/release_notes/3.8.0.txt +0 -151
  435. data/doc/release_notes/3.9.0.txt +0 -233
  436. data/doc/release_notes/4.0.0.txt +0 -262
  437. data/doc/release_notes/4.1.0.txt +0 -85
  438. data/doc/release_notes/4.10.0.txt +0 -226
  439. data/doc/release_notes/4.11.0.txt +0 -147
  440. data/doc/release_notes/4.12.0.txt +0 -105
  441. data/doc/release_notes/4.13.0.txt +0 -169
  442. data/doc/release_notes/4.14.0.txt +0 -68
  443. data/doc/release_notes/4.15.0.txt +0 -56
  444. data/doc/release_notes/4.16.0.txt +0 -36
  445. data/doc/release_notes/4.17.0.txt +0 -38
  446. data/doc/release_notes/4.18.0.txt +0 -36
  447. data/doc/release_notes/4.19.0.txt +0 -45
  448. data/doc/release_notes/4.2.0.txt +0 -129
  449. data/doc/release_notes/4.20.0.txt +0 -79
  450. data/doc/release_notes/4.21.0.txt +0 -94
  451. data/doc/release_notes/4.22.0.txt +0 -72
  452. data/doc/release_notes/4.23.0.txt +0 -65
  453. data/doc/release_notes/4.24.0.txt +0 -99
  454. data/doc/release_notes/4.25.0.txt +0 -181
  455. data/doc/release_notes/4.26.0.txt +0 -44
  456. data/doc/release_notes/4.27.0.txt +0 -78
  457. data/doc/release_notes/4.28.0.txt +0 -57
  458. data/doc/release_notes/4.29.0.txt +0 -41
  459. data/doc/release_notes/4.3.0.txt +0 -40
  460. data/doc/release_notes/4.30.0.txt +0 -37
  461. data/doc/release_notes/4.31.0.txt +0 -57
  462. data/doc/release_notes/4.32.0.txt +0 -132
  463. data/doc/release_notes/4.33.0.txt +0 -88
  464. data/doc/release_notes/4.34.0.txt +0 -86
  465. data/doc/release_notes/4.35.0.txt +0 -130
  466. data/doc/release_notes/4.36.0.txt +0 -116
  467. data/doc/release_notes/4.4.0.txt +0 -92
  468. data/doc/release_notes/4.5.0.txt +0 -34
  469. data/doc/release_notes/4.6.0.txt +0 -30
  470. data/doc/release_notes/4.7.0.txt +0 -103
  471. data/doc/release_notes/4.8.0.txt +0 -175
  472. data/doc/release_notes/4.9.0.txt +0 -190
  473. data/lib/sequel/adapters/cubrid.rb +0 -144
  474. data/lib/sequel/adapters/do/mysql.rb +0 -66
  475. data/lib/sequel/adapters/do/postgres.rb +0 -44
  476. data/lib/sequel/adapters/do/sqlite3.rb +0 -42
  477. data/lib/sequel/adapters/do.rb +0 -158
  478. data/lib/sequel/adapters/jdbc/as400.rb +0 -84
  479. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -64
  480. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -36
  481. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -33
  482. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -33
  483. data/lib/sequel/adapters/odbc/progress.rb +0 -10
  484. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  485. data/lib/sequel/adapters/shared/firebird.rb +0 -247
  486. data/lib/sequel/adapters/shared/informix.rb +0 -54
  487. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -152
  488. data/lib/sequel/adapters/shared/progress.rb +0 -40
  489. data/lib/sequel/adapters/swift/mysql.rb +0 -49
  490. data/lib/sequel/adapters/swift/postgres.rb +0 -47
  491. data/lib/sequel/adapters/swift/sqlite.rb +0 -49
  492. data/lib/sequel/adapters/swift.rb +0 -160
  493. data/lib/sequel/adapters/utils/pg_types.rb +0 -70
  494. data/lib/sequel/dataset/mutation.rb +0 -111
  495. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -5
  496. data/lib/sequel/extensions/filter_having.rb +0 -63
  497. data/lib/sequel/extensions/hash_aliases.rb +0 -49
  498. data/lib/sequel/extensions/meta_def.rb +0 -35
  499. data/lib/sequel/extensions/query_literals.rb +0 -84
  500. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -24
  501. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -122
  502. data/lib/sequel/extensions/set_overrides.rb +0 -76
  503. data/lib/sequel/no_core_ext.rb +0 -3
  504. data/lib/sequel/plugins/association_autoreloading.rb +0 -9
  505. data/lib/sequel/plugins/identifier_columns.rb +0 -47
  506. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -9
  507. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -81
  508. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -119
  509. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -61
  510. data/lib/sequel/plugins/schema.rb +0 -82
  511. data/lib/sequel/plugins/scissors.rb +0 -35
  512. data/spec/adapter_spec.rb +0 -4
  513. data/spec/adapters/db2_spec.rb +0 -160
  514. data/spec/adapters/firebird_spec.rb +0 -411
  515. data/spec/adapters/informix_spec.rb +0 -100
  516. data/spec/adapters/mssql_spec.rb +0 -733
  517. data/spec/adapters/mysql_spec.rb +0 -1319
  518. data/spec/adapters/oracle_spec.rb +0 -313
  519. data/spec/adapters/postgres_spec.rb +0 -3790
  520. data/spec/adapters/spec_helper.rb +0 -49
  521. data/spec/adapters/sqlanywhere_spec.rb +0 -170
  522. data/spec/adapters/sqlite_spec.rb +0 -688
  523. data/spec/bin_spec.rb +0 -258
  524. data/spec/core/connection_pool_spec.rb +0 -1045
  525. data/spec/core/database_spec.rb +0 -2636
  526. data/spec/core/dataset_spec.rb +0 -5175
  527. data/spec/core/deprecated_spec.rb +0 -70
  528. data/spec/core/expression_filters_spec.rb +0 -1247
  529. data/spec/core/mock_adapter_spec.rb +0 -464
  530. data/spec/core/object_graph_spec.rb +0 -303
  531. data/spec/core/placeholder_literalizer_spec.rb +0 -163
  532. data/spec/core/schema_generator_spec.rb +0 -203
  533. data/spec/core/schema_spec.rb +0 -1676
  534. data/spec/core/spec_helper.rb +0 -34
  535. data/spec/core/version_spec.rb +0 -7
  536. data/spec/core_extensions_spec.rb +0 -699
  537. data/spec/core_model_spec.rb +0 -2
  538. data/spec/core_spec.rb +0 -1
  539. data/spec/extensions/accessed_columns_spec.rb +0 -51
  540. data/spec/extensions/active_model_spec.rb +0 -85
  541. data/spec/extensions/after_initialize_spec.rb +0 -24
  542. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  543. data/spec/extensions/association_dependencies_spec.rb +0 -117
  544. data/spec/extensions/association_pks_spec.rb +0 -405
  545. data/spec/extensions/association_proxies_spec.rb +0 -86
  546. data/spec/extensions/auto_validations_spec.rb +0 -192
  547. data/spec/extensions/before_after_save_spec.rb +0 -40
  548. data/spec/extensions/blacklist_security_spec.rb +0 -88
  549. data/spec/extensions/blank_spec.rb +0 -69
  550. data/spec/extensions/boolean_readers_spec.rb +0 -93
  551. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  552. data/spec/extensions/caching_spec.rb +0 -270
  553. data/spec/extensions/class_table_inheritance_spec.rb +0 -444
  554. data/spec/extensions/column_conflicts_spec.rb +0 -60
  555. data/spec/extensions/column_select_spec.rb +0 -108
  556. data/spec/extensions/columns_introspection_spec.rb +0 -91
  557. data/spec/extensions/composition_spec.rb +0 -242
  558. data/spec/extensions/connection_expiration_spec.rb +0 -121
  559. data/spec/extensions/connection_validator_spec.rb +0 -127
  560. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -288
  561. data/spec/extensions/constraint_validations_spec.rb +0 -389
  562. data/spec/extensions/core_refinements_spec.rb +0 -519
  563. data/spec/extensions/csv_serializer_spec.rb +0 -180
  564. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  565. data/spec/extensions/dataset_associations_spec.rb +0 -343
  566. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  567. data/spec/extensions/date_arithmetic_spec.rb +0 -167
  568. data/spec/extensions/defaults_setter_spec.rb +0 -102
  569. data/spec/extensions/delay_add_association_spec.rb +0 -74
  570. data/spec/extensions/dirty_spec.rb +0 -180
  571. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -110
  572. data/spec/extensions/eager_each_spec.rb +0 -66
  573. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  574. data/spec/extensions/error_splitter_spec.rb +0 -18
  575. data/spec/extensions/error_sql_spec.rb +0 -20
  576. data/spec/extensions/eval_inspect_spec.rb +0 -73
  577. data/spec/extensions/filter_having_spec.rb +0 -40
  578. data/spec/extensions/force_encoding_spec.rb +0 -114
  579. data/spec/extensions/from_block_spec.rb +0 -21
  580. data/spec/extensions/graph_each_spec.rb +0 -119
  581. data/spec/extensions/hash_aliases_spec.rb +0 -24
  582. data/spec/extensions/hook_class_methods_spec.rb +0 -429
  583. data/spec/extensions/identifier_columns_spec.rb +0 -17
  584. data/spec/extensions/inflector_spec.rb +0 -183
  585. data/spec/extensions/input_transformer_spec.rb +0 -54
  586. data/spec/extensions/insert_returning_select_spec.rb +0 -46
  587. data/spec/extensions/instance_filters_spec.rb +0 -79
  588. data/spec/extensions/instance_hooks_spec.rb +0 -276
  589. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  590. data/spec/extensions/json_serializer_spec.rb +0 -304
  591. data/spec/extensions/lazy_attributes_spec.rb +0 -170
  592. data/spec/extensions/list_spec.rb +0 -278
  593. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  594. data/spec/extensions/many_through_many_spec.rb +0 -2172
  595. data/spec/extensions/meta_def_spec.rb +0 -21
  596. data/spec/extensions/migration_spec.rb +0 -728
  597. data/spec/extensions/modification_detection_spec.rb +0 -80
  598. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
  599. data/spec/extensions/named_timezones_spec.rb +0 -108
  600. data/spec/extensions/nested_attributes_spec.rb +0 -697
  601. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -65
  602. data/spec/extensions/null_dataset_spec.rb +0 -85
  603. data/spec/extensions/optimistic_locking_spec.rb +0 -128
  604. data/spec/extensions/pagination_spec.rb +0 -118
  605. data/spec/extensions/pg_array_associations_spec.rb +0 -736
  606. data/spec/extensions/pg_array_ops_spec.rb +0 -143
  607. data/spec/extensions/pg_array_spec.rb +0 -390
  608. data/spec/extensions/pg_enum_spec.rb +0 -92
  609. data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
  610. data/spec/extensions/pg_hstore_spec.rb +0 -206
  611. data/spec/extensions/pg_inet_ops_spec.rb +0 -101
  612. data/spec/extensions/pg_inet_spec.rb +0 -52
  613. data/spec/extensions/pg_interval_spec.rb +0 -76
  614. data/spec/extensions/pg_json_ops_spec.rb +0 -275
  615. data/spec/extensions/pg_json_spec.rb +0 -218
  616. data/spec/extensions/pg_loose_count_spec.rb +0 -17
  617. data/spec/extensions/pg_range_ops_spec.rb +0 -58
  618. data/spec/extensions/pg_range_spec.rb +0 -473
  619. data/spec/extensions/pg_row_ops_spec.rb +0 -60
  620. data/spec/extensions/pg_row_plugin_spec.rb +0 -62
  621. data/spec/extensions/pg_row_spec.rb +0 -360
  622. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
  623. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
  624. data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
  625. data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
  626. data/spec/extensions/prepared_statements_spec.rb +0 -103
  627. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
  628. data/spec/extensions/pretty_table_spec.rb +0 -92
  629. data/spec/extensions/query_literals_spec.rb +0 -183
  630. data/spec/extensions/query_spec.rb +0 -102
  631. data/spec/extensions/rcte_tree_spec.rb +0 -392
  632. data/spec/extensions/round_timestamps_spec.rb +0 -43
  633. data/spec/extensions/schema_caching_spec.rb +0 -41
  634. data/spec/extensions/schema_dumper_spec.rb +0 -814
  635. data/spec/extensions/schema_spec.rb +0 -117
  636. data/spec/extensions/scissors_spec.rb +0 -26
  637. data/spec/extensions/select_remove_spec.rb +0 -38
  638. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
  639. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  640. data/spec/extensions/serialization_spec.rb +0 -362
  641. data/spec/extensions/server_block_spec.rb +0 -90
  642. data/spec/extensions/server_logging_spec.rb +0 -45
  643. data/spec/extensions/set_overrides_spec.rb +0 -61
  644. data/spec/extensions/sharding_spec.rb +0 -198
  645. data/spec/extensions/shared_caching_spec.rb +0 -175
  646. data/spec/extensions/single_table_inheritance_spec.rb +0 -297
  647. data/spec/extensions/singular_table_names_spec.rb +0 -22
  648. data/spec/extensions/skip_create_refresh_spec.rb +0 -17
  649. data/spec/extensions/spec_helper.rb +0 -71
  650. data/spec/extensions/split_array_nil_spec.rb +0 -24
  651. data/spec/extensions/split_values_spec.rb +0 -22
  652. data/spec/extensions/sql_comments_spec.rb +0 -27
  653. data/spec/extensions/sql_expr_spec.rb +0 -60
  654. data/spec/extensions/static_cache_spec.rb +0 -361
  655. data/spec/extensions/string_agg_spec.rb +0 -85
  656. data/spec/extensions/string_date_time_spec.rb +0 -95
  657. data/spec/extensions/string_stripper_spec.rb +0 -68
  658. data/spec/extensions/subclasses_spec.rb +0 -66
  659. data/spec/extensions/subset_conditions_spec.rb +0 -38
  660. data/spec/extensions/table_select_spec.rb +0 -71
  661. data/spec/extensions/tactical_eager_loading_spec.rb +0 -136
  662. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  663. data/spec/extensions/timestamps_spec.rb +0 -175
  664. data/spec/extensions/to_dot_spec.rb +0 -154
  665. data/spec/extensions/touch_spec.rb +0 -203
  666. data/spec/extensions/tree_spec.rb +0 -274
  667. data/spec/extensions/typecast_on_load_spec.rb +0 -80
  668. data/spec/extensions/unlimited_update_spec.rb +0 -20
  669. data/spec/extensions/update_or_create_spec.rb +0 -87
  670. data/spec/extensions/update_primary_key_spec.rb +0 -100
  671. data/spec/extensions/update_refresh_spec.rb +0 -53
  672. data/spec/extensions/uuid_spec.rb +0 -106
  673. data/spec/extensions/validate_associated_spec.rb +0 -52
  674. data/spec/extensions/validation_class_methods_spec.rb +0 -1027
  675. data/spec/extensions/validation_helpers_spec.rb +0 -554
  676. data/spec/extensions/xml_serializer_spec.rb +0 -207
  677. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  678. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  679. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  680. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  681. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  682. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  683. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  684. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  685. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  686. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  687. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  688. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  689. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  690. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  691. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  692. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  693. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  694. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  695. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  696. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  697. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  698. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  699. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  700. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  701. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  702. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  703. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  704. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  705. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  706. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  707. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  708. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  709. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  710. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  711. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  712. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  713. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  714. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  715. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  716. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  717. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  718. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  719. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  720. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  721. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  722. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  723. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  724. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  725. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  726. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  727. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  728. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  729. data/spec/guards_helper.rb +0 -55
  730. data/spec/integration/associations_test.rb +0 -2506
  731. data/spec/integration/database_test.rb +0 -113
  732. data/spec/integration/dataset_test.rb +0 -1858
  733. data/spec/integration/eager_loader_test.rb +0 -687
  734. data/spec/integration/migrator_test.rb +0 -262
  735. data/spec/integration/model_test.rb +0 -230
  736. data/spec/integration/plugin_test.rb +0 -2297
  737. data/spec/integration/prepared_statement_test.rb +0 -467
  738. data/spec/integration/schema_test.rb +0 -815
  739. data/spec/integration/spec_helper.rb +0 -56
  740. data/spec/integration/timezone_test.rb +0 -86
  741. data/spec/integration/transaction_test.rb +0 -406
  742. data/spec/integration/type_test.rb +0 -133
  743. data/spec/model/association_reflection_spec.rb +0 -565
  744. data/spec/model/associations_spec.rb +0 -4589
  745. data/spec/model/base_spec.rb +0 -759
  746. data/spec/model/class_dataset_methods_spec.rb +0 -150
  747. data/spec/model/dataset_methods_spec.rb +0 -149
  748. data/spec/model/eager_loading_spec.rb +0 -2197
  749. data/spec/model/hooks_spec.rb +0 -604
  750. data/spec/model/inflector_spec.rb +0 -26
  751. data/spec/model/model_spec.rb +0 -1097
  752. data/spec/model/plugins_spec.rb +0 -299
  753. data/spec/model/record_spec.rb +0 -2162
  754. data/spec/model/spec_helper.rb +0 -46
  755. data/spec/model/validations_spec.rb +0 -193
  756. data/spec/model_no_assoc_spec.rb +0 -1
  757. data/spec/model_spec.rb +0 -1
  758. data/spec/plugin_spec.rb +0 -1
  759. data/spec/sequel_coverage.rb +0 -15
  760. data/spec/spec_config.rb +0 -10
@@ -1,1247 +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 order method on functions to specify orders for aggregate functions" do
561
- @d.l{rank(:c).order(:a, :b)}.must_equal 'rank("c" ORDER BY "a", "b")'
562
- end
563
-
564
- it "should support over method on functions to create window functions" do
565
- @d.l{rank{}.over}.must_equal 'rank() OVER ()'
566
- @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)'
567
- end
568
-
569
- it "should support over method with a Window argument" do
570
- @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)'
571
- end
572
-
573
- it "should raise error if over is called on a function that already has a window " do
574
- proc{@d.l{rank{}.over.over}}.must_raise(Sequel::Error)
575
- end
576
-
577
- it "should raise an error if window functions are not supported" do
578
- class << @d; remove_method :supports_window_functions? end
579
- meta_def(@d, :supports_window_functions?){false}
580
- proc{@d.l{count(:over, :* =>true, :partition=>a, :order=>b, :window=>:win, :frame=>:rows){}}}.must_raise(Sequel::Error)
581
- proc{Sequel.mock.dataset.filter{count(:over, :* =>true, :partition=>a, :order=>b, :window=>:win, :frame=>:rows){}}.sql}.must_raise(Sequel::Error)
582
- end
583
-
584
- it "should handle lateral function calls" do
585
- @d.l{rank{}.lateral}.must_equal 'LATERAL rank()'
586
- end
587
-
588
- it "should handle ordered-set and hypothetical-set function calls" do
589
- @d.l{mode{}.within_group(:a)}.must_equal 'mode() WITHIN GROUP (ORDER BY "a")'
590
- @d.l{mode{}.within_group(:a, :b)}.must_equal 'mode() WITHIN GROUP (ORDER BY "a", "b")'
591
- end
592
-
593
- it "should handle filtered aggregate function calls" do
594
- @d.l{count{}.*.filter(:a, :b)}.must_equal 'count(*) FILTER (WHERE ("a" AND "b"))'
595
- @d.l{count{}.*.filter(:a=>1)}.must_equal 'count(*) FILTER (WHERE ("a" = 1))'
596
- @d.l{count{}.*.filter{b > 1}}.must_equal 'count(*) FILTER (WHERE ("b" > 1))'
597
- @d.l{count{}.*.filter(:a=>1){b > 1}}.must_equal 'count(*) FILTER (WHERE (("a" = 1) AND ("b" > 1)))'
598
- end
599
-
600
- it "should handle fitlered ordered-set and hypothetical-set function calls" do
601
- @d.l{mode{}.within_group(:a).filter(:a=>1)}.must_equal 'mode() WITHIN GROUP (ORDER BY "a") FILTER (WHERE ("a" = 1))'
602
- end
603
-
604
- it "should handle function calls with ordinality" do
605
- @d.l{foo{}.with_ordinality}.must_equal 'foo() WITH ORDINALITY'
606
- end
607
-
608
- it "should support function method on identifiers to create functions" do
609
- @d.l{rank.function}.must_equal 'rank()'
610
- @d.l{sum.function(c)}.must_equal 'sum("c")'
611
- @d.l{sum.function(c, 1)}.must_equal 'sum("c", 1)'
612
- end
613
-
614
- it "should support function method on qualified identifiers to create functions" do
615
- @d.l{sch__rank.function}.must_equal 'sch.rank()'
616
- @d.l{sch__sum.function(c)}.must_equal 'sch.sum("c")'
617
- @d.l{sch__sum.function(c, 1)}.must_equal 'sch.sum("c", 1)'
618
- @d.l{Sequel.qualify(sch__sum, :x__y).function(c, 1)}.must_equal 'sch.sum.x.y("c", 1)'
619
- end
620
-
621
- it "should handle quoted function names" do
622
- def @d.supports_quoted_function_names?; true; end
623
- @d.l{rank.function}.must_equal '"rank"()'
624
- @d.l{sch__rank.function}.must_equal '"sch"."rank"()'
625
- end
626
-
627
- it "should quote function names if a quoted function is used and database supports quoted function names" do
628
- def @d.supports_quoted_function_names?; true; end
629
- @d.l{rank{}.quoted}.must_equal '"rank"()'
630
- @d.l{sch__rank{}.quoted}.must_equal '"sch__rank"()'
631
- end
632
-
633
- it "should not quote function names if an unquoted function is used" do
634
- def @d.supports_quoted_function_names?; true; end
635
- @d.l{rank.function.unquoted}.must_equal 'rank()'
636
- @d.l{sch__rank.function.unquoted}.must_equal 'sch.rank()'
637
- end
638
-
639
- it "should deal with classes without requiring :: prefix" do
640
- @d.l{date < Date.today}.must_equal "(\"date\" < '#{Date.today}')"
641
- @d.l{date < Sequel::CURRENT_DATE}.must_equal "(\"date\" < CURRENT_DATE)"
642
- @d.l{num < Math::PI.to_i}.must_equal "(\"num\" < 3)"
643
- end
644
-
645
- it "should deal with methods added to Object after requiring Sequel" do
646
- class Object
647
- def adsoiwemlsdaf; 42; end
648
- end
649
- Sequel::BasicObject.remove_methods!
650
- @d.l{a > adsoiwemlsdaf}.must_equal '("a" > "adsoiwemlsdaf")'
651
- end
652
-
653
- it "should deal with private methods added to Kernel after requiring Sequel" do
654
- module Kernel
655
- private
656
- def adsoiwemlsdaf2; 42; end
657
- end
658
- Sequel::BasicObject.remove_methods!
659
- @d.l{a > adsoiwemlsdaf2}.must_equal '("a" > "adsoiwemlsdaf2")'
660
- end
661
-
662
- it "should have operator methods defined that produce Sequel expression objects" do
663
- @d.l{|o| o.&({:a=>1}, :b)}.must_equal '(("a" = 1) AND "b")'
664
- @d.l{|o| o.|({:a=>1}, :b)}.must_equal '(("a" = 1) OR "b")'
665
- @d.l{|o| o.+(1, :b) > 2}.must_equal '((1 + "b") > 2)'
666
- @d.l{|o| o.-(1, :b) < 2}.must_equal '((1 - "b") < 2)'
667
- @d.l{|o| o.*(1, :b) >= 2}.must_equal '((1 * "b") >= 2)'
668
- @d.l{|o| o./(1, :b) <= 2}.must_equal '((1 / "b") <= 2)'
669
- @d.l{|o| o.~(:a=>1)}.must_equal '("a" != 1)'
670
- @d.l{|o| o.~([[:a, 1], [:b, 2]])}.must_equal '(("a" != 1) OR ("b" != 2))'
671
- @d.l{|o| o.<(1, :b)}.must_equal '(1 < "b")'
672
- @d.l{|o| o.>(1, :b)}.must_equal '(1 > "b")'
673
- @d.l{|o| o.<=(1, :b)}.must_equal '(1 <= "b")'
674
- @d.l{|o| o.>=(1, :b)}.must_equal '(1 >= "b")'
675
- end
676
-
677
- it "should have have ` produce literal strings" do
678
- @d.l{a > `some SQL`}.must_equal '("a" > some SQL)'
679
- @d.l{|o| o.a > o.`('some SQL')}.must_equal '("a" > some SQL)' #`
680
- end
681
- end
682
-
683
- describe "Sequel core extension replacements" do
684
- before do
685
- @db = Sequel::Database.new
686
- @ds = @db.dataset
687
- def @ds.supports_regexp?; true end
688
- @o = Object.new
689
- def @o.sql_literal(ds) 'foo' end
690
- end
691
-
692
- def l(arg, should)
693
- @ds.literal(arg).must_equal should
694
- end
695
-
696
- it "Sequel.expr should return items wrapped in Sequel objects" do
697
- Sequel.expr(1).must_be_kind_of(Sequel::SQL::NumericExpression)
698
- Sequel.expr('a').must_be_kind_of(Sequel::SQL::StringExpression)
699
- Sequel.expr(true).must_be_kind_of(Sequel::SQL::BooleanExpression)
700
- Sequel.expr(nil).must_be_kind_of(Sequel::SQL::Wrapper)
701
- Sequel.expr({1=>2}).must_be_kind_of(Sequel::SQL::BooleanExpression)
702
- Sequel.expr([[1, 2]]).must_be_kind_of(Sequel::SQL::BooleanExpression)
703
- Sequel.expr([1]).must_be_kind_of(Sequel::SQL::Wrapper)
704
- Sequel.expr{|o| o.a}.must_be_kind_of(Sequel::SQL::Identifier)
705
- Sequel.expr{a}.must_be_kind_of(Sequel::SQL::Identifier)
706
- Sequel.expr(:a).must_be_kind_of(Sequel::SQL::Identifier)
707
- Sequel.expr(:a__b).must_be_kind_of(Sequel::SQL::QualifiedIdentifier)
708
- Sequel.expr(:a___c).must_be_kind_of(Sequel::SQL::AliasedExpression)
709
- Sequel.expr(:a___c).expression.must_be_kind_of(Sequel::SQL::Identifier)
710
- Sequel.expr(:a__b___c).must_be_kind_of(Sequel::SQL::AliasedExpression)
711
- Sequel.expr(:a__b___c).expression.must_be_kind_of(Sequel::SQL::QualifiedIdentifier)
712
- end
713
-
714
- it "Sequel.expr should return an appropriate wrapped object" do
715
- l(Sequel.expr(1) + 1, "(1 + 1)")
716
- l(Sequel.expr('a') + 'b', "('a' || 'b')")
717
- l(Sequel.expr(:b) & nil, "(b AND NULL)")
718
- l(Sequel.expr(nil) & true, "(NULL AND 't')")
719
- l(Sequel.expr(false) & true, "('f' AND 't')")
720
- l(Sequel.expr(true) | false, "('t' OR 'f')")
721
- l(Sequel.expr(@o) + 1, "(foo + 1)")
722
- end
723
-
724
- it "Sequel.expr should handle condition specifiers" do
725
- l(Sequel.expr(:a=>1) & nil, "((a = 1) AND NULL)")
726
- l(Sequel.expr([[:a, 1]]) & nil, "((a = 1) AND NULL)")
727
- l(Sequel.expr([[:a, 1], [:b, 2]]) & nil, "((a = 1) AND (b = 2) AND NULL)")
728
- end
729
-
730
- it "Sequel.expr should handle arrays that are not condition specifiers" do
731
- l(Sequel.expr([1]), "(1)")
732
- l(Sequel.expr([1, 2]), "(1, 2)")
733
- end
734
-
735
- it "Sequel.expr should treat blocks/procs as virtual rows and wrap the output" do
736
- l(Sequel.expr{1} + 1, "(1 + 1)")
737
- l(Sequel.expr{o__a} + 1, "(o.a + 1)")
738
- l(Sequel.expr{[[:a, 1]]} & nil, "((a = 1) AND NULL)")
739
- l(Sequel.expr{|v| @o} + 1, "(foo + 1)")
740
-
741
- l(Sequel.expr(proc{1}) + 1, "(1 + 1)")
742
- l(Sequel.expr(proc{o__a}) + 1, "(o.a + 1)")
743
- l(Sequel.expr(proc{[[:a, 1]]}) & nil, "((a = 1) AND NULL)")
744
- l(Sequel.expr(proc{|v| @o}) + 1, "(foo + 1)")
745
- end
746
-
747
- it "Sequel.expr should handle lambda proc virtual rows" do
748
- l(Sequel.expr(&lambda{1}), "1")
749
- l(Sequel.expr(&lambda{|| 1}), "1")
750
- end
751
-
752
- it "Sequel.expr should raise an error if given an argument and a block" do
753
- proc{Sequel.expr(nil){}}.must_raise(Sequel::Error)
754
- end
755
-
756
- it "Sequel.expr should raise an error if given neither an argument nor a block" do
757
- proc{Sequel.expr}.must_raise(Sequel::Error)
758
- end
759
-
760
- it "Sequel.expr should return existing Sequel expressions directly" do
761
- o = Sequel.expr(1)
762
- Sequel.expr(o).must_be_same_as(o)
763
- o = Sequel.lit('1')
764
- Sequel.expr(o).must_be_same_as(o)
765
- end
766
-
767
- it "Sequel.~ should invert the given object" do
768
- l(Sequel.~(nil), 'NOT NULL')
769
- l(Sequel.~(:a=>1), "(a != 1)")
770
- l(Sequel.~([[:a, 1]]), "(a != 1)")
771
- l(Sequel.~([[:a, 1], [:b, 2]]), "((a != 1) OR (b != 2))")
772
- l(Sequel.~(Sequel.expr([[:a, 1], [:b, 2]]) & nil), "((a != 1) OR (b != 2) OR NOT NULL)")
773
- end
774
-
775
- it "Sequel.case should use a CASE expression" do
776
- l(Sequel.case({:a=>1}, 2), "(CASE WHEN a THEN 1 ELSE 2 END)")
777
- l(Sequel.case({:a=>1}, 2, :b), "(CASE b WHEN a THEN 1 ELSE 2 END)")
778
- l(Sequel.case([[:a, 1]], 2), "(CASE WHEN a THEN 1 ELSE 2 END)")
779
- l(Sequel.case([[:a, 1]], 2, :b), "(CASE b WHEN a THEN 1 ELSE 2 END)")
780
- l(Sequel.case([[:a, 1], [:c, 3]], 2), "(CASE WHEN a THEN 1 WHEN c THEN 3 ELSE 2 END)")
781
- l(Sequel.case([[:a, 1], [:c, 3]], 2, :b), "(CASE b WHEN a THEN 1 WHEN c THEN 3 ELSE 2 END)")
782
- end
783
-
784
- it "Sequel.case should raise an error if not given a condition specifier" do
785
- proc{Sequel.case(1, 2)}.must_raise(Sequel::Error)
786
- end
787
-
788
- it "Sequel.value_list should use an SQL value list" do
789
- l(Sequel.value_list([[1, 2]]), "((1, 2))")
790
- end
791
-
792
- it "Sequel.value_list raise an error if not given an array" do
793
- proc{Sequel.value_list(1)}.must_raise(Sequel::Error)
794
- end
795
-
796
- it "Sequel.negate should negate all entries in conditions specifier and join with AND" do
797
- l(Sequel.negate(:a=>1), "(a != 1)")
798
- l(Sequel.negate([[:a, 1]]), "(a != 1)")
799
- l(Sequel.negate([[:a, 1], [:b, 2]]), "((a != 1) AND (b != 2))")
800
- end
801
-
802
- it "Sequel.negate should raise an error if not given a conditions specifier" do
803
- proc{Sequel.negate(1)}.must_raise(Sequel::Error)
804
- end
805
-
806
- it "Sequel.or should join all entries in conditions specifier with OR" do
807
- l(Sequel.or(:a=>1), "(a = 1)")
808
- l(Sequel.or([[:a, 1]]), "(a = 1)")
809
- l(Sequel.or([[:a, 1], [:b, 2]]), "((a = 1) OR (b = 2))")
810
- end
811
-
812
- it "Sequel.or should raise an error if not given a conditions specifier" do
813
- proc{Sequel.or(1)}.must_raise(Sequel::Error)
814
- end
815
-
816
- it "Sequel.join should should use SQL string concatenation to join array" do
817
- l(Sequel.join([]), "''")
818
- l(Sequel.join(['a']), "('a')")
819
- l(Sequel.join(['a', 'b']), "('a' || 'b')")
820
- l(Sequel.join(['a', 'b'], 'c'), "('a' || 'c' || 'b')")
821
- l(Sequel.join([true, :b], :c), "('t' || c || b)")
822
- l(Sequel.join([false, nil], Sequel.lit('c')), "('f' || c || NULL)")
823
- l(Sequel.join([Sequel.expr('a'), Sequel.lit('d')], 'c'), "('a' || 'c' || d)")
824
- end
825
-
826
- it "Sequel.join should raise an error if not given an array" do
827
- proc{Sequel.join(1)}.must_raise(Sequel::Error)
828
- end
829
-
830
- it "Sequel.& should join all arguments given with AND" do
831
- l(Sequel.&(:a), "a")
832
- l(Sequel.&(:a, :b=>:c), "(a AND (b = c))")
833
- l(Sequel.&(:a, {:b=>:c}, Sequel.lit('d')), "(a AND (b = c) AND d)")
834
- end
835
-
836
- it "Sequel.& should raise an error if given no arguments" do
837
- proc{Sequel.&}.must_raise(Sequel::Error)
838
- end
839
-
840
- it "Sequel.| should join all arguments given with OR" do
841
- l(Sequel.|(:a), "a")
842
- l(Sequel.|(:a, :b=>:c), "(a OR (b = c))")
843
- l(Sequel.|(:a, {:b=>:c}, Sequel.lit('d')), "(a OR (b = c) OR d)")
844
- end
845
-
846
- it "Sequel.| should raise an error if given no arguments" do
847
- proc{Sequel.|}.must_raise(Sequel::Error)
848
- end
849
-
850
- it "Sequel.as should return an aliased expression" do
851
- l(Sequel.as(:a, :b), "a AS b")
852
- end
853
-
854
- it "Sequel.cast should return a CAST expression" do
855
- l(Sequel.cast(:a, :int), "CAST(a AS int)")
856
- l(Sequel.cast(:a, Integer), "CAST(a AS integer)")
857
- end
858
-
859
- it "Sequel.cast_numeric should return a CAST expression treated as a number" do
860
- l(Sequel.cast_numeric(:a), "CAST(a AS integer)")
861
- l(Sequel.cast_numeric(:a, :int), "CAST(a AS int)")
862
- l(Sequel.cast_numeric(:a) << 2, "(CAST(a AS integer) << 2)")
863
- end
864
-
865
- it "Sequel.cast_string should return a CAST expression treated as a string" do
866
- l(Sequel.cast_string(:a), "CAST(a AS varchar(255))")
867
- l(Sequel.cast_string(:a, :text), "CAST(a AS text)")
868
- l(Sequel.cast_string(:a) + 'a', "(CAST(a AS varchar(255)) || 'a')")
869
- end
870
-
871
- it "Sequel.lit should return a literal string" do
872
- l(Sequel.lit('a'), "a")
873
- end
874
-
875
- it "Sequel.lit should return the argument if given a single literal string" do
876
- o = Sequel.lit('a')
877
- Sequel.lit(o).must_be_same_as(o)
878
- end
879
-
880
- it "Sequel.lit should accept multiple arguments for a placeholder literal string" do
881
- l(Sequel.lit('a = ?', 1), "a = 1")
882
- l(Sequel.lit('? = ?', :a, 1), "a = 1")
883
- l(Sequel.lit('a = :a', :a=>1), "a = 1")
884
- end
885
-
886
- it "Sequel.lit should work with an array for the placeholder string" do
887
- l(Sequel.lit(['a = '], 1), "a = 1")
888
- l(Sequel.lit(['', ' = '], :a, 1), "a = 1")
889
- end
890
-
891
- it "Sequel.blob should return an SQL::Blob" do
892
- l(Sequel.blob('a'), "'a'")
893
- Sequel.blob('a').must_be_kind_of(Sequel::SQL::Blob)
894
- end
895
-
896
- it "Sequel.blob should return the given argument if given a blob" do
897
- o = Sequel.blob('a')
898
- Sequel.blob(o).must_be_same_as(o)
899
- end
900
-
901
- it "Sequel.deep_qualify should do a deep qualification into nested structors" do
902
- l(Sequel.deep_qualify(:t, Sequel.+(:c, 1)), "(t.c + 1)")
903
- end
904
-
905
- it "Sequel.qualify should return a qualified identifier" do
906
- l(Sequel.qualify(:t, :c), "t.c")
907
- end
908
-
909
- it "Sequel.identifier should return an identifier" do
910
- l(Sequel.identifier(:t__c), "t__c")
911
- end
912
-
913
- it "Sequel.asc should return an ASC ordered expression" do
914
- l(Sequel.asc(:a), "a ASC")
915
- l(Sequel.asc(:a, :nulls=>:first), "a ASC NULLS FIRST")
916
- end
917
-
918
- it "Sequel.desc should return a DESC ordered expression " do
919
- l(Sequel.desc(:a), "a DESC")
920
- l(Sequel.desc(:a, :nulls=>:last), "a DESC NULLS LAST")
921
- end
922
-
923
- it "Sequel.{+,-,*,/} should accept arguments and use the appropriate operator" do
924
- %w'+ - * /'.each do |op|
925
- l(Sequel.send(op, 1), '1')
926
- l(Sequel.send(op, 1, 2), "(1 #{op} 2)")
927
- l(Sequel.send(op, 1, 2, 3), "(1 #{op} 2 #{op} 3)")
928
- end
929
- end
930
-
931
- it "Sequel.{+,-,*,/} should raise if given no arguments" do
932
- %w'+ - * /'.each do |op|
933
- proc{Sequel.send(op)}.must_raise(Sequel::Error)
934
- end
935
- end
936
-
937
- it "Sequel.like should use a LIKE expression" do
938
- l(Sequel.like('a', 'b'), "('a' LIKE 'b' ESCAPE '\\')")
939
- l(Sequel.like(:a, :b), "(a LIKE b ESCAPE '\\')")
940
- l(Sequel.like(:a, /b/), "(a ~ 'b')")
941
- l(Sequel.like(:a, 'c', /b/), "((a LIKE 'c' ESCAPE '\\') OR (a ~ 'b'))")
942
- end
943
-
944
- it "Sequel.ilike should use an ILIKE expression" do
945
- l(Sequel.ilike('a', 'b'), "(UPPER('a') LIKE UPPER('b') ESCAPE '\\')")
946
- l(Sequel.ilike(:a, :b), "(UPPER(a) LIKE UPPER(b) ESCAPE '\\')")
947
- l(Sequel.ilike(:a, /b/), "(a ~* 'b')")
948
- l(Sequel.ilike(:a, 'c', /b/), "((UPPER(a) LIKE UPPER('c') ESCAPE '\\') OR (a ~* 'b'))")
949
- end
950
-
951
- it "Sequel.subscript should use an SQL subscript" do
952
- l(Sequel.subscript(:a, 1), 'a[1]')
953
- l(Sequel.subscript(:a, 1, 2), 'a[1, 2]')
954
- l(Sequel.subscript(:a, [1, 2]), 'a[1, 2]')
955
- l(Sequel.subscript(:a, 1..2), 'a[1:2]')
956
- l(Sequel.subscript(:a, 1...3), 'a[1:2]')
957
- end
958
-
959
- it "Sequel.function should return an SQL function" do
960
- l(Sequel.function(:a), 'a()')
961
- l(Sequel.function(:a, 1), 'a(1)')
962
- l(Sequel.function(:a, :b, 2), 'a(b, 2)')
963
- end
964
-
965
- it "Sequel.extract should use a date/time extraction" do
966
- l(Sequel.extract(:year, :a), 'extract(year FROM a)')
967
- end
968
-
969
- it "#* with no arguments should use a ColumnAll for Identifier and QualifiedIdentifier" do
970
- l(Sequel.expr(:a).*, 'a.*')
971
- l(Sequel.expr(:a__b).*, 'a.b.*')
972
- end
973
-
974
- it "SQL::Blob should be aliasable and castable by default" do
975
- b = Sequel.blob('a')
976
- l(b.as(:a), "'a' AS a")
977
- l(b.cast(Integer), "CAST('a' AS integer)")
978
- end
979
-
980
- it "SQL::Blob should be convertable to a literal string by default" do
981
- b = Sequel.blob('a ?')
982
- l(b.lit, "a ?")
983
- l(b.lit(1), "a 1")
984
- end
985
- end
986
-
987
- describe "Sequel::SQL::Function#==" do
988
- it "should be true for functions with the same name and arguments, false otherwise" do
989
- a = Sequel.function(:date, :t)
990
- b = Sequel.function(:date, :t)
991
- a.must_equal b
992
- (a == b).must_equal true
993
- c = Sequel.function(:date, :c)
994
- a.wont_equal c
995
- (a == c).must_equal false
996
- d = Sequel.function(:time, :c)
997
- a.wont_equal d
998
- c.wont_equal d
999
- (a == d).must_equal false
1000
- (c == d).must_equal false
1001
- end
1002
- end
1003
-
1004
- describe "Sequel::SQL::OrderedExpression" do
1005
- it "should #desc" do
1006
- @oe = Sequel.asc(:column)
1007
- @oe.descending.must_equal false
1008
- @oe.desc.descending.must_equal true
1009
- end
1010
-
1011
- it "should #asc" do
1012
- @oe = Sequel.desc(:column)
1013
- @oe.descending.must_equal true
1014
- @oe.asc.descending.must_equal false
1015
- end
1016
-
1017
- it "should #invert" do
1018
- @oe = Sequel.desc(:column)
1019
- @oe.invert.descending.must_equal false
1020
- @oe.invert.invert.descending.must_equal true
1021
- end
1022
- end
1023
-
1024
- describe "Expression" do
1025
- it "should consider objects == only if they have the same attributes" do
1026
- Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc.must_equal Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc
1027
- Sequel.qualify(:table, :other_column).cast(:type).*(:numeric_column).asc.wont_equal Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc
1028
-
1029
- Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc.must_equal(Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc)
1030
- Sequel.qualify(:table, :other_column).cast(:type).*(:numeric_column).asc.wont_equal(Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc)
1031
- end
1032
-
1033
- it "should use the same hash value for objects that have the same attributes" do
1034
- Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc.hash.must_equal Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc.hash
1035
- Sequel.qualify(:table, :other_column).cast(:type).*(:numeric_column).asc.hash.wont_equal Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc.hash
1036
-
1037
- h = {}
1038
- a = Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc
1039
- b = Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc
1040
- h[a] = 1
1041
- h[b] = 2
1042
- h[a].must_equal 2
1043
- h[b].must_equal 2
1044
- end
1045
- end
1046
-
1047
- describe "Sequel::SQLTime" do
1048
- before do
1049
- @db = Sequel.mock
1050
- end
1051
-
1052
- it ".create should create from hour, minutes, seconds and optional microseconds" do
1053
- @db.literal(Sequel::SQLTime.create(1, 2, 3)).must_equal "'01:02:03.000000'"
1054
- @db.literal(Sequel::SQLTime.create(1, 2, 3, 500000)).must_equal "'01:02:03.500000'"
1055
- end
1056
-
1057
- it "#to_s should include hour, minute, and second by default" do
1058
- Sequel::SQLTime.create(1, 2, 3).to_s.must_equal "01:02:03"
1059
- Sequel::SQLTime.create(1, 2, 3, 500000).to_s.must_equal "01:02:03"
1060
- end
1061
-
1062
- it "#to_s should handle arguments with super" do
1063
- t = Sequel::SQLTime.create(1, 2, 3)
1064
- begin
1065
- Time.now.to_s('%F')
1066
- rescue
1067
- proc{t.to_s('%F')}.must_raise ArgumentError
1068
- else
1069
- t.to_s('%F')
1070
- end
1071
- end
1072
- end
1073
-
1074
- describe "Sequel::SQL::Wrapper" do
1075
- before do
1076
- @ds = Sequel.mock.dataset
1077
- end
1078
-
1079
- it "should wrap objects so they can be used by the Sequel DSL" do
1080
- o = Object.new
1081
- def o.sql_literal(ds) 'foo' end
1082
- s = Sequel::SQL::Wrapper.new(o)
1083
- @ds.literal(s).must_equal "foo"
1084
- @ds.literal(s+1).must_equal "(foo + 1)"
1085
- @ds.literal(s & true).must_equal "(foo AND 't')"
1086
- @ds.literal(s < 1).must_equal "(foo < 1)"
1087
- @ds.literal(s.sql_subscript(1)).must_equal "foo[1]"
1088
- @ds.literal(s.like('a')).must_equal "(foo LIKE 'a' ESCAPE '\\')"
1089
- @ds.literal(s.as(:a)).must_equal "foo AS a"
1090
- @ds.literal(s.cast(Integer)).must_equal "CAST(foo AS integer)"
1091
- @ds.literal(s.desc).must_equal "foo DESC"
1092
- @ds.literal(s.sql_string + '1').must_equal "(foo || '1')"
1093
- end
1094
- end
1095
-
1096
- describe "Sequel::SQL::Blob#to_sequel_blob" do
1097
- it "should return self" do
1098
- c = Sequel::SQL::Blob.new('a')
1099
- c.to_sequel_blob.must_be_same_as(c)
1100
- end
1101
- end
1102
-
1103
- describe Sequel::SQL::Subscript do
1104
- before do
1105
- @s = Sequel::SQL::Subscript.new(:a, [1])
1106
- @ds = Sequel.mock.dataset
1107
- end
1108
-
1109
- it "should have | return a new non-nested subscript" do
1110
- s = (@s | 2)
1111
- @ds.literal(s).must_equal 'a[1, 2]'
1112
- end
1113
-
1114
- it "should have [] return a new nested subscript" do
1115
- s = @s[2]
1116
- @ds.literal(s).must_equal 'a[1][2]'
1117
- end
1118
- end
1119
-
1120
- describe Sequel::SQL::CaseExpression, "#with_merged_expression" do
1121
- it "should return self if it has no expression" do
1122
- c = Sequel.case({1=>0}, 3)
1123
- c.with_merged_expression.must_be_same_as(c)
1124
- end
1125
-
1126
- it "should merge expression into conditions if it has an expression" do
1127
- db = Sequel::Database.new
1128
- c = Sequel.case({1=>0}, 3, 4)
1129
- db.literal(c.with_merged_expression).must_equal db.literal(Sequel.case({{4=>1}=>0}, 3))
1130
- end
1131
- end
1132
-
1133
- describe "Sequel.recursive_map" do
1134
- it "should recursively convert an array using a callable" do
1135
- Sequel.recursive_map(['1'], proc{|s| s.to_i}).must_equal [1]
1136
- Sequel.recursive_map([['1']], proc{|s| s.to_i}).must_equal [[1]]
1137
- end
1138
-
1139
- it "should not call callable if value is nil" do
1140
- Sequel.recursive_map([nil], proc{|s| s.to_i}).must_equal [nil]
1141
- Sequel.recursive_map([[nil]], proc{|s| s.to_i}).must_equal [[nil]]
1142
- end
1143
- end
1144
-
1145
- describe "Sequel.delay" do
1146
- before do
1147
- @o = Class.new do
1148
- def a
1149
- @a ||= 0
1150
- @a += 1
1151
- end
1152
- def _a
1153
- @a if defined?(@a)
1154
- end
1155
-
1156
- attr_accessor :b
1157
- end.new
1158
- end
1159
-
1160
- it "should delay calling the block until literalization" do
1161
- ds = Sequel.mock[:b].where(:a=>Sequel.delay{@o.a})
1162
- @o._a.must_equal nil
1163
- ds.sql.must_equal "SELECT * FROM b WHERE (a = 1)"
1164
- @o._a.must_equal 1
1165
- ds.sql.must_equal "SELECT * FROM b WHERE (a = 2)"
1166
- @o._a.must_equal 2
1167
- end
1168
-
1169
- it "should call the block with the current dataset if it accepts one argument" do
1170
- ds = Sequel.mock[:b].where(Sequel.delay{|x| x.first_source})
1171
- ds.sql.must_equal "SELECT * FROM b WHERE b"
1172
- ds.from(:c).sql.must_equal "SELECT * FROM c WHERE c"
1173
- end
1174
-
1175
- it "should have the condition specifier handling respect delayed evaluations" do
1176
- ds = Sequel.mock[:b].where(:a=>Sequel.delay{@o.b})
1177
- ds.sql.must_equal "SELECT * FROM b WHERE (a IS NULL)"
1178
- @o.b = 1
1179
- ds.sql.must_equal "SELECT * FROM b WHERE (a = 1)"
1180
- @o.b = [1, 2]
1181
- ds.sql.must_equal "SELECT * FROM b WHERE (a IN (1, 2))"
1182
- end
1183
-
1184
- it "should have the condition specifier handling call block with the current dataset if it accepts one argument" do
1185
- ds = Sequel.mock[:b].where(:a=>Sequel.delay{|x| x.first_source})
1186
- ds.sql.must_equal "SELECT * FROM b WHERE (a = b)"
1187
- ds.from(:c).sql.must_equal "SELECT * FROM c WHERE (a = c)"
1188
- end
1189
-
1190
- it "should raise if called without a block" do
1191
- proc{Sequel.delay}.must_raise(Sequel::Error)
1192
- end
1193
- end
1194
-
1195
- describe Sequel do
1196
- before do
1197
- Sequel::JSON = Class.new do
1198
- self::ParserError = Sequel
1199
- def self.parse(json, opts={})
1200
- [json, opts]
1201
- end
1202
- end
1203
- end
1204
- after do
1205
- Sequel.send(:remove_const, :JSON)
1206
- end
1207
-
1208
- it ".parse_json should parse json correctly" do
1209
- Sequel.parse_json('[]').must_equal ['[]', {:create_additions=>false}]
1210
- end
1211
-
1212
- it ".json_parser_error_class should return the related parser error class" do
1213
- Sequel.json_parser_error_class.must_equal Sequel
1214
- end
1215
-
1216
- it ".object_to_json should return a json version of the object" do
1217
- o = Object.new
1218
- def o.to_json(*args); [1, args]; end
1219
- Sequel.object_to_json(o, :foo).must_equal [1, [:foo]]
1220
- end
1221
- end
1222
-
1223
- describe "Sequel::LiteralString" do
1224
- before do
1225
- @s = Sequel::LiteralString.new("? = ?")
1226
- end
1227
-
1228
- it "should have lit return self if no arguments" do
1229
- @s.lit.must_be_same_as(@s)
1230
- end
1231
-
1232
- it "should have lit return self if return a placeholder literal string if arguments" do
1233
- @s.lit(1, 2).must_be_kind_of(Sequel::SQL::PlaceholderLiteralString)
1234
- Sequel.mock.literal(@s.lit(1, :a)).must_equal '1 = a'
1235
- end
1236
-
1237
- it "should have to_sequel_blob convert to blob" do
1238
- @s.to_sequel_blob.must_equal @s
1239
- @s.to_sequel_blob.must_be_kind_of(Sequel::SQL::Blob)
1240
- end
1241
- end
1242
-
1243
- describe "Sequel core extensions" do
1244
- it "should have Sequel.core_extensions? be false by default" do
1245
- Sequel.core_extensions?.must_equal false
1246
- end
1247
- end