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,13 +1,24 @@
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 Mysql2ActiveSchemaTest < ActiveRecord::Mysql2TestCase
5
7
  include ConnectionHelper
6
8
 
7
9
  def setup
10
+ ActiveRecord::Base.connection.send(:default_row_format)
8
11
  ActiveRecord::Base.connection.singleton_class.class_eval do
9
12
  alias_method :execute_without_stub, :execute
10
- def execute(sql, name = nil) return sql end
13
+ def execute(sql, name = nil)
14
+ ActiveSupport::Notifications.instrumenter.instrument(
15
+ "sql.active_record",
16
+ sql: sql,
17
+ name: name,
18
+ connection: self) do
19
+ sql
20
+ end
21
+ end
11
22
  end
12
23
  end
13
24
 
@@ -16,87 +27,91 @@ class Mysql2ActiveSchemaTest < ActiveRecord::Mysql2TestCase
16
27
  end
17
28
 
18
29
  def test_add_index
19
- # add_index calls data_source_exists? and index_name_exists? which can't work since execute is stubbed
20
- def (ActiveRecord::Base.connection).data_source_exists?(*); true; end
21
- def (ActiveRecord::Base.connection).index_name_exists?(*); false; end
30
+ expected = "CREATE INDEX `index_people_on_last_name` ON `people` (`last_name`)"
31
+ assert_equal expected, add_index(:people, :last_name, length: nil)
22
32
 
23
- expected = "CREATE INDEX `index_people_on_last_name` ON `people` (`last_name`) "
24
- assert_equal expected, add_index(:people, :last_name, :length => nil)
33
+ expected = "CREATE INDEX `index_people_on_last_name` ON `people` (`last_name`(10))"
34
+ assert_equal expected, add_index(:people, :last_name, length: 10)
25
35
 
26
- expected = "CREATE INDEX `index_people_on_last_name` ON `people` (`last_name`(10)) "
27
- assert_equal expected, add_index(:people, :last_name, :length => 10)
28
-
29
- expected = "CREATE INDEX `index_people_on_last_name_and_first_name` ON `people` (`last_name`(15), `first_name`(15)) "
36
+ expected = "CREATE INDEX `index_people_on_last_name_and_first_name` ON `people` (`last_name`(15), `first_name`(15))"
30
37
  assert_equal expected, add_index(:people, [:last_name, :first_name], length: 15)
31
38
  assert_equal expected, add_index(:people, ["last_name", "first_name"], length: 15)
32
39
 
33
- expected = "CREATE INDEX `index_people_on_last_name_and_first_name` ON `people` (`last_name`(15), `first_name`) "
40
+ expected = "CREATE INDEX `index_people_on_last_name_and_first_name` ON `people` (`last_name`(15), `first_name`)"
34
41
  assert_equal expected, add_index(:people, [:last_name, :first_name], length: { last_name: 15 })
35
42
  assert_equal expected, add_index(:people, ["last_name", "first_name"], length: { last_name: 15 })
36
43
 
37
- expected = "CREATE INDEX `index_people_on_last_name_and_first_name` ON `people` (`last_name`(15), `first_name`(10)) "
44
+ expected = "CREATE INDEX `index_people_on_last_name_and_first_name` ON `people` (`last_name`(15), `first_name`(10))"
38
45
  assert_equal expected, add_index(:people, [:last_name, :first_name], length: { last_name: 15, first_name: 10 })
39
46
  assert_equal expected, add_index(:people, ["last_name", :first_name], length: { last_name: 15, "first_name" => 10 })
40
47
 
41
48
  %w(SPATIAL FULLTEXT UNIQUE).each do |type|
42
- expected = "CREATE #{type} INDEX `index_people_on_last_name` ON `people` (`last_name`) "
43
- assert_equal expected, add_index(:people, :last_name, :type => type)
49
+ expected = "CREATE #{type} INDEX `index_people_on_last_name` ON `people` (`last_name`)"
50
+ assert_equal expected, add_index(:people, :last_name, type: type)
44
51
  end
45
52
 
46
53
  %w(btree hash).each do |using|
47
- expected = "CREATE INDEX `index_people_on_last_name` USING #{using} ON `people` (`last_name`) "
48
- assert_equal expected, add_index(:people, :last_name, :using => using)
54
+ expected = "CREATE INDEX `index_people_on_last_name` USING #{using} ON `people` (`last_name`)"
55
+ assert_equal expected, add_index(:people, :last_name, using: using)
56
+ end
57
+
58
+ expected = "CREATE INDEX `index_people_on_last_name` USING btree ON `people` (`last_name`(10))"
59
+ assert_equal expected, add_index(:people, :last_name, length: 10, using: :btree)
60
+
61
+ %i(default copy inplace instant).each do |algorithm|
62
+ expected = "CREATE INDEX `index_people_on_last_name` USING btree ON `people` (`last_name`(10)) ALGORITHM = #{algorithm.upcase}"
63
+ assert_equal expected, add_index(:people, :last_name, length: 10, using: :btree, algorithm: algorithm)
49
64
  end
50
65
 
51
- expected = "CREATE INDEX `index_people_on_last_name` USING btree ON `people` (`last_name`(10)) "
52
- assert_equal expected, add_index(:people, :last_name, :length => 10, :using => :btree)
66
+ with_real_execute do
67
+ add_index(:people, :first_name)
68
+ assert index_exists?(:people, :first_name)
53
69
 
54
- expected = "CREATE INDEX `index_people_on_last_name` USING btree ON `people` (`last_name`(10)) ALGORITHM = COPY"
55
- assert_equal expected, add_index(:people, :last_name, :length => 10, using: :btree, algorithm: :copy)
70
+ assert_nothing_raised do
71
+ add_index(:people, :first_name, if_not_exists: true)
72
+ end
73
+ end
56
74
 
57
75
  assert_raise ArgumentError do
58
76
  add_index(:people, :last_name, algorithm: :coyp)
59
77
  end
60
78
 
61
- expected = "CREATE INDEX `index_people_on_last_name_and_first_name` USING btree ON `people` (`last_name`(15), `first_name`(15)) "
62
- assert_equal expected, add_index(:people, [:last_name, :first_name], :length => 15, :using => :btree)
79
+ expected = "CREATE INDEX `index_people_on_last_name_and_first_name` USING btree ON `people` (`last_name`(15), `first_name`(15))"
80
+ assert_equal expected, add_index(:people, [:last_name, :first_name], length: 15, using: :btree)
63
81
  end
64
82
 
65
83
  def test_index_in_create
66
- def (ActiveRecord::Base.connection).data_source_exists?(*); false; end
67
-
68
84
  %w(SPATIAL FULLTEXT UNIQUE).each do |type|
69
- expected = "CREATE TABLE `people` (#{type} INDEX `index_people_on_last_name` (`last_name`)) ENGINE=InnoDB"
85
+ expected = /\ACREATE TABLE `people` \(#{type} INDEX `index_people_on_last_name` \(`last_name`\)\)/
70
86
  actual = ActiveRecord::Base.connection.create_table(:people, id: false) do |t|
71
87
  t.index :last_name, type: type
72
88
  end
73
- assert_equal expected, actual
89
+ assert_match expected, actual
74
90
  end
75
91
 
76
- expected = "CREATE TABLE `people` ( INDEX `index_people_on_last_name` USING btree (`last_name`(10))) ENGINE=InnoDB"
92
+ expected = /\ACREATE TABLE `people` \(INDEX `index_people_on_last_name` USING btree \(`last_name`\(10\)\)\)/
77
93
  actual = ActiveRecord::Base.connection.create_table(:people, id: false) do |t|
78
94
  t.index :last_name, length: 10, using: :btree
79
95
  end
80
- assert_equal expected, actual
96
+ assert_match expected, actual
81
97
  end
82
98
 
83
99
  def test_index_in_bulk_change
84
- def (ActiveRecord::Base.connection).data_source_exists?(*); true; end
85
- def (ActiveRecord::Base.connection).index_name_exists?(*); false; end
86
-
87
100
  %w(SPATIAL FULLTEXT UNIQUE).each do |type|
88
- expected = "ALTER TABLE `people` ADD #{type} INDEX `index_people_on_last_name` (`last_name`)"
89
- actual = ActiveRecord::Base.connection.change_table(:people, bulk: true) do |t|
90
- t.index :last_name, type: type
101
+ expected = "ALTER TABLE `people` ADD #{type} INDEX `index_people_on_last_name` (`last_name`)"
102
+ assert_sql(expected) do
103
+ ActiveRecord::Base.connection.change_table(:people, bulk: true) do |t|
104
+ t.index :last_name, type: type
105
+ end
91
106
  end
92
- assert_equal expected, actual
93
107
  end
94
108
 
95
- expected = "ALTER TABLE `peaple` ADD INDEX `index_peaple_on_last_name` USING btree (`last_name`(10)), ALGORITHM = COPY"
96
- actual = ActiveRecord::Base.connection.change_table(:peaple, bulk: true) do |t|
97
- t.index :last_name, length: 10, using: :btree, algorithm: :copy
109
+ expected = "ALTER TABLE `people` ADD INDEX `index_people_on_last_name` USING btree (`last_name`(10)), ALGORITHM = COPY"
110
+ assert_sql(expected) do
111
+ ActiveRecord::Base.connection.change_table(:people, bulk: true) do |t|
112
+ t.index :last_name, length: 10, using: :btree, algorithm: :copy
113
+ end
98
114
  end
99
- assert_equal expected, actual
100
115
  end
101
116
 
102
117
  def test_drop_table
@@ -104,14 +119,20 @@ class Mysql2ActiveSchemaTest < ActiveRecord::Mysql2TestCase
104
119
  end
105
120
 
106
121
  def test_create_mysql_database_with_encoding
107
- assert_equal "CREATE DATABASE `matt` DEFAULT CHARACTER SET `utf8`", create_database(:matt)
108
- assert_equal "CREATE DATABASE `aimonetti` DEFAULT CHARACTER SET `latin1`", create_database(:aimonetti, {:charset => 'latin1'})
109
- assert_equal "CREATE DATABASE `matt_aimonetti` DEFAULT CHARACTER SET `big5` COLLATE `big5_chinese_ci`", create_database(:matt_aimonetti, {:charset => :big5, :collation => :big5_chinese_ci})
122
+ if ActiveRecord::Base.connection.send(:row_format_dynamic_by_default?)
123
+ assert_equal "CREATE DATABASE `matt` DEFAULT CHARACTER SET `utf8mb4`", create_database(:matt)
124
+ else
125
+ error = assert_raises(RuntimeError) { create_database(:matt) }
126
+ expected = "Configure a supported :charset and ensure innodb_large_prefix is enabled to support indexes on varchar(255) string columns."
127
+ assert_equal expected, error.message
128
+ end
129
+ assert_equal "CREATE DATABASE `aimonetti` DEFAULT CHARACTER SET `latin1`", create_database(:aimonetti, charset: "latin1")
130
+ assert_equal "CREATE DATABASE `matt_aimonetti` DEFAULT COLLATE `utf8mb4_bin`", create_database(:matt_aimonetti, collation: "utf8mb4_bin")
110
131
  end
111
132
 
112
133
  def test_recreate_mysql_database_with_encoding
113
- create_database(:luca, {:charset => 'latin1'})
114
- assert_equal "CREATE DATABASE `luca` DEFAULT CHARACTER SET `latin1`", recreate_database(:luca, {:charset => 'latin1'})
134
+ create_database(:luca, charset: "latin1")
135
+ assert_equal "CREATE DATABASE `luca` DEFAULT CHARACTER SET `latin1`", recreate_database(:luca, charset: "latin1")
115
136
  end
116
137
 
117
138
  def test_add_column
@@ -119,51 +140,44 @@ class Mysql2ActiveSchemaTest < ActiveRecord::Mysql2TestCase
119
140
  end
120
141
 
121
142
  def test_add_column_with_limit
122
- assert_equal "ALTER TABLE `people` ADD `key` varchar(32)", add_column(:people, :key, :string, :limit => 32)
143
+ assert_equal "ALTER TABLE `people` ADD `key` varchar(32)", add_column(:people, :key, :string, limit: 32)
123
144
  end
124
145
 
125
146
  def test_drop_table_with_specific_database
126
- assert_equal "DROP TABLE `otherdb`.`people`", drop_table('otherdb.people')
147
+ assert_equal "DROP TABLE `otherdb`.`people`", drop_table("otherdb.people")
127
148
  end
128
149
 
129
150
  def test_add_timestamps
130
151
  with_real_execute do
131
- begin
132
- ActiveRecord::Base.connection.create_table :delete_me
133
- ActiveRecord::Base.connection.add_timestamps :delete_me, null: true
134
- assert column_present?('delete_me', 'updated_at', 'datetime')
135
- assert column_present?('delete_me', 'created_at', 'datetime')
136
- ensure
137
- ActiveRecord::Base.connection.drop_table :delete_me rescue nil
138
- end
152
+ ActiveRecord::Base.connection.create_table :delete_me
153
+ ActiveRecord::Base.connection.add_timestamps :delete_me, null: true
154
+ assert column_exists?("delete_me", "updated_at", "datetime")
155
+ assert column_exists?("delete_me", "created_at", "datetime")
156
+ ensure
157
+ ActiveRecord::Base.connection.drop_table :delete_me rescue nil
139
158
  end
140
159
  end
141
160
 
142
161
  def test_remove_timestamps
143
162
  with_real_execute do
144
- begin
145
- ActiveRecord::Base.connection.create_table :delete_me do |t|
146
- t.timestamps null: true
147
- end
148
- ActiveRecord::Base.connection.remove_timestamps :delete_me, { null: true }
149
- assert !column_present?('delete_me', 'updated_at', 'datetime')
150
- assert !column_present?('delete_me', 'created_at', 'datetime')
151
- ensure
152
- ActiveRecord::Base.connection.drop_table :delete_me rescue nil
163
+ ActiveRecord::Base.connection.create_table :delete_me do |t|
164
+ t.timestamps null: true
153
165
  end
166
+ ActiveRecord::Base.connection.remove_timestamps :delete_me, null: true
167
+ assert_not column_exists?("delete_me", "updated_at", "datetime")
168
+ assert_not column_exists?("delete_me", "created_at", "datetime")
169
+ ensure
170
+ ActiveRecord::Base.connection.drop_table :delete_me rescue nil
154
171
  end
155
172
  end
156
173
 
157
174
  def test_indexes_in_create
158
- ActiveRecord::Base.connection.stubs(:data_source_exists?).with(:temp).returns(false)
159
- ActiveRecord::Base.connection.stubs(:index_name_exists?).with(:index_temp_on_zip).returns(false)
160
-
161
- expected = "CREATE TEMPORARY TABLE `temp` ( INDEX `index_temp_on_zip` (`zip`)) ENGINE=InnoDB AS SELECT id, name, zip FROM a_really_complicated_query"
175
+ expected = /\ACREATE TEMPORARY TABLE `temp` \(INDEX `index_temp_on_zip` \(`zip`\)\)(?: ROW_FORMAT=DYNAMIC)? AS SELECT id, name, zip FROM a_really_complicated_query/
162
176
  actual = ActiveRecord::Base.connection.create_table(:temp, temporary: true, as: "SELECT id, name, zip FROM a_really_complicated_query") do |t|
163
177
  t.index :zip
164
178
  end
165
179
 
166
- assert_equal expected, actual
180
+ assert_match expected, actual
167
181
  end
168
182
 
169
183
  private
@@ -183,11 +197,7 @@ class Mysql2ActiveSchemaTest < ActiveRecord::Mysql2TestCase
183
197
  end
184
198
 
185
199
  def method_missing(method_symbol, *arguments)
186
- ActiveRecord::Base.connection.send(method_symbol, *arguments)
187
- end
188
-
189
- def column_present?(table_name, column_name, type)
190
- results = ActiveRecord::Base.connection.select_all("SHOW FIELDS FROM #{table_name} LIKE '#{column_name}'")
191
- results.first && results.first['Type'] == type
200
+ ActiveRecord::Base.connection.public_send(method_symbol, *arguments)
192
201
  end
202
+ ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
193
203
  end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "support/schema_dumping_helper"
5
+
6
+ class Mysql2AutoIncrementTest < ActiveRecord::Mysql2TestCase
7
+ include SchemaDumpingHelper
8
+
9
+ def setup
10
+ @connection = ActiveRecord::Base.connection
11
+ end
12
+
13
+ def teardown
14
+ @connection.drop_table :auto_increments, if_exists: true
15
+ end
16
+
17
+ def test_auto_increment_without_primary_key
18
+ @connection.create_table :auto_increments, id: false, force: true do |t|
19
+ t.integer :id, null: false, auto_increment: true
20
+ t.index :id
21
+ end
22
+ output = dump_table_schema("auto_increments")
23
+ assert_match(/t\.integer\s+"id",\s+null: false,\s+auto_increment: true$/, output)
24
+ end
25
+
26
+ def test_auto_increment_with_composite_primary_key
27
+ @connection.create_table :auto_increments, primary_key: [:id, :created_at], force: true do |t|
28
+ t.integer :id, null: false, auto_increment: true
29
+ t.datetime :created_at, null: false
30
+ end
31
+ output = dump_table_schema("auto_increments")
32
+ assert_match(/t\.integer\s+"id",\s+null: false,\s+auto_increment: true$/, output)
33
+ end
34
+ end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/topic'
4
+ require "models/topic"
3
5
 
4
6
  module ActiveRecord
5
7
  module ConnectionAdapters
@@ -20,7 +22,7 @@ module ActiveRecord
20
22
 
21
23
  def test_create_question_marks
22
24
  str = "foo?bar"
23
- x = Topic.create!(:title => str, :content => str)
25
+ x = Topic.create!(title: str, content: str)
24
26
  x.reload
25
27
  assert_equal str, x.title
26
28
  assert_equal str, x.content
@@ -39,7 +41,7 @@ module ActiveRecord
39
41
 
40
42
  def test_create_null_bytes
41
43
  str = "foo\0bar"
42
- x = Topic.create!(:title => str, :content => str)
44
+ x = Topic.create!(title: str, content: str)
43
45
  x.reload
44
46
  assert_equal str, x.title
45
47
  assert_equal str, x.content
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
4
 
3
5
  class Mysql2BooleanTest < ActiveRecord::Mysql2TestCase
@@ -38,7 +40,7 @@ class Mysql2BooleanTest < ActiveRecord::Mysql2TestCase
38
40
  assert_equal :string, string_column.type
39
41
  end
40
42
 
41
- test "test type casting with emulated booleans" do
43
+ test "type casting with emulated booleans" do
42
44
  emulate_booleans true
43
45
 
44
46
  boolean = BooleanType.create!(archived: true, published: true)
@@ -55,7 +57,7 @@ class Mysql2BooleanTest < ActiveRecord::Mysql2TestCase
55
57
  assert_equal 0, @connection.type_cast(false)
56
58
  end
57
59
 
58
- test "test type casting without emulated booleans" do
60
+ test "type casting without emulated booleans" do
59
61
  emulate_booleans false
60
62
 
61
63
  boolean = BooleanType.create!(archived: true, published: true)
@@ -86,11 +88,11 @@ class Mysql2BooleanTest < ActiveRecord::Mysql2TestCase
86
88
  end
87
89
 
88
90
  def boolean_column
89
- BooleanType.columns.find { |c| c.name == 'archived' }
91
+ BooleanType.columns.find { |c| c.name == "archived" }
90
92
  end
91
93
 
92
94
  def string_column
93
- BooleanType.columns.find { |c| c.name == 'published' }
95
+ BooleanType.columns.find { |c| c.name == "published" }
94
96
  end
95
97
 
96
98
  def emulate_booleans(value)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
4
 
3
5
  class Mysql2CaseSensitivityTest < ActiveRecord::Mysql2TestCase
@@ -7,56 +9,56 @@ class Mysql2CaseSensitivityTest < ActiveRecord::Mysql2TestCase
7
9
  repair_validations(CollationTest)
8
10
 
9
11
  def test_columns_include_collation_different_from_table
10
- assert_equal 'utf8_bin', CollationTest.columns_hash['string_cs_column'].collation
11
- assert_equal 'utf8_general_ci', CollationTest.columns_hash['string_ci_column'].collation
12
+ assert_equal "utf8mb4_bin", CollationTest.columns_hash["string_cs_column"].collation
13
+ assert_equal "utf8mb4_general_ci", CollationTest.columns_hash["string_ci_column"].collation
12
14
  end
13
15
 
14
16
  def test_case_sensitive
15
- assert !CollationTest.columns_hash['string_ci_column'].case_sensitive?
16
- assert CollationTest.columns_hash['string_cs_column'].case_sensitive?
17
+ assert_not_predicate CollationTest.columns_hash["string_ci_column"], :case_sensitive?
18
+ assert_predicate CollationTest.columns_hash["string_cs_column"], :case_sensitive?
17
19
  end
18
20
 
19
21
  def test_case_insensitive_comparison_for_ci_column
20
- CollationTest.validates_uniqueness_of(:string_ci_column, :case_sensitive => false)
21
- CollationTest.create!(:string_ci_column => 'A')
22
- invalid = CollationTest.new(:string_ci_column => 'a')
23
- queries = assert_sql { invalid.save }
22
+ CollationTest.validates_uniqueness_of(:string_ci_column, case_sensitive: false)
23
+ CollationTest.create!(string_ci_column: "A")
24
+ invalid = CollationTest.new(string_ci_column: "a")
25
+ queries = capture_sql { invalid.save }
24
26
  ci_uniqueness_query = queries.detect { |q| q.match(/string_ci_column/) }
25
27
  assert_no_match(/lower/i, ci_uniqueness_query)
26
28
  end
27
29
 
28
30
  def test_case_insensitive_comparison_for_cs_column
29
- CollationTest.validates_uniqueness_of(:string_cs_column, :case_sensitive => false)
30
- CollationTest.create!(:string_cs_column => 'A')
31
- invalid = CollationTest.new(:string_cs_column => 'a')
32
- queries = assert_sql { invalid.save }
33
- cs_uniqueness_query = queries.detect { |q| q.match(/string_cs_column/)}
31
+ CollationTest.validates_uniqueness_of(:string_cs_column, case_sensitive: false)
32
+ CollationTest.create!(string_cs_column: "A")
33
+ invalid = CollationTest.new(string_cs_column: "a")
34
+ queries = capture_sql { invalid.save }
35
+ cs_uniqueness_query = queries.detect { |q| q.match(/string_cs_column/) }
34
36
  assert_match(/lower/i, cs_uniqueness_query)
35
37
  end
36
38
 
37
39
  def test_case_sensitive_comparison_for_ci_column
38
- CollationTest.validates_uniqueness_of(:string_ci_column, :case_sensitive => true)
39
- CollationTest.create!(:string_ci_column => 'A')
40
- invalid = CollationTest.new(:string_ci_column => 'A')
41
- queries = assert_sql { invalid.save }
40
+ CollationTest.validates_uniqueness_of(:string_ci_column, case_sensitive: true)
41
+ CollationTest.create!(string_ci_column: "A")
42
+ invalid = CollationTest.new(string_ci_column: "A")
43
+ queries = capture_sql { invalid.save }
42
44
  ci_uniqueness_query = queries.detect { |q| q.match(/string_ci_column/) }
43
45
  assert_match(/binary/i, ci_uniqueness_query)
44
46
  end
45
47
 
46
48
  def test_case_sensitive_comparison_for_cs_column
47
- CollationTest.validates_uniqueness_of(:string_cs_column, :case_sensitive => true)
48
- CollationTest.create!(:string_cs_column => 'A')
49
- invalid = CollationTest.new(:string_cs_column => 'A')
50
- queries = assert_sql { invalid.save }
49
+ CollationTest.validates_uniqueness_of(:string_cs_column, case_sensitive: true)
50
+ CollationTest.create!(string_cs_column: "A")
51
+ invalid = CollationTest.new(string_cs_column: "A")
52
+ queries = capture_sql { invalid.save }
51
53
  cs_uniqueness_query = queries.detect { |q| q.match(/string_cs_column/) }
52
54
  assert_no_match(/binary/i, cs_uniqueness_query)
53
55
  end
54
56
 
55
57
  def test_case_sensitive_comparison_for_binary_column
56
58
  CollationTest.validates_uniqueness_of(:binary_column, case_sensitive: true)
57
- CollationTest.create!(binary_column: 'A')
58
- invalid = CollationTest.new(binary_column: 'A')
59
- queries = assert_sql { invalid.save }
59
+ CollationTest.create!(binary_column: "A")
60
+ invalid = CollationTest.new(binary_column: "A")
61
+ queries = capture_sql { invalid.save }
60
62
  bin_uniqueness_query = queries.detect { |q| q.match(/binary_column/) }
61
63
  assert_no_match(/\bBINARY\b/, bin_uniqueness_query)
62
64
  end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'support/schema_dumping_helper'
4
+ require "support/schema_dumping_helper"
3
5
 
4
6
  class Mysql2CharsetCollationTest < ActiveRecord::Mysql2TestCase
5
7
  include SchemaDumpingHelper
@@ -7,9 +9,9 @@ class Mysql2CharsetCollationTest < ActiveRecord::Mysql2TestCase
7
9
 
8
10
  setup do
9
11
  @connection = ActiveRecord::Base.connection
10
- @connection.create_table :charset_collations, force: true do |t|
11
- t.string :string_ascii_bin, charset: 'ascii', collation: 'ascii_bin'
12
- t.text :text_ucs2_unicode_ci, charset: 'ucs2', collation: 'ucs2_unicode_ci'
12
+ @connection.create_table :charset_collations, id: { type: :string, collation: "utf8mb4_bin" }, force: true do |t|
13
+ t.string :string_ascii_bin, charset: "ascii", collation: "ascii_bin"
14
+ t.text :text_ucs2_unicode_ci, charset: "ucs2", collation: "ucs2_unicode_ci"
13
15
  end
14
16
  end
15
17
 
@@ -18,37 +20,38 @@ class Mysql2CharsetCollationTest < ActiveRecord::Mysql2TestCase
18
20
  end
19
21
 
20
22
  test "string column with charset and collation" do
21
- column = @connection.columns(:charset_collations).find { |c| c.name == 'string_ascii_bin' }
23
+ column = @connection.columns(:charset_collations).find { |c| c.name == "string_ascii_bin" }
22
24
  assert_equal :string, column.type
23
- assert_equal 'ascii_bin', column.collation
25
+ assert_equal "ascii_bin", column.collation
24
26
  end
25
27
 
26
28
  test "text column with charset and collation" do
27
- column = @connection.columns(:charset_collations).find { |c| c.name == 'text_ucs2_unicode_ci' }
29
+ column = @connection.columns(:charset_collations).find { |c| c.name == "text_ucs2_unicode_ci" }
28
30
  assert_equal :text, column.type
29
- assert_equal 'ucs2_unicode_ci', column.collation
31
+ assert_equal "ucs2_unicode_ci", column.collation
30
32
  end
31
33
 
32
34
  test "add column with charset and collation" do
33
- @connection.add_column :charset_collations, :title, :string, charset: 'utf8', collation: 'utf8_bin'
35
+ @connection.add_column :charset_collations, :title, :string, charset: "utf8mb4", collation: "utf8mb4_bin"
34
36
 
35
- column = @connection.columns(:charset_collations).find { |c| c.name == 'title' }
37
+ column = @connection.columns(:charset_collations).find { |c| c.name == "title" }
36
38
  assert_equal :string, column.type
37
- assert_equal 'utf8_bin', column.collation
39
+ assert_equal "utf8mb4_bin", column.collation
38
40
  end
39
41
 
40
42
  test "change column with charset and collation" do
41
- @connection.add_column :charset_collations, :description, :string, charset: 'utf8', collation: 'utf8_unicode_ci'
42
- @connection.change_column :charset_collations, :description, :text, charset: 'utf8', collation: 'utf8_general_ci'
43
+ @connection.add_column :charset_collations, :description, :string, charset: "utf8mb4", collation: "utf8mb4_unicode_ci"
44
+ @connection.change_column :charset_collations, :description, :text, charset: "utf8mb4", collation: "utf8mb4_general_ci"
43
45
 
44
- column = @connection.columns(:charset_collations).find { |c| c.name == 'description' }
46
+ column = @connection.columns(:charset_collations).find { |c| c.name == "description" }
45
47
  assert_equal :text, column.type
46
- assert_equal 'utf8_general_ci', column.collation
48
+ assert_equal "utf8mb4_general_ci", column.collation
47
49
  end
48
50
 
49
51
  test "schema dump includes collation" do
50
52
  output = dump_table_schema("charset_collations")
51
- assert_match %r{t.string\s+"string_ascii_bin",\s+collation: "ascii_bin"$}, output
52
- assert_match %r{t.text\s+"text_ucs2_unicode_ci",\s+limit: 65535,\s+collation: "ucs2_unicode_ci"$}, output
53
+ assert_match %r/create_table "charset_collations", id: { type: :string, collation: "utf8mb4_bin" }/, output
54
+ assert_match %r{t\.string\s+"string_ascii_bin",\s+collation: "ascii_bin"$}, output
55
+ assert_match %r{t\.text\s+"text_ucs2_unicode_ci",\s+collation: "ucs2_unicode_ci"$}, output
53
56
  end
54
57
  end