ibm_db 5.2.0-x86-mingw32 → 5.4.0-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.
Files changed (625) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/README +1 -1
  5. data/debug.log +1 -0
  6. data/ext/Makefile +28 -24
  7. data/ext/ibm_db.c +66 -65
  8. data/ext/ibm_db.o +0 -0
  9. data/ext/ibm_db.so +0 -0
  10. data/ext/mkmf.log +26 -24
  11. data/ext/ruby_ibm_db_cli.c +1 -0
  12. data/ext/ruby_ibm_db_cli.o +0 -0
  13. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1520 -1282
  14. data/lib/ibm_db.so +1 -0
  15. data/lib/mswin32/ibm_db.rb +3 -1
  16. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  17. data/lib/mswin32/rb3x/i386/ruby31/ibm_db.so +0 -0
  18. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  19. data/test/activejob/destroy_association_async_test.rb +305 -0
  20. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  21. data/test/activejob/helper.rb +15 -0
  22. data/test/assets/schema_dump_5_1.yml +345 -0
  23. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  24. data/test/cases/adapter_test.rb +432 -218
  25. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  26. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  27. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  28. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  29. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  30. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  31. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  32. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  33. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  34. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  35. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  36. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  37. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  38. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  39. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  40. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  41. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  42. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  43. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  44. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  45. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  46. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  47. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  48. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  49. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  50. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  51. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  52. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  53. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  54. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  55. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  56. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  57. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  58. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  59. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  60. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  61. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  62. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  63. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  64. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  65. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  66. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  67. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  68. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  69. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  70. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  71. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  72. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  73. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  74. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  75. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  76. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  77. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  78. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  79. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  80. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  81. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  82. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  83. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  84. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  85. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  86. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  87. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  88. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  89. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  90. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  91. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  92. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  93. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  94. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  95. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  96. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  97. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  98. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  99. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  100. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  101. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  102. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  103. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  104. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  105. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  106. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  107. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  108. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  109. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  110. data/test/cases/aggregations_test.rb +14 -12
  111. data/test/cases/annotate_test.rb +46 -0
  112. data/test/cases/ar_schema_test.rb +153 -86
  113. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  114. data/test/cases/arel/attributes/math_test.rb +83 -0
  115. data/test/cases/arel/attributes_test.rb +27 -0
  116. data/test/cases/arel/collectors/bind_test.rb +40 -0
  117. data/test/cases/arel/collectors/composite_test.rb +47 -0
  118. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  119. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  120. data/test/cases/arel/crud_test.rb +65 -0
  121. data/test/cases/arel/delete_manager_test.rb +53 -0
  122. data/test/cases/arel/factory_methods_test.rb +46 -0
  123. data/test/cases/arel/helper.rb +45 -0
  124. data/test/cases/arel/insert_manager_test.rb +241 -0
  125. data/test/cases/arel/nodes/and_test.rb +30 -0
  126. data/test/cases/arel/nodes/as_test.rb +36 -0
  127. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  128. data/test/cases/arel/nodes/bin_test.rb +35 -0
  129. data/test/cases/arel/nodes/binary_test.rb +29 -0
  130. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  131. data/test/cases/arel/nodes/case_test.rb +96 -0
  132. data/test/cases/arel/nodes/casted_test.rb +18 -0
  133. data/test/cases/arel/nodes/comment_test.rb +22 -0
  134. data/test/cases/arel/nodes/count_test.rb +35 -0
  135. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  136. data/test/cases/arel/nodes/descending_test.rb +46 -0
  137. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  138. data/test/cases/arel/nodes/equality_test.rb +62 -0
  139. data/test/cases/arel/nodes/extract_test.rb +43 -0
  140. data/test/cases/arel/nodes/false_test.rb +21 -0
  141. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  142. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  143. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  144. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  145. data/test/cases/arel/nodes/node_test.rb +22 -0
  146. data/test/cases/arel/nodes/not_test.rb +31 -0
  147. data/test/cases/arel/nodes/or_test.rb +36 -0
  148. data/test/cases/arel/nodes/over_test.rb +69 -0
  149. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  150. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  151. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  152. data/test/cases/arel/nodes/sum_test.rb +35 -0
  153. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  154. data/test/cases/arel/nodes/true_test.rb +21 -0
  155. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  156. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  157. data/test/cases/arel/nodes/window_test.rb +81 -0
  158. data/test/cases/arel/nodes_test.rb +34 -0
  159. data/test/cases/arel/select_manager_test.rb +1238 -0
  160. data/test/cases/arel/support/fake_record.rb +135 -0
  161. data/test/cases/arel/table_test.rb +216 -0
  162. data/test/cases/arel/update_manager_test.rb +126 -0
  163. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  164. data/test/cases/arel/visitors/dot_test.rb +90 -0
  165. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  166. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  167. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  168. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  169. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  170. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  171. data/test/cases/associations/callbacks_test.rb +56 -38
  172. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  173. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  174. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  175. data/test/cases/associations/eager_singularization_test.rb +21 -21
  176. data/test/cases/associations/eager_test.rb +559 -415
  177. data/test/cases/associations/extension_test.rb +18 -12
  178. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  179. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  180. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  181. data/test/cases/associations/has_one_associations_test.rb +294 -129
  182. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  183. data/test/cases/associations/inner_join_association_test.rb +114 -38
  184. data/test/cases/associations/inverse_associations_test.rb +606 -398
  185. data/test/cases/associations/join_model_test.rb +158 -148
  186. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  187. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  188. data/test/cases/associations/required_test.rb +35 -10
  189. data/test/cases/associations_test.rb +241 -110
  190. data/test/cases/attribute_methods/read_test.rb +11 -11
  191. data/test/cases/attribute_methods_test.rb +413 -298
  192. data/test/cases/attributes_test.rb +145 -27
  193. data/test/cases/autosave_association_test.rb +681 -436
  194. data/test/cases/base_prevent_writes_test.rb +229 -0
  195. data/test/cases/base_test.rb +599 -542
  196. data/test/cases/batches_test.rb +288 -82
  197. data/test/cases/binary_test.rb +26 -31
  198. data/test/cases/bind_parameter_test.rb +194 -21
  199. data/test/cases/boolean_test.rb +52 -0
  200. data/test/cases/cache_key_test.rb +110 -5
  201. data/test/cases/calculations_test.rb +740 -177
  202. data/test/cases/callbacks_test.rb +74 -207
  203. data/test/cases/clone_test.rb +15 -10
  204. data/test/cases/coders/json_test.rb +2 -0
  205. data/test/cases/coders/yaml_column_test.rb +16 -13
  206. data/test/cases/collection_cache_key_test.rb +177 -20
  207. data/test/cases/column_alias_test.rb +9 -7
  208. data/test/cases/column_definition_test.rb +10 -68
  209. data/test/cases/comment_test.rb +166 -107
  210. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  211. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  212. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  213. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  214. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  215. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  216. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  217. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  218. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  219. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  220. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  221. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  222. data/test/cases/connection_management_test.rb +13 -11
  223. data/test/cases/connection_pool_test.rb +316 -83
  224. data/test/cases/core_test.rb +82 -58
  225. data/test/cases/counter_cache_test.rb +204 -50
  226. data/test/cases/custom_locking_test.rb +5 -3
  227. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  228. data/test/cases/database_configurations/resolver_test.rb +150 -0
  229. data/test/cases/database_configurations_test.rb +145 -0
  230. data/test/cases/database_selector_test.rb +296 -0
  231. data/test/cases/database_statements_test.rb +18 -16
  232. data/test/cases/date_test.rb +8 -16
  233. data/test/cases/date_time_precision_test.rb +100 -78
  234. data/test/cases/date_time_test.rb +23 -8
  235. data/test/cases/defaults_test.rb +106 -71
  236. data/test/cases/delegated_type_test.rb +57 -0
  237. data/test/cases/dirty_test.rb +419 -223
  238. data/test/cases/disconnected_test.rb +6 -6
  239. data/test/cases/dup_test.rb +54 -27
  240. data/test/cases/enum_test.rb +461 -82
  241. data/test/cases/errors_test.rb +7 -7
  242. data/test/cases/explain_subscriber_test.rb +17 -15
  243. data/test/cases/explain_test.rb +11 -19
  244. data/test/cases/filter_attributes_test.rb +153 -0
  245. data/test/cases/finder_respond_to_test.rb +14 -14
  246. data/test/cases/finder_test.rb +669 -287
  247. data/test/cases/fixture_set/file_test.rb +34 -38
  248. data/test/cases/fixtures_test.rb +833 -176
  249. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  250. data/test/cases/habtm_destroy_order_test.rb +25 -25
  251. data/test/cases/helper.rb +78 -49
  252. data/test/cases/hot_compatibility_test.rb +33 -32
  253. data/test/cases/i18n_test.rb +18 -17
  254. data/test/cases/inheritance_test.rb +180 -115
  255. data/test/cases/insert_all_test.rb +489 -0
  256. data/test/cases/instrumentation_test.rb +101 -0
  257. data/test/cases/integration_test.rb +119 -31
  258. data/test/cases/invalid_connection_test.rb +18 -16
  259. data/test/cases/invertible_migration_test.rb +183 -43
  260. data/test/cases/json_attribute_test.rb +35 -0
  261. data/test/cases/json_serialization_test.rb +57 -58
  262. data/test/cases/json_shared_test_cases.rb +290 -0
  263. data/test/cases/locking_test.rb +413 -119
  264. data/test/cases/log_subscriber_test.rb +68 -26
  265. data/test/cases/marshal_serialization_test.rb +39 -0
  266. data/test/cases/migration/change_schema_test.rb +118 -72
  267. data/test/cases/migration/change_table_test.rb +138 -30
  268. data/test/cases/migration/check_constraint_test.rb +162 -0
  269. data/test/cases/migration/column_attributes_test.rb +45 -35
  270. data/test/cases/migration/column_positioning_test.rb +18 -6
  271. data/test/cases/migration/columns_test.rb +93 -77
  272. data/test/cases/migration/command_recorder_test.rb +121 -34
  273. data/test/cases/migration/compatibility_test.rb +578 -23
  274. data/test/cases/migration/create_join_table_test.rb +35 -25
  275. data/test/cases/migration/foreign_key_test.rb +503 -284
  276. data/test/cases/migration/helper.rb +4 -3
  277. data/test/cases/migration/index_test.rb +119 -70
  278. data/test/cases/migration/logger_test.rb +9 -6
  279. data/test/cases/migration/pending_migrations_test.rb +88 -34
  280. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  281. data/test/cases/migration/references_index_test.rb +38 -19
  282. data/test/cases/migration/references_statements_test.rb +15 -14
  283. data/test/cases/migration/rename_table_test.rb +53 -30
  284. data/test/cases/migration_test.rb +637 -269
  285. data/test/cases/migrator_test.rb +191 -135
  286. data/test/cases/mixin_test.rb +7 -11
  287. data/test/cases/modules_test.rb +36 -34
  288. data/test/cases/multi_db_migrator_test.rb +223 -0
  289. data/test/cases/multiparameter_attributes_test.rb +60 -33
  290. data/test/cases/multiple_db_test.rb +16 -22
  291. data/test/cases/nested_attributes_test.rb +341 -320
  292. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  293. data/test/cases/null_relation_test.rb +84 -0
  294. data/test/cases/numeric_data_test.rb +93 -0
  295. data/test/cases/persistence_test.rb +361 -269
  296. data/test/cases/pooled_connections_test.rb +18 -26
  297. data/test/cases/prepared_statement_status_test.rb +48 -0
  298. data/test/cases/primary_keys_test.rb +210 -104
  299. data/test/cases/query_cache_test.rb +610 -141
  300. data/test/cases/quoting_test.rb +132 -31
  301. data/test/cases/readonly_test.rb +49 -48
  302. data/test/cases/reaper_test.rb +146 -32
  303. data/test/cases/reflection_test.rb +167 -156
  304. data/test/cases/relation/delegation_test.rb +49 -36
  305. data/test/cases/relation/delete_all_test.rb +117 -0
  306. data/test/cases/relation/merging_test.rb +319 -42
  307. data/test/cases/relation/mutation_test.rb +55 -93
  308. data/test/cases/relation/or_test.rb +129 -29
  309. data/test/cases/relation/predicate_builder_test.rb +21 -6
  310. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  311. data/test/cases/relation/select_test.rb +67 -0
  312. data/test/cases/relation/update_all_test.rb +317 -0
  313. data/test/cases/relation/where_chain_test.rb +68 -32
  314. data/test/cases/relation/where_clause_test.rb +136 -61
  315. data/test/cases/relation/where_test.rb +155 -48
  316. data/test/cases/relation_test.rb +266 -112
  317. data/test/cases/relations_test.rb +969 -744
  318. data/test/cases/reload_models_test.rb +13 -9
  319. data/test/cases/reserved_word_test.rb +141 -0
  320. data/test/cases/result_test.rb +68 -17
  321. data/test/cases/sanitize_test.rb +87 -71
  322. data/test/cases/schema_dumper_test.rb +221 -128
  323. data/test/cases/schema_loading_test.rb +3 -2
  324. data/test/cases/scoping/default_scoping_test.rb +185 -144
  325. data/test/cases/scoping/named_scoping_test.rb +177 -89
  326. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  327. data/test/cases/secure_token_test.rb +18 -3
  328. data/test/cases/serialization_test.rb +30 -28
  329. data/test/cases/serialized_attribute_test.rb +133 -42
  330. data/test/cases/signed_id_test.rb +168 -0
  331. data/test/cases/statement_cache_test.rb +41 -24
  332. data/test/cases/statement_invalid_test.rb +42 -0
  333. data/test/cases/store_test.rb +180 -55
  334. data/test/cases/strict_loading_test.rb +473 -0
  335. data/test/cases/suppressor_test.rb +26 -12
  336. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  337. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  338. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  339. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  340. data/test/cases/test_case.rb +51 -40
  341. data/test/cases/test_databases_test.rb +79 -0
  342. data/test/cases/test_fixtures_test.rb +79 -19
  343. data/test/cases/time_precision_test.rb +98 -76
  344. data/test/cases/timestamp_test.rb +102 -99
  345. data/test/cases/touch_later_test.rb +12 -10
  346. data/test/cases/transaction_callbacks_test.rb +344 -90
  347. data/test/cases/transaction_isolation_test.rb +12 -12
  348. data/test/cases/transactions_test.rb +612 -162
  349. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  350. data/test/cases/type/date_time_test.rb +4 -2
  351. data/test/cases/type/integer_test.rb +4 -2
  352. data/test/cases/type/string_test.rb +10 -8
  353. data/test/cases/type/time_test.rb +28 -0
  354. data/test/cases/type/type_map_test.rb +29 -28
  355. data/test/cases/type/unsigned_integer_test.rb +19 -0
  356. data/test/cases/type_test.rb +2 -0
  357. data/test/cases/types_test.rb +3 -1
  358. data/test/cases/unconnected_test.rb +14 -1
  359. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  360. data/test/cases/validations/absence_validation_test.rb +19 -17
  361. data/test/cases/validations/association_validation_test.rb +30 -28
  362. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  363. data/test/cases/validations/i18n_validation_test.rb +22 -21
  364. data/test/cases/validations/length_validation_test.rb +34 -33
  365. data/test/cases/validations/numericality_validation_test.rb +181 -0
  366. data/test/cases/validations/presence_validation_test.rb +21 -19
  367. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  368. data/test/cases/validations_repair_helper.rb +2 -0
  369. data/test/cases/validations_test.rb +61 -26
  370. data/test/cases/view_test.rb +122 -116
  371. data/test/cases/yaml_serialization_test.rb +79 -34
  372. data/test/config.example.yml +19 -19
  373. data/test/config.rb +3 -1
  374. data/test/config.yml +16 -6
  375. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  376. data/test/fixtures/author_addresses.yml +1 -8
  377. data/test/fixtures/authors.yml +1 -7
  378. data/test/fixtures/binaries.yml +4 -0
  379. data/test/fixtures/books.yml +9 -2
  380. data/test/fixtures/categories_posts.yml +3 -0
  381. data/test/fixtures/citations.yml +5 -0
  382. data/test/fixtures/comments.yml +7 -0
  383. data/test/fixtures/companies.yml +5 -0
  384. data/test/fixtures/computers.yml +2 -0
  385. data/test/fixtures/customers.yml +10 -1
  386. data/test/fixtures/developers.yml +1 -1
  387. data/test/fixtures/essays.yml +10 -0
  388. data/test/fixtures/faces.yml +3 -3
  389. data/test/fixtures/humans.yml +5 -0
  390. data/test/fixtures/interests.yml +7 -7
  391. data/test/fixtures/memberships.yml +7 -0
  392. data/test/fixtures/minimalistics.yml +3 -0
  393. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  394. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  395. data/test/fixtures/naked/yml/parrots.yml +1 -0
  396. data/test/fixtures/other_books.yml +26 -0
  397. data/test/fixtures/other_posts.yml +1 -0
  398. data/test/fixtures/parrots.yml +7 -1
  399. data/test/fixtures/pirates.yml +3 -0
  400. data/test/fixtures/posts.yml +11 -3
  401. data/test/fixtures/readers.yml +6 -0
  402. data/test/fixtures/reserved_words/values.yml +2 -2
  403. data/test/fixtures/sponsors.yml +3 -0
  404. data/test/fixtures/strict_zines.yml +2 -0
  405. data/test/fixtures/subscribers.yml +1 -1
  406. data/test/fixtures/tasks.yml +1 -1
  407. data/test/fixtures/warehouse-things.yml +3 -0
  408. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  409. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  410. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  411. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  412. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  413. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  414. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  415. data/test/migrations/rename/1_we_need_things.rb +2 -0
  416. data/test/migrations/rename/2_rename_things.rb +2 -0
  417. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  419. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  420. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  421. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  422. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  423. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  424. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  425. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  426. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  427. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  428. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  429. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  430. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  431. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  432. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  433. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  434. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  435. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  436. data/test/models/account.rb +46 -0
  437. data/test/models/admin/account.rb +3 -1
  438. data/test/models/admin/randomly_named_c1.rb +2 -0
  439. data/test/models/admin/user.rb +16 -8
  440. data/test/models/admin.rb +4 -2
  441. data/test/models/aircraft.rb +3 -1
  442. data/test/models/arunit2_model.rb +2 -0
  443. data/test/models/author.rb +153 -102
  444. data/test/models/auto_id.rb +2 -0
  445. data/test/models/autoloadable/extra_firm.rb +2 -0
  446. data/test/models/binary.rb +3 -1
  447. data/test/models/binary_field.rb +6 -0
  448. data/test/models/bird.rb +13 -1
  449. data/test/models/book.rb +14 -4
  450. data/test/models/book_destroy_async.rb +24 -0
  451. data/test/models/boolean.rb +5 -0
  452. data/test/models/bulb.rb +13 -4
  453. data/test/models/cake_designer.rb +2 -0
  454. data/test/models/car.rb +17 -10
  455. data/test/models/carrier.rb +2 -0
  456. data/test/models/cart.rb +5 -0
  457. data/test/models/cat.rb +2 -0
  458. data/test/models/categorization.rb +8 -6
  459. data/test/models/category.rb +28 -16
  460. data/test/models/chef.rb +2 -0
  461. data/test/models/citation.rb +5 -1
  462. data/test/models/club.rb +13 -10
  463. data/test/models/college.rb +4 -2
  464. data/test/models/column.rb +2 -0
  465. data/test/models/column_name.rb +2 -0
  466. data/test/models/comment.rb +32 -10
  467. data/test/models/company.rb +102 -106
  468. data/test/models/company_in_module.rb +27 -26
  469. data/test/models/computer.rb +3 -1
  470. data/test/models/contact.rb +15 -13
  471. data/test/models/content.rb +5 -3
  472. data/test/models/contract.rb +21 -3
  473. data/test/models/country.rb +2 -4
  474. data/test/models/course.rb +3 -1
  475. data/test/models/customer.rb +10 -8
  476. data/test/models/customer_carrier.rb +2 -0
  477. data/test/models/dashboard.rb +2 -0
  478. data/test/models/default.rb +2 -0
  479. data/test/models/department.rb +2 -0
  480. data/test/models/destroy_async_parent.rb +15 -0
  481. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  482. data/test/models/developer.rb +152 -85
  483. data/test/models/dl_keyed_belongs_to.rb +13 -0
  484. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  485. data/test/models/dl_keyed_has_many.rb +5 -0
  486. data/test/models/dl_keyed_has_many_through.rb +5 -0
  487. data/test/models/dl_keyed_has_one.rb +5 -0
  488. data/test/models/dl_keyed_join.rb +10 -0
  489. data/test/models/dog.rb +2 -0
  490. data/test/models/dog_lover.rb +2 -0
  491. data/test/models/doubloon.rb +3 -1
  492. data/test/models/drink_designer.rb +17 -0
  493. data/test/models/edge.rb +4 -2
  494. data/test/models/electron.rb +2 -0
  495. data/test/models/engine.rb +3 -2
  496. data/test/models/entrant.rb +2 -0
  497. data/test/models/entry.rb +5 -0
  498. data/test/models/essay.rb +6 -3
  499. data/test/models/essay_destroy_async.rb +12 -0
  500. data/test/models/event.rb +3 -1
  501. data/test/models/eye.rb +5 -3
  502. data/test/models/face.rb +14 -6
  503. data/test/models/family.rb +6 -0
  504. data/test/models/family_tree.rb +6 -0
  505. data/test/models/friendship.rb +5 -3
  506. data/test/models/frog.rb +8 -0
  507. data/test/models/guid.rb +3 -1
  508. data/test/models/guitar.rb +2 -0
  509. data/test/models/hotel.rb +5 -3
  510. data/test/models/human.rb +39 -0
  511. data/test/models/image.rb +3 -1
  512. data/test/models/interest.rb +14 -3
  513. data/test/models/invoice.rb +4 -2
  514. data/test/models/item.rb +3 -1
  515. data/test/models/job.rb +5 -3
  516. data/test/models/joke.rb +4 -2
  517. data/test/models/keyboard.rb +3 -1
  518. data/test/models/legacy_thing.rb +2 -0
  519. data/test/models/lesson.rb +2 -0
  520. data/test/models/line_item.rb +3 -1
  521. data/test/models/liquid.rb +2 -0
  522. data/test/models/matey.rb +3 -1
  523. data/test/models/measurement.rb +4 -0
  524. data/test/models/member.rb +23 -20
  525. data/test/models/member_detail.rb +3 -0
  526. data/test/models/member_type.rb +2 -0
  527. data/test/models/membership.rb +4 -1
  528. data/test/models/mentor.rb +3 -1
  529. data/test/models/message.rb +5 -0
  530. data/test/models/minimalistic.rb +2 -0
  531. data/test/models/minivan.rb +3 -2
  532. data/test/models/mixed_case_monkey.rb +3 -1
  533. data/test/models/molecule.rb +2 -0
  534. data/test/models/mouse.rb +6 -0
  535. data/test/models/movie.rb +2 -0
  536. data/test/models/node.rb +4 -2
  537. data/test/models/non_primary_key.rb +2 -0
  538. data/test/models/notification.rb +2 -0
  539. data/test/models/numeric_data.rb +12 -0
  540. data/test/models/order.rb +4 -2
  541. data/test/models/organization.rb +9 -7
  542. data/test/models/other_dog.rb +3 -1
  543. data/test/models/owner.rb +6 -4
  544. data/test/models/parrot.rb +12 -4
  545. data/test/models/person.rb +59 -54
  546. data/test/models/personal_legacy_thing.rb +3 -1
  547. data/test/models/pet.rb +4 -2
  548. data/test/models/pet_treasure.rb +2 -0
  549. data/test/models/pirate.rb +67 -43
  550. data/test/models/possession.rb +3 -1
  551. data/test/models/post.rb +184 -86
  552. data/test/models/price_estimate.rb +11 -1
  553. data/test/models/professor.rb +3 -1
  554. data/test/models/project.rb +14 -12
  555. data/test/models/publisher/article.rb +2 -0
  556. data/test/models/publisher/magazine.rb +2 -0
  557. data/test/models/publisher.rb +2 -0
  558. data/test/models/randomly_named_c1.rb +2 -0
  559. data/test/models/rating.rb +5 -1
  560. data/test/models/reader.rb +7 -5
  561. data/test/models/recipe.rb +2 -0
  562. data/test/models/record.rb +2 -0
  563. data/test/models/reference.rb +6 -3
  564. data/test/models/reply.rb +39 -21
  565. data/test/models/room.rb +6 -0
  566. data/test/models/section.rb +6 -0
  567. data/test/models/seminar.rb +6 -0
  568. data/test/models/session.rb +6 -0
  569. data/test/models/ship.rb +12 -9
  570. data/test/models/ship_part.rb +5 -3
  571. data/test/models/shop.rb +4 -2
  572. data/test/models/shop_account.rb +2 -0
  573. data/test/models/speedometer.rb +2 -0
  574. data/test/models/sponsor.rb +8 -5
  575. data/test/models/squeak.rb +6 -0
  576. data/test/models/strict_zine.rb +7 -0
  577. data/test/models/string_key_object.rb +2 -0
  578. data/test/models/student.rb +2 -0
  579. data/test/models/subscriber.rb +4 -2
  580. data/test/models/subscription.rb +5 -1
  581. data/test/models/tag.rb +6 -3
  582. data/test/models/tagging.rb +13 -6
  583. data/test/models/task.rb +2 -0
  584. data/test/models/topic.rb +54 -19
  585. data/test/models/toy.rb +4 -0
  586. data/test/models/traffic_light.rb +2 -0
  587. data/test/models/treasure.rb +5 -3
  588. data/test/models/treaty.rb +2 -4
  589. data/test/models/tree.rb +2 -0
  590. data/test/models/tuning_peg.rb +2 -0
  591. data/test/models/tyre.rb +2 -0
  592. data/test/models/user.rb +12 -4
  593. data/test/models/uuid_child.rb +2 -0
  594. data/test/models/uuid_item.rb +2 -0
  595. data/test/models/uuid_parent.rb +2 -0
  596. data/test/models/vegetables.rb +12 -3
  597. data/test/models/vertex.rb +6 -4
  598. data/test/models/warehouse_thing.rb +2 -0
  599. data/test/models/wheel.rb +3 -1
  600. data/test/models/without_table.rb +3 -1
  601. data/test/models/zine.rb +3 -1
  602. data/test/schema/mysql2_specific_schema.rb +49 -35
  603. data/test/schema/oracle_specific_schema.rb +13 -15
  604. data/test/schema/postgresql_specific_schema.rb +51 -40
  605. data/test/schema/schema.rb +334 -154
  606. data/test/schema/sqlite_specific_schema.rb +9 -16
  607. data/test/support/config.rb +26 -26
  608. data/test/support/connection.rb +14 -8
  609. data/test/support/connection_helper.rb +3 -1
  610. data/test/support/ddl_helper.rb +2 -0
  611. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  618. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  619. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  620. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  621. data/test/support/schema_dumping_helper.rb +2 -0
  622. data/test/support/stubs/strong_parameters.rb +40 -0
  623. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  624. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  625. metadata +192 -14
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/default'
3
- require 'support/schema_dumping_helper'
4
+ require "models/default"
5
+ require "support/schema_dumping_helper"
4
6
 
5
7
  module PGSchemaHelper
6
8
  def with_schema_search_path(schema_search_path)
@@ -17,32 +19,34 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
17
19
  include PGSchemaHelper
18
20
  self.use_transactional_tests = false
19
21
 
20
- SCHEMA_NAME = 'test_schema'
21
- SCHEMA2_NAME = 'test_schema2'
22
- TABLE_NAME = 'things'
23
- CAPITALIZED_TABLE_NAME = 'Things'
24
- INDEX_A_NAME = 'a_index_things_on_name'
25
- INDEX_B_NAME = 'b_index_things_on_different_columns_in_each_schema'
26
- INDEX_C_NAME = 'c_index_full_text_search'
27
- INDEX_D_NAME = 'd_index_things_on_description_desc'
28
- INDEX_E_NAME = 'e_index_things_on_name_vector'
29
- INDEX_A_COLUMN = 'name'
30
- INDEX_B_COLUMN_S1 = 'email'
31
- INDEX_B_COLUMN_S2 = 'moment'
32
- INDEX_C_COLUMN = %q{(to_tsvector('english', coalesce(things.name, '')))}
33
- INDEX_D_COLUMN = 'description'
34
- INDEX_E_COLUMN = 'name_vector'
22
+ SCHEMA_NAME = "test_schema"
23
+ SCHEMA2_NAME = "test_schema2"
24
+ TABLE_NAME = "things"
25
+ CAPITALIZED_TABLE_NAME = "Things"
26
+ INDEX_A_NAME = "a_index_things_on_name"
27
+ INDEX_B_NAME = "b_index_things_on_different_columns_in_each_schema"
28
+ INDEX_C_NAME = "c_index_full_text_search"
29
+ INDEX_D_NAME = "d_index_things_on_description_desc"
30
+ INDEX_E_NAME = "e_index_things_on_name_vector"
31
+ INDEX_A_COLUMN = "name"
32
+ INDEX_B_COLUMN_S1 = "email"
33
+ INDEX_B_COLUMN_S2 = "moment"
34
+ INDEX_C_COLUMN = "(to_tsvector('english', coalesce(things.name, '')))"
35
+ INDEX_D_COLUMN = "description"
36
+ INDEX_E_COLUMN = "name_vector"
35
37
  COLUMNS = [
36
- 'id integer',
37
- 'name character varying(50)',
38
- 'email character varying(50)',
39
- 'description character varying(100)',
40
- 'name_vector tsvector',
41
- 'moment timestamp without time zone default now()'
38
+ "id integer",
39
+ "name character varying(50)",
40
+ "email character varying(50)",
41
+ "description character varying(100)",
42
+ "name_vector tsvector",
43
+ "moment timestamp without time zone default now()"
42
44
  ]
43
- PK_TABLE_NAME = 'table_with_pk'
44
- UNMATCHED_SEQUENCE_NAME = 'unmatched_primary_key_default_value_seq'
45
- UNMATCHED_PK_TABLE_NAME = 'table_with_unmatched_sequence_for_pk'
45
+ PK_TABLE_NAME = "table_with_pk"
46
+ UNMATCHED_SEQUENCE_NAME = "unmatched_primary_key_default_value_seq"
47
+ UNMATCHED_PK_TABLE_NAME = "table_with_unmatched_sequence_for_pk"
48
+ PARTITIONED_TABLE = "measurements"
49
+ PARTITIONED_TABLE_INDEX = "index_measurements_on_logdate_and_city_id"
46
50
 
47
51
  class Thing1 < ActiveRecord::Base
48
52
  self.table_name = "test_schema.things"
@@ -61,7 +65,7 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
61
65
  end
62
66
 
63
67
  class Thing5 < ActiveRecord::Base
64
- self.table_name = 'things'
68
+ self.table_name = "things"
65
69
  end
66
70
 
67
71
  class Song < ActiveRecord::Base
@@ -72,6 +76,7 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
72
76
  class Album < ActiveRecord::Base
73
77
  self.table_name = "music.albums"
74
78
  has_and_belongs_to_many :songs
79
+ def self.default_scope; where(deleted: false); end
75
80
  end
76
81
 
77
82
  def setup
@@ -91,6 +96,7 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
91
96
  @connection.execute "CREATE INDEX #{INDEX_E_NAME} ON #{SCHEMA_NAME}.#{TABLE_NAME} USING gin (#{INDEX_E_COLUMN});"
92
97
  @connection.execute "CREATE INDEX #{INDEX_E_NAME} ON #{SCHEMA2_NAME}.#{TABLE_NAME} USING gin (#{INDEX_E_COLUMN});"
93
98
  @connection.execute "CREATE TABLE #{SCHEMA_NAME}.#{PK_TABLE_NAME} (id serial primary key)"
99
+ @connection.execute "CREATE TABLE #{SCHEMA2_NAME}.#{PK_TABLE_NAME} (id serial primary key)"
94
100
  @connection.execute "CREATE SEQUENCE #{SCHEMA_NAME}.#{UNMATCHED_SEQUENCE_NAME}"
95
101
  @connection.execute "CREATE TABLE #{SCHEMA_NAME}.#{UNMATCHED_PK_TABLE_NAME} (id integer NOT NULL DEFAULT nextval('#{SCHEMA_NAME}.#{UNMATCHED_SEQUENCE_NAME}'::regclass), CONSTRAINT unmatched_pkey PRIMARY KEY (id))"
96
102
  end
@@ -101,27 +107,27 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
101
107
  end
102
108
 
103
109
  def test_schema_names
104
- assert_equal ["public", "test_schema", "test_schema2"], @connection.schema_names
110
+ schema_names = @connection.schema_names
111
+ assert_includes schema_names, "public"
112
+ assert_includes schema_names, "test_schema"
113
+ assert_includes schema_names, "test_schema2"
114
+ assert_includes schema_names, "hint_plan" if @connection.supports_optimizer_hints?
105
115
  end
106
116
 
107
117
  def test_create_schema
108
- begin
109
- @connection.create_schema "test_schema3"
110
- assert @connection.schema_names.include? "test_schema3"
111
- ensure
112
- @connection.drop_schema "test_schema3"
113
- end
118
+ @connection.create_schema "test_schema3"
119
+ assert @connection.schema_names.include? "test_schema3"
120
+ ensure
121
+ @connection.drop_schema "test_schema3"
114
122
  end
115
123
 
116
124
  def test_raise_create_schema_with_existing_schema
117
- begin
125
+ @connection.create_schema "test_schema3"
126
+ assert_raises(ActiveRecord::StatementInvalid) do
118
127
  @connection.create_schema "test_schema3"
119
- assert_raises(ActiveRecord::StatementInvalid) do
120
- @connection.create_schema "test_schema3"
121
- end
122
- ensure
123
- @connection.drop_schema "test_schema3"
124
128
  end
129
+ ensure
130
+ @connection.drop_schema "test_schema3"
125
131
  end
126
132
 
127
133
  def test_drop_schema
@@ -130,7 +136,7 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
130
136
  ensure
131
137
  @connection.drop_schema "test_schema3"
132
138
  end
133
- assert !@connection.schema_names.include?("test_schema3")
139
+ assert_not_includes @connection.schema_names, "test_schema3"
134
140
  end
135
141
 
136
142
  def test_drop_schema_if_exists
@@ -143,15 +149,15 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
143
149
  def test_habtm_table_name_with_schema
144
150
  ActiveRecord::Base.connection.drop_schema "music", if_exists: true
145
151
  ActiveRecord::Base.connection.create_schema "music"
146
- ActiveRecord::Base.connection.execute <<-SQL
147
- CREATE TABLE music.albums (id serial primary key);
152
+ ActiveRecord::Base.connection.execute <<~SQL
153
+ CREATE TABLE music.albums (id serial primary key, deleted boolean default false);
148
154
  CREATE TABLE music.songs (id serial primary key);
149
155
  CREATE TABLE music.albums_songs (album_id integer, song_id integer);
150
156
  SQL
151
157
 
152
158
  song = Song.create
153
- Album.create
154
- assert_equal song, Song.includes(:albums).references(:albums).first
159
+ album = song.albums.create
160
+ assert_equal song, Song.includes(:albums).where("albums.id": album.id).first
155
161
  ensure
156
162
  ActiveRecord::Base.connection.drop_schema "music", if_exists: true
157
163
  end
@@ -168,21 +174,21 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
168
174
 
169
175
  def test_raise_wrapped_exception_on_bad_prepare
170
176
  assert_raises(ActiveRecord::StatementInvalid) do
171
- @connection.exec_query "select * from developers where id = ?", 'sql', [bind_param(1)]
177
+ @connection.exec_query "select * from developers where id = ?", "sql", [bind_param(1)]
172
178
  end
173
179
  end
174
180
 
175
181
  if ActiveRecord::Base.connection.prepared_statements
176
182
  def test_schema_change_with_prepared_stmt
177
183
  altered = false
178
- @connection.exec_query "select * from developers where id = $1", 'sql', [bind_param(1)]
179
- @connection.exec_query "alter table developers add column zomg int", 'sql', []
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", []
180
186
  altered = true
181
- @connection.exec_query "select * from developers where id = $1", 'sql', [bind_param(1)]
187
+ @connection.exec_query "select * from developers where id = $1", "sql", [bind_param(1)]
182
188
  ensure
183
189
  # We are not using DROP COLUMN IF EXISTS because that syntax is only
184
190
  # supported by pg 9.X
185
- @connection.exec_query("alter table developers drop column zomg", 'sql', []) if altered
191
+ @connection.exec_query("alter table developers drop column zomg", "sql", []) if altered
186
192
  end
187
193
  end
188
194
 
@@ -200,13 +206,13 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
200
206
  end
201
207
 
202
208
  def test_data_source_exists_when_not_on_schema_search_path
203
- with_schema_search_path('PUBLIC') do
204
- assert(!@connection.data_source_exists?(TABLE_NAME), "data_source exists but should not be found")
209
+ with_schema_search_path("PUBLIC") do
210
+ assert_not(@connection.data_source_exists?(TABLE_NAME), "data_source exists but should not be found")
205
211
  end
206
212
  end
207
213
 
208
214
  def test_data_source_exists_wrong_schema
209
- assert(!@connection.data_source_exists?("foo.things"), "data_source should not exist")
215
+ assert_not(@connection.data_source_exists?("foo.things"), "data_source should not exist")
210
216
  end
211
217
 
212
218
  def test_data_source_exists_quoted_names
@@ -246,9 +252,9 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
246
252
  end
247
253
 
248
254
  def test_proper_encoding_of_table_name
249
- assert_equal '"table_name"', @connection.quote_table_name('table_name')
255
+ assert_equal '"table_name"', @connection.quote_table_name("table_name")
250
256
  assert_equal '"table.name"', @connection.quote_table_name('"table.name"')
251
- assert_equal '"schema_name"."table_name"', @connection.quote_table_name('schema_name.table_name')
257
+ assert_equal '"schema_name"."table_name"', @connection.quote_table_name("schema_name.table_name")
252
258
  assert_equal '"schema_name"."table.name"', @connection.quote_table_name('schema_name."table.name"')
253
259
  assert_equal '"schema.name"."table_name"', @connection.quote_table_name('"schema.name".table_name')
254
260
  assert_equal '"schema.name"."table.name"', @connection.quote_table_name('"schema.name"."table.name"')
@@ -260,25 +266,25 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
260
266
  assert_equal 0, Thing3.count
261
267
  assert_equal 0, Thing4.count
262
268
 
263
- Thing1.create(:id => 1, :name => "thing1", :email => "thing1@localhost", :moment => Time.now)
269
+ Thing1.create(id: 1, name: "thing1", email: "thing1@localhost", moment: Time.now)
264
270
  assert_equal 1, Thing1.count
265
271
  assert_equal 0, Thing2.count
266
272
  assert_equal 0, Thing3.count
267
273
  assert_equal 0, Thing4.count
268
274
 
269
- Thing2.create(:id => 1, :name => "thing1", :email => "thing1@localhost", :moment => Time.now)
275
+ Thing2.create(id: 1, name: "thing1", email: "thing1@localhost", moment: Time.now)
270
276
  assert_equal 1, Thing1.count
271
277
  assert_equal 1, Thing2.count
272
278
  assert_equal 0, Thing3.count
273
279
  assert_equal 0, Thing4.count
274
280
 
275
- Thing3.create(:id => 1, :name => "thing1", :email => "thing1@localhost", :moment => Time.now)
281
+ Thing3.create(id: 1, name: "thing1", email: "thing1@localhost", moment: Time.now)
276
282
  assert_equal 1, Thing1.count
277
283
  assert_equal 1, Thing2.count
278
284
  assert_equal 1, Thing3.count
279
285
  assert_equal 0, Thing4.count
280
286
 
281
- Thing4.create(:id => 1, :name => "thing1", :email => "thing1@localhost", :moment => Time.now)
287
+ Thing4.create(id: 1, name: "thing1", email: "thing1@localhost", moment: Time.now)
282
288
  assert_equal 1, Thing1.count
283
289
  assert_equal 1, Thing2.count
284
290
  assert_equal 1, Thing3.count
@@ -287,7 +293,7 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
287
293
 
288
294
  def test_raise_on_unquoted_schema_name
289
295
  assert_raises(ActiveRecord::StatementInvalid) do
290
- with_schema_search_path '$user,public'
296
+ with_schema_search_path "$user,public"
291
297
  end
292
298
  end
293
299
 
@@ -301,13 +307,19 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
301
307
 
302
308
  def test_index_name_exists
303
309
  with_schema_search_path(SCHEMA_NAME) do
304
- assert @connection.index_name_exists?(TABLE_NAME, INDEX_A_NAME, true)
305
- assert @connection.index_name_exists?(TABLE_NAME, INDEX_B_NAME, true)
306
- assert @connection.index_name_exists?(TABLE_NAME, INDEX_C_NAME, true)
307
- assert @connection.index_name_exists?(TABLE_NAME, INDEX_D_NAME, true)
308
- assert @connection.index_name_exists?(TABLE_NAME, INDEX_E_NAME, true)
309
- assert @connection.index_name_exists?(TABLE_NAME, INDEX_E_NAME, true)
310
- assert_not @connection.index_name_exists?(TABLE_NAME, 'missing_index', true)
310
+ assert @connection.index_name_exists?(TABLE_NAME, INDEX_A_NAME)
311
+ assert @connection.index_name_exists?(TABLE_NAME, INDEX_B_NAME)
312
+ assert @connection.index_name_exists?(TABLE_NAME, INDEX_C_NAME)
313
+ assert @connection.index_name_exists?(TABLE_NAME, INDEX_D_NAME)
314
+ assert @connection.index_name_exists?(TABLE_NAME, INDEX_E_NAME)
315
+ assert @connection.index_name_exists?(TABLE_NAME, INDEX_E_NAME)
316
+ assert_not @connection.index_name_exists?(TABLE_NAME, "missing_index")
317
+
318
+ if supports_partitioned_indexes?
319
+ create_partitioned_table
320
+ create_partitioned_table_index
321
+ assert @connection.index_name_exists?(PARTITIONED_TABLE, PARTITIONED_TABLE_INDEX)
322
+ end
311
323
  end
312
324
  end
313
325
 
@@ -326,13 +338,29 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
326
338
  def test_dump_indexes_for_table_with_scheme_specified_in_name
327
339
  indexes = @connection.indexes("#{SCHEMA_NAME}.#{TABLE_NAME}")
328
340
  assert_equal 5, indexes.size
341
+
342
+ if supports_partitioned_indexes?
343
+ create_partitioned_table
344
+ create_partitioned_table_index
345
+ indexes = @connection.indexes("#{SCHEMA_NAME}.#{PARTITIONED_TABLE}")
346
+ assert_equal 1, indexes.size
347
+ end
329
348
  end
330
349
 
331
350
  def test_with_uppercase_index_name
332
351
  @connection.execute "CREATE INDEX \"things_Index\" ON #{SCHEMA_NAME}.things (name)"
333
352
 
334
353
  with_schema_search_path SCHEMA_NAME do
335
- assert_nothing_raised { @connection.remove_index "things", name: "things_Index"}
354
+ assert_nothing_raised { @connection.remove_index "things", name: "things_Index" }
355
+ end
356
+
357
+ if supports_partitioned_indexes?
358
+ create_partitioned_table
359
+ @connection.execute "CREATE INDEX \"#{PARTITIONED_TABLE}_Index\" ON #{SCHEMA_NAME}.#{PARTITIONED_TABLE} (logdate, city_id)"
360
+
361
+ with_schema_search_path SCHEMA_NAME do
362
+ assert_nothing_raised { @connection.remove_index PARTITIONED_TABLE, name: "#{PARTITIONED_TABLE}_Index" }
363
+ end
336
364
  end
337
365
  end
338
366
 
@@ -348,6 +376,22 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
348
376
 
349
377
  @connection.execute "CREATE INDEX \"things_Index\" ON #{SCHEMA_NAME}.things (name)"
350
378
  assert_raises(ArgumentError) { @connection.remove_index "#{SCHEMA2_NAME}.things", name: "#{SCHEMA_NAME}.things_Index" }
379
+
380
+ if supports_partitioned_indexes?
381
+ create_partitioned_table
382
+
383
+ @connection.execute "CREATE INDEX \"#{PARTITIONED_TABLE}_Index\" ON #{SCHEMA_NAME}.#{PARTITIONED_TABLE} (logdate, city_id)"
384
+ assert_nothing_raised { @connection.remove_index PARTITIONED_TABLE, name: "#{SCHEMA_NAME}.#{PARTITIONED_TABLE}_Index" }
385
+
386
+ @connection.execute "CREATE INDEX \"#{PARTITIONED_TABLE}_Index\" ON #{SCHEMA_NAME}.#{PARTITIONED_TABLE} (logdate, city_id)"
387
+ assert_nothing_raised { @connection.remove_index "#{SCHEMA_NAME}.#{PARTITIONED_TABLE}", name: "#{PARTITIONED_TABLE}_Index" }
388
+
389
+ @connection.execute "CREATE INDEX \"#{PARTITIONED_TABLE}_Index\" ON #{SCHEMA_NAME}.#{PARTITIONED_TABLE} (logdate, city_id)"
390
+ assert_nothing_raised { @connection.remove_index "#{SCHEMA_NAME}.#{PARTITIONED_TABLE}", name: "#{SCHEMA_NAME}.#{PARTITIONED_TABLE}_Index" }
391
+
392
+ @connection.execute "CREATE INDEX \"#{PARTITIONED_TABLE}_Index\" ON #{SCHEMA_NAME}.#{PARTITIONED_TABLE} (logdate, city_id)"
393
+ assert_raises(ArgumentError) { @connection.remove_index "#{SCHEMA2_NAME}.#{PARTITIONED_TABLE}", name: "#{SCHEMA_NAME}.#{PARTITIONED_TABLE}_Index" }
394
+ end
351
395
  end
352
396
 
353
397
  def test_primary_key_with_schema_specified
@@ -356,21 +400,13 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
356
400
  %(#{SCHEMA_NAME}."#{PK_TABLE_NAME}"),
357
401
  %(#{SCHEMA_NAME}.#{PK_TABLE_NAME})
358
402
  ].each do |given|
359
- assert_equal 'id', @connection.primary_key(given), "primary key should be found when table referenced as #{given}"
403
+ assert_equal "id", @connection.primary_key(given), "primary key should be found when table referenced as #{given}"
360
404
  end
361
405
  end
362
406
 
363
407
  def test_primary_key_assuming_schema_search_path
364
- with_schema_search_path(SCHEMA_NAME) do
365
- assert_equal 'id', @connection.primary_key(PK_TABLE_NAME), "primary key should be found"
366
- end
367
- end
368
-
369
- def test_primary_key_raises_error_if_table_not_found_on_schema_search_path
370
- with_schema_search_path(SCHEMA2_NAME) do
371
- assert_raises(ActiveRecord::StatementInvalid) do
372
- @connection.primary_key(PK_TABLE_NAME)
373
- end
408
+ with_schema_search_path("#{SCHEMA_NAME}, #{SCHEMA2_NAME}") do
409
+ assert_equal "id", @connection.primary_key(PK_TABLE_NAME), "primary key should be found"
374
410
  end
375
411
  end
376
412
 
@@ -381,19 +417,19 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
381
417
  %("#{SCHEMA_NAME}"."#{UNMATCHED_PK_TABLE_NAME}")
382
418
  ].each do |given|
383
419
  pk, seq = @connection.pk_and_sequence_for(given)
384
- assert_equal 'id', pk, "primary key should be found when table referenced as #{given}"
420
+ assert_equal "id", pk, "primary key should be found when table referenced as #{given}"
385
421
  assert_equal pg_name.new(SCHEMA_NAME, "#{PK_TABLE_NAME}_id_seq"), seq, "sequence name should be found when table referenced as #{given}" if given == %("#{SCHEMA_NAME}"."#{PK_TABLE_NAME}")
386
- assert_equal pg_name.new(SCHEMA_NAME, UNMATCHED_SEQUENCE_NAME), seq, "sequence name should be found when table referenced as #{given}" if given == %("#{SCHEMA_NAME}"."#{UNMATCHED_PK_TABLE_NAME}")
422
+ assert_equal pg_name.new(SCHEMA_NAME, UNMATCHED_SEQUENCE_NAME), seq, "sequence name should be found when table referenced as #{given}" if given == %("#{SCHEMA_NAME}"."#{UNMATCHED_PK_TABLE_NAME}")
387
423
  end
388
424
  end
389
425
 
390
426
  def test_current_schema
391
427
  {
392
- %('$user',public) => 'public',
428
+ %('$user',public) => "public",
393
429
  SCHEMA_NAME => SCHEMA_NAME,
394
430
  %(#{SCHEMA2_NAME},#{SCHEMA_NAME},public) => SCHEMA2_NAME,
395
- %(public,#{SCHEMA2_NAME},#{SCHEMA_NAME}) => 'public'
396
- }.each do |given,expect|
431
+ %(public,#{SCHEMA2_NAME},#{SCHEMA_NAME}) => "public"
432
+ }.each do |given, expect|
397
433
  with_schema_search_path(given) { assert_equal expect, @connection.current_schema }
398
434
  end
399
435
  end
@@ -401,7 +437,7 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
401
437
  def test_prepared_statements_with_multiple_schemas
402
438
  [SCHEMA_NAME, SCHEMA2_NAME].each do |schema_name|
403
439
  with_schema_search_path schema_name do
404
- Thing5.create(:id => 1, :name => "thing inside #{SCHEMA_NAME}", :email => "thing1@localhost", :moment => Time.now)
440
+ Thing5.create(id: 1, name: "thing inside #{SCHEMA_NAME}", email: "thing1@localhost", moment: Time.now)
405
441
  end
406
442
  end
407
443
 
@@ -414,11 +450,11 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
414
450
 
415
451
  def test_schema_exists?
416
452
  {
417
- 'public' => true,
453
+ "public" => true,
418
454
  SCHEMA_NAME => true,
419
455
  SCHEMA2_NAME => true,
420
- 'darkside' => false
421
- }.each do |given,expect|
456
+ "darkside" => false
457
+ }.each do |given, expect|
422
458
  assert_equal expect, @connection.schema_exists?(given)
423
459
  end
424
460
  end
@@ -442,7 +478,7 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
442
478
  private
443
479
  def columns(table_name)
444
480
  @connection.send(:column_definitions, table_name).map do |name, type, default|
445
- "#{name} #{type}" + (default ? " default #{default}" : '')
481
+ "#{name} #{type}" + (default ? " default #{default}" : "")
446
482
  end
447
483
  end
448
484
 
@@ -464,7 +500,7 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
464
500
  assert_equal :btree, index_d.using
465
501
  assert_equal :gin, index_e.using
466
502
 
467
- assert_equal :desc, index_d.orders[INDEX_D_COLUMN]
503
+ assert_equal :desc, index_d.orders
468
504
  end
469
505
  end
470
506
 
@@ -478,6 +514,14 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
478
514
  def bind_param(value)
479
515
  ActiveRecord::Relation::QueryAttribute.new(nil, value, ActiveRecord::Type::Value.new)
480
516
  end
517
+
518
+ def create_partitioned_table
519
+ @connection.execute "CREATE TABLE #{SCHEMA_NAME}.\"#{PARTITIONED_TABLE}\" (city_id integer not null, logdate date not null) PARTITION BY LIST (city_id)"
520
+ end
521
+
522
+ def create_partitioned_table_index
523
+ @connection.execute "CREATE INDEX #{PARTITIONED_TABLE_INDEX} ON #{SCHEMA_NAME}.#{PARTITIONED_TABLE} (logdate, city_id)"
524
+ end
481
525
  end
482
526
 
483
527
  class SchemaForeignKeyTest < ActiveRecord::PostgreSQLTestCase
@@ -505,6 +549,78 @@ class SchemaForeignKeyTest < ActiveRecord::PostgreSQLTestCase
505
549
  end
506
550
  end
507
551
 
552
+ class SchemaIndexOpclassTest < ActiveRecord::PostgreSQLTestCase
553
+ include SchemaDumpingHelper
554
+
555
+ setup do
556
+ @connection = ActiveRecord::Base.connection
557
+ @connection.create_table "trains" do |t|
558
+ t.string :name
559
+ t.string :position
560
+ t.text :description
561
+ end
562
+ end
563
+
564
+ teardown do
565
+ @connection.drop_table "trains", if_exists: true
566
+ end
567
+
568
+ def test_string_opclass_is_dumped
569
+ @connection.execute "CREATE INDEX trains_name_and_description ON trains USING btree(name text_pattern_ops, description text_pattern_ops)"
570
+
571
+ output = dump_table_schema "trains"
572
+
573
+ assert_match(/opclass: :text_pattern_ops/, output)
574
+ end
575
+
576
+ def test_non_default_opclass_is_dumped
577
+ @connection.execute "CREATE INDEX trains_name_and_description ON trains USING btree(name, description text_pattern_ops)"
578
+
579
+ output = dump_table_schema "trains"
580
+
581
+ assert_match(/opclass: \{ description: :text_pattern_ops \}/, output)
582
+ end
583
+
584
+ def test_opclass_class_parsing_on_non_reserved_and_cannot_be_function_or_type_keyword
585
+ @connection.enable_extension("pg_trgm")
586
+ @connection.execute "CREATE INDEX trains_position ON trains USING gin(position gin_trgm_ops)"
587
+ @connection.execute "CREATE INDEX trains_name_and_position ON trains USING btree(name, position text_pattern_ops)"
588
+
589
+ output = dump_table_schema "trains"
590
+
591
+ assert_match(/opclass: :gin_trgm_ops/, output)
592
+ assert_match(/opclass: \{ position: :text_pattern_ops \}/, output)
593
+ end
594
+ end
595
+
596
+ class SchemaIndexNullsOrderTest < ActiveRecord::PostgreSQLTestCase
597
+ include SchemaDumpingHelper
598
+
599
+ setup do
600
+ @connection = ActiveRecord::Base.connection
601
+ @connection.create_table "trains" do |t|
602
+ t.string :name
603
+ t.text :description
604
+ end
605
+ end
606
+
607
+ teardown do
608
+ @connection.drop_table "trains", if_exists: true
609
+ end
610
+
611
+ def test_nulls_order_is_dumped
612
+ @connection.execute "CREATE INDEX trains_name_and_description ON trains USING btree(name NULLS FIRST, description)"
613
+ output = dump_table_schema "trains"
614
+ assert_match(/order: \{ name: "NULLS FIRST" \}/, output)
615
+ end
616
+
617
+ def test_non_default_order_with_nulls_is_dumped
618
+ @connection.execute "CREATE INDEX trains_name_and_desc ON trains USING btree(name DESC NULLS LAST, description)"
619
+ output = dump_table_schema "trains"
620
+ assert_match(/order: \{ name: "DESC NULLS LAST" \}/, output)
621
+ end
622
+ end
623
+
508
624
  class DefaultsUsingMultipleSchemasAndDomainTest < ActiveRecord::PostgreSQLTestCase
509
625
  setup do
510
626
  @connection = ActiveRecord::Base.connection
@@ -539,7 +655,7 @@ class DefaultsUsingMultipleSchemasAndDomainTest < ActiveRecord::PostgreSQLTestCa
539
655
  end
540
656
 
541
657
  def test_decimal_defaults_in_new_schema_when_overriding_domain
542
- assert_equal BigDecimal.new("3.14159265358979323846"), Default.new.decimal_col, "Default of decimal column was not correctly parsed"
658
+ assert_equal BigDecimal("3.14159265358979323846"), Default.new.decimal_col, "Default of decimal column was not correctly parsed"
543
659
  end
544
660
 
545
661
  def test_bpchar_defaults_in_new_schema_when_overriding_domain
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'support/schema_dumping_helper'
4
+ require "support/schema_dumping_helper"
3
5
 
4
6
  class PostgresqlSerialTest < ActiveRecord::PostgreSQLTestCase
5
7
  include SchemaDumpingHelper
@@ -22,14 +24,14 @@ class PostgresqlSerialTest < ActiveRecord::PostgreSQLTestCase
22
24
  column = PostgresqlSerial.columns_hash["seq"]
23
25
  assert_equal :integer, column.type
24
26
  assert_equal "integer", column.sql_type
25
- assert column.serial?
27
+ assert_predicate column, :serial?
26
28
  end
27
29
 
28
30
  def test_not_serial_column
29
31
  column = PostgresqlSerial.columns_hash["serials_id"]
30
32
  assert_equal :integer, column.type
31
33
  assert_equal "integer", column.sql_type
32
- assert_not column.serial?
34
+ assert_not_predicate column, :serial?
33
35
  end
34
36
 
35
37
  def test_schema_dump_with_shorthand
@@ -64,14 +66,14 @@ class PostgresqlBigSerialTest < ActiveRecord::PostgreSQLTestCase
64
66
  column = PostgresqlBigSerial.columns_hash["seq"]
65
67
  assert_equal :integer, column.type
66
68
  assert_equal "bigint", column.sql_type
67
- assert column.serial?
69
+ assert_predicate column, :serial?
68
70
  end
69
71
 
70
72
  def test_not_bigserial_column
71
73
  column = PostgresqlBigSerial.columns_hash["serials_id"]
72
74
  assert_equal :integer, column.type
73
75
  assert_equal "bigint", column.sql_type
74
- assert_not column.serial?
76
+ assert_not_predicate column, :serial?
75
77
  end
76
78
 
77
79
  def test_schema_dump_with_shorthand
@@ -109,7 +111,7 @@ module SequenceNameDetectionTestCases
109
111
  columns = @connection.columns(:foo)
110
112
  columns.each do |column|
111
113
  assert_equal :integer, column.type
112
- assert column.serial?
114
+ assert_predicate column, :serial?
113
115
  end
114
116
  end
115
117
 
@@ -140,7 +142,7 @@ module SequenceNameDetectionTestCases
140
142
  columns = @connection.columns(@table_name)
141
143
  columns.each do |column|
142
144
  assert_equal :integer, column.type
143
- assert column.serial?
145
+ assert_predicate column, :serial?
144
146
  end
145
147
  end
146
148
 
@@ -1,4 +1,8 @@
1
- require 'cases/helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/computer"
5
+ require "models/developer"
2
6
 
3
7
  module ActiveRecord
4
8
  module ConnectionAdapters
@@ -14,27 +18,43 @@ module ActiveRecord
14
18
  end
15
19
 
16
20
  class StatementPoolTest < ActiveRecord::PostgreSQLTestCase
21
+ fixtures :developers
22
+
17
23
  if Process.respond_to?(:fork)
18
24
  def test_cache_is_per_pid
19
25
  cache = StatementPool.new nil, 10
20
- cache['foo'] = 'bar'
21
- assert_equal 'bar', cache['foo']
26
+ cache["foo"] = "bar"
27
+ assert_equal "bar", cache["foo"]
22
28
 
23
29
  pid = fork {
24
- lookup = cache['foo'];
30
+ lookup = cache["foo"]
25
31
  exit!(!lookup)
26
32
  }
27
33
 
28
34
  Process.waitpid pid
29
- assert $?.success?, 'process should exit successfully'
35
+ assert $?.success?, "process should exit successfully"
30
36
  end
31
37
  end
32
38
 
33
39
  def test_dealloc_does_not_raise_on_inactive_connection
34
40
  cache = StatementPool.new InactivePgConnection.new, 10
35
- cache['foo'] = 'bar'
41
+ cache["foo"] = "bar"
36
42
  assert_nothing_raised { cache.clear }
37
43
  end
44
+
45
+ def test_prepared_statements_do_not_get_stuck_on_query_interruption
46
+ pg_connection = ActiveRecord::Base.connection.instance_variable_get(:@connection)
47
+ pg_connection.stub(:get_last_result, -> { raise "random error" }) do
48
+ assert_raises(RuntimeError) do
49
+ Developer.where(name: "David").last
50
+ end
51
+
52
+ # without fix, this raises PG::DuplicatePstatement: ERROR: prepared statement "a3" already exists
53
+ assert_raises(RuntimeError) do
54
+ Developer.where(name: "David").last
55
+ end
56
+ end
57
+ end
38
58
  end
39
59
  end
40
60
  end