ibm_db 5.2.0-x86-mingw32 → 5.4.0-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 (625) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/README +1 -1
  5. data/debug.log +1 -0
  6. data/ext/Makefile +28 -24
  7. data/ext/ibm_db.c +66 -65
  8. data/ext/ibm_db.o +0 -0
  9. data/ext/ibm_db.so +0 -0
  10. data/ext/mkmf.log +26 -24
  11. data/ext/ruby_ibm_db_cli.c +1 -0
  12. data/ext/ruby_ibm_db_cli.o +0 -0
  13. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1520 -1282
  14. data/lib/ibm_db.so +1 -0
  15. data/lib/mswin32/ibm_db.rb +3 -1
  16. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  17. data/lib/mswin32/rb3x/i386/ruby31/ibm_db.so +0 -0
  18. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  19. data/test/activejob/destroy_association_async_test.rb +305 -0
  20. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  21. data/test/activejob/helper.rb +15 -0
  22. data/test/assets/schema_dump_5_1.yml +345 -0
  23. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  24. data/test/cases/adapter_test.rb +432 -218
  25. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  26. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  27. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  28. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  29. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  30. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  31. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  32. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  33. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  34. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  35. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  36. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  37. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  38. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  39. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  40. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  41. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  42. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  43. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  44. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  45. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  46. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  47. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  48. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  49. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  50. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  51. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  52. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  53. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  54. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  55. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  56. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  57. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  58. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  59. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  60. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  61. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  62. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  63. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  64. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  65. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  66. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  67. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  68. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  69. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  70. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  71. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  72. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  73. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  74. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  75. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  76. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  77. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  78. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  79. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  80. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  81. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  82. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  83. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  84. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  85. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  86. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  87. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  88. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  89. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  90. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  91. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  92. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  93. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  94. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  95. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  96. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  97. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  98. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  99. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  100. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  101. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  102. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  103. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  104. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  105. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  106. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  107. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  108. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  109. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  110. data/test/cases/aggregations_test.rb +14 -12
  111. data/test/cases/annotate_test.rb +46 -0
  112. data/test/cases/ar_schema_test.rb +153 -86
  113. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  114. data/test/cases/arel/attributes/math_test.rb +83 -0
  115. data/test/cases/arel/attributes_test.rb +27 -0
  116. data/test/cases/arel/collectors/bind_test.rb +40 -0
  117. data/test/cases/arel/collectors/composite_test.rb +47 -0
  118. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  119. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  120. data/test/cases/arel/crud_test.rb +65 -0
  121. data/test/cases/arel/delete_manager_test.rb +53 -0
  122. data/test/cases/arel/factory_methods_test.rb +46 -0
  123. data/test/cases/arel/helper.rb +45 -0
  124. data/test/cases/arel/insert_manager_test.rb +241 -0
  125. data/test/cases/arel/nodes/and_test.rb +30 -0
  126. data/test/cases/arel/nodes/as_test.rb +36 -0
  127. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  128. data/test/cases/arel/nodes/bin_test.rb +35 -0
  129. data/test/cases/arel/nodes/binary_test.rb +29 -0
  130. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  131. data/test/cases/arel/nodes/case_test.rb +96 -0
  132. data/test/cases/arel/nodes/casted_test.rb +18 -0
  133. data/test/cases/arel/nodes/comment_test.rb +22 -0
  134. data/test/cases/arel/nodes/count_test.rb +35 -0
  135. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  136. data/test/cases/arel/nodes/descending_test.rb +46 -0
  137. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  138. data/test/cases/arel/nodes/equality_test.rb +62 -0
  139. data/test/cases/arel/nodes/extract_test.rb +43 -0
  140. data/test/cases/arel/nodes/false_test.rb +21 -0
  141. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  142. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  143. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  144. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  145. data/test/cases/arel/nodes/node_test.rb +22 -0
  146. data/test/cases/arel/nodes/not_test.rb +31 -0
  147. data/test/cases/arel/nodes/or_test.rb +36 -0
  148. data/test/cases/arel/nodes/over_test.rb +69 -0
  149. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  150. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  151. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  152. data/test/cases/arel/nodes/sum_test.rb +35 -0
  153. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  154. data/test/cases/arel/nodes/true_test.rb +21 -0
  155. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  156. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  157. data/test/cases/arel/nodes/window_test.rb +81 -0
  158. data/test/cases/arel/nodes_test.rb +34 -0
  159. data/test/cases/arel/select_manager_test.rb +1238 -0
  160. data/test/cases/arel/support/fake_record.rb +135 -0
  161. data/test/cases/arel/table_test.rb +216 -0
  162. data/test/cases/arel/update_manager_test.rb +126 -0
  163. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  164. data/test/cases/arel/visitors/dot_test.rb +90 -0
  165. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  166. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  167. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  168. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  169. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  170. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  171. data/test/cases/associations/callbacks_test.rb +56 -38
  172. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  173. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  174. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  175. data/test/cases/associations/eager_singularization_test.rb +21 -21
  176. data/test/cases/associations/eager_test.rb +559 -415
  177. data/test/cases/associations/extension_test.rb +18 -12
  178. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  179. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  180. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  181. data/test/cases/associations/has_one_associations_test.rb +294 -129
  182. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  183. data/test/cases/associations/inner_join_association_test.rb +114 -38
  184. data/test/cases/associations/inverse_associations_test.rb +606 -398
  185. data/test/cases/associations/join_model_test.rb +158 -148
  186. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  187. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  188. data/test/cases/associations/required_test.rb +35 -10
  189. data/test/cases/associations_test.rb +241 -110
  190. data/test/cases/attribute_methods/read_test.rb +11 -11
  191. data/test/cases/attribute_methods_test.rb +413 -298
  192. data/test/cases/attributes_test.rb +145 -27
  193. data/test/cases/autosave_association_test.rb +681 -436
  194. data/test/cases/base_prevent_writes_test.rb +229 -0
  195. data/test/cases/base_test.rb +599 -542
  196. data/test/cases/batches_test.rb +288 -82
  197. data/test/cases/binary_test.rb +26 -31
  198. data/test/cases/bind_parameter_test.rb +194 -21
  199. data/test/cases/boolean_test.rb +52 -0
  200. data/test/cases/cache_key_test.rb +110 -5
  201. data/test/cases/calculations_test.rb +740 -177
  202. data/test/cases/callbacks_test.rb +74 -207
  203. data/test/cases/clone_test.rb +15 -10
  204. data/test/cases/coders/json_test.rb +2 -0
  205. data/test/cases/coders/yaml_column_test.rb +16 -13
  206. data/test/cases/collection_cache_key_test.rb +177 -20
  207. data/test/cases/column_alias_test.rb +9 -7
  208. data/test/cases/column_definition_test.rb +10 -68
  209. data/test/cases/comment_test.rb +166 -107
  210. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  211. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  212. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  213. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  214. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  215. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  216. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  217. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  218. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  219. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  220. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  221. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  222. data/test/cases/connection_management_test.rb +13 -11
  223. data/test/cases/connection_pool_test.rb +316 -83
  224. data/test/cases/core_test.rb +82 -58
  225. data/test/cases/counter_cache_test.rb +204 -50
  226. data/test/cases/custom_locking_test.rb +5 -3
  227. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  228. data/test/cases/database_configurations/resolver_test.rb +150 -0
  229. data/test/cases/database_configurations_test.rb +145 -0
  230. data/test/cases/database_selector_test.rb +296 -0
  231. data/test/cases/database_statements_test.rb +18 -16
  232. data/test/cases/date_test.rb +8 -16
  233. data/test/cases/date_time_precision_test.rb +100 -78
  234. data/test/cases/date_time_test.rb +23 -8
  235. data/test/cases/defaults_test.rb +106 -71
  236. data/test/cases/delegated_type_test.rb +57 -0
  237. data/test/cases/dirty_test.rb +419 -223
  238. data/test/cases/disconnected_test.rb +6 -6
  239. data/test/cases/dup_test.rb +54 -27
  240. data/test/cases/enum_test.rb +461 -82
  241. data/test/cases/errors_test.rb +7 -7
  242. data/test/cases/explain_subscriber_test.rb +17 -15
  243. data/test/cases/explain_test.rb +11 -19
  244. data/test/cases/filter_attributes_test.rb +153 -0
  245. data/test/cases/finder_respond_to_test.rb +14 -14
  246. data/test/cases/finder_test.rb +669 -287
  247. data/test/cases/fixture_set/file_test.rb +34 -38
  248. data/test/cases/fixtures_test.rb +833 -176
  249. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  250. data/test/cases/habtm_destroy_order_test.rb +25 -25
  251. data/test/cases/helper.rb +78 -49
  252. data/test/cases/hot_compatibility_test.rb +33 -32
  253. data/test/cases/i18n_test.rb +18 -17
  254. data/test/cases/inheritance_test.rb +180 -115
  255. data/test/cases/insert_all_test.rb +489 -0
  256. data/test/cases/instrumentation_test.rb +101 -0
  257. data/test/cases/integration_test.rb +119 -31
  258. data/test/cases/invalid_connection_test.rb +18 -16
  259. data/test/cases/invertible_migration_test.rb +183 -43
  260. data/test/cases/json_attribute_test.rb +35 -0
  261. data/test/cases/json_serialization_test.rb +57 -58
  262. data/test/cases/json_shared_test_cases.rb +290 -0
  263. data/test/cases/locking_test.rb +413 -119
  264. data/test/cases/log_subscriber_test.rb +68 -26
  265. data/test/cases/marshal_serialization_test.rb +39 -0
  266. data/test/cases/migration/change_schema_test.rb +118 -72
  267. data/test/cases/migration/change_table_test.rb +138 -30
  268. data/test/cases/migration/check_constraint_test.rb +162 -0
  269. data/test/cases/migration/column_attributes_test.rb +45 -35
  270. data/test/cases/migration/column_positioning_test.rb +18 -6
  271. data/test/cases/migration/columns_test.rb +93 -77
  272. data/test/cases/migration/command_recorder_test.rb +121 -34
  273. data/test/cases/migration/compatibility_test.rb +578 -23
  274. data/test/cases/migration/create_join_table_test.rb +35 -25
  275. data/test/cases/migration/foreign_key_test.rb +503 -284
  276. data/test/cases/migration/helper.rb +4 -3
  277. data/test/cases/migration/index_test.rb +119 -70
  278. data/test/cases/migration/logger_test.rb +9 -6
  279. data/test/cases/migration/pending_migrations_test.rb +88 -34
  280. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  281. data/test/cases/migration/references_index_test.rb +38 -19
  282. data/test/cases/migration/references_statements_test.rb +15 -14
  283. data/test/cases/migration/rename_table_test.rb +53 -30
  284. data/test/cases/migration_test.rb +637 -269
  285. data/test/cases/migrator_test.rb +191 -135
  286. data/test/cases/mixin_test.rb +7 -11
  287. data/test/cases/modules_test.rb +36 -34
  288. data/test/cases/multi_db_migrator_test.rb +223 -0
  289. data/test/cases/multiparameter_attributes_test.rb +60 -33
  290. data/test/cases/multiple_db_test.rb +16 -22
  291. data/test/cases/nested_attributes_test.rb +341 -320
  292. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  293. data/test/cases/null_relation_test.rb +84 -0
  294. data/test/cases/numeric_data_test.rb +93 -0
  295. data/test/cases/persistence_test.rb +361 -269
  296. data/test/cases/pooled_connections_test.rb +18 -26
  297. data/test/cases/prepared_statement_status_test.rb +48 -0
  298. data/test/cases/primary_keys_test.rb +210 -104
  299. data/test/cases/query_cache_test.rb +610 -141
  300. data/test/cases/quoting_test.rb +132 -31
  301. data/test/cases/readonly_test.rb +49 -48
  302. data/test/cases/reaper_test.rb +146 -32
  303. data/test/cases/reflection_test.rb +167 -156
  304. data/test/cases/relation/delegation_test.rb +49 -36
  305. data/test/cases/relation/delete_all_test.rb +117 -0
  306. data/test/cases/relation/merging_test.rb +319 -42
  307. data/test/cases/relation/mutation_test.rb +55 -93
  308. data/test/cases/relation/or_test.rb +129 -29
  309. data/test/cases/relation/predicate_builder_test.rb +21 -6
  310. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  311. data/test/cases/relation/select_test.rb +67 -0
  312. data/test/cases/relation/update_all_test.rb +317 -0
  313. data/test/cases/relation/where_chain_test.rb +68 -32
  314. data/test/cases/relation/where_clause_test.rb +136 -61
  315. data/test/cases/relation/where_test.rb +155 -48
  316. data/test/cases/relation_test.rb +266 -112
  317. data/test/cases/relations_test.rb +969 -744
  318. data/test/cases/reload_models_test.rb +13 -9
  319. data/test/cases/reserved_word_test.rb +141 -0
  320. data/test/cases/result_test.rb +68 -17
  321. data/test/cases/sanitize_test.rb +87 -71
  322. data/test/cases/schema_dumper_test.rb +221 -128
  323. data/test/cases/schema_loading_test.rb +3 -2
  324. data/test/cases/scoping/default_scoping_test.rb +185 -144
  325. data/test/cases/scoping/named_scoping_test.rb +177 -89
  326. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  327. data/test/cases/secure_token_test.rb +18 -3
  328. data/test/cases/serialization_test.rb +30 -28
  329. data/test/cases/serialized_attribute_test.rb +133 -42
  330. data/test/cases/signed_id_test.rb +168 -0
  331. data/test/cases/statement_cache_test.rb +41 -24
  332. data/test/cases/statement_invalid_test.rb +42 -0
  333. data/test/cases/store_test.rb +180 -55
  334. data/test/cases/strict_loading_test.rb +473 -0
  335. data/test/cases/suppressor_test.rb +26 -12
  336. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  337. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  338. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  339. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  340. data/test/cases/test_case.rb +51 -40
  341. data/test/cases/test_databases_test.rb +79 -0
  342. data/test/cases/test_fixtures_test.rb +79 -19
  343. data/test/cases/time_precision_test.rb +98 -76
  344. data/test/cases/timestamp_test.rb +102 -99
  345. data/test/cases/touch_later_test.rb +12 -10
  346. data/test/cases/transaction_callbacks_test.rb +344 -90
  347. data/test/cases/transaction_isolation_test.rb +12 -12
  348. data/test/cases/transactions_test.rb +612 -162
  349. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  350. data/test/cases/type/date_time_test.rb +4 -2
  351. data/test/cases/type/integer_test.rb +4 -2
  352. data/test/cases/type/string_test.rb +10 -8
  353. data/test/cases/type/time_test.rb +28 -0
  354. data/test/cases/type/type_map_test.rb +29 -28
  355. data/test/cases/type/unsigned_integer_test.rb +19 -0
  356. data/test/cases/type_test.rb +2 -0
  357. data/test/cases/types_test.rb +3 -1
  358. data/test/cases/unconnected_test.rb +14 -1
  359. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  360. data/test/cases/validations/absence_validation_test.rb +19 -17
  361. data/test/cases/validations/association_validation_test.rb +30 -28
  362. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  363. data/test/cases/validations/i18n_validation_test.rb +22 -21
  364. data/test/cases/validations/length_validation_test.rb +34 -33
  365. data/test/cases/validations/numericality_validation_test.rb +181 -0
  366. data/test/cases/validations/presence_validation_test.rb +21 -19
  367. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  368. data/test/cases/validations_repair_helper.rb +2 -0
  369. data/test/cases/validations_test.rb +61 -26
  370. data/test/cases/view_test.rb +122 -116
  371. data/test/cases/yaml_serialization_test.rb +79 -34
  372. data/test/config.example.yml +19 -19
  373. data/test/config.rb +3 -1
  374. data/test/config.yml +16 -6
  375. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  376. data/test/fixtures/author_addresses.yml +1 -8
  377. data/test/fixtures/authors.yml +1 -7
  378. data/test/fixtures/binaries.yml +4 -0
  379. data/test/fixtures/books.yml +9 -2
  380. data/test/fixtures/categories_posts.yml +3 -0
  381. data/test/fixtures/citations.yml +5 -0
  382. data/test/fixtures/comments.yml +7 -0
  383. data/test/fixtures/companies.yml +5 -0
  384. data/test/fixtures/computers.yml +2 -0
  385. data/test/fixtures/customers.yml +10 -1
  386. data/test/fixtures/developers.yml +1 -1
  387. data/test/fixtures/essays.yml +10 -0
  388. data/test/fixtures/faces.yml +3 -3
  389. data/test/fixtures/humans.yml +5 -0
  390. data/test/fixtures/interests.yml +7 -7
  391. data/test/fixtures/memberships.yml +7 -0
  392. data/test/fixtures/minimalistics.yml +3 -0
  393. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  394. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  395. data/test/fixtures/naked/yml/parrots.yml +1 -0
  396. data/test/fixtures/other_books.yml +26 -0
  397. data/test/fixtures/other_posts.yml +1 -0
  398. data/test/fixtures/parrots.yml +7 -1
  399. data/test/fixtures/pirates.yml +3 -0
  400. data/test/fixtures/posts.yml +11 -3
  401. data/test/fixtures/readers.yml +6 -0
  402. data/test/fixtures/reserved_words/values.yml +2 -2
  403. data/test/fixtures/sponsors.yml +3 -0
  404. data/test/fixtures/strict_zines.yml +2 -0
  405. data/test/fixtures/subscribers.yml +1 -1
  406. data/test/fixtures/tasks.yml +1 -1
  407. data/test/fixtures/warehouse-things.yml +3 -0
  408. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  409. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  410. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  411. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  412. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  413. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  414. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  415. data/test/migrations/rename/1_we_need_things.rb +2 -0
  416. data/test/migrations/rename/2_rename_things.rb +2 -0
  417. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  419. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  420. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  421. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  422. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  423. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  424. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  425. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  426. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  427. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  428. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  429. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  430. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  431. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  432. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  433. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  434. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  435. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  436. data/test/models/account.rb +46 -0
  437. data/test/models/admin/account.rb +3 -1
  438. data/test/models/admin/randomly_named_c1.rb +2 -0
  439. data/test/models/admin/user.rb +16 -8
  440. data/test/models/admin.rb +4 -2
  441. data/test/models/aircraft.rb +3 -1
  442. data/test/models/arunit2_model.rb +2 -0
  443. data/test/models/author.rb +153 -102
  444. data/test/models/auto_id.rb +2 -0
  445. data/test/models/autoloadable/extra_firm.rb +2 -0
  446. data/test/models/binary.rb +3 -1
  447. data/test/models/binary_field.rb +6 -0
  448. data/test/models/bird.rb +13 -1
  449. data/test/models/book.rb +14 -4
  450. data/test/models/book_destroy_async.rb +24 -0
  451. data/test/models/boolean.rb +5 -0
  452. data/test/models/bulb.rb +13 -4
  453. data/test/models/cake_designer.rb +2 -0
  454. data/test/models/car.rb +17 -10
  455. data/test/models/carrier.rb +2 -0
  456. data/test/models/cart.rb +5 -0
  457. data/test/models/cat.rb +2 -0
  458. data/test/models/categorization.rb +8 -6
  459. data/test/models/category.rb +28 -16
  460. data/test/models/chef.rb +2 -0
  461. data/test/models/citation.rb +5 -1
  462. data/test/models/club.rb +13 -10
  463. data/test/models/college.rb +4 -2
  464. data/test/models/column.rb +2 -0
  465. data/test/models/column_name.rb +2 -0
  466. data/test/models/comment.rb +32 -10
  467. data/test/models/company.rb +102 -106
  468. data/test/models/company_in_module.rb +27 -26
  469. data/test/models/computer.rb +3 -1
  470. data/test/models/contact.rb +15 -13
  471. data/test/models/content.rb +5 -3
  472. data/test/models/contract.rb +21 -3
  473. data/test/models/country.rb +2 -4
  474. data/test/models/course.rb +3 -1
  475. data/test/models/customer.rb +10 -8
  476. data/test/models/customer_carrier.rb +2 -0
  477. data/test/models/dashboard.rb +2 -0
  478. data/test/models/default.rb +2 -0
  479. data/test/models/department.rb +2 -0
  480. data/test/models/destroy_async_parent.rb +15 -0
  481. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  482. data/test/models/developer.rb +152 -85
  483. data/test/models/dl_keyed_belongs_to.rb +13 -0
  484. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  485. data/test/models/dl_keyed_has_many.rb +5 -0
  486. data/test/models/dl_keyed_has_many_through.rb +5 -0
  487. data/test/models/dl_keyed_has_one.rb +5 -0
  488. data/test/models/dl_keyed_join.rb +10 -0
  489. data/test/models/dog.rb +2 -0
  490. data/test/models/dog_lover.rb +2 -0
  491. data/test/models/doubloon.rb +3 -1
  492. data/test/models/drink_designer.rb +17 -0
  493. data/test/models/edge.rb +4 -2
  494. data/test/models/electron.rb +2 -0
  495. data/test/models/engine.rb +3 -2
  496. data/test/models/entrant.rb +2 -0
  497. data/test/models/entry.rb +5 -0
  498. data/test/models/essay.rb +6 -3
  499. data/test/models/essay_destroy_async.rb +12 -0
  500. data/test/models/event.rb +3 -1
  501. data/test/models/eye.rb +5 -3
  502. data/test/models/face.rb +14 -6
  503. data/test/models/family.rb +6 -0
  504. data/test/models/family_tree.rb +6 -0
  505. data/test/models/friendship.rb +5 -3
  506. data/test/models/frog.rb +8 -0
  507. data/test/models/guid.rb +3 -1
  508. data/test/models/guitar.rb +2 -0
  509. data/test/models/hotel.rb +5 -3
  510. data/test/models/human.rb +39 -0
  511. data/test/models/image.rb +3 -1
  512. data/test/models/interest.rb +14 -3
  513. data/test/models/invoice.rb +4 -2
  514. data/test/models/item.rb +3 -1
  515. data/test/models/job.rb +5 -3
  516. data/test/models/joke.rb +4 -2
  517. data/test/models/keyboard.rb +3 -1
  518. data/test/models/legacy_thing.rb +2 -0
  519. data/test/models/lesson.rb +2 -0
  520. data/test/models/line_item.rb +3 -1
  521. data/test/models/liquid.rb +2 -0
  522. data/test/models/matey.rb +3 -1
  523. data/test/models/measurement.rb +4 -0
  524. data/test/models/member.rb +23 -20
  525. data/test/models/member_detail.rb +3 -0
  526. data/test/models/member_type.rb +2 -0
  527. data/test/models/membership.rb +4 -1
  528. data/test/models/mentor.rb +3 -1
  529. data/test/models/message.rb +5 -0
  530. data/test/models/minimalistic.rb +2 -0
  531. data/test/models/minivan.rb +3 -2
  532. data/test/models/mixed_case_monkey.rb +3 -1
  533. data/test/models/molecule.rb +2 -0
  534. data/test/models/mouse.rb +6 -0
  535. data/test/models/movie.rb +2 -0
  536. data/test/models/node.rb +4 -2
  537. data/test/models/non_primary_key.rb +2 -0
  538. data/test/models/notification.rb +2 -0
  539. data/test/models/numeric_data.rb +12 -0
  540. data/test/models/order.rb +4 -2
  541. data/test/models/organization.rb +9 -7
  542. data/test/models/other_dog.rb +3 -1
  543. data/test/models/owner.rb +6 -4
  544. data/test/models/parrot.rb +12 -4
  545. data/test/models/person.rb +59 -54
  546. data/test/models/personal_legacy_thing.rb +3 -1
  547. data/test/models/pet.rb +4 -2
  548. data/test/models/pet_treasure.rb +2 -0
  549. data/test/models/pirate.rb +67 -43
  550. data/test/models/possession.rb +3 -1
  551. data/test/models/post.rb +184 -86
  552. data/test/models/price_estimate.rb +11 -1
  553. data/test/models/professor.rb +3 -1
  554. data/test/models/project.rb +14 -12
  555. data/test/models/publisher/article.rb +2 -0
  556. data/test/models/publisher/magazine.rb +2 -0
  557. data/test/models/publisher.rb +2 -0
  558. data/test/models/randomly_named_c1.rb +2 -0
  559. data/test/models/rating.rb +5 -1
  560. data/test/models/reader.rb +7 -5
  561. data/test/models/recipe.rb +2 -0
  562. data/test/models/record.rb +2 -0
  563. data/test/models/reference.rb +6 -3
  564. data/test/models/reply.rb +39 -21
  565. data/test/models/room.rb +6 -0
  566. data/test/models/section.rb +6 -0
  567. data/test/models/seminar.rb +6 -0
  568. data/test/models/session.rb +6 -0
  569. data/test/models/ship.rb +12 -9
  570. data/test/models/ship_part.rb +5 -3
  571. data/test/models/shop.rb +4 -2
  572. data/test/models/shop_account.rb +2 -0
  573. data/test/models/speedometer.rb +2 -0
  574. data/test/models/sponsor.rb +8 -5
  575. data/test/models/squeak.rb +6 -0
  576. data/test/models/strict_zine.rb +7 -0
  577. data/test/models/string_key_object.rb +2 -0
  578. data/test/models/student.rb +2 -0
  579. data/test/models/subscriber.rb +4 -2
  580. data/test/models/subscription.rb +5 -1
  581. data/test/models/tag.rb +6 -3
  582. data/test/models/tagging.rb +13 -6
  583. data/test/models/task.rb +2 -0
  584. data/test/models/topic.rb +54 -19
  585. data/test/models/toy.rb +4 -0
  586. data/test/models/traffic_light.rb +2 -0
  587. data/test/models/treasure.rb +5 -3
  588. data/test/models/treaty.rb +2 -4
  589. data/test/models/tree.rb +2 -0
  590. data/test/models/tuning_peg.rb +2 -0
  591. data/test/models/tyre.rb +2 -0
  592. data/test/models/user.rb +12 -4
  593. data/test/models/uuid_child.rb +2 -0
  594. data/test/models/uuid_item.rb +2 -0
  595. data/test/models/uuid_parent.rb +2 -0
  596. data/test/models/vegetables.rb +12 -3
  597. data/test/models/vertex.rb +6 -4
  598. data/test/models/warehouse_thing.rb +2 -0
  599. data/test/models/wheel.rb +3 -1
  600. data/test/models/without_table.rb +3 -1
  601. data/test/models/zine.rb +3 -1
  602. data/test/schema/mysql2_specific_schema.rb +49 -35
  603. data/test/schema/oracle_specific_schema.rb +13 -15
  604. data/test/schema/postgresql_specific_schema.rb +51 -40
  605. data/test/schema/schema.rb +334 -154
  606. data/test/schema/sqlite_specific_schema.rb +9 -16
  607. data/test/support/config.rb +26 -26
  608. data/test/support/connection.rb +14 -8
  609. data/test/support/connection_helper.rb +3 -1
  610. data/test/support/ddl_helper.rb +2 -0
  611. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  618. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  619. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  620. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  621. data/test/support/schema_dumping_helper.rb +2 -0
  622. data/test/support/stubs/strong_parameters.rb +40 -0
  623. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  624. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  625. metadata +192 -14
@@ -1,42 +1,11 @@
1
- require 'cases/helper'
2
- require 'models/post'
1
+ # frozen_string_literal: true
3
2
 
4
- module ActiveRecord
5
- class RelationMutationTest < ActiveSupport::TestCase
6
- class FakeKlass < Struct.new(:table_name, :name)
7
- extend ActiveRecord::Delegation::DelegateCache
8
- inherited self
9
-
10
- def connection
11
- Post.connection
12
- end
13
-
14
- def relation_delegate_class(klass)
15
- self.class.relation_delegate_class(klass)
16
- end
17
-
18
- def attribute_alias?(name)
19
- false
20
- end
21
-
22
- def sanitize_sql(sql)
23
- sql
24
- end
25
-
26
- def sanitize_sql_for_order(sql)
27
- sql
28
- end
29
-
30
- def arel_attribute(name, table)
31
- table[name]
32
- end
33
- end
3
+ require "cases/helper"
4
+ require "models/post"
34
5
 
35
- def relation
36
- @relation ||= Relation.new FakeKlass.new('posts'), Post.arel_table, Post.predicate_builder
37
- end
38
-
39
- (Relation::MULTI_VALUE_METHODS - [:references, :extending, :order, :unscope, :select, :left_joins]).each do |method|
6
+ module ActiveRecord
7
+ class RelationMutationTest < ActiveRecord::TestCase
8
+ (Relation::MULTI_VALUE_METHODS - [:extending, :order, :unscope, :select]).each do |method|
40
9
  test "##{method}!" do
41
10
  assert relation.public_send("#{method}!", :foo).equal?(relation)
42
11
  assert_equal [:foo], relation.public_send("#{method}_values")
@@ -44,24 +13,24 @@ module ActiveRecord
44
13
  end
45
14
 
46
15
  test "#_select!" do
47
- assert relation.public_send("_select!", :foo).equal?(relation)
48
- assert_equal [:foo], relation.public_send("select_values")
16
+ assert relation._select!(:foo).equal?(relation)
17
+ assert_equal [:foo], relation.select_values
49
18
  end
50
19
 
51
- test '#order!' do
52
- assert relation.order!('name ASC').equal?(relation)
53
- assert_equal ['name ASC'], relation.order_values
20
+ test "#order!" do
21
+ assert relation.order!("name ASC").equal?(relation)
22
+ assert_equal ["name ASC"], relation.order_values
54
23
  end
55
24
 
56
- test '#order! with symbol prepends the table name' do
25
+ test "#order! with symbol prepends the table name" do
57
26
  assert relation.order!(:name).equal?(relation)
58
27
  node = relation.order_values.first
59
- assert node.ascending?
60
- assert_equal :name, node.expr.name
28
+ assert_predicate node, :ascending?
29
+ assert_equal "name", node.expr.name
61
30
  assert_equal "posts", node.expr.relation.name
62
31
  end
63
32
 
64
- test '#order! on non-string does not attempt regexp match for references' do
33
+ test "#order! on non-string does not attempt regexp match for references" do
65
34
  obj = Object.new
66
35
  assert_not_called(obj, :=~) do
67
36
  assert relation.order!(obj)
@@ -69,12 +38,7 @@ module ActiveRecord
69
38
  end
70
39
  end
71
40
 
72
- test '#references!' do
73
- assert relation.references!(:foo).equal?(relation)
74
- assert relation.references_values.include?('foo')
75
- end
76
-
77
- test 'extending!' do
41
+ test "extending!" do
78
42
  mod, mod2 = Module.new, Module.new
79
43
 
80
44
  assert relation.extending!(mod).equal?(relation)
@@ -85,99 +49,97 @@ module ActiveRecord
85
49
  assert_equal [mod, mod2], relation.extending_values
86
50
  end
87
51
 
88
- test 'extending! with empty args' do
52
+ test "extending! with empty args" do
89
53
  relation.extending!
90
54
  assert_equal [], relation.extending_values
91
55
  end
92
56
 
93
- (Relation::SINGLE_VALUE_METHODS - [:lock, :reordering, :reverse_order, :create_with, :uniq]).each do |method|
57
+ (Relation::SINGLE_VALUE_METHODS - [:lock, :reordering, :reverse_order, :create_with, :skip_query_cache, :strict_loading]).each do |method|
94
58
  test "##{method}!" do
95
59
  assert relation.public_send("#{method}!", :foo).equal?(relation)
96
60
  assert_equal :foo, relation.public_send("#{method}_value")
97
61
  end
98
62
  end
99
63
 
100
- test '#from!' do
101
- assert relation.from!('foo').equal?(relation)
102
- assert_equal 'foo', relation.from_clause.value
64
+ test "#from!" do
65
+ assert relation.from!("foo").equal?(relation)
66
+ assert_equal "foo", relation.from_clause.value
103
67
  end
104
68
 
105
- test '#lock!' do
106
- assert relation.lock!('foo').equal?(relation)
107
- assert_equal 'foo', relation.lock_value
69
+ test "#lock!" do
70
+ assert relation.lock!("foo").equal?(relation)
71
+ assert_equal "foo", relation.lock_value
108
72
  end
109
73
 
110
- test '#reorder!' do
111
- @relation = self.relation.order('foo')
74
+ test "#reorder!" do
75
+ @relation = relation.order("foo")
112
76
 
113
- assert relation.reorder!('bar').equal?(relation)
114
- assert_equal ['bar'], relation.order_values
77
+ assert relation.reorder!("bar").equal?(relation)
78
+ assert_equal ["bar"], relation.order_values
115
79
  assert relation.reordering_value
116
80
  end
117
81
 
118
- test '#reorder! with symbol prepends the table name' do
82
+ test "#reorder! with symbol prepends the table name" do
119
83
  assert relation.reorder!(:name).equal?(relation)
120
84
  node = relation.order_values.first
121
85
 
122
- assert node.ascending?
123
- assert_equal :name, node.expr.name
86
+ assert_predicate node, :ascending?
87
+ assert_equal "name", node.expr.name
124
88
  assert_equal "posts", node.expr.relation.name
125
89
  end
126
90
 
127
- test 'reverse_order!' do
128
- @relation = Post.order('title ASC, comments_count DESC')
91
+ test "reverse_order!" do
92
+ @relation = Post.order("title ASC, comments_count DESC")
129
93
 
130
94
  relation.reverse_order!
131
95
 
132
- assert_equal 'title DESC', relation.order_values.first
133
- assert_equal 'comments_count ASC', relation.order_values.last
134
-
96
+ assert_equal "title DESC", relation.order_values.first
97
+ assert_equal "comments_count ASC", relation.order_values.last
135
98
 
136
99
  relation.reverse_order!
137
100
 
138
- assert_equal 'title ASC', relation.order_values.first
139
- assert_equal 'comments_count DESC', relation.order_values.last
101
+ assert_equal "title ASC", relation.order_values.first
102
+ assert_equal "comments_count DESC", relation.order_values.last
140
103
  end
141
104
 
142
- test 'create_with!' do
143
- assert relation.create_with!(foo: 'bar').equal?(relation)
144
- assert_equal({foo: 'bar'}, relation.create_with_value)
105
+ test "create_with!" do
106
+ assert relation.create_with!(foo: "bar").equal?(relation)
107
+ assert_equal({ foo: "bar" }, relation.create_with_value)
145
108
  end
146
109
 
147
- test 'test_merge!' do
110
+ test "merge!" do
148
111
  assert relation.merge!(select: :foo).equal?(relation)
149
112
  assert_equal [:foo], relation.select_values
150
113
  end
151
114
 
152
- test 'merge with a proc' do
115
+ test "merge with a proc" do
153
116
  assert_equal [:foo], relation.merge(-> { select(:foo) }).select_values
154
117
  end
155
118
 
156
- test 'none!' do
119
+ test "none!" do
157
120
  assert relation.none!.equal?(relation)
158
121
  assert_equal [NullRelation], relation.extending_values
159
122
  assert relation.is_a?(NullRelation)
160
123
  end
161
124
 
162
- test 'distinct!' do
125
+ test "distinct!" do
163
126
  relation.distinct! :foo
164
127
  assert_equal :foo, relation.distinct_value
128
+ end
165
129
 
166
- assert_deprecated do
167
- assert_equal :foo, relation.uniq_value # deprecated access
168
- end
130
+ test "skip_query_cache!" do
131
+ relation.skip_query_cache!
132
+ assert relation.skip_query_cache_value
169
133
  end
170
134
 
171
- test 'uniq! was replaced by distinct!' do
172
- assert_deprecated(/use distinct! instead/) do
173
- relation.uniq! :foo
174
- end
135
+ test "skip_preloading!" do
136
+ relation.skip_preloading!
137
+ assert relation.skip_preloading_value
138
+ end
175
139
 
176
- assert_deprecated(/use distinct_value instead/) do
177
- assert_equal :foo, relation.uniq_value # deprecated access
140
+ private
141
+ def relation
142
+ @relation ||= Relation.new(FakeKlass)
178
143
  end
179
-
180
- assert_equal :foo, relation.distinct_value
181
- end
182
144
  end
183
145
  end
@@ -1,32 +1,42 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/post'
4
+ require "models/author"
5
+ require "models/categorization"
6
+ require "models/post"
7
+ require "models/citation"
3
8
 
4
9
  module ActiveRecord
5
10
  class OrTest < ActiveRecord::TestCase
6
- fixtures :posts
11
+ fixtures :posts, :authors, :author_addresses
7
12
 
8
13
  def test_or_with_relation
9
- expected = Post.where('id = 1 or id = 2').to_a
10
- assert_equal expected, Post.where('id = 1').or(Post.where('id = 2')).to_a
14
+ expected = Post.where("id = 1 or id = 2").to_a
15
+ assert_equal expected, Post.where("id = 1").or(Post.where("id = 2")).to_a
11
16
  end
12
17
 
13
18
  def test_or_identity
14
- expected = Post.where('id = 1').to_a
15
- assert_equal expected, Post.where('id = 1').or(Post.where('id = 1')).to_a
19
+ expected = Post.where("id = 1").to_a
20
+ assert_equal expected, Post.where("id = 1").or(Post.where("id = 1")).to_a
16
21
  end
17
22
 
18
23
  def test_or_with_null_left
19
- expected = Post.where('id = 1').to_a
20
- assert_equal expected, Post.none.or(Post.where('id = 1')).to_a
24
+ expected = Post.where("id = 1").to_a
25
+ assert_equal expected, Post.none.or(Post.where("id = 1")).to_a
21
26
  end
22
27
 
23
28
  def test_or_with_null_right
24
- expected = Post.where('id = 1').to_a
25
- assert_equal expected, Post.where('id = 1').or(Post.none).to_a
29
+ expected = Post.where("id = 1").to_a
30
+ assert_equal expected, Post.where("id = 1").or(Post.none).to_a
31
+ end
32
+
33
+ def test_or_with_large_number
34
+ expected = Post.where("id = 1 or id = 9223372036854775808").to_a
35
+ assert_equal expected, Post.where(id: 1).or(Post.where(id: 9223372036854775808)).to_a
26
36
  end
27
37
 
28
38
  def test_or_with_bind_params
29
- assert_equal Post.find([1, 2]), Post.where(id: 1).or(Post.where(id: 2)).to_a
39
+ assert_equal Post.find([1, 2]).sort_by(&:id), Post.where(id: 1).or(Post.where(id: 2)).sort_by(&:id)
30
40
  end
31
41
 
32
42
  def test_or_with_null_both
@@ -36,56 +46,146 @@ module ActiveRecord
36
46
 
37
47
  def test_or_without_left_where
38
48
  expected = Post.all
39
- assert_equal expected, Post.or(Post.where('id = 1')).to_a
49
+ assert_equal expected, Post.or(Post.where("id = 1")).to_a
40
50
  end
41
51
 
42
52
  def test_or_without_right_where
43
53
  expected = Post.all
44
- assert_equal expected, Post.where('id = 1').or(Post.all).to_a
54
+ assert_equal expected, Post.where("id = 1").or(Post.all).to_a
45
55
  end
46
56
 
47
57
  def test_or_preserves_other_querying_methods
48
- expected = Post.where('id = 1 or id = 2 or id = 3').order('body asc').to_a
49
- partial = Post.order('body asc')
50
- assert_equal expected, partial.where('id = 1').or(partial.where(:id => [2, 3])).to_a
51
- assert_equal expected, Post.order('body asc').where('id = 1').or(Post.order('body asc').where(:id => [2, 3])).to_a
58
+ expected = Post.where("id = 1 or id = 2 or id = 3").order("body asc").to_a
59
+ partial = Post.order("body asc")
60
+ assert_equal expected, partial.where("id = 1").or(partial.where(id: [2, 3])).to_a
61
+ assert_equal expected, Post.order("body asc").where("id = 1").or(Post.order("body asc").where(id: [2, 3])).to_a
62
+ end
63
+
64
+ def test_or_with_incompatible_single_value_relations
65
+ error = assert_raises ArgumentError do
66
+ Post.distinct.where("id = 1").or(Post.where(id: [2, 3])).to_a
67
+ end
68
+
69
+ assert_equal "Relation passed to #or must be structurally compatible. Incompatible values: [:distinct]", error.message
70
+ end
71
+
72
+ def test_or_with_incompatible_multi_value_relations
73
+ error = assert_raises ArgumentError do
74
+ Post.order("body asc").where("id = 1").or(Post.order("id desc").where(id: [2, 3])).to_a
75
+ end
76
+
77
+ assert_equal "Relation passed to #or must be structurally compatible. Incompatible values: [:order]", error.message
78
+ end
79
+
80
+ def test_or_with_unscope_where
81
+ expected = Post.where("id = 1 or id = 2")
82
+ partial = Post.where("id = 1 and id != 2")
83
+ assert_equal expected, partial.or(partial.unscope(:where).where("id = 2")).to_a
84
+ end
85
+
86
+ def test_or_with_unscope_where_column
87
+ expected = Post.where("id = 1 or id = 2")
88
+ partial = Post.where(id: 1).where.not(id: 2)
89
+ assert_equal expected, partial.or(partial.unscope(where: :id).where("id = 2")).to_a
90
+ end
91
+
92
+ def test_or_with_unscope_order
93
+ expected = Post.where("id = 1 or id = 2").sort_by(&:id)
94
+ assert_equal expected, Post.order("body asc").where("id = 1").unscope(:order).or(Post.where("id = 2")).sort_by(&:id)
95
+ assert_equal expected, Post.order(:id).where("id = 1").or(Post.order(:id).where("id = 2").unscope(:order)).sort_by(&:id)
52
96
  end
53
97
 
54
- def test_or_with_incompatible_relations
98
+ def test_or_with_incompatible_unscope
55
99
  error = assert_raises ArgumentError do
56
- Post.order('body asc').where('id = 1').or(Post.order('id desc').where(:id => [2, 3])).to_a
100
+ Post.order("body asc").where("id = 1").unscope(:order).or(Post.order("body asc").where("id = 2")).to_a
57
101
  end
58
102
 
59
103
  assert_equal "Relation passed to #or must be structurally compatible. Incompatible values: [:order]", error.message
60
104
  end
61
105
 
62
106
  def test_or_when_grouping
63
- groups = Post.where('id < 10').group('body').select('body, COUNT(*) AS c')
64
- expected = groups.having("COUNT(*) > 1 OR body like 'Such%'").to_a.map {|o| [o.body, o.c] }
65
- assert_equal expected, groups.having('COUNT(*) > 1').or(groups.having("body like 'Such%'")).to_a.map {|o| [o.body, o.c] }
107
+ groups = Post.where("id < 10").group("body")
108
+ expected = groups.having("COUNT(*) > 1 OR body like 'Such%'").count
109
+ assert_equal expected, groups.having("COUNT(*) > 1").or(groups.having("body like 'Such%'")).count
66
110
  end
67
111
 
68
112
  def test_or_with_named_scope
69
113
  expected = Post.where("id = 1 or body LIKE '\%a\%'").to_a
70
- assert_equal expected, Post.where('id = 1').or(Post.containing_the_letter_a)
114
+ assert_equal expected, Post.where("id = 1").or(Post.containing_the_letter_a)
71
115
  end
72
116
 
73
117
  def test_or_inside_named_scope
74
- expected = Post.where("body LIKE '\%a\%' OR title LIKE ?", "%'%").order('id DESC').to_a
118
+ expected = Post.where("body LIKE '\%a\%' OR title LIKE ?", "%'%").order("id DESC").to_a
75
119
  assert_equal expected, Post.order(id: :desc).typographically_interesting
76
120
  end
77
121
 
122
+ def test_or_with_sti_relation
123
+ expected = Post.where("id = 1 or id = 2").sort_by(&:id)
124
+ assert_equal expected, Post.where(id: 1).or(SpecialPost.all).sort_by(&:id)
125
+ end
126
+
78
127
  def test_or_on_loaded_relation
79
- expected = Post.where('id = 1 or id = 2').to_a
80
- p = Post.where('id = 1')
128
+ expected = Post.where("id = 1 or id = 2").to_a
129
+ p = Post.where("id = 1")
81
130
  p.load
82
- assert_equal p.loaded?, true
83
- assert_equal expected, p.or(Post.where('id = 2')).to_a
131
+ assert_equal true, p.loaded?
132
+ assert_equal expected, p.or(Post.where("id = 2")).to_a
84
133
  end
85
134
 
86
135
  def test_or_with_non_relation_object_raises_error
87
136
  assert_raises ArgumentError do
88
- Post.where(id: [1, 2, 3]).or(title: 'Rails')
137
+ Post.where(id: [1, 2, 3]).or(title: "Rails")
138
+ end
139
+ end
140
+
141
+ def test_or_with_references_inequality
142
+ joined = Post.includes(:author)
143
+ actual = joined.where(authors: { id: 1 })
144
+ .or(joined.where(title: "I don't have any comments"))
145
+ expected = Author.find(1).posts + Post.where(title: "I don't have any comments")
146
+ assert_equal expected.sort_by(&:id), actual.sort_by(&:id)
147
+ end
148
+
149
+ def test_or_with_scope_on_association
150
+ author = Author.first
151
+ assert_nothing_raised do
152
+ author.top_posts.or(author.other_top_posts)
153
+ end
154
+ end
155
+
156
+ def test_or_with_annotate
157
+ quoted_posts = Regexp.escape(Post.quoted_table_name)
158
+ assert_match %r{#{quoted_posts} /\* foo \*/\z}, Post.annotate("foo").or(Post.all).to_sql
159
+ assert_match %r{#{quoted_posts} /\* foo \*/\z}, Post.annotate("foo").or(Post.annotate("foo")).to_sql
160
+ assert_match %r{#{quoted_posts} /\* foo \*/\z}, Post.annotate("foo").or(Post.annotate("bar")).to_sql
161
+ assert_match %r{#{quoted_posts} /\* foo \*/ /\* bar \*/\z}, Post.annotate("foo", "bar").or(Post.annotate("foo")).to_sql
162
+ end
163
+
164
+ def test_structurally_incompatible_values
165
+ assert_nothing_raised do
166
+ Post.includes(:author).includes(:author).or(Post.includes(:author))
167
+ Post.eager_load(:author).eager_load(:author).or(Post.eager_load(:author))
168
+ Post.preload(:author).preload(:author).or(Post.preload(:author))
169
+ Post.group(:author_id).group(:author_id).or(Post.group(:author_id))
170
+ Post.joins(:author).joins(:author).or(Post.joins(:author))
171
+ Post.left_outer_joins(:author).left_outer_joins(:author).or(Post.left_outer_joins(:author))
172
+ Post.from("posts").or(Post.from("posts"))
173
+ end
174
+ end
175
+ end
176
+
177
+ # The maximum expression tree depth is 1000 by default for SQLite3.
178
+ # https://www.sqlite.org/limits.html#max_expr_depth
179
+ unless current_adapter?(:SQLite3Adapter)
180
+ class TooManyOrTest < ActiveRecord::TestCase
181
+ fixtures :citations
182
+
183
+ def test_too_many_or
184
+ citations = 6000.times.map do |i|
185
+ Citation.where(id: i, book2_id: i * i)
186
+ end
187
+
188
+ assert_equal 6000, citations.inject(&:or).count
89
189
  end
90
190
  end
91
191
  end
@@ -1,16 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/topic'
4
+ require "models/reply"
3
5
 
4
6
  module ActiveRecord
5
7
  class PredicateBuilderTest < ActiveRecord::TestCase
6
- def test_registering_new_handlers
8
+ def setup
7
9
  Topic.predicate_builder.register_handler(Regexp, proc do |column, value|
8
- Arel::Nodes::InfixOperation.new('~', column, Arel.sql(value.source))
10
+ Arel::Nodes::InfixOperation.new("~", column, Arel::Nodes.build_quoted(value.source))
9
11
  end)
12
+ end
10
13
 
11
- assert_match %r{["`]topics["`]\.["`]title["`] ~ rails}i, Topic.where(title: /rails/).to_sql
12
- ensure
13
- Topic.reset_column_information
14
+ def teardown
15
+ Topic.class_eval { @predicate_builder = nil }
14
16
  end
17
+
18
+ def test_registering_new_handlers
19
+ assert_match %r{#{Regexp.escape(topic_title)} ~ 'rails'}i, Topic.where(title: /rails/).to_sql
20
+ end
21
+
22
+ def test_registering_new_handlers_for_association
23
+ assert_match %r{#{Regexp.escape(topic_title)} ~ 'rails'}i, Reply.joins(:topic).where(topics: { title: /rails/ }).to_sql
24
+ end
25
+
26
+ private
27
+ def topic_title
28
+ Topic.connection.quote_table_name("topics.title")
29
+ end
15
30
  end
16
31
  end
@@ -1,6 +1,8 @@
1
- require 'cases/helper'
2
- require 'models/post'
3
- require 'active_record/relation/record_fetch_warning'
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/post"
5
+ require "active_record/relation/record_fetch_warning"
4
6
 
5
7
  module ActiveRecord
6
8
  class RecordFetchWarningTest < ActiveRecord::TestCase
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/post"
5
+ require "models/comment"
6
+
7
+ module ActiveRecord
8
+ class SelectTest < ActiveRecord::TestCase
9
+ fixtures :posts, :comments
10
+
11
+ def test_select_with_nil_argument
12
+ expected = Post.select(:title).to_sql
13
+ assert_equal expected, Post.select(nil).select(:title).to_sql
14
+ end
15
+
16
+ def test_reselect
17
+ expected = Post.select(:title).to_sql
18
+ assert_equal expected, Post.select(:title, :body).reselect(:title).to_sql
19
+ end
20
+
21
+ def test_reselect_with_default_scope_select
22
+ expected = Post.select(:title).to_sql
23
+ actual = PostWithDefaultSelect.reselect(:title).to_sql
24
+
25
+ assert_equal expected, actual
26
+ end
27
+
28
+ def test_non_select_columns_wont_be_loaded
29
+ posts = Post.select("UPPER(title) AS title")
30
+
31
+ assert_non_select_columns_wont_be_loaded(posts.first)
32
+ assert_non_select_columns_wont_be_loaded(posts.preload(:comments).first)
33
+ assert_non_select_columns_wont_be_loaded(posts.eager_load(:comments).first)
34
+ end
35
+
36
+ def assert_non_select_columns_wont_be_loaded(post)
37
+ assert_equal "WELCOME TO THE WEBLOG", post.title
38
+ assert_raise(ActiveModel::MissingAttributeError) do
39
+ post.body
40
+ end
41
+ end
42
+ private :assert_non_select_columns_wont_be_loaded
43
+
44
+ def test_type_casted_extra_select_with_eager_loading
45
+ posts = Post.select("posts.id * 1.1 AS foo").eager_load(:comments)
46
+ assert_equal 1.1, posts.first.foo
47
+ end
48
+
49
+ def test_aliased_select_using_as_with_joins_and_includes
50
+ posts = Post.select("posts.id AS field_alias").joins(:comments).includes(:comments)
51
+ assert_equal %w(id field_alias), posts.first.attributes.keys
52
+ end
53
+
54
+ def test_aliased_select_not_using_as_with_joins_and_includes
55
+ posts = Post.select("posts.id field_alias").joins(:comments).includes(:comments)
56
+ assert_equal %w(id field_alias), posts.first.attributes.keys
57
+ end
58
+
59
+ def test_star_select_with_joins_and_includes
60
+ posts = Post.select("posts.*").joins(:comments).includes(:comments)
61
+ assert_equal %w(
62
+ id author_id title body type legacy_comments_count taggings_with_delete_all_count taggings_with_destroy_count
63
+ tags_count indestructible_tags_count tags_with_destroy_count tags_with_nullify_count
64
+ ), posts.first.attributes.keys
65
+ end
66
+ end
67
+ end