sequel 5.20.0 → 5.49.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 (511) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +398 -1922
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +7 -7
  5. data/doc/advanced_associations.rdoc +4 -4
  6. data/doc/association_basics.rdoc +80 -16
  7. data/doc/cheat_sheet.rdoc +6 -5
  8. data/doc/code_order.rdoc +10 -12
  9. data/doc/dataset_filtering.rdoc +17 -2
  10. data/doc/fork_safety.rdoc +84 -0
  11. data/doc/migration.rdoc +11 -5
  12. data/doc/model_dataset_method_design.rdoc +1 -1
  13. data/doc/model_plugins.rdoc +1 -1
  14. data/doc/opening_databases.rdoc +10 -2
  15. data/doc/postgresql.rdoc +82 -3
  16. data/doc/querying.rdoc +4 -4
  17. data/doc/release_notes/5.21.0.txt +87 -0
  18. data/doc/release_notes/5.22.0.txt +48 -0
  19. data/doc/release_notes/5.23.0.txt +56 -0
  20. data/doc/release_notes/5.24.0.txt +56 -0
  21. data/doc/release_notes/5.25.0.txt +32 -0
  22. data/doc/release_notes/5.26.0.txt +35 -0
  23. data/doc/release_notes/5.27.0.txt +21 -0
  24. data/doc/release_notes/5.28.0.txt +16 -0
  25. data/doc/release_notes/5.29.0.txt +22 -0
  26. data/doc/release_notes/5.30.0.txt +20 -0
  27. data/doc/release_notes/5.31.0.txt +148 -0
  28. data/doc/release_notes/5.32.0.txt +46 -0
  29. data/doc/release_notes/5.33.0.txt +24 -0
  30. data/doc/release_notes/5.34.0.txt +40 -0
  31. data/doc/release_notes/5.35.0.txt +56 -0
  32. data/doc/release_notes/5.36.0.txt +60 -0
  33. data/doc/release_notes/5.37.0.txt +30 -0
  34. data/doc/release_notes/5.38.0.txt +28 -0
  35. data/doc/release_notes/5.39.0.txt +19 -0
  36. data/doc/release_notes/5.40.0.txt +40 -0
  37. data/doc/release_notes/5.41.0.txt +25 -0
  38. data/doc/release_notes/5.42.0.txt +136 -0
  39. data/doc/release_notes/5.43.0.txt +98 -0
  40. data/doc/release_notes/5.44.0.txt +32 -0
  41. data/doc/release_notes/5.45.0.txt +34 -0
  42. data/doc/release_notes/5.46.0.txt +87 -0
  43. data/doc/release_notes/5.47.0.txt +59 -0
  44. data/doc/release_notes/5.48.0.txt +14 -0
  45. data/doc/release_notes/5.49.0.txt +59 -0
  46. data/doc/sharding.rdoc +2 -0
  47. data/doc/sql.rdoc +13 -1
  48. data/doc/testing.rdoc +20 -7
  49. data/doc/transactions.rdoc +0 -8
  50. data/doc/validations.rdoc +1 -1
  51. data/doc/virtual_rows.rdoc +1 -1
  52. data/lib/sequel/adapters/ado/access.rb +1 -1
  53. data/lib/sequel/adapters/ado.rb +43 -35
  54. data/lib/sequel/adapters/ibmdb.rb +2 -2
  55. data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
  56. data/lib/sequel/adapters/jdbc/postgresql.rb +11 -17
  57. data/lib/sequel/adapters/jdbc/sqlite.rb +29 -0
  58. data/lib/sequel/adapters/jdbc.rb +24 -6
  59. data/lib/sequel/adapters/mysql.rb +1 -1
  60. data/lib/sequel/adapters/mysql2.rb +2 -3
  61. data/lib/sequel/adapters/odbc.rb +8 -6
  62. data/lib/sequel/adapters/oracle.rb +5 -4
  63. data/lib/sequel/adapters/postgres.rb +15 -9
  64. data/lib/sequel/adapters/shared/access.rb +6 -6
  65. data/lib/sequel/adapters/shared/mssql.rb +66 -21
  66. data/lib/sequel/adapters/shared/mysql.rb +27 -10
  67. data/lib/sequel/adapters/shared/oracle.rb +29 -23
  68. data/lib/sequel/adapters/shared/postgres.rb +271 -32
  69. data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
  70. data/lib/sequel/adapters/shared/sqlite.rb +161 -19
  71. data/lib/sequel/adapters/sqlanywhere.rb +1 -1
  72. data/lib/sequel/adapters/sqlite.rb +1 -1
  73. data/lib/sequel/adapters/tinytds.rb +15 -2
  74. data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -1
  75. data/lib/sequel/ast_transformer.rb +6 -0
  76. data/lib/sequel/connection_pool/sharded_single.rb +4 -1
  77. data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
  78. data/lib/sequel/connection_pool/single.rb +1 -1
  79. data/lib/sequel/connection_pool/threaded.rb +2 -2
  80. data/lib/sequel/core.rb +333 -319
  81. data/lib/sequel/database/connecting.rb +3 -4
  82. data/lib/sequel/database/logging.rb +7 -1
  83. data/lib/sequel/database/misc.rb +31 -12
  84. data/lib/sequel/database/query.rb +3 -1
  85. data/lib/sequel/database/schema_generator.rb +53 -51
  86. data/lib/sequel/database/schema_methods.rb +38 -23
  87. data/lib/sequel/database/transactions.rb +17 -18
  88. data/lib/sequel/dataset/actions.rb +14 -9
  89. data/lib/sequel/dataset/features.rb +16 -0
  90. data/lib/sequel/dataset/misc.rb +2 -2
  91. data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
  92. data/lib/sequel/dataset/prepared_statements.rb +2 -0
  93. data/lib/sequel/dataset/query.rb +26 -9
  94. data/lib/sequel/dataset/sql.rb +76 -25
  95. data/lib/sequel/dataset.rb +4 -2
  96. data/lib/sequel/deprecated.rb +3 -1
  97. data/lib/sequel/exceptions.rb +2 -0
  98. data/lib/sequel/extensions/_pretty_table.rb +1 -2
  99. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  100. data/lib/sequel/extensions/async_thread_pool.rb +438 -0
  101. data/lib/sequel/extensions/blank.rb +8 -0
  102. data/lib/sequel/extensions/columns_introspection.rb +1 -2
  103. data/lib/sequel/extensions/connection_expiration.rb +2 -2
  104. data/lib/sequel/extensions/connection_validator.rb +2 -2
  105. data/lib/sequel/extensions/core_refinements.rb +2 -0
  106. data/lib/sequel/extensions/date_arithmetic.rb +36 -24
  107. data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -1
  108. data/lib/sequel/extensions/eval_inspect.rb +2 -0
  109. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  110. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  111. data/lib/sequel/extensions/index_caching.rb +9 -7
  112. data/lib/sequel/extensions/inflector.rb +9 -1
  113. data/lib/sequel/extensions/integer64.rb +2 -0
  114. data/lib/sequel/extensions/migration.rb +11 -3
  115. data/lib/sequel/extensions/named_timezones.rb +56 -8
  116. data/lib/sequel/extensions/pagination.rb +1 -1
  117. data/lib/sequel/extensions/pg_array.rb +5 -0
  118. data/lib/sequel/extensions/pg_array_ops.rb +14 -6
  119. data/lib/sequel/extensions/pg_enum.rb +11 -3
  120. data/lib/sequel/extensions/pg_extended_date_support.rb +2 -2
  121. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  122. data/lib/sequel/extensions/pg_hstore_ops.rb +54 -2
  123. data/lib/sequel/extensions/pg_inet.rb +15 -5
  124. data/lib/sequel/extensions/pg_interval.rb +36 -8
  125. data/lib/sequel/extensions/pg_json.rb +387 -123
  126. data/lib/sequel/extensions/pg_json_ops.rb +238 -0
  127. data/lib/sequel/extensions/pg_loose_count.rb +3 -1
  128. data/lib/sequel/extensions/pg_range.rb +17 -9
  129. data/lib/sequel/extensions/pg_range_ops.rb +2 -0
  130. data/lib/sequel/extensions/pg_row.rb +4 -2
  131. data/lib/sequel/extensions/pg_row_ops.rb +24 -0
  132. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  133. data/lib/sequel/extensions/query.rb +3 -0
  134. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  135. data/lib/sequel/extensions/s.rb +2 -0
  136. data/lib/sequel/extensions/schema_dumper.rb +24 -7
  137. data/lib/sequel/extensions/server_block.rb +18 -7
  138. data/lib/sequel/extensions/sql_comments.rb +2 -2
  139. data/lib/sequel/extensions/string_agg.rb +1 -1
  140. data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
  141. data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
  142. data/lib/sequel/extensions/to_dot.rb +9 -3
  143. data/lib/sequel/model/associations.rb +356 -117
  144. data/lib/sequel/model/base.rb +107 -68
  145. data/lib/sequel/model/errors.rb +10 -1
  146. data/lib/sequel/model/inflections.rb +1 -1
  147. data/lib/sequel/model/plugins.rb +9 -3
  148. data/lib/sequel/model.rb +3 -1
  149. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  150. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  151. data/lib/sequel/plugins/association_pks.rb +60 -18
  152. data/lib/sequel/plugins/association_proxies.rb +8 -2
  153. data/lib/sequel/plugins/async_thread_pool.rb +39 -0
  154. data/lib/sequel/plugins/auto_validations.rb +39 -5
  155. data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
  156. data/lib/sequel/plugins/blacklist_security.rb +1 -2
  157. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  158. data/lib/sequel/plugins/caching.rb +3 -0
  159. data/lib/sequel/plugins/class_table_inheritance.rb +33 -28
  160. data/lib/sequel/plugins/column_encryption.rb +728 -0
  161. data/lib/sequel/plugins/composition.rb +7 -2
  162. data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
  163. data/lib/sequel/plugins/constraint_validations.rb +2 -1
  164. data/lib/sequel/plugins/csv_serializer.rb +28 -9
  165. data/lib/sequel/plugins/dataset_associations.rb +4 -1
  166. data/lib/sequel/plugins/dirty.rb +60 -22
  167. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  168. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  169. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  170. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  171. data/lib/sequel/plugins/json_serializer.rb +57 -35
  172. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  173. data/lib/sequel/plugins/many_through_many.rb +108 -9
  174. data/lib/sequel/plugins/nested_attributes.rb +15 -3
  175. data/lib/sequel/plugins/pg_array_associations.rb +58 -41
  176. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +91 -30
  177. data/lib/sequel/plugins/prepared_statements.rb +15 -12
  178. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
  179. data/lib/sequel/plugins/rcte_tree.rb +43 -35
  180. data/lib/sequel/plugins/serialization.rb +8 -3
  181. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  182. data/lib/sequel/plugins/sharding.rb +11 -5
  183. data/lib/sequel/plugins/single_table_inheritance.rb +22 -15
  184. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  185. data/lib/sequel/plugins/static_cache.rb +9 -4
  186. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  187. data/lib/sequel/plugins/string_stripper.rb +1 -1
  188. data/lib/sequel/plugins/subclasses.rb +2 -0
  189. data/lib/sequel/plugins/throw_failures.rb +1 -1
  190. data/lib/sequel/plugins/timestamps.rb +1 -1
  191. data/lib/sequel/plugins/tree.rb +9 -4
  192. data/lib/sequel/plugins/typecast_on_load.rb +3 -2
  193. data/lib/sequel/plugins/unused_associations.rb +521 -0
  194. data/lib/sequel/plugins/update_or_create.rb +1 -1
  195. data/lib/sequel/plugins/validation_class_methods.rb +5 -1
  196. data/lib/sequel/plugins/validation_helpers.rb +18 -11
  197. data/lib/sequel/plugins/xml_serializer.rb +1 -1
  198. data/lib/sequel/sql.rb +20 -5
  199. data/lib/sequel/timezones.rb +63 -17
  200. data/lib/sequel/version.rb +1 -1
  201. metadata +113 -381
  202. data/Rakefile +0 -151
  203. data/doc/release_notes/4.0.0.txt +0 -262
  204. data/doc/release_notes/4.1.0.txt +0 -85
  205. data/doc/release_notes/4.10.0.txt +0 -226
  206. data/doc/release_notes/4.11.0.txt +0 -147
  207. data/doc/release_notes/4.12.0.txt +0 -105
  208. data/doc/release_notes/4.13.0.txt +0 -169
  209. data/doc/release_notes/4.14.0.txt +0 -68
  210. data/doc/release_notes/4.15.0.txt +0 -56
  211. data/doc/release_notes/4.16.0.txt +0 -36
  212. data/doc/release_notes/4.17.0.txt +0 -38
  213. data/doc/release_notes/4.18.0.txt +0 -36
  214. data/doc/release_notes/4.19.0.txt +0 -45
  215. data/doc/release_notes/4.2.0.txt +0 -129
  216. data/doc/release_notes/4.20.0.txt +0 -79
  217. data/doc/release_notes/4.21.0.txt +0 -94
  218. data/doc/release_notes/4.22.0.txt +0 -72
  219. data/doc/release_notes/4.23.0.txt +0 -65
  220. data/doc/release_notes/4.24.0.txt +0 -99
  221. data/doc/release_notes/4.25.0.txt +0 -181
  222. data/doc/release_notes/4.26.0.txt +0 -44
  223. data/doc/release_notes/4.27.0.txt +0 -78
  224. data/doc/release_notes/4.28.0.txt +0 -57
  225. data/doc/release_notes/4.29.0.txt +0 -41
  226. data/doc/release_notes/4.3.0.txt +0 -40
  227. data/doc/release_notes/4.30.0.txt +0 -37
  228. data/doc/release_notes/4.31.0.txt +0 -57
  229. data/doc/release_notes/4.32.0.txt +0 -132
  230. data/doc/release_notes/4.33.0.txt +0 -88
  231. data/doc/release_notes/4.34.0.txt +0 -86
  232. data/doc/release_notes/4.35.0.txt +0 -130
  233. data/doc/release_notes/4.36.0.txt +0 -116
  234. data/doc/release_notes/4.37.0.txt +0 -50
  235. data/doc/release_notes/4.38.0.txt +0 -67
  236. data/doc/release_notes/4.39.0.txt +0 -127
  237. data/doc/release_notes/4.4.0.txt +0 -92
  238. data/doc/release_notes/4.40.0.txt +0 -179
  239. data/doc/release_notes/4.41.0.txt +0 -77
  240. data/doc/release_notes/4.42.0.txt +0 -221
  241. data/doc/release_notes/4.43.0.txt +0 -87
  242. data/doc/release_notes/4.44.0.txt +0 -125
  243. data/doc/release_notes/4.45.0.txt +0 -370
  244. data/doc/release_notes/4.46.0.txt +0 -404
  245. data/doc/release_notes/4.47.0.txt +0 -56
  246. data/doc/release_notes/4.48.0.txt +0 -293
  247. data/doc/release_notes/4.49.0.txt +0 -222
  248. data/doc/release_notes/4.5.0.txt +0 -34
  249. data/doc/release_notes/4.6.0.txt +0 -30
  250. data/doc/release_notes/4.7.0.txt +0 -103
  251. data/doc/release_notes/4.8.0.txt +0 -175
  252. data/doc/release_notes/4.9.0.txt +0 -190
  253. data/spec/adapter_spec.rb +0 -4
  254. data/spec/adapters/db2_spec.rb +0 -170
  255. data/spec/adapters/mssql_spec.rb +0 -804
  256. data/spec/adapters/mysql_spec.rb +0 -1065
  257. data/spec/adapters/oracle_spec.rb +0 -371
  258. data/spec/adapters/postgres_spec.rb +0 -4125
  259. data/spec/adapters/spec_helper.rb +0 -44
  260. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  261. data/spec/adapters/sqlite_spec.rb +0 -652
  262. data/spec/bin_spec.rb +0 -278
  263. data/spec/core/connection_pool_spec.rb +0 -1250
  264. data/spec/core/database_spec.rb +0 -2865
  265. data/spec/core/dataset_spec.rb +0 -5515
  266. data/spec/core/deprecated_spec.rb +0 -70
  267. data/spec/core/expression_filters_spec.rb +0 -1455
  268. data/spec/core/mock_adapter_spec.rb +0 -722
  269. data/spec/core/object_graph_spec.rb +0 -336
  270. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  271. data/spec/core/schema_generator_spec.rb +0 -214
  272. data/spec/core/schema_spec.rb +0 -1826
  273. data/spec/core/spec_helper.rb +0 -24
  274. data/spec/core/version_spec.rb +0 -14
  275. data/spec/core_extensions_spec.rb +0 -763
  276. data/spec/core_model_spec.rb +0 -2
  277. data/spec/core_spec.rb +0 -1
  278. data/spec/deprecation_helper.rb +0 -30
  279. data/spec/extensions/accessed_columns_spec.rb +0 -51
  280. data/spec/extensions/active_model_spec.rb +0 -99
  281. data/spec/extensions/after_initialize_spec.rb +0 -28
  282. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  283. data/spec/extensions/association_dependencies_spec.rb +0 -125
  284. data/spec/extensions/association_pks_spec.rb +0 -423
  285. data/spec/extensions/association_proxies_spec.rb +0 -100
  286. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  287. data/spec/extensions/auto_validations_spec.rb +0 -229
  288. data/spec/extensions/blacklist_security_spec.rb +0 -95
  289. data/spec/extensions/blank_spec.rb +0 -69
  290. data/spec/extensions/boolean_readers_spec.rb +0 -93
  291. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  292. data/spec/extensions/caching_spec.rb +0 -273
  293. data/spec/extensions/caller_logging_spec.rb +0 -52
  294. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  295. data/spec/extensions/column_conflicts_spec.rb +0 -75
  296. data/spec/extensions/column_select_spec.rb +0 -129
  297. data/spec/extensions/columns_introspection_spec.rb +0 -90
  298. data/spec/extensions/columns_updated_spec.rb +0 -35
  299. data/spec/extensions/composition_spec.rb +0 -248
  300. data/spec/extensions/connection_expiration_spec.rb +0 -151
  301. data/spec/extensions/connection_validator_spec.rb +0 -144
  302. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  303. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  304. data/spec/extensions/constraint_validations_spec.rb +0 -439
  305. data/spec/extensions/core_refinements_spec.rb +0 -528
  306. data/spec/extensions/csv_serializer_spec.rb +0 -183
  307. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  308. data/spec/extensions/dataset_associations_spec.rb +0 -365
  309. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  310. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  311. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  312. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  313. data/spec/extensions/defaults_setter_spec.rb +0 -150
  314. data/spec/extensions/delay_add_association_spec.rb +0 -73
  315. data/spec/extensions/dirty_spec.rb +0 -189
  316. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  317. data/spec/extensions/eager_each_spec.rb +0 -62
  318. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  319. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  320. data/spec/extensions/error_splitter_spec.rb +0 -18
  321. data/spec/extensions/error_sql_spec.rb +0 -20
  322. data/spec/extensions/escaped_like_spec.rb +0 -40
  323. data/spec/extensions/eval_inspect_spec.rb +0 -81
  324. data/spec/extensions/finder_spec.rb +0 -260
  325. data/spec/extensions/force_encoding_spec.rb +0 -126
  326. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  327. data/spec/extensions/graph_each_spec.rb +0 -113
  328. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  329. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  330. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  331. data/spec/extensions/index_caching_spec.rb +0 -66
  332. data/spec/extensions/inflector_spec.rb +0 -183
  333. data/spec/extensions/input_transformer_spec.rb +0 -69
  334. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  335. data/spec/extensions/instance_filters_spec.rb +0 -79
  336. data/spec/extensions/instance_hooks_spec.rb +0 -246
  337. data/spec/extensions/integer64_spec.rb +0 -22
  338. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  339. data/spec/extensions/json_serializer_spec.rb +0 -336
  340. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  341. data/spec/extensions/list_spec.rb +0 -291
  342. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  343. data/spec/extensions/many_through_many_spec.rb +0 -2177
  344. data/spec/extensions/migration_spec.rb +0 -864
  345. data/spec/extensions/modification_detection_spec.rb +0 -93
  346. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  347. data/spec/extensions/named_timezones_spec.rb +0 -111
  348. data/spec/extensions/nested_attributes_spec.rb +0 -767
  349. data/spec/extensions/null_dataset_spec.rb +0 -85
  350. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  351. data/spec/extensions/pagination_spec.rb +0 -116
  352. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  353. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  354. data/spec/extensions/pg_array_spec.rb +0 -398
  355. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -172
  356. data/spec/extensions/pg_enum_spec.rb +0 -118
  357. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  358. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  359. data/spec/extensions/pg_hstore_spec.rb +0 -219
  360. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  361. data/spec/extensions/pg_inet_spec.rb +0 -72
  362. data/spec/extensions/pg_interval_spec.rb +0 -103
  363. data/spec/extensions/pg_json_ops_spec.rb +0 -289
  364. data/spec/extensions/pg_json_spec.rb +0 -262
  365. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  366. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  367. data/spec/extensions/pg_range_spec.rb +0 -519
  368. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  369. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  370. data/spec/extensions/pg_row_spec.rb +0 -363
  371. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  372. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  373. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  374. data/spec/extensions/prepared_statements_spec.rb +0 -177
  375. data/spec/extensions/pretty_table_spec.rb +0 -123
  376. data/spec/extensions/query_spec.rb +0 -94
  377. data/spec/extensions/rcte_tree_spec.rb +0 -381
  378. data/spec/extensions/round_timestamps_spec.rb +0 -39
  379. data/spec/extensions/s_spec.rb +0 -60
  380. data/spec/extensions/schema_caching_spec.rb +0 -64
  381. data/spec/extensions/schema_dumper_spec.rb +0 -870
  382. data/spec/extensions/select_remove_spec.rb +0 -38
  383. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  384. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  385. data/spec/extensions/serialization_spec.rb +0 -365
  386. data/spec/extensions/server_block_spec.rb +0 -97
  387. data/spec/extensions/server_logging_spec.rb +0 -45
  388. data/spec/extensions/sharding_spec.rb +0 -189
  389. data/spec/extensions/shared_caching_spec.rb +0 -151
  390. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  391. data/spec/extensions/singular_table_names_spec.rb +0 -22
  392. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  393. data/spec/extensions/spec_helper.rb +0 -63
  394. data/spec/extensions/split_array_nil_spec.rb +0 -24
  395. data/spec/extensions/split_values_spec.rb +0 -57
  396. data/spec/extensions/sql_comments_spec.rb +0 -33
  397. data/spec/extensions/sql_expr_spec.rb +0 -59
  398. data/spec/extensions/static_cache_spec.rb +0 -471
  399. data/spec/extensions/string_agg_spec.rb +0 -90
  400. data/spec/extensions/string_date_time_spec.rb +0 -95
  401. data/spec/extensions/string_stripper_spec.rb +0 -68
  402. data/spec/extensions/subclasses_spec.rb +0 -79
  403. data/spec/extensions/subset_conditions_spec.rb +0 -38
  404. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  405. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  406. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  407. data/spec/extensions/table_select_spec.rb +0 -83
  408. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  409. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  410. data/spec/extensions/throw_failures_spec.rb +0 -74
  411. data/spec/extensions/timestamps_spec.rb +0 -209
  412. data/spec/extensions/to_dot_spec.rb +0 -153
  413. data/spec/extensions/touch_spec.rb +0 -226
  414. data/spec/extensions/tree_spec.rb +0 -334
  415. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  416. data/spec/extensions/unlimited_update_spec.rb +0 -21
  417. data/spec/extensions/update_or_create_spec.rb +0 -83
  418. data/spec/extensions/update_primary_key_spec.rb +0 -105
  419. data/spec/extensions/update_refresh_spec.rb +0 -59
  420. data/spec/extensions/uuid_spec.rb +0 -101
  421. data/spec/extensions/validate_associated_spec.rb +0 -52
  422. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  423. data/spec/extensions/validation_contexts_spec.rb +0 -31
  424. data/spec/extensions/validation_helpers_spec.rb +0 -525
  425. data/spec/extensions/whitelist_security_spec.rb +0 -157
  426. data/spec/extensions/xml_serializer_spec.rb +0 -213
  427. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  428. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  429. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  430. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  431. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  432. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  433. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  434. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  435. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  436. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  437. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  438. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  439. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  440. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  441. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  442. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  443. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  444. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  445. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  446. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  447. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  448. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  449. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  450. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  451. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  452. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  453. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  454. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  455. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  456. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  457. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  458. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  459. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  460. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  461. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  462. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  463. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  464. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  465. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  466. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  467. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  468. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  469. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  470. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  471. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  472. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  473. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  474. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  475. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  476. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  477. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  478. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  479. data/spec/guards_helper.rb +0 -59
  480. data/spec/integration/associations_test.rb +0 -2597
  481. data/spec/integration/database_test.rb +0 -113
  482. data/spec/integration/dataset_test.rb +0 -1981
  483. data/spec/integration/eager_loader_test.rb +0 -687
  484. data/spec/integration/migrator_test.rb +0 -262
  485. data/spec/integration/model_test.rb +0 -203
  486. data/spec/integration/plugin_test.rb +0 -2396
  487. data/spec/integration/prepared_statement_test.rb +0 -405
  488. data/spec/integration/schema_test.rb +0 -889
  489. data/spec/integration/spec_helper.rb +0 -65
  490. data/spec/integration/timezone_test.rb +0 -86
  491. data/spec/integration/transaction_test.rb +0 -603
  492. data/spec/integration/type_test.rb +0 -127
  493. data/spec/model/association_reflection_spec.rb +0 -803
  494. data/spec/model/associations_spec.rb +0 -4738
  495. data/spec/model/base_spec.rb +0 -875
  496. data/spec/model/class_dataset_methods_spec.rb +0 -146
  497. data/spec/model/dataset_methods_spec.rb +0 -198
  498. data/spec/model/eager_loading_spec.rb +0 -2377
  499. data/spec/model/hooks_spec.rb +0 -370
  500. data/spec/model/inflector_spec.rb +0 -26
  501. data/spec/model/model_spec.rb +0 -956
  502. data/spec/model/plugins_spec.rb +0 -429
  503. data/spec/model/record_spec.rb +0 -2118
  504. data/spec/model/spec_helper.rb +0 -46
  505. data/spec/model/validations_spec.rb +0 -220
  506. data/spec/model_no_assoc_spec.rb +0 -1
  507. data/spec/model_spec.rb +0 -1
  508. data/spec/plugin_spec.rb +0 -1
  509. data/spec/sequel_coverage.rb +0 -15
  510. data/spec/sequel_warning.rb +0 -4
  511. data/spec/spec_config.rb +0 -12
@@ -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/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
-