sequel 5.29.0 → 5.34.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 (387) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +70 -1922
  3. data/README.rdoc +1 -1
  4. data/doc/advanced_associations.rdoc +4 -4
  5. data/doc/association_basics.rdoc +3 -3
  6. data/doc/code_order.rdoc +12 -2
  7. data/doc/model_dataset_method_design.rdoc +1 -1
  8. data/doc/postgresql.rdoc +71 -0
  9. data/doc/release_notes/5.30.0.txt +20 -0
  10. data/doc/release_notes/5.31.0.txt +148 -0
  11. data/doc/release_notes/5.32.0.txt +46 -0
  12. data/doc/release_notes/5.33.0.txt +24 -0
  13. data/doc/release_notes/5.34.0.txt +40 -0
  14. data/doc/testing.rdoc +1 -1
  15. data/lib/sequel/adapters/shared/access.rb +6 -6
  16. data/lib/sequel/adapters/shared/mssql.rb +5 -5
  17. data/lib/sequel/adapters/shared/mysql.rb +9 -9
  18. data/lib/sequel/adapters/shared/oracle.rb +16 -16
  19. data/lib/sequel/adapters/shared/postgres.rb +169 -14
  20. data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
  21. data/lib/sequel/adapters/shared/sqlite.rb +32 -5
  22. data/lib/sequel/connection_pool/sharded_single.rb +4 -1
  23. data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
  24. data/lib/sequel/connection_pool/single.rb +1 -1
  25. data/lib/sequel/connection_pool/threaded.rb +2 -2
  26. data/lib/sequel/core.rb +318 -314
  27. data/lib/sequel/database/connecting.rb +1 -1
  28. data/lib/sequel/database/misc.rb +16 -10
  29. data/lib/sequel/database/query.rb +3 -1
  30. data/lib/sequel/database/schema_generator.rb +0 -1
  31. data/lib/sequel/database/schema_methods.rb +15 -16
  32. data/lib/sequel/database/transactions.rb +12 -13
  33. data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
  34. data/lib/sequel/dataset/query.rb +4 -3
  35. data/lib/sequel/deprecated.rb +2 -0
  36. data/lib/sequel/exceptions.rb +2 -0
  37. data/lib/sequel/extensions/connection_expiration.rb +2 -2
  38. data/lib/sequel/extensions/connection_validator.rb +2 -2
  39. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  40. data/lib/sequel/extensions/index_caching.rb +9 -7
  41. data/lib/sequel/extensions/integer64.rb +2 -0
  42. data/lib/sequel/extensions/migration.rb +1 -1
  43. data/lib/sequel/extensions/pg_enum.rb +5 -2
  44. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  45. data/lib/sequel/extensions/pg_inet.rb +13 -5
  46. data/lib/sequel/extensions/pg_interval.rb +2 -0
  47. data/lib/sequel/extensions/pg_range.rb +2 -0
  48. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  49. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  50. data/lib/sequel/extensions/schema_dumper.rb +10 -4
  51. data/lib/sequel/extensions/server_block.rb +3 -3
  52. data/lib/sequel/model.rb +2 -0
  53. data/lib/sequel/model/associations.rb +30 -18
  54. data/lib/sequel/model/base.rb +64 -55
  55. data/lib/sequel/model/plugins.rb +3 -3
  56. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  57. data/lib/sequel/plugins/association_multi_add_remove.rb +2 -0
  58. data/lib/sequel/plugins/association_pks.rb +57 -16
  59. data/lib/sequel/plugins/association_proxies.rb +2 -0
  60. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  61. data/lib/sequel/plugins/class_table_inheritance.rb +26 -26
  62. data/lib/sequel/plugins/dirty.rb +13 -13
  63. data/lib/sequel/plugins/forbid_lazy_load.rb +214 -0
  64. data/lib/sequel/plugins/json_serializer.rb +3 -7
  65. data/lib/sequel/plugins/rcte_tree.rb +2 -2
  66. data/lib/sequel/plugins/single_table_inheritance.rb +15 -15
  67. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  68. data/lib/sequel/plugins/subclasses.rb +2 -0
  69. data/lib/sequel/timezones.rb +6 -4
  70. data/lib/sequel/version.rb +1 -1
  71. metadata +17 -368
  72. data/Rakefile +0 -151
  73. data/doc/release_notes/4.0.0.txt +0 -262
  74. data/doc/release_notes/4.1.0.txt +0 -85
  75. data/doc/release_notes/4.10.0.txt +0 -226
  76. data/doc/release_notes/4.11.0.txt +0 -147
  77. data/doc/release_notes/4.12.0.txt +0 -105
  78. data/doc/release_notes/4.13.0.txt +0 -169
  79. data/doc/release_notes/4.14.0.txt +0 -68
  80. data/doc/release_notes/4.15.0.txt +0 -56
  81. data/doc/release_notes/4.16.0.txt +0 -36
  82. data/doc/release_notes/4.17.0.txt +0 -38
  83. data/doc/release_notes/4.18.0.txt +0 -36
  84. data/doc/release_notes/4.19.0.txt +0 -45
  85. data/doc/release_notes/4.2.0.txt +0 -129
  86. data/doc/release_notes/4.20.0.txt +0 -79
  87. data/doc/release_notes/4.21.0.txt +0 -94
  88. data/doc/release_notes/4.22.0.txt +0 -72
  89. data/doc/release_notes/4.23.0.txt +0 -65
  90. data/doc/release_notes/4.24.0.txt +0 -99
  91. data/doc/release_notes/4.25.0.txt +0 -181
  92. data/doc/release_notes/4.26.0.txt +0 -44
  93. data/doc/release_notes/4.27.0.txt +0 -78
  94. data/doc/release_notes/4.28.0.txt +0 -57
  95. data/doc/release_notes/4.29.0.txt +0 -41
  96. data/doc/release_notes/4.3.0.txt +0 -40
  97. data/doc/release_notes/4.30.0.txt +0 -37
  98. data/doc/release_notes/4.31.0.txt +0 -57
  99. data/doc/release_notes/4.32.0.txt +0 -132
  100. data/doc/release_notes/4.33.0.txt +0 -88
  101. data/doc/release_notes/4.34.0.txt +0 -86
  102. data/doc/release_notes/4.35.0.txt +0 -130
  103. data/doc/release_notes/4.36.0.txt +0 -116
  104. data/doc/release_notes/4.37.0.txt +0 -50
  105. data/doc/release_notes/4.38.0.txt +0 -67
  106. data/doc/release_notes/4.39.0.txt +0 -127
  107. data/doc/release_notes/4.4.0.txt +0 -92
  108. data/doc/release_notes/4.40.0.txt +0 -179
  109. data/doc/release_notes/4.41.0.txt +0 -77
  110. data/doc/release_notes/4.42.0.txt +0 -221
  111. data/doc/release_notes/4.43.0.txt +0 -87
  112. data/doc/release_notes/4.44.0.txt +0 -125
  113. data/doc/release_notes/4.45.0.txt +0 -370
  114. data/doc/release_notes/4.46.0.txt +0 -404
  115. data/doc/release_notes/4.47.0.txt +0 -56
  116. data/doc/release_notes/4.48.0.txt +0 -293
  117. data/doc/release_notes/4.49.0.txt +0 -222
  118. data/doc/release_notes/4.5.0.txt +0 -34
  119. data/doc/release_notes/4.6.0.txt +0 -30
  120. data/doc/release_notes/4.7.0.txt +0 -103
  121. data/doc/release_notes/4.8.0.txt +0 -175
  122. data/doc/release_notes/4.9.0.txt +0 -190
  123. data/spec/adapter_spec.rb +0 -4
  124. data/spec/adapters/db2_spec.rb +0 -170
  125. data/spec/adapters/mssql_spec.rb +0 -828
  126. data/spec/adapters/mysql_spec.rb +0 -1060
  127. data/spec/adapters/oracle_spec.rb +0 -371
  128. data/spec/adapters/postgres_spec.rb +0 -4476
  129. data/spec/adapters/spec_helper.rb +0 -44
  130. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  131. data/spec/adapters/sqlite_spec.rb +0 -652
  132. data/spec/bin_spec.rb +0 -278
  133. data/spec/core/connection_pool_spec.rb +0 -1250
  134. data/spec/core/database_spec.rb +0 -2915
  135. data/spec/core/dataset_spec.rb +0 -5544
  136. data/spec/core/deprecated_spec.rb +0 -70
  137. data/spec/core/expression_filters_spec.rb +0 -1498
  138. data/spec/core/mock_adapter_spec.rb +0 -722
  139. data/spec/core/object_graph_spec.rb +0 -336
  140. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  141. data/spec/core/schema_generator_spec.rb +0 -214
  142. data/spec/core/schema_spec.rb +0 -1844
  143. data/spec/core/spec_helper.rb +0 -24
  144. data/spec/core/version_spec.rb +0 -14
  145. data/spec/core_extensions_spec.rb +0 -763
  146. data/spec/core_model_spec.rb +0 -2
  147. data/spec/core_spec.rb +0 -1
  148. data/spec/deprecation_helper.rb +0 -30
  149. data/spec/extensions/accessed_columns_spec.rb +0 -51
  150. data/spec/extensions/active_model_spec.rb +0 -99
  151. data/spec/extensions/after_initialize_spec.rb +0 -28
  152. data/spec/extensions/any_not_empty_spec.rb +0 -23
  153. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  154. data/spec/extensions/association_dependencies_spec.rb +0 -125
  155. data/spec/extensions/association_multi_add_remove_spec.rb +0 -1041
  156. data/spec/extensions/association_pks_spec.rb +0 -423
  157. data/spec/extensions/association_proxies_spec.rb +0 -100
  158. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  159. data/spec/extensions/auto_validations_spec.rb +0 -229
  160. data/spec/extensions/blacklist_security_spec.rb +0 -95
  161. data/spec/extensions/blank_spec.rb +0 -69
  162. data/spec/extensions/boolean_readers_spec.rb +0 -93
  163. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  164. data/spec/extensions/caching_spec.rb +0 -273
  165. data/spec/extensions/caller_logging_spec.rb +0 -52
  166. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  167. data/spec/extensions/column_conflicts_spec.rb +0 -75
  168. data/spec/extensions/column_select_spec.rb +0 -129
  169. data/spec/extensions/columns_introspection_spec.rb +0 -90
  170. data/spec/extensions/columns_updated_spec.rb +0 -35
  171. data/spec/extensions/composition_spec.rb +0 -248
  172. data/spec/extensions/connection_expiration_spec.rb +0 -151
  173. data/spec/extensions/connection_validator_spec.rb +0 -144
  174. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  175. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  176. data/spec/extensions/constraint_validations_spec.rb +0 -439
  177. data/spec/extensions/core_refinements_spec.rb +0 -528
  178. data/spec/extensions/csv_serializer_spec.rb +0 -183
  179. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  180. data/spec/extensions/dataset_associations_spec.rb +0 -365
  181. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  182. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  183. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  184. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  185. data/spec/extensions/defaults_setter_spec.rb +0 -150
  186. data/spec/extensions/delay_add_association_spec.rb +0 -73
  187. data/spec/extensions/dirty_spec.rb +0 -222
  188. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  189. data/spec/extensions/eager_each_spec.rb +0 -62
  190. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  191. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  192. data/spec/extensions/empty_failure_backtraces_spec.rb +0 -60
  193. data/spec/extensions/error_splitter_spec.rb +0 -18
  194. data/spec/extensions/error_sql_spec.rb +0 -20
  195. data/spec/extensions/escaped_like_spec.rb +0 -40
  196. data/spec/extensions/eval_inspect_spec.rb +0 -81
  197. data/spec/extensions/exclude_or_null_spec.rb +0 -15
  198. data/spec/extensions/finder_spec.rb +0 -260
  199. data/spec/extensions/force_encoding_spec.rb +0 -126
  200. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  201. data/spec/extensions/graph_each_spec.rb +0 -113
  202. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  203. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  204. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  205. data/spec/extensions/index_caching_spec.rb +0 -66
  206. data/spec/extensions/inflector_spec.rb +0 -183
  207. data/spec/extensions/input_transformer_spec.rb +0 -69
  208. data/spec/extensions/insert_conflict_spec.rb +0 -103
  209. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  210. data/spec/extensions/instance_filters_spec.rb +0 -79
  211. data/spec/extensions/instance_hooks_spec.rb +0 -246
  212. data/spec/extensions/integer64_spec.rb +0 -22
  213. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  214. data/spec/extensions/json_serializer_spec.rb +0 -346
  215. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  216. data/spec/extensions/list_spec.rb +0 -291
  217. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  218. data/spec/extensions/many_through_many_spec.rb +0 -2177
  219. data/spec/extensions/migration_spec.rb +0 -864
  220. data/spec/extensions/modification_detection_spec.rb +0 -93
  221. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  222. data/spec/extensions/named_timezones_spec.rb +0 -218
  223. data/spec/extensions/nested_attributes_spec.rb +0 -815
  224. data/spec/extensions/null_dataset_spec.rb +0 -85
  225. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  226. data/spec/extensions/pagination_spec.rb +0 -116
  227. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  228. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  229. data/spec/extensions/pg_array_spec.rb +0 -398
  230. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -209
  231. data/spec/extensions/pg_enum_spec.rb +0 -118
  232. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  233. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  234. data/spec/extensions/pg_hstore_spec.rb +0 -219
  235. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  236. data/spec/extensions/pg_inet_spec.rb +0 -72
  237. data/spec/extensions/pg_interval_spec.rb +0 -103
  238. data/spec/extensions/pg_json_ops_spec.rb +0 -356
  239. data/spec/extensions/pg_json_spec.rb +0 -451
  240. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  241. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  242. data/spec/extensions/pg_range_spec.rb +0 -600
  243. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  244. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  245. data/spec/extensions/pg_row_spec.rb +0 -363
  246. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  247. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  248. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  249. data/spec/extensions/prepared_statements_spec.rb +0 -177
  250. data/spec/extensions/pretty_table_spec.rb +0 -123
  251. data/spec/extensions/query_spec.rb +0 -94
  252. data/spec/extensions/rcte_tree_spec.rb +0 -387
  253. data/spec/extensions/round_timestamps_spec.rb +0 -39
  254. data/spec/extensions/s_spec.rb +0 -60
  255. data/spec/extensions/schema_caching_spec.rb +0 -64
  256. data/spec/extensions/schema_dumper_spec.rb +0 -870
  257. data/spec/extensions/select_remove_spec.rb +0 -38
  258. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  259. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  260. data/spec/extensions/serialization_spec.rb +0 -365
  261. data/spec/extensions/server_block_spec.rb +0 -135
  262. data/spec/extensions/server_logging_spec.rb +0 -45
  263. data/spec/extensions/sharding_spec.rb +0 -197
  264. data/spec/extensions/shared_caching_spec.rb +0 -151
  265. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  266. data/spec/extensions/singular_table_names_spec.rb +0 -22
  267. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  268. data/spec/extensions/spec_helper.rb +0 -70
  269. data/spec/extensions/split_array_nil_spec.rb +0 -24
  270. data/spec/extensions/split_values_spec.rb +0 -57
  271. data/spec/extensions/sql_comments_spec.rb +0 -33
  272. data/spec/extensions/sql_expr_spec.rb +0 -59
  273. data/spec/extensions/static_cache_cache_spec.rb +0 -35
  274. data/spec/extensions/static_cache_spec.rb +0 -471
  275. data/spec/extensions/string_agg_spec.rb +0 -90
  276. data/spec/extensions/string_date_time_spec.rb +0 -95
  277. data/spec/extensions/string_stripper_spec.rb +0 -68
  278. data/spec/extensions/subclasses_spec.rb +0 -79
  279. data/spec/extensions/subset_conditions_spec.rb +0 -38
  280. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  281. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  282. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  283. data/spec/extensions/table_select_spec.rb +0 -83
  284. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  285. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  286. data/spec/extensions/throw_failures_spec.rb +0 -74
  287. data/spec/extensions/timestamps_spec.rb +0 -209
  288. data/spec/extensions/to_dot_spec.rb +0 -153
  289. data/spec/extensions/touch_spec.rb +0 -226
  290. data/spec/extensions/tree_spec.rb +0 -334
  291. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  292. data/spec/extensions/unlimited_update_spec.rb +0 -21
  293. data/spec/extensions/update_or_create_spec.rb +0 -83
  294. data/spec/extensions/update_primary_key_spec.rb +0 -105
  295. data/spec/extensions/update_refresh_spec.rb +0 -59
  296. data/spec/extensions/uuid_spec.rb +0 -101
  297. data/spec/extensions/validate_associated_spec.rb +0 -52
  298. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  299. data/spec/extensions/validation_contexts_spec.rb +0 -31
  300. data/spec/extensions/validation_helpers_spec.rb +0 -525
  301. data/spec/extensions/whitelist_security_spec.rb +0 -157
  302. data/spec/extensions/xml_serializer_spec.rb +0 -213
  303. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  304. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  305. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  306. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  307. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  308. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  309. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  310. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  311. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  312. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  313. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  314. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  315. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  316. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  317. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  318. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  319. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  320. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  321. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  322. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  323. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  324. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  325. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  326. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  327. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  328. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  329. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  330. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  331. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  332. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  333. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  334. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  335. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  336. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  337. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  338. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  339. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  340. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  341. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  342. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  343. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  344. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  345. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  346. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  347. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  348. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  349. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  350. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  351. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  352. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  353. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  354. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  355. data/spec/guards_helper.rb +0 -59
  356. data/spec/integration/associations_test.rb +0 -2597
  357. data/spec/integration/database_test.rb +0 -113
  358. data/spec/integration/dataset_test.rb +0 -2037
  359. data/spec/integration/eager_loader_test.rb +0 -687
  360. data/spec/integration/migrator_test.rb +0 -262
  361. data/spec/integration/model_test.rb +0 -203
  362. data/spec/integration/plugin_test.rb +0 -2423
  363. data/spec/integration/prepared_statement_test.rb +0 -405
  364. data/spec/integration/schema_test.rb +0 -903
  365. data/spec/integration/spec_helper.rb +0 -71
  366. data/spec/integration/timezone_test.rb +0 -86
  367. data/spec/integration/transaction_test.rb +0 -603
  368. data/spec/integration/type_test.rb +0 -127
  369. data/spec/model/association_reflection_spec.rb +0 -803
  370. data/spec/model/associations_spec.rb +0 -4738
  371. data/spec/model/base_spec.rb +0 -875
  372. data/spec/model/class_dataset_methods_spec.rb +0 -146
  373. data/spec/model/dataset_methods_spec.rb +0 -198
  374. data/spec/model/eager_loading_spec.rb +0 -2377
  375. data/spec/model/hooks_spec.rb +0 -370
  376. data/spec/model/inflector_spec.rb +0 -26
  377. data/spec/model/model_spec.rb +0 -956
  378. data/spec/model/plugins_spec.rb +0 -429
  379. data/spec/model/record_spec.rb +0 -2118
  380. data/spec/model/spec_helper.rb +0 -46
  381. data/spec/model/validations_spec.rb +0 -220
  382. data/spec/model_no_assoc_spec.rb +0 -1
  383. data/spec/model_spec.rb +0 -1
  384. data/spec/plugin_spec.rb +0 -1
  385. data/spec/sequel_coverage.rb +0 -15
  386. data/spec/sequel_warning.rb +0 -5
  387. data/spec/spec_config.rb +0 -12
@@ -1,24 +0,0 @@
1
- require_relative "../sequel_warning"
2
-
3
- if ENV['COVERAGE']
4
- require_relative "../sequel_coverage"
5
- SimpleCov.sequel_coverage(:filter=>%r{lib/sequel/(\w+\.rb|(dataset|database|model|connection_pool)/\w+\.rb|adapters/mock\.rb)\z})
6
- end
7
-
8
- $:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
9
- require_relative "../../lib/sequel/core"
10
-
11
- ENV['MT_NO_PLUGINS'] = '1' # Work around stupid autoloading of plugins
12
- gem 'minitest'
13
- require 'minitest/global_expectations/autorun'
14
- require 'minitest/hooks/default'
15
- require 'minitest/shared_description'
16
-
17
- require_relative '../deprecation_helper'
18
-
19
- if ENV['SEQUEL_COLUMNS_INTROSPECTION']
20
- Sequel.extension :columns_introspection
21
- Sequel::Database.extension :columns_introspection
22
- require_relative '../../lib/sequel/adapters/mock'
23
- Sequel::Mock::Dataset.send(:include, Sequel::ColumnsIntrospection)
24
- end
@@ -1,14 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel.version" do
4
- it "should be in the form X.Y.Z with all being numbers" do
5
- Sequel.version.must_match(/\A\d+\.\d+\.\d+\z/)
6
- end
7
-
8
- it "MAJOR/MINOR/TINY/VERSION_NUMBER should be integers" do
9
- Sequel::MAJOR.must_be_kind_of(Integer)
10
- Sequel::MINOR.must_be_kind_of(Integer)
11
- Sequel::TINY.must_be_kind_of(Integer)
12
- Sequel::VERSION_NUMBER.must_be_kind_of(Integer)
13
- end
14
- end
@@ -1,763 +0,0 @@
1
- require_relative "sequel_warning"
2
-
3
- if ENV['COVERAGE']
4
- require_relative "sequel_coverage"
5
- SimpleCov.sequel_coverage(:filter=>%r{lib/sequel/extensions/core_extensions\.rb\z})
6
- end
7
-
8
- $:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../lib/"))
9
- require_relative '../lib/sequel'
10
-
11
- Regexp.send(:include, Sequel::SQL::StringMethods)
12
- String.send(:include, Sequel::SQL::StringMethods)
13
- Sequel.extension :core_extensions
14
- Sequel.extension :symbol_aref
15
- Sequel.extension :virtual_row_method_block
16
-
17
- ENV['MT_NO_PLUGINS'] = '1' # Work around stupid autoloading of plugins
18
- gem 'minitest'
19
- require 'minitest/global_expectations/autorun'
20
- require 'minitest/hooks/default'
21
-
22
- require_relative "deprecation_helper.rb"
23
-
24
- describe "Sequel core extensions" do
25
- it "should have Sequel.core_extensions? be true if enabled" do
26
- Sequel.core_extensions?.must_equal true
27
- end
28
- end
29
-
30
- describe "Core extensions" do
31
- before do
32
- db = Sequel.mock
33
- @d = db[:items].with_extend do
34
- def supports_regexp?; true end
35
- def l(*args, &block)
36
- literal(filter_expr(*args, &block))
37
- end
38
- def lit(*args)
39
- literal(*args)
40
- end
41
- end
42
- end
43
-
44
- it "should support NOT via Symbol#~" do
45
- @d.l(~:x).must_equal 'NOT x'
46
- end
47
-
48
- with_symbol_splitting "should support NOT via Symbol#~ for splittable symbols" do
49
- @d.l(~:x__y).must_equal 'NOT x.y'
50
- end
51
-
52
- it "should support + - * / power via Symbol#+,-,*,/,**" do
53
- @d.l(:x + 1 > 100).must_equal '((x + 1) > 100)'
54
- @d.l((:x * :y) < 100.01).must_equal '((x * y) < 100.01)'
55
- @d.l((:x - :y/2) >= 100000000000000000000000000000000000).must_equal '((x - (y / 2)) >= 100000000000000000000000000000000000)'
56
- @d.l((((:x - :y)/(:x + :y))*:z) <= 100).must_equal '((((x - y) / (x + y)) * z) <= 100)'
57
- @d.l(~((((:x - :y)/(:x + :y))*:z) <= 100)).must_equal '((((x - y) / (x + y)) * z) > 100)'
58
- @d.l(~((((:x ** :y)/(:x + :y))*:z) <= 100)).must_equal '(((power(x, y) / (x + y)) * z) > 100)'
59
- end
60
-
61
- it "should support coercion for symbols" do
62
- @d.l(1 + :x > 2).must_equal '((1 + x) > 2)'
63
- end
64
-
65
- it "should support LIKE via Symbol#like" do
66
- @d.l(:x.like('a')).must_equal '(x LIKE \'a\' ESCAPE \'\\\')'
67
- @d.l(:x.like(/a/)).must_equal '(x ~ \'a\')'
68
- @d.l(:x.like('a', 'b')).must_equal '((x LIKE \'a\' ESCAPE \'\\\') OR (x LIKE \'b\' ESCAPE \'\\\'))'
69
- @d.l(:x.like(/a/, /b/i)).must_equal '((x ~ \'a\') OR (x ~* \'b\'))'
70
- @d.l(:x.like('a', /b/)).must_equal '((x LIKE \'a\' ESCAPE \'\\\') OR (x ~ \'b\'))'
71
-
72
- @d.l('a'.like(:x)).must_equal "('a' LIKE x ESCAPE '\\')"
73
- @d.l('a'.like(:x, 'b')).must_equal "(('a' LIKE x ESCAPE '\\') OR ('a' LIKE 'b' ESCAPE '\\'))"
74
- @d.l('a'.like(:x, /b/)).must_equal "(('a' LIKE x ESCAPE '\\') OR ('a' ~ 'b'))"
75
- @d.l('a'.like(:x, /b/i)).must_equal "(('a' LIKE x ESCAPE '\\') OR ('a' ~* 'b'))"
76
-
77
- @d.l(/a/.like(:x)).must_equal "('a' ~ x)"
78
- @d.l(/a/.like(:x, 'b')).must_equal "(('a' ~ x) OR ('a' ~ 'b'))"
79
- @d.l(/a/.like(:x, /b/)).must_equal "(('a' ~ x) OR ('a' ~ 'b'))"
80
- @d.l(/a/.like(:x, /b/i)).must_equal "(('a' ~ x) OR ('a' ~* 'b'))"
81
-
82
- @d.l(/a/i.like(:x)).must_equal "('a' ~* x)"
83
- @d.l(/a/i.like(:x, 'b')).must_equal "(('a' ~* x) OR ('a' ~* 'b'))"
84
- @d.l(/a/i.like(:x, /b/)).must_equal "(('a' ~* x) OR ('a' ~* 'b'))"
85
- @d.l(/a/i.like(:x, /b/i)).must_equal "(('a' ~* x) OR ('a' ~* 'b'))"
86
- end
87
-
88
- it "should support NOT LIKE via Symbol#like and Symbol#~" do
89
- @d.l(~:x.like('a')).must_equal '(x NOT LIKE \'a\' ESCAPE \'\\\')'
90
- @d.l(~:x.like(/a/)).must_equal '(x !~ \'a\')'
91
- @d.l(~:x.like('a', 'b')).must_equal '((x NOT LIKE \'a\' ESCAPE \'\\\') AND (x NOT LIKE \'b\' ESCAPE \'\\\'))'
92
- @d.l(~:x.like(/a/, /b/i)).must_equal '((x !~ \'a\') AND (x !~* \'b\'))'
93
- @d.l(~:x.like('a', /b/)).must_equal '((x NOT LIKE \'a\' ESCAPE \'\\\') AND (x !~ \'b\'))'
94
-
95
- @d.l(~'a'.like(:x)).must_equal "('a' NOT LIKE x ESCAPE '\\')"
96
- @d.l(~'a'.like(:x, 'b')).must_equal "(('a' NOT LIKE x ESCAPE '\\') AND ('a' NOT LIKE 'b' ESCAPE '\\'))"
97
- @d.l(~'a'.like(:x, /b/)).must_equal "(('a' NOT LIKE x ESCAPE '\\') AND ('a' !~ 'b'))"
98
- @d.l(~'a'.like(:x, /b/i)).must_equal "(('a' NOT LIKE x ESCAPE '\\') AND ('a' !~* 'b'))"
99
-
100
- @d.l(~/a/.like(:x)).must_equal "('a' !~ x)"
101
- @d.l(~/a/.like(:x, 'b')).must_equal "(('a' !~ x) AND ('a' !~ 'b'))"
102
- @d.l(~/a/.like(:x, /b/)).must_equal "(('a' !~ x) AND ('a' !~ 'b'))"
103
- @d.l(~/a/.like(:x, /b/i)).must_equal "(('a' !~ x) AND ('a' !~* 'b'))"
104
-
105
- @d.l(~/a/i.like(:x)).must_equal "('a' !~* x)"
106
- @d.l(~/a/i.like(:x, 'b')).must_equal "(('a' !~* x) AND ('a' !~* 'b'))"
107
- @d.l(~/a/i.like(:x, /b/)).must_equal "(('a' !~* x) AND ('a' !~* 'b'))"
108
- @d.l(~/a/i.like(:x, /b/i)).must_equal "(('a' !~* x) AND ('a' !~* 'b'))"
109
- end
110
-
111
- it "should support ILIKE via Symbol#ilike" do
112
- @d.l(:x.ilike('a')).must_equal '(UPPER(x) LIKE UPPER(\'a\') ESCAPE \'\\\')'
113
- @d.l(:x.ilike(/a/)).must_equal '(x ~* \'a\')'
114
- @d.l(:x.ilike('a', 'b')).must_equal '((UPPER(x) LIKE UPPER(\'a\') ESCAPE \'\\\') OR (UPPER(x) LIKE UPPER(\'b\') ESCAPE \'\\\'))'
115
- @d.l(:x.ilike(/a/, /b/i)).must_equal '((x ~* \'a\') OR (x ~* \'b\'))'
116
- @d.l(:x.ilike('a', /b/)).must_equal '((UPPER(x) LIKE UPPER(\'a\') ESCAPE \'\\\') OR (x ~* \'b\'))'
117
-
118
- @d.l('a'.ilike(:x)).must_equal "(UPPER('a') LIKE UPPER(x) ESCAPE '\\')"
119
- @d.l('a'.ilike(:x, 'b')).must_equal "((UPPER('a') LIKE UPPER(x) ESCAPE '\\') OR (UPPER('a') LIKE UPPER('b') ESCAPE '\\'))"
120
- @d.l('a'.ilike(:x, /b/)).must_equal "((UPPER('a') LIKE UPPER(x) ESCAPE '\\') OR ('a' ~* 'b'))"
121
- @d.l('a'.ilike(:x, /b/i)).must_equal "((UPPER('a') LIKE UPPER(x) ESCAPE '\\') OR ('a' ~* 'b'))"
122
-
123
- @d.l(/a/.ilike(:x)).must_equal "('a' ~* x)"
124
- @d.l(/a/.ilike(:x, 'b')).must_equal "(('a' ~* x) OR ('a' ~* 'b'))"
125
- @d.l(/a/.ilike(:x, /b/)).must_equal "(('a' ~* x) OR ('a' ~* 'b'))"
126
- @d.l(/a/.ilike(:x, /b/i)).must_equal "(('a' ~* x) OR ('a' ~* 'b'))"
127
-
128
- @d.l(/a/i.ilike(:x)).must_equal "('a' ~* x)"
129
- @d.l(/a/i.ilike(:x, 'b')).must_equal "(('a' ~* x) OR ('a' ~* 'b'))"
130
- @d.l(/a/i.ilike(:x, /b/)).must_equal "(('a' ~* x) OR ('a' ~* 'b'))"
131
- @d.l(/a/i.ilike(:x, /b/i)).must_equal "(('a' ~* x) OR ('a' ~* 'b'))"
132
- end
133
-
134
- it "should support NOT ILIKE via Symbol#ilike and Symbol#~" do
135
- @d.l(~:x.ilike('a')).must_equal '(UPPER(x) NOT LIKE UPPER(\'a\') ESCAPE \'\\\')'
136
- @d.l(~:x.ilike(/a/)).must_equal '(x !~* \'a\')'
137
- @d.l(~:x.ilike('a', 'b')).must_equal '((UPPER(x) NOT LIKE UPPER(\'a\') ESCAPE \'\\\') AND (UPPER(x) NOT LIKE UPPER(\'b\') ESCAPE \'\\\'))'
138
- @d.l(~:x.ilike(/a/, /b/i)).must_equal '((x !~* \'a\') AND (x !~* \'b\'))'
139
- @d.l(~:x.ilike('a', /b/)).must_equal '((UPPER(x) NOT LIKE UPPER(\'a\') ESCAPE \'\\\') AND (x !~* \'b\'))'
140
-
141
- @d.l(~'a'.ilike(:x)).must_equal "(UPPER('a') NOT LIKE UPPER(x) ESCAPE '\\')"
142
- @d.l(~'a'.ilike(:x, 'b')).must_equal "((UPPER('a') NOT LIKE UPPER(x) ESCAPE '\\') AND (UPPER('a') NOT LIKE UPPER('b') ESCAPE '\\'))"
143
- @d.l(~'a'.ilike(:x, /b/)).must_equal "((UPPER('a') NOT LIKE UPPER(x) ESCAPE '\\') AND ('a' !~* 'b'))"
144
- @d.l(~'a'.ilike(:x, /b/i)).must_equal "((UPPER('a') NOT LIKE UPPER(x) ESCAPE '\\') AND ('a' !~* 'b'))"
145
-
146
- @d.l(~/a/.ilike(:x)).must_equal "('a' !~* x)"
147
- @d.l(~/a/.ilike(:x, 'b')).must_equal "(('a' !~* x) AND ('a' !~* 'b'))"
148
- @d.l(~/a/.ilike(:x, /b/)).must_equal "(('a' !~* x) AND ('a' !~* 'b'))"
149
- @d.l(~/a/.ilike(:x, /b/i)).must_equal "(('a' !~* x) AND ('a' !~* 'b'))"
150
-
151
- @d.l(~/a/i.ilike(:x)).must_equal "('a' !~* x)"
152
- @d.l(~/a/i.ilike(:x, 'b')).must_equal "(('a' !~* x) AND ('a' !~* 'b'))"
153
- @d.l(~/a/i.ilike(:x, /b/)).must_equal "(('a' !~* x) AND ('a' !~* 'b'))"
154
- @d.l(~/a/i.ilike(:x, /b/i)).must_equal "(('a' !~* x) AND ('a' !~* 'b'))"
155
- end
156
-
157
- it "should support sql_expr on arrays with all two pairs" do
158
- @d.l([[:x, 100],[:y, 'a']].sql_expr).must_equal '((x = 100) AND (y = \'a\'))'
159
- @d.l([[:x, true], [:y, false]].sql_expr).must_equal '((x IS TRUE) AND (y IS FALSE))'
160
- @d.l([[:x, nil], [:y, [1,2,3]]].sql_expr).must_equal '((x IS NULL) AND (y IN (1, 2, 3)))'
161
- end
162
-
163
- it "should support sql_negate on arrays with all two pairs" do
164
- @d.l([[:x, 100],[:y, 'a']].sql_negate).must_equal '((x != 100) AND (y != \'a\'))'
165
- @d.l([[:x, true], [:y, false]].sql_negate).must_equal '((x IS NOT TRUE) AND (y IS NOT FALSE))'
166
- @d.l([[:x, nil], [:y, [1,2,3]]].sql_negate).must_equal '((x IS NOT NULL) AND (y NOT IN (1, 2, 3)))'
167
- end
168
-
169
- it "should support ~ on arrays with all two pairs" do
170
- @d.l(~[[:x, 100],[:y, 'a']]).must_equal '((x != 100) OR (y != \'a\'))'
171
- @d.l(~[[:x, true], [:y, false]]).must_equal '((x IS NOT TRUE) OR (y IS NOT FALSE))'
172
- @d.l(~[[:x, nil], [:y, [1,2,3]]]).must_equal '((x IS NOT NULL) OR (y NOT IN (1, 2, 3)))'
173
- end
174
-
175
- it "should support sql_or on arrays with all two pairs" do
176
- @d.l([[:x, 100],[:y, 'a']].sql_or).must_equal '((x = 100) OR (y = \'a\'))'
177
- @d.l([[:x, true], [:y, false]].sql_or).must_equal '((x IS TRUE) OR (y IS FALSE))'
178
- @d.l([[:x, nil], [:y, [1,2,3]]].sql_or).must_equal '((x IS NULL) OR (y IN (1, 2, 3)))'
179
- end
180
-
181
- it "should support Array#sql_string_join for concatenation of SQL strings" do
182
- @d.lit([:x].sql_string_join).must_equal '(x)'
183
- @d.lit([:x].sql_string_join(', ')).must_equal '(x)'
184
- @d.lit([:x, :y].sql_string_join).must_equal '(x || y)'
185
- @d.lit([:x, :y].sql_string_join(', ')).must_equal "(x || ', ' || y)"
186
- @d.lit([:x.sql_function(1), :y.sql_subscript(1)].sql_string_join).must_equal '(x(1) || y[1])'
187
- @d.lit([:x.sql_function(1), 'y.z'.lit].sql_string_join(', ')).must_equal "(x(1) || ', ' || y.z)"
188
- @d.lit([:x, 1, :y].sql_string_join).must_equal "(x || '1' || y)"
189
- @d.lit([:x, 1, :y].sql_string_join(', ')).must_equal "(x || ', ' || '1' || ', ' || y)"
190
- @d.lit([:x, 1, :y].sql_string_join(Sequel[:y][:z])).must_equal "(x || y.z || '1' || y.z || y)"
191
- @d.lit([:x, 1, :y].sql_string_join(1)).must_equal "(x || '1' || '1' || '1' || y)"
192
- @d.lit([:x, :y].sql_string_join('y.x || x.y'.lit)).must_equal "(x || y.x || x.y || y)"
193
- @d.lit([[:x, :y].sql_string_join, [:a, :b].sql_string_join].sql_string_join).must_equal "(x || y || a || b)"
194
- end
195
-
196
- it "should support sql_expr on hashes" do
197
- @d.l({:x => 100, :y => 'a'}.sql_expr)[1...-1].split(' AND ').sort.must_equal ['(x = 100)', '(y = \'a\')']
198
- @d.l({:x => true, :y => false}.sql_expr)[1...-1].split(' AND ').sort.must_equal ['(x IS TRUE)', '(y IS FALSE)']
199
- @d.l({:x => nil, :y => [1,2,3]}.sql_expr)[1...-1].split(' AND ').sort.must_equal ['(x IS NULL)', '(y IN (1, 2, 3))']
200
- end
201
-
202
- it "should support sql_negate on hashes" do
203
- @d.l({:x => 100, :y => 'a'}.sql_negate)[1...-1].split(' AND ').sort.must_equal ['(x != 100)', '(y != \'a\')']
204
- @d.l({:x => true, :y => false}.sql_negate)[1...-1].split(' AND ').sort.must_equal ['(x IS NOT TRUE)', '(y IS NOT FALSE)']
205
- @d.l({:x => nil, :y => [1,2,3]}.sql_negate)[1...-1].split(' AND ').sort.must_equal ['(x IS NOT NULL)', '(y NOT IN (1, 2, 3))']
206
- end
207
-
208
- it "should support ~ on hashes" do
209
- @d.l(~{:x => 100, :y => 'a'})[1...-1].split(' OR ').sort.must_equal ['(x != 100)', '(y != \'a\')']
210
- @d.l(~{:x => true, :y => false})[1...-1].split(' OR ').sort.must_equal ['(x IS NOT TRUE)', '(y IS NOT FALSE)']
211
- @d.l(~{:x => nil, :y => [1,2,3]})[1...-1].split(' OR ').sort.must_equal ['(x IS NOT NULL)', '(y NOT IN (1, 2, 3))']
212
- end
213
-
214
- it "should support sql_or on hashes" do
215
- @d.l({:x => 100, :y => 'a'}.sql_or)[1...-1].split(' OR ').sort.must_equal ['(x = 100)', '(y = \'a\')']
216
- @d.l({:x => true, :y => false}.sql_or)[1...-1].split(' OR ').sort.must_equal ['(x IS TRUE)', '(y IS FALSE)']
217
- @d.l({:x => nil, :y => [1,2,3]}.sql_or)[1...-1].split(' OR ').sort.must_equal ['(x IS NULL)', '(y IN (1, 2, 3))']
218
- end
219
-
220
- it "should Hash#& and Hash#|" do
221
- @d.l({:y => :z} & :x).must_equal '((y = z) AND x)'
222
- @d.l({:x => :a} & {:y => :z}).must_equal '((x = a) AND (y = z))'
223
- @d.l({:y => :z} | :x).must_equal '((y = z) OR x)'
224
- @d.l({:x => :a} | {:y => :z}).must_equal '((x = a) OR (y = z))'
225
- end
226
- end
227
-
228
- describe "Array#case and Hash#case" do
229
- before do
230
- @d = Sequel.mock.dataset
231
- end
232
-
233
- it "should return SQL CASE expression" do
234
- @d.literal({:x=>:y}.case(:z)).must_equal '(CASE WHEN x THEN y ELSE z END)'
235
- @d.literal({:x=>:y}.case(:z, :exp)).must_equal '(CASE exp WHEN x THEN y ELSE z END)'
236
- @d.literal({:x=>:y, :a=>:b}.case(:z)).must_equal '(CASE WHEN x THEN y WHEN a THEN b ELSE z END)'
237
- @d.literal([[:x, :y]].case(:z)).must_equal '(CASE WHEN x THEN y ELSE z END)'
238
- @d.literal([[:x, :y], [:a, :b]].case(:z)).must_equal '(CASE WHEN x THEN y WHEN a THEN b ELSE z END)'
239
- @d.literal([[:x, :y], [:a, :b]].case(:z, :exp)).must_equal '(CASE exp WHEN x THEN y WHEN a THEN b ELSE z END)'
240
- @d.literal([[:x, :y], [:a, :b]].case(:z, Sequel[:exp][:w])).must_equal '(CASE exp.w WHEN x THEN y WHEN a THEN b ELSE z END)'
241
- end
242
-
243
- it "should return SQL CASE expression with expression even if nil" do
244
- @d.literal({:x=>:y}.case(:z, nil)).must_equal '(CASE NULL WHEN x THEN y ELSE z END)'
245
- end
246
-
247
- it "should raise an error if an array that isn't all two pairs is used" do
248
- proc{[:b].case(:a)}.must_raise(Sequel::Error)
249
- proc{[:b, :c].case(:a)}.must_raise(Sequel::Error)
250
- proc{[[:b, :c], :d].case(:a)}.must_raise(Sequel::Error)
251
- end
252
-
253
- it "should raise an error if an empty array/hash is used" do
254
- proc{[].case(:a)}.must_raise(Sequel::Error)
255
- proc{{}.case(:a)}.must_raise(Sequel::Error)
256
- end
257
- end
258
-
259
- describe "Array#sql_value_list" do
260
- before do
261
- @d = Sequel.mock.dataset
262
- end
263
-
264
- it "should treat the array as an SQL value list instead of conditions when used as a placeholder value" do
265
- @d.filter(Sequel.lit("(a, b) IN ?", [[:x, 1], [:y, 2]])).sql.must_equal 'SELECT * WHERE ((a, b) IN ((x = 1) AND (y = 2)))'
266
- @d.filter(Sequel.lit("(a, b) IN ?", [[:x, 1], [:y, 2]].sql_value_list)).sql.must_equal 'SELECT * WHERE ((a, b) IN ((x, 1), (y, 2)))'
267
- end
268
-
269
- it "should be no difference when used as a hash value" do
270
- @d.filter([:a, :b]=>[[:x, 1], [:y, 2]]).sql.must_equal 'SELECT * WHERE ((a, b) IN ((x, 1), (y, 2)))'
271
- @d.filter([:a, :b]=>[[:x, 1], [:y, 2]].sql_value_list).sql.must_equal 'SELECT * WHERE ((a, b) IN ((x, 1), (y, 2)))'
272
- end
273
- end
274
-
275
- describe "String#lit" do
276
- before do
277
- @ds = Sequel.mock[:t]
278
- end
279
-
280
- it "should return an LiteralString object" do
281
- 'xyz'.lit.must_be_kind_of(Sequel::LiteralString)
282
- 'xyz'.lit.to_s.must_equal 'xyz'
283
- end
284
-
285
- it "should inhibit string literalization" do
286
- @ds.update_sql(:stamp => "NOW()".lit).must_equal "UPDATE t SET stamp = NOW()"
287
- end
288
-
289
- it "should return a PlaceholderLiteralString object if args are given" do
290
- a = 'DISTINCT ?'.lit(:a)
291
- a.must_be_kind_of(Sequel::SQL::PlaceholderLiteralString)
292
- @ds.literal(a).must_equal 'DISTINCT a'
293
- @ds.with_quote_identifiers(true).literal(a).must_equal 'DISTINCT "a"'
294
- end
295
-
296
- it "should handle named placeholders if given a single argument hash" do
297
- a = 'DISTINCT :b'.lit(:b=>:a)
298
- a.must_be_kind_of(Sequel::SQL::PlaceholderLiteralString)
299
- @ds.literal(a).must_equal 'DISTINCT a'
300
- @ds.with_quote_identifiers(true).literal(a).must_equal 'DISTINCT "a"'
301
- end
302
-
303
- it "should treat placeholder literal strings as generic expressions" do
304
- a = ':b'.lit(:b=>:a)
305
- @ds.literal(a + 1).must_equal "(a + 1)"
306
- @ds.literal(a & :b).must_equal "(a AND b)"
307
- @ds.literal(a.sql_string + :b).must_equal "(a || b)"
308
- end
309
- end
310
-
311
- describe "String#to_sequel_blob" do
312
- it "should return a Blob object" do
313
- 'xyz'.to_sequel_blob.must_be_kind_of(::Sequel::SQL::Blob)
314
- 'xyz'.to_sequel_blob.must_equal 'xyz'
315
- end
316
-
317
- it "should retain binary data" do
318
- "\1\2\3\4".to_sequel_blob.must_equal "\1\2\3\4"
319
- end
320
- end
321
-
322
- describe "String cast methods" do
323
- before do
324
- @ds = Sequel.mock.dataset
325
- end
326
-
327
- it "should support cast method" do
328
- @ds.literal('abc'.cast(:integer)).must_equal "CAST('abc' AS integer)"
329
- end
330
-
331
- it "should support cast_numeric and cast_string" do
332
- x = 'abc'.cast_numeric
333
- x.must_be_kind_of(Sequel::SQL::NumericExpression)
334
- @ds.literal(x).must_equal "CAST('abc' AS integer)"
335
-
336
- x = 'abc'.cast_numeric(:real)
337
- x.must_be_kind_of(Sequel::SQL::NumericExpression)
338
- @ds.literal(x).must_equal "CAST('abc' AS real)"
339
-
340
- x = 'abc'.cast_string
341
- x.must_be_kind_of(Sequel::SQL::StringExpression)
342
- @ds.literal(x).must_equal "CAST('abc' AS varchar(255))"
343
-
344
- x = 'abc'.cast_string(:varchar)
345
- x.must_be_kind_of(Sequel::SQL::StringExpression)
346
- @ds.literal(x).must_equal "CAST('abc' AS varchar(255))"
347
- end
348
- end
349
-
350
- describe "#desc" do
351
- before do
352
- @ds = Sequel.mock.dataset
353
- end
354
-
355
- it "should format a DESC clause for a column ref" do
356
- @ds.literal(:test.desc).must_equal 'test DESC'
357
- end
358
-
359
- with_symbol_splitting "should format a DESC clause for a column ref with a splitting symbol" do
360
- @ds.literal(:items__price.desc).must_equal 'items.price DESC'
361
- end
362
-
363
- it "should format a DESC clause for a function" do
364
- @ds.literal(:avg.sql_function(:test).desc).must_equal 'avg(test) DESC'
365
- end
366
- end
367
-
368
- describe "#asc" do
369
- before do
370
- @ds = Sequel.mock.dataset
371
- end
372
-
373
- it "should format a ASC clause for a column ref" do
374
- @ds.literal(:test.asc).must_equal 'test ASC'
375
- end
376
-
377
- with_symbol_splitting "should format a ASC clause for a column ref for a splittable symbol" do
378
- @ds.literal(:items__price.asc).must_equal 'items.price ASC'
379
- end
380
-
381
- it "should format a ASC clause for a function" do
382
- @ds.literal(:avg.sql_function(:test).asc).must_equal 'avg(test) ASC'
383
- end
384
- end
385
-
386
- describe "#as" do
387
- before do
388
- @ds = Sequel.mock.dataset
389
- end
390
-
391
- it "should format a AS clause for a column ref" do
392
- @ds.literal(:test.as(:t)).must_equal 'test AS t'
393
- end
394
-
395
- with_symbol_splitting "should format a AS clause for a column ref for splittable symbols" do
396
- @ds.literal(:items__price.as(:p)).must_equal 'items.price AS p'
397
- end
398
-
399
- it "should format a AS clause for a function" do
400
- @ds.literal(:avg.sql_function(:test).as(:avg)).must_equal 'avg(test) AS avg'
401
- end
402
-
403
- it "should format a AS clause for a literal value" do
404
- @ds.literal('abc'.as(:abc)).must_equal "'abc' AS abc"
405
- end
406
- end
407
-
408
- describe "Column references" do
409
- before do
410
- @ds = Sequel.mock.dataset.with_quote_identifiers(true).with_extend{def quoted_identifier_append(sql, c) sql << "`#{c}`" end}
411
- end
412
-
413
- it "should be quoted properly" do
414
- @ds.literal(:xyz).must_equal "`xyz`"
415
- @ds.literal(:xyz.as(:x)).must_equal "`xyz` AS `x`"
416
- end
417
-
418
- it "should be quoted properly in SQL functions" do
419
- @ds.literal(:avg.sql_function(:xyz)).must_equal "avg(`xyz`)"
420
- @ds.literal(:avg.sql_function(:xyz, 1)).must_equal "avg(`xyz`, 1)"
421
- @ds.literal(:avg.sql_function(:xyz).as(:a)).must_equal "avg(`xyz`) AS `a`"
422
- end
423
-
424
- it "should be quoted properly in ASC/DESC clauses" do
425
- @ds.literal(:xyz.asc).must_equal "`xyz` ASC"
426
- @ds.literal(:avg.sql_function(:xyz, 1).desc).must_equal "avg(`xyz`, 1) DESC"
427
- end
428
-
429
- it "should be quoted properly in a cast function" do
430
- @ds.literal(:x.cast(:integer)).must_equal "CAST(`x` AS integer)"
431
- end
432
-
433
- with_symbol_splitting "should be quoted properly when using symbol splitting" do
434
- @ds.literal(:xyz__abc).must_equal "`xyz`.`abc`"
435
- @ds.literal(:xyz__abc.as(:x)).must_equal "`xyz`.`abc` AS `x`"
436
- @ds.literal(:xyz___x).must_equal "`xyz` AS `x`"
437
- @ds.literal(:xyz__abc___x).must_equal "`xyz`.`abc` AS `x`"
438
- @ds.literal(:x__y.cast('varchar(20)')).must_equal "CAST(`x`.`y` AS varchar(20))"
439
- end
440
- end
441
-
442
- describe "Blob" do
443
- it "#to_sequel_blob should return self" do
444
- blob = "x".to_sequel_blob
445
- blob.to_sequel_blob.object_id.must_equal blob.object_id
446
- end
447
- end
448
-
449
- describe "Symbol#*" do
450
- before do
451
- @ds = Sequel.mock.dataset
452
- end
453
-
454
- it "should format a qualified wildcard if no argument" do
455
- @ds.literal(:xyz.*).must_equal 'xyz.*'
456
- @ds.literal(:abc.*).must_equal 'abc.*'
457
- end
458
-
459
- it "should format a filter expression if an argument" do
460
- @ds.literal(:xyz.*(3)).must_equal '(xyz * 3)'
461
- @ds.literal(:abc.*(5)).must_equal '(abc * 5)'
462
- end
463
-
464
- with_symbol_splitting "should support qualified symbols if no argument" do
465
- @ds.literal(:xyz__abc.*).must_equal 'xyz.abc.*'
466
- end
467
- end
468
-
469
- describe "Symbol" do
470
- before do
471
- @ds = Sequel.mock.dataset.with_quote_identifiers(true)
472
- end
473
-
474
- it "#identifier should format an identifier" do
475
- @ds.literal(:xyz__abc.identifier).must_equal '"xyz__abc"'
476
- end
477
-
478
- it "#qualify should format a qualified column" do
479
- @ds.literal(:xyz.qualify(:abc)).must_equal '"abc"."xyz"'
480
- end
481
-
482
- it "#qualify should work on QualifiedIdentifiers" do
483
- @ds.literal(:xyz.qualify(:abc).qualify(:def)).must_equal '"def"."abc"."xyz"'
484
- end
485
-
486
- with_symbol_splitting "should be able to qualify an identifier" do
487
- @ds.literal(:xyz.identifier.qualify(:xyz__abc)).must_equal '"xyz"."abc"."xyz"'
488
- end
489
-
490
- it "should be able to specify a schema.table.column" do
491
- @ds.literal(:column.qualify(:table.qualify(:schema))).must_equal '"schema"."table"."column"'
492
- @ds.literal(:column.qualify(:table__name.identifier.qualify(:schema))).must_equal '"schema"."table__name"."column"'
493
- end
494
-
495
- it "should be able to specify order" do
496
- @oe = :xyz.desc
497
- @oe.class.must_equal Sequel::SQL::OrderedExpression
498
- @oe.descending.must_equal true
499
- @oe = :xyz.asc
500
- @oe.class.must_equal Sequel::SQL::OrderedExpression
501
- @oe.descending.must_equal false
502
- end
503
-
504
- it "should work correctly with objects" do
505
- o = Object.new
506
- def o.sql_literal(ds) "(foo)" end
507
- @ds.literal(:column.qualify(o)).must_equal '(foo)."column"'
508
- end
509
- end
510
-
511
- describe "Symbol" do
512
- before do
513
- @ds = Sequel.mock.dataset
514
- end
515
-
516
- it "should support sql_function method" do
517
- @ds.literal(:COUNT.sql_function('1')).must_equal "COUNT('1')"
518
- @ds.select(:COUNT.sql_function('1')).sql.must_equal "SELECT COUNT('1')"
519
- end
520
-
521
- it "should support cast method" do
522
- @ds.literal(:abc.cast(:integer)).must_equal "CAST(abc AS integer)"
523
- end
524
-
525
- it "should support sql array accesses via sql_subscript" do
526
- @ds.literal(:abc.sql_subscript(1)).must_equal "abc[1]"
527
- @ds.literal(:abc.sql_subscript(1)|2).must_equal "abc[1, 2]"
528
- @ds.literal(:abc.sql_subscript(1)[2]).must_equal "abc[1][2]"
529
- end
530
-
531
- with_symbol_splitting "should support sql array accesses via sql_subscript for splittable symbols" do
532
- @ds.literal(:abc__def.sql_subscript(1)).must_equal "abc.def[1]"
533
- end
534
-
535
- it "should support cast_numeric and cast_string" do
536
- x = :abc.cast_numeric
537
- x.must_be_kind_of(Sequel::SQL::NumericExpression)
538
- @ds.literal(x).must_equal "CAST(abc AS integer)"
539
-
540
- x = :abc.cast_numeric(:real)
541
- x.must_be_kind_of(Sequel::SQL::NumericExpression)
542
- @ds.literal(x).must_equal "CAST(abc AS real)"
543
-
544
- x = :abc.cast_string
545
- x.must_be_kind_of(Sequel::SQL::StringExpression)
546
- @ds.literal(x).must_equal "CAST(abc AS varchar(255))"
547
-
548
- x = :abc.cast_string(:varchar)
549
- x.must_be_kind_of(Sequel::SQL::StringExpression)
550
- @ds.literal(x).must_equal "CAST(abc AS varchar(255))"
551
- end
552
-
553
- it "should support boolean methods" do
554
- @ds.literal(~:x).must_equal "NOT x"
555
- @ds.literal(:x & :y).must_equal "(x AND y)"
556
- @ds.literal(:x | :y).must_equal "(x OR y)"
557
- end
558
-
559
- it "should support complex expression methods" do
560
- @ds.literal(:x.sql_boolean & 1).must_equal "(x AND 1)"
561
- @ds.literal(:x.sql_number & :y).must_equal "(x & y)"
562
- @ds.literal(:x.sql_string + :y).must_equal "(x || y)"
563
- end
564
-
565
- it "should allow database independent types when casting" do
566
- db = @ds.db
567
- def db.cast_type_literal(type)
568
- return :foo if type == Integer
569
- return :bar if type == String
570
- type
571
- end
572
- @ds.literal(:abc.cast(String)).must_equal "CAST(abc AS bar)"
573
- @ds.literal(:abc.cast(String)).must_equal "CAST(abc AS bar)"
574
- @ds.literal(:abc.cast_string).must_equal "CAST(abc AS bar)"
575
- @ds.literal(:abc.cast_string(Integer)).must_equal "CAST(abc AS foo)"
576
- @ds.literal(:abc.cast_numeric).must_equal "CAST(abc AS foo)"
577
- @ds.literal(:abc.cast_numeric(String)).must_equal "CAST(abc AS bar)"
578
- end
579
-
580
- it "should support SQL EXTRACT function via #extract " do
581
- @ds.literal(:abc.extract(:year)).must_equal "extract(year FROM abc)"
582
- end
583
- end
584
-
585
- describe "Postgres extensions integration" do
586
- before do
587
- @db = Sequel.mock
588
- Sequel.extension(:pg_array, :pg_array_ops, :pg_hstore, :pg_hstore_ops, :pg_json, :pg_json_ops, :pg_range, :pg_range_ops, :pg_row, :pg_row_ops, :pg_inet_ops)
589
- end
590
-
591
- it "Symbol#pg_array should return an ArrayOp" do
592
- @db.literal(:a.pg_array.unnest).must_equal "unnest(a)"
593
- end
594
-
595
- it "Symbol#pg_row should return a PGRowOp" do
596
- @db.literal(:a.pg_row[:a]).must_equal "(a).a"
597
- end
598
-
599
- it "Symbol#hstore should return an HStoreOp" do
600
- @db.literal(:a.hstore['a']).must_equal "(a -> 'a')"
601
- end
602
-
603
- it "Symbol#pg_inet should return an InetOp" do
604
- @db.literal(:a.pg_inet.contains(:b)).must_equal "(a >> b)"
605
- end
606
-
607
- it "Symbol#pg_json should return an JSONOp" do
608
- @db.literal(:a.pg_json[%w'a b']).must_equal "(a #> ARRAY['a','b'])"
609
- @db.literal(:a.pg_json.extract('a')).must_equal "json_extract_path(a, 'a')"
610
- end
611
-
612
- it "Symbol#pg_jsonb should return an JSONBOp" do
613
- @db.literal(:a.pg_jsonb[%w'a b']).must_equal "(a #> ARRAY['a','b'])"
614
- @db.literal(:a.pg_jsonb.extract('a')).must_equal "jsonb_extract_path(a, 'a')"
615
- end
616
-
617
- it "Symbol#pg_range should return a RangeOp" do
618
- @db.literal(:a.pg_range.lower).must_equal "lower(a)"
619
- end
620
-
621
- it "Array#pg_array should return a PGArray" do
622
- @db.literal([1].pg_array.op.unnest).must_equal "unnest(ARRAY[1])"
623
- @db.literal([1].pg_array(:int4).op.unnest).must_equal "unnest(ARRAY[1]::int4[])"
624
- end
625
-
626
- it "Array#pg_json should return a JSONArray" do
627
- @db.literal([1].pg_json).must_equal "'[1]'::json"
628
- end
629
-
630
- it "Array#pg_jsonb should return a JSONBArray" do
631
- @db.literal([1].pg_jsonb).must_equal "'[1]'::jsonb"
632
- end
633
-
634
- it "Array#pg_row should return a ArrayRow" do
635
- @db.literal([1].pg_row).must_equal "ROW(1)"
636
- end
637
-
638
- it "Hash#hstore should return an HStore" do
639
- @db.literal({'a'=>1}.hstore.op['a']).must_equal '(\'"a"=>"1"\'::hstore -> \'a\')'
640
- end
641
-
642
- it "Hash#pg_json should return an JSONHash" do
643
- @db.literal({'a'=>'b'}.pg_json).must_equal "'{\"a\":\"b\"}'::json"
644
- end
645
-
646
- it "Hash#pg_jsonb should return an JSONBHash" do
647
- @db.literal({'a'=>'b'}.pg_jsonb).must_equal "'{\"a\":\"b\"}'::jsonb"
648
- end
649
-
650
- it "Range#pg_range should return an PGRange" do
651
- @db.literal((1..2).pg_range).must_equal "'[1,2]'"
652
- @db.literal((1..2).pg_range(:int4range)).must_equal "int4range(1,2,'[]')"
653
- end
654
- end
655
-
656
- describe "symbol_aref extensions" do
657
- before do
658
- @db = Sequel.mock
659
- end
660
-
661
- it "Symbol#[] should create qualified identifier if given a symbol" do
662
- @db.literal(:x[:y]).must_equal "x.y"
663
- end
664
-
665
- it "Symbol#[] should create qualified identifier if given an identifier" do
666
- @db.literal(:x[Sequel[:y]]).must_equal "x.y"
667
- end
668
-
669
- it "Symbol#[] should create qualified identifier if given a qualified identifier" do
670
- @db.literal(:x[:y[:z]]).must_equal "x.y.z"
671
- end
672
-
673
- it "should not affect other arguments to Symbol#[]" do
674
- :x[0].must_equal "x"
675
- end
676
- end
677
-
678
- describe Sequel::SQL::VirtualRow do
679
- before do
680
- @d = Sequel.mock[:items].with_quote_identifiers(true).with_extend do
681
- def supports_window_functions?; true end
682
- def l(*args, &block)
683
- literal(filter_expr(*args, &block))
684
- end
685
- end
686
- end
687
-
688
- it "should treat methods without blocks normally" do
689
- @d.l{column}.must_equal '"column"'
690
- @d.l{foo(a)}.must_equal 'foo("a")'
691
- end
692
-
693
-
694
- it "should treat methods with a block and no arguments as a function call with no arguments" do
695
- @d.l{version{}}.must_equal 'version()'
696
- end
697
-
698
- it "should treat methods with a block and a leading argument :* as a function call with the SQL wildcard" do
699
- @d.l{count(:*){}}.must_equal 'count(*)'
700
- end
701
-
702
- it "should treat methods with a block and a leading argument :distinct as a function call with DISTINCT and the additional method arguments" do
703
- @d.l{count(:distinct, column1){}}.must_equal 'count(DISTINCT "column1")'
704
- @d.l{count(:distinct, column1, column2){}}.must_equal 'count(DISTINCT "column1", "column2")'
705
- end
706
-
707
- it "should raise an error if an unsupported argument is used with a block" do
708
- proc{@d.where{count(:blah){}}}.must_raise(Sequel::Error)
709
- end
710
-
711
- it "should treat methods with a block and a leading argument :over as a window function call" do
712
- @d.l{rank(:over){}}.must_equal 'rank() OVER ()'
713
- end
714
-
715
- it "should support :partition options for window function calls" do
716
- @d.l{rank(:over, :partition=>column1){}}.must_equal 'rank() OVER (PARTITION BY "column1")'
717
- @d.l{rank(:over, :partition=>[column1, column2]){}}.must_equal 'rank() OVER (PARTITION BY "column1", "column2")'
718
- end
719
-
720
- it "should support :args options for window function calls" do
721
- @d.l{avg(:over, :args=>column1){}}.must_equal 'avg("column1") OVER ()'
722
- @d.l{avg(:over, :args=>[column1, column2]){}}.must_equal 'avg("column1", "column2") OVER ()'
723
- end
724
-
725
- it "should support :order option for window function calls" do
726
- @d.l{rank(:over, :order=>column1){}}.must_equal 'rank() OVER (ORDER BY "column1")'
727
- @d.l{rank(:over, :order=>[column1, column2]){}}.must_equal 'rank() OVER (ORDER BY "column1", "column2")'
728
- end
729
-
730
- it "should support :window option for window function calls" do
731
- @d.l{rank(:over, :window=>:win){}}.must_equal 'rank() OVER ("win")'
732
- end
733
-
734
- it "should support :*=>true option for window function calls" do
735
- @d.l{count(:over, :* =>true){}}.must_equal 'count(*) OVER ()'
736
- end
737
-
738
- it "should support :frame=>:all option for window function calls" do
739
- @d.l{rank(:over, :frame=>:all){}}.must_equal 'rank() OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)'
740
- end
741
-
742
- it "should support :frame=>:rows option for window function calls" do
743
- @d.l{rank(:over, :frame=>:rows){}}.must_equal 'rank() OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)'
744
- end
745
-
746
- it "should support :frame=>'some string' option for window function calls" do
747
- @d.l{rank(:over, :frame=>'RANGE BETWEEN 3 PRECEDING AND CURRENT ROW'){}}.must_equal 'rank() OVER (RANGE BETWEEN 3 PRECEDING AND CURRENT ROW)'
748
- end
749
-
750
- it "should raise an error if an invalid :frame option is used" do
751
- proc{@d.l{rank(:over, :frame=>:blah){}}}.must_raise(Sequel::Error)
752
- end
753
-
754
- it "should support all these options together" do
755
- @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)'
756
- end
757
-
758
- it "should raise an error if window functions are not supported" do
759
- proc{@d.with_extend{def supports_window_functions?; false end}.l{count(:over, :* =>true, :partition=>a, :order=>b, :window=>:win, :frame=>:rows){}}}.must_raise(Sequel::Error)
760
- proc{Sequel.mock.dataset.filter{count(:over, :* =>true, :partition=>a, :order=>b, :window=>:win, :frame=>:rows){}}.sql}.must_raise(Sequel::Error)
761
- end
762
- end
763
-