sequel 5.8.0 → 5.38.0

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