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.
- checksums.yaml +4 -4
- data/CHANGELOG +8 -1922
- data/doc/release_notes/5.30.0.txt +20 -0
- data/lib/sequel/adapters/shared/sqlite.rb +7 -1
- data/lib/sequel/database/transactions.rb +5 -9
- data/lib/sequel/version.rb +1 -1
- metadata +4 -368
- data/Rakefile +0 -151
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.37.0.txt +0 -50
- data/doc/release_notes/4.38.0.txt +0 -67
- data/doc/release_notes/4.39.0.txt +0 -127
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.40.0.txt +0 -179
- data/doc/release_notes/4.41.0.txt +0 -77
- data/doc/release_notes/4.42.0.txt +0 -221
- data/doc/release_notes/4.43.0.txt +0 -87
- data/doc/release_notes/4.44.0.txt +0 -125
- data/doc/release_notes/4.45.0.txt +0 -370
- data/doc/release_notes/4.46.0.txt +0 -404
- data/doc/release_notes/4.47.0.txt +0 -56
- data/doc/release_notes/4.48.0.txt +0 -293
- data/doc/release_notes/4.49.0.txt +0 -222
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -170
- data/spec/adapters/mssql_spec.rb +0 -828
- data/spec/adapters/mysql_spec.rb +0 -1060
- data/spec/adapters/oracle_spec.rb +0 -371
- data/spec/adapters/postgres_spec.rb +0 -4476
- data/spec/adapters/spec_helper.rb +0 -44
- data/spec/adapters/sqlanywhere_spec.rb +0 -97
- data/spec/adapters/sqlite_spec.rb +0 -652
- data/spec/bin_spec.rb +0 -278
- data/spec/core/connection_pool_spec.rb +0 -1250
- data/spec/core/database_spec.rb +0 -2915
- data/spec/core/dataset_spec.rb +0 -5544
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1498
- data/spec/core/mock_adapter_spec.rb +0 -722
- data/spec/core/object_graph_spec.rb +0 -336
- data/spec/core/placeholder_literalizer_spec.rb +0 -166
- data/spec/core/schema_generator_spec.rb +0 -214
- data/spec/core/schema_spec.rb +0 -1844
- data/spec/core/spec_helper.rb +0 -24
- data/spec/core/version_spec.rb +0 -14
- data/spec/core_extensions_spec.rb +0 -763
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/deprecation_helper.rb +0 -30
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -99
- data/spec/extensions/after_initialize_spec.rb +0 -28
- data/spec/extensions/any_not_empty_spec.rb +0 -23
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -125
- data/spec/extensions/association_multi_add_remove_spec.rb +0 -1041
- data/spec/extensions/association_pks_spec.rb +0 -423
- data/spec/extensions/association_proxies_spec.rb +0 -100
- data/spec/extensions/auto_literal_strings_spec.rb +0 -205
- data/spec/extensions/auto_validations_spec.rb +0 -229
- data/spec/extensions/blacklist_security_spec.rb +0 -95
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -273
- data/spec/extensions/caller_logging_spec.rb +0 -52
- data/spec/extensions/class_table_inheritance_spec.rb +0 -750
- data/spec/extensions/column_conflicts_spec.rb +0 -75
- data/spec/extensions/column_select_spec.rb +0 -129
- data/spec/extensions/columns_introspection_spec.rb +0 -90
- data/spec/extensions/columns_updated_spec.rb +0 -35
- data/spec/extensions/composition_spec.rb +0 -248
- data/spec/extensions/connection_expiration_spec.rb +0 -151
- data/spec/extensions/connection_validator_spec.rb +0 -144
- data/spec/extensions/constant_sql_override_spec.rb +0 -24
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
- data/spec/extensions/constraint_validations_spec.rb +0 -439
- data/spec/extensions/core_refinements_spec.rb +0 -528
- data/spec/extensions/csv_serializer_spec.rb +0 -183
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -365
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -181
- data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
- data/spec/extensions/def_dataset_method_spec.rb +0 -100
- data/spec/extensions/defaults_setter_spec.rb +0 -150
- data/spec/extensions/delay_add_association_spec.rb +0 -73
- data/spec/extensions/dirty_spec.rb +0 -222
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
- data/spec/extensions/eager_each_spec.rb +0 -62
- data/spec/extensions/eager_graph_eager_spec.rb +0 -100
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/empty_failure_backtraces_spec.rb +0 -60
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/escaped_like_spec.rb +0 -40
- data/spec/extensions/eval_inspect_spec.rb +0 -81
- data/spec/extensions/exclude_or_null_spec.rb +0 -15
- data/spec/extensions/finder_spec.rb +0 -260
- data/spec/extensions/force_encoding_spec.rb +0 -126
- data/spec/extensions/freeze_datasets_spec.rb +0 -31
- data/spec/extensions/graph_each_spec.rb +0 -113
- data/spec/extensions/hook_class_methods_spec.rb +0 -402
- data/spec/extensions/identifier_mangling_spec.rb +0 -201
- data/spec/extensions/implicit_subquery_spec.rb +0 -58
- data/spec/extensions/index_caching_spec.rb +0 -66
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -69
- data/spec/extensions/insert_conflict_spec.rb +0 -103
- data/spec/extensions/insert_returning_select_spec.rb +0 -72
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -246
- data/spec/extensions/integer64_spec.rb +0 -22
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -346
- data/spec/extensions/lazy_attributes_spec.rb +0 -183
- data/spec/extensions/list_spec.rb +0 -291
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2177
- data/spec/extensions/migration_spec.rb +0 -864
- data/spec/extensions/modification_detection_spec.rb +0 -93
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
- data/spec/extensions/named_timezones_spec.rb +0 -218
- data/spec/extensions/nested_attributes_spec.rb +0 -815
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -127
- data/spec/extensions/pagination_spec.rb +0 -116
- data/spec/extensions/pg_array_associations_spec.rb +0 -802
- data/spec/extensions/pg_array_ops_spec.rb +0 -144
- data/spec/extensions/pg_array_spec.rb +0 -398
- data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -209
- data/spec/extensions/pg_enum_spec.rb +0 -118
- data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
- data/spec/extensions/pg_hstore_spec.rb +0 -219
- data/spec/extensions/pg_inet_ops_spec.rb +0 -102
- data/spec/extensions/pg_inet_spec.rb +0 -72
- data/spec/extensions/pg_interval_spec.rb +0 -103
- data/spec/extensions/pg_json_ops_spec.rb +0 -356
- data/spec/extensions/pg_json_spec.rb +0 -451
- data/spec/extensions/pg_loose_count_spec.rb +0 -23
- data/spec/extensions/pg_range_ops_spec.rb +0 -60
- data/spec/extensions/pg_range_spec.rb +0 -600
- data/spec/extensions/pg_row_ops_spec.rb +0 -61
- data/spec/extensions/pg_row_plugin_spec.rb +0 -60
- data/spec/extensions/pg_row_spec.rb +0 -363
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
- data/spec/extensions/pg_timestamptz_spec.rb +0 -17
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
- data/spec/extensions/prepared_statements_spec.rb +0 -177
- data/spec/extensions/pretty_table_spec.rb +0 -123
- data/spec/extensions/query_spec.rb +0 -94
- data/spec/extensions/rcte_tree_spec.rb +0 -387
- data/spec/extensions/round_timestamps_spec.rb +0 -39
- data/spec/extensions/s_spec.rb +0 -60
- data/spec/extensions/schema_caching_spec.rb +0 -64
- data/spec/extensions/schema_dumper_spec.rb +0 -870
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -365
- data/spec/extensions/server_block_spec.rb +0 -135
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/sharding_spec.rb +0 -197
- data/spec/extensions/shared_caching_spec.rb +0 -151
- data/spec/extensions/single_table_inheritance_spec.rb +0 -347
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -18
- data/spec/extensions/spec_helper.rb +0 -70
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -57
- data/spec/extensions/sql_comments_spec.rb +0 -33
- data/spec/extensions/sql_expr_spec.rb +0 -59
- data/spec/extensions/static_cache_cache_spec.rb +0 -35
- data/spec/extensions/static_cache_spec.rb +0 -471
- data/spec/extensions/string_agg_spec.rb +0 -90
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -79
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
- data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
- data/spec/extensions/synchronize_sql_spec.rb +0 -124
- data/spec/extensions/table_select_spec.rb +0 -83
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/throw_failures_spec.rb +0 -74
- data/spec/extensions/timestamps_spec.rb +0 -209
- data/spec/extensions/to_dot_spec.rb +0 -153
- data/spec/extensions/touch_spec.rb +0 -226
- data/spec/extensions/tree_spec.rb +0 -334
- data/spec/extensions/typecast_on_load_spec.rb +0 -86
- data/spec/extensions/unlimited_update_spec.rb +0 -21
- data/spec/extensions/update_or_create_spec.rb +0 -83
- data/spec/extensions/update_primary_key_spec.rb +0 -105
- data/spec/extensions/update_refresh_spec.rb +0 -59
- data/spec/extensions/uuid_spec.rb +0 -101
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1040
- data/spec/extensions/validation_contexts_spec.rb +0 -31
- data/spec/extensions/validation_helpers_spec.rb +0 -525
- data/spec/extensions/whitelist_security_spec.rb +0 -157
- data/spec/extensions/xml_serializer_spec.rb +0 -213
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -59
- data/spec/integration/associations_test.rb +0 -2597
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -2037
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -203
- data/spec/integration/plugin_test.rb +0 -2423
- data/spec/integration/prepared_statement_test.rb +0 -405
- data/spec/integration/schema_test.rb +0 -903
- data/spec/integration/spec_helper.rb +0 -71
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -603
- data/spec/integration/type_test.rb +0 -127
- data/spec/model/association_reflection_spec.rb +0 -803
- data/spec/model/associations_spec.rb +0 -4738
- data/spec/model/base_spec.rb +0 -875
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -198
- data/spec/model/eager_loading_spec.rb +0 -2377
- data/spec/model/hooks_spec.rb +0 -370
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -956
- data/spec/model/plugins_spec.rb +0 -429
- data/spec/model/record_spec.rb +0 -2118
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -220
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/sequel_warning.rb +0 -5
- 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
|