ibm_db 5.1.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 (624) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/ext/Makefile +14 -14
  5. data/ext/extconf.rb +4 -4
  6. data/ext/ibm_db.c +62 -57
  7. data/ext/ibm_db.o +0 -0
  8. data/ext/ibm_db.so +0 -0
  9. data/ext/mkmf.log +11 -11
  10. data/ext/ruby_ibm_db_cli.c +1 -0
  11. data/ext/ruby_ibm_db_cli.o +0 -0
  12. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
  13. data/lib/ibm_db.so +1 -0
  14. data/lib/mswin32/ibm_db.rb +7 -3
  15. data/lib/mswin32/rb2x/i386/ruby25/ibm_db.so +0 -0
  16. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  17. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  18. data/test/activejob/destroy_association_async_test.rb +305 -0
  19. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  20. data/test/activejob/helper.rb +15 -0
  21. data/test/assets/schema_dump_5_1.yml +345 -0
  22. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  23. data/test/cases/adapter_test.rb +432 -218
  24. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  25. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  26. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  27. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  28. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  29. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  30. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  31. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  32. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  33. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  34. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  35. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  36. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  37. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  38. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  39. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  40. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  41. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  42. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  43. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  44. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  45. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  46. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  47. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  48. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  49. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  50. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  51. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  52. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  53. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  54. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  55. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  56. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  57. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  58. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  59. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  60. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  61. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  62. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  63. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  64. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  65. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  66. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  67. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  68. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  69. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  70. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  71. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  72. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  73. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  74. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  75. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  76. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  77. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  78. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  79. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  80. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  81. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  82. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  83. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  84. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  85. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  86. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  87. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  88. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  89. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  90. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  91. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  92. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  93. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  94. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  95. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  96. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  97. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  98. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  99. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  100. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  101. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  102. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  103. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  104. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  105. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  106. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  107. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  108. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  109. data/test/cases/aggregations_test.rb +14 -12
  110. data/test/cases/annotate_test.rb +46 -0
  111. data/test/cases/ar_schema_test.rb +153 -86
  112. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  113. data/test/cases/arel/attributes/math_test.rb +83 -0
  114. data/test/cases/arel/attributes_test.rb +27 -0
  115. data/test/cases/arel/collectors/bind_test.rb +40 -0
  116. data/test/cases/arel/collectors/composite_test.rb +47 -0
  117. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  118. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  119. data/test/cases/arel/crud_test.rb +65 -0
  120. data/test/cases/arel/delete_manager_test.rb +53 -0
  121. data/test/cases/arel/factory_methods_test.rb +46 -0
  122. data/test/cases/arel/helper.rb +45 -0
  123. data/test/cases/arel/insert_manager_test.rb +241 -0
  124. data/test/cases/arel/nodes/and_test.rb +30 -0
  125. data/test/cases/arel/nodes/as_test.rb +36 -0
  126. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  127. data/test/cases/arel/nodes/bin_test.rb +35 -0
  128. data/test/cases/arel/nodes/binary_test.rb +29 -0
  129. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  130. data/test/cases/arel/nodes/case_test.rb +96 -0
  131. data/test/cases/arel/nodes/casted_test.rb +18 -0
  132. data/test/cases/arel/nodes/comment_test.rb +22 -0
  133. data/test/cases/arel/nodes/count_test.rb +35 -0
  134. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  135. data/test/cases/arel/nodes/descending_test.rb +46 -0
  136. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  137. data/test/cases/arel/nodes/equality_test.rb +62 -0
  138. data/test/cases/arel/nodes/extract_test.rb +43 -0
  139. data/test/cases/arel/nodes/false_test.rb +21 -0
  140. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  141. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  142. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  143. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  144. data/test/cases/arel/nodes/node_test.rb +22 -0
  145. data/test/cases/arel/nodes/not_test.rb +31 -0
  146. data/test/cases/arel/nodes/or_test.rb +36 -0
  147. data/test/cases/arel/nodes/over_test.rb +69 -0
  148. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  149. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  150. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  151. data/test/cases/arel/nodes/sum_test.rb +35 -0
  152. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  153. data/test/cases/arel/nodes/true_test.rb +21 -0
  154. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  155. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  156. data/test/cases/arel/nodes/window_test.rb +81 -0
  157. data/test/cases/arel/nodes_test.rb +34 -0
  158. data/test/cases/arel/select_manager_test.rb +1238 -0
  159. data/test/cases/arel/support/fake_record.rb +135 -0
  160. data/test/cases/arel/table_test.rb +216 -0
  161. data/test/cases/arel/update_manager_test.rb +126 -0
  162. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  163. data/test/cases/arel/visitors/dot_test.rb +90 -0
  164. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  165. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  166. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  167. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  168. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  169. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  170. data/test/cases/associations/callbacks_test.rb +56 -38
  171. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  172. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  173. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  174. data/test/cases/associations/eager_singularization_test.rb +21 -21
  175. data/test/cases/associations/eager_test.rb +559 -415
  176. data/test/cases/associations/extension_test.rb +18 -12
  177. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  178. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  179. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  180. data/test/cases/associations/has_one_associations_test.rb +294 -129
  181. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  182. data/test/cases/associations/inner_join_association_test.rb +114 -38
  183. data/test/cases/associations/inverse_associations_test.rb +606 -398
  184. data/test/cases/associations/join_model_test.rb +158 -148
  185. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  186. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  187. data/test/cases/associations/required_test.rb +35 -10
  188. data/test/cases/associations_test.rb +241 -110
  189. data/test/cases/attribute_methods/read_test.rb +11 -11
  190. data/test/cases/attribute_methods_test.rb +413 -298
  191. data/test/cases/attributes_test.rb +145 -27
  192. data/test/cases/autosave_association_test.rb +681 -436
  193. data/test/cases/base_prevent_writes_test.rb +229 -0
  194. data/test/cases/base_test.rb +599 -542
  195. data/test/cases/batches_test.rb +288 -82
  196. data/test/cases/binary_test.rb +26 -31
  197. data/test/cases/bind_parameter_test.rb +194 -21
  198. data/test/cases/boolean_test.rb +52 -0
  199. data/test/cases/cache_key_test.rb +110 -5
  200. data/test/cases/calculations_test.rb +740 -177
  201. data/test/cases/callbacks_test.rb +74 -207
  202. data/test/cases/clone_test.rb +15 -10
  203. data/test/cases/coders/json_test.rb +2 -0
  204. data/test/cases/coders/yaml_column_test.rb +16 -13
  205. data/test/cases/collection_cache_key_test.rb +177 -20
  206. data/test/cases/column_alias_test.rb +9 -7
  207. data/test/cases/column_definition_test.rb +10 -68
  208. data/test/cases/comment_test.rb +166 -107
  209. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  210. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  211. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  212. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  213. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  214. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  215. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  216. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  217. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  218. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  219. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  220. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  221. data/test/cases/connection_management_test.rb +13 -11
  222. data/test/cases/connection_pool_test.rb +316 -83
  223. data/test/cases/core_test.rb +82 -58
  224. data/test/cases/counter_cache_test.rb +204 -50
  225. data/test/cases/custom_locking_test.rb +5 -3
  226. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  227. data/test/cases/database_configurations/resolver_test.rb +150 -0
  228. data/test/cases/database_configurations_test.rb +145 -0
  229. data/test/cases/database_selector_test.rb +296 -0
  230. data/test/cases/database_statements_test.rb +18 -16
  231. data/test/cases/date_test.rb +8 -16
  232. data/test/cases/date_time_precision_test.rb +100 -78
  233. data/test/cases/date_time_test.rb +23 -8
  234. data/test/cases/defaults_test.rb +106 -71
  235. data/test/cases/delegated_type_test.rb +57 -0
  236. data/test/cases/dirty_test.rb +419 -223
  237. data/test/cases/disconnected_test.rb +6 -6
  238. data/test/cases/dup_test.rb +54 -27
  239. data/test/cases/enum_test.rb +461 -82
  240. data/test/cases/errors_test.rb +7 -7
  241. data/test/cases/explain_subscriber_test.rb +17 -15
  242. data/test/cases/explain_test.rb +11 -19
  243. data/test/cases/filter_attributes_test.rb +153 -0
  244. data/test/cases/finder_respond_to_test.rb +14 -14
  245. data/test/cases/finder_test.rb +669 -287
  246. data/test/cases/fixture_set/file_test.rb +34 -38
  247. data/test/cases/fixtures_test.rb +833 -176
  248. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  249. data/test/cases/habtm_destroy_order_test.rb +25 -25
  250. data/test/cases/helper.rb +78 -49
  251. data/test/cases/hot_compatibility_test.rb +33 -32
  252. data/test/cases/i18n_test.rb +18 -17
  253. data/test/cases/inheritance_test.rb +180 -115
  254. data/test/cases/insert_all_test.rb +489 -0
  255. data/test/cases/instrumentation_test.rb +101 -0
  256. data/test/cases/integration_test.rb +119 -31
  257. data/test/cases/invalid_connection_test.rb +18 -16
  258. data/test/cases/invertible_migration_test.rb +183 -43
  259. data/test/cases/json_attribute_test.rb +35 -0
  260. data/test/cases/json_serialization_test.rb +57 -58
  261. data/test/cases/json_shared_test_cases.rb +290 -0
  262. data/test/cases/locking_test.rb +413 -119
  263. data/test/cases/log_subscriber_test.rb +68 -26
  264. data/test/cases/marshal_serialization_test.rb +39 -0
  265. data/test/cases/migration/change_schema_test.rb +118 -72
  266. data/test/cases/migration/change_table_test.rb +138 -30
  267. data/test/cases/migration/check_constraint_test.rb +162 -0
  268. data/test/cases/migration/column_attributes_test.rb +45 -35
  269. data/test/cases/migration/column_positioning_test.rb +18 -6
  270. data/test/cases/migration/columns_test.rb +93 -77
  271. data/test/cases/migration/command_recorder_test.rb +121 -34
  272. data/test/cases/migration/compatibility_test.rb +578 -23
  273. data/test/cases/migration/create_join_table_test.rb +35 -25
  274. data/test/cases/migration/foreign_key_test.rb +503 -284
  275. data/test/cases/migration/helper.rb +4 -3
  276. data/test/cases/migration/index_test.rb +119 -70
  277. data/test/cases/migration/logger_test.rb +9 -6
  278. data/test/cases/migration/pending_migrations_test.rb +88 -34
  279. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  280. data/test/cases/migration/references_index_test.rb +38 -19
  281. data/test/cases/migration/references_statements_test.rb +15 -14
  282. data/test/cases/migration/rename_table_test.rb +53 -30
  283. data/test/cases/migration_test.rb +637 -269
  284. data/test/cases/migrator_test.rb +191 -135
  285. data/test/cases/mixin_test.rb +7 -11
  286. data/test/cases/modules_test.rb +36 -34
  287. data/test/cases/multi_db_migrator_test.rb +223 -0
  288. data/test/cases/multiparameter_attributes_test.rb +60 -33
  289. data/test/cases/multiple_db_test.rb +16 -22
  290. data/test/cases/nested_attributes_test.rb +341 -320
  291. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  292. data/test/cases/null_relation_test.rb +84 -0
  293. data/test/cases/numeric_data_test.rb +93 -0
  294. data/test/cases/persistence_test.rb +361 -269
  295. data/test/cases/pooled_connections_test.rb +18 -26
  296. data/test/cases/prepared_statement_status_test.rb +48 -0
  297. data/test/cases/primary_keys_test.rb +210 -104
  298. data/test/cases/query_cache_test.rb +610 -141
  299. data/test/cases/quoting_test.rb +132 -31
  300. data/test/cases/readonly_test.rb +49 -48
  301. data/test/cases/reaper_test.rb +146 -32
  302. data/test/cases/reflection_test.rb +167 -156
  303. data/test/cases/relation/delegation_test.rb +49 -36
  304. data/test/cases/relation/delete_all_test.rb +117 -0
  305. data/test/cases/relation/merging_test.rb +319 -42
  306. data/test/cases/relation/mutation_test.rb +55 -93
  307. data/test/cases/relation/or_test.rb +129 -29
  308. data/test/cases/relation/predicate_builder_test.rb +21 -6
  309. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  310. data/test/cases/relation/select_test.rb +67 -0
  311. data/test/cases/relation/update_all_test.rb +317 -0
  312. data/test/cases/relation/where_chain_test.rb +68 -32
  313. data/test/cases/relation/where_clause_test.rb +136 -61
  314. data/test/cases/relation/where_test.rb +155 -48
  315. data/test/cases/relation_test.rb +266 -112
  316. data/test/cases/relations_test.rb +969 -744
  317. data/test/cases/reload_models_test.rb +13 -9
  318. data/test/cases/reserved_word_test.rb +141 -0
  319. data/test/cases/result_test.rb +68 -17
  320. data/test/cases/sanitize_test.rb +87 -71
  321. data/test/cases/schema_dumper_test.rb +221 -128
  322. data/test/cases/schema_loading_test.rb +3 -2
  323. data/test/cases/scoping/default_scoping_test.rb +185 -144
  324. data/test/cases/scoping/named_scoping_test.rb +177 -89
  325. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  326. data/test/cases/secure_token_test.rb +18 -3
  327. data/test/cases/serialization_test.rb +30 -28
  328. data/test/cases/serialized_attribute_test.rb +133 -42
  329. data/test/cases/signed_id_test.rb +168 -0
  330. data/test/cases/statement_cache_test.rb +41 -24
  331. data/test/cases/statement_invalid_test.rb +42 -0
  332. data/test/cases/store_test.rb +180 -55
  333. data/test/cases/strict_loading_test.rb +473 -0
  334. data/test/cases/suppressor_test.rb +26 -12
  335. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  336. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  337. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  338. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  339. data/test/cases/test_case.rb +51 -40
  340. data/test/cases/test_databases_test.rb +79 -0
  341. data/test/cases/test_fixtures_test.rb +79 -19
  342. data/test/cases/time_precision_test.rb +98 -76
  343. data/test/cases/timestamp_test.rb +102 -99
  344. data/test/cases/touch_later_test.rb +12 -10
  345. data/test/cases/transaction_callbacks_test.rb +344 -90
  346. data/test/cases/transaction_isolation_test.rb +12 -12
  347. data/test/cases/transactions_test.rb +612 -162
  348. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  349. data/test/cases/type/date_time_test.rb +4 -2
  350. data/test/cases/type/integer_test.rb +4 -2
  351. data/test/cases/type/string_test.rb +10 -8
  352. data/test/cases/type/time_test.rb +28 -0
  353. data/test/cases/type/type_map_test.rb +29 -28
  354. data/test/cases/type/unsigned_integer_test.rb +19 -0
  355. data/test/cases/type_test.rb +2 -0
  356. data/test/cases/types_test.rb +3 -1
  357. data/test/cases/unconnected_test.rb +14 -1
  358. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  359. data/test/cases/validations/absence_validation_test.rb +19 -17
  360. data/test/cases/validations/association_validation_test.rb +30 -28
  361. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  362. data/test/cases/validations/i18n_validation_test.rb +22 -21
  363. data/test/cases/validations/length_validation_test.rb +34 -33
  364. data/test/cases/validations/numericality_validation_test.rb +181 -0
  365. data/test/cases/validations/presence_validation_test.rb +21 -19
  366. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  367. data/test/cases/validations_repair_helper.rb +2 -0
  368. data/test/cases/validations_test.rb +61 -26
  369. data/test/cases/view_test.rb +122 -116
  370. data/test/cases/yaml_serialization_test.rb +79 -34
  371. data/test/config.example.yml +19 -19
  372. data/test/config.rb +3 -1
  373. data/test/config.yml +16 -6
  374. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  375. data/test/fixtures/author_addresses.yml +1 -8
  376. data/test/fixtures/authors.yml +1 -7
  377. data/test/fixtures/binaries.yml +4 -0
  378. data/test/fixtures/books.yml +9 -2
  379. data/test/fixtures/categories_posts.yml +3 -0
  380. data/test/fixtures/citations.yml +5 -0
  381. data/test/fixtures/comments.yml +7 -0
  382. data/test/fixtures/companies.yml +5 -0
  383. data/test/fixtures/computers.yml +2 -0
  384. data/test/fixtures/customers.yml +10 -1
  385. data/test/fixtures/developers.yml +1 -1
  386. data/test/fixtures/essays.yml +10 -0
  387. data/test/fixtures/faces.yml +3 -3
  388. data/test/fixtures/humans.yml +5 -0
  389. data/test/fixtures/interests.yml +7 -7
  390. data/test/fixtures/memberships.yml +7 -0
  391. data/test/fixtures/minimalistics.yml +3 -0
  392. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  393. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  394. data/test/fixtures/naked/yml/parrots.yml +1 -0
  395. data/test/fixtures/other_books.yml +26 -0
  396. data/test/fixtures/other_posts.yml +1 -0
  397. data/test/fixtures/parrots.yml +7 -1
  398. data/test/fixtures/pirates.yml +3 -0
  399. data/test/fixtures/posts.yml +11 -3
  400. data/test/fixtures/readers.yml +6 -0
  401. data/test/fixtures/reserved_words/values.yml +2 -2
  402. data/test/fixtures/sponsors.yml +3 -0
  403. data/test/fixtures/strict_zines.yml +2 -0
  404. data/test/fixtures/subscribers.yml +1 -1
  405. data/test/fixtures/tasks.yml +1 -1
  406. data/test/fixtures/warehouse-things.yml +3 -0
  407. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  408. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  409. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  410. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  411. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  412. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  413. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  414. data/test/migrations/rename/1_we_need_things.rb +2 -0
  415. data/test/migrations/rename/2_rename_things.rb +2 -0
  416. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  417. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  418. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  419. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  420. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  421. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  422. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  423. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  424. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  425. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  426. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  427. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  428. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  429. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  430. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  431. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  432. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  433. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  434. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  435. data/test/models/account.rb +46 -0
  436. data/test/models/admin/account.rb +3 -1
  437. data/test/models/admin/randomly_named_c1.rb +2 -0
  438. data/test/models/admin/user.rb +16 -8
  439. data/test/models/admin.rb +4 -2
  440. data/test/models/aircraft.rb +3 -1
  441. data/test/models/arunit2_model.rb +2 -0
  442. data/test/models/author.rb +153 -102
  443. data/test/models/auto_id.rb +2 -0
  444. data/test/models/autoloadable/extra_firm.rb +2 -0
  445. data/test/models/binary.rb +3 -1
  446. data/test/models/binary_field.rb +6 -0
  447. data/test/models/bird.rb +13 -1
  448. data/test/models/book.rb +14 -4
  449. data/test/models/book_destroy_async.rb +24 -0
  450. data/test/models/boolean.rb +5 -0
  451. data/test/models/bulb.rb +13 -4
  452. data/test/models/cake_designer.rb +2 -0
  453. data/test/models/car.rb +17 -10
  454. data/test/models/carrier.rb +2 -0
  455. data/test/models/cart.rb +5 -0
  456. data/test/models/cat.rb +2 -0
  457. data/test/models/categorization.rb +8 -6
  458. data/test/models/category.rb +28 -16
  459. data/test/models/chef.rb +2 -0
  460. data/test/models/citation.rb +5 -1
  461. data/test/models/club.rb +13 -10
  462. data/test/models/college.rb +4 -2
  463. data/test/models/column.rb +2 -0
  464. data/test/models/column_name.rb +2 -0
  465. data/test/models/comment.rb +32 -10
  466. data/test/models/company.rb +102 -106
  467. data/test/models/company_in_module.rb +27 -26
  468. data/test/models/computer.rb +3 -1
  469. data/test/models/contact.rb +15 -13
  470. data/test/models/content.rb +5 -3
  471. data/test/models/contract.rb +21 -3
  472. data/test/models/country.rb +2 -4
  473. data/test/models/course.rb +3 -1
  474. data/test/models/customer.rb +10 -8
  475. data/test/models/customer_carrier.rb +2 -0
  476. data/test/models/dashboard.rb +2 -0
  477. data/test/models/default.rb +2 -0
  478. data/test/models/department.rb +2 -0
  479. data/test/models/destroy_async_parent.rb +15 -0
  480. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  481. data/test/models/developer.rb +152 -85
  482. data/test/models/dl_keyed_belongs_to.rb +13 -0
  483. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  484. data/test/models/dl_keyed_has_many.rb +5 -0
  485. data/test/models/dl_keyed_has_many_through.rb +5 -0
  486. data/test/models/dl_keyed_has_one.rb +5 -0
  487. data/test/models/dl_keyed_join.rb +10 -0
  488. data/test/models/dog.rb +2 -0
  489. data/test/models/dog_lover.rb +2 -0
  490. data/test/models/doubloon.rb +3 -1
  491. data/test/models/drink_designer.rb +17 -0
  492. data/test/models/edge.rb +4 -2
  493. data/test/models/electron.rb +2 -0
  494. data/test/models/engine.rb +3 -2
  495. data/test/models/entrant.rb +2 -0
  496. data/test/models/entry.rb +5 -0
  497. data/test/models/essay.rb +6 -3
  498. data/test/models/essay_destroy_async.rb +12 -0
  499. data/test/models/event.rb +3 -1
  500. data/test/models/eye.rb +5 -3
  501. data/test/models/face.rb +14 -6
  502. data/test/models/family.rb +6 -0
  503. data/test/models/family_tree.rb +6 -0
  504. data/test/models/friendship.rb +5 -3
  505. data/test/models/frog.rb +8 -0
  506. data/test/models/guid.rb +3 -1
  507. data/test/models/guitar.rb +2 -0
  508. data/test/models/hotel.rb +5 -3
  509. data/test/models/human.rb +39 -0
  510. data/test/models/image.rb +3 -1
  511. data/test/models/interest.rb +14 -3
  512. data/test/models/invoice.rb +4 -2
  513. data/test/models/item.rb +3 -1
  514. data/test/models/job.rb +5 -3
  515. data/test/models/joke.rb +4 -2
  516. data/test/models/keyboard.rb +3 -1
  517. data/test/models/legacy_thing.rb +2 -0
  518. data/test/models/lesson.rb +2 -0
  519. data/test/models/line_item.rb +3 -1
  520. data/test/models/liquid.rb +2 -0
  521. data/test/models/matey.rb +3 -1
  522. data/test/models/measurement.rb +4 -0
  523. data/test/models/member.rb +23 -20
  524. data/test/models/member_detail.rb +3 -0
  525. data/test/models/member_type.rb +2 -0
  526. data/test/models/membership.rb +4 -1
  527. data/test/models/mentor.rb +3 -1
  528. data/test/models/message.rb +5 -0
  529. data/test/models/minimalistic.rb +2 -0
  530. data/test/models/minivan.rb +3 -2
  531. data/test/models/mixed_case_monkey.rb +3 -1
  532. data/test/models/molecule.rb +2 -0
  533. data/test/models/mouse.rb +6 -0
  534. data/test/models/movie.rb +2 -0
  535. data/test/models/node.rb +4 -2
  536. data/test/models/non_primary_key.rb +2 -0
  537. data/test/models/notification.rb +2 -0
  538. data/test/models/numeric_data.rb +12 -0
  539. data/test/models/order.rb +4 -2
  540. data/test/models/organization.rb +9 -7
  541. data/test/models/other_dog.rb +3 -1
  542. data/test/models/owner.rb +6 -4
  543. data/test/models/parrot.rb +12 -4
  544. data/test/models/person.rb +59 -54
  545. data/test/models/personal_legacy_thing.rb +3 -1
  546. data/test/models/pet.rb +4 -2
  547. data/test/models/pet_treasure.rb +2 -0
  548. data/test/models/pirate.rb +67 -43
  549. data/test/models/possession.rb +3 -1
  550. data/test/models/post.rb +184 -86
  551. data/test/models/price_estimate.rb +11 -1
  552. data/test/models/professor.rb +3 -1
  553. data/test/models/project.rb +14 -12
  554. data/test/models/publisher/article.rb +2 -0
  555. data/test/models/publisher/magazine.rb +2 -0
  556. data/test/models/publisher.rb +2 -0
  557. data/test/models/randomly_named_c1.rb +2 -0
  558. data/test/models/rating.rb +5 -1
  559. data/test/models/reader.rb +7 -5
  560. data/test/models/recipe.rb +2 -0
  561. data/test/models/record.rb +2 -0
  562. data/test/models/reference.rb +6 -3
  563. data/test/models/reply.rb +39 -21
  564. data/test/models/room.rb +6 -0
  565. data/test/models/section.rb +6 -0
  566. data/test/models/seminar.rb +6 -0
  567. data/test/models/session.rb +6 -0
  568. data/test/models/ship.rb +12 -9
  569. data/test/models/ship_part.rb +5 -3
  570. data/test/models/shop.rb +4 -2
  571. data/test/models/shop_account.rb +2 -0
  572. data/test/models/speedometer.rb +2 -0
  573. data/test/models/sponsor.rb +8 -5
  574. data/test/models/squeak.rb +6 -0
  575. data/test/models/strict_zine.rb +7 -0
  576. data/test/models/string_key_object.rb +2 -0
  577. data/test/models/student.rb +2 -0
  578. data/test/models/subscriber.rb +4 -2
  579. data/test/models/subscription.rb +5 -1
  580. data/test/models/tag.rb +6 -3
  581. data/test/models/tagging.rb +13 -6
  582. data/test/models/task.rb +2 -0
  583. data/test/models/topic.rb +54 -19
  584. data/test/models/toy.rb +4 -0
  585. data/test/models/traffic_light.rb +2 -0
  586. data/test/models/treasure.rb +5 -3
  587. data/test/models/treaty.rb +2 -4
  588. data/test/models/tree.rb +2 -0
  589. data/test/models/tuning_peg.rb +2 -0
  590. data/test/models/tyre.rb +2 -0
  591. data/test/models/user.rb +12 -4
  592. data/test/models/uuid_child.rb +2 -0
  593. data/test/models/uuid_item.rb +2 -0
  594. data/test/models/uuid_parent.rb +2 -0
  595. data/test/models/vegetables.rb +12 -3
  596. data/test/models/vertex.rb +6 -4
  597. data/test/models/warehouse_thing.rb +2 -0
  598. data/test/models/wheel.rb +3 -1
  599. data/test/models/without_table.rb +3 -1
  600. data/test/models/zine.rb +3 -1
  601. data/test/schema/mysql2_specific_schema.rb +49 -35
  602. data/test/schema/oracle_specific_schema.rb +13 -15
  603. data/test/schema/postgresql_specific_schema.rb +51 -40
  604. data/test/schema/schema.rb +334 -154
  605. data/test/schema/sqlite_specific_schema.rb +9 -16
  606. data/test/support/config.rb +26 -26
  607. data/test/support/connection.rb +14 -8
  608. data/test/support/connection_helper.rb +3 -1
  609. data/test/support/ddl_helper.rb +2 -0
  610. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  611. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  618. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  619. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  620. data/test/support/schema_dumping_helper.rb +2 -0
  621. data/test/support/stubs/strong_parameters.rb +40 -0
  622. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  623. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  624. metadata +196 -11
@@ -1,69 +1,81 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
4
+ require "support/connection_helper"
2
5
 
3
6
  if current_adapter?(:Mysql2Adapter)
4
- module ActiveRecord
5
- module ConnectionAdapters
6
- class MysqlTypeLookupTest < ActiveRecord::TestCase
7
- setup do
8
- @connection = ActiveRecord::Base.connection
9
- end
7
+ module ActiveRecord
8
+ module ConnectionAdapters
9
+ class MysqlTypeLookupTest < ActiveRecord::TestCase
10
+ include ConnectionHelper
10
11
 
11
- def test_boolean_types
12
- emulate_booleans(true) do
13
- assert_lookup_type :boolean, 'tinyint(1)'
14
- assert_lookup_type :boolean, 'TINYINT(1)'
12
+ setup do
13
+ @connection = ActiveRecord::Base.connection
15
14
  end
16
- end
17
15
 
18
- def test_string_types
19
- assert_lookup_type :string, "enum('one', 'two', 'three')"
20
- assert_lookup_type :string, "ENUM('one', 'two', 'three')"
21
- assert_lookup_type :string, "set('one', 'two', 'three')"
22
- assert_lookup_type :string, "SET('one', 'two', 'three')"
23
- end
16
+ def teardown
17
+ reset_connection
18
+ end
24
19
 
25
- def test_set_type_with_value_matching_other_type
26
- assert_lookup_type :string, "SET('unicode', '8bit', 'none', 'time')"
27
- end
20
+ def test_boolean_types
21
+ emulate_booleans(true) do
22
+ assert_lookup_type :boolean, "tinyint(1)"
23
+ assert_lookup_type :boolean, "TINYINT(1)"
24
+ end
25
+ end
28
26
 
29
- def test_enum_type_with_value_matching_other_type
30
- assert_lookup_type :string, "ENUM('unicode', '8bit', 'none')"
31
- end
27
+ def test_string_types
28
+ assert_lookup_type :string, "enum('one', 'two', 'three')"
29
+ assert_lookup_type :string, "ENUM('one', 'two', 'three')"
30
+ assert_lookup_type :string, "enum ('one', 'two', 'three')"
31
+ assert_lookup_type :string, "ENUM ('one', 'two', 'three')"
32
+ assert_lookup_type :string, "set('one', 'two', 'three')"
33
+ assert_lookup_type :string, "SET('one', 'two', 'three')"
34
+ assert_lookup_type :string, "set ('one', 'two', 'three')"
35
+ assert_lookup_type :string, "SET ('one', 'two', 'three')"
36
+ end
32
37
 
33
- def test_binary_types
34
- assert_lookup_type :binary, 'bit'
35
- assert_lookup_type :binary, 'BIT'
36
- end
38
+ def test_set_type_with_value_matching_other_type
39
+ assert_lookup_type :string, "SET('unicode', '8bit', 'none', 'time')"
40
+ end
37
41
 
38
- def test_integer_types
39
- emulate_booleans(false) do
40
- assert_lookup_type :integer, 'tinyint(1)'
41
- assert_lookup_type :integer, 'TINYINT(1)'
42
- assert_lookup_type :integer, 'year'
43
- assert_lookup_type :integer, 'YEAR'
42
+ def test_enum_type_with_value_matching_other_type
43
+ assert_lookup_type :string, "ENUM('unicode', '8bit', 'none', 'time')"
44
44
  end
45
- end
46
45
 
47
- private
46
+ def test_binary_types
47
+ assert_lookup_type :binary, "bit"
48
+ assert_lookup_type :binary, "BIT"
49
+ end
48
50
 
49
- def assert_lookup_type(type, lookup)
50
- cast_type = @connection.type_map.lookup(lookup)
51
- assert_equal type, cast_type.type
52
- end
51
+ def test_integer_types
52
+ emulate_booleans(false) do
53
+ assert_lookup_type :integer, "tinyint(1)"
54
+ assert_lookup_type :integer, "TINYINT(1)"
55
+ assert_lookup_type :integer, "year"
56
+ assert_lookup_type :integer, "YEAR"
57
+ end
58
+ end
53
59
 
54
- def emulate_booleans(value)
55
- old_emulate_booleans = @connection.emulate_booleans
56
- change_emulate_booleans(value)
57
- yield
58
- ensure
59
- change_emulate_booleans(old_emulate_booleans)
60
- end
60
+ private
61
+ def assert_lookup_type(type, lookup)
62
+ cast_type = @connection.send(:type_map).lookup(lookup)
63
+ assert_equal type, cast_type.type
64
+ end
61
65
 
62
- def change_emulate_booleans(value)
63
- @connection.emulate_booleans = value
64
- @connection.clear_cache!
66
+ def emulate_booleans(value)
67
+ old_emulate_booleans = @connection.emulate_booleans
68
+ change_emulate_booleans(value)
69
+ yield
70
+ ensure
71
+ change_emulate_booleans(old_emulate_booleans)
72
+ end
73
+
74
+ def change_emulate_booleans(value)
75
+ @connection.emulate_booleans = value
76
+ @connection.clear_cache!
77
+ end
65
78
  end
66
79
  end
67
80
  end
68
81
  end
69
- end
@@ -1,61 +1,294 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
4
 
3
5
  module ActiveRecord
4
6
  module ConnectionAdapters
5
7
  class SchemaCacheTest < ActiveRecord::TestCase
6
8
  def setup
7
- connection = ActiveRecord::Base.connection
8
- @cache = SchemaCache.new connection
9
+ @connection = ActiveRecord::Base.connection
10
+ @cache = SchemaCache.new @connection
11
+ @database_version = @connection.get_database_version
9
12
  end
10
13
 
11
14
  def test_primary_key
12
- assert_equal 'id', @cache.primary_keys('posts')
15
+ assert_equal "id", @cache.primary_keys("posts")
16
+ end
17
+
18
+ def test_yaml_dump_and_load
19
+ # Create an empty cache.
20
+ cache = SchemaCache.new @connection
21
+
22
+ tempfile = Tempfile.new(["schema_cache-", ".yml"])
23
+ # Dump it. It should get populated before dumping.
24
+ cache.dump_to(tempfile.path)
25
+
26
+ # Load the cache.
27
+ cache = SchemaCache.load_from(tempfile.path)
28
+
29
+ # Give it a connection. Usually the connection
30
+ # would get set on the cache when it's retrieved
31
+ # from the pool.
32
+ cache.connection = @connection
33
+
34
+ assert_no_queries do
35
+ assert_equal 12, cache.columns("posts").size
36
+ assert_equal 12, cache.columns_hash("posts").size
37
+ assert cache.data_sources("posts")
38
+ assert_equal "id", cache.primary_keys("posts")
39
+ assert_equal 1, cache.indexes("posts").size
40
+ assert_equal @database_version.to_s, cache.database_version.to_s
41
+ end
42
+ ensure
43
+ tempfile.unlink
44
+ end
45
+
46
+ def test_yaml_dump_and_load_with_gzip
47
+ # Create an empty cache.
48
+ cache = SchemaCache.new @connection
49
+
50
+ tempfile = Tempfile.new(["schema_cache-", ".yml.gz"])
51
+ # Dump it. It should get populated before dumping.
52
+ cache.dump_to(tempfile.path)
53
+
54
+ # Unzip and load manually.
55
+ cache = Zlib::GzipReader.open(tempfile.path) do |gz|
56
+ YAML.respond_to?(:unsafe_load) ? YAML.unsafe_load(gz.read) : YAML.load(gz.read)
57
+ end
58
+
59
+ # Give it a connection. Usually the connection
60
+ # would get set on the cache when it's retrieved
61
+ # from the pool.
62
+ cache.connection = @connection
63
+
64
+ assert_no_queries do
65
+ assert_equal 12, cache.columns("posts").size
66
+ assert_equal 12, cache.columns_hash("posts").size
67
+ assert cache.data_sources("posts")
68
+ assert_equal "id", cache.primary_keys("posts")
69
+ assert_equal 1, cache.indexes("posts").size
70
+ assert_equal @database_version.to_s, cache.database_version.to_s
71
+ end
72
+
73
+ # Load the cache the usual way.
74
+ cache = SchemaCache.load_from(tempfile.path)
75
+
76
+ # Give it a connection.
77
+ cache.connection = @connection
78
+
79
+ assert_no_queries do
80
+ assert_equal 12, cache.columns("posts").size
81
+ assert_equal 12, cache.columns_hash("posts").size
82
+ assert cache.data_sources("posts")
83
+ assert_equal "id", cache.primary_keys("posts")
84
+ assert_equal 1, cache.indexes("posts").size
85
+ assert_equal @database_version.to_s, cache.database_version.to_s
86
+ end
87
+ ensure
88
+ tempfile.unlink
89
+ end
90
+
91
+ def test_yaml_loads_5_1_dump
92
+ cache = SchemaCache.load_from(schema_dump_path)
93
+ cache.connection = @connection
94
+
95
+ assert_no_queries do
96
+ assert_equal 11, cache.columns("posts").size
97
+ assert_equal 11, cache.columns_hash("posts").size
98
+ assert cache.data_sources("posts")
99
+ assert_equal "id", cache.primary_keys("posts")
100
+ end
101
+ end
102
+
103
+ def test_yaml_loads_5_1_dump_without_indexes_still_queries_for_indexes
104
+ cache = SchemaCache.load_from(schema_dump_path)
105
+ cache.connection = @connection
106
+
107
+ assert_queries :any, ignore_none: true do
108
+ assert_equal 1, cache.indexes("posts").size
109
+ end
110
+ end
111
+
112
+ def test_yaml_loads_5_1_dump_without_database_version_still_queries_for_database_version
113
+ cache = SchemaCache.load_from(schema_dump_path)
114
+ cache.connection = @connection
115
+
116
+ # We can't verify queries get executed because the database version gets
117
+ # cached in both MySQL and PostgreSQL outside of the schema cache.
118
+ assert_nil cache.instance_variable_get(:@database_version)
119
+ assert_equal @database_version.to_s, cache.database_version.to_s
13
120
  end
14
121
 
15
122
  def test_primary_key_for_non_existent_table
16
- assert_nil @cache.primary_keys('omgponies')
123
+ assert_nil @cache.primary_keys("omgponies")
17
124
  end
18
125
 
19
126
  def test_caches_columns
20
- columns = @cache.columns('posts')
21
- assert_equal columns, @cache.columns('posts')
127
+ columns = @cache.columns("posts")
128
+ assert_equal columns, @cache.columns("posts")
22
129
  end
23
130
 
24
131
  def test_caches_columns_hash
25
- columns_hash = @cache.columns_hash('posts')
26
- assert_equal columns_hash, @cache.columns_hash('posts')
132
+ columns_hash = @cache.columns_hash("posts")
133
+ assert_equal columns_hash, @cache.columns_hash("posts")
134
+ end
135
+
136
+ def test_caches_indexes
137
+ indexes = @cache.indexes("posts")
138
+ assert_equal indexes, @cache.indexes("posts")
139
+ end
140
+
141
+ def test_caches_database_version
142
+ @cache.database_version # cache database_version
143
+
144
+ assert_no_queries do
145
+ assert_equal @database_version.to_s, @cache.database_version.to_s
146
+
147
+ if current_adapter?(:Mysql2Adapter)
148
+ assert_not_nil @cache.database_version.full_version_string
149
+ end
150
+ end
27
151
  end
28
152
 
29
153
  def test_clearing
30
- @cache.columns('posts')
31
- @cache.columns_hash('posts')
32
- @cache.data_sources('posts')
33
- @cache.primary_keys('posts')
154
+ @cache.columns("posts")
155
+ @cache.columns_hash("posts")
156
+ @cache.data_sources("posts")
157
+ @cache.primary_keys("posts")
158
+ @cache.indexes("posts")
34
159
 
35
160
  @cache.clear!
36
161
 
37
162
  assert_equal 0, @cache.size
163
+ assert_nil @cache.instance_variable_get(:@database_version)
164
+ end
165
+
166
+ def test_marshal_dump_and_load
167
+ # Create an empty cache.
168
+ cache = SchemaCache.new @connection
169
+
170
+ # Populate it.
171
+ cache.add("posts")
172
+
173
+ # Create a new cache by marchal dumping / loading.
174
+ cache = Marshal.load(Marshal.dump(cache))
175
+
176
+ assert_no_queries do
177
+ assert_equal 12, cache.columns("posts").size
178
+ assert_equal 12, cache.columns_hash("posts").size
179
+ assert cache.data_sources("posts")
180
+ assert_equal "id", cache.primary_keys("posts")
181
+ assert_equal 1, cache.indexes("posts").size
182
+ assert_equal @database_version.to_s, cache.database_version.to_s
183
+ end
184
+ end
185
+
186
+ def test_marshal_dump_and_load_via_disk
187
+ # Create an empty cache.
188
+ cache = SchemaCache.new @connection
189
+
190
+ tempfile = Tempfile.new(["schema_cache-", ".dump"])
191
+ # Dump it. It should get populated before dumping.
192
+ cache.dump_to(tempfile.path)
193
+
194
+ # Load a new cache.
195
+ cache = SchemaCache.load_from(tempfile.path)
196
+ cache.connection = @connection
197
+
198
+ assert_no_queries do
199
+ assert_equal 12, cache.columns("posts").size
200
+ assert_equal 12, cache.columns_hash("posts").size
201
+ assert cache.data_sources("posts")
202
+ assert_equal "id", cache.primary_keys("posts")
203
+ assert_equal 1, cache.indexes("posts").size
204
+ assert_equal @database_version.to_s, cache.database_version.to_s
205
+ end
206
+ ensure
207
+ tempfile.unlink
208
+ end
209
+
210
+ def test_marshal_dump_and_load_with_gzip
211
+ # Create an empty cache.
212
+ cache = SchemaCache.new @connection
213
+
214
+ tempfile = Tempfile.new(["schema_cache-", ".dump.gz"])
215
+ # Dump it. It should get populated before dumping.
216
+ cache.dump_to(tempfile.path)
217
+
218
+ # Load a new cache manually.
219
+ cache = Zlib::GzipReader.open(tempfile.path) { |gz| Marshal.load(gz.read) }
220
+ cache.connection = @connection
221
+
222
+ assert_no_queries do
223
+ assert_equal 12, cache.columns("posts").size
224
+ assert_equal 12, cache.columns_hash("posts").size
225
+ assert cache.data_sources("posts")
226
+ assert_equal "id", cache.primary_keys("posts")
227
+ assert_equal 1, cache.indexes("posts").size
228
+ assert_equal @database_version.to_s, cache.database_version.to_s
229
+ end
230
+
231
+ # Load a new cache.
232
+ cache = SchemaCache.load_from(tempfile.path)
233
+ cache.connection = @connection
234
+
235
+ assert_no_queries do
236
+ assert_equal 12, cache.columns("posts").size
237
+ assert_equal 12, cache.columns_hash("posts").size
238
+ assert cache.data_sources("posts")
239
+ assert_equal "id", cache.primary_keys("posts")
240
+ assert_equal 1, cache.indexes("posts").size
241
+ assert_equal @database_version.to_s, cache.database_version.to_s
242
+ end
243
+ ensure
244
+ tempfile.unlink
245
+ end
246
+
247
+ def test_data_source_exist
248
+ assert @cache.data_source_exists?("posts")
249
+ assert_not @cache.data_source_exists?("foo")
38
250
  end
39
251
 
40
- def test_dump_and_load
41
- @cache.columns('posts')
42
- @cache.columns_hash('posts')
43
- @cache.data_sources('posts')
44
- @cache.primary_keys('posts')
252
+ def test_clear_data_source_cache
253
+ @cache.clear_data_source_cache!("posts")
254
+ end
255
+
256
+ test "#columns_hash? is populated by #columns_hash" do
257
+ assert_not @cache.columns_hash?("posts")
45
258
 
46
- @cache = Marshal.load(Marshal.dump(@cache))
259
+ @cache.columns_hash("posts")
47
260
 
48
- assert_equal 11, @cache.columns('posts').size
49
- assert_equal 11, @cache.columns_hash('posts').size
50
- assert @cache.data_sources('posts')
51
- assert_equal 'id', @cache.primary_keys('posts')
261
+ assert @cache.columns_hash?("posts")
52
262
  end
53
263
 
54
- def test_table_methods_deprecation
55
- assert_deprecated { assert @cache.table_exists?('posts') }
56
- assert_deprecated { assert @cache.tables('posts') }
57
- assert_deprecated { @cache.clear_table_cache!('posts') }
264
+ test "#columns_hash? is not populated by #data_source_exists?" do
265
+ assert_not @cache.columns_hash?("posts")
266
+
267
+ @cache.data_source_exists?("posts")
268
+
269
+ assert_not @cache.columns_hash?("posts")
58
270
  end
271
+
272
+ # This test covers a patch for a Ruby 2.6 bug that was only fixed in Ruby 2.7.
273
+ # See: https://bugs.ruby-lang.org/issues/15926
274
+ test "#deep_duplicate does not modify the frozen/ufrozen state of untainted or tainted string arguments" do
275
+ test_string = "banana"
276
+ [
277
+ test_string.dup,
278
+ test_string.dup.taint,
279
+ test_string.dup.freeze,
280
+ test_string.dup.taint.freeze
281
+ ].each do |str|
282
+ starting_frozen_state = str.frozen?
283
+ @cache.send(:deep_deduplicate, str)
284
+ assert_equal(starting_frozen_state, str.frozen?)
285
+ end
286
+ end
287
+
288
+ private
289
+ def schema_dump_path
290
+ "#{ASSETS_ROOT}/schema_dump_5_1.yml"
291
+ end
59
292
  end
60
293
  end
61
294
  end
@@ -1,118 +1,119 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
4
 
3
5
  unless current_adapter?(:PostgreSQLAdapter) # PostgreSQL does not use type strings for lookup
4
- module ActiveRecord
5
- module ConnectionAdapters
6
- class TypeLookupTest < ActiveRecord::TestCase
7
- setup do
8
- @connection = ActiveRecord::Base.connection
9
- end
10
-
11
- def test_boolean_types
12
- assert_lookup_type :boolean, 'boolean'
13
- assert_lookup_type :boolean, 'BOOLEAN'
14
- end
6
+ module ActiveRecord
7
+ module ConnectionAdapters
8
+ class TypeLookupTest < ActiveRecord::TestCase
9
+ setup do
10
+ @connection = ActiveRecord::Base.connection
11
+ end
15
12
 
16
- def test_string_types
17
- assert_lookup_type :string, 'char'
18
- assert_lookup_type :string, 'varchar'
19
- assert_lookup_type :string, 'VARCHAR'
20
- assert_lookup_type :string, 'varchar(255)'
21
- assert_lookup_type :string, 'character varying'
22
- end
13
+ def test_boolean_types
14
+ assert_lookup_type :boolean, "boolean"
15
+ assert_lookup_type :boolean, "BOOLEAN"
16
+ end
23
17
 
24
- def test_binary_types
25
- assert_lookup_type :binary, 'binary'
26
- assert_lookup_type :binary, 'BINARY'
27
- assert_lookup_type :binary, 'blob'
28
- assert_lookup_type :binary, 'BLOB'
29
- end
18
+ def test_string_types
19
+ assert_lookup_type :string, "char"
20
+ assert_lookup_type :string, "varchar"
21
+ assert_lookup_type :string, "VARCHAR"
22
+ assert_lookup_type :string, "varchar(255)"
23
+ assert_lookup_type :string, "character varying"
24
+ end
30
25
 
31
- def test_text_types
32
- assert_lookup_type :text, 'text'
33
- assert_lookup_type :text, 'TEXT'
34
- assert_lookup_type :text, 'clob'
35
- assert_lookup_type :text, 'CLOB'
36
- end
26
+ def test_binary_types
27
+ assert_lookup_type :binary, "binary"
28
+ assert_lookup_type :binary, "BINARY"
29
+ assert_lookup_type :binary, "blob"
30
+ assert_lookup_type :binary, "BLOB"
31
+ end
37
32
 
38
- def test_date_types
39
- assert_lookup_type :date, 'date'
40
- assert_lookup_type :date, 'DATE'
41
- end
33
+ def test_text_types
34
+ assert_lookup_type :text, "text"
35
+ assert_lookup_type :text, "TEXT"
36
+ assert_lookup_type :text, "clob"
37
+ assert_lookup_type :text, "CLOB"
38
+ end
42
39
 
43
- def test_time_types
44
- assert_lookup_type :time, 'time'
45
- assert_lookup_type :time, 'TIME'
46
- end
40
+ def test_date_types
41
+ assert_lookup_type :date, "date"
42
+ assert_lookup_type :date, "DATE"
43
+ end
47
44
 
48
- def test_datetime_types
49
- assert_lookup_type :datetime, 'datetime'
50
- assert_lookup_type :datetime, 'DATETIME'
51
- assert_lookup_type :datetime, 'timestamp'
52
- assert_lookup_type :datetime, 'TIMESTAMP'
53
- end
45
+ def test_time_types
46
+ assert_lookup_type :time, "time"
47
+ assert_lookup_type :time, "TIME"
48
+ end
54
49
 
55
- def test_decimal_types
56
- assert_lookup_type :decimal, 'decimal'
57
- assert_lookup_type :decimal, 'decimal(2,8)'
58
- assert_lookup_type :decimal, 'DECIMAL'
59
- assert_lookup_type :decimal, 'numeric'
60
- assert_lookup_type :decimal, 'numeric(2,8)'
61
- assert_lookup_type :decimal, 'NUMERIC'
62
- assert_lookup_type :decimal, 'number'
63
- assert_lookup_type :decimal, 'number(2,8)'
64
- assert_lookup_type :decimal, 'NUMBER'
65
- end
50
+ def test_datetime_types
51
+ assert_lookup_type :datetime, "datetime"
52
+ assert_lookup_type :datetime, "DATETIME"
53
+ assert_lookup_type :datetime, "timestamp"
54
+ assert_lookup_type :datetime, "TIMESTAMP"
55
+ end
66
56
 
67
- def test_float_types
68
- assert_lookup_type :float, 'float'
69
- assert_lookup_type :float, 'FLOAT'
70
- assert_lookup_type :float, 'double'
71
- assert_lookup_type :float, 'DOUBLE'
72
- end
57
+ def test_decimal_types
58
+ assert_lookup_type :decimal, "decimal"
59
+ assert_lookup_type :decimal, "decimal(2,8)"
60
+ assert_lookup_type :decimal, "DECIMAL"
61
+ assert_lookup_type :decimal, "numeric"
62
+ assert_lookup_type :decimal, "numeric(2,8)"
63
+ assert_lookup_type :decimal, "NUMERIC"
64
+ assert_lookup_type :decimal, "number"
65
+ assert_lookup_type :decimal, "number(2,8)"
66
+ assert_lookup_type :decimal, "NUMBER"
67
+ end
73
68
 
74
- def test_integer_types
75
- assert_lookup_type :integer, 'integer'
76
- assert_lookup_type :integer, 'INTEGER'
77
- assert_lookup_type :integer, 'tinyint'
78
- assert_lookup_type :integer, 'smallint'
79
- assert_lookup_type :integer, 'bigint'
80
- end
69
+ def test_float_types
70
+ assert_lookup_type :float, "float"
71
+ assert_lookup_type :float, "FLOAT"
72
+ assert_lookup_type :float, "double"
73
+ assert_lookup_type :float, "DOUBLE"
74
+ end
81
75
 
82
- def test_bigint_limit
83
- cast_type = @connection.type_map.lookup("bigint")
84
- if current_adapter?(:OracleAdapter)
85
- assert_equal 19, cast_type.limit
86
- else
87
- assert_equal 8, cast_type.limit
76
+ def test_integer_types
77
+ assert_lookup_type :integer, "integer"
78
+ assert_lookup_type :integer, "INTEGER"
79
+ assert_lookup_type :integer, "tinyint"
80
+ assert_lookup_type :integer, "smallint"
81
+ assert_lookup_type :integer, "bigint"
88
82
  end
89
- end
90
83
 
91
- def test_decimal_without_scale
92
- if current_adapter?(:OracleAdapter)
93
- {
94
- decimal: %w{decimal(2) decimal(2,0) numeric(2) numeric(2,0)},
95
- integer: %w{number(2) number(2,0)}
96
- }
97
- else
98
- { decimal: %w{decimal(2) decimal(2,0) numeric(2) numeric(2,0) number(2) number(2,0)} }
99
- end.each do |expected_type, types|
100
- types.each do |type|
101
- cast_type = @connection.type_map.lookup(type)
102
-
103
- assert_equal expected_type, cast_type.type
104
- assert_equal 2, cast_type.cast(2.1)
84
+ def test_bigint_limit
85
+ limit = @connection.send(:type_map).lookup("bigint").send(:_limit)
86
+ if current_adapter?(:OracleAdapter)
87
+ assert_equal 19, limit
88
+ else
89
+ assert_equal 8, limit
105
90
  end
106
91
  end
107
- end
108
92
 
109
- private
93
+ def test_decimal_without_scale
94
+ if current_adapter?(:OracleAdapter)
95
+ {
96
+ decimal: %w{decimal(2) decimal(2,0) numeric(2) numeric(2,0)},
97
+ integer: %w{number(2) number(2,0)}
98
+ }
99
+ else
100
+ { decimal: %w{decimal(2) decimal(2,0) numeric(2) numeric(2,0) number(2) number(2,0)} }
101
+ end.each do |expected_type, types|
102
+ types.each do |type|
103
+ cast_type = @connection.send(:type_map).lookup(type)
104
+
105
+ assert_equal expected_type, cast_type.type
106
+ assert_equal 2, cast_type.cast(2.1)
107
+ end
108
+ end
109
+ end
110
110
 
111
- def assert_lookup_type(type, lookup)
112
- cast_type = @connection.type_map.lookup(lookup)
113
- assert_equal type, cast_type.type
111
+ private
112
+ def assert_lookup_type(type, lookup)
113
+ cast_type = @connection.send(:type_map).lookup(lookup)
114
+ assert_equal type, cast_type.type
115
+ end
114
116
  end
115
117
  end
116
118
  end
117
119
  end
118
- end