ibm_db 5.6.1 → 5.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (592) hide show
  1. checksums.yaml +4 -4
  2. data/ext/Makefile +13 -9
  3. data/ext/extconf.rb +176 -110
  4. data/ext/ibm_db.c +60 -0
  5. data/ext/ibm_db.o +0 -0
  6. data/ext/ibm_db.so +0 -0
  7. data/ext/mkmf.log +6 -6
  8. data/ext/ruby_ibm_db_cli.c +14 -10
  9. data/ext/ruby_ibm_db_cli.h +4 -0
  10. data/ext/ruby_ibm_db_cli.o +0 -0
  11. data/lib/IBM_DB.rb +2 -2
  12. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1254 -277
  13. data/test/active_record/connection_adapters/fake_legacy_adapter.rb +17 -0
  14. data/test/active_record/connection_adapters/fake_misleading_legacy_adapter.rb +8 -0
  15. data/test/activejob/destroy_association_async_job_test.rb +62 -0
  16. data/test/activejob/destroy_association_async_test.rb +147 -11
  17. data/test/activejob/job_runtime_test.rb +41 -0
  18. data/test/activejob/unloadable_base_job.rb +3 -0
  19. data/test/cases/active_record_schema_test.rb +196 -0
  20. data/test/cases/active_record_test.rb +21 -0
  21. data/test/cases/adapter_prevent_writes_test.rb +26 -202
  22. data/test/cases/adapter_test.rb +592 -82
  23. data/test/cases/adapters/abstract_mysql_adapter/active_schema_test.rb +210 -0
  24. data/test/cases/adapters/abstract_mysql_adapter/adapter_prevent_writes_test.rb +111 -0
  25. data/test/cases/adapters/abstract_mysql_adapter/auto_increment_test.rb +48 -0
  26. data/test/cases/adapters/abstract_mysql_adapter/bind_parameter_test.rb +91 -0
  27. data/test/cases/adapters/abstract_mysql_adapter/case_sensitivity_test.rb +65 -0
  28. data/test/cases/adapters/abstract_mysql_adapter/charset_collation_test.rb +85 -0
  29. data/test/cases/adapters/abstract_mysql_adapter/connection_test.rb +267 -0
  30. data/test/cases/adapters/abstract_mysql_adapter/count_deleted_rows_with_lock_test.rb +29 -0
  31. data/test/cases/adapters/abstract_mysql_adapter/json_test.rb +24 -0
  32. data/test/cases/adapters/abstract_mysql_adapter/mysql_boolean_test.rb +102 -0
  33. data/test/cases/adapters/abstract_mysql_adapter/mysql_enum_test.rb +47 -0
  34. data/test/cases/adapters/abstract_mysql_adapter/mysql_explain_test.rb +71 -0
  35. data/test/cases/adapters/abstract_mysql_adapter/nested_deadlock_test.rb +191 -0
  36. data/test/cases/adapters/abstract_mysql_adapter/optimizer_hints_test.rb +69 -0
  37. data/test/cases/adapters/abstract_mysql_adapter/quoting_test.rb +49 -0
  38. data/test/cases/adapters/abstract_mysql_adapter/schema_migrations_test.rb +68 -0
  39. data/test/cases/adapters/abstract_mysql_adapter/schema_test.rb +130 -0
  40. data/test/cases/adapters/abstract_mysql_adapter/set_test.rb +32 -0
  41. data/test/cases/adapters/abstract_mysql_adapter/sp_test.rb +39 -0
  42. data/test/cases/adapters/abstract_mysql_adapter/sql_types_test.rb +16 -0
  43. data/test/cases/adapters/abstract_mysql_adapter/table_options_test.rb +125 -0
  44. data/test/cases/adapters/abstract_mysql_adapter/transaction_test.rb +204 -0
  45. data/test/cases/adapters/abstract_mysql_adapter/unsigned_type_test.rb +77 -0
  46. data/test/cases/adapters/abstract_mysql_adapter/virtual_column_test.rb +69 -0
  47. data/test/cases/adapters/abstract_mysql_adapter/warnings_test.rb +109 -0
  48. data/test/cases/adapters/mysql2/check_constraint_quoting_test.rb +35 -0
  49. data/test/cases/adapters/mysql2/dbconsole_test.rb +87 -0
  50. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +136 -10
  51. data/test/cases/adapters/mysql2/mysql2_rake_test.rb +433 -0
  52. data/test/cases/adapters/postgresql/active_schema_test.rb +8 -4
  53. data/test/cases/adapters/postgresql/array_test.rb +6 -6
  54. data/test/cases/adapters/postgresql/bind_parameter_test.rb +52 -0
  55. data/test/cases/adapters/postgresql/bit_string_test.rb +2 -2
  56. data/test/cases/adapters/postgresql/bytea_test.rb +3 -3
  57. data/test/cases/adapters/postgresql/case_insensitive_test.rb +1 -1
  58. data/test/cases/adapters/postgresql/change_schema_test.rb +32 -1
  59. data/test/cases/adapters/postgresql/cidr_test.rb +17 -0
  60. data/test/cases/adapters/postgresql/citext_test.rb +7 -1
  61. data/test/cases/adapters/postgresql/collation_test.rb +1 -1
  62. data/test/cases/adapters/postgresql/composite_test.rb +1 -1
  63. data/test/cases/adapters/postgresql/connection_test.rb +43 -36
  64. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +3 -2
  65. data/test/cases/adapters/postgresql/datatype_test.rb +9 -4
  66. data/test/cases/adapters/postgresql/date_test.rb +2 -2
  67. data/test/cases/adapters/postgresql/dbconsole_test.rb +109 -0
  68. data/test/cases/adapters/postgresql/deferred_constraints_test.rb +55 -0
  69. data/test/cases/adapters/postgresql/domain_test.rb +1 -1
  70. data/test/cases/adapters/postgresql/enum_test.rb +208 -8
  71. data/test/cases/adapters/postgresql/explain_test.rb +25 -6
  72. data/test/cases/adapters/postgresql/extension_migration_test.rb +51 -9
  73. data/test/cases/adapters/postgresql/foreign_table_test.rb +3 -3
  74. data/test/cases/adapters/postgresql/full_text_test.rb +1 -1
  75. data/test/cases/adapters/postgresql/geometric_test.rb +13 -6
  76. data/test/cases/adapters/postgresql/hstore_test.rb +22 -32
  77. data/test/cases/adapters/postgresql/infinity_test.rb +13 -2
  78. data/test/cases/adapters/postgresql/integer_test.rb +1 -1
  79. data/test/cases/adapters/postgresql/interval_test.rb +9 -17
  80. data/test/cases/adapters/postgresql/invertible_migration_test.rb +139 -0
  81. data/test/cases/adapters/postgresql/json_test.rb +5 -0
  82. data/test/cases/adapters/postgresql/ltree_test.rb +1 -1
  83. data/test/cases/adapters/postgresql/money_test.rb +17 -9
  84. data/test/cases/adapters/postgresql/network_test.rb +13 -1
  85. data/test/cases/adapters/postgresql/numbers_test.rb +18 -2
  86. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +9 -9
  87. data/test/cases/adapters/postgresql/partitions_test.rb +5 -2
  88. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +7 -110
  89. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +403 -20
  90. data/test/cases/adapters/postgresql/postgresql_rake_test.rb +637 -0
  91. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +1 -1
  92. data/test/cases/adapters/postgresql/quoting_test.rb +60 -1
  93. data/test/cases/adapters/postgresql/range_test.rb +185 -21
  94. data/test/cases/adapters/postgresql/referential_integrity_test.rb +29 -5
  95. data/test/cases/adapters/postgresql/rename_table_test.rb +35 -8
  96. data/test/cases/adapters/postgresql/schema_authorization_test.rb +2 -2
  97. data/test/cases/adapters/postgresql/schema_test.rb +270 -20
  98. data/test/cases/adapters/postgresql/serial_test.rb +5 -5
  99. data/test/cases/adapters/postgresql/statement_pool_test.rb +6 -2
  100. data/test/cases/adapters/postgresql/timestamp_test.rb +122 -5
  101. data/test/cases/adapters/postgresql/transaction_nested_test.rb +130 -6
  102. data/test/cases/adapters/postgresql/transaction_test.rb +37 -11
  103. data/test/cases/adapters/postgresql/type_lookup_test.rb +1 -1
  104. data/test/cases/adapters/postgresql/uuid_test.rb +77 -9
  105. data/test/cases/adapters/postgresql/virtual_column_test.rb +114 -0
  106. data/test/cases/adapters/postgresql/xml_test.rb +1 -1
  107. data/test/cases/adapters/sqlite3/bind_parameter_test.rb +52 -0
  108. data/test/cases/adapters/sqlite3/collation_test.rb +1 -1
  109. data/test/cases/adapters/sqlite3/copy_table_test.rb +28 -7
  110. data/test/cases/adapters/sqlite3/dbconsole_test.rb +81 -0
  111. data/test/cases/adapters/sqlite3/explain_test.rb +3 -3
  112. data/test/cases/adapters/sqlite3/quoting_test.rb +34 -3
  113. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +9 -102
  114. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +727 -72
  115. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +6 -3
  116. data/test/cases/adapters/sqlite3/sqlite_rake_test.rb +264 -0
  117. data/test/cases/adapters/sqlite3/statement_pool_test.rb +1 -1
  118. data/test/cases/adapters/sqlite3/transaction_test.rb +6 -3
  119. data/test/cases/adapters/sqlite3/virtual_column_test.rb +138 -0
  120. data/test/cases/adapters/sqlite3/virtual_table_test.rb +51 -0
  121. data/test/cases/adapters/trilogy/dbconsole_test.rb +76 -0
  122. data/test/cases/adapters/trilogy/trilogy_adapter_test.rb +473 -0
  123. data/test/cases/adapters/trilogy/trilogy_rake_test.rb +433 -0
  124. data/test/cases/aggregations_test.rb +16 -0
  125. data/test/cases/annotate_test.rb +14 -12
  126. data/test/cases/arel/attributes/attribute_test.rb +86 -47
  127. data/test/cases/arel/collectors/bind_test.rb +1 -1
  128. data/test/cases/arel/collectors/composite_test.rb +11 -1
  129. data/test/cases/arel/collectors/sql_string_test.rb +1 -1
  130. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +1 -1
  131. data/test/cases/arel/delete_manager_test.rb +0 -6
  132. data/test/cases/arel/factory_methods_test.rb +45 -0
  133. data/test/cases/arel/insert_manager_test.rb +1 -7
  134. data/test/cases/arel/nodes/as_test.rb +12 -0
  135. data/test/cases/arel/nodes/ascending_test.rb +1 -1
  136. data/test/cases/arel/nodes/bin_test.rb +1 -1
  137. data/test/cases/arel/nodes/bound_sql_literal_test.rb +31 -0
  138. data/test/cases/arel/nodes/cte_test.rb +46 -0
  139. data/test/cases/arel/nodes/descending_test.rb +1 -1
  140. data/test/cases/arel/nodes/equality_test.rb +3 -3
  141. data/test/cases/arel/nodes/filter_test.rb +37 -0
  142. data/test/cases/arel/nodes/fragments_test.rb +38 -0
  143. data/test/cases/arel/nodes/homogeneous_in_test.rb +52 -0
  144. data/test/cases/arel/nodes/infix_operation_test.rb +1 -1
  145. data/test/cases/arel/nodes/node_test.rb +1 -1
  146. data/test/cases/arel/nodes/or_test.rb +2 -2
  147. data/test/cases/arel/nodes/sql_literal_test.rb +18 -1
  148. data/test/cases/arel/nodes/table_alias_test.rb +12 -0
  149. data/test/cases/arel/nodes/unary_operation_test.rb +1 -1
  150. data/test/cases/arel/nodes/update_statement_test.rb +4 -0
  151. data/test/cases/arel/nodes_test.rb +3 -2
  152. data/test/cases/arel/select_manager_test.rb +12 -12
  153. data/test/cases/arel/support/fake_record.rb +22 -17
  154. data/test/cases/arel/table_test.rb +15 -25
  155. data/test/cases/arel/update_manager_test.rb +51 -6
  156. data/test/cases/arel/visitors/dispatch_contamination_test.rb +1 -1
  157. data/test/cases/arel/visitors/dot_test.rb +177 -2
  158. data/test/cases/arel/visitors/mysql_test.rb +49 -1
  159. data/test/cases/arel/visitors/postgres_test.rb +1 -31
  160. data/test/cases/arel/visitors/sqlite_test.rb +1 -1
  161. data/test/cases/arel/visitors/to_sql_test.rb +330 -20
  162. data/test/cases/assertions/query_assertions_test.rb +136 -0
  163. data/test/cases/associations/belongs_to_associations_test.rb +502 -41
  164. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +1 -1
  165. data/test/cases/associations/cascaded_eager_loading_test.rb +26 -15
  166. data/test/cases/associations/eager_load_nested_include_test.rb +1 -1
  167. data/test/cases/associations/eager_singularization_test.rb +1 -1
  168. data/test/cases/associations/eager_test.rb +255 -93
  169. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +25 -53
  170. data/test/cases/associations/has_many_associations_test.rb +282 -72
  171. data/test/cases/associations/has_many_through_associations_test.rb +172 -45
  172. data/test/cases/associations/has_many_through_disable_joins_associations_test.rb +197 -0
  173. data/test/cases/associations/has_one_associations_test.rb +160 -29
  174. data/test/cases/associations/has_one_through_associations_test.rb +64 -15
  175. data/test/cases/associations/has_one_through_disable_joins_associations_test.rb +82 -0
  176. data/test/cases/associations/inner_join_association_test.rb +36 -6
  177. data/test/cases/associations/inverse_associations_test.rb +177 -40
  178. data/test/cases/associations/join_model_test.rb +17 -12
  179. data/test/cases/associations/left_outer_join_association_test.rb +14 -3
  180. data/test/cases/associations/nested_error_test.rb +116 -0
  181. data/test/cases/associations/nested_through_associations_test.rb +54 -19
  182. data/test/cases/associations/required_test.rb +1 -1
  183. data/test/cases/associations_test.rb +1278 -21
  184. data/test/cases/asynchronous_queries_test.rb +310 -0
  185. data/test/cases/attribute_methods/read_test.rb +6 -0
  186. data/test/cases/attribute_methods/time_zone_converter_test.rb +21 -0
  187. data/test/cases/attribute_methods_test.rb +565 -46
  188. data/test/cases/attributes_test.rb +42 -1
  189. data/test/cases/autosave_association_test.rb +645 -92
  190. data/test/cases/base_prevent_writes_test.rb +28 -159
  191. data/test/cases/base_test.rb +434 -209
  192. data/test/cases/batches_test.rb +441 -57
  193. data/test/cases/binary_test.rb +31 -0
  194. data/test/cases/bind_parameter_test.rb +107 -16
  195. data/test/cases/cache_key_test.rb +7 -7
  196. data/test/cases/calculations_test.rb +541 -110
  197. data/test/cases/callbacks_test.rb +0 -1
  198. data/test/cases/clone_test.rb +5 -4
  199. data/test/cases/coders/yaml_column_test.rb +97 -2
  200. data/test/cases/collection_cache_key_test.rb +24 -16
  201. data/test/cases/column_alias_test.rb +2 -8
  202. data/test/cases/column_definition_test.rb +12 -3
  203. data/test/cases/comment_test.rb +23 -26
  204. data/test/cases/connection_adapters/adapter_leasing_test.rb +9 -9
  205. data/test/cases/connection_adapters/connection_handler_test.rb +145 -99
  206. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +79 -55
  207. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +17 -20
  208. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +146 -55
  209. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +136 -23
  210. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +96 -27
  211. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -5
  212. data/test/cases/connection_adapters/registration_test.rb +98 -0
  213. data/test/cases/connection_adapters/schema_cache_test.rb +288 -135
  214. data/test/cases/connection_adapters/standalone_connection_test.rb +38 -0
  215. data/test/cases/connection_adapters/statement_pool_test.rb +29 -0
  216. data/test/cases/connection_adapters/type_lookup_test.rb +12 -24
  217. data/test/cases/connection_handling_test.rb +210 -0
  218. data/test/cases/connection_management_test.rb +44 -7
  219. data/test/cases/connection_pool_test.rb +466 -99
  220. data/test/cases/core_test.rb +167 -9
  221. data/test/cases/counter_cache_test.rb +129 -2
  222. data/test/cases/custom_locking_test.rb +3 -3
  223. data/test/cases/database_configurations/hash_config_test.rb +149 -13
  224. data/test/cases/database_configurations/resolver_test.rb +14 -10
  225. data/test/cases/database_configurations/url_config_test.rb +53 -0
  226. data/test/cases/database_configurations_test.rb +86 -43
  227. data/test/cases/database_selector_test.rb +30 -8
  228. data/test/cases/database_statements_test.rb +10 -14
  229. data/test/cases/date_time_precision_test.rb +141 -11
  230. data/test/cases/date_time_test.rb +19 -1
  231. data/test/cases/defaults_test.rb +107 -41
  232. data/test/cases/delegated_type_test.rb +69 -9
  233. data/test/cases/dirty_test.rb +82 -25
  234. data/test/cases/disconnected_test.rb +10 -9
  235. data/test/cases/dup_test.rb +26 -6
  236. data/test/cases/encryption/cipher/aes256_gcm_test.rb +50 -0
  237. data/test/cases/encryption/cipher_test.rb +65 -0
  238. data/test/cases/encryption/concurrency_test.rb +27 -0
  239. data/test/cases/encryption/config_test.rb +21 -0
  240. data/test/cases/encryption/configurable_test.rb +93 -0
  241. data/test/cases/encryption/contexts_test.rb +105 -0
  242. data/test/cases/encryption/derived_secret_key_provider_test.rb +31 -0
  243. data/test/cases/encryption/deterministic_key_provider_test.rb +11 -0
  244. data/test/cases/encryption/encryptable_record_api_test.rb +175 -0
  245. data/test/cases/encryption/encryptable_record_message_pack_serialized_test.rb +42 -0
  246. data/test/cases/encryption/encryptable_record_test.rb +470 -0
  247. data/test/cases/encryption/encrypted_fixtures_test.rb +22 -0
  248. data/test/cases/encryption/encrypting_only_encryptor_test.rb +20 -0
  249. data/test/cases/encryption/encryption_schemes_test.rb +240 -0
  250. data/test/cases/encryption/encryptor_test.rb +113 -0
  251. data/test/cases/encryption/envelope_encryption_key_provider_test.rb +49 -0
  252. data/test/cases/encryption/extended_deterministic_queries_test.rb +81 -0
  253. data/test/cases/encryption/helper.rb +152 -0
  254. data/test/cases/encryption/key_generator_test.rb +55 -0
  255. data/test/cases/encryption/key_provider_test.rb +57 -0
  256. data/test/cases/encryption/key_test.rb +17 -0
  257. data/test/cases/encryption/message_pack_message_serializer_test.rb +70 -0
  258. data/test/cases/encryption/message_serializer_test.rb +82 -0
  259. data/test/cases/encryption/message_test.rb +43 -0
  260. data/test/cases/encryption/null_encryptor_test.rb +21 -0
  261. data/test/cases/encryption/properties_test.rb +69 -0
  262. data/test/cases/encryption/read_only_null_encryptor_test.rb +19 -0
  263. data/test/cases/encryption/scheme_test.rb +58 -0
  264. data/test/cases/encryption/unencrypted_attributes_test.rb +27 -0
  265. data/test/cases/encryption/uniqueness_validations_test.rb +65 -0
  266. data/test/cases/enum_test.rb +374 -72
  267. data/test/cases/errors_test.rb +7 -4
  268. data/test/cases/excluding_test.rb +116 -0
  269. data/test/cases/explain_subscriber_test.rb +6 -1
  270. data/test/cases/explain_test.rb +119 -10
  271. data/test/cases/filter_attributes_test.rb +7 -14
  272. data/test/cases/finder_respond_to_test.rb +3 -3
  273. data/test/cases/finder_test.rb +357 -72
  274. data/test/cases/fixture_set/file_test.rb +9 -0
  275. data/test/cases/fixtures_test.rb +426 -190
  276. data/test/cases/helper.rb +66 -192
  277. data/test/cases/hot_compatibility_test.rb +10 -10
  278. data/test/cases/inheritance_test.rb +51 -61
  279. data/test/cases/inherited_test.rb +40 -0
  280. data/test/cases/insert_all_test.rb +419 -9
  281. data/test/cases/instrumentation_test.rb +202 -30
  282. data/test/cases/integration_test.rb +25 -7
  283. data/test/cases/invalid_connection_test.rb +5 -5
  284. data/test/cases/invertible_migration_test.rb +108 -24
  285. data/test/cases/json_attribute_test.rb +1 -0
  286. data/test/cases/json_serialization_test.rb +5 -5
  287. data/test/cases/json_shared_test_cases.rb +5 -9
  288. data/test/cases/locking_test.rb +67 -31
  289. data/test/cases/log_subscriber_test.rb +17 -15
  290. data/test/cases/marshal_serialization_test.rb +78 -5
  291. data/test/cases/message_pack_test.rb +91 -0
  292. data/test/cases/migration/change_schema_test.rb +77 -46
  293. data/test/cases/migration/change_table_test.rb +129 -114
  294. data/test/cases/migration/check_constraint_test.rb +192 -10
  295. data/test/cases/migration/column_attributes_test.rb +4 -9
  296. data/test/cases/migration/column_positioning_test.rb +2 -2
  297. data/test/cases/migration/columns_test.rb +118 -4
  298. data/test/cases/migration/command_recorder_test.rb +181 -14
  299. data/test/cases/migration/compatibility_test.rb +883 -196
  300. data/test/cases/migration/create_join_table_test.rb +8 -1
  301. data/test/cases/migration/exclusion_constraint_test.rb +192 -0
  302. data/test/cases/migration/foreign_key_test.rb +356 -14
  303. data/test/cases/migration/helper.rb +4 -1
  304. data/test/cases/migration/index_test.rb +67 -2
  305. data/test/cases/migration/invalid_options_test.rb +129 -0
  306. data/test/cases/migration/logger_test.rb +7 -4
  307. data/test/cases/migration/pending_migrations_test.rb +103 -60
  308. data/test/cases/migration/references_foreign_key_test.rb +73 -4
  309. data/test/cases/migration/references_index_test.rb +25 -27
  310. data/test/cases/migration/references_statements_test.rb +27 -3
  311. data/test/cases/migration/rename_table_test.rb +39 -54
  312. data/test/cases/migration/schema_definitions_test.rb +109 -0
  313. data/test/cases/migration/unique_constraint_test.rb +248 -0
  314. data/test/cases/migration_test.rb +677 -220
  315. data/test/cases/migrator_test.rb +102 -75
  316. data/test/cases/multi_db_migrator_test.rb +55 -34
  317. data/test/cases/multiparameter_attributes_test.rb +26 -29
  318. data/test/cases/multiple_db_test.rb +42 -19
  319. data/test/cases/nested_attributes_test.rb +124 -6
  320. data/test/cases/nested_attributes_with_callbacks_test.rb +2 -2
  321. data/test/cases/normalized_attribute_test.rb +117 -0
  322. data/test/cases/null_relation_test.rb +35 -2
  323. data/test/cases/persistence/reload_association_cache_test.rb +20 -0
  324. data/test/cases/persistence_test.rb +629 -22
  325. data/test/cases/pooled_connections_test.rb +57 -56
  326. data/test/cases/prepared_statement_status_test.rb +8 -3
  327. data/test/cases/primary_class_test.rb +134 -0
  328. data/test/cases/primary_keys_test.rb +171 -55
  329. data/test/cases/query_cache_test.rb +558 -263
  330. data/test/cases/query_logs_test.rb +293 -0
  331. data/test/cases/quoting_test.rb +39 -72
  332. data/test/cases/readonly_test.rb +50 -12
  333. data/test/cases/reaper_test.rb +22 -6
  334. data/test/cases/reflection_test.rb +207 -9
  335. data/test/cases/relation/and_test.rb +43 -0
  336. data/test/cases/relation/delegation_test.rb +32 -5
  337. data/test/cases/relation/delete_all_test.rb +27 -6
  338. data/test/cases/relation/field_ordered_values_test.rb +128 -0
  339. data/test/cases/relation/load_async_test.rb +650 -0
  340. data/test/cases/relation/merging_test.rb +80 -109
  341. data/test/cases/relation/mutation_test.rb +12 -7
  342. data/test/cases/relation/or_test.rb +11 -8
  343. data/test/cases/relation/order_test.rb +90 -0
  344. data/test/cases/relation/predicate_builder_test.rb +21 -6
  345. data/test/cases/relation/select_test.rb +162 -3
  346. data/test/cases/relation/structural_compatibility_test.rb +38 -0
  347. data/test/cases/relation/update_all_test.rb +81 -27
  348. data/test/cases/relation/where_chain_test.rb +190 -3
  349. data/test/cases/relation/where_clause_test.rb +43 -1
  350. data/test/cases/relation/where_test.rb +95 -7
  351. data/test/cases/relation/with_test.rb +165 -0
  352. data/test/cases/relation_test.rb +42 -37
  353. data/test/cases/relations_test.rb +436 -138
  354. data/test/cases/reload_models_test.rb +18 -14
  355. data/test/cases/reserved_word_test.rb +2 -1
  356. data/test/cases/result_test.rb +14 -22
  357. data/test/cases/sanitize_test.rb +89 -27
  358. data/test/cases/schema_dumper_test.rb +535 -62
  359. data/test/cases/scoping/default_scoping_test.rb +219 -35
  360. data/test/cases/scoping/named_scoping_test.rb +25 -46
  361. data/test/cases/scoping/relation_scoping_test.rb +112 -4
  362. data/test/cases/secure_password_test.rb +108 -0
  363. data/test/cases/secure_token_test.rb +72 -0
  364. data/test/cases/serialization_test.rb +1 -1
  365. data/test/cases/serialized_attribute_test.rb +305 -60
  366. data/test/cases/shard_keys_test.rb +125 -0
  367. data/test/cases/shard_selector_test.rb +45 -0
  368. data/test/cases/signed_id_test.rb +57 -5
  369. data/test/cases/statement_cache_test.rb +31 -30
  370. data/test/cases/statement_invalid_test.rb +8 -4
  371. data/test/cases/store_test.rb +73 -9
  372. data/test/cases/strict_loading_test.rb +327 -13
  373. data/test/cases/table_metadata_test.rb +16 -0
  374. data/test/cases/tasks/database_tasks_test.rb +517 -244
  375. data/test/cases/test_case.rb +254 -60
  376. data/test/cases/test_case_test.rb +69 -0
  377. data/test/cases/test_databases_test.rb +7 -3
  378. data/test/cases/test_fixtures_test.rb +19 -40
  379. data/test/cases/time_precision_test.rb +17 -5
  380. data/test/cases/timestamp_test.rb +124 -16
  381. data/test/cases/token_for_test.rb +165 -0
  382. data/test/cases/touch_later_test.rb +43 -1
  383. data/test/cases/transaction_callbacks_test.rb +325 -8
  384. data/test/cases/transaction_instrumentation_test.rb +453 -0
  385. data/test/cases/transaction_isolation_test.rb +12 -8
  386. data/test/cases/transactions_test.rb +629 -112
  387. data/test/cases/type/date_time_test.rb +7 -1
  388. data/test/cases/type/time_test.rb +9 -0
  389. data/test/cases/type/type_map_test.rb +108 -73
  390. data/test/cases/type/unsigned_integer_test.rb +12 -0
  391. data/test/cases/type_caster/connection_test.rb +19 -0
  392. data/test/cases/type_test.rb +1 -1
  393. data/test/cases/unconnected_test.rb +7 -7
  394. data/test/cases/unsafe_raw_sql_test.rb +39 -8
  395. data/test/cases/validations/absence_validation_test.rb +1 -1
  396. data/test/cases/validations/association_validation_test.rb +25 -3
  397. data/test/cases/validations/numericality_validation_test.rb +3 -9
  398. data/test/cases/validations/presence_validation_test.rb +1 -1
  399. data/test/cases/validations/uniqueness_validation_test.rb +280 -40
  400. data/test/cases/validations_test.rb +2 -2
  401. data/test/cases/view_test.rb +33 -22
  402. data/test/cases/yaml_serialization_test.rb +23 -17
  403. data/test/config.example.yml +58 -56
  404. data/test/config.rb +1 -0
  405. data/test/fixtures/1_need_quoting.yml +2 -0
  406. data/test/fixtures/accounts.yml +5 -0
  407. data/test/fixtures/aircrafts.yml +7 -0
  408. data/test/fixtures/book_identifiers.yml +11 -0
  409. data/test/fixtures/books.yml +5 -4
  410. data/test/fixtures/cake_designers.yml +5 -0
  411. data/test/fixtures/cars.yml +6 -0
  412. data/test/fixtures/chefs.yml +5 -0
  413. data/test/fixtures/clothing_items.yml +23 -0
  414. data/test/fixtures/clubs.yml +1 -1
  415. data/test/fixtures/comments.yml +2 -1
  416. data/test/fixtures/cpk_authors.yml +8 -0
  417. data/test/fixtures/cpk_books.yml +21 -0
  418. data/test/fixtures/cpk_order_agreements.yml +13 -0
  419. data/test/fixtures/cpk_order_tags.yml +15 -0
  420. data/test/fixtures/cpk_orders.yml +11 -0
  421. data/test/fixtures/cpk_posts.yml +12 -0
  422. data/test/fixtures/cpk_reviews.yml +13 -0
  423. data/test/fixtures/cpk_tags.yml +11 -0
  424. data/test/fixtures/drink_designers.yml +5 -0
  425. data/test/fixtures/encrypted_book_that_ignores_cases.yml +4 -0
  426. data/test/fixtures/encrypted_books.yml +4 -0
  427. data/test/fixtures/fk_object_to_point_to.yml +2 -0
  428. data/test/fixtures/memberships.yml +15 -15
  429. data/test/fixtures/paragraphs.yml +5 -0
  430. data/test/fixtures/parrots.yml +4 -0
  431. data/test/fixtures/people.yml +2 -0
  432. data/test/fixtures/pirates.yml +2 -2
  433. data/test/fixtures/primary_key_error/primary_key_error.yml +6 -0
  434. data/test/fixtures/references.yml +3 -3
  435. data/test/fixtures/sharded_blog_posts.yml +14 -0
  436. data/test/fixtures/sharded_blog_posts_tags.yml +27 -0
  437. data/test/fixtures/sharded_blogs.yml +8 -0
  438. data/test/fixtures/sharded_comments.yml +22 -0
  439. data/test/fixtures/sharded_tags.yml +34 -0
  440. data/test/fixtures/sponsors.yml +2 -2
  441. data/test/fixtures/topics.yml +1 -0
  442. data/test/fixtures/treasures.yml +4 -0
  443. data/test/fixtures/virtual_columns.yml +5 -0
  444. data/test/fixtures/warehouse_things.yml +1 -1
  445. data/test/migrations/old_and_new_versions/20210716122844_add_people_description.rb +5 -0
  446. data/test/migrations/old_and_new_versions/20210716123013_add_people_number_of_legs.rb +5 -0
  447. data/test/migrations/old_and_new_versions/230_add_people_hobby.rb +5 -0
  448. data/test/migrations/old_and_new_versions/231_add_people_last_name.rb +5 -0
  449. data/test/migrations/scope/1_unscoped.rb +7 -0
  450. data/test/migrations/scope/2_mysql_only.mysql.rb +7 -0
  451. data/test/models/admin/user.rb +2 -0
  452. data/test/models/admin/user_json.rb +48 -0
  453. data/test/models/attachment.rb +7 -0
  454. data/test/models/author.rb +70 -3
  455. data/test/models/author_encrypted.rb +16 -0
  456. data/test/models/bird.rb +1 -1
  457. data/test/models/book.rb +18 -11
  458. data/test/models/book_destroy_async.rb +1 -1
  459. data/test/models/book_encrypted.rb +106 -0
  460. data/test/models/book_identifier.rb +5 -0
  461. data/test/models/branch.rb +11 -0
  462. data/test/models/bulb.rb +1 -1
  463. data/test/models/car.rb +8 -1
  464. data/test/models/cat.rb +1 -1
  465. data/test/models/category.rb +3 -1
  466. data/test/models/chat_message.rb +8 -0
  467. data/test/models/chef.rb +52 -0
  468. data/test/models/clothing_item.rb +12 -0
  469. data/test/models/club.rb +4 -1
  470. data/test/models/comment.rb +7 -4
  471. data/test/models/comment_overlapping_counter_cache.rb +15 -0
  472. data/test/models/company.rb +16 -2
  473. data/test/models/computer.rb +1 -0
  474. data/test/models/contact.rb +3 -3
  475. data/test/models/contract.rb +5 -1
  476. data/test/models/cpk/author.rb +9 -0
  477. data/test/models/cpk/book.rb +55 -0
  478. data/test/models/cpk/book_destroy_async.rb +9 -0
  479. data/test/models/cpk/car.rb +9 -0
  480. data/test/models/cpk/car_review.rb +9 -0
  481. data/test/models/cpk/chapter.rb +16 -0
  482. data/test/models/cpk/chapter_destroy_async.rb +10 -0
  483. data/test/models/cpk/comment.rb +9 -0
  484. data/test/models/cpk/order.rb +55 -0
  485. data/test/models/cpk/order_agreement.rb +10 -0
  486. data/test/models/cpk/order_tag.rb +10 -0
  487. data/test/models/cpk/post.rb +10 -0
  488. data/test/models/cpk/posts_tag.rb +10 -0
  489. data/test/models/cpk/review.rb +9 -0
  490. data/test/models/cpk/tag.rb +10 -0
  491. data/test/models/cpk.rb +15 -0
  492. data/test/models/customer.rb +3 -1
  493. data/test/models/destroy_async_parent.rb +1 -1
  494. data/test/models/developer.rb +44 -3
  495. data/test/models/discount.rb +4 -0
  496. data/test/models/drink_designer.rb +1 -0
  497. data/test/models/editor.rb +8 -0
  498. data/test/models/editorship.rb +6 -0
  499. data/test/models/entry.rb +5 -0
  500. data/test/models/essay.rb +6 -1
  501. data/test/models/essay_destroy_async.rb +1 -0
  502. data/test/models/eye.rb +87 -21
  503. data/test/models/face.rb +1 -1
  504. data/test/models/friendship.rb +3 -0
  505. data/test/models/hardback.rb +7 -0
  506. data/test/models/hotel.rb +2 -0
  507. data/test/models/human.rb +2 -2
  508. data/test/models/invoice.rb +2 -1
  509. data/test/models/invokes_an_undefined_method.rb +5 -0
  510. data/test/models/line_item.rb +6 -0
  511. data/test/models/member.rb +9 -4
  512. data/test/models/membership.rb +2 -2
  513. data/test/models/message.rb +2 -1
  514. data/test/models/need_quoting.rb +5 -0
  515. data/test/models/paragraph.rb +5 -0
  516. data/test/models/parrot.rb +6 -3
  517. data/test/models/person.rb +7 -4
  518. data/test/models/pirate.rb +4 -1
  519. data/test/models/pk_autopopulated_by_a_trigger_record.rb +5 -0
  520. data/test/models/post.rb +65 -2
  521. data/test/models/post_encrypted.rb +15 -0
  522. data/test/models/post_with_prefetched_pk.rb +15 -0
  523. data/test/models/project.rb +1 -0
  524. data/test/models/publication.rb +16 -0
  525. data/test/models/raises_argument_error.rb +5 -0
  526. data/test/models/raises_no_method_error.rb +5 -0
  527. data/test/models/recipient.rb +5 -0
  528. data/test/models/reference.rb +1 -1
  529. data/test/models/reply.rb +1 -1
  530. data/test/models/room.rb +3 -0
  531. data/test/models/sharded/blog.rb +12 -0
  532. data/test/models/sharded/blog_post.rb +17 -0
  533. data/test/models/sharded/blog_post_destroy_async.rb +14 -0
  534. data/test/models/sharded/blog_post_tag.rb +11 -0
  535. data/test/models/sharded/blog_post_with_revision.rb +11 -0
  536. data/test/models/sharded/comment.rb +12 -0
  537. data/test/models/sharded/comment_destroy_async.rb +12 -0
  538. data/test/models/sharded/tag.rb +11 -0
  539. data/test/models/sharded.rb +8 -0
  540. data/test/models/ship.rb +1 -1
  541. data/test/models/shipping_line.rb +11 -0
  542. data/test/models/subscriber.rb +1 -0
  543. data/test/models/subscription.rb +3 -1
  544. data/test/models/too_long_table_name.rb +5 -0
  545. data/test/models/topic.rb +3 -1
  546. data/test/models/traffic_light.rb +2 -2
  547. data/test/models/traffic_light_encrypted.rb +21 -0
  548. data/test/models/translation.rb +9 -0
  549. data/test/models/treasure.rb +1 -1
  550. data/test/models/tyre.rb +1 -1
  551. data/test/models/user.rb +16 -0
  552. data/test/models/user_with_invalid_relation.rb +28 -0
  553. data/test/models/uuid_comment.rb +5 -0
  554. data/test/models/uuid_entry.rb +5 -0
  555. data/test/models/uuid_message.rb +5 -0
  556. data/test/models/zine.rb +2 -1
  557. data/test/schema/mysql2_specific_schema.rb +26 -12
  558. data/test/schema/postgresql_specific_schema.rb +121 -13
  559. data/test/schema/schema.rb +361 -103
  560. data/test/schema/sqlite_specific_schema.rb +17 -6
  561. data/test/schema/trilogy_specific_schema.rb +96 -0
  562. data/test/support/adapter_helper.rb +104 -0
  563. data/test/support/async_helper.rb +15 -0
  564. data/test/support/config.rb +1 -1
  565. data/test/support/connection.rb +14 -2
  566. data/test/support/ddl_helper.rb +1 -1
  567. data/test/support/fake_adapter.rb +42 -0
  568. data/test/support/load_schema_helper.rb +22 -0
  569. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_1_topic.dump +0 -0
  570. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_1_topic_associations.dump +0 -0
  571. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_7_1_topic.dump +0 -0
  572. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_7_1_topic_associations.dump +0 -0
  573. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_1_topic.dump +0 -0
  574. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_1_topic_associations.dump +0 -0
  575. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_7_1_topic.dump +0 -0
  576. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_7_1_topic_associations.dump +0 -0
  577. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_1_topic.dump +0 -0
  578. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_1_topic_associations.dump +0 -0
  579. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_7_1_topic.dump +0 -0
  580. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_7_1_topic_associations.dump +0 -0
  581. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_1_topic.dump +0 -0
  582. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_1_topic_associations.dump +0 -0
  583. data/test/support/marshal_compatibility_fixtures/SQLite/rails_7_1_topic.dump +0 -0
  584. data/test/support/marshal_compatibility_fixtures/SQLite/rails_7_1_topic_associations.dump +0 -0
  585. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_6_1_topic.dump +0 -0
  586. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_6_1_topic_associations.dump +0 -0
  587. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_7_1_topic.dump +0 -0
  588. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_7_1_topic_associations.dump +0 -0
  589. data/test/support/schema_dumping_helper.rb +15 -9
  590. data/test/support/tools.rb +37 -0
  591. data/test/support/yaml_compatibility_fixtures/rails_4_1_no_symbol.yml +22 -0
  592. metadata +247 -15
@@ -17,6 +17,7 @@ end
17
17
 
18
18
  class SchemaTest < ActiveRecord::PostgreSQLTestCase
19
19
  include PGSchemaHelper
20
+ include SchemaDumpingHelper
20
21
  self.use_transactional_tests = false
21
22
 
22
23
  SCHEMA_NAME = "test_schema"
@@ -80,7 +81,7 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
80
81
  end
81
82
 
82
83
  def setup
83
- @connection = ActiveRecord::Base.connection
84
+ @connection = ActiveRecord::Base.lease_connection
84
85
  @connection.execute "CREATE SCHEMA #{SCHEMA_NAME} CREATE TABLE #{TABLE_NAME} (#{COLUMNS.join(',')})"
85
86
  @connection.execute "CREATE TABLE #{SCHEMA_NAME}.\"#{TABLE_NAME}.table\" (#{COLUMNS.join(',')})"
86
87
  @connection.execute "CREATE TABLE #{SCHEMA_NAME}.\"#{CAPITALIZED_TABLE_NAME}\" (#{COLUMNS.join(',')})"
@@ -130,6 +131,32 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
130
131
  @connection.drop_schema "test_schema3"
131
132
  end
132
133
 
134
+ def test_force_create_schema
135
+ @connection.create_schema "test_schema3"
136
+ assert_queries_match(/DROP SCHEMA IF EXISTS "test_schema3"/) do
137
+ @connection.create_schema "test_schema3", force: true
138
+ end
139
+ assert @connection.schema_names.include?("test_schema3")
140
+ ensure
141
+ @connection.drop_schema "test_schema3"
142
+ end
143
+
144
+ def test_create_schema_if_not_exists
145
+ @connection.create_schema "test_schema3"
146
+ assert_queries_match('CREATE SCHEMA IF NOT EXISTS "test_schema3"') do
147
+ @connection.create_schema "test_schema3", if_not_exists: true
148
+ end
149
+ assert @connection.schema_names.include?("test_schema3")
150
+ ensure
151
+ @connection.drop_schema "test_schema3"
152
+ end
153
+
154
+ def test_create_schema_raises_if_both_force_and_if_not_exists_provided
155
+ assert_raises(ArgumentError, match: "Options `:force` and `:if_not_exists` cannot be used simultaneously.") do
156
+ @connection.create_schema "test_schema3", force: true, if_not_exists: true
157
+ end
158
+ end
159
+
133
160
  def test_drop_schema
134
161
  begin
135
162
  @connection.create_schema "test_schema3"
@@ -147,9 +174,9 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
147
174
  end
148
175
 
149
176
  def test_habtm_table_name_with_schema
150
- ActiveRecord::Base.connection.drop_schema "music", if_exists: true
151
- ActiveRecord::Base.connection.create_schema "music"
152
- ActiveRecord::Base.connection.execute <<~SQL
177
+ ActiveRecord::Base.lease_connection.drop_schema "music", if_exists: true
178
+ ActiveRecord::Base.lease_connection.create_schema "music"
179
+ ActiveRecord::Base.lease_connection.execute <<~SQL
153
180
  CREATE TABLE music.albums (id serial primary key, deleted boolean default false);
154
181
  CREATE TABLE music.songs (id serial primary key);
155
182
  CREATE TABLE music.albums_songs (album_id integer, song_id integer);
@@ -158,8 +185,10 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
158
185
  song = Song.create
159
186
  album = song.albums.create
160
187
  assert_equal song, Song.includes(:albums).where("albums.id": album.id).first
188
+ assert_equal [album.id], Song.joins(:albums).pluck("albums.id")
189
+ assert_equal [album.id], Song.joins(:albums).pluck("music.albums.id")
161
190
  ensure
162
- ActiveRecord::Base.connection.drop_schema "music", if_exists: true
191
+ ActiveRecord::Base.lease_connection.drop_schema "music", if_exists: true
163
192
  end
164
193
 
165
194
  def test_drop_schema_with_nonexisting_schema
@@ -178,13 +207,16 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
178
207
  end
179
208
  end
180
209
 
181
- if ActiveRecord::Base.connection.prepared_statements
210
+ if ActiveRecord::Base.lease_connection.prepared_statements
182
211
  def test_schema_change_with_prepared_stmt
183
212
  altered = false
184
- @connection.exec_query "select * from developers where id = $1", "sql", [bind_param(1)]
185
- @connection.exec_query "alter table developers add column zomg int", "sql", []
186
- altered = true
187
- @connection.exec_query "select * from developers where id = $1", "sql", [bind_param(1)]
213
+ assert_nothing_raised do
214
+ @connection.exec_query "select * from developers where id = $1", "sql", [bind_param(1)]
215
+ @connection.exec_query "alter table developers add column zomg int", "sql", []
216
+ altered = true
217
+ @connection.exec_query "select * from developers where id = $1", "sql", [bind_param(1)]
218
+ end
219
+ pass
188
220
  ensure
189
221
  # We are not using DROP COLUMN IF EXISTS because that syntax is only
190
222
  # supported by pg 9.X
@@ -260,6 +292,16 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
260
292
  assert_equal '"schema.name"."table.name"', @connection.quote_table_name('"schema.name"."table.name"')
261
293
  end
262
294
 
295
+ def test_where_with_qualified_schema_name
296
+ Thing1.create(id: 1, name: "thing1", email: "thing1@localhost", moment: Time.now)
297
+ assert_equal ["thing1"], Thing1.where("test_schema.things.name": "thing1").map(&:name)
298
+ end
299
+
300
+ def test_pluck_with_qualified_schema_name
301
+ Thing1.create(id: 1, name: "thing1", email: "thing1@localhost", moment: Time.now)
302
+ assert_equal ["thing1"], Thing1.pluck(:"test_schema.things.name")
303
+ end
304
+
263
305
  def test_classes_with_qualified_schema_name
264
306
  assert_equal 0, Thing1.count
265
307
  assert_equal 0, Thing2.count
@@ -321,6 +363,8 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
321
363
  assert @connection.index_name_exists?(PARTITIONED_TABLE, PARTITIONED_TABLE_INDEX)
322
364
  end
323
365
  end
366
+
367
+ assert @connection.index_name_exists?("#{SCHEMA_NAME}.#{TABLE_NAME}", INDEX_A_NAME)
324
368
  end
325
369
 
326
370
  def test_dump_indexes_for_schema_one
@@ -475,6 +519,22 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
475
519
  @connection.reset_pk_sequence! table_name
476
520
  end
477
521
 
522
+ def test_rename_index
523
+ old_name = INDEX_A_NAME
524
+ new_name = "#{old_name}_new"
525
+ @connection.rename_index("#{SCHEMA_NAME}.#{TABLE_NAME}", old_name, new_name)
526
+ assert_not @connection.index_name_exists?("#{SCHEMA_NAME}.#{TABLE_NAME}", old_name)
527
+ assert @connection.index_name_exists?("#{SCHEMA_NAME}.#{TABLE_NAME}", new_name)
528
+ end
529
+
530
+ def test_dumping_schemas
531
+ output = dump_all_table_schema(/./)
532
+
533
+ assert_no_match %r{create_schema "public"}, output
534
+ assert_match %r{create_schema "test_schema"}, output
535
+ assert_match %r{create_schema "test_schema2"}, output
536
+ end
537
+
478
538
  private
479
539
  def columns(table_name)
480
540
  @connection.send(:column_definitions, table_name).map do |name, type, default|
@@ -528,24 +588,48 @@ class SchemaForeignKeyTest < ActiveRecord::PostgreSQLTestCase
528
588
  include SchemaDumpingHelper
529
589
 
530
590
  setup do
531
- @connection = ActiveRecord::Base.connection
591
+ @connection = ActiveRecord::Base.lease_connection
592
+ @connection.create_schema("my_schema")
593
+ end
594
+
595
+ teardown do
596
+ @connection.drop_schema("my_schema", if_exists: true)
532
597
  end
533
598
 
534
599
  def test_dump_foreign_key_targeting_different_schema
535
- @connection.create_schema "my_schema"
536
600
  @connection.create_table "my_schema.trains" do |t|
537
601
  t.string :name
538
602
  end
539
603
  @connection.create_table "wagons" do |t|
540
604
  t.integer :train_id
541
605
  end
542
- @connection.add_foreign_key "wagons", "my_schema.trains", column: "train_id"
606
+ @connection.add_foreign_key "wagons", "my_schema.trains"
543
607
  output = dump_table_schema "wagons"
544
- assert_match %r{\s+add_foreign_key "wagons", "my_schema\.trains", column: "train_id"$}, output
608
+ assert_match %r{\s+add_foreign_key "wagons", "my_schema\.trains"$}, output
545
609
  ensure
546
610
  @connection.drop_table "wagons", if_exists: true
547
611
  @connection.drop_table "my_schema.trains", if_exists: true
548
- @connection.drop_schema "my_schema", if_exists: true
612
+ end
613
+
614
+ def test_create_foreign_key_same_schema
615
+ @connection.create_table "my_schema.trains"
616
+ @connection.create_table "my_schema.wagons" do |t|
617
+ t.integer :train_id
618
+ end
619
+ @connection.add_foreign_key "my_schema.wagons", "my_schema.trains"
620
+ assert @connection.foreign_key_exists?("my_schema.wagons", "my_schema.trains")
621
+ end
622
+
623
+ def test_create_foreign_key_different_schemas
624
+ @connection.create_schema "my_other_schema"
625
+ @connection.create_table "my_schema.trains"
626
+ @connection.create_table "my_other_schema.wagons" do |t|
627
+ t.integer :train_id
628
+ end
629
+ @connection.add_foreign_key "my_other_schema.wagons", "my_schema.trains"
630
+ assert @connection.foreign_key_exists?("my_other_schema.wagons", "my_schema.trains")
631
+ ensure
632
+ @connection.drop_schema "my_other_schema", if_exists: true
549
633
  end
550
634
  end
551
635
 
@@ -553,7 +637,7 @@ class SchemaIndexOpclassTest < ActiveRecord::PostgreSQLTestCase
553
637
  include SchemaDumpingHelper
554
638
 
555
639
  setup do
556
- @connection = ActiveRecord::Base.connection
640
+ @connection = ActiveRecord::Base.lease_connection
557
641
  @connection.create_table "trains" do |t|
558
642
  t.string :name
559
643
  t.string :position
@@ -597,7 +681,7 @@ class SchemaIndexNullsOrderTest < ActiveRecord::PostgreSQLTestCase
597
681
  include SchemaDumpingHelper
598
682
 
599
683
  setup do
600
- @connection = ActiveRecord::Base.connection
684
+ @connection = ActiveRecord::Base.lease_connection
601
685
  @connection.create_table "trains" do |t|
602
686
  t.string :name
603
687
  t.text :description
@@ -623,7 +707,7 @@ end
623
707
 
624
708
  class DefaultsUsingMultipleSchemasAndDomainTest < ActiveRecord::PostgreSQLTestCase
625
709
  setup do
626
- @connection = ActiveRecord::Base.connection
710
+ @connection = ActiveRecord::Base.lease_connection
627
711
  @connection.drop_schema "schema_1", if_exists: true
628
712
  @connection.execute "CREATE SCHEMA schema_1"
629
713
  @connection.execute "CREATE DOMAIN schema_1.text AS text"
@@ -677,10 +761,9 @@ end
677
761
 
678
762
  class SchemaWithDotsTest < ActiveRecord::PostgreSQLTestCase
679
763
  include PGSchemaHelper
680
- self.use_transactional_tests = false
681
764
 
682
765
  setup do
683
- @connection = ActiveRecord::Base.connection
766
+ @connection = ActiveRecord::Base.lease_connection
684
767
  @connection.create_schema "my.schema"
685
768
  end
686
769
 
@@ -711,3 +794,170 @@ class SchemaWithDotsTest < ActiveRecord::PostgreSQLTestCase
711
794
  end
712
795
  end
713
796
  end
797
+
798
+ class SchemaJoinTablesTest < ActiveRecord::PostgreSQLTestCase
799
+ def setup
800
+ @connection = ActiveRecord::Base.lease_connection
801
+ @connection.create_schema("test_schema")
802
+ end
803
+
804
+ def teardown
805
+ @connection.drop_schema("test_schema", if_exists: true)
806
+ end
807
+
808
+ def test_create_join_table
809
+ @connection.create_join_table("test_schema.posts", "test_schema.comments")
810
+ assert @connection.table_exists?("test_schema.comments_posts")
811
+ columns = @connection.columns("test_schema.comments_posts").map(&:name)
812
+ assert_equal ["comment_id", "post_id"], columns.sort
813
+
814
+ @connection.drop_join_table("test_schema.posts", "test_schema.comments")
815
+ assert_not @connection.table_exists?("test_schema.comments_posts")
816
+ end
817
+ end
818
+
819
+ class SchemaIndexIncludeColumnsTest < ActiveRecord::PostgreSQLTestCase
820
+ include SchemaDumpingHelper
821
+
822
+ def test_schema_dumps_index_included_columns
823
+ index_definition = dump_table_schema("companies").split(/\n/).grep(/t\.index.*company_include_index/).first.strip
824
+ if ActiveRecord::Base.lease_connection.supports_index_include?
825
+ assert_equal 't.index ["firm_id", "type"], name: "company_include_index", include: ["name", "account_id"]', index_definition
826
+ else
827
+ assert_equal 't.index ["firm_id", "type"], name: "company_include_index"', index_definition
828
+ end
829
+ end
830
+ end
831
+
832
+ class SchemaIndexNullsNotDistinctTest < ActiveRecord::PostgreSQLTestCase
833
+ include SchemaDumpingHelper
834
+
835
+ setup do
836
+ @connection = ActiveRecord::Base.lease_connection
837
+ @connection.create_table "trains" do |t|
838
+ t.string :name
839
+ end
840
+ end
841
+
842
+ teardown do
843
+ @connection.drop_table "trains", if_exists: true
844
+ end
845
+
846
+ def test_nulls_not_distinct_is_dumped
847
+ skip("current adapter doesn't support nulls not distinct") unless supports_nulls_not_distinct?
848
+
849
+ @connection.execute "CREATE INDEX trains_name ON trains USING btree(name) NULLS NOT DISTINCT"
850
+
851
+ output = dump_table_schema "trains"
852
+
853
+ assert_match(/nulls_not_distinct: true/, output)
854
+ end
855
+
856
+ def test_nulls_distinct_is_dumped
857
+ skip("current adapter doesn't support nulls not distinct") unless supports_nulls_not_distinct?
858
+
859
+ @connection.execute "CREATE INDEX trains_name ON trains USING btree(name) NULLS DISTINCT"
860
+
861
+ output = dump_table_schema "trains"
862
+
863
+ assert_no_match(/nulls_not_distinct/, output)
864
+ end
865
+
866
+ def test_nulls_not_set_is_dumped
867
+ @connection.execute "CREATE INDEX trains_name ON trains USING btree(name)"
868
+
869
+ output = dump_table_schema "trains"
870
+
871
+ assert_no_match(/nulls_not_distinct/, output)
872
+ end
873
+ end
874
+
875
+ class SchemaCreateTableOptionsTest < ActiveRecord::PostgreSQLTestCase
876
+ include SchemaDumpingHelper
877
+
878
+ setup do
879
+ @previous_unlogged_tables = ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables
880
+ @connection = ActiveRecord::Base.connection
881
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables = false
882
+ end
883
+
884
+ teardown do
885
+ @connection.drop_table "trains", if_exists: true
886
+ @connection.drop_table "transportation_modes", if_exists: true
887
+ @connection.drop_table "vehicles", if_exists: true
888
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables = @previous_unlogged_tables
889
+ end
890
+
891
+ def test_list_partition_options_is_dumped
892
+ skip("current adapter doesn't support native partitioning") unless supports_native_partitioning?
893
+
894
+ options = "PARTITION BY LIST (kind)"
895
+
896
+ @connection.create_table "trains", id: false, options: options do |t|
897
+ t.string :name
898
+ t.string :kind
899
+ end
900
+
901
+ output = dump_table_schema "trains"
902
+
903
+ assert_match("options: \"#{options}\"", output)
904
+ end
905
+
906
+ def test_range_partition_options_is_dumped
907
+ skip("current adapter doesn't support native partitioning") unless supports_native_partitioning?
908
+
909
+ options = "PARTITION BY RANGE (created_at)"
910
+
911
+ @connection.create_table "trains", id: false, options: options do |t|
912
+ t.string :name
913
+ t.datetime :created_at, null: false
914
+ end
915
+
916
+ output = dump_table_schema "trains"
917
+
918
+ assert_match("options: \"#{options}\"", output)
919
+ end
920
+
921
+ def test_inherited_table_options_is_dumped
922
+ @connection.create_table "transportation_modes" do |t|
923
+ t.string :name
924
+ t.string :kind
925
+ end
926
+
927
+ options = "INHERITS (transportation_modes)"
928
+
929
+ @connection.create_table "trains", options: options
930
+
931
+ output = dump_table_schema "trains"
932
+
933
+ assert_match("options: \"#{options}\"", output)
934
+ end
935
+
936
+ def test_multiple_inherited_table_options_is_dumped
937
+ @connection.create_table "vehicles" do |t|
938
+ t.string :name
939
+ end
940
+
941
+ @connection.create_table "transportation_modes" do |t|
942
+ t.string :kind
943
+ end
944
+
945
+ options = "INHERITS (transportation_modes, vehicles)"
946
+
947
+ @connection.create_table "trains", options: options
948
+
949
+ output = dump_table_schema "trains"
950
+
951
+ assert_match("options: \"#{options}\"", output)
952
+ end
953
+
954
+ def test_no_partition_options_are_dumped
955
+ @connection.create_table "trains" do |t|
956
+ t.string :name
957
+ end
958
+
959
+ output = dump_table_schema "trains"
960
+
961
+ assert_no_match("options:", output)
962
+ end
963
+ end
@@ -9,7 +9,7 @@ class PostgresqlSerialTest < ActiveRecord::PostgreSQLTestCase
9
9
  class PostgresqlSerial < ActiveRecord::Base; end
10
10
 
11
11
  setup do
12
- @connection = ActiveRecord::Base.connection
12
+ @connection = ActiveRecord::Base.lease_connection
13
13
  @connection.create_table "postgresql_serials", force: true do |t|
14
14
  t.serial :seq
15
15
  t.integer :serials_id, default: -> { "nextval('postgresql_serials_id_seq')" }
@@ -51,7 +51,7 @@ class PostgresqlBigSerialTest < ActiveRecord::PostgreSQLTestCase
51
51
  class PostgresqlBigSerial < ActiveRecord::Base; end
52
52
 
53
53
  setup do
54
- @connection = ActiveRecord::Base.connection
54
+ @connection = ActiveRecord::Base.lease_connection
55
55
  @connection.create_table "postgresql_big_serials", force: true do |t|
56
56
  t.bigserial :seq
57
57
  t.bigint :serials_id, default: -> { "nextval('postgresql_big_serials_id_seq')" }
@@ -92,7 +92,7 @@ module SequenceNameDetectionTestCases
92
92
  include SchemaDumpingHelper
93
93
 
94
94
  def setup
95
- @connection = ActiveRecord::Base.connection
95
+ @connection = ActiveRecord::Base.lease_connection
96
96
  @connection.create_table :foo_bar, force: true do |t|
97
97
  t.serial :baz_id
98
98
  end
@@ -127,8 +127,8 @@ module SequenceNameDetectionTestCases
127
127
 
128
128
  def setup
129
129
  @table_name = "long_table_name_to_test_sequence_name_detection_for_serial_cols"
130
- @connection = ActiveRecord::Base.connection
131
- @connection.create_table @table_name, force: true do |t|
130
+ @connection = ActiveRecord::Base.lease_connection
131
+ @connection.create_table @table_name, force: true, _uses_legacy_table_name: true do |t|
132
132
  t.serial :seq
133
133
  t.bigserial :bigseq
134
134
  end
@@ -8,6 +8,10 @@ module ActiveRecord
8
8
  module ConnectionAdapters
9
9
  class PostgreSQLAdapter < AbstractAdapter
10
10
  class InactivePgConnection
11
+ def initialize
12
+ @raw_connection = nil
13
+ end
14
+
11
15
  def query(*args)
12
16
  raise PG::Error
13
17
  end
@@ -32,7 +36,7 @@ module ActiveRecord
32
36
  }
33
37
 
34
38
  Process.waitpid pid
35
- assert $?.success?, "process should exit successfully"
39
+ assert_predicate $?, :success?, "process should exit successfully"
36
40
  end
37
41
  end
38
42
 
@@ -43,7 +47,7 @@ module ActiveRecord
43
47
  end
44
48
 
45
49
  def test_prepared_statements_do_not_get_stuck_on_query_interruption
46
- pg_connection = ActiveRecord::Base.connection.instance_variable_get(:@connection)
50
+ pg_connection = ActiveRecord::Base.lease_connection.connect!.instance_variable_get(:@raw_connection)
47
51
  pg_connection.stub(:get_last_result, -> { raise "random error" }) do
48
52
  assert_raises(RuntimeError) do
49
53
  Developer.where(name: "David").last
@@ -10,7 +10,7 @@ class PostgresqlTimestampTest < ActiveRecord::PostgreSQLTestCase
10
10
  self.use_transactional_tests = false
11
11
 
12
12
  setup do
13
- @connection = ActiveRecord::Base.connection
13
+ @connection = ActiveRecord::Base.lease_connection
14
14
  @connection.execute("INSERT INTO postgresql_timestamp_with_zones (id, time) VALUES (1, '2010-01-01 10:00:00-1')")
15
15
  end
16
16
 
@@ -18,7 +18,7 @@ class PostgresqlTimestampTest < ActiveRecord::PostgreSQLTestCase
18
18
  PostgresqlTimestampWithZone.delete_all
19
19
  end
20
20
 
21
- def test_timestamp_with_zone_values_with_rails_time_zone_support
21
+ def test_timestamp_with_zone_values_with_rails_time_zone_support_and_no_time_zone_set
22
22
  with_timezone_config default: :utc, aware_attributes: true do
23
23
  @connection.reconnect!
24
24
 
@@ -45,6 +45,78 @@ class PostgresqlTimestampTest < ActiveRecord::PostgreSQLTestCase
45
45
  end
46
46
  end
47
47
 
48
+ class PostgresqlTimestampWithAwareTypesTest < ActiveRecord::PostgreSQLTestCase
49
+ class PostgresqlTimestampWithZone < ActiveRecord::Base; end
50
+
51
+ self.use_transactional_tests = false
52
+
53
+ setup do
54
+ @connection = ActiveRecord::Base.lease_connection
55
+ @connection.execute("INSERT INTO postgresql_timestamp_with_zones (id, time) VALUES (1, '2010-01-01 10:00:00-1')")
56
+ end
57
+
58
+ teardown do
59
+ PostgresqlTimestampWithZone.delete_all
60
+ end
61
+
62
+ def test_timestamp_with_zone_values_with_rails_time_zone_support_and_time_zone_set
63
+ with_timezone_config default: :utc, aware_attributes: true, zone: "Pacific Time (US & Canada)", aware_types: [:timestamptz, :datetime, :time] do
64
+ @connection.reconnect!
65
+
66
+ timestamp = PostgresqlTimestampWithZone.find(1)
67
+ assert_equal Time.utc(2010, 1, 1, 11, 0, 0), timestamp.time
68
+ assert_instance_of ActiveSupport::TimeWithZone, timestamp.time
69
+ end
70
+ ensure
71
+ @connection.reconnect!
72
+ end
73
+ end
74
+
75
+ class PostgresqlTimestampWithTimeZoneTest < ActiveRecord::PostgreSQLTestCase
76
+ class PostgresqlTimestampWithZone < ActiveRecord::Base; end
77
+
78
+ self.use_transactional_tests = false
79
+
80
+ setup do
81
+ with_postgresql_datetime_type(:timestamptz) do
82
+ @connection = ActiveRecord::Base.lease_connection
83
+ @connection.execute("INSERT INTO postgresql_timestamp_with_zones (id, time) VALUES (1, '2010-01-01 10:00:00-1')")
84
+ end
85
+ end
86
+
87
+ teardown do
88
+ PostgresqlTimestampWithZone.delete_all
89
+ end
90
+
91
+ def test_timestamp_with_zone_values_with_rails_time_zone_support_and_timestamptz_and_no_time_zone_set
92
+ with_postgresql_datetime_type(:timestamptz) do
93
+ with_timezone_config default: :utc, aware_attributes: true, aware_types: [:timestamptz, :datetime, :time] do
94
+ @connection.reconnect!
95
+
96
+ timestamp = PostgresqlTimestampWithZone.find(1)
97
+ assert_equal Time.utc(2010, 1, 1, 11, 0, 0), timestamp.time
98
+ assert_instance_of Time, timestamp.time
99
+ end
100
+ end
101
+ ensure
102
+ @connection.reconnect!
103
+ end
104
+
105
+ def test_timestamp_with_zone_values_with_rails_time_zone_support_and_timestamptz_and_time_zone_set
106
+ with_postgresql_datetime_type(:timestamptz) do
107
+ with_timezone_config default: :utc, aware_attributes: true, zone: "Pacific Time (US & Canada)", aware_types: [:timestamptz, :datetime, :time] do
108
+ @connection.reconnect!
109
+
110
+ timestamp = PostgresqlTimestampWithZone.find(1)
111
+ assert_equal Time.utc(2010, 1, 1, 11, 0, 0), timestamp.time
112
+ assert_instance_of ActiveSupport::TimeWithZone, timestamp.time
113
+ end
114
+ end
115
+ ensure
116
+ @connection.reconnect!
117
+ end
118
+ end
119
+
48
120
  class PostgresqlTimestampFixtureTest < ActiveRecord::PostgreSQLTestCase
49
121
  fixtures :topics
50
122
 
@@ -56,11 +128,11 @@ class PostgresqlTimestampFixtureTest < ActiveRecord::PostgreSQLTestCase
56
128
 
57
129
  def test_load_infinity_and_beyond
58
130
  d = Developer.find_by_sql("select 'infinity'::timestamp as legacy_updated_at")
59
- assert d.first.updated_at.infinite?, "timestamp should be infinite"
131
+ assert_predicate d.first.updated_at, :infinite?, "timestamp should be infinite"
60
132
 
61
133
  d = Developer.find_by_sql("select '-infinity'::timestamp as legacy_updated_at")
62
134
  time = d.first.updated_at
63
- assert time.infinite?, "timestamp should be infinite"
135
+ assert_predicate time, :infinite?, "timestamp should be infinite"
64
136
  assert_operator time, :<, 0
65
137
  end
66
138
 
@@ -73,7 +145,7 @@ class PostgresqlTimestampFixtureTest < ActiveRecord::PostgreSQLTestCase
73
145
  end
74
146
 
75
147
  def test_bc_timestamp
76
- date = Date.new(0) - 1.week
148
+ date = Time.new(0) - 1.week
77
149
  Developer.create!(name: "aaron", updated_at: date)
78
150
  assert_equal date, Developer.find_by_name("aaron").updated_at
79
151
  end
@@ -90,3 +162,48 @@ class PostgresqlTimestampFixtureTest < ActiveRecord::PostgreSQLTestCase
90
162
  assert_equal date, Developer.find_by_name("yahagi").updated_at
91
163
  end
92
164
  end
165
+
166
+ class PostgresqlTimestampMigrationTest < ActiveRecord::PostgreSQLTestCase
167
+ class PostgresqlTimestampWithZone < ActiveRecord::Base; end
168
+
169
+ def test_adds_column_as_timestamp
170
+ original, $stdout = $stdout, StringIO.new
171
+
172
+ ActiveRecord::Migration.new.add_column :postgresql_timestamp_with_zones, :times, :datetime
173
+
174
+ assert_equal({ "data_type" => "timestamp without time zone" },
175
+ PostgresqlTimestampWithZone.lease_connection.execute("select data_type from information_schema.columns where column_name = 'times'").to_a.first)
176
+ ensure
177
+ $stdout = original
178
+ end
179
+
180
+ def test_adds_column_as_timestamptz_if_datetime_type_changed
181
+ original, $stdout = $stdout, StringIO.new
182
+
183
+ with_postgresql_datetime_type(:timestamptz) do
184
+ ActiveRecord::Migration.new.add_column :postgresql_timestamp_with_zones, :times, :datetime
185
+
186
+ assert_equal({ "data_type" => "timestamp with time zone" },
187
+ PostgresqlTimestampWithZone.lease_connection.execute("select data_type from information_schema.columns where column_name = 'times'").to_a.first)
188
+ end
189
+ ensure
190
+ $stdout = original
191
+ end
192
+
193
+ def test_adds_column_as_custom_type
194
+ original, $stdout = $stdout, StringIO.new
195
+
196
+ PostgresqlTimestampWithZone.lease_connection.execute("CREATE TYPE custom_time_format AS ENUM ('past', 'present', 'future');")
197
+
198
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:datetimes_as_enum] = { name: "custom_time_format" }
199
+ with_postgresql_datetime_type(:datetimes_as_enum) do
200
+ ActiveRecord::Migration.new.add_column :postgresql_timestamp_with_zones, :times, :datetime, precision: nil
201
+
202
+ assert_equal({ "data_type" => "USER-DEFINED", "udt_name" => "custom_time_format" },
203
+ PostgresqlTimestampWithZone.lease_connection.execute("select data_type, udt_name from information_schema.columns where column_name = 'times'").to_a.first)
204
+ end
205
+ ensure
206
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES.delete(:datetimes_as_enum)
207
+ $stdout = original
208
+ end
209
+ end