ibm_db 3.0.5-x86-mingw32 → 5.0.5-x86-mingw32
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 +5 -5
- data/CHANGES +4 -0
- data/LICENSE +1 -1
- data/ParameterizedQueries README +6 -6
- data/README +38 -55
- data/ext/Makefile +269 -0
- data/ext/extconf.rb +34 -3
- data/ext/gil_release_version +3 -0
- data/ext/ibm_db-i386-mingw32.def +2 -0
- data/ext/ibm_db.c +100 -108
- data/ext/ibm_db.o +0 -0
- data/ext/ibm_db.so +0 -0
- data/ext/mkmf.log +110 -0
- data/ext/ruby_ibm_db_cli.o +0 -0
- data/ext/unicode_support_version +3 -0
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +923 -527
- data/lib/active_record/connection_adapters/ibmdb_adapter.rb +4 -1
- data/lib/mswin32/ibm_db.rb +7 -39
- data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +8 -5
- data/test/cases/adapter_test.rb +133 -58
- data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
- data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
- data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
- data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
- data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
- data/test/cases/adapters/mysql2/connection_test.rb +210 -0
- data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
- data/test/cases/adapters/mysql2/enum_test.rb +26 -0
- data/test/cases/adapters/mysql2/explain_test.rb +21 -0
- data/test/cases/adapters/mysql2/json_test.rb +195 -0
- data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
- data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
- data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
- data/test/cases/adapters/mysql2/schema_test.rb +126 -0
- data/test/cases/adapters/mysql2/sp_test.rb +36 -0
- data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
- data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
- data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
- data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
- data/test/cases/adapters/postgresql/array_test.rb +339 -0
- data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
- data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
- data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
- data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
- data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
- data/test/cases/adapters/postgresql/citext_test.rb +78 -0
- data/test/cases/adapters/postgresql/collation_test.rb +53 -0
- data/test/cases/adapters/postgresql/composite_test.rb +132 -0
- data/test/cases/adapters/postgresql/connection_test.rb +257 -0
- data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
- data/test/cases/adapters/postgresql/domain_test.rb +47 -0
- data/test/cases/adapters/postgresql/enum_test.rb +91 -0
- data/test/cases/adapters/postgresql/explain_test.rb +20 -0
- data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
- data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
- data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
- data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
- data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
- data/test/cases/adapters/postgresql/integer_test.rb +25 -0
- data/test/cases/adapters/postgresql/json_test.rb +237 -0
- data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
- data/test/cases/adapters/postgresql/money_test.rb +96 -0
- data/test/cases/adapters/postgresql/network_test.rb +94 -0
- data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
- data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
- data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
- data/test/cases/adapters/postgresql/range_test.rb +343 -0
- data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
- data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
- data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
- data/test/cases/adapters/postgresql/schema_test.rb +597 -0
- data/test/cases/adapters/postgresql/serial_test.rb +154 -0
- data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
- data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
- data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
- data/test/cases/adapters/postgresql/utils_test.rb +62 -0
- data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
- data/test/cases/adapters/postgresql/xml_test.rb +54 -0
- data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
- data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
- data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
- data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
- data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
- data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
- data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
- data/test/cases/aggregations_test.rb +11 -1
- data/test/cases/ar_schema_test.rb +35 -50
- data/test/cases/associations/association_scope_test.rb +1 -6
- data/test/cases/associations/belongs_to_associations_test.rb +122 -10
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
- data/test/cases/associations/callbacks_test.rb +5 -7
- data/test/cases/associations/cascaded_eager_loading_test.rb +1 -1
- data/test/cases/associations/eager_load_nested_include_test.rb +1 -3
- data/test/cases/associations/eager_test.rb +158 -73
- data/test/cases/associations/extension_test.rb +7 -2
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +64 -32
- data/test/cases/associations/has_many_associations_test.rb +362 -43
- data/test/cases/associations/has_many_through_associations_test.rb +108 -41
- data/test/cases/associations/has_one_associations_test.rb +105 -8
- data/test/cases/associations/has_one_through_associations_test.rb +6 -3
- data/test/cases/associations/inner_join_association_test.rb +3 -3
- data/test/cases/associations/inverse_associations_test.rb +38 -11
- data/test/cases/associations/join_model_test.rb +59 -36
- data/test/cases/associations/left_outer_join_association_test.rb +88 -0
- data/test/cases/associations/nested_through_associations_test.rb +2 -2
- data/test/cases/associations/required_test.rb +25 -5
- data/test/cases/associations_test.rb +39 -34
- data/test/cases/attribute_decorators_test.rb +9 -8
- data/test/cases/attribute_methods/read_test.rb +5 -5
- data/test/cases/attribute_methods_test.rb +97 -40
- data/test/cases/attribute_set_test.rb +64 -4
- data/test/cases/attribute_test.rb +84 -18
- data/test/cases/attributes_test.rb +151 -34
- data/test/cases/autosave_association_test.rb +149 -36
- data/test/cases/base_test.rb +290 -241
- data/test/cases/batches_test.rb +299 -22
- data/test/cases/binary_test.rb +2 -10
- data/test/cases/bind_parameter_test.rb +76 -66
- data/test/cases/cache_key_test.rb +26 -0
- data/test/cases/calculations_test.rb +167 -15
- data/test/cases/callbacks_test.rb +161 -68
- data/test/cases/coders/json_test.rb +15 -0
- data/test/cases/collection_cache_key_test.rb +115 -0
- data/test/cases/column_definition_test.rb +26 -57
- data/test/cases/comment_test.rb +145 -0
- data/test/cases/connection_adapters/adapter_leasing_test.rb +5 -3
- data/test/cases/connection_adapters/connection_handler_test.rb +128 -21
- data/test/cases/connection_adapters/connection_specification_test.rb +1 -1
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +0 -38
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -1
- data/test/cases/connection_adapters/schema_cache_test.rb +8 -3
- data/test/cases/connection_adapters/type_lookup_test.rb +15 -7
- data/test/cases/connection_management_test.rb +46 -56
- data/test/cases/connection_pool_test.rb +195 -20
- data/test/cases/connection_specification/resolver_test.rb +15 -0
- data/test/cases/counter_cache_test.rb +10 -5
- data/test/cases/custom_locking_test.rb +1 -1
- data/test/cases/database_statements_test.rb +18 -3
- data/test/cases/{invalid_date_test.rb → date_test.rb} +13 -1
- data/test/cases/date_time_precision_test.rb +107 -0
- data/test/cases/defaults_test.rb +85 -89
- data/test/cases/dirty_test.rb +30 -52
- data/test/cases/disconnected_test.rb +4 -2
- data/test/cases/enum_test.rb +178 -24
- data/test/cases/errors_test.rb +16 -0
- data/test/cases/explain_test.rb +32 -21
- data/test/cases/finder_test.rb +273 -148
- data/test/cases/fixture_set/file_test.rb +18 -0
- data/test/cases/fixtures_test.rb +112 -32
- data/test/cases/forbidden_attributes_protection_test.rb +69 -3
- data/test/cases/helper.rb +10 -16
- data/test/cases/hot_compatibility_test.rb +89 -1
- data/test/cases/inheritance_test.rb +284 -53
- data/test/cases/integration_test.rb +23 -7
- data/test/cases/invalid_connection_test.rb +4 -2
- data/test/cases/invertible_migration_test.rb +124 -32
- data/test/cases/json_serialization_test.rb +11 -2
- data/test/cases/locking_test.rb +22 -6
- data/test/cases/log_subscriber_test.rb +106 -17
- data/test/cases/migration/change_schema_test.rb +60 -114
- data/test/cases/migration/change_table_test.rb +34 -2
- data/test/cases/migration/column_attributes_test.rb +7 -23
- data/test/cases/migration/column_positioning_test.rb +8 -8
- data/test/cases/migration/columns_test.rb +17 -11
- data/test/cases/migration/command_recorder_test.rb +47 -2
- data/test/cases/migration/compatibility_test.rb +118 -0
- data/test/cases/migration/create_join_table_test.rb +21 -12
- data/test/cases/migration/foreign_key_test.rb +52 -18
- data/test/cases/migration/index_test.rb +14 -12
- data/test/cases/migration/logger_test.rb +1 -1
- data/test/cases/migration/pending_migrations_test.rb +0 -1
- data/test/cases/migration/references_foreign_key_test.rb +59 -7
- data/test/cases/migration/references_index_test.rb +4 -4
- data/test/cases/migration/references_statements_test.rb +26 -6
- data/test/cases/migration/rename_table_test.rb +25 -25
- data/test/cases/migration_test.rb +279 -81
- data/test/cases/migrator_test.rb +91 -8
- data/test/cases/mixin_test.rb +0 -2
- data/test/cases/modules_test.rb +3 -4
- data/test/cases/multiparameter_attributes_test.rb +24 -2
- data/test/cases/multiple_db_test.rb +11 -4
- data/test/cases/nested_attributes_test.rb +61 -33
- data/test/cases/persistence_test.rb +102 -10
- data/test/cases/pooled_connections_test.rb +3 -3
- data/test/cases/primary_keys_test.rb +170 -31
- data/test/cases/query_cache_test.rb +216 -96
- data/test/cases/quoting_test.rb +65 -19
- data/test/cases/readonly_test.rb +2 -1
- data/test/cases/reflection_test.rb +68 -22
- data/test/cases/relation/delegation_test.rb +3 -8
- data/test/cases/relation/merging_test.rb +10 -14
- data/test/cases/relation/mutation_test.rb +42 -24
- data/test/cases/relation/or_test.rb +92 -0
- data/test/cases/relation/predicate_builder_test.rb +4 -2
- data/test/cases/relation/record_fetch_warning_test.rb +40 -0
- data/test/cases/relation/where_chain_test.rb +23 -99
- data/test/cases/relation/where_clause_test.rb +182 -0
- data/test/cases/relation/where_test.rb +45 -23
- data/test/cases/relation_test.rb +67 -58
- data/test/cases/relations_test.rb +249 -38
- data/test/cases/result_test.rb +10 -0
- data/test/cases/sanitize_test.rb +108 -15
- data/test/cases/schema_dumper_test.rb +119 -125
- data/test/cases/schema_loading_test.rb +52 -0
- data/test/cases/scoping/default_scoping_test.rb +113 -39
- data/test/cases/scoping/named_scoping_test.rb +46 -9
- data/test/cases/scoping/relation_scoping_test.rb +47 -4
- data/test/cases/secure_token_test.rb +32 -0
- data/test/cases/serialization_test.rb +1 -1
- data/test/cases/serialized_attribute_test.rb +93 -6
- data/test/cases/statement_cache_test.rb +38 -0
- data/test/cases/store_test.rb +2 -1
- data/test/cases/suppressor_test.rb +63 -0
- data/test/cases/tasks/database_tasks_test.rb +73 -9
- data/test/cases/tasks/mysql_rake_test.rb +139 -118
- data/test/cases/tasks/postgresql_rake_test.rb +60 -6
- data/test/cases/tasks/sqlite_rake_test.rb +30 -3
- data/test/cases/test_case.rb +28 -20
- data/test/cases/test_fixtures_test.rb +36 -0
- data/test/cases/time_precision_test.rb +103 -0
- data/test/cases/timestamp_test.rb +44 -10
- data/test/cases/touch_later_test.rb +121 -0
- data/test/cases/transaction_callbacks_test.rb +128 -62
- data/test/cases/transaction_isolation_test.rb +2 -2
- data/test/cases/transactions_test.rb +61 -43
- data/test/cases/type/adapter_specific_registry_test.rb +133 -0
- data/test/cases/type/date_time_test.rb +14 -0
- data/test/cases/type/integer_test.rb +2 -96
- data/test/cases/type/string_test.rb +0 -14
- data/test/cases/type_test.rb +39 -0
- data/test/cases/types_test.rb +1 -118
- data/test/cases/unconnected_test.rb +1 -1
- data/test/cases/validations/absence_validation_test.rb +73 -0
- data/test/cases/validations/association_validation_test.rb +13 -2
- data/test/cases/validations/i18n_validation_test.rb +6 -10
- data/test/cases/validations/length_validation_test.rb +62 -30
- data/test/cases/validations/presence_validation_test.rb +36 -1
- data/test/cases/validations/uniqueness_validation_test.rb +128 -37
- data/test/cases/validations_repair_helper.rb +2 -6
- data/test/cases/validations_test.rb +36 -7
- data/test/cases/view_test.rb +102 -5
- data/test/cases/yaml_serialization_test.rb +21 -26
- data/test/config.example.yml +97 -0
- data/test/fixtures/bad_posts.yml +9 -0
- data/test/fixtures/books.yml +20 -0
- data/test/fixtures/content.yml +3 -0
- data/test/fixtures/content_positions.yml +3 -0
- data/test/fixtures/dead_parrots.yml +5 -0
- data/test/fixtures/live_parrots.yml +4 -0
- data/test/fixtures/naked/yml/parrots.yml +2 -0
- data/test/fixtures/naked/yml/trees.yml +3 -0
- data/test/fixtures/nodes.yml +29 -0
- data/test/fixtures/other_comments.yml +6 -0
- data/test/fixtures/other_dogs.yml +2 -0
- data/test/fixtures/other_posts.yml +7 -0
- data/test/fixtures/price_estimates.yml +10 -1
- data/test/fixtures/trees.yml +3 -0
- data/test/migrations/10_urban/9_add_expressions.rb +1 -1
- data/test/migrations/decimal/1_give_me_big_numbers.rb +1 -1
- data/test/migrations/magic/1_currencies_have_symbols.rb +1 -1
- data/test/migrations/missing/1000_people_have_middle_names.rb +2 -2
- data/test/migrations/missing/1_people_have_last_names.rb +2 -2
- data/test/migrations/missing/3_we_need_reminders.rb +2 -2
- data/test/migrations/missing/4_innocent_jointable.rb +2 -2
- data/test/migrations/rename/1_we_need_things.rb +2 -2
- data/test/migrations/rename/2_rename_things.rb +2 -2
- data/test/migrations/to_copy/1_people_have_hobbies.rb +1 -1
- data/test/migrations/to_copy/2_people_have_descriptions.rb +1 -1
- data/test/migrations/to_copy2/1_create_articles.rb +1 -1
- data/test/migrations/to_copy2/2_create_comments.rb +1 -1
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +1 -1
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +1 -1
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +1 -1
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +1 -1
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +1 -1
- data/test/migrations/valid/1_valid_people_have_last_names.rb +1 -1
- data/test/migrations/valid/2_we_need_reminders.rb +2 -2
- data/test/migrations/valid/3_innocent_jointable.rb +2 -2
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +1 -1
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -2
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +2 -2
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +1 -1
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +1 -1
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +1 -1
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +1 -1
- data/test/models/admin/randomly_named_c1.rb +6 -2
- data/test/models/aircraft.rb +1 -0
- data/test/models/author.rb +4 -7
- data/test/models/bird.rb +1 -1
- data/test/models/book.rb +5 -0
- data/test/models/bulb.rb +2 -1
- data/test/models/car.rb +3 -0
- data/test/models/cat.rb +10 -0
- data/test/models/chef.rb +1 -0
- data/test/models/club.rb +2 -0
- data/test/models/comment.rb +17 -5
- data/test/models/company.rb +4 -2
- data/test/models/company_in_module.rb +1 -1
- data/test/models/contact.rb +1 -1
- data/test/models/content.rb +40 -0
- data/test/models/customer.rb +8 -2
- data/test/models/developer.rb +19 -0
- data/test/models/face.rb +1 -1
- data/test/models/guitar.rb +4 -0
- data/test/models/hotel.rb +2 -0
- data/test/models/member.rb +1 -0
- data/test/models/member_detail.rb +4 -3
- data/test/models/mentor.rb +3 -0
- data/test/models/mocktail_designer.rb +2 -0
- data/test/models/node.rb +5 -0
- data/test/models/non_primary_key.rb +2 -0
- data/test/models/notification.rb +3 -0
- data/test/models/other_dog.rb +5 -0
- data/test/models/owner.rb +4 -1
- data/test/models/parrot.rb +6 -7
- data/test/models/person.rb +0 -1
- data/test/models/pet.rb +3 -0
- data/test/models/pet_treasure.rb +6 -0
- data/test/models/pirate.rb +3 -3
- data/test/models/post.rb +18 -9
- data/test/models/project.rb +9 -0
- data/test/models/randomly_named_c1.rb +1 -1
- data/test/models/recipe.rb +3 -0
- data/test/models/ship.rb +8 -2
- data/test/models/tag.rb +6 -0
- data/test/models/topic.rb +2 -8
- data/test/models/tree.rb +3 -0
- data/test/models/tuning_peg.rb +4 -0
- data/test/models/user.rb +14 -0
- data/test/models/uuid_item.rb +6 -0
- data/test/schema/mysql2_specific_schema.rb +33 -23
- data/test/schema/oracle_specific_schema.rb +1 -4
- data/test/schema/postgresql_specific_schema.rb +36 -124
- data/test/schema/schema.rb +170 -65
- data/test/schema/schema.rb.original +1057 -0
- data/test/schema/sqlite_specific_schema.rb +1 -5
- data/test/support/connection.rb +1 -0
- data/test/support/schema_dumping_helper.rb +1 -1
- data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
- data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
- metadata +146 -30
- data/lib/mswin32/rb19x/ibm_db.so +0 -0
- data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
- data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
- data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
- data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
- data/test/cases/attribute_methods/serialization_test.rb +0 -29
- data/test/cases/migration/change_schema_test - Copy.rb +0 -448
- data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
- data/test/cases/migration/table_and_index_test.rb +0 -24
- data/test/cases/relation/where_test2.rb +0 -36
- data/test/cases/type/decimal_test.rb +0 -56
- data/test/cases/type/unsigned_integer_test.rb +0 -18
- data/test/cases/xml_serialization_test.rb +0 -457
- data/test/fixtures/naked/csv/accounts.csv +0 -1
- data/test/schema/mysql_specific_schema.rb +0 -70
@@ -0,0 +1,92 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'support/ddl_helper'
|
3
|
+
|
4
|
+
|
5
|
+
class PostgresqlTime < ActiveRecord::Base
|
6
|
+
end
|
7
|
+
|
8
|
+
class PostgresqlOid < ActiveRecord::Base
|
9
|
+
end
|
10
|
+
|
11
|
+
class PostgresqlLtree < ActiveRecord::Base
|
12
|
+
end
|
13
|
+
|
14
|
+
class PostgresqlDataTypeTest < ActiveRecord::PostgreSQLTestCase
|
15
|
+
self.use_transactional_tests = false
|
16
|
+
|
17
|
+
def setup
|
18
|
+
@connection = ActiveRecord::Base.connection
|
19
|
+
|
20
|
+
@connection.execute("INSERT INTO postgresql_times (id, time_interval, scaled_time_interval) VALUES (1, '1 year 2 days ago', '3 weeks ago')")
|
21
|
+
@first_time = PostgresqlTime.find(1)
|
22
|
+
|
23
|
+
@connection.execute("INSERT INTO postgresql_oids (id, obj_id) VALUES (1, 1234)")
|
24
|
+
@first_oid = PostgresqlOid.find(1)
|
25
|
+
end
|
26
|
+
|
27
|
+
teardown do
|
28
|
+
[PostgresqlTime, PostgresqlOid].each(&:delete_all)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_data_type_of_time_types
|
32
|
+
assert_equal :string, @first_time.column_for_attribute(:time_interval).type
|
33
|
+
assert_equal :string, @first_time.column_for_attribute(:scaled_time_interval).type
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_data_type_of_oid_types
|
37
|
+
assert_equal :integer, @first_oid.column_for_attribute(:obj_id).type
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_time_values
|
41
|
+
assert_equal '-1 years -2 days', @first_time.time_interval
|
42
|
+
assert_equal '-21 days', @first_time.scaled_time_interval
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_oid_values
|
46
|
+
assert_equal 1234, @first_oid.obj_id
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_update_time
|
50
|
+
@first_time.time_interval = '2 years 3 minutes'
|
51
|
+
assert @first_time.save
|
52
|
+
assert @first_time.reload
|
53
|
+
assert_equal '2 years 00:03:00', @first_time.time_interval
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_update_oid
|
57
|
+
new_value = 567890
|
58
|
+
@first_oid.obj_id = new_value
|
59
|
+
assert @first_oid.save
|
60
|
+
assert @first_oid.reload
|
61
|
+
assert_equal new_value, @first_oid.obj_id
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_text_columns_are_limitless_the_upper_limit_is_one_GB
|
65
|
+
assert_equal 'text', @connection.type_to_sql(:text, 100_000)
|
66
|
+
assert_raise ActiveRecord::ActiveRecordError do
|
67
|
+
@connection.type_to_sql :text, 4294967295
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
class PostgresqlInternalDataTypeTest < ActiveRecord::PostgreSQLTestCase
|
73
|
+
include DdlHelper
|
74
|
+
|
75
|
+
setup do
|
76
|
+
@connection = ActiveRecord::Base.connection
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_name_column_type
|
80
|
+
with_example_table @connection, 'ex', 'data name' do
|
81
|
+
column = @connection.columns('ex').find { |col| col.name == 'data' }
|
82
|
+
assert_equal :string, column.type
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_char_column_type
|
87
|
+
with_example_table @connection, 'ex', 'data "char"' do
|
88
|
+
column = @connection.columns('ex').find { |col| col.name == 'data' }
|
89
|
+
assert_equal :string, column.type
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'support/connection_helper'
|
3
|
+
|
4
|
+
class PostgresqlDomainTest < ActiveRecord::PostgreSQLTestCase
|
5
|
+
include ConnectionHelper
|
6
|
+
|
7
|
+
class PostgresqlDomain < ActiveRecord::Base
|
8
|
+
self.table_name = "postgresql_domains"
|
9
|
+
end
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@connection = ActiveRecord::Base.connection
|
13
|
+
@connection.transaction do
|
14
|
+
@connection.execute "CREATE DOMAIN custom_money as numeric(8,2)"
|
15
|
+
@connection.create_table('postgresql_domains') do |t|
|
16
|
+
t.column :price, :custom_money
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
teardown do
|
22
|
+
@connection.drop_table 'postgresql_domains', if_exists: true
|
23
|
+
@connection.execute 'DROP DOMAIN IF EXISTS custom_money'
|
24
|
+
reset_connection
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_column
|
28
|
+
column = PostgresqlDomain.columns_hash["price"]
|
29
|
+
assert_equal :decimal, column.type
|
30
|
+
assert_equal "custom_money", column.sql_type
|
31
|
+
assert_not column.array?
|
32
|
+
|
33
|
+
type = PostgresqlDomain.type_for_attribute("price")
|
34
|
+
assert_not type.binary?
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_domain_acts_like_basetype
|
38
|
+
PostgresqlDomain.create price: ""
|
39
|
+
record = PostgresqlDomain.first
|
40
|
+
assert_nil record.price
|
41
|
+
|
42
|
+
record.price = "34.15"
|
43
|
+
record.save!
|
44
|
+
|
45
|
+
assert_equal BigDecimal.new("34.15"), record.reload.price
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'support/connection_helper'
|
3
|
+
|
4
|
+
class PostgresqlEnumTest < ActiveRecord::PostgreSQLTestCase
|
5
|
+
include ConnectionHelper
|
6
|
+
|
7
|
+
class PostgresqlEnum < ActiveRecord::Base
|
8
|
+
self.table_name = "postgresql_enums"
|
9
|
+
end
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@connection = ActiveRecord::Base.connection
|
13
|
+
@connection.transaction do
|
14
|
+
@connection.execute <<-SQL
|
15
|
+
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
|
16
|
+
SQL
|
17
|
+
@connection.create_table('postgresql_enums') do |t|
|
18
|
+
t.column :current_mood, :mood
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
teardown do
|
24
|
+
@connection.drop_table 'postgresql_enums', if_exists: true
|
25
|
+
@connection.execute 'DROP TYPE IF EXISTS mood'
|
26
|
+
reset_connection
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_column
|
30
|
+
column = PostgresqlEnum.columns_hash["current_mood"]
|
31
|
+
assert_equal :enum, column.type
|
32
|
+
assert_equal "mood", column.sql_type
|
33
|
+
assert_not column.array?
|
34
|
+
|
35
|
+
type = PostgresqlEnum.type_for_attribute("current_mood")
|
36
|
+
assert_not type.binary?
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_enum_defaults
|
40
|
+
@connection.add_column 'postgresql_enums', 'good_mood', :mood, default: 'happy'
|
41
|
+
PostgresqlEnum.reset_column_information
|
42
|
+
|
43
|
+
assert_equal "happy", PostgresqlEnum.column_defaults['good_mood']
|
44
|
+
assert_equal "happy", PostgresqlEnum.new.good_mood
|
45
|
+
ensure
|
46
|
+
PostgresqlEnum.reset_column_information
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_enum_mapping
|
50
|
+
@connection.execute "INSERT INTO postgresql_enums VALUES (1, 'sad');"
|
51
|
+
enum = PostgresqlEnum.first
|
52
|
+
assert_equal "sad", enum.current_mood
|
53
|
+
|
54
|
+
enum.current_mood = "happy"
|
55
|
+
enum.save!
|
56
|
+
|
57
|
+
assert_equal "happy", enum.reload.current_mood
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_invalid_enum_update
|
61
|
+
@connection.execute "INSERT INTO postgresql_enums VALUES (1, 'sad');"
|
62
|
+
enum = PostgresqlEnum.first
|
63
|
+
enum.current_mood = "angry"
|
64
|
+
|
65
|
+
assert_raise ActiveRecord::StatementInvalid do
|
66
|
+
enum.save
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_no_oid_warning
|
71
|
+
@connection.execute "INSERT INTO postgresql_enums VALUES (1, 'sad');"
|
72
|
+
stderr_output = capture(:stderr) { PostgresqlEnum.first }
|
73
|
+
|
74
|
+
assert stderr_output.blank?
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_enum_type_cast
|
78
|
+
enum = PostgresqlEnum.new
|
79
|
+
enum.current_mood = :happy
|
80
|
+
|
81
|
+
assert_equal "happy", enum.current_mood
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_assigning_enum_to_nil
|
85
|
+
model = PostgresqlEnum.new(current_mood: nil)
|
86
|
+
|
87
|
+
assert_nil model.current_mood
|
88
|
+
assert model.save
|
89
|
+
assert_nil model.reload.current_mood
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'models/developer'
|
3
|
+
require 'models/computer'
|
4
|
+
|
5
|
+
class PostgreSQLExplainTest < ActiveRecord::PostgreSQLTestCase
|
6
|
+
fixtures :developers
|
7
|
+
|
8
|
+
def test_explain_for_one_query
|
9
|
+
explain = Developer.where(id: 1).explain
|
10
|
+
assert_match %r(EXPLAIN for: SELECT "developers".* FROM "developers" WHERE "developers"."id" = (?:\$1 \[\["id", 1\]\]|1)), explain
|
11
|
+
assert_match %(QUERY PLAN), explain
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_explain_with_eager_loading
|
15
|
+
explain = Developer.where(id: 1).includes(:audit_logs).explain
|
16
|
+
assert_match %(QUERY PLAN), explain
|
17
|
+
assert_match %r(EXPLAIN for: SELECT "developers".* FROM "developers" WHERE "developers"."id" = (?:\$1 \[\["id", 1\]\]|1)), explain
|
18
|
+
assert_match %(EXPLAIN for: SELECT "audit_logs".* FROM "audit_logs" WHERE "audit_logs"."developer_id" = 1), explain
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
|
3
|
+
class PostgresqlExtensionMigrationTest < ActiveRecord::PostgreSQLTestCase
|
4
|
+
self.use_transactional_tests = false
|
5
|
+
|
6
|
+
class EnableHstore < ActiveRecord::Migration::Current
|
7
|
+
def change
|
8
|
+
enable_extension "hstore"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class DisableHstore < ActiveRecord::Migration::Current
|
13
|
+
def change
|
14
|
+
disable_extension "hstore"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def setup
|
19
|
+
super
|
20
|
+
|
21
|
+
@connection = ActiveRecord::Base.connection
|
22
|
+
|
23
|
+
unless @connection.supports_extensions?
|
24
|
+
return skip("no extension support")
|
25
|
+
end
|
26
|
+
|
27
|
+
@old_schema_migration_table_name = ActiveRecord::SchemaMigration.table_name
|
28
|
+
@old_table_name_prefix = ActiveRecord::Base.table_name_prefix
|
29
|
+
@old_table_name_suffix = ActiveRecord::Base.table_name_suffix
|
30
|
+
|
31
|
+
ActiveRecord::Base.table_name_prefix = "p_"
|
32
|
+
ActiveRecord::Base.table_name_suffix = "_s"
|
33
|
+
ActiveRecord::SchemaMigration.delete_all rescue nil
|
34
|
+
ActiveRecord::SchemaMigration.table_name = "p_schema_migrations_s"
|
35
|
+
ActiveRecord::Migration.verbose = false
|
36
|
+
end
|
37
|
+
|
38
|
+
def teardown
|
39
|
+
ActiveRecord::Base.table_name_prefix = @old_table_name_prefix
|
40
|
+
ActiveRecord::Base.table_name_suffix = @old_table_name_suffix
|
41
|
+
ActiveRecord::SchemaMigration.delete_all rescue nil
|
42
|
+
ActiveRecord::Migration.verbose = true
|
43
|
+
ActiveRecord::SchemaMigration.table_name = @old_schema_migration_table_name
|
44
|
+
|
45
|
+
super
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_enable_extension_migration_ignores_prefix_and_suffix
|
49
|
+
@connection.disable_extension("hstore")
|
50
|
+
|
51
|
+
migrations = [EnableHstore.new(nil, 1)]
|
52
|
+
ActiveRecord::Migrator.new(:up, migrations).migrate
|
53
|
+
assert @connection.extension_enabled?("hstore"), "extension hstore should be enabled"
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_disable_extension_migration_ignores_prefix_and_suffix
|
57
|
+
@connection.enable_extension("hstore")
|
58
|
+
|
59
|
+
migrations = [DisableHstore.new(nil, 1)]
|
60
|
+
ActiveRecord::Migrator.new(:up, migrations).migrate
|
61
|
+
assert_not @connection.extension_enabled?("hstore"), "extension hstore should not be enabled"
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'support/schema_dumping_helper'
|
3
|
+
|
4
|
+
class PostgresqlFullTextTest < ActiveRecord::PostgreSQLTestCase
|
5
|
+
include SchemaDumpingHelper
|
6
|
+
class Tsvector < ActiveRecord::Base; end
|
7
|
+
|
8
|
+
setup do
|
9
|
+
@connection = ActiveRecord::Base.connection
|
10
|
+
@connection.create_table('tsvectors') do |t|
|
11
|
+
t.tsvector 'text_vector'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
teardown do
|
16
|
+
@connection.drop_table 'tsvectors', if_exists: true
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_tsvector_column
|
20
|
+
column = Tsvector.columns_hash["text_vector"]
|
21
|
+
assert_equal :tsvector, column.type
|
22
|
+
assert_equal "tsvector", column.sql_type
|
23
|
+
assert_not column.array?
|
24
|
+
|
25
|
+
type = Tsvector.type_for_attribute("text_vector")
|
26
|
+
assert_not type.binary?
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_update_tsvector
|
30
|
+
Tsvector.create text_vector: "'text' 'vector'"
|
31
|
+
tsvector = Tsvector.first
|
32
|
+
assert_equal "'text' 'vector'", tsvector.text_vector
|
33
|
+
|
34
|
+
tsvector.text_vector = "'new' 'text' 'vector'"
|
35
|
+
tsvector.save!
|
36
|
+
assert tsvector.reload
|
37
|
+
assert_equal "'new' 'text' 'vector'", tsvector.text_vector
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_schema_dump_with_shorthand
|
41
|
+
output = dump_table_schema("tsvectors")
|
42
|
+
assert_match %r{t\.tsvector "text_vector"}, output
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,378 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'support/connection_helper'
|
3
|
+
require 'support/schema_dumping_helper'
|
4
|
+
|
5
|
+
class PostgresqlPointTest < ActiveRecord::PostgreSQLTestCase
|
6
|
+
include ConnectionHelper
|
7
|
+
include SchemaDumpingHelper
|
8
|
+
|
9
|
+
class PostgresqlPoint < ActiveRecord::Base
|
10
|
+
attribute :x, :point
|
11
|
+
attribute :y, :point
|
12
|
+
attribute :z, :point
|
13
|
+
attribute :array_of_points, :point, array: true
|
14
|
+
attribute :legacy_x, :legacy_point
|
15
|
+
attribute :legacy_y, :legacy_point
|
16
|
+
attribute :legacy_z, :legacy_point
|
17
|
+
end
|
18
|
+
|
19
|
+
def setup
|
20
|
+
@connection = ActiveRecord::Base.connection
|
21
|
+
@connection.create_table('postgresql_points') do |t|
|
22
|
+
t.point :x
|
23
|
+
t.point :y, default: [12.2, 13.3]
|
24
|
+
t.point :z, default: "(14.4,15.5)"
|
25
|
+
t.point :array_of_points, array: true
|
26
|
+
t.point :legacy_x
|
27
|
+
t.point :legacy_y, default: [12.2, 13.3]
|
28
|
+
t.point :legacy_z, default: "(14.4,15.5)"
|
29
|
+
end
|
30
|
+
@connection.create_table('deprecated_points') do |t|
|
31
|
+
t.point :x
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
teardown do
|
36
|
+
@connection.drop_table 'postgresql_points', if_exists: true
|
37
|
+
@connection.drop_table 'deprecated_points', if_exists: true
|
38
|
+
end
|
39
|
+
|
40
|
+
class DeprecatedPoint < ActiveRecord::Base; end
|
41
|
+
|
42
|
+
def test_deprecated_legacy_type
|
43
|
+
assert_deprecated do
|
44
|
+
DeprecatedPoint.new
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_column
|
49
|
+
column = PostgresqlPoint.columns_hash["x"]
|
50
|
+
assert_equal :point, column.type
|
51
|
+
assert_equal "point", column.sql_type
|
52
|
+
assert_not column.array?
|
53
|
+
|
54
|
+
type = PostgresqlPoint.type_for_attribute("x")
|
55
|
+
assert_not type.binary?
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_default
|
59
|
+
assert_equal ActiveRecord::Point.new(12.2, 13.3), PostgresqlPoint.column_defaults['y']
|
60
|
+
assert_equal ActiveRecord::Point.new(12.2, 13.3), PostgresqlPoint.new.y
|
61
|
+
|
62
|
+
assert_equal ActiveRecord::Point.new(14.4, 15.5), PostgresqlPoint.column_defaults['z']
|
63
|
+
assert_equal ActiveRecord::Point.new(14.4, 15.5), PostgresqlPoint.new.z
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_schema_dumping
|
67
|
+
output = dump_table_schema("postgresql_points")
|
68
|
+
assert_match %r{t\.point\s+"x"$}, output
|
69
|
+
assert_match %r{t\.point\s+"y",\s+default: \[12\.2, 13\.3\]$}, output
|
70
|
+
assert_match %r{t\.point\s+"z",\s+default: \[14\.4, 15\.5\]$}, output
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_roundtrip
|
74
|
+
PostgresqlPoint.create! x: [10, 25.2]
|
75
|
+
record = PostgresqlPoint.first
|
76
|
+
assert_equal ActiveRecord::Point.new(10, 25.2), record.x
|
77
|
+
|
78
|
+
record.x = ActiveRecord::Point.new(1.1, 2.2)
|
79
|
+
record.save!
|
80
|
+
assert record.reload
|
81
|
+
assert_equal ActiveRecord::Point.new(1.1, 2.2), record.x
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_mutation
|
85
|
+
p = PostgresqlPoint.create! x: ActiveRecord::Point.new(10, 20)
|
86
|
+
|
87
|
+
p.x.y = 25
|
88
|
+
p.save!
|
89
|
+
p.reload
|
90
|
+
|
91
|
+
assert_equal ActiveRecord::Point.new(10.0, 25.0), p.x
|
92
|
+
assert_not p.changed?
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_array_assignment
|
96
|
+
p = PostgresqlPoint.new(x: [1, 2])
|
97
|
+
|
98
|
+
assert_equal ActiveRecord::Point.new(1, 2), p.x
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_string_assignment
|
102
|
+
p = PostgresqlPoint.new(x: "(1, 2)")
|
103
|
+
|
104
|
+
assert_equal ActiveRecord::Point.new(1, 2), p.x
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_array_of_points_round_trip
|
108
|
+
expected_value = [
|
109
|
+
ActiveRecord::Point.new(1, 2),
|
110
|
+
ActiveRecord::Point.new(2, 3),
|
111
|
+
ActiveRecord::Point.new(3, 4),
|
112
|
+
]
|
113
|
+
p = PostgresqlPoint.new(array_of_points: expected_value)
|
114
|
+
|
115
|
+
assert_equal expected_value, p.array_of_points
|
116
|
+
p.save!
|
117
|
+
p.reload
|
118
|
+
assert_equal expected_value, p.array_of_points
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_legacy_column
|
122
|
+
column = PostgresqlPoint.columns_hash["legacy_x"]
|
123
|
+
assert_equal :point, column.type
|
124
|
+
assert_equal "point", column.sql_type
|
125
|
+
assert_not column.array?
|
126
|
+
|
127
|
+
type = PostgresqlPoint.type_for_attribute("legacy_x")
|
128
|
+
assert_not type.binary?
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_legacy_default
|
132
|
+
assert_equal [12.2, 13.3], PostgresqlPoint.column_defaults['legacy_y']
|
133
|
+
assert_equal [12.2, 13.3], PostgresqlPoint.new.legacy_y
|
134
|
+
|
135
|
+
assert_equal [14.4, 15.5], PostgresqlPoint.column_defaults['legacy_z']
|
136
|
+
assert_equal [14.4, 15.5], PostgresqlPoint.new.legacy_z
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_legacy_schema_dumping
|
140
|
+
output = dump_table_schema("postgresql_points")
|
141
|
+
assert_match %r{t\.point\s+"legacy_x"$}, output
|
142
|
+
assert_match %r{t\.point\s+"legacy_y",\s+default: \[12\.2, 13\.3\]$}, output
|
143
|
+
assert_match %r{t\.point\s+"legacy_z",\s+default: \[14\.4, 15\.5\]$}, output
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_legacy_roundtrip
|
147
|
+
PostgresqlPoint.create! legacy_x: [10, 25.2]
|
148
|
+
record = PostgresqlPoint.first
|
149
|
+
assert_equal [10, 25.2], record.legacy_x
|
150
|
+
|
151
|
+
record.legacy_x = [1.1, 2.2]
|
152
|
+
record.save!
|
153
|
+
assert record.reload
|
154
|
+
assert_equal [1.1, 2.2], record.legacy_x
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_legacy_mutation
|
158
|
+
p = PostgresqlPoint.create! legacy_x: [10, 20]
|
159
|
+
|
160
|
+
p.legacy_x[1] = 25
|
161
|
+
p.save!
|
162
|
+
p.reload
|
163
|
+
|
164
|
+
assert_equal [10.0, 25.0], p.legacy_x
|
165
|
+
assert_not p.changed?
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
class PostgresqlGeometricTest < ActiveRecord::PostgreSQLTestCase
|
170
|
+
include SchemaDumpingHelper
|
171
|
+
|
172
|
+
class PostgresqlGeometric < ActiveRecord::Base; end
|
173
|
+
|
174
|
+
setup do
|
175
|
+
@connection = ActiveRecord::Base.connection
|
176
|
+
@connection.create_table("postgresql_geometrics") do |t|
|
177
|
+
t.lseg :a_line_segment
|
178
|
+
t.box :a_box
|
179
|
+
t.path :a_path
|
180
|
+
t.polygon :a_polygon
|
181
|
+
t.circle :a_circle
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
teardown do
|
186
|
+
@connection.drop_table 'postgresql_geometrics', if_exists: true
|
187
|
+
end
|
188
|
+
|
189
|
+
def test_geometric_types
|
190
|
+
g = PostgresqlGeometric.new(
|
191
|
+
:a_line_segment => '(2.0, 3), (5.5, 7.0)',
|
192
|
+
:a_box => '2.0, 3, 5.5, 7.0',
|
193
|
+
:a_path => '[(2.0, 3), (5.5, 7.0), (8.5, 11.0)]',
|
194
|
+
:a_polygon => '((2.0, 3), (5.5, 7.0), (8.5, 11.0))',
|
195
|
+
:a_circle => '<(5.3, 10.4), 2>'
|
196
|
+
)
|
197
|
+
|
198
|
+
g.save!
|
199
|
+
|
200
|
+
h = PostgresqlGeometric.find(g.id)
|
201
|
+
|
202
|
+
assert_equal '[(2,3),(5.5,7)]', h.a_line_segment
|
203
|
+
assert_equal '(5.5,7),(2,3)', h.a_box # reordered to store upper right corner then bottom left corner
|
204
|
+
assert_equal '[(2,3),(5.5,7),(8.5,11)]', h.a_path
|
205
|
+
assert_equal '((2,3),(5.5,7),(8.5,11))', h.a_polygon
|
206
|
+
assert_equal '<(5.3,10.4),2>', h.a_circle
|
207
|
+
end
|
208
|
+
|
209
|
+
def test_alternative_format
|
210
|
+
g = PostgresqlGeometric.new(
|
211
|
+
:a_line_segment => '((2.0, 3), (5.5, 7.0))',
|
212
|
+
:a_box => '(2.0, 3), (5.5, 7.0)',
|
213
|
+
:a_path => '((2.0, 3), (5.5, 7.0), (8.5, 11.0))',
|
214
|
+
:a_polygon => '2.0, 3, 5.5, 7.0, 8.5, 11.0',
|
215
|
+
:a_circle => '((5.3, 10.4), 2)'
|
216
|
+
)
|
217
|
+
|
218
|
+
g.save!
|
219
|
+
|
220
|
+
h = PostgresqlGeometric.find(g.id)
|
221
|
+
assert_equal '[(2,3),(5.5,7)]', h.a_line_segment
|
222
|
+
assert_equal '(5.5,7),(2,3)', h.a_box # reordered to store upper right corner then bottom left corner
|
223
|
+
assert_equal '((2,3),(5.5,7),(8.5,11))', h.a_path
|
224
|
+
assert_equal '((2,3),(5.5,7),(8.5,11))', h.a_polygon
|
225
|
+
assert_equal '<(5.3,10.4),2>', h.a_circle
|
226
|
+
end
|
227
|
+
|
228
|
+
def test_geometric_function
|
229
|
+
PostgresqlGeometric.create! a_path: '[(2.0, 3), (5.5, 7.0), (8.5, 11.0)]' # [ ] is an open path
|
230
|
+
PostgresqlGeometric.create! a_path: '((2.0, 3), (5.5, 7.0), (8.5, 11.0))' # ( ) is a closed path
|
231
|
+
|
232
|
+
objs = PostgresqlGeometric.find_by_sql "SELECT isopen(a_path) FROM postgresql_geometrics ORDER BY id ASC"
|
233
|
+
assert_equal [true, false], objs.map(&:isopen)
|
234
|
+
|
235
|
+
objs = PostgresqlGeometric.find_by_sql "SELECT isclosed(a_path) FROM postgresql_geometrics ORDER BY id ASC"
|
236
|
+
assert_equal [false, true], objs.map(&:isclosed)
|
237
|
+
end
|
238
|
+
|
239
|
+
def test_schema_dumping
|
240
|
+
output = dump_table_schema("postgresql_geometrics")
|
241
|
+
assert_match %r{t\.lseg\s+"a_line_segment"$}, output
|
242
|
+
assert_match %r{t\.box\s+"a_box"$}, output
|
243
|
+
assert_match %r{t\.path\s+"a_path"$}, output
|
244
|
+
assert_match %r{t\.polygon\s+"a_polygon"$}, output
|
245
|
+
assert_match %r{t\.circle\s+"a_circle"$}, output
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
class PostgreSQLGeometricLineTest < ActiveRecord::PostgreSQLTestCase
|
250
|
+
include SchemaDumpingHelper
|
251
|
+
|
252
|
+
class PostgresqlLine < ActiveRecord::Base; end
|
253
|
+
|
254
|
+
setup do
|
255
|
+
unless ActiveRecord::Base.connection.send(:postgresql_version) >= 90400
|
256
|
+
skip("line type is not fully implemented")
|
257
|
+
end
|
258
|
+
@connection = ActiveRecord::Base.connection
|
259
|
+
@connection.create_table("postgresql_lines") do |t|
|
260
|
+
t.line :a_line
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
teardown do
|
265
|
+
if defined?(@connection)
|
266
|
+
@connection.drop_table 'postgresql_lines', if_exists: true
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
def test_geometric_line_type
|
271
|
+
g = PostgresqlLine.new(
|
272
|
+
a_line: '{2.0, 3, 5.5}'
|
273
|
+
)
|
274
|
+
g.save!
|
275
|
+
|
276
|
+
h = PostgresqlLine.find(g.id)
|
277
|
+
assert_equal '{2,3,5.5}', h.a_line
|
278
|
+
end
|
279
|
+
|
280
|
+
def test_alternative_format_line_type
|
281
|
+
g = PostgresqlLine.new(
|
282
|
+
a_line: '(2.0, 3), (4.0, 6.0)'
|
283
|
+
)
|
284
|
+
g.save!
|
285
|
+
|
286
|
+
h = PostgresqlLine.find(g.id)
|
287
|
+
assert_equal '{1.5,-1,0}', h.a_line
|
288
|
+
end
|
289
|
+
|
290
|
+
def test_schema_dumping_for_line_type
|
291
|
+
output = dump_table_schema("postgresql_lines")
|
292
|
+
assert_match %r{t\.line\s+"a_line"$}, output
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
class PostgreSQLGeometricTypesTest < ActiveRecord::PostgreSQLTestCase
|
297
|
+
attr_reader :connection, :table_name
|
298
|
+
|
299
|
+
def setup
|
300
|
+
super
|
301
|
+
@connection = ActiveRecord::Base.connection
|
302
|
+
@table_name = :testings
|
303
|
+
end
|
304
|
+
|
305
|
+
def test_creating_column_with_point_type
|
306
|
+
connection.create_table(table_name) do |t|
|
307
|
+
t.point :foo_point
|
308
|
+
end
|
309
|
+
|
310
|
+
assert_column_exists(:foo_point)
|
311
|
+
assert_type_correct(:foo_point, :point)
|
312
|
+
end
|
313
|
+
|
314
|
+
def test_creating_column_with_line_type
|
315
|
+
connection.create_table(table_name) do |t|
|
316
|
+
t.line :foo_line
|
317
|
+
end
|
318
|
+
|
319
|
+
assert_column_exists(:foo_line)
|
320
|
+
assert_type_correct(:foo_line, :line)
|
321
|
+
end
|
322
|
+
|
323
|
+
def test_creating_column_with_lseg_type
|
324
|
+
connection.create_table(table_name) do |t|
|
325
|
+
t.lseg :foo_lseg
|
326
|
+
end
|
327
|
+
|
328
|
+
assert_column_exists(:foo_lseg)
|
329
|
+
assert_type_correct(:foo_lseg, :lseg)
|
330
|
+
end
|
331
|
+
|
332
|
+
def test_creating_column_with_box_type
|
333
|
+
connection.create_table(table_name) do |t|
|
334
|
+
t.box :foo_box
|
335
|
+
end
|
336
|
+
|
337
|
+
assert_column_exists(:foo_box)
|
338
|
+
assert_type_correct(:foo_box, :box)
|
339
|
+
end
|
340
|
+
|
341
|
+
def test_creating_column_with_path_type
|
342
|
+
connection.create_table(table_name) do |t|
|
343
|
+
t.path :foo_path
|
344
|
+
end
|
345
|
+
|
346
|
+
assert_column_exists(:foo_path)
|
347
|
+
assert_type_correct(:foo_path, :path)
|
348
|
+
end
|
349
|
+
|
350
|
+
def test_creating_column_with_polygon_type
|
351
|
+
connection.create_table(table_name) do |t|
|
352
|
+
t.polygon :foo_polygon
|
353
|
+
end
|
354
|
+
|
355
|
+
assert_column_exists(:foo_polygon)
|
356
|
+
assert_type_correct(:foo_polygon, :polygon)
|
357
|
+
end
|
358
|
+
|
359
|
+
def test_creating_column_with_circle_type
|
360
|
+
connection.create_table(table_name) do |t|
|
361
|
+
t.circle :foo_circle
|
362
|
+
end
|
363
|
+
|
364
|
+
assert_column_exists(:foo_circle)
|
365
|
+
assert_type_correct(:foo_circle, :circle)
|
366
|
+
end
|
367
|
+
|
368
|
+
private
|
369
|
+
|
370
|
+
def assert_column_exists(column_name)
|
371
|
+
assert connection.column_exists?(table_name, column_name)
|
372
|
+
end
|
373
|
+
|
374
|
+
def assert_type_correct(column_name, type)
|
375
|
+
column = connection.columns(table_name).find { |c| c.name == column_name.to_s }
|
376
|
+
assert_equal type, column.type
|
377
|
+
end
|
378
|
+
end
|