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,6 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
4
 
3
5
  class SchemaMigrationsTest < ActiveRecord::Mysql2TestCase
6
+ self.use_transactional_tests = false
7
+
4
8
  def test_renaming_index_on_foreign_key
5
9
  connection.add_index "engines", "car_id"
6
10
  connection.add_foreign_key :engines, :cars, name: "fk_engines_cars"
@@ -16,9 +20,9 @@ class SchemaMigrationsTest < ActiveRecord::Mysql2TestCase
16
20
  table_name = ActiveRecord::SchemaMigration.table_name
17
21
  connection.drop_table table_name, if_exists: true
18
22
 
19
- connection.initialize_schema_migrations_table
23
+ ActiveRecord::SchemaMigration.create_table
20
24
 
21
- assert connection.column_exists?(table_name, :version, :string, collation: 'utf8_general_ci')
25
+ assert connection.column_exists?(table_name, :version, :string)
22
26
  end
23
27
  end
24
28
 
@@ -27,33 +31,34 @@ class SchemaMigrationsTest < ActiveRecord::Mysql2TestCase
27
31
  table_name = ActiveRecord::InternalMetadata.table_name
28
32
  connection.drop_table table_name, if_exists: true
29
33
 
30
- connection.initialize_internal_metadata_table
34
+ ActiveRecord::InternalMetadata.create_table
31
35
 
32
- assert connection.column_exists?(table_name, :key, :string, collation: 'utf8_general_ci')
36
+ assert connection.column_exists?(table_name, :key, :string)
33
37
  end
38
+ ensure
39
+ ActiveRecord::InternalMetadata[:environment] = connection.migration_context.current_environment
34
40
  end
35
41
 
36
42
  private
43
+ def with_encoding_utf8mb4
44
+ database_name = connection.current_database
45
+ database_info = connection.select_one("SELECT * FROM information_schema.schemata WHERE schema_name = '#{database_name}'")
37
46
 
38
- def with_encoding_utf8mb4
39
- database_name = connection.current_database
40
- database_info = connection.select_one("SELECT * FROM information_schema.schemata WHERE schema_name = '#{database_name}'")
47
+ original_charset = database_info["DEFAULT_CHARACTER_SET_NAME"]
48
+ original_collation = database_info["DEFAULT_COLLATION_NAME"]
41
49
 
42
- original_charset = database_info["DEFAULT_CHARACTER_SET_NAME"]
43
- original_collation = database_info["DEFAULT_COLLATION_NAME"]
50
+ execute("ALTER DATABASE #{database_name} DEFAULT CHARACTER SET utf8mb4")
44
51
 
45
- execute("ALTER DATABASE #{database_name} DEFAULT CHARACTER SET utf8mb4")
46
-
47
- yield
48
- ensure
49
- execute("ALTER DATABASE #{database_name} DEFAULT CHARACTER SET #{original_charset} COLLATE #{original_collation}")
50
- end
52
+ yield
53
+ ensure
54
+ execute("ALTER DATABASE #{database_name} DEFAULT CHARACTER SET #{original_charset} COLLATE #{original_collation}")
55
+ end
51
56
 
52
- def connection
53
- @connection ||= ActiveRecord::Base.connection
54
- end
57
+ def connection
58
+ @connection ||= ActiveRecord::Base.connection
59
+ end
55
60
 
56
- def execute(sql)
57
- connection.execute(sql)
58
- end
61
+ def execute(sql)
62
+ connection.execute(sql)
63
+ end
59
64
  end
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/post'
3
- require 'models/comment'
4
+ require "models/post"
5
+ require "models/comment"
4
6
 
5
7
  module ActiveRecord
6
8
  module ConnectionAdapters
@@ -9,14 +11,14 @@ module ActiveRecord
9
11
 
10
12
  def setup
11
13
  @connection = ActiveRecord::Base.connection
12
- db = Post.connection_pool.spec.config[:database]
14
+ db = Post.connection_pool.db_config.database
13
15
  table = Post.table_name
14
16
  @db_name = db
15
17
 
16
18
  @omgpost = Class.new(ActiveRecord::Base) do
17
19
  self.inheritance_column = :disabled
18
20
  self.table_name = "#{db}.#{table}"
19
- def self.name; 'Post'; end
21
+ def self.name; "Post"; end
20
22
  end
21
23
  end
22
24
 
@@ -31,15 +33,15 @@ module ActiveRecord
31
33
  t.float :float_25, limit: 25
32
34
  end
33
35
 
34
- column_no_limit = @connection.columns(:mysql_doubles).find { |c| c.name == 'float_no_limit' }
35
- column_short = @connection.columns(:mysql_doubles).find { |c| c.name == 'float_short' }
36
- column_long = @connection.columns(:mysql_doubles).find { |c| c.name == 'float_long' }
36
+ column_no_limit = @connection.columns(:mysql_doubles).find { |c| c.name == "float_no_limit" }
37
+ column_short = @connection.columns(:mysql_doubles).find { |c| c.name == "float_short" }
38
+ column_long = @connection.columns(:mysql_doubles).find { |c| c.name == "float_long" }
37
39
 
38
- column_23 = @connection.columns(:mysql_doubles).find { |c| c.name == 'float_23' }
39
- column_24 = @connection.columns(:mysql_doubles).find { |c| c.name == 'float_24' }
40
- column_25 = @connection.columns(:mysql_doubles).find { |c| c.name == 'float_25' }
40
+ column_23 = @connection.columns(:mysql_doubles).find { |c| c.name == "float_23" }
41
+ column_24 = @connection.columns(:mysql_doubles).find { |c| c.name == "float_24" }
42
+ column_25 = @connection.columns(:mysql_doubles).find { |c| c.name == "float_25" }
41
43
 
42
- # Mysql floats are precision 0..24, Mysql doubles are precision 25..53
44
+ # MySQL floats are precision 0..24, MySQL doubles are precision 25..53
43
45
  assert_equal 24, column_no_limit.limit
44
46
  assert_equal 24, column_short.limit
45
47
  assert_equal 53, column_long.limit
@@ -56,7 +58,7 @@ module ActiveRecord
56
58
  end
57
59
 
58
60
  def test_primary_key
59
- assert_equal 'id', @omgpost.primary_key
61
+ assert_equal "id", @omgpost.primary_key
60
62
  end
61
63
 
62
64
  def test_data_source_exists?
@@ -65,22 +67,22 @@ module ActiveRecord
65
67
  end
66
68
 
67
69
  def test_data_source_exists_wrong_schema
68
- assert(!@connection.data_source_exists?("#{@db_name}.zomg"), "data_source should not exist")
70
+ assert_not(@connection.data_source_exists?("#{@db_name}.zomg"), "data_source should not exist")
69
71
  end
70
72
 
71
73
  def test_dump_indexes
72
- index_a_name = 'index_key_tests_on_snack'
73
- index_b_name = 'index_key_tests_on_pizza'
74
- index_c_name = 'index_key_tests_on_awesome'
74
+ index_a_name = "index_key_tests_on_snack"
75
+ index_b_name = "index_key_tests_on_pizza"
76
+ index_c_name = "index_key_tests_on_awesome"
75
77
 
76
- table = 'key_tests'
78
+ table = "key_tests"
77
79
 
78
80
  indexes = @connection.indexes(table).sort_by(&:name)
79
- assert_equal 3,indexes.size
81
+ assert_equal 3, indexes.size
80
82
 
81
- index_a = indexes.select{|i| i.name == index_a_name}[0]
82
- index_b = indexes.select{|i| i.name == index_b_name}[0]
83
- index_c = indexes.select{|i| i.name == index_c_name}[0]
83
+ index_a = indexes.select { |i| i.name == index_a_name }[0]
84
+ index_b = indexes.select { |i| i.name == index_b_name }[0]
85
+ index_c = indexes.select { |i| i.name == index_c_name }[0]
84
86
  assert_equal :btree, index_a.using
85
87
  assert_nil index_a.type
86
88
  assert_equal :btree, index_b.using
@@ -121,6 +123,6 @@ class Mysql2AnsiQuotesTest < ActiveRecord::Mysql2TestCase
121
123
  def test_foreign_keys_method_with_ansi_quotes
122
124
  fks = @connection.foreign_keys("lessons_students")
123
125
  assert_equal([["lessons_students", "students", :cascade]],
124
- fks.map {|fk| [fk.from_table, fk.to_table, fk.on_delete] })
126
+ fks.map { |fk| [fk.from_table, fk.to_table, fk.on_delete] })
125
127
  end
126
128
  end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "support/schema_dumping_helper"
5
+
6
+ class Mysql2SetTest < ActiveRecord::Mysql2TestCase
7
+ include SchemaDumpingHelper
8
+
9
+ class SetTest < ActiveRecord::Base
10
+ end
11
+
12
+ def setup
13
+ SetTest.connection.create_table :set_tests, id: false, force: true do |t|
14
+ t.column :set_column, "set('text','blob','tiny','medium','long','unsigned','bigint')"
15
+ end
16
+ end
17
+
18
+ def test_should_not_be_unsigned
19
+ column = SetTest.columns_hash["set_column"]
20
+ assert_not_predicate column, :unsigned?
21
+ end
22
+
23
+ def test_should_not_be_bigint
24
+ column = SetTest.columns_hash["set_column"]
25
+ assert_not_predicate column, :bigint?
26
+ end
27
+
28
+ def test_schema_dumping
29
+ schema = dump_table_schema "set_tests"
30
+ assert_match %r{t\.column "set_column", "set\('text','blob','tiny','medium','long','unsigned','bigint'\)"$}, schema
31
+ end
32
+ end
@@ -1,13 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/topic'
3
- require 'models/reply'
4
+ require "models/topic"
5
+ require "models/reply"
4
6
 
5
7
  class Mysql2StoredProcedureTest < ActiveRecord::Mysql2TestCase
6
8
  fixtures :topics
7
9
 
8
10
  def setup
9
11
  @connection = ActiveRecord::Base.connection
10
- unless ActiveRecord::Base.connection.version >= '5.6.0'
12
+ unless ActiveRecord::Base.connection.database_version >= "5.6.0"
11
13
  skip("no stored procedure support")
12
14
  end
13
15
  end
@@ -15,21 +17,21 @@ class Mysql2StoredProcedureTest < ActiveRecord::Mysql2TestCase
15
17
  # Test that MySQL allows multiple results for stored procedures
16
18
  #
17
19
  # In MySQL 5.6, CLIENT_MULTI_RESULTS is enabled by default.
18
- # http://dev.mysql.com/doc/refman/5.6/en/call.html
20
+ # https://dev.mysql.com/doc/refman/en/call.html
19
21
  def test_multi_results
20
- rows = @connection.select_rows('CALL ten();')
22
+ rows = @connection.select_rows("CALL ten();")
21
23
  assert_equal 10, rows[0][0].to_i, "ten() did not return 10 as expected: #{rows.inspect}"
22
24
  assert @connection.active?, "Bad connection use by 'Mysql2Adapter.select_rows'"
23
25
  end
24
26
 
25
27
  def test_multi_results_from_select_one
26
- row = @connection.select_one('CALL topics(1);')
27
- assert_equal 'David', row['author_name']
28
+ row = @connection.select_one("CALL topics(1);")
29
+ assert_equal "David", row["author_name"]
28
30
  assert @connection.active?, "Bad connection use by 'Mysql2Adapter.select_one'"
29
31
  end
30
32
 
31
33
  def test_multi_results_from_find_by_sql
32
- topics = Topic.find_by_sql 'CALL topics(3);'
34
+ topics = Topic.find_by_sql "CALL topics(3);"
33
35
  assert_equal 3, topics.size
34
36
  assert @connection.active?, "Bad connection use by 'Mysql2Adapter.select'"
35
37
  end
@@ -1,14 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
4
 
3
5
  class Mysql2SqlTypesTest < ActiveRecord::Mysql2TestCase
4
6
  def test_binary_types
5
- assert_equal 'varbinary(64)', type_to_sql(:binary, 64)
6
- assert_equal 'varbinary(4095)', type_to_sql(:binary, 4095)
7
- assert_equal 'blob', type_to_sql(:binary, 4096)
8
- assert_equal 'blob', type_to_sql(:binary)
7
+ assert_equal "varbinary(64)", type_to_sql(:binary, 64)
8
+ assert_equal "varbinary(4095)", type_to_sql(:binary, 4095)
9
+ assert_equal "blob", type_to_sql(:binary, 4096)
10
+ assert_equal "blob", type_to_sql(:binary)
9
11
  end
10
12
 
11
- def type_to_sql(*args)
12
- ActiveRecord::Base.connection.type_to_sql(*args)
13
+ def type_to_sql(type, limit = nil)
14
+ ActiveRecord::Base.connection.type_to_sql(type, limit: limit)
13
15
  end
14
16
  end
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'support/schema_dumping_helper'
4
+ require "support/schema_dumping_helper"
3
5
 
4
6
  class Mysql2TableOptionsTest < ActiveRecord::Mysql2TestCase
5
7
  include SchemaDumpingHelper
8
+ self.use_transactional_tests = false
6
9
 
7
10
  def setup
8
11
  @connection = ActiveRecord::Base.connection
@@ -15,28 +18,108 @@ class Mysql2TableOptionsTest < ActiveRecord::Mysql2TestCase
15
18
  test "table options with ENGINE" do
16
19
  @connection.create_table "mysql_table_options", force: true, options: "ENGINE=MyISAM"
17
20
  output = dump_table_schema("mysql_table_options")
18
- options = %r{create_table "mysql_table_options", force: :cascade, options: "(?<options>.*)"}.match(output)[:options]
19
- assert_match %r{ENGINE=MyISAM}, options
21
+ expected = /create_table "mysql_table_options", charset: "utf8mb4"(?:, collation: "\w+")?, options: "ENGINE=MyISAM", force: :cascade/
22
+ assert_match expected, output
20
23
  end
21
24
 
22
25
  test "table options with ROW_FORMAT" do
23
26
  @connection.create_table "mysql_table_options", force: true, options: "ROW_FORMAT=REDUNDANT"
24
27
  output = dump_table_schema("mysql_table_options")
25
- options = %r{create_table "mysql_table_options", force: :cascade, options: "(?<options>.*)"}.match(output)[:options]
26
- assert_match %r{ROW_FORMAT=REDUNDANT}, options
28
+ expected = /create_table "mysql_table_options", charset: "utf8mb4"(?:, collation: "\w+")?, options: "ENGINE=InnoDB ROW_FORMAT=REDUNDANT", force: :cascade/
29
+ assert_match expected, output
27
30
  end
28
31
 
29
32
  test "table options with CHARSET" do
30
- @connection.create_table "mysql_table_options", force: true, options: "CHARSET=utf8mb4"
33
+ @connection.create_table "mysql_table_options", force: true, options: "CHARSET=latin1"
31
34
  output = dump_table_schema("mysql_table_options")
32
- options = %r{create_table "mysql_table_options", force: :cascade, options: "(?<options>.*)"}.match(output)[:options]
33
- assert_match %r{CHARSET=utf8mb4}, options
35
+ expected = /create_table "mysql_table_options", charset: "latin1", force: :cascade/
36
+ assert_match expected, output
34
37
  end
35
38
 
36
39
  test "table options with COLLATE" do
37
40
  @connection.create_table "mysql_table_options", force: true, options: "COLLATE=utf8mb4_bin"
38
41
  output = dump_table_schema("mysql_table_options")
39
- options = %r{create_table "mysql_table_options", force: :cascade, options: "(?<options>.*)"}.match(output)[:options]
40
- assert_match %r{COLLATE=utf8mb4_bin}, options
42
+ expected = /create_table "mysql_table_options", charset: "utf8mb4", collation: "utf8mb4_bin", force: :cascade/
43
+ assert_match expected, output
44
+ end
45
+
46
+ test "charset and collation options" do
47
+ @connection.create_table "mysql_table_options", force: true, charset: "utf8mb4", collation: "utf8mb4_bin"
48
+ output = dump_table_schema("mysql_table_options")
49
+ expected = /create_table "mysql_table_options", charset: "utf8mb4", collation: "utf8mb4_bin", force: :cascade/
50
+ assert_match expected, output
51
+ end
52
+
53
+ test "charset and partitioned table options" do
54
+ @connection.create_table "mysql_table_options", primary_key: ["id", "account_id"], charset: "utf8mb4", collation: "utf8mb4_bin", options: "ENGINE=InnoDB\n/*!50100 PARTITION BY HASH (`account_id`)\nPARTITIONS 128 */", force: :cascade do |t|
55
+ t.bigint "id", null: false, auto_increment: true
56
+ t.bigint "account_id", null: false, unsigned: true
57
+ end
58
+ output = dump_table_schema("mysql_table_options")
59
+ expected = /create_table "mysql_table_options", primary_key: \["id", "account_id"\], charset: "utf8mb4", collation: "utf8mb4_bin", options: "ENGINE=InnoDB\\n(\/\*\!50100)? PARTITION BY HASH \(`account_id`\)\\nPARTITIONS 128( \*\/)?", force: :cascade/
60
+ assert_match expected, output
61
+ end
62
+
63
+ test "schema dump works with NO_TABLE_OPTIONS sql mode" do
64
+ skip "As of MySQL 5.7.22, NO_TABLE_OPTIONS is deprecated. It will be removed in a future version of MySQL." if @connection.database_version >= "5.7.22"
65
+
66
+ old_sql_mode = @connection.query_value("SELECT @@SESSION.sql_mode")
67
+ new_sql_mode = old_sql_mode + ",NO_TABLE_OPTIONS"
68
+
69
+ begin
70
+ @connection.execute("SET @@SESSION.sql_mode='#{new_sql_mode}'")
71
+
72
+ @connection.create_table "mysql_table_options", force: true
73
+ output = dump_table_schema("mysql_table_options")
74
+ assert_no_match %r{options:}, output
75
+ ensure
76
+ @connection.execute("SET @@SESSION.sql_mode='#{old_sql_mode}'")
77
+ end
78
+ end
79
+ end
80
+
81
+ class Mysql2DefaultEngineOptionTest < ActiveRecord::Mysql2TestCase
82
+ include SchemaDumpingHelper
83
+ self.use_transactional_tests = false
84
+
85
+ def setup
86
+ @logger_was = ActiveRecord::Base.logger
87
+ @log = StringIO.new
88
+ @verbose_was = ActiveRecord::Migration.verbose
89
+ ActiveRecord::Base.logger = ActiveSupport::Logger.new(@log)
90
+ ActiveRecord::Migration.verbose = false
91
+ end
92
+
93
+ def teardown
94
+ ActiveRecord::Base.logger = @logger_was
95
+ ActiveRecord::Migration.verbose = @verbose_was
96
+ ActiveRecord::Base.connection.drop_table "mysql_table_options", if_exists: true
97
+ ActiveRecord::SchemaMigration.delete_all rescue nil
98
+ end
99
+
100
+ test "new migrations do not contain default ENGINE=InnoDB option" do
101
+ ActiveRecord::Base.connection.create_table "mysql_table_options", force: true
102
+
103
+ assert_no_match %r{ENGINE=InnoDB}, @log.string
104
+
105
+ output = dump_table_schema("mysql_table_options")
106
+ expected = /create_table "mysql_table_options", charset: "utf8mb4"(?:, collation: "\w+")?, force: :cascade/
107
+ assert_match expected, output
108
+ end
109
+
110
+ test "legacy migrations contain default ENGINE=InnoDB option" do
111
+ migration = Class.new(ActiveRecord::Migration[5.1]) do
112
+ def migrate(x)
113
+ create_table "mysql_table_options", force: true
114
+ end
115
+ end.new
116
+
117
+ ActiveRecord::Migrator.new(:up, [migration], ActiveRecord::Base.connection.schema_migration).migrate
118
+
119
+ assert_match %r{ENGINE=InnoDB}, @log.string
120
+
121
+ output = dump_table_schema("mysql_table_options")
122
+ expected = /create_table "mysql_table_options", charset: "utf8mb4"(?:, collation: "\w+")?, force: :cascade/
123
+ assert_match expected, output
41
124
  end
42
125
  end
@@ -0,0 +1,151 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "support/connection_helper"
5
+
6
+ module ActiveRecord
7
+ class Mysql2TransactionTest < ActiveRecord::Mysql2TestCase
8
+ self.use_transactional_tests = false
9
+
10
+ class Sample < ActiveRecord::Base
11
+ self.table_name = "samples"
12
+ end
13
+
14
+ setup do
15
+ @abort, Thread.abort_on_exception = Thread.abort_on_exception, false
16
+ Thread.report_on_exception, @original_report_on_exception = false, Thread.report_on_exception
17
+
18
+ connection = ActiveRecord::Base.connection
19
+ connection.clear_cache!
20
+
21
+ connection.transaction do
22
+ connection.drop_table "samples", if_exists: true
23
+ connection.create_table("samples") do |t|
24
+ t.integer "value"
25
+ end
26
+ end
27
+
28
+ Sample.reset_column_information
29
+ end
30
+
31
+ teardown do
32
+ ActiveRecord::Base.connection.drop_table "samples", if_exists: true
33
+
34
+ Thread.abort_on_exception = @abort
35
+ Thread.report_on_exception = @original_report_on_exception
36
+ end
37
+
38
+ test "raises Deadlocked when a deadlock is encountered" do
39
+ assert_raises(ActiveRecord::Deadlocked) do
40
+ barrier = Concurrent::CyclicBarrier.new(2)
41
+
42
+ s1 = Sample.create value: 1
43
+ s2 = Sample.create value: 2
44
+
45
+ thread = Thread.new do
46
+ Sample.transaction do
47
+ s1.lock!
48
+ barrier.wait
49
+ s2.update value: 1
50
+ end
51
+ end
52
+
53
+ begin
54
+ Sample.transaction do
55
+ s2.lock!
56
+ barrier.wait
57
+ s1.update value: 2
58
+ end
59
+ ensure
60
+ thread.join
61
+ end
62
+ end
63
+ end
64
+
65
+ test "raises LockWaitTimeout when lock wait timeout exceeded" do
66
+ assert_raises(ActiveRecord::LockWaitTimeout) do
67
+ s = Sample.create!(value: 1)
68
+ latch1 = Concurrent::CountDownLatch.new
69
+ latch2 = Concurrent::CountDownLatch.new
70
+
71
+ thread = Thread.new do
72
+ Sample.transaction do
73
+ Sample.lock.find(s.id)
74
+ latch1.count_down
75
+ latch2.wait
76
+ end
77
+ end
78
+
79
+ begin
80
+ Sample.transaction do
81
+ latch1.wait
82
+ Sample.connection.execute("SET innodb_lock_wait_timeout = 1")
83
+ Sample.lock.find(s.id)
84
+ end
85
+ ensure
86
+ Sample.connection.execute("SET innodb_lock_wait_timeout = DEFAULT")
87
+ latch2.count_down
88
+ thread.join
89
+ end
90
+ end
91
+ end
92
+
93
+ test "raises StatementTimeout when statement timeout exceeded" do
94
+ skip unless ActiveRecord::Base.connection.show_variable("max_execution_time")
95
+ error = assert_raises(ActiveRecord::StatementTimeout) do
96
+ s = Sample.create!(value: 1)
97
+ latch1 = Concurrent::CountDownLatch.new
98
+ latch2 = Concurrent::CountDownLatch.new
99
+
100
+ thread = Thread.new do
101
+ Sample.transaction do
102
+ Sample.lock.find(s.id)
103
+ latch1.count_down
104
+ latch2.wait
105
+ end
106
+ end
107
+
108
+ begin
109
+ Sample.transaction do
110
+ latch1.wait
111
+ Sample.connection.execute("SET max_execution_time = 1")
112
+ Sample.lock.find(s.id)
113
+ end
114
+ ensure
115
+ Sample.connection.execute("SET max_execution_time = DEFAULT")
116
+ latch2.count_down
117
+ thread.join
118
+ end
119
+ end
120
+ assert_kind_of ActiveRecord::QueryAborted, error
121
+ end
122
+
123
+ test "raises QueryCanceled when canceling statement due to user request" do
124
+ error = assert_raises(ActiveRecord::QueryCanceled) do
125
+ s = Sample.create!(value: 1)
126
+ latch = Concurrent::CountDownLatch.new
127
+
128
+ thread = Thread.new do
129
+ Sample.transaction do
130
+ Sample.lock.find(s.id)
131
+ latch.count_down
132
+ sleep(0.5)
133
+ conn = Sample.connection
134
+ pid = conn.query_value("SELECT id FROM information_schema.processlist WHERE info LIKE '% FOR UPDATE'")
135
+ conn.execute("KILL QUERY #{pid}")
136
+ end
137
+ end
138
+
139
+ begin
140
+ Sample.transaction do
141
+ latch.wait
142
+ Sample.lock.find(s.id)
143
+ end
144
+ ensure
145
+ thread.join
146
+ end
147
+ end
148
+ assert_kind_of ActiveRecord::QueryAborted, error
149
+ end
150
+ end
151
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
4
  require "support/schema_dumping_helper"
3
5
 
@@ -15,6 +17,7 @@ class Mysql2UnsignedTypeTest < ActiveRecord::Mysql2TestCase
15
17
  t.bigint :unsigned_bigint, unsigned: true
16
18
  t.float :unsigned_float, unsigned: true
17
19
  t.decimal :unsigned_decimal, unsigned: true, precision: 10, scale: 2
20
+ t.column :unsigned_zerofill, "int unsigned zerofill"
18
21
  end
19
22
  end
20
23
 
@@ -34,10 +37,10 @@ class Mysql2UnsignedTypeTest < ActiveRecord::Mysql2TestCase
34
37
  assert_raise(ActiveModel::RangeError) do
35
38
  UnsignedType.create(unsigned_bigint: -10)
36
39
  end
37
- assert_raise(ActiveRecord::StatementInvalid) do
40
+ assert_raise(ActiveRecord::RangeError) do
38
41
  UnsignedType.create(unsigned_float: -10.0)
39
42
  end
40
- assert_raise(ActiveRecord::StatementInvalid) do
43
+ assert_raise(ActiveRecord::RangeError) do
41
44
  UnsignedType.create(unsigned_decimal: -10.0)
42
45
  end
43
46
  end
@@ -48,19 +51,18 @@ class Mysql2UnsignedTypeTest < ActiveRecord::Mysql2TestCase
48
51
  t.unsigned_bigint :unsigned_bigint_t
49
52
  t.unsigned_float :unsigned_float_t
50
53
  t.unsigned_decimal :unsigned_decimal_t, precision: 10, scale: 2
51
- t.column :unsigned_zerofill, "int unsigned zerofill"
52
54
  end
53
55
 
54
- @connection.columns("unsigned_types").select { |c| /^unsigned_/ === c.name }.each do |column|
55
- assert column.unsigned?
56
+ @connection.columns("unsigned_types").select { |c| /^unsigned_/.match?(c.name) }.each do |column|
57
+ assert_predicate column, :unsigned?
56
58
  end
57
59
  end
58
60
 
59
61
  test "schema dump includes unsigned option" do
60
62
  schema = dump_table_schema "unsigned_types"
61
- assert_match %r{t.integer\s+"unsigned_integer",\s+unsigned: true$}, schema
62
- assert_match %r{t.bigint\s+"unsigned_bigint",\s+unsigned: true$}, schema
63
- assert_match %r{t.float\s+"unsigned_float",\s+limit: 24,\s+unsigned: true$}, schema
64
- assert_match %r{t.decimal\s+"unsigned_decimal",\s+precision: 10,\s+scale: 2,\s+unsigned: true$}, schema
63
+ assert_match %r{t\.integer\s+"unsigned_integer",\s+unsigned: true$}, schema
64
+ assert_match %r{t\.bigint\s+"unsigned_bigint",\s+unsigned: true$}, schema
65
+ assert_match %r{t\.float\s+"unsigned_float",\s+unsigned: true$}, schema
66
+ assert_match %r{t\.decimal\s+"unsigned_decimal",\s+precision: 10,\s+scale: 2,\s+unsigned: true$}, schema
65
67
  end
66
68
  end