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
  class Mysql2ConnectionTest < ActiveRecord::Mysql2TestCase
5
7
  include ConnectionHelper
@@ -9,7 +11,7 @@ class Mysql2ConnectionTest < ActiveRecord::Mysql2TestCase
9
11
  def setup
10
12
  super
11
13
  @subscriber = SQLSubscriber.new
12
- @subscription = ActiveSupport::Notifications.subscribe('sql.active_record', @subscriber)
14
+ @subscription = ActiveSupport::Notifications.subscribe("sql.active_record", @subscriber)
13
15
  @connection = ActiveRecord::Base.connection
14
16
  end
15
17
 
@@ -20,61 +22,52 @@ class Mysql2ConnectionTest < ActiveRecord::Mysql2TestCase
20
22
 
21
23
  def test_bad_connection
22
24
  assert_raise ActiveRecord::NoDatabaseError do
23
- configuration = ActiveRecord::Base.configurations['arunit'].merge(database: 'inexistent_activerecord_unittest')
25
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
26
+ configuration = db_config.configuration_hash.merge(database: "inexistent_activerecord_unittest")
24
27
  connection = ActiveRecord::Base.mysql2_connection(configuration)
25
- connection.drop_table 'ex', if_exists: true
28
+ connection.drop_table "ex", if_exists: true
26
29
  end
27
30
  end
28
31
 
29
- def test_truncate
30
- rows = ActiveRecord::Base.connection.exec_query("select count(*) from comments")
31
- count = rows.first.values.first
32
- assert_operator count, :>, 0
33
-
34
- ActiveRecord::Base.connection.truncate("comments")
35
- rows = ActiveRecord::Base.connection.exec_query("select count(*) from comments")
36
- count = rows.first.values.first
37
- assert_equal 0, count
38
- end
39
-
40
32
  def test_no_automatic_reconnection_after_timeout
41
- assert @connection.active?
42
- @connection.update('set @@wait_timeout=1')
33
+ assert_predicate @connection, :active?
34
+ @connection.update("set @@wait_timeout=1")
43
35
  sleep 2
44
- assert !@connection.active?
45
-
36
+ assert_not_predicate @connection, :active?
37
+ ensure
46
38
  # Repair all fixture connections so other tests won't break.
47
39
  @fixture_connections.each(&:verify!)
48
40
  end
49
41
 
50
42
  def test_successful_reconnection_after_timeout_with_manual_reconnect
51
- assert @connection.active?
52
- @connection.update('set @@wait_timeout=1')
43
+ assert_predicate @connection, :active?
44
+ @connection.update("set @@wait_timeout=1")
53
45
  sleep 2
54
46
  @connection.reconnect!
55
- assert @connection.active?
47
+ assert_predicate @connection, :active?
56
48
  end
57
49
 
58
50
  def test_successful_reconnection_after_timeout_with_verify
59
- assert @connection.active?
60
- @connection.update('set @@wait_timeout=1')
51
+ assert_predicate @connection, :active?
52
+ @connection.update("set @@wait_timeout=1")
61
53
  sleep 2
62
54
  @connection.verify!
63
- assert @connection.active?
55
+ assert_predicate @connection, :active?
64
56
  end
65
57
 
66
58
  def test_execute_after_disconnect
67
59
  @connection.disconnect!
68
60
 
69
- assert_raise(ActiveRecord::StatementInvalid) do
61
+ error = assert_raise(ActiveRecord::ConnectionNotEstablished) do
70
62
  @connection.execute("SELECT 1")
71
63
  end
64
+ assert_kind_of Mysql2::Error, error.cause
72
65
  end
73
66
 
74
67
  def test_quote_after_disconnect
75
68
  @connection.disconnect!
76
69
 
77
- assert_raise(Mysql2::Error) do
70
+ assert_raise(ActiveRecord::ConnectionNotEstablished) do
78
71
  @connection.quote("string")
79
72
  end
80
73
  end
@@ -101,8 +94,8 @@ class Mysql2ConnectionTest < ActiveRecord::Mysql2TestCase
101
94
  end
102
95
 
103
96
  def test_mysql_connection_collation_is_configured
104
- assert_equal 'utf8_unicode_ci', @connection.show_variable('collation_connection')
105
- assert_equal 'utf8_general_ci', ARUnit2Model.connection.show_variable('collation_connection')
97
+ assert_equal "utf8mb4_unicode_ci", @connection.show_variable("collation_connection")
98
+ assert_equal "utf8mb4_general_ci", ARUnit2Model.connection.show_variable("collation_connection")
106
99
  end
107
100
 
108
101
  def test_mysql_default_in_strict_mode
@@ -129,29 +122,29 @@ class Mysql2ConnectionTest < ActiveRecord::Mysql2TestCase
129
122
 
130
123
  def test_mysql_sql_mode_variable_overrides_strict_mode
131
124
  run_without_connection do |orig_connection|
132
- ActiveRecord::Base.establish_connection(orig_connection.deep_merge(variables: { 'sql_mode' => 'ansi' }))
133
- result = ActiveRecord::Base.connection.select_value('SELECT @@SESSION.sql_mode')
125
+ ActiveRecord::Base.establish_connection(orig_connection.deep_merge(variables: { "sql_mode" => "ansi" }))
126
+ result = ActiveRecord::Base.connection.select_value("SELECT @@SESSION.sql_mode")
134
127
  assert_no_match %r(STRICT_ALL_TABLES), result
135
128
  end
136
129
  end
137
130
 
138
- def test_passing_arbitary_flags_to_adapter
131
+ def test_passing_arbitrary_flags_to_adapter
139
132
  run_without_connection do |orig_connection|
140
- ActiveRecord::Base.establish_connection(orig_connection.merge({flags: Mysql2::Client::COMPRESS}))
141
- assert_equal (Mysql2::Client::COMPRESS | Mysql2::Client::FOUND_ROWS), ActiveRecord::Base.connection.raw_connection.query_options[:flags]
133
+ ActiveRecord::Base.establish_connection(orig_connection.merge(flags: Mysql2::Client::COMPRESS))
134
+ assert_equal (Mysql2::Client::COMPRESS | Mysql2::Client::FOUND_ROWS), ActiveRecord::Base.connection.raw_connection.query_options[:flags]
142
135
  end
143
136
  end
144
137
 
145
138
  def test_passing_flags_by_array_to_adapter
146
139
  run_without_connection do |orig_connection|
147
- ActiveRecord::Base.establish_connection(orig_connection.merge({flags: ['COMPRESS'] }))
140
+ ActiveRecord::Base.establish_connection(orig_connection.merge(flags: ["COMPRESS"]))
148
141
  assert_equal ["COMPRESS", "FOUND_ROWS"], ActiveRecord::Base.connection.raw_connection.query_options[:flags]
149
142
  end
150
143
  end
151
144
 
152
145
  def test_mysql_set_session_variable
153
146
  run_without_connection do |orig_connection|
154
- ActiveRecord::Base.establish_connection(orig_connection.deep_merge({:variables => {:default_week_format => 3}}))
147
+ ActiveRecord::Base.establish_connection(orig_connection.deep_merge(variables: { default_week_format: 3 }))
155
148
  session_mode = ActiveRecord::Base.connection.exec_query "SELECT @@SESSION.DEFAULT_WEEK_FORMAT"
156
149
  assert_equal 3, session_mode.rows.first.first.to_i
157
150
  end
@@ -159,7 +152,7 @@ class Mysql2ConnectionTest < ActiveRecord::Mysql2TestCase
159
152
 
160
153
  def test_mysql_set_session_variable_to_default
161
154
  run_without_connection do |orig_connection|
162
- ActiveRecord::Base.establish_connection(orig_connection.deep_merge({:variables => {:default_week_format => :default}}))
155
+ ActiveRecord::Base.establish_connection(orig_connection.deep_merge(variables: { default_week_format: :default }))
163
156
  global_mode = ActiveRecord::Base.connection.exec_query "SELECT @@GLOBAL.DEFAULT_WEEK_FORMAT"
164
157
  session_mode = ActiveRecord::Base.connection.exec_query "SELECT @@SESSION.DEFAULT_WEEK_FORMAT"
165
158
  assert_equal global_mode.rows, session_mode.rows
@@ -167,21 +160,27 @@ class Mysql2ConnectionTest < ActiveRecord::Mysql2TestCase
167
160
  end
168
161
 
169
162
  def test_logs_name_show_variable
170
- @connection.show_variable 'foo'
163
+ ActiveRecord::Base.connection.materialize_transactions
164
+ @subscriber.logged.clear
165
+ @connection.show_variable "foo"
171
166
  assert_equal "SCHEMA", @subscriber.logged[0][1]
172
167
  end
173
168
 
174
- def test_logs_name_rename_column_sql
169
+ def test_logs_name_rename_column_for_alter
175
170
  @connection.execute "CREATE TABLE `bar_baz` (`foo` varchar(255))"
176
171
  @subscriber.logged.clear
177
- @connection.send(:rename_column_sql, 'bar_baz', 'foo', 'foo2')
178
- assert_equal "SCHEMA", @subscriber.logged[0][1]
172
+ @connection.send(:rename_column_for_alter, "bar_baz", "foo", "foo2")
173
+ if @connection.send(:supports_rename_column?)
174
+ assert_empty @subscriber.logged
175
+ else
176
+ assert_equal "SCHEMA", @subscriber.logged[0][1]
177
+ end
179
178
  ensure
180
179
  @connection.execute "DROP TABLE `bar_baz`"
181
180
  end
182
181
 
183
182
  def test_get_and_release_advisory_lock
184
- lock_name = "test_lock_name"
183
+ lock_name = "test lock'n'name"
185
184
 
186
185
  got_lock = @connection.get_advisory_lock(lock_name)
187
186
  assert got_lock, "get_advisory_lock should have returned true but it didn't"
@@ -192,19 +191,18 @@ class Mysql2ConnectionTest < ActiveRecord::Mysql2TestCase
192
191
  released_lock = @connection.release_advisory_lock(lock_name)
193
192
  assert released_lock, "expected release_advisory_lock to return true but it didn't"
194
193
 
195
- assert test_lock_free(lock_name), 'expected the test lock to be available after releasing'
194
+ assert test_lock_free(lock_name), "expected the test lock to be available after releasing"
196
195
  end
197
196
 
198
197
  def test_release_non_existent_advisory_lock
199
- lock_name = "fake_lock_name"
198
+ lock_name = "fake lock'n'name"
200
199
  released_non_existent_lock = @connection.release_advisory_lock(lock_name)
201
200
  assert_equal released_non_existent_lock, false,
202
- 'expected release_advisory_lock to return false when there was no lock to release'
201
+ "expected release_advisory_lock to return false when there was no lock to release"
203
202
  end
204
203
 
205
- protected
206
-
207
- def test_lock_free(lock_name)
208
- @connection.select_value("SELECT IS_FREE_LOCK('#{lock_name}');") == 1
209
- end
204
+ private
205
+ def test_lock_free(lock_name)
206
+ @connection.select_value("SELECT IS_FREE_LOCK(#{@connection.quote(lock_name)})") == 1
207
+ end
210
208
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "support/connection_helper"
5
+ require "models/author"
6
+ require "models/bulb"
7
+
8
+ module ActiveRecord
9
+ class CountDeletedRowsWithLockTest < ActiveRecord::Mysql2TestCase
10
+ test "delete and create in different threads synchronize correctly" do
11
+ Bulb.unscoped.delete_all
12
+ Bulb.create!(name: "Jimmy", color: "blue")
13
+
14
+ delete_thread = Thread.new do
15
+ Bulb.unscoped.delete_all
16
+ end
17
+
18
+ create_thread = Thread.new do
19
+ Author.create!(name: "Tommy")
20
+ end
21
+
22
+ delete_thread.join
23
+ create_thread.join
24
+
25
+ assert_equal 1, delete_thread.value
26
+ end
27
+ end
28
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
4
 
3
5
  class Mysql2DatetimePrecisionQuotingTest < ActiveRecord::Mysql2TestCase
@@ -5,41 +7,43 @@ class Mysql2DatetimePrecisionQuotingTest < ActiveRecord::Mysql2TestCase
5
7
  @connection = ActiveRecord::Base.connection
6
8
  end
7
9
 
8
- test 'microsecond precision for MySQL gte 5.6.4' do
9
- stub_version '5.6.4'
10
- assert_microsecond_precision
11
- end
12
-
13
- test 'no microsecond precision for MySQL lt 5.6.4' do
14
- stub_version '5.6.3'
15
- assert_no_microsecond_precision
10
+ test "microsecond precision for MySQL gte 5.6.4" do
11
+ stub_version "5.6.4" do
12
+ assert_microsecond_precision
13
+ end
16
14
  end
17
15
 
18
- test 'microsecond precision for MariaDB gte 5.3.0' do
19
- stub_version '5.5.5-10.1.8-MariaDB-log'
20
- assert_microsecond_precision
16
+ test "no microsecond precision for MySQL lt 5.6.4" do
17
+ stub_version "5.6.3" do
18
+ assert_no_microsecond_precision
19
+ end
21
20
  end
22
21
 
23
- test 'no microsecond precision for MariaDB lt 5.3.0' do
24
- stub_version '5.2.9-MariaDB'
25
- assert_no_microsecond_precision
22
+ test "microsecond precision for MariaDB gte 5.3.0" do
23
+ stub_version "5.5.5-10.1.8-MariaDB-log" do
24
+ assert_microsecond_precision
25
+ end
26
26
  end
27
27
 
28
28
  private
29
29
  def assert_microsecond_precision
30
- assert_match_quoted_microsecond_datetime(/\.000001\z/)
30
+ assert_match_quoted_microsecond_datetime(/\.123456\z/)
31
31
  end
32
32
 
33
33
  def assert_no_microsecond_precision
34
- assert_match_quoted_microsecond_datetime(/\d\z/)
34
+ assert_match_quoted_microsecond_datetime(/:55\z/)
35
35
  end
36
36
 
37
37
  def assert_match_quoted_microsecond_datetime(match)
38
- assert_match match, @connection.quoted_date(Time.now.change(usec: 1))
38
+ assert_match match, @connection.quoted_date(Time.now.change(sec: 55, usec: 123456))
39
39
  end
40
40
 
41
41
  def stub_version(full_version_string)
42
- @connection.stubs(:full_version).returns(full_version_string)
43
- @connection.remove_instance_variable(:@version) if @connection.instance_variable_defined?(:@version)
42
+ @connection.stub(:get_full_version, full_version_string) do
43
+ @connection.schema_cache.clear!
44
+ yield
45
+ end
46
+ ensure
47
+ @connection.schema_cache.clear!
44
48
  end
45
49
  end
@@ -1,26 +1,47 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
4
+ require "support/schema_dumping_helper"
2
5
 
3
6
  class Mysql2EnumTest < ActiveRecord::Mysql2TestCase
7
+ self.use_transactional_tests = false
8
+
9
+ include SchemaDumpingHelper
10
+
4
11
  class EnumTest < ActiveRecord::Base
5
- end
12
+ attribute :state, :integer
6
13
 
7
- def test_enum_limit
8
- column = EnumTest.columns_hash['enum_column']
9
- assert_equal 8, column.limit
14
+ enum state: {
15
+ start: 0,
16
+ middle: 1,
17
+ finish: 2
18
+ }
10
19
  end
11
20
 
12
- def test_should_not_be_blob_or_text_column
13
- column = EnumTest.columns_hash['enum_column']
14
- assert_not column.blob_or_text_column?
21
+ def setup
22
+ EnumTest.connection.create_table :enum_tests, id: false, force: true do |t|
23
+ t.column :enum_column, "enum('text','blob','tiny','medium','long','unsigned','bigint')"
24
+ t.column :state, "TINYINT(1)"
25
+ end
15
26
  end
16
27
 
17
28
  def test_should_not_be_unsigned
18
- column = EnumTest.columns_hash['enum_column']
19
- assert_not column.unsigned?
29
+ column = EnumTest.columns_hash["enum_column"]
30
+ assert_not_predicate column, :unsigned?
20
31
  end
21
32
 
22
33
  def test_should_not_be_bigint
23
- column = EnumTest.columns_hash['enum_column']
24
- assert_not column.bigint?
34
+ column = EnumTest.columns_hash["enum_column"]
35
+ assert_not_predicate column, :bigint?
36
+ end
37
+
38
+ def test_schema_dumping
39
+ schema = dump_table_schema "enum_tests"
40
+ assert_match %r{t\.column "enum_column", "enum\('text','blob','tiny','medium','long','unsigned','bigint'\)"$}, schema
41
+ end
42
+
43
+ def test_enum_with_attribute
44
+ enum_test = EnumTest.create!(state: :middle)
45
+ assert_equal "middle", enum_test.state
25
46
  end
26
47
  end
@@ -1,21 +1,23 @@
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 Mysql2ExplainTest < ActiveRecord::Mysql2TestCase
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 %(EXPLAIN for: SELECT `developers`.* FROM `developers` WHERE `developers`.`id` = 1), explain
11
- assert_match %r(developers |.* const), explain
11
+ explain = Author.where(id: 1).explain
12
+ assert_match %(EXPLAIN for: SELECT `authors`.* FROM `authors` WHERE `authors`.`id` = 1), explain
13
+ assert_match %r(authors |.* const), explain
12
14
  end
13
15
 
14
16
  def test_explain_with_eager_loading
15
- explain = Developer.where(id: 1).includes(:audit_logs).explain
16
- assert_match %(EXPLAIN for: SELECT `developers`.* FROM `developers` WHERE `developers`.`id` = 1), explain
17
- assert_match %r(developers |.* const), explain
18
- assert_match %(EXPLAIN for: SELECT `audit_logs`.* FROM `audit_logs` WHERE `audit_logs`.`developer_id` = 1), explain
19
- assert_match %r(audit_logs |.* ALL), explain
17
+ explain = Author.where(id: 1).includes(:posts).explain
18
+ assert_match %(EXPLAIN for: SELECT `authors`.* FROM `authors` WHERE `authors`.`id` = 1), explain
19
+ assert_match %r(authors |.* const), explain
20
+ assert_match %(EXPLAIN for: SELECT `posts`.* FROM `posts` WHERE `posts`.`author_id` = 1), explain
21
+ assert_match %r(posts |.* ALL), explain
20
22
  end
21
23
  end
@@ -1,195 +1,24 @@
1
- require 'cases/helper'
2
- require 'support/schema_dumping_helper'
1
+ # frozen_string_literal: true
3
2
 
4
- if ActiveRecord::Base.connection.supports_json?
5
- class Mysql2JSONTest < ActiveRecord::Mysql2TestCase
6
- include SchemaDumpingHelper
7
- self.use_transactional_tests = false
8
-
9
- class JsonDataType < ActiveRecord::Base
10
- self.table_name = 'json_data_type'
11
-
12
- store_accessor :settings, :resolution
13
- end
3
+ require "cases/helper"
4
+ require "cases/json_shared_test_cases"
14
5
 
15
- def setup
16
- @connection = ActiveRecord::Base.connection
17
- begin
18
- @connection.create_table('json_data_type') do |t|
19
- t.json 'payload'
20
- t.json 'settings'
6
+ if ActiveRecord::Base.connection.supports_json?
7
+ class Mysql2JSONTest < ActiveRecord::Mysql2TestCase
8
+ include JSONSharedTestCases
9
+ self.use_transactional_tests = false
10
+
11
+ def setup
12
+ super
13
+ @connection.create_table("json_data_type") do |t|
14
+ t.json "payload"
15
+ t.json "settings"
21
16
  end
22
17
  end
23
- end
24
-
25
- def teardown
26
- @connection.drop_table :json_data_type, if_exists: true
27
- JsonDataType.reset_column_information
28
- end
29
-
30
- def test_column
31
- column = JsonDataType.columns_hash["payload"]
32
- assert_equal :json, column.type
33
- assert_equal 'json', column.sql_type
34
-
35
- type = JsonDataType.type_for_attribute("payload")
36
- assert_not type.binary?
37
- end
38
-
39
- def test_change_table_supports_json
40
- @connection.change_table('json_data_type') do |t|
41
- t.json 'users'
42
- end
43
- JsonDataType.reset_column_information
44
- column = JsonDataType.columns_hash['users']
45
- assert_equal :json, column.type
46
- end
47
-
48
- def test_schema_dumping
49
- output = dump_table_schema("json_data_type")
50
- assert_match(/t\.json\s+"settings"/, output)
51
- end
52
-
53
- def test_cast_value_on_write
54
- x = JsonDataType.new payload: {"string" => "foo", :symbol => :bar}
55
- assert_equal({"string" => "foo", :symbol => :bar}, x.payload_before_type_cast)
56
- assert_equal({"string" => "foo", "symbol" => "bar"}, x.payload)
57
- x.save
58
- assert_equal({"string" => "foo", "symbol" => "bar"}, x.reload.payload)
59
- end
60
-
61
- def test_type_cast_json
62
- type = JsonDataType.type_for_attribute("payload")
63
-
64
- data = "{\"a_key\":\"a_value\"}"
65
- hash = type.deserialize(data)
66
- assert_equal({'a_key' => 'a_value'}, hash)
67
- assert_equal({'a_key' => 'a_value'}, type.deserialize(data))
68
-
69
- assert_equal({}, type.deserialize("{}"))
70
- assert_equal({'key'=>nil}, type.deserialize('{"key": null}'))
71
- assert_equal({'c'=>'}','"a"'=>'b "a b'}, type.deserialize(%q({"c":"}", "\"a\"":"b \"a b"})))
72
- end
73
-
74
- def test_rewrite
75
- @connection.execute "insert into json_data_type (payload) VALUES ('{\"k\":\"v\"}')"
76
- x = JsonDataType.first
77
- x.payload = { '"a\'' => 'b' }
78
- assert x.save!
79
- end
80
-
81
- def test_select
82
- @connection.execute "insert into json_data_type (payload) VALUES ('{\"k\":\"v\"}')"
83
- x = JsonDataType.first
84
- assert_equal({'k' => 'v'}, x.payload)
85
- end
86
-
87
- def test_select_multikey
88
- @connection.execute %q|insert into json_data_type (payload) VALUES ('{"k1":"v1", "k2":"v2", "k3":[1,2,3]}')|
89
- x = JsonDataType.first
90
- assert_equal({'k1' => 'v1', 'k2' => 'v2', 'k3' => [1,2,3]}, x.payload)
91
- end
92
-
93
- def test_null_json
94
- @connection.execute %q|insert into json_data_type (payload) VALUES(null)|
95
- x = JsonDataType.first
96
- assert_equal(nil, x.payload)
97
- end
98
-
99
- def test_select_array_json_value
100
- @connection.execute %q|insert into json_data_type (payload) VALUES ('["v0",{"k1":"v1"}]')|
101
- x = JsonDataType.first
102
- assert_equal(['v0', {'k1' => 'v1'}], x.payload)
103
- end
104
18
 
105
- def test_select_nil_json_after_create
106
- json = JsonDataType.create(payload: nil)
107
- x = JsonDataType.where(payload:nil).first
108
- assert_equal(json, x)
109
- end
110
-
111
- def test_select_nil_json_after_update
112
- json = JsonDataType.create(payload: "foo")
113
- x = JsonDataType.where(payload:nil).first
114
- assert_equal(nil, x)
115
-
116
- json.update_attributes payload: nil
117
- x = JsonDataType.where(payload:nil).first
118
- assert_equal(json.reload, x)
119
- end
120
-
121
- def test_rewrite_array_json_value
122
- @connection.execute %q|insert into json_data_type (payload) VALUES ('["v0",{"k1":"v1"}]')|
123
- x = JsonDataType.first
124
- x.payload = ["v1", { "k2" => "v2" }, "v3"]
125
- assert x.save!
126
- end
127
-
128
- def test_with_store_accessors
129
- x = JsonDataType.new(resolution: "320×480")
130
- assert_equal "320×480", x.resolution
131
-
132
- x.save!
133
- x = JsonDataType.first
134
- assert_equal "320×480", x.resolution
135
-
136
- x.resolution = "640×1136"
137
- x.save!
138
-
139
- x = JsonDataType.first
140
- assert_equal "640×1136", x.resolution
141
- end
142
-
143
- def test_duplication_with_store_accessors
144
- x = JsonDataType.new(resolution: "320×480")
145
- assert_equal "320×480", x.resolution
146
-
147
- y = x.dup
148
- assert_equal "320×480", y.resolution
149
- end
150
-
151
- def test_yaml_round_trip_with_store_accessors
152
- x = JsonDataType.new(resolution: "320×480")
153
- assert_equal "320×480", x.resolution
154
-
155
- y = YAML.load(YAML.dump(x))
156
- assert_equal "320×480", y.resolution
157
- end
158
-
159
- def test_changes_in_place
160
- json = JsonDataType.new
161
- assert_not json.changed?
162
-
163
- json.payload = { 'one' => 'two' }
164
- assert json.changed?
165
- assert json.payload_changed?
166
-
167
- json.save!
168
- assert_not json.changed?
169
-
170
- json.payload['three'] = 'four'
171
- assert json.payload_changed?
172
-
173
- json.save!
174
- json.reload
175
-
176
- assert_equal({ 'one' => 'two', 'three' => 'four' }, json.payload)
177
- assert_not json.changed?
178
- end
179
-
180
- def test_assigning_string_literal
181
- json = JsonDataType.create(payload: "foo")
182
- assert_equal "foo", json.payload
183
- end
184
-
185
- def test_assigning_number
186
- json = JsonDataType.create(payload: 1.234)
187
- assert_equal 1.234, json.payload
188
- end
189
-
190
- def test_assigning_boolean
191
- json = JsonDataType.create(payload: true)
192
- assert_equal true, json.payload
19
+ private
20
+ def column_type
21
+ :json
22
+ end
193
23
  end
194
24
  end
195
- end