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