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,61 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
Sequel.extension :pg_array, :pg_array_ops, :pg_row, :pg_row_ops
|
|
4
|
-
|
|
5
|
-
describe "Sequel::Postgres::PGRowOp" do
|
|
6
|
-
before do
|
|
7
|
-
@db = Sequel.connect('mock://postgres')
|
|
8
|
-
@db.extend_datasets{def quote_identifiers?; false end}
|
|
9
|
-
@a = Sequel.pg_row_op(:a)
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
it "#[] should access members of the composite type" do
|
|
13
|
-
@db.literal(@a[:b]).must_equal "(a).b"
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
it "#[] should be chainable" do
|
|
17
|
-
@db.literal(@a[:b][:c]).must_equal "((a).b).c"
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
it "#[] should support array access if not given an identifier" do
|
|
21
|
-
@db.literal(@a[:b][1]).must_equal "((a).b)[1]"
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
it "#[] should be chainable with array access" do
|
|
25
|
-
@db.literal(@a[1][:b]).must_equal "((a)[1]).b"
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
it "#splat should return a splatted argument inside parentheses" do
|
|
29
|
-
@db.literal(@a.splat).must_equal "(a.*)"
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
it "#splat(type) should return a splatted argument cast to given type" do
|
|
33
|
-
@db.literal(@a.splat(:b)).must_equal "(a.*)::b"
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
it "#splat should not work on an already accessed composite type" do
|
|
37
|
-
proc{@a[:a].splat(:b)}.must_raise(Sequel::Error)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
it "#* should reference all members of the composite type as separate columns if given no arguments" do
|
|
41
|
-
@db.literal(@a.*).must_equal "(a).*"
|
|
42
|
-
@db.literal(@a[:b].*).must_equal "((a).b).*"
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
it "#* should use a multiplication operation if any arguments are given" do
|
|
46
|
-
@db.literal(@a.*(1)).must_equal "(a * 1)"
|
|
47
|
-
@db.literal(@a[:b].*(1)).must_equal "((a).b * 1)"
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
it "#pg_row should be callable on literal strings" do
|
|
51
|
-
@db.literal(Sequel.lit('a').pg_row[:b]).must_equal "(a).b"
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
it "#pg_row should be callable on Sequel expressions" do
|
|
55
|
-
@db.literal(Sequel.function(:a).pg_row[:b]).must_equal "(a()).b"
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
it "Sequel.pg_row should work as well if the pg_row extension is loaded" do
|
|
59
|
-
@db.literal(Sequel.pg_row(Sequel.function(:a))[:b]).must_equal "(a()).b"
|
|
60
|
-
end
|
|
61
|
-
end
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe "Sequel::Plugins::PgRow" do
|
|
4
|
-
before do
|
|
5
|
-
@db = Sequel.connect('mock://postgres')
|
|
6
|
-
@db.extend_datasets{def quote_identifiers?; false end}
|
|
7
|
-
@db.extension(:pg_array)
|
|
8
|
-
@c = Class.new(Sequel::Model(@db[:address]))
|
|
9
|
-
@c.columns :street, :city
|
|
10
|
-
@c.db_schema[:street][:type] = :string
|
|
11
|
-
@c.db_schema[:city][:type] = :string
|
|
12
|
-
@db.fetch = [[{:oid=>1098, :typrelid=>2, :typarray=>3}], [{:attname=>'street', :atttypid=>1324}, {:attname=>'city', :atttypid=>1324}]]
|
|
13
|
-
@c.plugin :pg_row
|
|
14
|
-
|
|
15
|
-
@c2 = Class.new(Sequel::Model(@db[:company]))
|
|
16
|
-
@c2.columns :address
|
|
17
|
-
@c2.db_schema[:address].merge!(:type=>:pg_row_address)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
it "should have schema_type_class include Sequel::Model" do
|
|
21
|
-
@c2.new.send(:schema_type_class, :address).must_equal @c
|
|
22
|
-
@db.conversion_procs[1098].call('(123 Foo St,Bar City)').must_equal @c.load(:street=>'123 Foo St', :city=>'Bar City')
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
it "should set up a parser for the type that creates a model class" do
|
|
26
|
-
@db.conversion_procs[1098].call('(123 Foo St,Bar City)').must_equal @c.load(:street=>'123 Foo St', :city=>'Bar City')
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
it "should set up type casting for the type" do
|
|
30
|
-
@c2.new(:address=>{'street'=>123, 'city'=>:Bar}).address.must_equal @c.load(:street=>'123', :city=>'Bar')
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
it "should return model instances as is when typecasting to rows" do
|
|
34
|
-
o = @c.load(:street=>'123', :city=>'Bar')
|
|
35
|
-
@c2.new(:address=>o).address.must_be_same_as(o)
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
it "should handle literalizing model instances" do
|
|
39
|
-
@db.literal(@c.load(:street=>'123 Foo St', :city=>'Bar City')).must_equal "ROW('123 Foo St', 'Bar City')::address"
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
it "should handle literalizing model instances when model table is aliased" do
|
|
43
|
-
@c.dataset = @c.dataset.from(Sequel.as(:address, :a))
|
|
44
|
-
@db.literal(@c.load(:street=>'123 Foo St', :city=>'Bar City')).must_equal "ROW('123 Foo St', 'Bar City')::address"
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
it "should handle model instances in bound variables" do
|
|
48
|
-
@db.bound_variable_arg(1, nil).must_equal 1
|
|
49
|
-
@db.bound_variable_arg(@c.load(:street=>'123 Foo St', :city=>'Bar City'), nil).must_equal '("123 Foo St","Bar City")'
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it "should handle model instances in arrays of bound variables" do
|
|
53
|
-
@db.bound_variable_arg(1, nil).must_equal 1
|
|
54
|
-
@db.bound_variable_arg(Sequel.pg_array([@c.load(:street=>'123 Foo St', :city=>'Bar City')]), nil).must_equal '{"(\\"123 Foo St\\",\\"Bar City\\")"}'
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
it "should allow inserting just this model value" do
|
|
58
|
-
@c2.dataset.insert_sql(@c.load(:street=>'123', :city=>'Bar')).must_equal "INSERT INTO company VALUES (ROW('123', 'Bar')::address)"
|
|
59
|
-
end
|
|
60
|
-
end
|
|
@@ -1,363 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe "pg_row extension" do
|
|
4
|
-
before do
|
|
5
|
-
@db = Sequel.connect('mock://postgres')
|
|
6
|
-
@db.extend_datasets{def quote_identifiers?; false end}
|
|
7
|
-
@db.extension(:pg_array, :pg_row)
|
|
8
|
-
@m = Sequel::Postgres::PGRow
|
|
9
|
-
@db.sqls
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
it "should parse record objects as arrays" do
|
|
13
|
-
a = @db.conversion_procs[2249].call("(a,b,c)")
|
|
14
|
-
a.class.must_equal(@m::ArrayRow)
|
|
15
|
-
a.to_a.must_be_kind_of(Array)
|
|
16
|
-
a[0].must_equal 'a'
|
|
17
|
-
a.must_equal %w'a b c'
|
|
18
|
-
a.db_type.must_be_nil
|
|
19
|
-
@db.literal(a).must_equal "ROW('a', 'b', 'c')"
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
it "should parse arrays of record objects as arrays of arrays" do
|
|
23
|
-
as = @db.conversion_procs[2287].call('{"(a,b,c)","(d,e,f)"}')
|
|
24
|
-
as.must_equal [%w'a b c', %w'd e f']
|
|
25
|
-
as.each do |a|
|
|
26
|
-
a.class.must_equal(@m::ArrayRow)
|
|
27
|
-
a.to_a.must_be_kind_of(Array)
|
|
28
|
-
a.db_type.must_be_nil
|
|
29
|
-
end
|
|
30
|
-
@db.literal(as).must_equal "ARRAY[ROW('a', 'b', 'c'),ROW('d', 'e', 'f')]::record[]"
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
it "should be able to register custom parsing of row types as array-like objects" do
|
|
34
|
-
klass = @m::ArrayRow.subclass(:foo)
|
|
35
|
-
parser = @m::Parser.new(:converter=>klass)
|
|
36
|
-
a = parser.call("(a,b,c)")
|
|
37
|
-
a.class.must_equal(klass)
|
|
38
|
-
a.to_a.must_be_kind_of(Array)
|
|
39
|
-
a[0].must_equal 'a'
|
|
40
|
-
a.must_equal %w'a b c'
|
|
41
|
-
a.db_type.must_equal :foo
|
|
42
|
-
@db.literal(a).must_equal "ROW('a', 'b', 'c')::foo"
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
it "should be able to register custom parsing of row types as hash-like objects" do
|
|
46
|
-
klass = @m::HashRow.subclass(:foo, [:a, :b, :c])
|
|
47
|
-
parser = @m::Parser.new(:converter=>klass, :columns=>[:a, :b, :c])
|
|
48
|
-
a = parser.call("(a,b,c)")
|
|
49
|
-
a.class.must_equal(klass)
|
|
50
|
-
a.to_hash.must_be_kind_of(Hash)
|
|
51
|
-
a[:a].must_equal 'a'
|
|
52
|
-
a.must_equal(:a=>'a', :b=>'b', :c=>'c')
|
|
53
|
-
a.db_type.must_equal :foo
|
|
54
|
-
a.columns.must_equal [:a, :b, :c]
|
|
55
|
-
@db.literal(a).must_equal "ROW('a', 'b', 'c')::foo"
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
it "should raise an error if attempting to literalize a HashRow without column information" do
|
|
59
|
-
h = @m::HashRow.call(:a=>'a', :b=>'b', :c=>'c')
|
|
60
|
-
proc{@db.literal(h)}.must_raise(Sequel::Error)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
it "should be able to manually override db_type per ArrayRow instance" do
|
|
64
|
-
a = @m::ArrayRow.call(%w'a b c')
|
|
65
|
-
a.db_type = :foo
|
|
66
|
-
@db.literal(a).must_equal "ROW('a', 'b', 'c')::foo"
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
it "should be able to manually override db_type and columns per HashRow instance" do
|
|
70
|
-
h = @m::HashRow.call(:a=>'a', :c=>'c', :b=>'b')
|
|
71
|
-
h.db_type = :foo
|
|
72
|
-
h.columns = [:a, :b, :c]
|
|
73
|
-
@db.literal(h).must_equal "ROW('a', 'b', 'c')::foo"
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
it "should correctly split an empty row" do
|
|
77
|
-
@m::Splitter.new("()").parse.must_equal [nil]
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
it "should correctly split a row with a single value" do
|
|
81
|
-
@m::Splitter.new("(1)").parse.must_equal %w'1'
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
it "should correctly split a row with multiple values" do
|
|
85
|
-
@m::Splitter.new("(1,2)").parse.must_equal %w'1 2'
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
it "should correctly NULL values when splitting" do
|
|
89
|
-
@m::Splitter.new("(1,)").parse.must_equal ['1', nil]
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
it "should correctly empty string values when splitting" do
|
|
93
|
-
@m::Splitter.new('(1,"")').parse.must_equal ['1', '']
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
it "should handle quoted values when splitting" do
|
|
97
|
-
@m::Splitter.new('("1","2")').parse.must_equal %w'1 2'
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
it "should handle escaped backslashes in quoted values when splitting" do
|
|
101
|
-
@m::Splitter.new('("\\\\1","2\\\\")').parse.must_equal ['\\1', '2\\']
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
it "should handle doubled quotes in quoted values when splitting" do
|
|
105
|
-
@m::Splitter.new('("""1","2""")').parse.must_equal ['"1', '2"']
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
it "should correctly convert types when parsing into an array" do
|
|
109
|
-
@m::Parser.new(:column_converters=>[proc{|s| s*2}, proc{|s| s*3}, proc{|s| s*4}]).call("(a,b,c)").must_equal %w'aa bbb cccc'
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
it "should correctly convert types into hashes if columns are known" do
|
|
113
|
-
@m::Parser.new(:columns=>[:a, :b, :c]).call("(a,b,c)").must_equal(:a=>'a', :b=>'b', :c=>'c')
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
it "should correctly handle type conversion when converting into hashes" do
|
|
117
|
-
@m::Parser.new(:column_converters=>[proc{|s| s*2}, proc{|s| s*3}, proc{|s| s*4}], :columns=>[:a, :b, :c]).call("(a,b,c)").must_equal(:a=>'aa', :b=>'bbb', :c=>'cccc')
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
it "should correctly wrap arrays when converting" do
|
|
121
|
-
@m::Parser.new(:converter=>proc{|s| [:foo, s]}).call("(a,b,c)").must_equal [:foo, %w'a b c']
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
it "should correctly wrap hashes when converting" do
|
|
125
|
-
@m::Parser.new(:converter=>proc{|s| [:foo, s]}, :columns=>[:a, :b, :c]).call("(a,b,c)").must_equal [:foo, {:a=>'a', :b=>'b', :c=>'c'}]
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
it "should have parser store reflection information" do
|
|
129
|
-
p = @m::Parser.new(:oid=>1, :column_oids=>[2], :columns=>[:a], :converter=>Array, :typecaster=>Hash, :column_converters=>[Array])
|
|
130
|
-
p.oid.must_equal 1
|
|
131
|
-
p.column_oids.must_equal [2]
|
|
132
|
-
p.columns.must_equal [:a]
|
|
133
|
-
p.converter.must_equal Array
|
|
134
|
-
p.typecaster.must_equal Hash
|
|
135
|
-
p.column_converters.must_equal [Array]
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
it "should handle ArrayRows and HashRows in bound variables" do
|
|
139
|
-
@db.bound_variable_arg(1, nil).must_equal 1
|
|
140
|
-
@db.bound_variable_arg(@m::ArrayRow.call(["1", "abc\\'\","]), nil).must_equal '("1","abc\\\\\'\\",")'
|
|
141
|
-
@db.bound_variable_arg(@m::HashRow.subclass(nil, [:a, :b]).call(:a=>"1", :b=>"abc\\'\","), nil).must_equal '("1","abc\\\\\'\\",")'
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
it "should handle ArrayRows and HashRows in arrays in bound variables" do
|
|
145
|
-
@db.bound_variable_arg(1, nil).must_equal 1
|
|
146
|
-
@db.bound_variable_arg([@m::ArrayRow.call(["1", "abc\\'\","])], nil).must_equal '{"(\\"1\\",\\"abc\\\\\\\\\'\\\\\\",\\")"}'
|
|
147
|
-
@db.bound_variable_arg([@m::HashRow.subclass(nil, [:a, :b]).call(:a=>"1", :b=>"abc\\'\",")], nil).must_equal '{"(\\"1\\",\\"abc\\\\\\\\\'\\\\\\",\\")"}'
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
it "should handle nils in bound variables" do
|
|
151
|
-
@db.bound_variable_arg(@m::ArrayRow.call([nil, nil]), nil).must_equal '(,)'
|
|
152
|
-
@db.bound_variable_arg(@m::HashRow.subclass(nil, [:a, :b]).call(:a=>nil, :b=>nil), nil).must_equal '(,)'
|
|
153
|
-
@db.bound_variable_arg([@m::ArrayRow.call([nil, nil])], nil).must_equal '{"(,)"}'
|
|
154
|
-
@db.bound_variable_arg([@m::HashRow.subclass(nil, [:a, :b]).call(:a=>nil, :b=>nil)], nil).must_equal '{"(,)"}'
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
it "should allow registering row type parsers by introspecting system tables" do
|
|
158
|
-
@db.conversion_procs[4] = p4 = proc{|s| s.to_i}
|
|
159
|
-
@db.conversion_procs[5] = p5 = proc{|s| s * 2}
|
|
160
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
161
|
-
@db.register_row_type(:foo)
|
|
162
|
-
@db.sqls.must_equal ["SELECT pg_type.oid, typrelid, typarray FROM pg_type WHERE ((typtype = 'c') AND (typname = 'foo')) LIMIT 1",
|
|
163
|
-
"SELECT attname, (CASE pg_type.typbasetype WHEN 0 THEN atttypid ELSE pg_type.typbasetype END) AS atttypid FROM pg_attribute INNER JOIN pg_type ON (pg_type.oid = pg_attribute.atttypid) WHERE ((attrelid = 2) AND (attnum > 0) AND NOT attisdropped) ORDER BY attnum"]
|
|
164
|
-
p1 = @db.conversion_procs[1]
|
|
165
|
-
p1.columns.must_equal [:bar, :baz]
|
|
166
|
-
p1.column_oids.must_equal [4, 5]
|
|
167
|
-
p1.column_converters.must_equal [p4, p5]
|
|
168
|
-
p1.oid.must_equal 1
|
|
169
|
-
@db.send(:schema_column_type, 'foo').must_equal :pg_row_foo
|
|
170
|
-
@db.send(:schema_column_type, 'integer').must_equal :integer
|
|
171
|
-
|
|
172
|
-
c = p1.converter
|
|
173
|
-
c.superclass.must_equal @m::HashRow
|
|
174
|
-
c.columns.must_equal [:bar, :baz]
|
|
175
|
-
c.db_type.must_equal :foo
|
|
176
|
-
p1.typecaster.must_equal c
|
|
177
|
-
|
|
178
|
-
p1.call('(1,b)').must_equal(:bar=>1, :baz=>'bb')
|
|
179
|
-
@db.typecast_value(:pg_row_foo, %w'1 b').class.must_be :<, @m::HashRow
|
|
180
|
-
@db.typecast_value(:pg_row_foo, %w'1 b').must_equal(:bar=>'1', :baz=>'b')
|
|
181
|
-
@db.typecast_value(:pg_row_foo, :bar=>'1', :baz=>'b').must_equal(:bar=>'1', :baz=>'b')
|
|
182
|
-
@db.literal(p1.call('(1,b)')).must_equal "ROW(1, 'bb')::foo"
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
it "should allow registering row type parsers for schema qualify types" do
|
|
186
|
-
@db.conversion_procs[4] = p4 = proc{|s| s.to_i}
|
|
187
|
-
@db.conversion_procs[5] = p5 = proc{|s| s * 2}
|
|
188
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
189
|
-
@db.register_row_type(Sequel[:foo][:bar])
|
|
190
|
-
@db.sqls.must_equal ["SELECT pg_type.oid, typrelid, typarray FROM pg_type INNER JOIN pg_namespace ON ((pg_namespace.oid = pg_type.typnamespace) AND (pg_namespace.nspname = 'foo')) WHERE ((typtype = 'c') AND (typname = 'bar')) LIMIT 1",
|
|
191
|
-
"SELECT attname, (CASE pg_type.typbasetype WHEN 0 THEN atttypid ELSE pg_type.typbasetype END) AS atttypid FROM pg_attribute INNER JOIN pg_type ON (pg_type.oid = pg_attribute.atttypid) WHERE ((attrelid = 2) AND (attnum > 0) AND NOT attisdropped) ORDER BY attnum"]
|
|
192
|
-
p1 = @db.conversion_procs[1]
|
|
193
|
-
p1.columns.must_equal [:bar, :baz]
|
|
194
|
-
p1.column_oids.must_equal [4, 5]
|
|
195
|
-
p1.column_converters.must_equal [p4, p5]
|
|
196
|
-
p1.oid.must_equal 1
|
|
197
|
-
|
|
198
|
-
c = p1.converter
|
|
199
|
-
c.superclass.must_equal @m::HashRow
|
|
200
|
-
c.columns.must_equal [:bar, :baz]
|
|
201
|
-
c.db_type.must_equal Sequel[:foo][:bar]
|
|
202
|
-
p1.typecaster.must_equal c
|
|
203
|
-
|
|
204
|
-
p1.call('(1,b)').must_equal(:bar=>1, :baz=>'bb')
|
|
205
|
-
@db.typecast_value(:pg_row_foo__bar, %w'1 b').must_equal(:bar=>'1', :baz=>'b')
|
|
206
|
-
@db.typecast_value(:pg_row_foo__bar, :bar=>'1', :baz=>'b').must_equal(:bar=>'1', :baz=>'b')
|
|
207
|
-
@db.literal(p1.call('(1,b)')).must_equal "ROW(1, 'bb')::foo.bar"
|
|
208
|
-
end
|
|
209
|
-
|
|
210
|
-
with_symbol_splitting "should allow registering row type parsers for schema qualify type symbols" do
|
|
211
|
-
@db.conversion_procs[4] = p4 = proc{|s| s.to_i}
|
|
212
|
-
@db.conversion_procs[5] = p5 = proc{|s| s * 2}
|
|
213
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
214
|
-
@db.register_row_type(:foo__bar)
|
|
215
|
-
@db.sqls.must_equal ["SELECT pg_type.oid, typrelid, typarray FROM pg_type INNER JOIN pg_namespace ON ((pg_namespace.oid = pg_type.typnamespace) AND (pg_namespace.nspname = 'foo')) WHERE ((typtype = 'c') AND (typname = 'bar')) LIMIT 1",
|
|
216
|
-
"SELECT attname, (CASE pg_type.typbasetype WHEN 0 THEN atttypid ELSE pg_type.typbasetype END) AS atttypid FROM pg_attribute INNER JOIN pg_type ON (pg_type.oid = pg_attribute.atttypid) WHERE ((attrelid = 2) AND (attnum > 0) AND NOT attisdropped) ORDER BY attnum"]
|
|
217
|
-
p1 = @db.conversion_procs[1]
|
|
218
|
-
p1.columns.must_equal [:bar, :baz]
|
|
219
|
-
p1.column_oids.must_equal [4, 5]
|
|
220
|
-
p1.column_converters.must_equal [p4, p5]
|
|
221
|
-
p1.oid.must_equal 1
|
|
222
|
-
|
|
223
|
-
c = p1.converter
|
|
224
|
-
c.superclass.must_equal @m::HashRow
|
|
225
|
-
c.columns.must_equal [:bar, :baz]
|
|
226
|
-
c.db_type.must_equal :foo__bar
|
|
227
|
-
p1.typecaster.must_equal c
|
|
228
|
-
|
|
229
|
-
p1.call('(1,b)').must_equal(:bar=>1, :baz=>'bb')
|
|
230
|
-
@db.typecast_value(:pg_row_foo__bar, %w'1 b').must_equal(:bar=>'1', :baz=>'b')
|
|
231
|
-
@db.typecast_value(:pg_row_foo__bar, :bar=>'1', :baz=>'b').must_equal(:bar=>'1', :baz=>'b')
|
|
232
|
-
@db.literal(p1.call('(1,b)')).must_equal "ROW(1, 'bb')::foo.bar"
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
it "should not allow registering on a frozen database" do
|
|
236
|
-
@db.conversion_procs[4] = proc{|s| s.to_i}
|
|
237
|
-
@db.conversion_procs[5] = proc{|s| s * 2}
|
|
238
|
-
@db.fetch = [[], [{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
239
|
-
c = proc{|h| [h]}
|
|
240
|
-
@db.freeze
|
|
241
|
-
proc{@db.register_row_type(:foo, :converter=>c)}.must_raise RuntimeError, TypeError
|
|
242
|
-
end
|
|
243
|
-
|
|
244
|
-
it "should allow registering with a custom converter" do
|
|
245
|
-
@db.conversion_procs[4] = proc{|s| s.to_i}
|
|
246
|
-
@db.conversion_procs[5] = proc{|s| s * 2}
|
|
247
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
248
|
-
c = proc{|h| [h]}
|
|
249
|
-
@db.register_row_type(:foo, :converter=>c)
|
|
250
|
-
o = @db.conversion_procs[1].call('(1,b)')
|
|
251
|
-
o.must_equal [{:bar=>1, :baz=>'bb'}]
|
|
252
|
-
o.first.must_be_kind_of(Hash)
|
|
253
|
-
end
|
|
254
|
-
|
|
255
|
-
it "should allow registering with a custom typecaster" do
|
|
256
|
-
@db.conversion_procs[4] = proc{|s| s.to_i}
|
|
257
|
-
@db.conversion_procs[5] = proc{|s| s * 2}
|
|
258
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
259
|
-
@db.register_row_type(:foo, :typecaster=>proc{|h| {:bar=>(h[:bar]||0).to_i, :baz=>(h[:baz] || 'a')*2}})
|
|
260
|
-
@db.typecast_value(:pg_row_foo, %w'1 b').must_be_kind_of(Hash)
|
|
261
|
-
@db.typecast_value(:pg_row_foo, %w'1 b').must_equal(:bar=>1, :baz=>'bb')
|
|
262
|
-
@db.typecast_value(:pg_row_foo, :bar=>'1', :baz=>'b').must_equal(:bar=>1, :baz=>'bb')
|
|
263
|
-
@db.typecast_value(:pg_row_foo, 'bar'=>'1', 'baz'=>'b').must_equal(:bar=>0, :baz=>'aa')
|
|
264
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
265
|
-
@db.register_row_type(:foo, :typecaster=>proc{|h| {:bar=>(h[:bar] || h['bar'] || 0).to_i, :baz=>(h[:baz] || h['baz'] || 'a')*2}})
|
|
266
|
-
@db.typecast_value(:pg_row_foo, %w'1 b').must_equal(:bar=>1, :baz=>'bb')
|
|
267
|
-
@db.typecast_value(:pg_row_foo, :bar=>'1', :baz=>'b').must_equal(:bar=>1, :baz=>'bb')
|
|
268
|
-
@db.typecast_value(:pg_row_foo, 'bar'=>'1', 'baz'=>'b').must_equal(:bar=>1, :baz=>'bb')
|
|
269
|
-
end
|
|
270
|
-
|
|
271
|
-
it "should handle nil values when converting columns" do
|
|
272
|
-
@db.conversion_procs[5] = proc{|s| s * 2}
|
|
273
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}]]
|
|
274
|
-
called = false
|
|
275
|
-
@db.conversion_procs[4] = proc{|s| called = true; s}
|
|
276
|
-
@db.register_row_type(:foo)
|
|
277
|
-
@db.conversion_procs[1].call('()').must_equal(:bar=>nil)
|
|
278
|
-
called.must_equal false
|
|
279
|
-
end
|
|
280
|
-
|
|
281
|
-
it "should registering array type for row type if type has an array oid" do
|
|
282
|
-
@db.conversion_procs[4] = proc{|s| s.to_i}
|
|
283
|
-
@db.conversion_procs[5] = proc{|s| s * 2}
|
|
284
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
285
|
-
@db.register_row_type(:foo, :typecaster=>proc{|h| {:bar=>(h[:bar]||0).to_i, :baz=>(h[:baz] || 'a')*2}})
|
|
286
|
-
p3 = @db.conversion_procs[3]
|
|
287
|
-
|
|
288
|
-
p3.call('{"(1,b)"}').must_equal [{:bar=>1, :baz=>'bb'}]
|
|
289
|
-
@db.literal(p3.call('{"(1,b)"}')).must_equal "ARRAY[ROW(1, 'bb')::foo]::foo[]"
|
|
290
|
-
@db.typecast_value(:foo_array, [{:bar=>'1', :baz=>'b'}]).must_equal [{:bar=>1, :baz=>'bb'}]
|
|
291
|
-
end
|
|
292
|
-
|
|
293
|
-
it "should allow creating unregisted row types via Database#row_type" do
|
|
294
|
-
@db.literal(@db.row_type(:foo, [1, 2])).must_equal 'ROW(1, 2)::foo'
|
|
295
|
-
end
|
|
296
|
-
|
|
297
|
-
it "should allow typecasting of registered row types via Database#row_type" do
|
|
298
|
-
@db.conversion_procs[4] = proc{|s| s.to_i}
|
|
299
|
-
@db.conversion_procs[5] = proc{|s| s * 2}
|
|
300
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
301
|
-
@db.register_row_type(:foo, :typecaster=>proc{|h| @m::HashRow.subclass(:foo, [:bar, :baz]).new({:bar=>(h[:bar]||0).to_i, :baz=>(h[:baz] || 'a')*2})})
|
|
302
|
-
@db.literal(@db.row_type(:foo, ['1', 'b'])).must_equal "ROW(1, 'bb')::foo"
|
|
303
|
-
@db.literal(@db.row_type(:foo, {:bar=>'1', :baz=>'b'})).must_equal "ROW(1, 'bb')::foo"
|
|
304
|
-
end
|
|
305
|
-
|
|
306
|
-
it "should allow parsing when typecasting registered row types via Database#row_type" do
|
|
307
|
-
@db.conversion_procs[4] = proc{|s| s.to_i}
|
|
308
|
-
@db.conversion_procs[5] = proc{|s| s * 2}
|
|
309
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
310
|
-
@db.register_row_type(:foo, :typecaster=>proc{|h| @m::HashRow.subclass(:foo, [:bar, :baz]).new(:bar=>(h[:bar]||0).to_i, :baz=>(h[:baz] || 'a')*2)})
|
|
311
|
-
@db.literal(@db.row_type(:foo, ['1', 'b'])).must_equal "ROW(1, 'bb')::foo"
|
|
312
|
-
end
|
|
313
|
-
|
|
314
|
-
it "should raise an error if attempt to use Database#row_type with an unregistered type and hash" do
|
|
315
|
-
proc{@db.literal(@db.row_type(:foo, {:bar=>'1', :baz=>'b'}))}.must_raise(Sequel::InvalidValue)
|
|
316
|
-
end
|
|
317
|
-
|
|
318
|
-
it "should raise an error if attempt to use Database#row_type with an unhandled type" do
|
|
319
|
-
proc{@db.literal(@db.row_type(:foo, 1))}.must_raise(Sequel::InvalidValue)
|
|
320
|
-
end
|
|
321
|
-
|
|
322
|
-
it "should return ArrayRow and HashRow values as-is" do
|
|
323
|
-
h = @m::HashRow.call(:a=>1)
|
|
324
|
-
a = @m::ArrayRow.call([1])
|
|
325
|
-
@db.row_type(:foo, h).object_id.must_equal(h.object_id)
|
|
326
|
-
@db.row_type(:foo, a).object_id.must_equal(a.object_id)
|
|
327
|
-
end
|
|
328
|
-
|
|
329
|
-
it "should have Sequel.pg_row return a plain ArrayRow" do
|
|
330
|
-
@db.literal(Sequel.pg_row([1, 2, 3])).must_equal 'ROW(1, 2, 3)'
|
|
331
|
-
end
|
|
332
|
-
|
|
333
|
-
it "should raise an error if attempting to typecast a hash for a parser without columns" do
|
|
334
|
-
proc{@m::Parser.new.typecast(:a=>1)}.must_raise(Sequel::Error)
|
|
335
|
-
end
|
|
336
|
-
|
|
337
|
-
it "should raise an error if attempting to typecast a unhandled value for a parser" do
|
|
338
|
-
proc{@m::Parser.new.typecast(1)}.must_raise(Sequel::Error)
|
|
339
|
-
end
|
|
340
|
-
|
|
341
|
-
it "should handle typecasting for a parser without a typecaster" do
|
|
342
|
-
@m::Parser.new.typecast([1]).must_equal [1]
|
|
343
|
-
end
|
|
344
|
-
|
|
345
|
-
it "should raise an error if no columns are returned when registering a custom row type" do
|
|
346
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}]]
|
|
347
|
-
proc{@db.register_row_type(:foo)}.must_raise(Sequel::Error)
|
|
348
|
-
end
|
|
349
|
-
|
|
350
|
-
it "should raise an error when registering a custom row type if the type is found found" do
|
|
351
|
-
@db.fetch = []
|
|
352
|
-
proc{@db.register_row_type(:foo)}.must_raise(Sequel::Error)
|
|
353
|
-
end
|
|
354
|
-
|
|
355
|
-
it "should return correct results for Database#schema_type_class" do
|
|
356
|
-
@db.conversion_procs[4] = proc{|s| s.to_i}
|
|
357
|
-
@db.conversion_procs[5] = proc{|s| s * 2}
|
|
358
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
359
|
-
@db.register_row_type(:foo, :typecaster=>proc{|h| {:bar=>(h[:bar]||0).to_i, :baz=>(h[:baz] || 'a')*2}})
|
|
360
|
-
@db.schema_type_class(:pg_row_foo).must_equal [Sequel::Postgres::PGRow::HashRow, Sequel::Postgres::PGRow::ArrayRow]
|
|
361
|
-
@db.schema_type_class(:integer).must_equal Integer
|
|
362
|
-
end
|
|
363
|
-
end
|