ibm_db 5.2.0-x86-mingw32 → 5.3.2-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 (621) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/ext/Makefile +15 -13
  5. data/ext/ibm_db.c +62 -57
  6. data/ext/ibm_db.o +0 -0
  7. data/ext/ibm_db.so +0 -0
  8. data/ext/mkmf.log +26 -24
  9. data/ext/ruby_ibm_db_cli.c +1 -0
  10. data/ext/ruby_ibm_db_cli.o +0 -0
  11. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
  12. data/lib/ibm_db.so +1 -0
  13. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  14. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  15. data/test/activejob/destroy_association_async_test.rb +305 -0
  16. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  17. data/test/activejob/helper.rb +15 -0
  18. data/test/assets/schema_dump_5_1.yml +345 -0
  19. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  20. data/test/cases/adapter_test.rb +432 -218
  21. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  22. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  23. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  24. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  25. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  26. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  27. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  28. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  29. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  30. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  31. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  32. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  33. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  34. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  35. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  36. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  37. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  38. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  39. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  40. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  41. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  42. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  43. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  44. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  45. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  46. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  47. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  48. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  49. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  50. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  51. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  52. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  53. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  54. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  55. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  56. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  57. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  58. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  59. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  60. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  61. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  62. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  63. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  64. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  65. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  66. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  67. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  68. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  69. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  70. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  71. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  72. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  73. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  74. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  75. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  76. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  77. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  78. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  79. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  80. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  81. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  82. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  83. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  84. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  85. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  86. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  87. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  88. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  89. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  90. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  91. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  92. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  93. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  94. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  95. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  96. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  97. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  98. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  99. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  100. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  101. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  102. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  103. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  104. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  105. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  106. data/test/cases/aggregations_test.rb +14 -12
  107. data/test/cases/annotate_test.rb +46 -0
  108. data/test/cases/ar_schema_test.rb +153 -86
  109. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  110. data/test/cases/arel/attributes/math_test.rb +83 -0
  111. data/test/cases/arel/attributes_test.rb +27 -0
  112. data/test/cases/arel/collectors/bind_test.rb +40 -0
  113. data/test/cases/arel/collectors/composite_test.rb +47 -0
  114. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  115. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  116. data/test/cases/arel/crud_test.rb +65 -0
  117. data/test/cases/arel/delete_manager_test.rb +53 -0
  118. data/test/cases/arel/factory_methods_test.rb +46 -0
  119. data/test/cases/arel/helper.rb +45 -0
  120. data/test/cases/arel/insert_manager_test.rb +241 -0
  121. data/test/cases/arel/nodes/and_test.rb +30 -0
  122. data/test/cases/arel/nodes/as_test.rb +36 -0
  123. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  124. data/test/cases/arel/nodes/bin_test.rb +35 -0
  125. data/test/cases/arel/nodes/binary_test.rb +29 -0
  126. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  127. data/test/cases/arel/nodes/case_test.rb +96 -0
  128. data/test/cases/arel/nodes/casted_test.rb +18 -0
  129. data/test/cases/arel/nodes/comment_test.rb +22 -0
  130. data/test/cases/arel/nodes/count_test.rb +35 -0
  131. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  132. data/test/cases/arel/nodes/descending_test.rb +46 -0
  133. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  134. data/test/cases/arel/nodes/equality_test.rb +62 -0
  135. data/test/cases/arel/nodes/extract_test.rb +43 -0
  136. data/test/cases/arel/nodes/false_test.rb +21 -0
  137. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  138. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  139. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  140. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  141. data/test/cases/arel/nodes/node_test.rb +22 -0
  142. data/test/cases/arel/nodes/not_test.rb +31 -0
  143. data/test/cases/arel/nodes/or_test.rb +36 -0
  144. data/test/cases/arel/nodes/over_test.rb +69 -0
  145. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  146. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  147. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  148. data/test/cases/arel/nodes/sum_test.rb +35 -0
  149. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  150. data/test/cases/arel/nodes/true_test.rb +21 -0
  151. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  152. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  153. data/test/cases/arel/nodes/window_test.rb +81 -0
  154. data/test/cases/arel/nodes_test.rb +34 -0
  155. data/test/cases/arel/select_manager_test.rb +1238 -0
  156. data/test/cases/arel/support/fake_record.rb +135 -0
  157. data/test/cases/arel/table_test.rb +216 -0
  158. data/test/cases/arel/update_manager_test.rb +126 -0
  159. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  160. data/test/cases/arel/visitors/dot_test.rb +90 -0
  161. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  162. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  163. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  164. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  165. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  166. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  167. data/test/cases/associations/callbacks_test.rb +56 -38
  168. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  169. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  170. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  171. data/test/cases/associations/eager_singularization_test.rb +21 -21
  172. data/test/cases/associations/eager_test.rb +559 -415
  173. data/test/cases/associations/extension_test.rb +18 -12
  174. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  175. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  176. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  177. data/test/cases/associations/has_one_associations_test.rb +294 -129
  178. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  179. data/test/cases/associations/inner_join_association_test.rb +114 -38
  180. data/test/cases/associations/inverse_associations_test.rb +606 -398
  181. data/test/cases/associations/join_model_test.rb +158 -148
  182. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  183. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  184. data/test/cases/associations/required_test.rb +35 -10
  185. data/test/cases/associations_test.rb +241 -110
  186. data/test/cases/attribute_methods/read_test.rb +11 -11
  187. data/test/cases/attribute_methods_test.rb +413 -298
  188. data/test/cases/attributes_test.rb +145 -27
  189. data/test/cases/autosave_association_test.rb +681 -436
  190. data/test/cases/base_prevent_writes_test.rb +229 -0
  191. data/test/cases/base_test.rb +599 -542
  192. data/test/cases/batches_test.rb +288 -82
  193. data/test/cases/binary_test.rb +26 -31
  194. data/test/cases/bind_parameter_test.rb +194 -21
  195. data/test/cases/boolean_test.rb +52 -0
  196. data/test/cases/cache_key_test.rb +110 -5
  197. data/test/cases/calculations_test.rb +740 -177
  198. data/test/cases/callbacks_test.rb +74 -207
  199. data/test/cases/clone_test.rb +15 -10
  200. data/test/cases/coders/json_test.rb +2 -0
  201. data/test/cases/coders/yaml_column_test.rb +16 -13
  202. data/test/cases/collection_cache_key_test.rb +177 -20
  203. data/test/cases/column_alias_test.rb +9 -7
  204. data/test/cases/column_definition_test.rb +10 -68
  205. data/test/cases/comment_test.rb +166 -107
  206. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  207. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  208. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  209. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  210. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  211. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  212. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  213. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  214. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  215. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  216. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  217. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  218. data/test/cases/connection_management_test.rb +13 -11
  219. data/test/cases/connection_pool_test.rb +316 -83
  220. data/test/cases/core_test.rb +82 -58
  221. data/test/cases/counter_cache_test.rb +204 -50
  222. data/test/cases/custom_locking_test.rb +5 -3
  223. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  224. data/test/cases/database_configurations/resolver_test.rb +150 -0
  225. data/test/cases/database_configurations_test.rb +145 -0
  226. data/test/cases/database_selector_test.rb +296 -0
  227. data/test/cases/database_statements_test.rb +18 -16
  228. data/test/cases/date_test.rb +8 -16
  229. data/test/cases/date_time_precision_test.rb +100 -78
  230. data/test/cases/date_time_test.rb +23 -8
  231. data/test/cases/defaults_test.rb +106 -71
  232. data/test/cases/delegated_type_test.rb +57 -0
  233. data/test/cases/dirty_test.rb +419 -223
  234. data/test/cases/disconnected_test.rb +6 -6
  235. data/test/cases/dup_test.rb +54 -27
  236. data/test/cases/enum_test.rb +461 -82
  237. data/test/cases/errors_test.rb +7 -7
  238. data/test/cases/explain_subscriber_test.rb +17 -15
  239. data/test/cases/explain_test.rb +11 -19
  240. data/test/cases/filter_attributes_test.rb +153 -0
  241. data/test/cases/finder_respond_to_test.rb +14 -14
  242. data/test/cases/finder_test.rb +669 -287
  243. data/test/cases/fixture_set/file_test.rb +34 -38
  244. data/test/cases/fixtures_test.rb +833 -176
  245. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  246. data/test/cases/habtm_destroy_order_test.rb +25 -25
  247. data/test/cases/helper.rb +78 -49
  248. data/test/cases/hot_compatibility_test.rb +33 -32
  249. data/test/cases/i18n_test.rb +18 -17
  250. data/test/cases/inheritance_test.rb +180 -115
  251. data/test/cases/insert_all_test.rb +489 -0
  252. data/test/cases/instrumentation_test.rb +101 -0
  253. data/test/cases/integration_test.rb +119 -31
  254. data/test/cases/invalid_connection_test.rb +18 -16
  255. data/test/cases/invertible_migration_test.rb +183 -43
  256. data/test/cases/json_attribute_test.rb +35 -0
  257. data/test/cases/json_serialization_test.rb +57 -58
  258. data/test/cases/json_shared_test_cases.rb +290 -0
  259. data/test/cases/locking_test.rb +413 -119
  260. data/test/cases/log_subscriber_test.rb +68 -26
  261. data/test/cases/marshal_serialization_test.rb +39 -0
  262. data/test/cases/migration/change_schema_test.rb +118 -72
  263. data/test/cases/migration/change_table_test.rb +138 -30
  264. data/test/cases/migration/check_constraint_test.rb +162 -0
  265. data/test/cases/migration/column_attributes_test.rb +45 -35
  266. data/test/cases/migration/column_positioning_test.rb +18 -6
  267. data/test/cases/migration/columns_test.rb +93 -77
  268. data/test/cases/migration/command_recorder_test.rb +121 -34
  269. data/test/cases/migration/compatibility_test.rb +578 -23
  270. data/test/cases/migration/create_join_table_test.rb +35 -25
  271. data/test/cases/migration/foreign_key_test.rb +503 -284
  272. data/test/cases/migration/helper.rb +4 -3
  273. data/test/cases/migration/index_test.rb +119 -70
  274. data/test/cases/migration/logger_test.rb +9 -6
  275. data/test/cases/migration/pending_migrations_test.rb +88 -34
  276. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  277. data/test/cases/migration/references_index_test.rb +38 -19
  278. data/test/cases/migration/references_statements_test.rb +15 -14
  279. data/test/cases/migration/rename_table_test.rb +53 -30
  280. data/test/cases/migration_test.rb +637 -269
  281. data/test/cases/migrator_test.rb +191 -135
  282. data/test/cases/mixin_test.rb +7 -11
  283. data/test/cases/modules_test.rb +36 -34
  284. data/test/cases/multi_db_migrator_test.rb +223 -0
  285. data/test/cases/multiparameter_attributes_test.rb +60 -33
  286. data/test/cases/multiple_db_test.rb +16 -22
  287. data/test/cases/nested_attributes_test.rb +341 -320
  288. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  289. data/test/cases/null_relation_test.rb +84 -0
  290. data/test/cases/numeric_data_test.rb +93 -0
  291. data/test/cases/persistence_test.rb +361 -269
  292. data/test/cases/pooled_connections_test.rb +18 -26
  293. data/test/cases/prepared_statement_status_test.rb +48 -0
  294. data/test/cases/primary_keys_test.rb +210 -104
  295. data/test/cases/query_cache_test.rb +610 -141
  296. data/test/cases/quoting_test.rb +132 -31
  297. data/test/cases/readonly_test.rb +49 -48
  298. data/test/cases/reaper_test.rb +146 -32
  299. data/test/cases/reflection_test.rb +167 -156
  300. data/test/cases/relation/delegation_test.rb +49 -36
  301. data/test/cases/relation/delete_all_test.rb +117 -0
  302. data/test/cases/relation/merging_test.rb +319 -42
  303. data/test/cases/relation/mutation_test.rb +55 -93
  304. data/test/cases/relation/or_test.rb +129 -29
  305. data/test/cases/relation/predicate_builder_test.rb +21 -6
  306. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  307. data/test/cases/relation/select_test.rb +67 -0
  308. data/test/cases/relation/update_all_test.rb +317 -0
  309. data/test/cases/relation/where_chain_test.rb +68 -32
  310. data/test/cases/relation/where_clause_test.rb +136 -61
  311. data/test/cases/relation/where_test.rb +155 -48
  312. data/test/cases/relation_test.rb +266 -112
  313. data/test/cases/relations_test.rb +969 -744
  314. data/test/cases/reload_models_test.rb +13 -9
  315. data/test/cases/reserved_word_test.rb +141 -0
  316. data/test/cases/result_test.rb +68 -17
  317. data/test/cases/sanitize_test.rb +87 -71
  318. data/test/cases/schema_dumper_test.rb +221 -128
  319. data/test/cases/schema_loading_test.rb +3 -2
  320. data/test/cases/scoping/default_scoping_test.rb +185 -144
  321. data/test/cases/scoping/named_scoping_test.rb +177 -89
  322. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  323. data/test/cases/secure_token_test.rb +18 -3
  324. data/test/cases/serialization_test.rb +30 -28
  325. data/test/cases/serialized_attribute_test.rb +133 -42
  326. data/test/cases/signed_id_test.rb +168 -0
  327. data/test/cases/statement_cache_test.rb +41 -24
  328. data/test/cases/statement_invalid_test.rb +42 -0
  329. data/test/cases/store_test.rb +180 -55
  330. data/test/cases/strict_loading_test.rb +473 -0
  331. data/test/cases/suppressor_test.rb +26 -12
  332. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  333. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  334. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  335. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  336. data/test/cases/test_case.rb +51 -40
  337. data/test/cases/test_databases_test.rb +79 -0
  338. data/test/cases/test_fixtures_test.rb +79 -19
  339. data/test/cases/time_precision_test.rb +98 -76
  340. data/test/cases/timestamp_test.rb +102 -99
  341. data/test/cases/touch_later_test.rb +12 -10
  342. data/test/cases/transaction_callbacks_test.rb +344 -90
  343. data/test/cases/transaction_isolation_test.rb +12 -12
  344. data/test/cases/transactions_test.rb +612 -162
  345. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  346. data/test/cases/type/date_time_test.rb +4 -2
  347. data/test/cases/type/integer_test.rb +4 -2
  348. data/test/cases/type/string_test.rb +10 -8
  349. data/test/cases/type/time_test.rb +28 -0
  350. data/test/cases/type/type_map_test.rb +29 -28
  351. data/test/cases/type/unsigned_integer_test.rb +19 -0
  352. data/test/cases/type_test.rb +2 -0
  353. data/test/cases/types_test.rb +3 -1
  354. data/test/cases/unconnected_test.rb +14 -1
  355. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  356. data/test/cases/validations/absence_validation_test.rb +19 -17
  357. data/test/cases/validations/association_validation_test.rb +30 -28
  358. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  359. data/test/cases/validations/i18n_validation_test.rb +22 -21
  360. data/test/cases/validations/length_validation_test.rb +34 -33
  361. data/test/cases/validations/numericality_validation_test.rb +181 -0
  362. data/test/cases/validations/presence_validation_test.rb +21 -19
  363. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  364. data/test/cases/validations_repair_helper.rb +2 -0
  365. data/test/cases/validations_test.rb +61 -26
  366. data/test/cases/view_test.rb +122 -116
  367. data/test/cases/yaml_serialization_test.rb +79 -34
  368. data/test/config.example.yml +19 -19
  369. data/test/config.rb +3 -1
  370. data/test/config.yml +16 -6
  371. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  372. data/test/fixtures/author_addresses.yml +1 -8
  373. data/test/fixtures/authors.yml +1 -7
  374. data/test/fixtures/binaries.yml +4 -0
  375. data/test/fixtures/books.yml +9 -2
  376. data/test/fixtures/categories_posts.yml +3 -0
  377. data/test/fixtures/citations.yml +5 -0
  378. data/test/fixtures/comments.yml +7 -0
  379. data/test/fixtures/companies.yml +5 -0
  380. data/test/fixtures/computers.yml +2 -0
  381. data/test/fixtures/customers.yml +10 -1
  382. data/test/fixtures/developers.yml +1 -1
  383. data/test/fixtures/essays.yml +10 -0
  384. data/test/fixtures/faces.yml +3 -3
  385. data/test/fixtures/humans.yml +5 -0
  386. data/test/fixtures/interests.yml +7 -7
  387. data/test/fixtures/memberships.yml +7 -0
  388. data/test/fixtures/minimalistics.yml +3 -0
  389. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  390. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  391. data/test/fixtures/naked/yml/parrots.yml +1 -0
  392. data/test/fixtures/other_books.yml +26 -0
  393. data/test/fixtures/other_posts.yml +1 -0
  394. data/test/fixtures/parrots.yml +7 -1
  395. data/test/fixtures/pirates.yml +3 -0
  396. data/test/fixtures/posts.yml +11 -3
  397. data/test/fixtures/readers.yml +6 -0
  398. data/test/fixtures/reserved_words/values.yml +2 -2
  399. data/test/fixtures/sponsors.yml +3 -0
  400. data/test/fixtures/strict_zines.yml +2 -0
  401. data/test/fixtures/subscribers.yml +1 -1
  402. data/test/fixtures/tasks.yml +1 -1
  403. data/test/fixtures/warehouse-things.yml +3 -0
  404. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  405. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  406. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  407. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  408. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  409. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  410. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  411. data/test/migrations/rename/1_we_need_things.rb +2 -0
  412. data/test/migrations/rename/2_rename_things.rb +2 -0
  413. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  414. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  415. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  416. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  417. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  419. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  420. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  421. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  422. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  423. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  424. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  425. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  426. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  427. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  428. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  429. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  430. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  431. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  432. data/test/models/account.rb +46 -0
  433. data/test/models/admin/account.rb +3 -1
  434. data/test/models/admin/randomly_named_c1.rb +2 -0
  435. data/test/models/admin/user.rb +16 -8
  436. data/test/models/admin.rb +4 -2
  437. data/test/models/aircraft.rb +3 -1
  438. data/test/models/arunit2_model.rb +2 -0
  439. data/test/models/author.rb +153 -102
  440. data/test/models/auto_id.rb +2 -0
  441. data/test/models/autoloadable/extra_firm.rb +2 -0
  442. data/test/models/binary.rb +3 -1
  443. data/test/models/binary_field.rb +6 -0
  444. data/test/models/bird.rb +13 -1
  445. data/test/models/book.rb +14 -4
  446. data/test/models/book_destroy_async.rb +24 -0
  447. data/test/models/boolean.rb +5 -0
  448. data/test/models/bulb.rb +13 -4
  449. data/test/models/cake_designer.rb +2 -0
  450. data/test/models/car.rb +17 -10
  451. data/test/models/carrier.rb +2 -0
  452. data/test/models/cart.rb +5 -0
  453. data/test/models/cat.rb +2 -0
  454. data/test/models/categorization.rb +8 -6
  455. data/test/models/category.rb +28 -16
  456. data/test/models/chef.rb +2 -0
  457. data/test/models/citation.rb +5 -1
  458. data/test/models/club.rb +13 -10
  459. data/test/models/college.rb +4 -2
  460. data/test/models/column.rb +2 -0
  461. data/test/models/column_name.rb +2 -0
  462. data/test/models/comment.rb +32 -10
  463. data/test/models/company.rb +102 -106
  464. data/test/models/company_in_module.rb +27 -26
  465. data/test/models/computer.rb +3 -1
  466. data/test/models/contact.rb +15 -13
  467. data/test/models/content.rb +5 -3
  468. data/test/models/contract.rb +21 -3
  469. data/test/models/country.rb +2 -4
  470. data/test/models/course.rb +3 -1
  471. data/test/models/customer.rb +10 -8
  472. data/test/models/customer_carrier.rb +2 -0
  473. data/test/models/dashboard.rb +2 -0
  474. data/test/models/default.rb +2 -0
  475. data/test/models/department.rb +2 -0
  476. data/test/models/destroy_async_parent.rb +15 -0
  477. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  478. data/test/models/developer.rb +152 -85
  479. data/test/models/dl_keyed_belongs_to.rb +13 -0
  480. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  481. data/test/models/dl_keyed_has_many.rb +5 -0
  482. data/test/models/dl_keyed_has_many_through.rb +5 -0
  483. data/test/models/dl_keyed_has_one.rb +5 -0
  484. data/test/models/dl_keyed_join.rb +10 -0
  485. data/test/models/dog.rb +2 -0
  486. data/test/models/dog_lover.rb +2 -0
  487. data/test/models/doubloon.rb +3 -1
  488. data/test/models/drink_designer.rb +17 -0
  489. data/test/models/edge.rb +4 -2
  490. data/test/models/electron.rb +2 -0
  491. data/test/models/engine.rb +3 -2
  492. data/test/models/entrant.rb +2 -0
  493. data/test/models/entry.rb +5 -0
  494. data/test/models/essay.rb +6 -3
  495. data/test/models/essay_destroy_async.rb +12 -0
  496. data/test/models/event.rb +3 -1
  497. data/test/models/eye.rb +5 -3
  498. data/test/models/face.rb +14 -6
  499. data/test/models/family.rb +6 -0
  500. data/test/models/family_tree.rb +6 -0
  501. data/test/models/friendship.rb +5 -3
  502. data/test/models/frog.rb +8 -0
  503. data/test/models/guid.rb +3 -1
  504. data/test/models/guitar.rb +2 -0
  505. data/test/models/hotel.rb +5 -3
  506. data/test/models/human.rb +39 -0
  507. data/test/models/image.rb +3 -1
  508. data/test/models/interest.rb +14 -3
  509. data/test/models/invoice.rb +4 -2
  510. data/test/models/item.rb +3 -1
  511. data/test/models/job.rb +5 -3
  512. data/test/models/joke.rb +4 -2
  513. data/test/models/keyboard.rb +3 -1
  514. data/test/models/legacy_thing.rb +2 -0
  515. data/test/models/lesson.rb +2 -0
  516. data/test/models/line_item.rb +3 -1
  517. data/test/models/liquid.rb +2 -0
  518. data/test/models/matey.rb +3 -1
  519. data/test/models/measurement.rb +4 -0
  520. data/test/models/member.rb +23 -20
  521. data/test/models/member_detail.rb +3 -0
  522. data/test/models/member_type.rb +2 -0
  523. data/test/models/membership.rb +4 -1
  524. data/test/models/mentor.rb +3 -1
  525. data/test/models/message.rb +5 -0
  526. data/test/models/minimalistic.rb +2 -0
  527. data/test/models/minivan.rb +3 -2
  528. data/test/models/mixed_case_monkey.rb +3 -1
  529. data/test/models/molecule.rb +2 -0
  530. data/test/models/mouse.rb +6 -0
  531. data/test/models/movie.rb +2 -0
  532. data/test/models/node.rb +4 -2
  533. data/test/models/non_primary_key.rb +2 -0
  534. data/test/models/notification.rb +2 -0
  535. data/test/models/numeric_data.rb +12 -0
  536. data/test/models/order.rb +4 -2
  537. data/test/models/organization.rb +9 -7
  538. data/test/models/other_dog.rb +3 -1
  539. data/test/models/owner.rb +6 -4
  540. data/test/models/parrot.rb +12 -4
  541. data/test/models/person.rb +59 -54
  542. data/test/models/personal_legacy_thing.rb +3 -1
  543. data/test/models/pet.rb +4 -2
  544. data/test/models/pet_treasure.rb +2 -0
  545. data/test/models/pirate.rb +67 -43
  546. data/test/models/possession.rb +3 -1
  547. data/test/models/post.rb +184 -86
  548. data/test/models/price_estimate.rb +11 -1
  549. data/test/models/professor.rb +3 -1
  550. data/test/models/project.rb +14 -12
  551. data/test/models/publisher/article.rb +2 -0
  552. data/test/models/publisher/magazine.rb +2 -0
  553. data/test/models/publisher.rb +2 -0
  554. data/test/models/randomly_named_c1.rb +2 -0
  555. data/test/models/rating.rb +5 -1
  556. data/test/models/reader.rb +7 -5
  557. data/test/models/recipe.rb +2 -0
  558. data/test/models/record.rb +2 -0
  559. data/test/models/reference.rb +6 -3
  560. data/test/models/reply.rb +39 -21
  561. data/test/models/room.rb +6 -0
  562. data/test/models/section.rb +6 -0
  563. data/test/models/seminar.rb +6 -0
  564. data/test/models/session.rb +6 -0
  565. data/test/models/ship.rb +12 -9
  566. data/test/models/ship_part.rb +5 -3
  567. data/test/models/shop.rb +4 -2
  568. data/test/models/shop_account.rb +2 -0
  569. data/test/models/speedometer.rb +2 -0
  570. data/test/models/sponsor.rb +8 -5
  571. data/test/models/squeak.rb +6 -0
  572. data/test/models/strict_zine.rb +7 -0
  573. data/test/models/string_key_object.rb +2 -0
  574. data/test/models/student.rb +2 -0
  575. data/test/models/subscriber.rb +4 -2
  576. data/test/models/subscription.rb +5 -1
  577. data/test/models/tag.rb +6 -3
  578. data/test/models/tagging.rb +13 -6
  579. data/test/models/task.rb +2 -0
  580. data/test/models/topic.rb +54 -19
  581. data/test/models/toy.rb +4 -0
  582. data/test/models/traffic_light.rb +2 -0
  583. data/test/models/treasure.rb +5 -3
  584. data/test/models/treaty.rb +2 -4
  585. data/test/models/tree.rb +2 -0
  586. data/test/models/tuning_peg.rb +2 -0
  587. data/test/models/tyre.rb +2 -0
  588. data/test/models/user.rb +12 -4
  589. data/test/models/uuid_child.rb +2 -0
  590. data/test/models/uuid_item.rb +2 -0
  591. data/test/models/uuid_parent.rb +2 -0
  592. data/test/models/vegetables.rb +12 -3
  593. data/test/models/vertex.rb +6 -4
  594. data/test/models/warehouse_thing.rb +2 -0
  595. data/test/models/wheel.rb +3 -1
  596. data/test/models/without_table.rb +3 -1
  597. data/test/models/zine.rb +3 -1
  598. data/test/schema/mysql2_specific_schema.rb +49 -35
  599. data/test/schema/oracle_specific_schema.rb +13 -15
  600. data/test/schema/postgresql_specific_schema.rb +51 -40
  601. data/test/schema/schema.rb +334 -154
  602. data/test/schema/sqlite_specific_schema.rb +9 -16
  603. data/test/support/config.rb +26 -26
  604. data/test/support/connection.rb +14 -8
  605. data/test/support/connection_helper.rb +3 -1
  606. data/test/support/ddl_helper.rb +2 -0
  607. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  608. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  609. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  610. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  611. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  617. data/test/support/schema_dumping_helper.rb +2 -0
  618. data/test/support/stubs/strong_parameters.rb +40 -0
  619. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  620. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  621. metadata +190 -14
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'support/connection_helper'
4
+ require "support/connection_helper"
3
5
 
4
6
  module ActiveRecord
5
7
  class PostgresqlConnectionTest < ActiveRecord::PostgreSQLTestCase
@@ -13,8 +15,9 @@ module ActiveRecord
13
15
  def setup
14
16
  super
15
17
  @subscriber = SQLSubscriber.new
16
- @subscription = ActiveSupport::Notifications.subscribe('sql.active_record', @subscriber)
17
18
  @connection = ActiveRecord::Base.connection
19
+ @connection.materialize_transactions
20
+ @subscription = ActiveSupport::Notifications.subscribe("sql.active_record", @subscriber)
18
21
  end
19
22
 
20
23
  def teardown
@@ -22,24 +25,22 @@ module ActiveRecord
22
25
  super
23
26
  end
24
27
 
25
- def test_truncate
26
- count = ActiveRecord::Base.connection.execute("select count(*) from comments").first['count'].to_i
27
- assert_operator count, :>, 0
28
- ActiveRecord::Base.connection.truncate("comments")
29
- count = ActiveRecord::Base.connection.execute("select count(*) from comments").first['count'].to_i
30
- assert_equal 0, count
31
- end
32
-
33
28
  def test_encoding
34
- assert_not_nil @connection.encoding
29
+ assert_queries(1, ignore_none: true) do
30
+ assert_not_nil @connection.encoding
31
+ end
35
32
  end
36
33
 
37
34
  def test_collation
38
- assert_not_nil @connection.collation
35
+ assert_queries(1, ignore_none: true) do
36
+ assert_not_nil @connection.collation
37
+ end
39
38
  end
40
39
 
41
40
  def test_ctype
42
- assert_not_nil @connection.ctype
41
+ assert_queries(1, ignore_none: true) do
42
+ assert_not_nil @connection.ctype
43
+ end
43
44
  end
44
45
 
45
46
  def test_default_client_min_messages
@@ -49,133 +50,114 @@ module ActiveRecord
49
50
  # Ensure, we can set connection params using the example of Generic
50
51
  # Query Optimizer (geqo). It is 'on' per default.
51
52
  def test_connection_options
52
- params = ActiveRecord::Base.connection_config.dup
53
+ params = ActiveRecord::Base.connection_db_config.configuration_hash.dup
53
54
  params[:options] = "-c geqo=off"
54
55
  NonExistentTable.establish_connection(params)
55
56
 
56
57
  # Verify the connection param has been applied.
57
- expect = NonExistentTable.connection.query('show geqo').first.first
58
- assert_equal 'off', expect
58
+ expect = NonExistentTable.connection.query("show geqo").first.first
59
+ assert_equal "off", expect
59
60
  end
60
61
 
61
62
  def test_reset
62
- @connection.query('ROLLBACK')
63
- @connection.query('SET geqo TO off')
63
+ @connection.query("ROLLBACK")
64
+ @connection.query("SET geqo TO off")
64
65
 
65
66
  # Verify the setting has been applied.
66
- expect = @connection.query('show geqo').first.first
67
- assert_equal 'off', expect
67
+ expect = @connection.query("show geqo").first.first
68
+ assert_equal "off", expect
68
69
 
69
70
  @connection.reset!
70
71
 
71
72
  # Verify the setting has been cleared.
72
- expect = @connection.query('show geqo').first.first
73
- assert_equal 'on', expect
73
+ expect = @connection.query("show geqo").first.first
74
+ assert_equal "on", expect
74
75
  end
75
76
 
76
77
  def test_reset_with_transaction
77
- @connection.query('ROLLBACK')
78
- @connection.query('SET geqo TO off')
78
+ @connection.query("ROLLBACK")
79
+ @connection.query("SET geqo TO off")
79
80
 
80
81
  # Verify the setting has been applied.
81
- expect = @connection.query('show geqo').first.first
82
- assert_equal 'off', expect
82
+ expect = @connection.query("show geqo").first.first
83
+ assert_equal "off", expect
83
84
 
84
- @connection.query('BEGIN')
85
+ @connection.query("BEGIN")
85
86
  @connection.reset!
86
87
 
87
88
  # Verify the setting has been cleared.
88
- expect = @connection.query('show geqo').first.first
89
- assert_equal 'on', expect
89
+ expect = @connection.query("show geqo").first.first
90
+ assert_equal "on", expect
90
91
  end
91
92
 
92
93
  def test_tables_logs_name
93
- ActiveSupport::Deprecation.silence { @connection.tables('hello') }
94
- assert_equal 'SCHEMA', @subscriber.logged[0][1]
94
+ @connection.tables
95
+ assert_equal "SCHEMA", @subscriber.logged[0][1]
95
96
  end
96
97
 
97
98
  def test_indexes_logs_name
98
- @connection.indexes('items', 'hello')
99
- assert_equal 'SCHEMA', @subscriber.logged[0][1]
99
+ @connection.indexes("items")
100
+ assert_equal "SCHEMA", @subscriber.logged[0][1]
100
101
  end
101
102
 
102
103
  def test_table_exists_logs_name
103
- ActiveSupport::Deprecation.silence { @connection.table_exists?('items') }
104
- assert_equal 'SCHEMA', @subscriber.logged[0][1]
104
+ @connection.table_exists?("items")
105
+ assert_equal "SCHEMA", @subscriber.logged[0][1]
105
106
  end
106
107
 
107
108
  def test_table_alias_length_logs_name
108
109
  @connection.instance_variable_set("@max_identifier_length", nil)
109
110
  @connection.table_alias_length
110
- assert_equal 'SCHEMA', @subscriber.logged[0][1]
111
+ assert_equal "SCHEMA", @subscriber.logged[0][1]
111
112
  end
112
113
 
113
114
  def test_current_database_logs_name
114
115
  @connection.current_database
115
- assert_equal 'SCHEMA', @subscriber.logged[0][1]
116
+ assert_equal "SCHEMA", @subscriber.logged[0][1]
116
117
  end
117
118
 
118
119
  def test_encoding_logs_name
119
120
  @connection.encoding
120
- assert_equal 'SCHEMA', @subscriber.logged[0][1]
121
+ assert_equal "SCHEMA", @subscriber.logged[0][1]
121
122
  end
122
123
 
123
124
  def test_schema_names_logs_name
124
125
  @connection.schema_names
125
- assert_equal 'SCHEMA', @subscriber.logged[0][1]
126
+ assert_equal "SCHEMA", @subscriber.logged[0][1]
126
127
  end
127
128
 
128
129
  if ActiveRecord::Base.connection.prepared_statements
129
130
  def test_statement_key_is_logged
130
131
  bind = Relation::QueryAttribute.new(nil, 1, Type::Value.new)
131
- @connection.exec_query('SELECT $1::integer', 'SQL', [bind], prepare: true)
132
+ @connection.exec_query("SELECT $1::integer", "SQL", [bind], prepare: true)
132
133
  name = @subscriber.payloads.last[:statement_name]
133
134
  assert name
134
135
  res = @connection.exec_query("EXPLAIN (FORMAT JSON) EXECUTE #{name}(1)")
135
- plan = res.column_types['QUERY PLAN'].deserialize res.rows.first.first
136
+ plan = res.column_types["QUERY PLAN"].deserialize res.rows.first.first
136
137
  assert_operator plan.length, :>, 0
137
138
  end
138
139
  end
139
140
 
140
- # Must have PostgreSQL >= 9.2, or with_manual_interventions set to
141
- # true for this test to run.
142
- #
143
- # When prompted, restart the PostgreSQL server with the
144
- # "-m fast" option or kill the individual connection assuming
145
- # you know the incantation to do that.
146
- # To restart PostgreSQL 9.1 on OS X, installed via MacPorts, ...
147
- # sudo su postgres -c "pg_ctl restart -D /opt/local/var/db/postgresql91/defaultdb/ -m fast"
148
141
  def test_reconnection_after_actual_disconnection_with_verify
149
- original_connection_pid = @connection.query('select pg_backend_pid()')
142
+ original_connection_pid = @connection.query("select pg_backend_pid()")
150
143
 
151
144
  # Sanity check.
152
- assert @connection.active?
153
-
154
- if @connection.send(:postgresql_version) >= 90200
155
- secondary_connection = ActiveRecord::Base.connection_pool.checkout
156
- secondary_connection.query("select pg_terminate_backend(#{original_connection_pid.first.first})")
157
- ActiveRecord::Base.connection_pool.checkin(secondary_connection)
158
- elsif ARTest.config['with_manual_interventions']
159
- puts 'Kill the connection now (e.g. by restarting the PostgreSQL ' +
160
- 'server with the "-m fast" option) and then press enter.'
161
- $stdin.gets
162
- else
163
- # We're not capable of terminating the backend ourselves, and
164
- # we're not allowed to seek assistance; bail out without
165
- # actually testing anything.
166
- return
167
- end
145
+ assert_predicate @connection, :active?
146
+
147
+ secondary_connection = ActiveRecord::Base.connection_pool.checkout
148
+ secondary_connection.query("select pg_terminate_backend(#{original_connection_pid.first.first})")
149
+ ActiveRecord::Base.connection_pool.checkin(secondary_connection)
168
150
 
169
151
  @connection.verify!
170
152
 
171
- assert @connection.active?
153
+ assert_predicate @connection, :active?
172
154
 
173
155
  # If we get no exception here, then either we re-connected successfully, or
174
156
  # we never actually got disconnected.
175
- new_connection_pid = @connection.query('select pg_backend_pid()')
157
+ new_connection_pid = @connection.query("select pg_backend_pid()")
176
158
 
177
159
  assert_not_equal original_connection_pid, new_connection_pid,
178
- "umm -- looks like you didn't break the connection, because we're still " +
160
+ "umm -- looks like you didn't break the connection, because we're still " \
179
161
  "successfully querying with the same connection pid."
180
162
  ensure
181
163
  # Repair all fixture connections so other tests won't break.
@@ -184,7 +166,7 @@ module ActiveRecord
184
166
 
185
167
  def test_set_session_variable_true
186
168
  run_without_connection do |orig_connection|
187
- ActiveRecord::Base.establish_connection(orig_connection.deep_merge({:variables => {:debug_print_plan => true}}))
169
+ ActiveRecord::Base.establish_connection(orig_connection.deep_merge(variables: { debug_print_plan: true }))
188
170
  set_true = ActiveRecord::Base.connection.exec_query "SHOW DEBUG_PRINT_PLAN"
189
171
  assert_equal set_true.rows, [["on"]]
190
172
  end
@@ -192,7 +174,7 @@ module ActiveRecord
192
174
 
193
175
  def test_set_session_variable_false
194
176
  run_without_connection do |orig_connection|
195
- ActiveRecord::Base.establish_connection(orig_connection.deep_merge({:variables => {:debug_print_plan => false}}))
177
+ ActiveRecord::Base.establish_connection(orig_connection.deep_merge(variables: { debug_print_plan: false }))
196
178
  set_false = ActiveRecord::Base.connection.exec_query "SHOW DEBUG_PRINT_PLAN"
197
179
  assert_equal set_false.rows, [["off"]]
198
180
  end
@@ -201,20 +183,27 @@ module ActiveRecord
201
183
  def test_set_session_variable_nil
202
184
  run_without_connection do |orig_connection|
203
185
  # This should be a no-op that does not raise an error
204
- ActiveRecord::Base.establish_connection(orig_connection.deep_merge({:variables => {:debug_print_plan => nil}}))
186
+ ActiveRecord::Base.establish_connection(orig_connection.deep_merge(variables: { debug_print_plan: nil }))
205
187
  end
206
188
  end
207
189
 
208
190
  def test_set_session_variable_default
209
191
  run_without_connection do |orig_connection|
210
192
  # This should execute a query that does not raise an error
211
- ActiveRecord::Base.establish_connection(orig_connection.deep_merge({:variables => {:debug_print_plan => :default}}))
193
+ ActiveRecord::Base.establish_connection(orig_connection.deep_merge(variables: { debug_print_plan: :default }))
194
+ end
195
+ end
196
+
197
+ def test_set_session_timezone
198
+ run_without_connection do |orig_connection|
199
+ ActiveRecord::Base.establish_connection(orig_connection.deep_merge(variables: { timezone: "America/New_York" }))
200
+ assert_equal "America/New_York", ActiveRecord::Base.connection.query_value("SHOW TIME ZONE")
212
201
  end
213
202
  end
214
203
 
215
204
  def test_get_and_release_advisory_lock
216
205
  lock_id = 5295901941911233559
217
- list_advisory_locks = <<-SQL
206
+ list_advisory_locks = <<~SQL
218
207
  SELECT locktype,
219
208
  (classid::bigint << 32) | objid::bigint AS lock_id
220
209
  FROM pg_locks
@@ -224,14 +213,14 @@ module ActiveRecord
224
213
  got_lock = @connection.get_advisory_lock(lock_id)
225
214
  assert got_lock, "get_advisory_lock should have returned true but it didn't"
226
215
 
227
- advisory_lock = @connection.query(list_advisory_locks).find {|l| l[1] == lock_id}
216
+ advisory_lock = @connection.query(list_advisory_locks).find { |l| l[1] == lock_id }
228
217
  assert advisory_lock,
229
218
  "expected to find an advisory lock with lock_id #{lock_id} but there wasn't one"
230
219
 
231
220
  released_lock = @connection.release_advisory_lock(lock_id)
232
221
  assert released_lock, "expected release_advisory_lock to return true but it didn't"
233
222
 
234
- advisory_locks = @connection.query(list_advisory_locks).select {|l| l[1] == lock_id}
223
+ advisory_locks = @connection.query(list_advisory_locks).select { |l| l[1] == lock_id }
235
224
  assert_empty advisory_locks,
236
225
  "expected to have released advisory lock with lock_id #{lock_id} but it was still held"
237
226
  end
@@ -241,17 +230,16 @@ module ActiveRecord
241
230
  with_warning_suppression do
242
231
  released_non_existent_lock = @connection.release_advisory_lock(fake_lock_id)
243
232
  assert_equal released_non_existent_lock, false,
244
- 'expected release_advisory_lock to return false when there was no lock to release'
233
+ "expected release_advisory_lock to return false when there was no lock to release"
245
234
  end
246
235
  end
247
236
 
248
- protected
249
-
250
- def with_warning_suppression
251
- log_level = @connection.client_min_messages
252
- @connection.client_min_messages = 'error'
253
- yield
254
- @connection.client_min_messages = log_level
255
- end
237
+ private
238
+ def with_warning_suppression
239
+ log_level = @connection.client_min_messages
240
+ @connection.client_min_messages = "error"
241
+ yield
242
+ @connection.client_min_messages = log_level
243
+ end
256
244
  end
257
245
  end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "support/schema_dumping_helper"
5
+
6
+ class UnloggedTablesTest < ActiveRecord::PostgreSQLTestCase
7
+ include SchemaDumpingHelper
8
+
9
+ TABLE_NAME = "things"
10
+ LOGGED_FIELD = "relpersistence"
11
+ LOGGED_QUERY = "SELECT #{LOGGED_FIELD} FROM pg_class WHERE relname = '#{TABLE_NAME}'"
12
+ LOGGED = "p"
13
+ UNLOGGED = "u"
14
+ TEMPORARY = "t"
15
+
16
+ class Thing < ActiveRecord::Base
17
+ self.table_name = TABLE_NAME
18
+ end
19
+
20
+ def setup
21
+ @connection = ActiveRecord::Base.connection
22
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables = false
23
+ end
24
+
25
+ teardown do
26
+ @connection.drop_table TABLE_NAME, if_exists: true
27
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables = false
28
+ end
29
+
30
+ def test_logged_by_default
31
+ @connection.create_table(TABLE_NAME) do |t|
32
+ end
33
+ assert_equal @connection.execute(LOGGED_QUERY).first[LOGGED_FIELD], LOGGED
34
+ end
35
+
36
+ def test_unlogged_in_test_environment_when_unlogged_setting_enabled
37
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables = true
38
+
39
+ @connection.create_table(TABLE_NAME) do |t|
40
+ end
41
+ assert_equal @connection.execute(LOGGED_QUERY).first[LOGGED_FIELD], UNLOGGED
42
+ end
43
+
44
+ def test_not_included_in_schema_dump
45
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables = true
46
+
47
+ @connection.create_table(TABLE_NAME) do |t|
48
+ end
49
+ assert_no_match(/unlogged/i, dump_table_schema(TABLE_NAME))
50
+ end
51
+
52
+ def test_not_changed_in_change_table
53
+ @connection.create_table(TABLE_NAME) do |t|
54
+ end
55
+
56
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables = true
57
+
58
+ @connection.change_table(TABLE_NAME) do |t|
59
+ t.column :name, :string
60
+ end
61
+ assert_equal @connection.execute(LOGGED_QUERY).first[LOGGED_FIELD], LOGGED
62
+ end
63
+
64
+ def test_gracefully_handles_temporary_tables
65
+ @connection.create_table(TABLE_NAME, temporary: true) do |t|
66
+ end
67
+
68
+ # Temporary tables are already unlogged, though this query results in a
69
+ # different result ("t" vs. "u"). This test is really just checking that we
70
+ # didn't try to run `CREATE TEMPORARY UNLOGGED TABLE`, which would result in
71
+ # a PostgreSQL error.
72
+ assert_equal @connection.execute(LOGGED_QUERY).first[LOGGED_FIELD], TEMPORARY
73
+ end
74
+ end
@@ -1,8 +1,12 @@
1
- require "cases/helper"
2
- require 'support/ddl_helper'
1
+ # frozen_string_literal: true
3
2
 
3
+ require "cases/helper"
4
+ require "support/ddl_helper"
4
5
 
5
6
  class PostgresqlTime < ActiveRecord::Base
7
+ # Declare attributes to get rid from deprecation warnings on ActiveRecord 6.1
8
+ attribute :time_interval, :string
9
+ attribute :scaled_time_interval, :interval
6
10
  end
7
11
 
8
12
  class PostgresqlOid < ActiveRecord::Base
@@ -29,32 +33,25 @@ class PostgresqlDataTypeTest < ActiveRecord::PostgreSQLTestCase
29
33
  end
30
34
 
31
35
  def test_data_type_of_time_types
32
- assert_equal :string, @first_time.column_for_attribute(:time_interval).type
33
- assert_equal :string, @first_time.column_for_attribute(:scaled_time_interval).type
36
+ assert_equal :interval, @first_time.column_for_attribute(:time_interval).type
37
+ assert_equal :interval, @first_time.column_for_attribute(:scaled_time_interval).type
34
38
  end
35
39
 
36
40
  def test_data_type_of_oid_types
37
- assert_equal :integer, @first_oid.column_for_attribute(:obj_id).type
41
+ assert_equal :oid, @first_oid.column_for_attribute(:obj_id).type
38
42
  end
39
43
 
40
44
  def test_time_values
41
- assert_equal '-1 years -2 days', @first_time.time_interval
42
- assert_equal '-21 days', @first_time.scaled_time_interval
45
+ assert_equal "P-1Y-2D", @first_time.time_interval
46
+ assert_equal (-21.day), @first_time.scaled_time_interval
43
47
  end
44
48
 
45
49
  def test_oid_values
46
50
  assert_equal 1234, @first_oid.obj_id
47
51
  end
48
52
 
49
- def test_update_time
50
- @first_time.time_interval = '2 years 3 minutes'
51
- assert @first_time.save
52
- assert @first_time.reload
53
- assert_equal '2 years 00:03:00', @first_time.time_interval
54
- end
55
-
56
53
  def test_update_oid
57
- new_value = 567890
54
+ new_value = 2147483648
58
55
  @first_oid.obj_id = new_value
59
56
  assert @first_oid.save
60
57
  assert @first_oid.reload
@@ -62,9 +59,9 @@ class PostgresqlDataTypeTest < ActiveRecord::PostgreSQLTestCase
62
59
  end
63
60
 
64
61
  def test_text_columns_are_limitless_the_upper_limit_is_one_GB
65
- assert_equal 'text', @connection.type_to_sql(:text, 100_000)
66
- assert_raise ActiveRecord::ActiveRecordError do
67
- @connection.type_to_sql :text, 4294967295
62
+ assert_equal "text", @connection.type_to_sql(:text, limit: 100_000)
63
+ assert_raise ArgumentError do
64
+ @connection.type_to_sql(:text, limit: 4294967295)
68
65
  end
69
66
  end
70
67
  end
@@ -77,15 +74,15 @@ class PostgresqlInternalDataTypeTest < ActiveRecord::PostgreSQLTestCase
77
74
  end
78
75
 
79
76
  def test_name_column_type
80
- with_example_table @connection, 'ex', 'data name' do
81
- column = @connection.columns('ex').find { |col| col.name == 'data' }
77
+ with_example_table @connection, "ex", "data name" do
78
+ column = @connection.columns("ex").find { |col| col.name == "data" }
82
79
  assert_equal :string, column.type
83
80
  end
84
81
  end
85
82
 
86
83
  def test_char_column_type
87
- with_example_table @connection, 'ex', 'data "char"' do
88
- column = @connection.columns('ex').find { |col| col.name == 'data' }
84
+ with_example_table @connection, "ex", 'data "char"' do
85
+ column = @connection.columns("ex").find { |col| col.name == "data" }
89
86
  assert_equal :string, column.type
90
87
  end
91
88
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/topic"
5
+
6
+ class PostgresqlDateTest < ActiveRecord::PostgreSQLTestCase
7
+ def test_load_infinity_and_beyond
8
+ topic = Topic.find_by_sql("SELECT 'infinity'::date AS last_read").first
9
+ assert topic.last_read.infinite?, "timestamp should be infinite"
10
+ assert_operator topic.last_read, :>, 0
11
+
12
+ topic = Topic.find_by_sql("SELECT '-infinity'::date AS last_read").first
13
+ assert topic.last_read.infinite?, "timestamp should be infinite"
14
+ assert_operator topic.last_read, :<, 0
15
+ end
16
+
17
+ def test_save_infinity_and_beyond
18
+ topic = Topic.create!(last_read: 1.0 / 0.0)
19
+ assert_equal(1.0 / 0.0, topic.last_read)
20
+
21
+ topic = Topic.create!(last_read: -1.0 / 0.0)
22
+ assert_equal(-1.0 / 0.0, topic.last_read)
23
+ end
24
+
25
+ def test_bc_date
26
+ date = Date.new(0) - 1.week
27
+ topic = Topic.create!(last_read: date)
28
+ assert_equal date, Topic.find(topic.id).last_read
29
+ end
30
+
31
+ def test_bc_date_leap_year
32
+ date = Time.utc(-4, 2, 29).to_date
33
+ topic = Topic.create!(last_read: date)
34
+ assert_equal date, Topic.find(topic.id).last_read
35
+ end
36
+
37
+ def test_bc_date_year_zero
38
+ date = Time.utc(0, 4, 7).to_date
39
+ topic = Topic.create!(last_read: date)
40
+ assert_equal date, Topic.find(topic.id).last_read
41
+ end
42
+ end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'support/connection_helper'
4
+ require "support/connection_helper"
3
5
 
4
6
  class PostgresqlDomainTest < ActiveRecord::PostgreSQLTestCase
5
7
  include ConnectionHelper
@@ -12,15 +14,15 @@ class PostgresqlDomainTest < ActiveRecord::PostgreSQLTestCase
12
14
  @connection = ActiveRecord::Base.connection
13
15
  @connection.transaction do
14
16
  @connection.execute "CREATE DOMAIN custom_money as numeric(8,2)"
15
- @connection.create_table('postgresql_domains') do |t|
17
+ @connection.create_table("postgresql_domains") do |t|
16
18
  t.column :price, :custom_money
17
19
  end
18
20
  end
19
21
  end
20
22
 
21
23
  teardown do
22
- @connection.drop_table 'postgresql_domains', if_exists: true
23
- @connection.execute 'DROP DOMAIN IF EXISTS custom_money'
24
+ @connection.drop_table "postgresql_domains", if_exists: true
25
+ @connection.execute "DROP DOMAIN IF EXISTS custom_money"
24
26
  reset_connection
25
27
  end
26
28
 
@@ -28,10 +30,10 @@ class PostgresqlDomainTest < ActiveRecord::PostgreSQLTestCase
28
30
  column = PostgresqlDomain.columns_hash["price"]
29
31
  assert_equal :decimal, column.type
30
32
  assert_equal "custom_money", column.sql_type
31
- assert_not column.array?
33
+ assert_not_predicate column, :array?
32
34
 
33
35
  type = PostgresqlDomain.type_for_attribute("price")
34
- assert_not type.binary?
36
+ assert_not_predicate type, :binary?
35
37
  end
36
38
 
37
39
  def test_domain_acts_like_basetype
@@ -42,6 +44,6 @@ class PostgresqlDomainTest < ActiveRecord::PostgreSQLTestCase
42
44
  record.price = "34.15"
43
45
  record.save!
44
46
 
45
- assert_equal BigDecimal.new("34.15"), record.reload.price
47
+ assert_equal BigDecimal("34.15"), record.reload.price
46
48
  end
47
49
  end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'support/connection_helper'
4
+ require "support/connection_helper"
3
5
 
4
6
  class PostgresqlEnumTest < ActiveRecord::PostgreSQLTestCase
5
7
  include ConnectionHelper
@@ -11,18 +13,18 @@ class PostgresqlEnumTest < ActiveRecord::PostgreSQLTestCase
11
13
  def setup
12
14
  @connection = ActiveRecord::Base.connection
13
15
  @connection.transaction do
14
- @connection.execute <<-SQL
16
+ @connection.execute <<~SQL
15
17
  CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
16
18
  SQL
17
- @connection.create_table('postgresql_enums') do |t|
19
+ @connection.create_table("postgresql_enums") do |t|
18
20
  t.column :current_mood, :mood
19
21
  end
20
22
  end
21
23
  end
22
24
 
23
25
  teardown do
24
- @connection.drop_table 'postgresql_enums', if_exists: true
25
- @connection.execute 'DROP TYPE IF EXISTS mood'
26
+ @connection.drop_table "postgresql_enums", if_exists: true
27
+ @connection.execute "DROP TYPE IF EXISTS mood"
26
28
  reset_connection
27
29
  end
28
30
 
@@ -30,17 +32,17 @@ class PostgresqlEnumTest < ActiveRecord::PostgreSQLTestCase
30
32
  column = PostgresqlEnum.columns_hash["current_mood"]
31
33
  assert_equal :enum, column.type
32
34
  assert_equal "mood", column.sql_type
33
- assert_not column.array?
35
+ assert_not_predicate column, :array?
34
36
 
35
37
  type = PostgresqlEnum.type_for_attribute("current_mood")
36
- assert_not type.binary?
38
+ assert_not_predicate type, :binary?
37
39
  end
38
40
 
39
41
  def test_enum_defaults
40
- @connection.add_column 'postgresql_enums', 'good_mood', :mood, default: 'happy'
42
+ @connection.add_column "postgresql_enums", "good_mood", :mood, default: "happy"
41
43
  PostgresqlEnum.reset_column_information
42
44
 
43
- assert_equal "happy", PostgresqlEnum.column_defaults['good_mood']
45
+ assert_equal "happy", PostgresqlEnum.column_defaults["good_mood"]
44
46
  assert_equal "happy", PostgresqlEnum.new.good_mood
45
47
  ensure
46
48
  PostgresqlEnum.reset_column_information
@@ -71,7 +73,7 @@ class PostgresqlEnumTest < ActiveRecord::PostgreSQLTestCase
71
73
  @connection.execute "INSERT INTO postgresql_enums VALUES (1, 'sad');"
72
74
  stderr_output = capture(:stderr) { PostgresqlEnum.first }
73
75
 
74
- assert stderr_output.blank?
76
+ assert_predicate stderr_output, :blank?
75
77
  end
76
78
 
77
79
  def test_enum_type_cast
@@ -1,20 +1,22 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/developer'
3
- require 'models/computer'
4
+ require "models/author"
5
+ require "models/post"
4
6
 
5
7
  class PostgreSQLExplainTest < ActiveRecord::PostgreSQLTestCase
6
- fixtures :developers
8
+ fixtures :authors
7
9
 
8
10
  def test_explain_for_one_query
9
- explain = Developer.where(id: 1).explain
10
- assert_match %r(EXPLAIN for: SELECT "developers".* FROM "developers" WHERE "developers"."id" = (?:\$1 \[\["id", 1\]\]|1)), explain
11
+ explain = Author.where(id: 1).explain
12
+ assert_match %r(EXPLAIN for: SELECT "authors"\.\* FROM "authors" WHERE "authors"\."id" = (?:\$1 \[\["id", 1\]\]|1)), explain
11
13
  assert_match %(QUERY PLAN), explain
12
14
  end
13
15
 
14
16
  def test_explain_with_eager_loading
15
- explain = Developer.where(id: 1).includes(:audit_logs).explain
17
+ explain = Author.where(id: 1).includes(:posts).explain
16
18
  assert_match %(QUERY PLAN), explain
17
- assert_match %r(EXPLAIN for: SELECT "developers".* FROM "developers" WHERE "developers"."id" = (?:\$1 \[\["id", 1\]\]|1)), explain
18
- assert_match %(EXPLAIN for: SELECT "audit_logs".* FROM "audit_logs" WHERE "audit_logs"."developer_id" = 1), explain
19
+ assert_match %r(EXPLAIN for: SELECT "authors"\.\* FROM "authors" WHERE "authors"\."id" = (?:\$1 \[\["id", 1\]\]|1)), explain
20
+ assert_match %r(EXPLAIN for: SELECT "posts"\.\* FROM "posts" WHERE "posts"\."author_id" = (?:\$1 \[\["author_id", 1\]\]|1)), explain
19
21
  end
20
22
  end