sequel 5.28.0 → 5.33.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 (380) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +64 -1922
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +1 -1
  5. data/doc/advanced_associations.rdoc +4 -4
  6. data/doc/association_basics.rdoc +3 -3
  7. data/doc/code_order.rdoc +12 -2
  8. data/doc/model_dataset_method_design.rdoc +1 -1
  9. data/doc/postgresql.rdoc +71 -0
  10. data/doc/release_notes/5.29.0.txt +22 -0
  11. data/doc/release_notes/5.30.0.txt +20 -0
  12. data/doc/release_notes/5.31.0.txt +148 -0
  13. data/doc/release_notes/5.32.0.txt +46 -0
  14. data/doc/release_notes/5.33.0.txt +24 -0
  15. data/doc/testing.rdoc +1 -1
  16. data/lib/sequel/adapters/postgres.rb +5 -1
  17. data/lib/sequel/adapters/shared/access.rb +6 -6
  18. data/lib/sequel/adapters/shared/mssql.rb +5 -5
  19. data/lib/sequel/adapters/shared/mysql.rb +10 -10
  20. data/lib/sequel/adapters/shared/oracle.rb +16 -16
  21. data/lib/sequel/adapters/shared/postgres.rb +169 -14
  22. data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
  23. data/lib/sequel/adapters/shared/sqlite.rb +32 -5
  24. data/lib/sequel/adapters/tinytds.rb +1 -1
  25. data/lib/sequel/connection_pool/sharded_threaded.rb +2 -2
  26. data/lib/sequel/connection_pool/threaded.rb +1 -1
  27. data/lib/sequel/core.rb +318 -314
  28. data/lib/sequel/database/query.rb +1 -1
  29. data/lib/sequel/database/schema_generator.rb +1 -1
  30. data/lib/sequel/database/transactions.rb +8 -12
  31. data/lib/sequel/dataset/misc.rb +2 -2
  32. data/lib/sequel/extensions/connection_expiration.rb +2 -2
  33. data/lib/sequel/extensions/connection_validator.rb +2 -2
  34. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  35. data/lib/sequel/extensions/index_caching.rb +9 -7
  36. data/lib/sequel/extensions/integer64.rb +2 -0
  37. data/lib/sequel/extensions/migration.rb +1 -1
  38. data/lib/sequel/extensions/pg_enum.rb +5 -2
  39. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  40. data/lib/sequel/extensions/pg_inet.rb +13 -5
  41. data/lib/sequel/extensions/pg_interval.rb +2 -0
  42. data/lib/sequel/extensions/pg_range.rb +2 -0
  43. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  44. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  45. data/lib/sequel/extensions/schema_dumper.rb +10 -4
  46. data/lib/sequel/extensions/server_block.rb +3 -3
  47. data/lib/sequel/model/associations.rb +18 -5
  48. data/lib/sequel/model/base.rb +60 -53
  49. data/lib/sequel/model/plugins.rb +1 -0
  50. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  51. data/lib/sequel/plugins/association_multi_add_remove.rb +2 -0
  52. data/lib/sequel/plugins/association_proxies.rb +2 -0
  53. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  54. data/lib/sequel/plugins/class_table_inheritance.rb +26 -26
  55. data/lib/sequel/plugins/dirty.rb +13 -13
  56. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  57. data/lib/sequel/plugins/forbid_lazy_load.rb +214 -0
  58. data/lib/sequel/plugins/json_serializer.rb +18 -11
  59. data/lib/sequel/plugins/single_table_inheritance.rb +15 -15
  60. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  61. data/lib/sequel/plugins/subclasses.rb +2 -0
  62. data/lib/sequel/plugins/throw_failures.rb +1 -1
  63. data/lib/sequel/timezones.rb +6 -4
  64. data/lib/sequel/version.rb +1 -1
  65. metadata +18 -367
  66. data/Rakefile +0 -151
  67. data/doc/release_notes/4.0.0.txt +0 -262
  68. data/doc/release_notes/4.1.0.txt +0 -85
  69. data/doc/release_notes/4.10.0.txt +0 -226
  70. data/doc/release_notes/4.11.0.txt +0 -147
  71. data/doc/release_notes/4.12.0.txt +0 -105
  72. data/doc/release_notes/4.13.0.txt +0 -169
  73. data/doc/release_notes/4.14.0.txt +0 -68
  74. data/doc/release_notes/4.15.0.txt +0 -56
  75. data/doc/release_notes/4.16.0.txt +0 -36
  76. data/doc/release_notes/4.17.0.txt +0 -38
  77. data/doc/release_notes/4.18.0.txt +0 -36
  78. data/doc/release_notes/4.19.0.txt +0 -45
  79. data/doc/release_notes/4.2.0.txt +0 -129
  80. data/doc/release_notes/4.20.0.txt +0 -79
  81. data/doc/release_notes/4.21.0.txt +0 -94
  82. data/doc/release_notes/4.22.0.txt +0 -72
  83. data/doc/release_notes/4.23.0.txt +0 -65
  84. data/doc/release_notes/4.24.0.txt +0 -99
  85. data/doc/release_notes/4.25.0.txt +0 -181
  86. data/doc/release_notes/4.26.0.txt +0 -44
  87. data/doc/release_notes/4.27.0.txt +0 -78
  88. data/doc/release_notes/4.28.0.txt +0 -57
  89. data/doc/release_notes/4.29.0.txt +0 -41
  90. data/doc/release_notes/4.3.0.txt +0 -40
  91. data/doc/release_notes/4.30.0.txt +0 -37
  92. data/doc/release_notes/4.31.0.txt +0 -57
  93. data/doc/release_notes/4.32.0.txt +0 -132
  94. data/doc/release_notes/4.33.0.txt +0 -88
  95. data/doc/release_notes/4.34.0.txt +0 -86
  96. data/doc/release_notes/4.35.0.txt +0 -130
  97. data/doc/release_notes/4.36.0.txt +0 -116
  98. data/doc/release_notes/4.37.0.txt +0 -50
  99. data/doc/release_notes/4.38.0.txt +0 -67
  100. data/doc/release_notes/4.39.0.txt +0 -127
  101. data/doc/release_notes/4.4.0.txt +0 -92
  102. data/doc/release_notes/4.40.0.txt +0 -179
  103. data/doc/release_notes/4.41.0.txt +0 -77
  104. data/doc/release_notes/4.42.0.txt +0 -221
  105. data/doc/release_notes/4.43.0.txt +0 -87
  106. data/doc/release_notes/4.44.0.txt +0 -125
  107. data/doc/release_notes/4.45.0.txt +0 -370
  108. data/doc/release_notes/4.46.0.txt +0 -404
  109. data/doc/release_notes/4.47.0.txt +0 -56
  110. data/doc/release_notes/4.48.0.txt +0 -293
  111. data/doc/release_notes/4.49.0.txt +0 -222
  112. data/doc/release_notes/4.5.0.txt +0 -34
  113. data/doc/release_notes/4.6.0.txt +0 -30
  114. data/doc/release_notes/4.7.0.txt +0 -103
  115. data/doc/release_notes/4.8.0.txt +0 -175
  116. data/doc/release_notes/4.9.0.txt +0 -190
  117. data/spec/adapter_spec.rb +0 -4
  118. data/spec/adapters/db2_spec.rb +0 -170
  119. data/spec/adapters/mssql_spec.rb +0 -828
  120. data/spec/adapters/mysql_spec.rb +0 -1060
  121. data/spec/adapters/oracle_spec.rb +0 -371
  122. data/spec/adapters/postgres_spec.rb +0 -4476
  123. data/spec/adapters/spec_helper.rb +0 -44
  124. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  125. data/spec/adapters/sqlite_spec.rb +0 -652
  126. data/spec/bin_spec.rb +0 -278
  127. data/spec/core/connection_pool_spec.rb +0 -1250
  128. data/spec/core/database_spec.rb +0 -2915
  129. data/spec/core/dataset_spec.rb +0 -5547
  130. data/spec/core/deprecated_spec.rb +0 -70
  131. data/spec/core/expression_filters_spec.rb +0 -1498
  132. data/spec/core/mock_adapter_spec.rb +0 -722
  133. data/spec/core/object_graph_spec.rb +0 -336
  134. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  135. data/spec/core/schema_generator_spec.rb +0 -214
  136. data/spec/core/schema_spec.rb +0 -1844
  137. data/spec/core/spec_helper.rb +0 -24
  138. data/spec/core/version_spec.rb +0 -14
  139. data/spec/core_extensions_spec.rb +0 -763
  140. data/spec/core_model_spec.rb +0 -2
  141. data/spec/core_spec.rb +0 -1
  142. data/spec/deprecation_helper.rb +0 -30
  143. data/spec/extensions/accessed_columns_spec.rb +0 -51
  144. data/spec/extensions/active_model_spec.rb +0 -99
  145. data/spec/extensions/after_initialize_spec.rb +0 -28
  146. data/spec/extensions/any_not_empty_spec.rb +0 -23
  147. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  148. data/spec/extensions/association_dependencies_spec.rb +0 -125
  149. data/spec/extensions/association_multi_add_remove_spec.rb +0 -1041
  150. data/spec/extensions/association_pks_spec.rb +0 -423
  151. data/spec/extensions/association_proxies_spec.rb +0 -100
  152. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  153. data/spec/extensions/auto_validations_spec.rb +0 -229
  154. data/spec/extensions/blacklist_security_spec.rb +0 -95
  155. data/spec/extensions/blank_spec.rb +0 -69
  156. data/spec/extensions/boolean_readers_spec.rb +0 -93
  157. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  158. data/spec/extensions/caching_spec.rb +0 -273
  159. data/spec/extensions/caller_logging_spec.rb +0 -52
  160. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  161. data/spec/extensions/column_conflicts_spec.rb +0 -75
  162. data/spec/extensions/column_select_spec.rb +0 -129
  163. data/spec/extensions/columns_introspection_spec.rb +0 -90
  164. data/spec/extensions/columns_updated_spec.rb +0 -35
  165. data/spec/extensions/composition_spec.rb +0 -248
  166. data/spec/extensions/connection_expiration_spec.rb +0 -151
  167. data/spec/extensions/connection_validator_spec.rb +0 -144
  168. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  169. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  170. data/spec/extensions/constraint_validations_spec.rb +0 -439
  171. data/spec/extensions/core_refinements_spec.rb +0 -528
  172. data/spec/extensions/csv_serializer_spec.rb +0 -183
  173. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  174. data/spec/extensions/dataset_associations_spec.rb +0 -365
  175. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  176. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  177. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  178. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  179. data/spec/extensions/defaults_setter_spec.rb +0 -150
  180. data/spec/extensions/delay_add_association_spec.rb +0 -73
  181. data/spec/extensions/dirty_spec.rb +0 -222
  182. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  183. data/spec/extensions/eager_each_spec.rb +0 -62
  184. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  185. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  186. data/spec/extensions/error_splitter_spec.rb +0 -18
  187. data/spec/extensions/error_sql_spec.rb +0 -20
  188. data/spec/extensions/escaped_like_spec.rb +0 -40
  189. data/spec/extensions/eval_inspect_spec.rb +0 -81
  190. data/spec/extensions/exclude_or_null_spec.rb +0 -15
  191. data/spec/extensions/finder_spec.rb +0 -260
  192. data/spec/extensions/force_encoding_spec.rb +0 -126
  193. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  194. data/spec/extensions/graph_each_spec.rb +0 -113
  195. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  196. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  197. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  198. data/spec/extensions/index_caching_spec.rb +0 -66
  199. data/spec/extensions/inflector_spec.rb +0 -183
  200. data/spec/extensions/input_transformer_spec.rb +0 -69
  201. data/spec/extensions/insert_conflict_spec.rb +0 -103
  202. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  203. data/spec/extensions/instance_filters_spec.rb +0 -79
  204. data/spec/extensions/instance_hooks_spec.rb +0 -246
  205. data/spec/extensions/integer64_spec.rb +0 -22
  206. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  207. data/spec/extensions/json_serializer_spec.rb +0 -336
  208. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  209. data/spec/extensions/list_spec.rb +0 -291
  210. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  211. data/spec/extensions/many_through_many_spec.rb +0 -2177
  212. data/spec/extensions/migration_spec.rb +0 -864
  213. data/spec/extensions/modification_detection_spec.rb +0 -93
  214. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  215. data/spec/extensions/named_timezones_spec.rb +0 -218
  216. data/spec/extensions/nested_attributes_spec.rb +0 -815
  217. data/spec/extensions/null_dataset_spec.rb +0 -85
  218. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  219. data/spec/extensions/pagination_spec.rb +0 -116
  220. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  221. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  222. data/spec/extensions/pg_array_spec.rb +0 -398
  223. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -209
  224. data/spec/extensions/pg_enum_spec.rb +0 -118
  225. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  226. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  227. data/spec/extensions/pg_hstore_spec.rb +0 -219
  228. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  229. data/spec/extensions/pg_inet_spec.rb +0 -72
  230. data/spec/extensions/pg_interval_spec.rb +0 -103
  231. data/spec/extensions/pg_json_ops_spec.rb +0 -356
  232. data/spec/extensions/pg_json_spec.rb +0 -451
  233. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  234. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  235. data/spec/extensions/pg_range_spec.rb +0 -600
  236. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  237. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  238. data/spec/extensions/pg_row_spec.rb +0 -363
  239. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  240. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  241. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  242. data/spec/extensions/prepared_statements_spec.rb +0 -177
  243. data/spec/extensions/pretty_table_spec.rb +0 -123
  244. data/spec/extensions/query_spec.rb +0 -94
  245. data/spec/extensions/rcte_tree_spec.rb +0 -387
  246. data/spec/extensions/round_timestamps_spec.rb +0 -39
  247. data/spec/extensions/s_spec.rb +0 -60
  248. data/spec/extensions/schema_caching_spec.rb +0 -64
  249. data/spec/extensions/schema_dumper_spec.rb +0 -870
  250. data/spec/extensions/select_remove_spec.rb +0 -38
  251. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  252. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  253. data/spec/extensions/serialization_spec.rb +0 -365
  254. data/spec/extensions/server_block_spec.rb +0 -135
  255. data/spec/extensions/server_logging_spec.rb +0 -45
  256. data/spec/extensions/sharding_spec.rb +0 -197
  257. data/spec/extensions/shared_caching_spec.rb +0 -151
  258. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  259. data/spec/extensions/singular_table_names_spec.rb +0 -22
  260. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  261. data/spec/extensions/spec_helper.rb +0 -70
  262. data/spec/extensions/split_array_nil_spec.rb +0 -24
  263. data/spec/extensions/split_values_spec.rb +0 -57
  264. data/spec/extensions/sql_comments_spec.rb +0 -33
  265. data/spec/extensions/sql_expr_spec.rb +0 -59
  266. data/spec/extensions/static_cache_cache_spec.rb +0 -35
  267. data/spec/extensions/static_cache_spec.rb +0 -471
  268. data/spec/extensions/string_agg_spec.rb +0 -90
  269. data/spec/extensions/string_date_time_spec.rb +0 -95
  270. data/spec/extensions/string_stripper_spec.rb +0 -68
  271. data/spec/extensions/subclasses_spec.rb +0 -79
  272. data/spec/extensions/subset_conditions_spec.rb +0 -38
  273. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  274. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  275. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  276. data/spec/extensions/table_select_spec.rb +0 -83
  277. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  278. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  279. data/spec/extensions/throw_failures_spec.rb +0 -74
  280. data/spec/extensions/timestamps_spec.rb +0 -209
  281. data/spec/extensions/to_dot_spec.rb +0 -153
  282. data/spec/extensions/touch_spec.rb +0 -226
  283. data/spec/extensions/tree_spec.rb +0 -334
  284. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  285. data/spec/extensions/unlimited_update_spec.rb +0 -21
  286. data/spec/extensions/update_or_create_spec.rb +0 -83
  287. data/spec/extensions/update_primary_key_spec.rb +0 -105
  288. data/spec/extensions/update_refresh_spec.rb +0 -59
  289. data/spec/extensions/uuid_spec.rb +0 -101
  290. data/spec/extensions/validate_associated_spec.rb +0 -52
  291. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  292. data/spec/extensions/validation_contexts_spec.rb +0 -31
  293. data/spec/extensions/validation_helpers_spec.rb +0 -525
  294. data/spec/extensions/whitelist_security_spec.rb +0 -157
  295. data/spec/extensions/xml_serializer_spec.rb +0 -213
  296. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  297. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  298. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  299. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  300. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  301. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  302. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  303. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  304. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  305. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  306. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  307. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  308. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  309. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  310. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  311. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  312. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  313. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  314. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  315. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  316. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  317. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  318. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  319. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  320. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  321. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  322. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  323. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  324. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  325. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  326. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  327. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  328. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  329. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  330. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  331. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  332. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  333. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  334. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  335. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  336. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  337. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  338. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  339. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  340. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  341. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  342. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  343. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  344. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  345. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  346. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  347. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  348. data/spec/guards_helper.rb +0 -59
  349. data/spec/integration/associations_test.rb +0 -2597
  350. data/spec/integration/database_test.rb +0 -113
  351. data/spec/integration/dataset_test.rb +0 -2037
  352. data/spec/integration/eager_loader_test.rb +0 -687
  353. data/spec/integration/migrator_test.rb +0 -262
  354. data/spec/integration/model_test.rb +0 -203
  355. data/spec/integration/plugin_test.rb +0 -2423
  356. data/spec/integration/prepared_statement_test.rb +0 -405
  357. data/spec/integration/schema_test.rb +0 -903
  358. data/spec/integration/spec_helper.rb +0 -71
  359. data/spec/integration/timezone_test.rb +0 -86
  360. data/spec/integration/transaction_test.rb +0 -603
  361. data/spec/integration/type_test.rb +0 -127
  362. data/spec/model/association_reflection_spec.rb +0 -803
  363. data/spec/model/associations_spec.rb +0 -4738
  364. data/spec/model/base_spec.rb +0 -875
  365. data/spec/model/class_dataset_methods_spec.rb +0 -146
  366. data/spec/model/dataset_methods_spec.rb +0 -198
  367. data/spec/model/eager_loading_spec.rb +0 -2377
  368. data/spec/model/hooks_spec.rb +0 -370
  369. data/spec/model/inflector_spec.rb +0 -26
  370. data/spec/model/model_spec.rb +0 -956
  371. data/spec/model/plugins_spec.rb +0 -429
  372. data/spec/model/record_spec.rb +0 -2118
  373. data/spec/model/spec_helper.rb +0 -46
  374. data/spec/model/validations_spec.rb +0 -220
  375. data/spec/model_no_assoc_spec.rb +0 -1
  376. data/spec/model_spec.rb +0 -1
  377. data/spec/plugin_spec.rb +0 -1
  378. data/spec/sequel_coverage.rb +0 -15
  379. data/spec/sequel_warning.rb +0 -4
  380. 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
-