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,144 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- Sequel.extension :pg_array, :pg_array_ops, :pg_hstore, :pg_hstore_ops
4
-
5
- describe "Sequel::Postgres::ArrayOp" do
6
- before do
7
- @db = Sequel.connect('mock://postgres')
8
- @db.extend_datasets{def quote_identifiers?; false end}
9
- @a = Sequel.pg_array_op(:a)
10
- end
11
-
12
- it "should support the standard mathematical operators" do
13
- @db.literal(@a < @a).must_equal "(a < a)"
14
- @db.literal(@a <= @a).must_equal "(a <= a)"
15
- @db.literal(@a > @a).must_equal "(a > a)"
16
- @db.literal(@a >= @a).must_equal "(a >= a)"
17
- end
18
-
19
- it "#[] should support subscript access" do
20
- @db.literal(@a[1]).must_equal "(a)[1]"
21
- @db.literal(@a[1][2]).must_equal "(a)[1][2]"
22
- end
23
-
24
- it "#[] with a range should return an ArrayOp" do
25
- @db.literal(@a[1..2].any).must_equal "ANY((a)[1:2])"
26
- end
27
-
28
- it "#any should use the ANY method" do
29
- @db.literal(1=>@a.any).must_equal "(1 = ANY(a))"
30
- end
31
-
32
- it "#all should use the ALL method" do
33
- @db.literal(1=>@a.all).must_equal "(1 = ALL(a))"
34
- end
35
-
36
- it "#contains should use the @> operator" do
37
- @db.literal(@a.contains(:b)).must_equal "(a @> b)"
38
- end
39
-
40
- it "#contained_by should use the <@ operator" do
41
- @db.literal(@a.contained_by(:b)).must_equal "(a <@ b)"
42
- end
43
-
44
- it "#overlaps should use the && operator" do
45
- @db.literal(@a.overlaps(:b)).must_equal "(a && b)"
46
- end
47
-
48
- it "#push/concat should use the || operator in append mode" do
49
- @db.literal(@a.push(:b)).must_equal "(a || b)"
50
- @db.literal(@a.concat(:b)).must_equal "(a || b)"
51
- end
52
-
53
- it "#remove should remove the element from the array" do
54
- @db.literal(@a.remove(1)).must_equal "array_remove(a, 1)"
55
- @db.literal(@a.remove(1)[2]).must_equal "(array_remove(a, 1))[2]"
56
- end
57
-
58
- it "#remove should replace the element in the array with another" do
59
- @db.literal(@a.replace(1, 2)).must_equal "array_replace(a, 1, 2)"
60
- @db.literal(@a.replace(1, 2)[3]).must_equal "(array_replace(a, 1, 2))[3]"
61
- end
62
-
63
- it "#unshift should use the || operator in prepend mode" do
64
- @db.literal(@a.unshift(:b)).must_equal "(b || a)"
65
- end
66
-
67
- it "#cardinality should use the cardinality function" do
68
- @db.literal(@a.cardinality).must_equal "cardinality(a)"
69
- end
70
-
71
- it "#dims should use the array_dims function" do
72
- @db.literal(@a.dims).must_equal "array_dims(a)"
73
- end
74
-
75
- it "#length should use the array_length function" do
76
- @db.literal(@a.length).must_equal "array_length(a, 1)"
77
- @db.literal(@a.length(2)).must_equal "array_length(a, 2)"
78
- end
79
-
80
- it "#length should use the array_lower function" do
81
- @db.literal(@a.lower).must_equal "array_lower(a, 1)"
82
- @db.literal(@a.lower(2)).must_equal "array_lower(a, 2)"
83
- end
84
-
85
- it "#to_string/join should use the array_to_string function" do
86
- @db.literal(@a.to_string).must_equal "array_to_string(a, '')"
87
- @db.literal(@a.join).must_equal "array_to_string(a, '')"
88
- @db.literal(@a.join(':')).must_equal "array_to_string(a, ':')"
89
- @db.literal(@a.join(':', '*')).must_equal "array_to_string(a, ':', '*')"
90
- end
91
-
92
- it "#hstore should convert the item to an hstore using the hstore function" do
93
- @db.literal(@a.hstore).must_equal "hstore(a)"
94
- @db.literal(@a.hstore['a']).must_equal "(hstore(a) -> 'a')"
95
- @db.literal(@a.hstore(:b)).must_equal "hstore(a, b)"
96
- @db.literal(@a.hstore(:b)['a']).must_equal "(hstore(a, b) -> 'a')"
97
- @db.literal(@a.hstore(%w'1')).must_equal "hstore(a, ARRAY['1'])"
98
- @db.literal(@a.hstore(%w'1')['a']).must_equal "(hstore(a, ARRAY['1']) -> 'a')"
99
- end
100
-
101
- it "#unnest should use the unnest function" do
102
- @db.literal(@a.unnest).must_equal "unnest(a)"
103
- @db.literal(@a.unnest(:b, :c)).must_equal "unnest(a, b, c)"
104
- @db.literal(@a.unnest([1])).must_equal "unnest(a, ARRAY[1])"
105
- end
106
-
107
- it "#pg_array should return self" do
108
- @a.pg_array.must_be_same_as(@a)
109
- end
110
-
111
- it "Sequel.pg_array_op should return arg for ArrayOp" do
112
- Sequel.pg_array_op(@a).must_be_same_as(@a)
113
- end
114
-
115
- it "should be able to turn expressions into array ops using pg_array" do
116
- @db.literal(Sequel.qualify(:b, :a).pg_array.push(3)).must_equal "(b.a || 3)"
117
- @db.literal(Sequel.function(:a, :b).pg_array.push(3)).must_equal "(a(b) || 3)"
118
- end
119
-
120
- it "should be able to turn literal strings into array ops using pg_array" do
121
- @db.literal(Sequel.lit('a').pg_array.unnest).must_equal "unnest(a)"
122
- end
123
-
124
- it "should be able to turn symbols into array ops using Sequel.pg_array_op" do
125
- @db.literal(Sequel.pg_array_op(:a).unnest).must_equal "unnest(a)"
126
- end
127
-
128
- it "should be able to turn symbols into array ops using Sequel.pg_array" do
129
- @db.literal(Sequel.pg_array(:a).unnest).must_equal "unnest(a)"
130
- end
131
-
132
- it "should allow transforming PGArray instances into ArrayOp instances" do
133
- @db.literal(Sequel.pg_array([1,2]).op.push(3)).must_equal "(ARRAY[1,2] || 3)"
134
- end
135
-
136
- it "should wrap array arguments in PGArrays" do
137
- @db.literal(@a.contains([1, 2])).must_equal "(a @> ARRAY[1,2])"
138
- @db.literal(@a.contained_by([1, 2])).must_equal "(a <@ ARRAY[1,2])"
139
- @db.literal(@a.overlaps([1, 2])).must_equal "(a && ARRAY[1,2])"
140
- @db.literal(@a.push([1, 2])).must_equal "(a || ARRAY[1,2])"
141
- @db.literal(@a.concat([1, 2])).must_equal "(a || ARRAY[1,2])"
142
- @db.literal(@a.unshift([1, 2])).must_equal "(ARRAY[1,2] || a)"
143
- end
144
- end
@@ -1,398 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "pg_array extension" do
4
- before(:all) do
5
- Sequel.extension :pg_array
6
- end
7
-
8
- before do
9
- @db = Sequel.connect('mock://postgres')
10
- @db.extend_datasets(Module.new do
11
- def supports_timestamp_timezones?; false end
12
- def supports_timestamp_usecs?; false; end
13
- def quote_identifiers?; false end
14
- end)
15
- @db.extension(:pg_array)
16
- @m = Sequel::Postgres
17
- @converter = @db.conversion_procs
18
- @db.sqls
19
- end
20
-
21
- it "should parse single dimensional text arrays" do
22
- c = @converter[1009]
23
- c.call("{a}").to_a.first.must_be_kind_of(String)
24
- c.call("{}").to_a.must_equal []
25
- c.call('{""}').to_a.must_equal [""]
26
- c.call('{"",""}').to_a.must_equal ["",""]
27
- c.call('{"","",""}').to_a.must_equal ["","",""]
28
- c.call("{a}").to_a.must_equal ['a']
29
- c.call('{"a b"}').to_a.must_equal ['a b']
30
- c.call('{a,b}').to_a.must_equal ['a', 'b']
31
- end
32
-
33
- it "should preserve encoding when parsing text arrays" do
34
- c = @converter[1009]
35
- c.call("{a,\u00E4}".encode('ISO-8859-1')).map(&:encoding).must_equal [Encoding::ISO_8859_1, Encoding::ISO_8859_1]
36
- end
37
-
38
- it "should parse multi-dimensional text arrays" do
39
- c = @converter[1009]
40
- c.call("{{}}").to_a.must_equal [[]]
41
- c.call("{{a},{b}}").to_a.must_equal [['a'], ['b']]
42
- c.call('{{"a b"},{c}}').to_a.must_equal [['a b'], ['c']]
43
- c.call('{{{a},{b}},{{c},{d}}}').to_a.must_equal [[['a'], ['b']], [['c'], ['d']]]
44
- c.call('{{{a,e},{b,f}},{{c,g},{d,h}}}').to_a.must_equal [[['a', 'e'], ['b', 'f']], [['c', 'g'], ['d', 'h']]]
45
- end
46
-
47
- it "should parse text arrays with embedded deliminaters" do
48
- c = @converter[1009]
49
- c.call('{{"{},","\\",\\,\\\\\\"\\""}}').to_a.must_equal [['{},', '",,\\""']]
50
- end
51
-
52
- it "should parse single dimensional integer arrays" do
53
- c = @converter[1007]
54
- c.call("{1}").to_a.first.must_be_kind_of(Integer)
55
- c.call("{}").to_a.must_equal []
56
- c.call("{1}").to_a.must_equal [1]
57
- c.call('{2,3}').to_a.must_equal [2, 3]
58
- c.call('{3,4,5}').to_a.must_equal [3, 4, 5]
59
- end
60
-
61
- it "should parse multiple dimensional integer arrays" do
62
- c = @converter[1007]
63
- c.call("{{}}").to_a.must_equal [[]]
64
- c.call("{{1}}").to_a.must_equal [[1]]
65
- c.call('{{2},{3}}').to_a.must_equal [[2], [3]]
66
- c.call('{{{1,2},{3,4}},{{5,6},{7,8}}}').to_a.must_equal [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
67
- end
68
-
69
- it "should parse single dimensional float arrays" do
70
- c = @converter[1022]
71
- c.call("{}").to_a.must_equal []
72
- c.call("{1.5}").to_a.must_equal [1.5]
73
- c.call('{2.5,3.5}').to_a.must_equal [2.5, 3.5]
74
- c.call('{3.5,4.5,5.5}').to_a.must_equal [3.5, 4.5, 5.5]
75
- end
76
-
77
- it "should parse multiple dimensional float arrays" do
78
- c = @converter[1022]
79
- c.call("{{}}").to_a.must_equal [[]]
80
- c.call("{{1.5}}").to_a.must_equal [[1.5]]
81
- c.call('{{2.5},{3.5}}').to_a.must_equal [[2.5], [3.5]]
82
- c.call('{{{1.5,2.5},{3.5,4.5}},{{5.5,6.5},{7.5,8.5}}}').to_a.must_equal [[[1.5, 2.5], [3.5, 4.5]], [[5.5, 6.5], [7.5, 8.5]]]
83
- end
84
-
85
- it "should parse integers in float arrays as floats" do
86
- c = @converter[1022]
87
- c.call("{1}").to_a.first.must_be_kind_of(Float)
88
- c.call("{1}").to_a.must_equal [1.0]
89
- c.call('{{{1,2},{3,4}},{{5,6},{7,8}}}').to_a.must_equal [[[1.0, 2.0], [3.0, 4.0]], [[5.0, 6.0], [7.0, 8.0]]]
90
- end
91
-
92
- it "should parse single dimensional decimal arrays" do
93
- c = @converter[1231]
94
- c.call("{}").to_a.must_equal []
95
- c.call("{1.5}").to_a.must_equal [BigDecimal('1.5')]
96
- c.call('{2.5,3.5}').to_a.must_equal [BigDecimal('2.5'), BigDecimal('3.5')]
97
- c.call('{3.5,4.5,5.5}').to_a.must_equal [BigDecimal('3.5'), BigDecimal('4.5'), BigDecimal('5.5')]
98
- end
99
-
100
- it "should parse multiple dimensional decimal arrays" do
101
- c = @converter[1231]
102
- c.call("{{}}").to_a.must_equal [[]]
103
- c.call("{{1.5}}").to_a.must_equal [[BigDecimal('1.5')]]
104
- c.call('{{2.5},{3.5}}').to_a.must_equal [[BigDecimal('2.5')], [BigDecimal('3.5')]]
105
- c.call('{{{1.5,2.5},{3.5,4.5}},{{5.5,6.5},{7.5,8.5}}}').to_a.must_equal [[[BigDecimal('1.5'), BigDecimal('2.5')], [BigDecimal('3.5'), BigDecimal('4.5')]], [[BigDecimal('5.5'), BigDecimal('6.5')], [BigDecimal('7.5'), BigDecimal('8.5')]]]
106
- end
107
-
108
- it "should parse decimal values with arbitrary precision" do
109
- c = @converter[1231]
110
- c.call("{1.000000000000000000005}").to_a.must_equal [BigDecimal('1.000000000000000000005')]
111
- c.call("{{1.000000000000000000005,2.000000000000000000005},{3.000000000000000000005,4.000000000000000000005}}").to_a.must_equal [[BigDecimal('1.000000000000000000005'), BigDecimal('2.000000000000000000005')], [BigDecimal('3.000000000000000000005'), BigDecimal('4.000000000000000000005')]]
112
- end
113
-
114
- it "should parse integers in decimal arrays as BigDecimals" do
115
- c = @converter[1231]
116
- c.call("{1}").to_a.first.must_be_kind_of(BigDecimal)
117
- c.call("{1}").to_a.must_equal [BigDecimal('1')]
118
- c.call('{{{1,2},{3,4}},{{5,6},{7,8}}}').to_a.must_equal [[[BigDecimal('1'), BigDecimal('2')], [BigDecimal('3'), BigDecimal('4')]], [[BigDecimal('5'), BigDecimal('6')], [BigDecimal('7'), BigDecimal('8')]]]
119
- end
120
-
121
- it "should parse arrays with NULL values" do
122
- @converter.values_at(1007, 1009, 1022, 1231).each do |c|
123
- c.call("{NULL}").must_equal [nil]
124
- c.call("{NULL,NULL}").must_equal [nil,nil]
125
- c.call("{{NULL,NULL},{NULL,NULL}}").must_equal [[nil,nil],[nil,nil]]
126
- end
127
- end
128
-
129
- it 'should parse arrays with "NULL" values' do
130
- c = @converter[1009]
131
- c.call('{NULL,"NULL",NULL}').to_a.must_equal [nil, "NULL", nil]
132
- c.call('{NULLA,"NULL",NULL}').to_a.must_equal ["NULLA", "NULL", nil]
133
- end
134
-
135
- it "should raise errors when for certain recognized invalid arrays" do
136
- c = @converter[1009]
137
- proc{c.call('')}.must_raise(Sequel::Error)
138
- proc{c.call('}')}.must_raise(Sequel::Error)
139
- proc{c.call('{{}')}.must_raise(Sequel::Error)
140
- proc{c.call('{}}')}.must_raise(Sequel::Error)
141
- proc{c.call('{a""}')}.must_raise(Sequel::Error)
142
- proc{c.call('{a{}}')}.must_raise(Sequel::Error)
143
- proc{c.call('{""a}')}.must_raise(Sequel::Error)
144
- end
145
-
146
- it "should literalize arrays without types correctly" do
147
- @db.literal(@m::PGArray.new([])).must_equal 'ARRAY[]'
148
- @db.literal(@m::PGArray.new([1])).must_equal 'ARRAY[1]'
149
- @db.literal(@m::PGArray.new([nil])).must_equal 'ARRAY[NULL]'
150
- @db.literal(@m::PGArray.new([nil, 1])).must_equal 'ARRAY[NULL,1]'
151
- @db.literal(@m::PGArray.new([1.0, 2.5])).must_equal 'ARRAY[1.0,2.5]'
152
- @db.literal(@m::PGArray.new([BigDecimal('1'), BigDecimal('2.000000000000000000005')])).must_equal 'ARRAY[1.0,2.000000000000000000005]'
153
- @db.literal(@m::PGArray.new([nil, "NULL"])).must_equal "ARRAY[NULL,'NULL']"
154
- @db.literal(@m::PGArray.new([nil, "{},[]'\""])).must_equal "ARRAY[NULL,'{},[]''\"']"
155
- end
156
-
157
- it "should literalize multidimensional arrays correctly" do
158
- @db.literal(@m::PGArray.new([[]])).must_equal 'ARRAY[[]]'
159
- @db.literal(@m::PGArray.new([[1, 2]])).must_equal 'ARRAY[[1,2]]'
160
- @db.literal(@m::PGArray.new([[3], [5]])).must_equal 'ARRAY[[3],[5]]'
161
- @db.literal(@m::PGArray.new([[[1.0]], [[2.5]]])).must_equal 'ARRAY[[[1.0]],[[2.5]]]'
162
- @db.literal(@m::PGArray.new([[[["NULL"]]]])).must_equal "ARRAY[[[['NULL']]]]"
163
- @db.literal(@m::PGArray.new([["a", "b"], ["{},[]'\"", nil]])).must_equal "ARRAY[['a','b'],['{},[]''\"',NULL]]"
164
- end
165
-
166
- it "should literalize with types correctly" do
167
- @db.literal(@m::PGArray.new([], :int4)).must_equal "'{}'::int4[]"
168
- @db.literal(@m::PGArray.new([1], :int4)).must_equal 'ARRAY[1]::int4[]'
169
- @db.literal(@m::PGArray.new([nil], :text)).must_equal 'ARRAY[NULL]::text[]'
170
- @db.literal(@m::PGArray.new([nil, 1], :int8)).must_equal 'ARRAY[NULL,1]::int8[]'
171
- @db.literal(@m::PGArray.new([1.0, 2.5], :real)).must_equal 'ARRAY[1.0,2.5]::real[]'
172
- @db.literal(@m::PGArray.new([BigDecimal('1'), BigDecimal('2.000000000000000000005')], :decimal)).must_equal 'ARRAY[1.0,2.000000000000000000005]::decimal[]'
173
- @db.literal(@m::PGArray.new([nil, "NULL"], :varchar)).must_equal "ARRAY[NULL,'NULL']::varchar[]"
174
- @db.literal(@m::PGArray.new([nil, "{},[]'\""], :"varchar(255)")).must_equal "ARRAY[NULL,'{},[]''\"']::varchar(255)[]"
175
- end
176
-
177
- it "should have Sequel.pg_array method for easy PGArray creation" do
178
- @db.literal(Sequel.pg_array([1])).must_equal 'ARRAY[1]'
179
- @db.literal(Sequel.pg_array([1, 2], :int4)).must_equal 'ARRAY[1,2]::int4[]'
180
- @db.literal(Sequel.pg_array([[[1], [2]], [[3], [4]]], :real)).must_equal 'ARRAY[[[1],[2]],[[3],[4]]]::real[]'
181
- end
182
-
183
- it "should have Sequel.pg_array return existing PGArrays as-is" do
184
- a = Sequel.pg_array([1])
185
- Sequel.pg_array(a).object_id.must_equal(a.object_id)
186
- end
187
-
188
- it "should have Sequel.pg_array create a new PGArrays if type of existing does not match" do
189
- a = Sequel.pg_array([1], :int4)
190
- b = Sequel.pg_array(a, :int8)
191
- a.must_equal b
192
- a.wont_be_same_as(b)
193
- a.array_type.must_equal :int4
194
- b.array_type.must_equal :int8
195
- end
196
-
197
- it "should support using arrays as bound variables" do
198
- @db.bound_variable_arg(1, nil).must_equal 1
199
- @db.bound_variable_arg(Sequel.pg_array([1,2]), nil).must_equal '{1,2}'
200
- @db.bound_variable_arg([1,2], nil).must_equal '{1,2}'
201
- @db.bound_variable_arg([[1,2]], nil).must_equal '{{1,2}}'
202
- @db.bound_variable_arg([1.0,2.0], nil).must_equal '{1.0,2.0}'
203
- @db.bound_variable_arg([Sequel.lit('a'), Sequel.blob("a\0'\"")], nil).must_equal '{a,"a\\\\000\\\\047\\""}'
204
- @db.bound_variable_arg(["\\ \"", 'NULL', nil], nil).must_equal '{"\\\\ \\"","NULL",NULL}'
205
- end
206
-
207
- it "should parse array types from the schema correctly" do
208
- @db.fetch = [{:name=>'id', :db_type=>'integer'}, {:name=>'i', :db_type=>'integer[]'}, {:name=>'f', :db_type=>'real[]'}, {:name=>'d', :db_type=>'numeric[]'}, {:name=>'t', :db_type=>'text[]'}]
209
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:integer, :integer_array, :real_array, :decimal_array, :string_array]
210
- end
211
-
212
- it "should set :callable_default schema entries if default value is recognized" do
213
- @db.fetch = [{:name=>'id', :db_type=>'integer', :default=>'1'}, {:name=>'t', :db_type=>'text[]', :default=>"'{}'::text[]"}]
214
- s = @db.schema(:items)
215
- s[0][1][:callable_default].must_be_nil
216
- v = s[1][1][:callable_default].call
217
- Sequel::Postgres::PGArray.===(v).must_equal true
218
- @db.literal(v).must_equal "'{}'::text[]"
219
- v << 'a'
220
- @db.literal(v).must_equal "ARRAY['a']::text[]"
221
- end
222
-
223
- it "should support typecasting of the various array types" do
224
- {
225
- :integer=>{:class=>Integer, :convert=>['1', 1, '1']},
226
- :float=>{:db_type=>'double precision', :class=>Float, :convert=>['1.1', 1.1, '1.1']},
227
- :decimal=>{:db_type=>'numeric', :class=>BigDecimal, :convert=>['1.00000000000000000000000001', BigDecimal('1.00000000000000000000000001'), '1.00000000000000000000000001']},
228
- :string=>{:db_type=>'text', :class=>String, :convert=>[1, '1', "'1'"]},
229
- :bigint=>{:class=>Integer, :convert=>['1', 1, '1']},
230
- :boolean=>{:class=>TrueClass, :convert=>['t', true, 'true']},
231
- :blob=>{:db_type=>'bytea', :class=>Sequel::SQL::Blob, :convert=>['1', '1', "'1'"]},
232
- :date=>{:class=>Date, :convert=>['2011-10-12', Date.new(2011, 10, 12), "'2011-10-12'"]},
233
- :time=>{:db_type=>'time without time zone', :class=>Sequel::SQLTime, :convert=>['01:02:03', Sequel::SQLTime.create(1, 2, 3), "'01:02:03'"]},
234
- :datetime=>{:db_type=>'timestamp without time zone', :class=>Time, :convert=>['2011-10-12 01:02:03', Time.local(2011, 10, 12, 1, 2, 3), "'2011-10-12 01:02:03'"]},
235
- :time_timezone=>{:db_type=>'time with time zone', :class=>Sequel::SQLTime, :convert=>['01:02:03', Sequel::SQLTime.create(1, 2, 3), "'01:02:03'"]},
236
- :datetime_timezone=>{:db_type=>'timestamp with time zone', :class=>Time, :convert=>['2011-10-12 01:02:03', Time.local(2011, 10, 12, 1, 2, 3), "'2011-10-12 01:02:03'"]},
237
- }.each do |type, h|
238
- meth = :"#{type}_array"
239
- db_type = h[:db_type]||type
240
- klass = h[:class]
241
- array_in, value, output = h[:convert]
242
-
243
- [[array_in]].each do |input|
244
- v = @db.typecast_value(meth, input)
245
- v.must_equal [value]
246
- v.first.must_be_kind_of(klass)
247
- v.array_type.wont_equal nil
248
- @db.typecast_value(meth, Sequel.pg_array([value])).must_equal v
249
- @db.typecast_value(meth, v).object_id.must_equal(v.object_id)
250
- end
251
-
252
- [[[array_in]]].each do |input|
253
- v = @db.typecast_value(meth, input)
254
- v.must_equal [[value]]
255
- v.first.first.must_be_kind_of(klass)
256
- v.array_type.wont_equal nil
257
- @db.typecast_value(meth, Sequel.pg_array([[value]])).must_equal v
258
- @db.typecast_value(meth, v).object_id.must_equal(v.object_id)
259
- end
260
-
261
- @db.literal(@db.typecast_value(meth, [array_in])).must_equal "ARRAY[#{output}]::#{db_type}[]"
262
- @db.literal(@db.typecast_value(meth, [])).must_equal "'{}'::#{db_type}[]"
263
- end
264
- proc{@db.typecast_value(:integer_array, {})}.must_raise(Sequel::InvalidValue)
265
- end
266
-
267
- it "should support SQL::AliasMethods" do
268
- @db.select(Sequel.pg_array([1], :integer).as(:col1)).sql.must_equal 'SELECT ARRAY[1]::integer[] AS col1'
269
- end
270
-
271
- it "should support registering custom array types" do
272
- @db.register_array_type('foo')
273
- @db.typecast_value(:foo_array, []).class.must_equal(Sequel::Postgres::PGArray)
274
- @db.fetch = [{:name=>'id', :db_type=>'foo[]'}]
275
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:foo_array]
276
- end
277
-
278
- it "should support registering custom types with :type_symbol option" do
279
- @db.register_array_type('foo', :type_symbol=>:bar)
280
- @db.typecast_value(:bar_array, []).class.must_equal(Sequel::Postgres::PGArray)
281
- @db.fetch = [{:name=>'id', :db_type=>'foo[]'}]
282
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:bar_array]
283
- end
284
-
285
- it "should support using a block as a custom conversion proc given as block" do
286
- @db.register_array_type('foo', :oid=>1234){|s| (s*2).to_i}
287
- @db.conversion_procs[1234].call('{1}').must_equal [11]
288
- end
289
-
290
- it "should support using a block as a custom conversion proc given as :converter option" do
291
- @db.register_array_type('foo', :oid=>1234, :converter=>proc{|s| (s*2).to_i})
292
- @db.conversion_procs[1234].call('{1}').must_equal [11]
293
- end
294
-
295
- it "should support using an existing scaler conversion proc via the :scalar_oid option" do
296
- @db.register_array_type('foo', :oid=>1234, :scalar_oid=>16)
297
- @db.conversion_procs[1234].call('{t}').must_equal [true]
298
- end
299
-
300
- it "should not raise an error if using :scalar_oid option with unexisting scalar conversion proc" do
301
- @db.register_array_type('foo', :oid=>1234, :scalar_oid=>0)
302
- @db.conversion_procs[1234].call('{t}').must_equal ["t"]
303
- end
304
-
305
- it "should raise an error if using :converter option and a block argument" do
306
- proc{@db.register_array_type('foo', :converter=>proc{}){}}.must_raise(Sequel::Error)
307
- end
308
-
309
- it "should raise an error if using :scalar_oid option and a block argument" do
310
- proc{@db.register_array_type('foo', :scalar_oid=>16){}}.must_raise(Sequel::Error)
311
- end
312
-
313
- it "should support registering custom types with :oid option" do
314
- @db.register_array_type('foo', :oid=>1)
315
- @db.conversion_procs[1].call('{1}').class.must_equal(Sequel::Postgres::PGArray)
316
- end
317
-
318
- it "should support registering converters with blocks" do
319
- @db.register_array_type('foo', :oid=>4){|s| s.to_i * 2}
320
- @db.conversion_procs[4].call('{{1,2},{3,4}}').must_equal [[2, 4], [6, 8]]
321
- end
322
-
323
- it "should support registering custom types with :array_type option" do
324
- @db.register_array_type('foo', :oid=>3, :array_type=>:blah)
325
- @db.literal(@db.conversion_procs[3].call('{}')).must_equal "'{}'::blah[]"
326
- end
327
-
328
- it "should not support registering custom array types on a per-Database basis for frozen databases" do
329
- @db.freeze
330
- proc{@db.register_array_type('banana', :oid=>7865){|s| s}}.must_raise RuntimeError, TypeError
331
- end
332
-
333
- it "should support registering custom array types on a per-Database basis" do
334
- @db.register_array_type('banana', :oid=>7865){|s| s}
335
- @db.typecast_value(:banana_array, []).class.must_equal(Sequel::Postgres::PGArray)
336
- @db.fetch = [{:name=>'id', :db_type=>'banana[]'}]
337
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:banana_array]
338
- @db.conversion_procs.must_include(7865)
339
- @db.respond_to?(:typecast_value_banana_array, true).must_equal true
340
-
341
- db = Sequel.connect('mock://postgres', :quote_identifiers=>false)
342
- db.extend_datasets(Module.new{def supports_timestamp_timezones?; false; end; def supports_timestamp_usecs?; false; end})
343
- db.extension(:pg_array)
344
- db.fetch = [{:name=>'id', :db_type=>'banana[]'}]
345
- db.schema(:items).map{|e| e[1][:type]}.must_equal [nil]
346
- db.conversion_procs.wont_include(7865)
347
- db.respond_to?(:typecast_value_banana_array, true).must_equal false
348
- end
349
-
350
- it "should automatically look up the array and scalar oids when registering per-Database types" do
351
- @db.fetch = [[{:oid=>21, :typarray=>7866}], [{:name=>'id', :db_type=>'banana[]'}]]
352
- @db.register_array_type('banana', :scalar_typecast=>:integer)
353
- @db.sqls.must_equal ["SELECT typarray, oid FROM pg_type WHERE (typname = 'banana') LIMIT 1"]
354
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:banana_array]
355
- @db.conversion_procs[7866].call("{1,2}").must_equal [1,2]
356
- @db.typecast_value(:banana_array, %w'1 2').must_equal [1,2]
357
- end
358
-
359
- it "should not automatically look up oids if given both scalar and array oids" do
360
- @db.register_array_type('banana', :oid=>7866, :scalar_oid=>21, :scalar_typecast=>:integer)
361
- @db.sqls.must_equal []
362
- @db.conversion_procs[7866].call("{1,2}").must_equal [1,2]
363
- @db.typecast_value(:banana_array, %w'1 2').must_equal [1,2]
364
- end
365
-
366
- it "should not automatically look up oids if given array oid and block" do
367
- @db.register_array_type('banana', :oid=>7866, :scalar_typecast=>:integer){|s| s.to_i}
368
- @db.sqls.must_equal []
369
- @db.conversion_procs[7866].call("{1,2}").must_equal [1,2]
370
- @db.typecast_value(:banana_array, %w'1 2').must_equal [1,2]
371
- end
372
-
373
- it "should set appropriate timestamp conversion procs" do
374
- @db.conversion_procs[1185].call('{"2011-10-20 11:12:13"}').must_equal [Time.local(2011, 10, 20, 11, 12, 13)]
375
- @db.conversion_procs[1115].call('{"2011-10-20 11:12:13"}').must_equal [Time.local(2011, 10, 20, 11, 12, 13)]
376
- end
377
-
378
- it "should set appropriate timestamp conversion procs when adding conversion procs" do
379
- @db.fetch = [[{:oid=>2222}], [{:oid=>2222, :typarray=>2223}]]
380
- @db.add_named_conversion_proc(:foo){|v| v*2}
381
- procs = @db.conversion_procs
382
- procs[1185].call('{"2011-10-20 11:12:13"}').must_equal [Time.local(2011, 10, 20, 11, 12, 13)]
383
- procs[1115].call('{"2011-10-20 11:12:13"}').must_equal [Time.local(2011, 10, 20, 11, 12, 13)]
384
- procs[2222].call('1').must_equal '11'
385
- procs[2223].call('{"2"}').must_equal ['22']
386
- end
387
-
388
- it "should return correct results for Database#schema_type_class" do
389
- @db.register_array_type('banana', :oid=>7866, :scalar_typecast=>:integer){|s| s.to_i}
390
- @db.schema_type_class(:banana_array).must_equal Sequel::Postgres::PGArray
391
- @db.schema_type_class(:integer).must_equal Integer
392
- end
393
-
394
- it "should convert ruby arrays to pg arrays as :default option values" do
395
- @db.create_table('a'){column :b, 'c[]', :default=>[]; Integer :d}
396
- @db.sqls.must_equal ['CREATE TABLE a (b c[] DEFAULT (ARRAY[]::c[]), d integer)']
397
- end
398
- end