sequel 4.49.0 → 5.3.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 +130 -0
- data/README.rdoc +195 -136
- data/Rakefile +26 -42
- data/bin/sequel +6 -9
- data/doc/advanced_associations.rdoc +91 -168
- data/doc/association_basics.rdoc +197 -274
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +66 -43
- data/doc/code_order.rdoc +1 -8
- data/doc/core_extensions.rdoc +81 -56
- data/doc/dataset_basics.rdoc +8 -17
- data/doc/dataset_filtering.rdoc +81 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +73 -30
- data/doc/migration.rdoc +19 -36
- data/doc/model_dataset_method_design.rdoc +14 -17
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +10 -10
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +52 -70
- data/doc/opening_databases.rdoc +39 -32
- data/doc/postgresql.rdoc +48 -38
- data/doc/prepared_statements.rdoc +27 -22
- data/doc/querying.rdoc +173 -150
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/schema_modification.rdoc +78 -64
- data/doc/security.rdoc +97 -88
- data/doc/sharding.rdoc +43 -30
- data/doc/sql.rdoc +53 -65
- data/doc/testing.rdoc +4 -5
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +18 -17
- data/doc/validations.rdoc +48 -45
- data/doc/virtual_rows.rdoc +87 -115
- data/lib/sequel/adapters/ado/access.rb +7 -13
- data/lib/sequel/adapters/ado/mssql.rb +2 -9
- data/lib/sequel/adapters/ado.rb +9 -25
- data/lib/sequel/adapters/amalgalite.rb +3 -18
- data/lib/sequel/adapters/ibmdb.rb +9 -45
- data/lib/sequel/adapters/jdbc/db2.rb +8 -37
- data/lib/sequel/adapters/jdbc/derby.rb +4 -50
- data/lib/sequel/adapters/jdbc/h2.rb +6 -26
- data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -27
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
- data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +11 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
- data/lib/sequel/adapters/jdbc/postgresql.rb +23 -33
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
- data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
- data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
- data/lib/sequel/adapters/jdbc.rb +18 -74
- data/lib/sequel/adapters/mock.rb +4 -30
- data/lib/sequel/adapters/mysql.rb +7 -44
- data/lib/sequel/adapters/mysql2.rb +5 -23
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +4 -12
- data/lib/sequel/adapters/odbc/oracle.rb +1 -1
- data/lib/sequel/adapters/odbc.rb +0 -19
- data/lib/sequel/adapters/oracle.rb +8 -13
- data/lib/sequel/adapters/postgres.rb +28 -150
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +11 -51
- data/lib/sequel/adapters/shared/db2.rb +3 -61
- data/lib/sequel/adapters/shared/mssql.rb +21 -157
- data/lib/sequel/adapters/shared/mysql.rb +61 -227
- data/lib/sequel/adapters/shared/oracle.rb +13 -41
- data/lib/sequel/adapters/shared/postgres.rb +58 -264
- data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
- data/lib/sequel/adapters/shared/sqlite.rb +22 -101
- data/lib/sequel/adapters/sqlanywhere.rb +4 -23
- data/lib/sequel/adapters/sqlite.rb +2 -19
- data/lib/sequel/adapters/tinytds.rb +5 -15
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -4
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
- data/lib/sequel/adapters/utils/replace.rb +0 -5
- data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
- data/lib/sequel/ast_transformer.rb +3 -94
- data/lib/sequel/connection_pool/sharded_single.rb +1 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
- data/lib/sequel/connection_pool/single.rb +0 -2
- data/lib/sequel/connection_pool/threaded.rb +94 -110
- data/lib/sequel/connection_pool.rb +38 -28
- data/lib/sequel/core.rb +42 -101
- data/lib/sequel/database/connecting.rb +23 -60
- data/lib/sequel/database/dataset.rb +6 -9
- data/lib/sequel/database/dataset_defaults.rb +4 -48
- data/lib/sequel/database/features.rb +5 -4
- data/lib/sequel/database/logging.rb +2 -9
- data/lib/sequel/database/misc.rb +36 -55
- data/lib/sequel/database/query.rb +8 -13
- data/lib/sequel/database/schema_generator.rb +93 -64
- data/lib/sequel/database/schema_methods.rb +61 -79
- data/lib/sequel/database/transactions.rb +4 -24
- data/lib/sequel/database.rb +12 -2
- data/lib/sequel/dataset/actions.rb +57 -107
- data/lib/sequel/dataset/dataset_module.rb +4 -16
- data/lib/sequel/dataset/features.rb +35 -30
- data/lib/sequel/dataset/graph.rb +40 -49
- data/lib/sequel/dataset/misc.rb +12 -37
- data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
- data/lib/sequel/dataset/prepared_statements.rb +23 -51
- data/lib/sequel/dataset/query.rb +91 -161
- data/lib/sequel/dataset/sql.rb +33 -225
- data/lib/sequel/dataset.rb +18 -10
- data/lib/sequel/deprecated.rb +18 -27
- data/lib/sequel/exceptions.rb +1 -17
- data/lib/sequel/extensions/_model_pg_row.rb +0 -7
- data/lib/sequel/extensions/_pretty_table.rb +1 -3
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/connection_expiration.rb +1 -1
- data/lib/sequel/extensions/connection_validator.rb +1 -1
- data/lib/sequel/extensions/constraint_validations.rb +11 -11
- data/lib/sequel/extensions/core_extensions.rb +39 -49
- data/lib/sequel/extensions/core_refinements.rb +39 -45
- data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
- data/lib/sequel/extensions/date_arithmetic.rb +7 -7
- data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/eval_inspect.rb +4 -11
- data/lib/sequel/extensions/freeze_datasets.rb +1 -69
- data/lib/sequel/extensions/from_block.rb +1 -35
- data/lib/sequel/extensions/graph_each.rb +2 -2
- data/lib/sequel/extensions/identifier_mangling.rb +9 -19
- data/lib/sequel/extensions/implicit_subquery.rb +2 -2
- data/lib/sequel/extensions/inflector.rb +4 -4
- data/lib/sequel/extensions/migration.rb +27 -43
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
- data/lib/sequel/extensions/null_dataset.rb +2 -8
- data/lib/sequel/extensions/pagination.rb +1 -17
- data/lib/sequel/extensions/pg_array.rb +20 -189
- data/lib/sequel/extensions/pg_extended_date_support.rb +230 -0
- data/lib/sequel/extensions/pg_hstore.rb +11 -50
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
- data/lib/sequel/extensions/pg_inet.rb +3 -16
- data/lib/sequel/extensions/pg_interval.rb +1 -20
- data/lib/sequel/extensions/pg_json.rb +7 -27
- data/lib/sequel/extensions/pg_loose_count.rb +1 -1
- data/lib/sequel/extensions/pg_range.rb +6 -121
- data/lib/sequel/extensions/pg_range_ops.rb +1 -3
- data/lib/sequel/extensions/pg_row.rb +5 -77
- data/lib/sequel/extensions/pg_row_ops.rb +2 -13
- data/lib/sequel/extensions/query.rb +3 -4
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/schema_dumper.rb +13 -13
- data/lib/sequel/extensions/select_remove.rb +3 -3
- data/lib/sequel/extensions/split_array_nil.rb +2 -2
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/symbol_aref.rb +6 -20
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/model/associations.rb +129 -131
- data/lib/sequel/model/base.rb +133 -731
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +0 -3
- data/lib/sequel/model/exceptions.rb +2 -6
- data/lib/sequel/model/inflections.rb +1 -26
- data/lib/sequel/model/plugins.rb +1 -0
- data/lib/sequel/model.rb +27 -62
- data/lib/sequel/plugins/active_model.rb +2 -5
- data/lib/sequel/plugins/association_dependencies.rb +15 -15
- data/lib/sequel/plugins/association_pks.rb +14 -28
- data/lib/sequel/plugins/association_proxies.rb +6 -7
- data/lib/sequel/plugins/auto_validations.rb +4 -4
- data/lib/sequel/plugins/before_after_save.rb +0 -43
- data/lib/sequel/plugins/blacklist_security.rb +9 -8
- data/lib/sequel/plugins/boolean_readers.rb +3 -3
- data/lib/sequel/plugins/boolean_subsets.rb +2 -2
- data/lib/sequel/plugins/caching.rb +5 -5
- data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
- data/lib/sequel/plugins/column_conflicts.rb +2 -2
- data/lib/sequel/plugins/column_select.rb +2 -2
- data/lib/sequel/plugins/composition.rb +15 -24
- data/lib/sequel/plugins/constraint_validations.rb +4 -3
- data/lib/sequel/plugins/csv_serializer.rb +13 -20
- data/lib/sequel/plugins/dataset_associations.rb +2 -2
- data/lib/sequel/plugins/def_dataset_method.rb +5 -5
- data/lib/sequel/plugins/defaults_setter.rb +1 -1
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/finder.rb +16 -10
- data/lib/sequel/plugins/force_encoding.rb +1 -7
- data/lib/sequel/plugins/hook_class_methods.rb +4 -106
- data/lib/sequel/plugins/input_transformer.rb +10 -11
- data/lib/sequel/plugins/insert_returning_select.rb +1 -9
- data/lib/sequel/plugins/instance_filters.rb +5 -5
- data/lib/sequel/plugins/instance_hooks.rb +7 -52
- data/lib/sequel/plugins/inverted_subsets.rb +3 -1
- data/lib/sequel/plugins/json_serializer.rb +19 -19
- data/lib/sequel/plugins/lazy_attributes.rb +1 -10
- data/lib/sequel/plugins/list.rb +6 -6
- data/lib/sequel/plugins/many_through_many.rb +11 -8
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/nested_attributes.rb +18 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +8 -2
- data/lib/sequel/plugins/pg_row.rb +2 -11
- data/lib/sequel/plugins/prepared_statements.rb +13 -66
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +7 -7
- data/lib/sequel/plugins/serialization.rb +15 -33
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +2 -8
- data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/static_cache.rb +8 -9
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +1 -1
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
- data/lib/sequel/plugins/timestamps.rb +6 -7
- data/lib/sequel/plugins/touch.rb +4 -8
- data/lib/sequel/plugins/tree.rb +3 -3
- data/lib/sequel/plugins/typecast_on_load.rb +2 -2
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/update_or_create.rb +3 -3
- data/lib/sequel/plugins/update_refresh.rb +3 -3
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validation_class_methods.rb +10 -9
- data/lib/sequel/plugins/validation_contexts.rb +4 -4
- data/lib/sequel/plugins/validation_helpers.rb +26 -25
- data/lib/sequel/plugins/whitelist_security.rb +13 -9
- data/lib/sequel/plugins/xml_serializer.rb +24 -25
- data/lib/sequel/sql.rb +145 -276
- data/lib/sequel/timezones.rb +8 -23
- data/lib/sequel/version.rb +2 -2
- data/lib/sequel.rb +1 -1
- data/spec/adapter_spec.rb +1 -1
- data/spec/adapters/db2_spec.rb +2 -103
- data/spec/adapters/mssql_spec.rb +89 -68
- data/spec/adapters/mysql_spec.rb +111 -478
- data/spec/adapters/oracle_spec.rb +1 -9
- data/spec/adapters/postgres_spec.rb +459 -664
- data/spec/adapters/spec_helper.rb +12 -31
- data/spec/adapters/sqlanywhere_spec.rb +2 -77
- data/spec/adapters/sqlite_spec.rb +8 -146
- data/spec/bin_spec.rb +11 -16
- data/spec/core/connection_pool_spec.rb +173 -74
- data/spec/core/database_spec.rb +96 -244
- data/spec/core/dataset_spec.rb +99 -414
- data/spec/core/deprecated_spec.rb +3 -3
- data/spec/core/expression_filters_spec.rb +37 -144
- data/spec/core/mock_adapter_spec.rb +241 -4
- data/spec/core/object_graph_spec.rb +11 -60
- data/spec/core/placeholder_literalizer_spec.rb +1 -14
- data/spec/core/schema_generator_spec.rb +51 -40
- data/spec/core/schema_spec.rb +88 -77
- data/spec/core/spec_helper.rb +6 -24
- data/spec/core/version_spec.rb +1 -1
- data/spec/core_extensions_spec.rb +7 -83
- data/spec/core_model_spec.rb +2 -2
- data/spec/deprecation_helper.rb +2 -14
- data/spec/extensions/accessed_columns_spec.rb +1 -1
- data/spec/extensions/active_model_spec.rb +3 -3
- data/spec/extensions/after_initialize_spec.rb +1 -1
- data/spec/extensions/arbitrary_servers_spec.rb +2 -2
- data/spec/extensions/association_dependencies_spec.rb +1 -1
- data/spec/extensions/association_pks_spec.rb +30 -92
- data/spec/extensions/association_proxies_spec.rb +1 -1
- data/spec/extensions/auto_literal_strings_spec.rb +1 -12
- data/spec/extensions/auto_validations_spec.rb +1 -1
- data/spec/extensions/blacklist_security_spec.rb +1 -1
- data/spec/extensions/blank_spec.rb +1 -1
- data/spec/extensions/boolean_readers_spec.rb +1 -1
- data/spec/extensions/boolean_subsets_spec.rb +1 -1
- data/spec/extensions/caching_spec.rb +1 -1
- data/spec/extensions/class_table_inheritance_spec.rb +53 -1118
- data/spec/extensions/column_conflicts_spec.rb +1 -1
- data/spec/extensions/column_select_spec.rb +4 -4
- data/spec/extensions/columns_introspection_spec.rb +1 -1
- data/spec/extensions/columns_updated_spec.rb +1 -1
- data/spec/extensions/composition_spec.rb +8 -30
- data/spec/extensions/connection_expiration_spec.rb +3 -3
- data/spec/extensions/connection_validator_spec.rb +3 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
- data/spec/extensions/constraint_validations_spec.rb +1 -1
- data/spec/extensions/core_refinements_spec.rb +1 -3
- data/spec/extensions/csv_serializer_spec.rb +4 -9
- data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +2 -1
- data/spec/extensions/dataset_source_alias_spec.rb +1 -1
- data/spec/extensions/date_arithmetic_spec.rb +3 -3
- data/spec/extensions/def_dataset_method_spec.rb +1 -1
- data/spec/extensions/defaults_setter_spec.rb +2 -2
- data/spec/extensions/delay_add_association_spec.rb +8 -9
- data/spec/extensions/dirty_spec.rb +1 -1
- data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
- data/spec/extensions/eager_each_spec.rb +2 -2
- data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
- data/spec/extensions/error_splitter_spec.rb +1 -1
- data/spec/extensions/error_sql_spec.rb +1 -1
- data/spec/extensions/eval_inspect_spec.rb +1 -1
- data/spec/extensions/finder_spec.rb +1 -1
- data/spec/extensions/force_encoding_spec.rb +2 -5
- data/spec/extensions/freeze_datasets_spec.rb +1 -1
- data/spec/extensions/graph_each_spec.rb +5 -5
- data/spec/extensions/hook_class_methods_spec.rb +1 -194
- data/spec/extensions/identifier_mangling_spec.rb +17 -170
- data/spec/extensions/implicit_subquery_spec.rb +1 -5
- data/spec/extensions/inflector_spec.rb +1 -1
- data/spec/extensions/input_transformer_spec.rb +7 -2
- data/spec/extensions/insert_returning_select_spec.rb +1 -1
- data/spec/extensions/instance_filters_spec.rb +1 -1
- data/spec/extensions/instance_hooks_spec.rb +1 -95
- data/spec/extensions/inverted_subsets_spec.rb +1 -1
- data/spec/extensions/json_serializer_spec.rb +1 -1
- data/spec/extensions/lazy_attributes_spec.rb +1 -7
- data/spec/extensions/list_spec.rb +5 -6
- data/spec/extensions/looser_typecasting_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +25 -33
- data/spec/extensions/migration_spec.rb +12 -2
- data/spec/extensions/modification_detection_spec.rb +1 -1
- data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
- data/spec/extensions/named_timezones_spec.rb +3 -3
- data/spec/extensions/nested_attributes_spec.rb +1 -29
- data/spec/extensions/null_dataset_spec.rb +1 -11
- data/spec/extensions/optimistic_locking_spec.rb +2 -2
- data/spec/extensions/pagination_spec.rb +1 -1
- data/spec/extensions/pg_array_associations_spec.rb +22 -26
- data/spec/extensions/pg_array_ops_spec.rb +1 -1
- data/spec/extensions/pg_array_spec.rb +3 -48
- data/spec/extensions/pg_enum_spec.rb +1 -1
- data/spec/extensions/pg_extended_date_support_spec.rb +122 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
- data/spec/extensions/pg_hstore_spec.rb +22 -31
- data/spec/extensions/pg_inet_ops_spec.rb +1 -1
- data/spec/extensions/pg_inet_spec.rb +1 -14
- data/spec/extensions/pg_interval_spec.rb +3 -13
- data/spec/extensions/pg_json_ops_spec.rb +1 -1
- data/spec/extensions/pg_json_spec.rb +1 -13
- data/spec/extensions/pg_loose_count_spec.rb +1 -1
- data/spec/extensions/pg_range_ops_spec.rb +1 -1
- data/spec/extensions/pg_range_spec.rb +3 -88
- data/spec/extensions/pg_row_ops_spec.rb +1 -1
- data/spec/extensions/pg_row_plugin_spec.rb +1 -1
- data/spec/extensions/pg_row_spec.rb +1 -44
- data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
- data/spec/extensions/prepared_statements_safe_spec.rb +7 -7
- data/spec/extensions/prepared_statements_spec.rb +13 -48
- data/spec/extensions/pretty_table_spec.rb +40 -9
- data/spec/extensions/query_spec.rb +1 -12
- data/spec/extensions/rcte_tree_spec.rb +23 -34
- data/spec/extensions/round_timestamps_spec.rb +1 -5
- data/spec/extensions/s_spec.rb +1 -1
- data/spec/extensions/schema_caching_spec.rb +1 -1
- data/spec/extensions/schema_dumper_spec.rb +43 -32
- data/spec/extensions/select_remove_spec.rb +1 -1
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
- data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
- data/spec/extensions/serialization_spec.rb +5 -17
- data/spec/extensions/server_block_spec.rb +1 -1
- data/spec/extensions/server_logging_spec.rb +2 -2
- data/spec/extensions/sharding_spec.rb +1 -1
- data/spec/extensions/shared_caching_spec.rb +1 -28
- data/spec/extensions/single_table_inheritance_spec.rb +2 -5
- data/spec/extensions/singular_table_names_spec.rb +1 -1
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +5 -27
- data/spec/extensions/split_array_nil_spec.rb +1 -1
- data/spec/extensions/split_values_spec.rb +1 -1
- data/spec/extensions/sql_comments_spec.rb +1 -1
- data/spec/extensions/sql_expr_spec.rb +1 -1
- data/spec/extensions/static_cache_spec.rb +1 -1
- data/spec/extensions/string_agg_spec.rb +2 -2
- data/spec/extensions/string_date_time_spec.rb +1 -1
- data/spec/extensions/string_stripper_spec.rb +1 -1
- data/spec/extensions/subclasses_spec.rb +1 -1
- data/spec/extensions/subset_conditions_spec.rb +1 -1
- data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
- data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
- data/spec/extensions/synchronize_sql_spec.rb +124 -0
- data/spec/extensions/table_select_spec.rb +4 -4
- data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
- data/spec/extensions/thread_local_timezones_spec.rb +1 -1
- data/spec/extensions/timestamps_spec.rb +5 -7
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +1 -1
- data/spec/extensions/tree_spec.rb +1 -1
- data/spec/extensions/typecast_on_load_spec.rb +1 -1
- data/spec/extensions/unlimited_update_spec.rb +1 -1
- data/spec/extensions/update_or_create_spec.rb +12 -16
- data/spec/extensions/update_primary_key_spec.rb +4 -3
- data/spec/extensions/update_refresh_spec.rb +1 -1
- data/spec/extensions/uuid_spec.rb +10 -13
- data/spec/extensions/validate_associated_spec.rb +1 -1
- data/spec/extensions/validation_class_methods_spec.rb +3 -3
- data/spec/extensions/validation_contexts_spec.rb +1 -1
- data/spec/extensions/validation_helpers_spec.rb +10 -44
- data/spec/extensions/whitelist_security_spec.rb +5 -5
- data/spec/extensions/xml_serializer_spec.rb +8 -13
- data/spec/guards_helper.rb +2 -1
- data/spec/integration/associations_test.rb +1 -23
- data/spec/integration/database_test.rb +7 -7
- data/spec/integration/dataset_test.rb +12 -47
- data/spec/integration/eager_loader_test.rb +1 -1
- data/spec/integration/migrator_test.rb +1 -1
- data/spec/integration/model_test.rb +4 -82
- data/spec/integration/plugin_test.rb +7 -23
- data/spec/integration/prepared_statement_test.rb +8 -88
- data/spec/integration/schema_test.rb +10 -10
- data/spec/integration/spec_helper.rb +17 -21
- data/spec/integration/timezone_test.rb +5 -5
- data/spec/integration/transaction_test.rb +3 -55
- data/spec/integration/type_test.rb +9 -9
- data/spec/model/association_reflection_spec.rb +24 -9
- data/spec/model/associations_spec.rb +124 -303
- data/spec/model/base_spec.rb +43 -137
- data/spec/model/class_dataset_methods_spec.rb +2 -20
- data/spec/model/dataset_methods_spec.rb +1 -20
- data/spec/model/eager_loading_spec.rb +48 -17
- data/spec/model/hooks_spec.rb +5 -300
- data/spec/model/inflector_spec.rb +1 -1
- data/spec/model/model_spec.rb +29 -339
- data/spec/model/plugins_spec.rb +2 -16
- data/spec/model/record_spec.rb +33 -129
- data/spec/model/spec_helper.rb +5 -15
- data/spec/model/validations_spec.rb +1 -1
- data/spec/sequel_warning.rb +1 -12
- metadata +19 -65
- data/doc/active_record.rdoc +0 -927
- data/lib/sequel/adapters/cubrid.rb +0 -160
- data/lib/sequel/adapters/do/mysql.rb +0 -69
- data/lib/sequel/adapters/do/postgres.rb +0 -46
- data/lib/sequel/adapters/do/sqlite3.rb +0 -41
- data/lib/sequel/adapters/do.rb +0 -166
- data/lib/sequel/adapters/jdbc/as400.rb +0 -92
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
- data/lib/sequel/adapters/odbc/progress.rb +0 -12
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -261
- data/lib/sequel/adapters/shared/informix.rb +0 -63
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift/mysql.rb +0 -50
- data/lib/sequel/adapters/swift/postgres.rb +0 -49
- data/lib/sequel/adapters/swift/sqlite.rb +0 -48
- data/lib/sequel/adapters/swift.rb +0 -169
- data/lib/sequel/adapters/utils/pg_types.rb +0 -4
- data/lib/sequel/dataset/mutation.rb +0 -98
- data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
- data/lib/sequel/extensions/filter_having.rb +0 -65
- data/lib/sequel/extensions/hash_aliases.rb +0 -51
- data/lib/sequel/extensions/meta_def.rb +0 -37
- data/lib/sequel/extensions/query_literals.rb +0 -86
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
- data/lib/sequel/extensions/set_overrides.rb +0 -82
- data/lib/sequel/no_core_ext.rb +0 -4
- data/lib/sequel/plugins/association_autoreloading.rb +0 -11
- data/lib/sequel/plugins/identifier_columns.rb +0 -49
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
- data/lib/sequel/plugins/schema.rb +0 -84
- data/lib/sequel/plugins/scissors.rb +0 -37
- data/spec/core/dataset_mutation_spec.rb +0 -253
- data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/filter_having_spec.rb +0 -42
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/hash_aliases_spec.rb +0 -26
- data/spec/extensions/identifier_columns_spec.rb +0 -19
- data/spec/extensions/meta_def_spec.rb +0 -35
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
- data/spec/extensions/query_literals_spec.rb +0 -185
- data/spec/extensions/schema_spec.rb +0 -123
- data/spec/extensions/scissors_spec.rb +0 -27
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
- data/spec/extensions/set_overrides_spec.rb +0 -75
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative "spec_helper"
|
|
2
2
|
|
|
3
3
|
describe "pg_array extension" do
|
|
4
4
|
before(:all) do
|
|
5
5
|
Sequel.extension :pg_array
|
|
6
|
-
@pg_types = Sequel::Postgres::PG__TYPES.dup # SEQUEL5: Remove
|
|
7
|
-
end
|
|
8
|
-
after(:all) do
|
|
9
|
-
Sequel::Postgres::PG__TYPES.replace(@pg_types) # SEQUEL5: Remove
|
|
10
6
|
end
|
|
11
7
|
|
|
12
8
|
before do
|
|
@@ -37,7 +33,7 @@ describe "pg_array extension" do
|
|
|
37
33
|
it "should preserve encoding when parsing text arrays" do
|
|
38
34
|
c = @converter[1009]
|
|
39
35
|
c.call("{a,\u00E4}".encode('ISO-8859-1')).map(&:encoding).must_equal [Encoding::ISO_8859_1, Encoding::ISO_8859_1]
|
|
40
|
-
end
|
|
36
|
+
end
|
|
41
37
|
|
|
42
38
|
it "should parse multi-dimensional text arrays" do
|
|
43
39
|
c = @converter[1009]
|
|
@@ -261,17 +257,6 @@ describe "pg_array extension" do
|
|
|
261
257
|
@db.select(Sequel.pg_array([1], :integer).as(:col1)).sql.must_equal 'SELECT ARRAY[1]::integer[] AS col1'
|
|
262
258
|
end
|
|
263
259
|
|
|
264
|
-
deprecated "should support registering custom array types" do
|
|
265
|
-
Sequel::Postgres::PGArray.register('foo')
|
|
266
|
-
@db.typecast_value(:foo_array, []).class.must_equal(Sequel::Postgres::PGArray)
|
|
267
|
-
@db.fetch = [{:name=>'id', :db_type=>'foo[]'}]
|
|
268
|
-
@db.schema(:items).map{|e| e[1][:type]}.must_equal [:foo_array]
|
|
269
|
-
end
|
|
270
|
-
|
|
271
|
-
deprecated "should raise error if register given convertor option and block" do
|
|
272
|
-
proc{Sequel::Postgres::PGArray.register('foo', :converter=>:to_s.to_proc, &:to_s)}.must_raise Sequel::Error
|
|
273
|
-
end
|
|
274
|
-
|
|
275
260
|
it "should support registering custom array types" do
|
|
276
261
|
@db.register_array_type('foo')
|
|
277
262
|
@db.typecast_value(:foo_array, []).class.must_equal(Sequel::Postgres::PGArray)
|
|
@@ -301,20 +286,6 @@ describe "pg_array extension" do
|
|
|
301
286
|
@db.conversion_procs[1234].call('{t}').must_equal [true]
|
|
302
287
|
end
|
|
303
288
|
|
|
304
|
-
deprecated "should support using a given conversion procs hash via the :type_procs option" do
|
|
305
|
-
h = {16=>proc{|s| "!#{s}"}}
|
|
306
|
-
Sequel::Postgres::PGArray.register('foo', :oid=>1234, :scalar_oid=>16, :type_procs=>h)
|
|
307
|
-
h[1234].call('{t}').must_equal ["!t"]
|
|
308
|
-
end
|
|
309
|
-
|
|
310
|
-
deprecated "should support adding methods to the given module via the :typecast_methods_module option" do
|
|
311
|
-
m = Module.new
|
|
312
|
-
Sequel::Postgres::PGArray.register('foo15', :scalar_typecast=>:boolean, :typecast_methods_module=>m)
|
|
313
|
-
@db.typecast_value(:foo15_array, ['t']).must_equal ['t']
|
|
314
|
-
@db.extend(m)
|
|
315
|
-
@db.typecast_value(:foo15_array, ['t']).must_equal [true]
|
|
316
|
-
end
|
|
317
|
-
|
|
318
289
|
it "should not raise an error if using :scalar_oid option with unexisting scalar conversion proc" do
|
|
319
290
|
@db.register_array_type('foo', :oid=>1234, :scalar_oid=>0)
|
|
320
291
|
@db.conversion_procs[1234].call('{t}').must_equal ["t"]
|
|
@@ -394,7 +365,7 @@ describe "pg_array extension" do
|
|
|
394
365
|
end
|
|
395
366
|
|
|
396
367
|
it "should set appropriate timestamp conversion procs when adding conversion procs" do
|
|
397
|
-
@db.fetch = [[{:oid=>2222
|
|
368
|
+
@db.fetch = [[{:oid=>2222}], [{:oid=>2222, :typarray=>2223}]]
|
|
398
369
|
@db.add_named_conversion_proc(:foo){|v| v*2}
|
|
399
370
|
procs = @db.conversion_procs
|
|
400
371
|
procs[1185].call('{"2011-10-20 11:12:13"}').must_equal [Time.local(2011, 10, 20, 11, 12, 13)]
|
|
@@ -403,22 +374,6 @@ describe "pg_array extension" do
|
|
|
403
374
|
procs[2223].call('{"2"}').must_equal ['22']
|
|
404
375
|
end
|
|
405
376
|
|
|
406
|
-
deprecated "should set appropriate timestamp conversion procs when resetting conversion procs when modifying PG_NAMED_TYPES" do
|
|
407
|
-
@pg_named_types = Sequel::Postgres::PG_NAMED_TYPES.dup
|
|
408
|
-
begin
|
|
409
|
-
Sequel::Postgres::PG_NAMED_TYPES[:foo] = proc{|v| v*2}
|
|
410
|
-
@db.fetch = [[{:oid=>2222, :typname=>'foo'}], [{:oid=>2222, :typarray=>2223, :typname=>'foo'}]]
|
|
411
|
-
@db.reset_conversion_procs
|
|
412
|
-
procs = @db.conversion_procs
|
|
413
|
-
procs[1185].call('{"2011-10-20 11:12:13"}').must_equal [Time.local(2011, 10, 20, 11, 12, 13)]
|
|
414
|
-
procs[1115].call('{"2011-10-20 11:12:13"}').must_equal [Time.local(2011, 10, 20, 11, 12, 13)]
|
|
415
|
-
procs[2222].call('1').must_equal '11'
|
|
416
|
-
procs[2223].call('{"2"}').must_equal ['22']
|
|
417
|
-
ensure
|
|
418
|
-
Sequel::Postgres::PG_NAMED_TYPES.replace(@pg_named_types)
|
|
419
|
-
end
|
|
420
|
-
end
|
|
421
|
-
|
|
422
377
|
it "should return correct results for Database#schema_type_class" do
|
|
423
378
|
@db.register_array_type('banana', :oid=>7866, :scalar_typecast=>:integer){|s| s.to_i}
|
|
424
379
|
@db.schema_type_class(:banana_array).must_equal Sequel::Postgres::PGArray
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
require_relative "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe "pg_extended_date_support extension" do
|
|
4
|
+
before do
|
|
5
|
+
@db = Sequel.mock(:host=>'postgres', :fetch=>{:v=>1}).extension(:pg_extended_date_support)
|
|
6
|
+
@db.extend_datasets{def quote_identifiers?; false end}
|
|
7
|
+
end
|
|
8
|
+
after do
|
|
9
|
+
Sequel.datetime_class = Time
|
|
10
|
+
Sequel.default_timezone = nil
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "should convert infinite timestamps and dates as configured" do
|
|
14
|
+
cp = @db.conversion_procs
|
|
15
|
+
d = lambda{|v| cp[1082].call(v)}
|
|
16
|
+
t = lambda{|v| cp[1114].call(v)}
|
|
17
|
+
pi = 'infinity'
|
|
18
|
+
ni = '-infinity'
|
|
19
|
+
today = Date.today
|
|
20
|
+
now = Time.now
|
|
21
|
+
|
|
22
|
+
d.(today.to_s).must_equal today
|
|
23
|
+
t.(now.strftime("%Y-%m-%d %H:%M:%S.%N")).must_equal now
|
|
24
|
+
proc{@db.typecast_value(:date, pi)}.must_raise Sequel::InvalidValue
|
|
25
|
+
proc{@db.typecast_value(:datetime, pi)}.must_raise Sequel::InvalidValue
|
|
26
|
+
|
|
27
|
+
[:nil, 'nil'].each do |v|
|
|
28
|
+
@db.convert_infinite_timestamps = v
|
|
29
|
+
d.(pi).must_be_nil
|
|
30
|
+
t.(pi).must_be_nil
|
|
31
|
+
d.(ni).must_be_nil
|
|
32
|
+
t.(ni).must_be_nil
|
|
33
|
+
@db.typecast_value(:date, pi).must_equal pi
|
|
34
|
+
@db.typecast_value(:datetime, pi).must_equal pi
|
|
35
|
+
@db.typecast_value(:date, ni).must_equal ni
|
|
36
|
+
@db.typecast_value(:datetime, ni).must_equal ni
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
d.(today.to_s).must_equal today
|
|
40
|
+
t.(now.strftime("%Y-%m-%d %H:%M:%S.%N")).must_equal now
|
|
41
|
+
@db.typecast_value(:date, today.to_s).must_equal today
|
|
42
|
+
@db.typecast_value(:datetime, now.strftime("%Y-%m-%d %H:%M:%S.%N")).must_equal now
|
|
43
|
+
|
|
44
|
+
[:string, 'string'].each do |v|
|
|
45
|
+
@db.convert_infinite_timestamps = v
|
|
46
|
+
d.(pi).must_equal pi
|
|
47
|
+
t.(pi).must_equal pi
|
|
48
|
+
d.(ni).must_equal ni
|
|
49
|
+
t.(ni).must_equal ni
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
[:date, 'date'].each do |v|
|
|
53
|
+
@db.convert_infinite_timestamps = v
|
|
54
|
+
d.(pi).must_equal Date::Infinity.new
|
|
55
|
+
t.(pi).must_equal Date::Infinity.new
|
|
56
|
+
d.(ni).must_equal -Date::Infinity.new
|
|
57
|
+
t.(ni).must_equal -Date::Infinity.new
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
[:float, 'float', 't', true].each do |v|
|
|
61
|
+
@db.convert_infinite_timestamps = v
|
|
62
|
+
d.(pi).must_equal 1.0/0.0
|
|
63
|
+
t.(pi).must_equal 1.0/0.0
|
|
64
|
+
d.(ni).must_equal -1.0/0.0
|
|
65
|
+
t.(ni).must_equal -1.0/0.0
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
['f', false].each do |v|
|
|
69
|
+
@db.convert_infinite_timestamps = v
|
|
70
|
+
proc{d.(pi)}.must_raise ArgumentError, Sequel::InvalidValue
|
|
71
|
+
proc{t.(pi)}.must_raise ArgumentError, Sequel::InvalidValue
|
|
72
|
+
proc{d.(ni)}.must_raise ArgumentError, Sequel::InvalidValue
|
|
73
|
+
proc{t.(ni)}.must_raise ArgumentError, Sequel::InvalidValue
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it "should handle parsing BC dates" do
|
|
78
|
+
@db.conversion_procs[1082].call("1092-10-20 BC").must_equal Date.new(-1091, 10, 20)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
it "should handle parsing BC timestamps as Time values" do
|
|
82
|
+
@db.conversion_procs[1114].call("1200-02-15 14:13:20-00:00 BC").must_equal Time.at(-100000000000).utc
|
|
83
|
+
@db.conversion_procs[1114].call("1200-02-15 14:13:20-00:00:00 BC").must_equal Time.at(-100000000000).utc
|
|
84
|
+
Sequel.default_timezone = :utc
|
|
85
|
+
@db.conversion_procs[1114].call("1200-02-15 14:13:20 BC").must_equal Time.at(-100000000000).utc
|
|
86
|
+
Sequel.default_timezone = nil
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "should handle parsing BC timestamps as DateTime values" do
|
|
90
|
+
Sequel.datetime_class = DateTime
|
|
91
|
+
@db.conversion_procs[1114].call("1200-02-15 14:13:20-00:00 BC").must_equal DateTime.new(-1199, 2, 15, 14, 13, 20)
|
|
92
|
+
@db.conversion_procs[1114].call("1200-02-15 14:13:20-00:00:00 BC").must_equal DateTime.new(-1199, 2, 15, 14, 13, 20)
|
|
93
|
+
Sequel.default_timezone = :utc
|
|
94
|
+
@db.conversion_procs[1114].call("1200-02-15 14:13:20 BC").must_equal DateTime.new(-1199, 2, 15, 14, 13, 20)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "should handle parsing AD timestamps with offset seconds" do
|
|
98
|
+
@db.conversion_procs[1114].call("1200-02-15 14:13:20-00:00:00").must_equal DateTime.new(1200, 2, 15, 14, 13, 20).to_time
|
|
99
|
+
Sequel.datetime_class = DateTime
|
|
100
|
+
@db.conversion_procs[1114].call("1200-02-15 14:13:20-00:00:00").must_equal DateTime.new(1200, 2, 15, 14, 13, 20)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "should format Date::Infinity values" do
|
|
104
|
+
@db.literal(Date::Infinity.new).must_equal "'infinity'"
|
|
105
|
+
@db.literal(-Date::Infinity.new).must_equal "'-infinity'"
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it "should format BC dates" do
|
|
109
|
+
@db.literal(Date.new(-1091, 10, 20)).must_equal "'1092-10-20 BC'"
|
|
110
|
+
@db.literal(Date.new(1092, 10, 20)).must_equal "'1092-10-20'"
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it "should format BC datetimes" do
|
|
114
|
+
@db.literal(DateTime.new(-1199, 2, 15, 14, 13, 20)).must_equal "'1200-02-15 14:13:20.000000000+0000 BC'"
|
|
115
|
+
@db.literal(DateTime.new(1200, 2, 15, 14, 13, 20)).must_equal "'1200-02-15 14:13:20.000000+0000'"
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
it "should format BC times" do
|
|
119
|
+
@db.literal(Time.at(-100000000000).utc).must_equal "'1200-02-15 14:13:20.000000000+0000 BC'"
|
|
120
|
+
@db.literal(Time.at(100000000000).utc).must_equal "'5138-11-16 09:46:40.000000+0000'"
|
|
121
|
+
end
|
|
122
|
+
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative "spec_helper"
|
|
2
2
|
|
|
3
3
|
describe "pg_hstore extension" do
|
|
4
4
|
before do
|
|
@@ -32,18 +32,13 @@ describe "pg_hstore extension" do
|
|
|
32
32
|
@db.literal(Sequel.hstore("c"=>nil)).must_equal '\'"c"=>NULL\'::hstore'
|
|
33
33
|
@db.literal(Sequel.hstore("c"=>'NULL')).must_equal '\'"c"=>"NULL"\'::hstore'
|
|
34
34
|
@db.literal(Sequel.hstore('c'=>'\ "\'=>')).must_equal '\'"c"=>"\\\\ \\"\'\'=>"\'::hstore'
|
|
35
|
-
|
|
35
|
+
@db.literal(Sequel.hstore("a"=>"b","c"=>"d")).must_equal '\'"a"=>"b","c"=>"d"\'::hstore'
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
it "should register conversion proc correctly" do
|
|
39
39
|
@db.conversion_procs[9999].call('"a"=>"b"').must_equal('a'=>'b')
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
-
deprecated "should reregister conversion proc when resetting conversion procs" do
|
|
43
|
-
@db.reset_conversion_procs
|
|
44
|
-
@db.conversion_procs[9999].call('"a"=>"b"').must_equal('a'=>'b')
|
|
45
|
-
end
|
|
46
|
-
|
|
47
42
|
it "should have Sequel.hstore method for creating HStore instances" do
|
|
48
43
|
Sequel.hstore({}).class.must_equal(@c)
|
|
49
44
|
end
|
|
@@ -100,10 +95,8 @@ describe "pg_hstore extension" do
|
|
|
100
95
|
|
|
101
96
|
Sequel.hstore('foo'=>'bar', '1'=>'2').values_at(:foo3, :foo, :foo2, 1).must_equal [nil, 'bar', nil, '2']
|
|
102
97
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
Sequel.hstore('foo'=>'bar').assoc(:foo2).must_be_nil
|
|
106
|
-
end
|
|
98
|
+
Sequel.hstore('foo'=>'bar').assoc(:foo).must_equal ['foo', 'bar']
|
|
99
|
+
Sequel.hstore('foo'=>'bar').assoc(:foo2).must_be_nil
|
|
107
100
|
end
|
|
108
101
|
|
|
109
102
|
it "should convert has_value?/value? lookups to string" do
|
|
@@ -124,28 +117,26 @@ describe "pg_hstore extension" do
|
|
|
124
117
|
Sequel.hstore('1'=>'bar').to_hash[1].must_equal 'bar'
|
|
125
118
|
end
|
|
126
119
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
end
|
|
120
|
+
it "should convert key lookups to string" do
|
|
121
|
+
Sequel.hstore('foo'=>'bar').key(:bar).must_equal 'foo'
|
|
122
|
+
Sequel.hstore('foo'=>'bar').key(:bar2).must_be_nil
|
|
123
|
+
end
|
|
132
124
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
125
|
+
it "should handle nil values in key lookups" do
|
|
126
|
+
Sequel.hstore('foo'=>'').key('').must_equal 'foo'
|
|
127
|
+
Sequel.hstore('foo'=>'').key(nil).must_be_nil
|
|
128
|
+
Sequel.hstore('foo'=>nil).key(nil).must_equal 'foo'
|
|
129
|
+
end
|
|
138
130
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
131
|
+
it "should convert rassoc lookups to string" do
|
|
132
|
+
Sequel.hstore('foo'=>'bar').rassoc(:bar).must_equal ['foo', 'bar']
|
|
133
|
+
Sequel.hstore('foo'=>'bar').rassoc(:bar2).must_be_nil
|
|
134
|
+
end
|
|
143
135
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
end
|
|
136
|
+
it "should handle nil values in rassoc lookups" do
|
|
137
|
+
Sequel.hstore('foo'=>'').rassoc('').must_equal ['foo', '']
|
|
138
|
+
Sequel.hstore('foo'=>'').rassoc(nil).must_be_nil
|
|
139
|
+
Sequel.hstore('foo'=>nil).rassoc(nil).must_equal ['foo', nil]
|
|
149
140
|
end
|
|
150
141
|
|
|
151
142
|
it "should have delete convert key to string" do
|
|
@@ -187,7 +178,7 @@ describe "pg_hstore extension" do
|
|
|
187
178
|
@db.bound_variable_arg(Sequel.hstore('1'=>nil), nil).must_equal '"1"=>NULL'
|
|
188
179
|
@db.bound_variable_arg(Sequel.hstore('1'=>"NULL"), nil).must_equal '"1"=>"NULL"'
|
|
189
180
|
@db.bound_variable_arg(Sequel.hstore('1'=>"'\\ \"=>"), nil).must_equal '"1"=>"\'\\\\ \\"=>"'
|
|
190
|
-
|
|
181
|
+
@db.bound_variable_arg(Sequel.hstore("a"=>"b","c"=>"d"), nil).must_equal '"a"=>"b","c"=>"d"'
|
|
191
182
|
end
|
|
192
183
|
|
|
193
184
|
it "should parse hstore type from the schema correctly" do
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative "spec_helper"
|
|
2
2
|
|
|
3
3
|
describe "pg_inet extension" do
|
|
4
4
|
ipv6_broken = (IPAddr.new('::1'); false) rescue true
|
|
@@ -18,19 +18,6 @@ describe "pg_inet extension" do
|
|
|
18
18
|
@db.literal(IPAddr.new('2001:4f8:3:ba:2e0:81ff:fe22:d1f1')).must_equal "'2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128'"
|
|
19
19
|
end unless ipv6_broken
|
|
20
20
|
|
|
21
|
-
deprecated "should set up conversion procs correctly" do
|
|
22
|
-
cp = Sequel::Postgres::PG__TYPES
|
|
23
|
-
cp[869].call("127.0.0.1").must_equal IPAddr.new('127.0.0.1')
|
|
24
|
-
cp[650].call("127.0.0.1").must_equal IPAddr.new('127.0.0.1')
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
deprecated "should set up conversion procs for arrays correctly" do
|
|
28
|
-
cp = Sequel::Postgres::PG__TYPES
|
|
29
|
-
cp[1041].call("{127.0.0.1}").must_equal [IPAddr.new('127.0.0.1')]
|
|
30
|
-
cp[651].call("{127.0.0.1}").must_equal [IPAddr.new('127.0.0.1')]
|
|
31
|
-
cp[1040].call("{127.0.0.1}").must_equal ['127.0.0.1']
|
|
32
|
-
end
|
|
33
|
-
|
|
34
21
|
it "should set up conversion procs correctly" do
|
|
35
22
|
cp = @db.conversion_procs
|
|
36
23
|
cp[869].call("127.0.0.1").must_equal IPAddr.new('127.0.0.1')
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative "spec_helper"
|
|
2
2
|
|
|
3
3
|
begin
|
|
4
4
|
require 'active_support/duration'
|
|
@@ -6,8 +6,8 @@ begin
|
|
|
6
6
|
require 'active_support/gem_version'
|
|
7
7
|
rescue LoadError
|
|
8
8
|
end
|
|
9
|
-
rescue LoadError
|
|
10
|
-
|
|
9
|
+
rescue LoadError
|
|
10
|
+
warn "Skipping test of pg_interval plugin: can't load active_support/duration"
|
|
11
11
|
else
|
|
12
12
|
describe "pg_interval extension" do
|
|
13
13
|
before do
|
|
@@ -34,16 +34,6 @@ describe "pg_interval extension" do
|
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
36
|
|
|
37
|
-
deprecated "should set up conversion procs correctly" do
|
|
38
|
-
cp = Sequel::Postgres::PG__TYPES
|
|
39
|
-
cp[1186].call("1 sec").must_equal ActiveSupport::Duration.new(1, [[:seconds, 1]])
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
deprecated "should set up conversion procs for arrays correctly" do
|
|
43
|
-
cp = Sequel::Postgres::PG__TYPES
|
|
44
|
-
cp[1187].call("{1 sec}").must_equal [ActiveSupport::Duration.new(1, [[:seconds, 1]])]
|
|
45
|
-
end
|
|
46
|
-
|
|
47
37
|
it "should set up conversion procs correctly" do
|
|
48
38
|
cp = @db.conversion_procs
|
|
49
39
|
cp[1186].call("1 sec").must_equal ActiveSupport::Duration.new(1, [[:seconds, 1]])
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative "spec_helper"
|
|
2
2
|
|
|
3
3
|
Sequel.extension :pg_array, :pg_json
|
|
4
4
|
|
|
@@ -17,18 +17,6 @@ describe "pg_json extension" do
|
|
|
17
17
|
@db.extension(:pg_array, :pg_json)
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
deprecated "should set up conversion procs correctly" do
|
|
21
|
-
cp = Sequel::Postgres::PG__TYPES
|
|
22
|
-
cp[114].call("{}").must_equal @hc.new({})
|
|
23
|
-
cp[3802].call("{}").must_equal @bhc.new({})
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
deprecated "should set up conversion procs for arrays correctly" do
|
|
27
|
-
cp = Sequel::Postgres::PG__TYPES
|
|
28
|
-
cp[199].call("{[]}").must_equal [@ac.new([])]
|
|
29
|
-
cp[3807].call("{[]}").must_equal [@bac.new([])]
|
|
30
|
-
end
|
|
31
|
-
|
|
32
20
|
it "should set up conversion procs correctly" do
|
|
33
21
|
cp = @db.conversion_procs
|
|
34
22
|
cp[114].call("{}").must_equal @hc.new({})
|
|
@@ -1,13 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
require_relative "spec_helper"
|
|
3
2
|
|
|
4
3
|
describe "pg_range extension" do
|
|
5
4
|
before(:all) do
|
|
6
5
|
Sequel.extension :pg_array, :pg_range
|
|
7
|
-
@pg_types = Sequel::Postgres::PG__TYPES.dup # SEQUEL5: Remove
|
|
8
|
-
end
|
|
9
|
-
after(:all) do
|
|
10
|
-
Sequel::Postgres::PG__TYPES.replace(@pg_types) # SEQUEL5: Remove
|
|
11
6
|
end
|
|
12
7
|
|
|
13
8
|
before do
|
|
@@ -21,26 +16,6 @@ describe "pg_range extension" do
|
|
|
21
16
|
@db.extension(:pg_array, :pg_range)
|
|
22
17
|
end
|
|
23
18
|
|
|
24
|
-
deprecated "should set up conversion procs correctly" do
|
|
25
|
-
cp = Sequel::Postgres::PG__TYPES
|
|
26
|
-
cp[3904].call("[1,2]").must_equal @R.new(1,2, :exclude_begin=>false, :exclude_end=>false, :db_type=>'int4range')
|
|
27
|
-
cp[3906].call("[1,2]").must_equal @R.new(1,2, :exclude_begin=>false, :exclude_end=>false, :db_type=>'numrange')
|
|
28
|
-
cp[3908].call("[2011-01-02 10:20:30,2011-02-03 10:20:30)").must_equal @R.new(Time.local(2011, 1, 2, 10, 20, 30),Time.local(2011, 2, 3, 10, 20, 30), :exclude_begin=>false, :exclude_end=>true, :db_type=>'tsrange')
|
|
29
|
-
cp[3910].call("[2011-01-02 10:20:30,2011-02-03 10:20:30)").must_equal @R.new(Time.local(2011, 1, 2, 10, 20, 30),Time.local(2011, 2, 3, 10, 20, 30), :exclude_begin=>false, :exclude_end=>true, :db_type=>'tstzrange')
|
|
30
|
-
cp[3912].call("[2011-01-02,2011-02-03)").must_equal @R.new(Date.new(2011, 1, 2),Date.new(2011, 2, 3), :exclude_begin=>false, :exclude_end=>true, :db_type=>'daterange')
|
|
31
|
-
cp[3926].call("[1,2]").must_equal @R.new(1,2, :exclude_begin=>false, :exclude_end=>false, :db_type=>'int8range')
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
deprecated "should set up conversion procs for arrays correctly" do
|
|
35
|
-
cp = Sequel::Postgres::PG__TYPES
|
|
36
|
-
cp[3905].call("{\"[1,2]\"}").must_equal [@R.new(1,2, :exclude_begin=>false, :exclude_end=>false, :db_type=>'int4range')]
|
|
37
|
-
cp[3907].call("{\"[1,2]\"}").must_equal [@R.new(1,2, :exclude_begin=>false, :exclude_end=>false, :db_type=>'numrange')]
|
|
38
|
-
cp[3909].call("{\"[2011-01-02 10:20:30,2011-02-03 10:20:30)\"}").must_equal [@R.new(Time.local(2011, 1, 2, 10, 20, 30),Time.local(2011, 2, 3, 10, 20, 30), :exclude_begin=>false, :exclude_end=>true, :db_type=>'tsrange')]
|
|
39
|
-
cp[3911].call("{\"[2011-01-02 10:20:30,2011-02-03 10:20:30)\"}").must_equal [@R.new(Time.local(2011, 1, 2, 10, 20, 30),Time.local(2011, 2, 3, 10, 20, 30), :exclude_begin=>false, :exclude_end=>true, :db_type=>'tstzrange')]
|
|
40
|
-
cp[3913].call("{\"[2011-01-02,2011-02-03)\"}").must_equal [@R.new(Date.new(2011, 1, 2),Date.new(2011, 2, 3), :exclude_begin=>false, :exclude_end=>true, :db_type=>'daterange')]
|
|
41
|
-
cp[3927].call("{\"[1,2]\"}").must_equal [@R.new(1,2, :exclude_begin=>false, :exclude_end=>false, :db_type=>'int8range')]
|
|
42
|
-
end
|
|
43
|
-
|
|
44
19
|
it "should set up conversion procs correctly" do
|
|
45
20
|
cp = @db.conversion_procs
|
|
46
21
|
cp[3904].call("[1,2]").must_equal @R.new(1,2, :exclude_begin=>false, :exclude_end=>false, :db_type=>'int4range')
|
|
@@ -171,50 +146,6 @@ describe "pg_range extension" do
|
|
|
171
146
|
end
|
|
172
147
|
end
|
|
173
148
|
|
|
174
|
-
deprecated "should support registering custom range types" do
|
|
175
|
-
@R.register('foorange')
|
|
176
|
-
@db.typecast_value(:foorange, 1..2).must_be_kind_of(@R)
|
|
177
|
-
@db.fetch = [{:name=>'id', :db_type=>'foorange'}]
|
|
178
|
-
@db.schema(:items).map{|e| e[1][:type]}.must_equal [:foorange]
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
deprecated "should support using a block as a custom conversion proc given as block" do
|
|
182
|
-
@R.register('foo2range'){|s| (s*2).to_i}
|
|
183
|
-
@db.typecast_value(:foo2range, '[1,2]').must_be :==, (11..22)
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
deprecated "should support using a block as a custom conversion proc given as :converter option" do
|
|
187
|
-
@R.register('foo3range', :converter=>proc{|s| (s*2).to_i})
|
|
188
|
-
@db.typecast_value(:foo3range, '[1,2]').must_be :==, (11..22)
|
|
189
|
-
end
|
|
190
|
-
|
|
191
|
-
deprecated "should support using an existing scaler conversion proc via the :subtype_oid option" do
|
|
192
|
-
@R.register('foo4range', :subtype_oid=>16)
|
|
193
|
-
@db.typecast_value(:foo4range, '[t,f]').must_equal @R.new(true, false, :db_type=>'foo4range')
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
deprecated "should raise an error if using :subtype_oid option with unexisting scalar conversion proc" do
|
|
197
|
-
proc{@R.register('fooirange', :subtype_oid=>0)}.must_raise(Sequel::Error)
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
deprecated "should raise an error if using :converter option and a block argument" do
|
|
201
|
-
proc{@R.register('fooirange', :converter=>proc{}){}}.must_raise(Sequel::Error)
|
|
202
|
-
end
|
|
203
|
-
|
|
204
|
-
deprecated "should raise an error if using :subtype_oid option and a block argument" do
|
|
205
|
-
proc{@R.register('fooirange', :subtype_oid=>16){}}.must_raise(Sequel::Error)
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
deprecated "should support registering custom types with :oid option" do
|
|
209
|
-
@R.register('foo5range', :oid=>331)
|
|
210
|
-
Sequel::Postgres::PG__TYPES[331].call('[1,3)').must_be_kind_of(@R)
|
|
211
|
-
end
|
|
212
|
-
|
|
213
|
-
deprecated "should not support registering custom range types on a per-Database basis for frozen databases" do
|
|
214
|
-
@db.freeze
|
|
215
|
-
proc{@db.register_range_type('banana', :oid=>7865){|s| s}}.must_raise RuntimeError, TypeError
|
|
216
|
-
end
|
|
217
|
-
|
|
218
149
|
it "should support registering custom range types" do
|
|
219
150
|
@db.register_range_type('foorange')
|
|
220
151
|
@db.typecast_value(:foorange, 1..2).must_be_kind_of(@R)
|
|
@@ -349,20 +280,6 @@ describe "pg_range extension" do
|
|
|
349
280
|
end
|
|
350
281
|
end
|
|
351
282
|
|
|
352
|
-
deprecated "should set appropriate timestamp range conversion procs when resetting conversion procs" do
|
|
353
|
-
@db.reset_conversion_procs
|
|
354
|
-
procs = @db.conversion_procs
|
|
355
|
-
procs[3908].call('[2011-10-20 11:12:13,2011-10-20 11:12:14]').must_be :==, (Time.local(2011, 10, 20, 11, 12, 13)..(Time.local(2011, 10, 20, 11, 12, 14)))
|
|
356
|
-
procs[3910].call('[2011-10-20 11:12:13,2011-10-20 11:12:14]').must_be :==, (Time.local(2011, 10, 20, 11, 12, 13)..(Time.local(2011, 10, 20, 11, 12, 14)))
|
|
357
|
-
end
|
|
358
|
-
|
|
359
|
-
deprecated "should set appropriate timestamp range array conversion procs when resetting conversion procs" do
|
|
360
|
-
@db.reset_conversion_procs
|
|
361
|
-
procs = @db.conversion_procs
|
|
362
|
-
procs[3909].call('{"[2011-10-20 11:12:13,2011-10-20 11:12:14]"}').must_be :==, [Time.local(2011, 10, 20, 11, 12, 13)..Time.local(2011, 10, 20, 11, 12, 14)]
|
|
363
|
-
procs[3911].call('{"[2011-10-20 11:12:13,2011-10-20 11:12:14]"}').must_be :==, [Time.local(2011, 10, 20, 11, 12, 13)..Time.local(2011, 10, 20, 11, 12, 14)]
|
|
364
|
-
end
|
|
365
|
-
|
|
366
283
|
describe "a PGRange instance" do
|
|
367
284
|
before do
|
|
368
285
|
@r1 = @R.new(1, 2)
|
|
@@ -420,10 +337,8 @@ describe "pg_range extension" do
|
|
|
420
337
|
it "should quack like a range" do
|
|
421
338
|
@r1.cover?(1.5).must_equal true
|
|
422
339
|
@r1.cover?(2.5).must_equal false
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
@r1.last(1).must_equal [2]
|
|
426
|
-
end
|
|
340
|
+
@r1.first(1).must_equal [1]
|
|
341
|
+
@r1.last(1).must_equal [2]
|
|
427
342
|
@r1.to_a.must_equal [1, 2]
|
|
428
343
|
@r1.first.must_equal 1
|
|
429
344
|
@r1.last.must_equal 2
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative "spec_helper"
|
|
2
2
|
|
|
3
3
|
describe "pg_row extension" do
|
|
4
4
|
before do
|
|
@@ -9,16 +9,6 @@ describe "pg_row extension" do
|
|
|
9
9
|
@db.sqls
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
deprecated "should parse record objects as arrays" do
|
|
13
|
-
a = Sequel::Postgres::PG__TYPES[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
12
|
it "should parse record objects as arrays" do
|
|
23
13
|
a = @db.conversion_procs[2249].call("(a,b,c)")
|
|
24
14
|
a.class.must_equal(@m::ArrayRow)
|
|
@@ -145,30 +135,6 @@ describe "pg_row extension" do
|
|
|
145
135
|
p.column_converters.must_equal [Array]
|
|
146
136
|
end
|
|
147
137
|
|
|
148
|
-
deprecated "should reload registered row types when reseting conversion procs" do
|
|
149
|
-
db = Sequel.mock(:host=>'postgres')
|
|
150
|
-
db.extend_datasets{def quote_identifiers?; false end}
|
|
151
|
-
db.extension(:pg_row)
|
|
152
|
-
db.conversion_procs[4] = proc{|s| s.to_i}
|
|
153
|
-
db.conversion_procs[5] = proc{|s| s * 2}
|
|
154
|
-
db.sqls
|
|
155
|
-
db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
156
|
-
db.register_row_type(:foo)
|
|
157
|
-
db.sqls.must_equal ["SELECT pg_type.oid, typrelid, typarray FROM pg_type WHERE ((typtype = 'c') AND (typname = 'foo')) LIMIT 1",
|
|
158
|
-
"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"]
|
|
159
|
-
|
|
160
|
-
begin
|
|
161
|
-
pgnt = Sequel::Postgres::PG_NAMED_TYPES.dup
|
|
162
|
-
Sequel::Postgres::PG_NAMED_TYPES.clear
|
|
163
|
-
db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
164
|
-
db.reset_conversion_procs
|
|
165
|
-
db.sqls.must_equal ["SELECT pg_type.oid, typrelid, typarray FROM pg_type WHERE ((typtype = 'c') AND (typname = 'foo')) LIMIT 1",
|
|
166
|
-
"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"]
|
|
167
|
-
ensure
|
|
168
|
-
Sequel::Postgres::PG_NAMED_TYPES.replace pgnt
|
|
169
|
-
end
|
|
170
|
-
end
|
|
171
|
-
|
|
172
138
|
it "should handle ArrayRows and HashRows in bound variables" do
|
|
173
139
|
@db.bound_variable_arg(1, nil).must_equal 1
|
|
174
140
|
@db.bound_variable_arg(@m::ArrayRow.call(["1", "abc\\'\","]), nil).must_equal '("1","abc\\\\\'\\",")'
|
|
@@ -302,15 +268,6 @@ describe "pg_row extension" do
|
|
|
302
268
|
@db.typecast_value(:pg_row_foo, 'bar'=>'1', 'baz'=>'b').must_equal(:bar=>1, :baz=>'bb')
|
|
303
269
|
end
|
|
304
270
|
|
|
305
|
-
deprecated "should handle conversion procs that aren't added until later" do
|
|
306
|
-
@db.conversion_procs[5] = proc{|s| s * 2}
|
|
307
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
308
|
-
c = proc{|h| [h]}
|
|
309
|
-
@db.register_row_type(:foo, :converter=>c)
|
|
310
|
-
@db.conversion_procs[4] = proc{|s| s.to_i}
|
|
311
|
-
@db.conversion_procs[1].call('(1,b)').must_equal [{:bar=>1, :baz=>'bb'}]
|
|
312
|
-
end
|
|
313
|
-
|
|
314
271
|
it "should handle nil values when converting columns" do
|
|
315
272
|
@db.conversion_procs[5] = proc{|s| s * 2}
|
|
316
273
|
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}]]
|