ibm_db 5.1.0-x86-mingw32 → 5.3.2-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (624) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/ext/Makefile +14 -14
  5. data/ext/extconf.rb +4 -4
  6. data/ext/ibm_db.c +62 -57
  7. data/ext/ibm_db.o +0 -0
  8. data/ext/ibm_db.so +0 -0
  9. data/ext/mkmf.log +11 -11
  10. data/ext/ruby_ibm_db_cli.c +1 -0
  11. data/ext/ruby_ibm_db_cli.o +0 -0
  12. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
  13. data/lib/ibm_db.so +1 -0
  14. data/lib/mswin32/ibm_db.rb +7 -3
  15. data/lib/mswin32/rb2x/i386/ruby25/ibm_db.so +0 -0
  16. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  17. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  18. data/test/activejob/destroy_association_async_test.rb +305 -0
  19. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  20. data/test/activejob/helper.rb +15 -0
  21. data/test/assets/schema_dump_5_1.yml +345 -0
  22. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  23. data/test/cases/adapter_test.rb +432 -218
  24. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  25. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  26. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  27. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  28. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  29. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  30. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  31. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  32. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  33. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  34. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  35. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  36. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  37. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  38. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  39. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  40. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  41. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  42. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  43. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  44. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  45. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  46. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  47. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  48. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  49. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  50. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  51. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  52. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  53. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  54. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  55. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  56. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  57. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  58. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  59. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  60. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  61. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  62. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  63. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  64. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  65. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  66. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  67. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  68. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  69. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  70. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  71. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  72. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  73. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  74. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  75. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  76. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  77. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  78. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  79. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  80. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  81. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  82. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  83. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  84. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  85. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  86. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  87. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  88. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  89. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  90. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  91. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  92. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  93. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  94. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  95. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  96. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  97. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  98. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  99. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  100. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  101. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  102. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  103. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  104. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  105. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  106. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  107. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  108. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  109. data/test/cases/aggregations_test.rb +14 -12
  110. data/test/cases/annotate_test.rb +46 -0
  111. data/test/cases/ar_schema_test.rb +153 -86
  112. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  113. data/test/cases/arel/attributes/math_test.rb +83 -0
  114. data/test/cases/arel/attributes_test.rb +27 -0
  115. data/test/cases/arel/collectors/bind_test.rb +40 -0
  116. data/test/cases/arel/collectors/composite_test.rb +47 -0
  117. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  118. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  119. data/test/cases/arel/crud_test.rb +65 -0
  120. data/test/cases/arel/delete_manager_test.rb +53 -0
  121. data/test/cases/arel/factory_methods_test.rb +46 -0
  122. data/test/cases/arel/helper.rb +45 -0
  123. data/test/cases/arel/insert_manager_test.rb +241 -0
  124. data/test/cases/arel/nodes/and_test.rb +30 -0
  125. data/test/cases/arel/nodes/as_test.rb +36 -0
  126. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  127. data/test/cases/arel/nodes/bin_test.rb +35 -0
  128. data/test/cases/arel/nodes/binary_test.rb +29 -0
  129. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  130. data/test/cases/arel/nodes/case_test.rb +96 -0
  131. data/test/cases/arel/nodes/casted_test.rb +18 -0
  132. data/test/cases/arel/nodes/comment_test.rb +22 -0
  133. data/test/cases/arel/nodes/count_test.rb +35 -0
  134. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  135. data/test/cases/arel/nodes/descending_test.rb +46 -0
  136. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  137. data/test/cases/arel/nodes/equality_test.rb +62 -0
  138. data/test/cases/arel/nodes/extract_test.rb +43 -0
  139. data/test/cases/arel/nodes/false_test.rb +21 -0
  140. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  141. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  142. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  143. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  144. data/test/cases/arel/nodes/node_test.rb +22 -0
  145. data/test/cases/arel/nodes/not_test.rb +31 -0
  146. data/test/cases/arel/nodes/or_test.rb +36 -0
  147. data/test/cases/arel/nodes/over_test.rb +69 -0
  148. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  149. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  150. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  151. data/test/cases/arel/nodes/sum_test.rb +35 -0
  152. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  153. data/test/cases/arel/nodes/true_test.rb +21 -0
  154. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  155. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  156. data/test/cases/arel/nodes/window_test.rb +81 -0
  157. data/test/cases/arel/nodes_test.rb +34 -0
  158. data/test/cases/arel/select_manager_test.rb +1238 -0
  159. data/test/cases/arel/support/fake_record.rb +135 -0
  160. data/test/cases/arel/table_test.rb +216 -0
  161. data/test/cases/arel/update_manager_test.rb +126 -0
  162. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  163. data/test/cases/arel/visitors/dot_test.rb +90 -0
  164. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  165. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  166. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  167. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  168. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  169. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  170. data/test/cases/associations/callbacks_test.rb +56 -38
  171. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  172. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  173. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  174. data/test/cases/associations/eager_singularization_test.rb +21 -21
  175. data/test/cases/associations/eager_test.rb +559 -415
  176. data/test/cases/associations/extension_test.rb +18 -12
  177. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  178. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  179. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  180. data/test/cases/associations/has_one_associations_test.rb +294 -129
  181. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  182. data/test/cases/associations/inner_join_association_test.rb +114 -38
  183. data/test/cases/associations/inverse_associations_test.rb +606 -398
  184. data/test/cases/associations/join_model_test.rb +158 -148
  185. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  186. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  187. data/test/cases/associations/required_test.rb +35 -10
  188. data/test/cases/associations_test.rb +241 -110
  189. data/test/cases/attribute_methods/read_test.rb +11 -11
  190. data/test/cases/attribute_methods_test.rb +413 -298
  191. data/test/cases/attributes_test.rb +145 -27
  192. data/test/cases/autosave_association_test.rb +681 -436
  193. data/test/cases/base_prevent_writes_test.rb +229 -0
  194. data/test/cases/base_test.rb +599 -542
  195. data/test/cases/batches_test.rb +288 -82
  196. data/test/cases/binary_test.rb +26 -31
  197. data/test/cases/bind_parameter_test.rb +194 -21
  198. data/test/cases/boolean_test.rb +52 -0
  199. data/test/cases/cache_key_test.rb +110 -5
  200. data/test/cases/calculations_test.rb +740 -177
  201. data/test/cases/callbacks_test.rb +74 -207
  202. data/test/cases/clone_test.rb +15 -10
  203. data/test/cases/coders/json_test.rb +2 -0
  204. data/test/cases/coders/yaml_column_test.rb +16 -13
  205. data/test/cases/collection_cache_key_test.rb +177 -20
  206. data/test/cases/column_alias_test.rb +9 -7
  207. data/test/cases/column_definition_test.rb +10 -68
  208. data/test/cases/comment_test.rb +166 -107
  209. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  210. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  211. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  212. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  213. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  214. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  215. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  216. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  217. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  218. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  219. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  220. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  221. data/test/cases/connection_management_test.rb +13 -11
  222. data/test/cases/connection_pool_test.rb +316 -83
  223. data/test/cases/core_test.rb +82 -58
  224. data/test/cases/counter_cache_test.rb +204 -50
  225. data/test/cases/custom_locking_test.rb +5 -3
  226. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  227. data/test/cases/database_configurations/resolver_test.rb +150 -0
  228. data/test/cases/database_configurations_test.rb +145 -0
  229. data/test/cases/database_selector_test.rb +296 -0
  230. data/test/cases/database_statements_test.rb +18 -16
  231. data/test/cases/date_test.rb +8 -16
  232. data/test/cases/date_time_precision_test.rb +100 -78
  233. data/test/cases/date_time_test.rb +23 -8
  234. data/test/cases/defaults_test.rb +106 -71
  235. data/test/cases/delegated_type_test.rb +57 -0
  236. data/test/cases/dirty_test.rb +419 -223
  237. data/test/cases/disconnected_test.rb +6 -6
  238. data/test/cases/dup_test.rb +54 -27
  239. data/test/cases/enum_test.rb +461 -82
  240. data/test/cases/errors_test.rb +7 -7
  241. data/test/cases/explain_subscriber_test.rb +17 -15
  242. data/test/cases/explain_test.rb +11 -19
  243. data/test/cases/filter_attributes_test.rb +153 -0
  244. data/test/cases/finder_respond_to_test.rb +14 -14
  245. data/test/cases/finder_test.rb +669 -287
  246. data/test/cases/fixture_set/file_test.rb +34 -38
  247. data/test/cases/fixtures_test.rb +833 -176
  248. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  249. data/test/cases/habtm_destroy_order_test.rb +25 -25
  250. data/test/cases/helper.rb +78 -49
  251. data/test/cases/hot_compatibility_test.rb +33 -32
  252. data/test/cases/i18n_test.rb +18 -17
  253. data/test/cases/inheritance_test.rb +180 -115
  254. data/test/cases/insert_all_test.rb +489 -0
  255. data/test/cases/instrumentation_test.rb +101 -0
  256. data/test/cases/integration_test.rb +119 -31
  257. data/test/cases/invalid_connection_test.rb +18 -16
  258. data/test/cases/invertible_migration_test.rb +183 -43
  259. data/test/cases/json_attribute_test.rb +35 -0
  260. data/test/cases/json_serialization_test.rb +57 -58
  261. data/test/cases/json_shared_test_cases.rb +290 -0
  262. data/test/cases/locking_test.rb +413 -119
  263. data/test/cases/log_subscriber_test.rb +68 -26
  264. data/test/cases/marshal_serialization_test.rb +39 -0
  265. data/test/cases/migration/change_schema_test.rb +118 -72
  266. data/test/cases/migration/change_table_test.rb +138 -30
  267. data/test/cases/migration/check_constraint_test.rb +162 -0
  268. data/test/cases/migration/column_attributes_test.rb +45 -35
  269. data/test/cases/migration/column_positioning_test.rb +18 -6
  270. data/test/cases/migration/columns_test.rb +93 -77
  271. data/test/cases/migration/command_recorder_test.rb +121 -34
  272. data/test/cases/migration/compatibility_test.rb +578 -23
  273. data/test/cases/migration/create_join_table_test.rb +35 -25
  274. data/test/cases/migration/foreign_key_test.rb +503 -284
  275. data/test/cases/migration/helper.rb +4 -3
  276. data/test/cases/migration/index_test.rb +119 -70
  277. data/test/cases/migration/logger_test.rb +9 -6
  278. data/test/cases/migration/pending_migrations_test.rb +88 -34
  279. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  280. data/test/cases/migration/references_index_test.rb +38 -19
  281. data/test/cases/migration/references_statements_test.rb +15 -14
  282. data/test/cases/migration/rename_table_test.rb +53 -30
  283. data/test/cases/migration_test.rb +637 -269
  284. data/test/cases/migrator_test.rb +191 -135
  285. data/test/cases/mixin_test.rb +7 -11
  286. data/test/cases/modules_test.rb +36 -34
  287. data/test/cases/multi_db_migrator_test.rb +223 -0
  288. data/test/cases/multiparameter_attributes_test.rb +60 -33
  289. data/test/cases/multiple_db_test.rb +16 -22
  290. data/test/cases/nested_attributes_test.rb +341 -320
  291. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  292. data/test/cases/null_relation_test.rb +84 -0
  293. data/test/cases/numeric_data_test.rb +93 -0
  294. data/test/cases/persistence_test.rb +361 -269
  295. data/test/cases/pooled_connections_test.rb +18 -26
  296. data/test/cases/prepared_statement_status_test.rb +48 -0
  297. data/test/cases/primary_keys_test.rb +210 -104
  298. data/test/cases/query_cache_test.rb +610 -141
  299. data/test/cases/quoting_test.rb +132 -31
  300. data/test/cases/readonly_test.rb +49 -48
  301. data/test/cases/reaper_test.rb +146 -32
  302. data/test/cases/reflection_test.rb +167 -156
  303. data/test/cases/relation/delegation_test.rb +49 -36
  304. data/test/cases/relation/delete_all_test.rb +117 -0
  305. data/test/cases/relation/merging_test.rb +319 -42
  306. data/test/cases/relation/mutation_test.rb +55 -93
  307. data/test/cases/relation/or_test.rb +129 -29
  308. data/test/cases/relation/predicate_builder_test.rb +21 -6
  309. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  310. data/test/cases/relation/select_test.rb +67 -0
  311. data/test/cases/relation/update_all_test.rb +317 -0
  312. data/test/cases/relation/where_chain_test.rb +68 -32
  313. data/test/cases/relation/where_clause_test.rb +136 -61
  314. data/test/cases/relation/where_test.rb +155 -48
  315. data/test/cases/relation_test.rb +266 -112
  316. data/test/cases/relations_test.rb +969 -744
  317. data/test/cases/reload_models_test.rb +13 -9
  318. data/test/cases/reserved_word_test.rb +141 -0
  319. data/test/cases/result_test.rb +68 -17
  320. data/test/cases/sanitize_test.rb +87 -71
  321. data/test/cases/schema_dumper_test.rb +221 -128
  322. data/test/cases/schema_loading_test.rb +3 -2
  323. data/test/cases/scoping/default_scoping_test.rb +185 -144
  324. data/test/cases/scoping/named_scoping_test.rb +177 -89
  325. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  326. data/test/cases/secure_token_test.rb +18 -3
  327. data/test/cases/serialization_test.rb +30 -28
  328. data/test/cases/serialized_attribute_test.rb +133 -42
  329. data/test/cases/signed_id_test.rb +168 -0
  330. data/test/cases/statement_cache_test.rb +41 -24
  331. data/test/cases/statement_invalid_test.rb +42 -0
  332. data/test/cases/store_test.rb +180 -55
  333. data/test/cases/strict_loading_test.rb +473 -0
  334. data/test/cases/suppressor_test.rb +26 -12
  335. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  336. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  337. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  338. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  339. data/test/cases/test_case.rb +51 -40
  340. data/test/cases/test_databases_test.rb +79 -0
  341. data/test/cases/test_fixtures_test.rb +79 -19
  342. data/test/cases/time_precision_test.rb +98 -76
  343. data/test/cases/timestamp_test.rb +102 -99
  344. data/test/cases/touch_later_test.rb +12 -10
  345. data/test/cases/transaction_callbacks_test.rb +344 -90
  346. data/test/cases/transaction_isolation_test.rb +12 -12
  347. data/test/cases/transactions_test.rb +612 -162
  348. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  349. data/test/cases/type/date_time_test.rb +4 -2
  350. data/test/cases/type/integer_test.rb +4 -2
  351. data/test/cases/type/string_test.rb +10 -8
  352. data/test/cases/type/time_test.rb +28 -0
  353. data/test/cases/type/type_map_test.rb +29 -28
  354. data/test/cases/type/unsigned_integer_test.rb +19 -0
  355. data/test/cases/type_test.rb +2 -0
  356. data/test/cases/types_test.rb +3 -1
  357. data/test/cases/unconnected_test.rb +14 -1
  358. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  359. data/test/cases/validations/absence_validation_test.rb +19 -17
  360. data/test/cases/validations/association_validation_test.rb +30 -28
  361. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  362. data/test/cases/validations/i18n_validation_test.rb +22 -21
  363. data/test/cases/validations/length_validation_test.rb +34 -33
  364. data/test/cases/validations/numericality_validation_test.rb +181 -0
  365. data/test/cases/validations/presence_validation_test.rb +21 -19
  366. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  367. data/test/cases/validations_repair_helper.rb +2 -0
  368. data/test/cases/validations_test.rb +61 -26
  369. data/test/cases/view_test.rb +122 -116
  370. data/test/cases/yaml_serialization_test.rb +79 -34
  371. data/test/config.example.yml +19 -19
  372. data/test/config.rb +3 -1
  373. data/test/config.yml +16 -6
  374. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  375. data/test/fixtures/author_addresses.yml +1 -8
  376. data/test/fixtures/authors.yml +1 -7
  377. data/test/fixtures/binaries.yml +4 -0
  378. data/test/fixtures/books.yml +9 -2
  379. data/test/fixtures/categories_posts.yml +3 -0
  380. data/test/fixtures/citations.yml +5 -0
  381. data/test/fixtures/comments.yml +7 -0
  382. data/test/fixtures/companies.yml +5 -0
  383. data/test/fixtures/computers.yml +2 -0
  384. data/test/fixtures/customers.yml +10 -1
  385. data/test/fixtures/developers.yml +1 -1
  386. data/test/fixtures/essays.yml +10 -0
  387. data/test/fixtures/faces.yml +3 -3
  388. data/test/fixtures/humans.yml +5 -0
  389. data/test/fixtures/interests.yml +7 -7
  390. data/test/fixtures/memberships.yml +7 -0
  391. data/test/fixtures/minimalistics.yml +3 -0
  392. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  393. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  394. data/test/fixtures/naked/yml/parrots.yml +1 -0
  395. data/test/fixtures/other_books.yml +26 -0
  396. data/test/fixtures/other_posts.yml +1 -0
  397. data/test/fixtures/parrots.yml +7 -1
  398. data/test/fixtures/pirates.yml +3 -0
  399. data/test/fixtures/posts.yml +11 -3
  400. data/test/fixtures/readers.yml +6 -0
  401. data/test/fixtures/reserved_words/values.yml +2 -2
  402. data/test/fixtures/sponsors.yml +3 -0
  403. data/test/fixtures/strict_zines.yml +2 -0
  404. data/test/fixtures/subscribers.yml +1 -1
  405. data/test/fixtures/tasks.yml +1 -1
  406. data/test/fixtures/warehouse-things.yml +3 -0
  407. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  408. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  409. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  410. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  411. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  412. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  413. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  414. data/test/migrations/rename/1_we_need_things.rb +2 -0
  415. data/test/migrations/rename/2_rename_things.rb +2 -0
  416. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  417. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  418. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  419. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  420. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  421. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  422. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  423. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  424. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  425. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  426. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  427. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  428. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  429. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  430. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  431. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  432. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  433. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  434. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  435. data/test/models/account.rb +46 -0
  436. data/test/models/admin/account.rb +3 -1
  437. data/test/models/admin/randomly_named_c1.rb +2 -0
  438. data/test/models/admin/user.rb +16 -8
  439. data/test/models/admin.rb +4 -2
  440. data/test/models/aircraft.rb +3 -1
  441. data/test/models/arunit2_model.rb +2 -0
  442. data/test/models/author.rb +153 -102
  443. data/test/models/auto_id.rb +2 -0
  444. data/test/models/autoloadable/extra_firm.rb +2 -0
  445. data/test/models/binary.rb +3 -1
  446. data/test/models/binary_field.rb +6 -0
  447. data/test/models/bird.rb +13 -1
  448. data/test/models/book.rb +14 -4
  449. data/test/models/book_destroy_async.rb +24 -0
  450. data/test/models/boolean.rb +5 -0
  451. data/test/models/bulb.rb +13 -4
  452. data/test/models/cake_designer.rb +2 -0
  453. data/test/models/car.rb +17 -10
  454. data/test/models/carrier.rb +2 -0
  455. data/test/models/cart.rb +5 -0
  456. data/test/models/cat.rb +2 -0
  457. data/test/models/categorization.rb +8 -6
  458. data/test/models/category.rb +28 -16
  459. data/test/models/chef.rb +2 -0
  460. data/test/models/citation.rb +5 -1
  461. data/test/models/club.rb +13 -10
  462. data/test/models/college.rb +4 -2
  463. data/test/models/column.rb +2 -0
  464. data/test/models/column_name.rb +2 -0
  465. data/test/models/comment.rb +32 -10
  466. data/test/models/company.rb +102 -106
  467. data/test/models/company_in_module.rb +27 -26
  468. data/test/models/computer.rb +3 -1
  469. data/test/models/contact.rb +15 -13
  470. data/test/models/content.rb +5 -3
  471. data/test/models/contract.rb +21 -3
  472. data/test/models/country.rb +2 -4
  473. data/test/models/course.rb +3 -1
  474. data/test/models/customer.rb +10 -8
  475. data/test/models/customer_carrier.rb +2 -0
  476. data/test/models/dashboard.rb +2 -0
  477. data/test/models/default.rb +2 -0
  478. data/test/models/department.rb +2 -0
  479. data/test/models/destroy_async_parent.rb +15 -0
  480. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  481. data/test/models/developer.rb +152 -85
  482. data/test/models/dl_keyed_belongs_to.rb +13 -0
  483. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  484. data/test/models/dl_keyed_has_many.rb +5 -0
  485. data/test/models/dl_keyed_has_many_through.rb +5 -0
  486. data/test/models/dl_keyed_has_one.rb +5 -0
  487. data/test/models/dl_keyed_join.rb +10 -0
  488. data/test/models/dog.rb +2 -0
  489. data/test/models/dog_lover.rb +2 -0
  490. data/test/models/doubloon.rb +3 -1
  491. data/test/models/drink_designer.rb +17 -0
  492. data/test/models/edge.rb +4 -2
  493. data/test/models/electron.rb +2 -0
  494. data/test/models/engine.rb +3 -2
  495. data/test/models/entrant.rb +2 -0
  496. data/test/models/entry.rb +5 -0
  497. data/test/models/essay.rb +6 -3
  498. data/test/models/essay_destroy_async.rb +12 -0
  499. data/test/models/event.rb +3 -1
  500. data/test/models/eye.rb +5 -3
  501. data/test/models/face.rb +14 -6
  502. data/test/models/family.rb +6 -0
  503. data/test/models/family_tree.rb +6 -0
  504. data/test/models/friendship.rb +5 -3
  505. data/test/models/frog.rb +8 -0
  506. data/test/models/guid.rb +3 -1
  507. data/test/models/guitar.rb +2 -0
  508. data/test/models/hotel.rb +5 -3
  509. data/test/models/human.rb +39 -0
  510. data/test/models/image.rb +3 -1
  511. data/test/models/interest.rb +14 -3
  512. data/test/models/invoice.rb +4 -2
  513. data/test/models/item.rb +3 -1
  514. data/test/models/job.rb +5 -3
  515. data/test/models/joke.rb +4 -2
  516. data/test/models/keyboard.rb +3 -1
  517. data/test/models/legacy_thing.rb +2 -0
  518. data/test/models/lesson.rb +2 -0
  519. data/test/models/line_item.rb +3 -1
  520. data/test/models/liquid.rb +2 -0
  521. data/test/models/matey.rb +3 -1
  522. data/test/models/measurement.rb +4 -0
  523. data/test/models/member.rb +23 -20
  524. data/test/models/member_detail.rb +3 -0
  525. data/test/models/member_type.rb +2 -0
  526. data/test/models/membership.rb +4 -1
  527. data/test/models/mentor.rb +3 -1
  528. data/test/models/message.rb +5 -0
  529. data/test/models/minimalistic.rb +2 -0
  530. data/test/models/minivan.rb +3 -2
  531. data/test/models/mixed_case_monkey.rb +3 -1
  532. data/test/models/molecule.rb +2 -0
  533. data/test/models/mouse.rb +6 -0
  534. data/test/models/movie.rb +2 -0
  535. data/test/models/node.rb +4 -2
  536. data/test/models/non_primary_key.rb +2 -0
  537. data/test/models/notification.rb +2 -0
  538. data/test/models/numeric_data.rb +12 -0
  539. data/test/models/order.rb +4 -2
  540. data/test/models/organization.rb +9 -7
  541. data/test/models/other_dog.rb +3 -1
  542. data/test/models/owner.rb +6 -4
  543. data/test/models/parrot.rb +12 -4
  544. data/test/models/person.rb +59 -54
  545. data/test/models/personal_legacy_thing.rb +3 -1
  546. data/test/models/pet.rb +4 -2
  547. data/test/models/pet_treasure.rb +2 -0
  548. data/test/models/pirate.rb +67 -43
  549. data/test/models/possession.rb +3 -1
  550. data/test/models/post.rb +184 -86
  551. data/test/models/price_estimate.rb +11 -1
  552. data/test/models/professor.rb +3 -1
  553. data/test/models/project.rb +14 -12
  554. data/test/models/publisher/article.rb +2 -0
  555. data/test/models/publisher/magazine.rb +2 -0
  556. data/test/models/publisher.rb +2 -0
  557. data/test/models/randomly_named_c1.rb +2 -0
  558. data/test/models/rating.rb +5 -1
  559. data/test/models/reader.rb +7 -5
  560. data/test/models/recipe.rb +2 -0
  561. data/test/models/record.rb +2 -0
  562. data/test/models/reference.rb +6 -3
  563. data/test/models/reply.rb +39 -21
  564. data/test/models/room.rb +6 -0
  565. data/test/models/section.rb +6 -0
  566. data/test/models/seminar.rb +6 -0
  567. data/test/models/session.rb +6 -0
  568. data/test/models/ship.rb +12 -9
  569. data/test/models/ship_part.rb +5 -3
  570. data/test/models/shop.rb +4 -2
  571. data/test/models/shop_account.rb +2 -0
  572. data/test/models/speedometer.rb +2 -0
  573. data/test/models/sponsor.rb +8 -5
  574. data/test/models/squeak.rb +6 -0
  575. data/test/models/strict_zine.rb +7 -0
  576. data/test/models/string_key_object.rb +2 -0
  577. data/test/models/student.rb +2 -0
  578. data/test/models/subscriber.rb +4 -2
  579. data/test/models/subscription.rb +5 -1
  580. data/test/models/tag.rb +6 -3
  581. data/test/models/tagging.rb +13 -6
  582. data/test/models/task.rb +2 -0
  583. data/test/models/topic.rb +54 -19
  584. data/test/models/toy.rb +4 -0
  585. data/test/models/traffic_light.rb +2 -0
  586. data/test/models/treasure.rb +5 -3
  587. data/test/models/treaty.rb +2 -4
  588. data/test/models/tree.rb +2 -0
  589. data/test/models/tuning_peg.rb +2 -0
  590. data/test/models/tyre.rb +2 -0
  591. data/test/models/user.rb +12 -4
  592. data/test/models/uuid_child.rb +2 -0
  593. data/test/models/uuid_item.rb +2 -0
  594. data/test/models/uuid_parent.rb +2 -0
  595. data/test/models/vegetables.rb +12 -3
  596. data/test/models/vertex.rb +6 -4
  597. data/test/models/warehouse_thing.rb +2 -0
  598. data/test/models/wheel.rb +3 -1
  599. data/test/models/without_table.rb +3 -1
  600. data/test/models/zine.rb +3 -1
  601. data/test/schema/mysql2_specific_schema.rb +49 -35
  602. data/test/schema/oracle_specific_schema.rb +13 -15
  603. data/test/schema/postgresql_specific_schema.rb +51 -40
  604. data/test/schema/schema.rb +334 -154
  605. data/test/schema/sqlite_specific_schema.rb +9 -16
  606. data/test/support/config.rb +26 -26
  607. data/test/support/connection.rb +14 -8
  608. data/test/support/connection_helper.rb +3 -1
  609. data/test/support/ddl_helper.rb +2 -0
  610. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  611. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  618. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  619. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  620. data/test/support/schema_dumping_helper.rb +2 -0
  621. data/test/support/stubs/strong_parameters.rb +40 -0
  622. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  623. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  624. metadata +196 -11
@@ -1,47 +1,32 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/post'
3
- require 'models/comment'
4
- require 'models/author'
5
- require 'models/rating'
4
+ require "models/post"
5
+ require "models/comment"
6
+ require "models/author"
7
+ require "models/rating"
8
+ require "models/categorization"
6
9
 
7
10
  module ActiveRecord
8
11
  class RelationTest < ActiveRecord::TestCase
9
- fixtures :posts, :comments, :authors
10
-
11
- class FakeKlass < Struct.new(:table_name, :name)
12
- extend ActiveRecord::Delegation::DelegateCache
13
-
14
- inherited self
15
-
16
- def self.connection
17
- Post.connection
18
- end
19
-
20
- def self.table_name
21
- 'fake_table'
22
- end
23
-
24
- def self.sanitize_sql_for_order(sql)
25
- sql
26
- end
27
- end
12
+ fixtures :posts, :comments, :authors, :author_addresses, :ratings, :categorizations
28
13
 
29
14
  def test_construction
30
- relation = Relation.new(FakeKlass, :b, nil)
15
+ relation = Relation.new(FakeKlass, table: :b)
31
16
  assert_equal FakeKlass, relation.klass
32
17
  assert_equal :b, relation.table
33
- assert !relation.loaded, 'relation is not loaded'
18
+ assert_not relation.loaded, "relation is not loaded"
34
19
  end
35
20
 
36
21
  def test_responds_to_model_and_returns_klass
37
- relation = Relation.new(FakeKlass, :b, nil)
22
+ relation = Relation.new(FakeKlass)
38
23
  assert_equal FakeKlass, relation.model
39
24
  end
40
25
 
41
26
  def test_initialize_single_values
42
- relation = Relation.new(FakeKlass, :b, nil)
27
+ relation = Relation.new(FakeKlass)
43
28
  (Relation::SINGLE_VALUE_METHODS - [:create_with]).each do |method|
44
- assert_nil relation.send("#{method}_value"), method.to_s
29
+ assert_nil relation.public_send("#{method}_value"), method.to_s
45
30
  end
46
31
  value = relation.create_with_value
47
32
  assert_equal({}, value)
@@ -49,79 +34,89 @@ module ActiveRecord
49
34
  end
50
35
 
51
36
  def test_multi_value_initialize
52
- relation = Relation.new(FakeKlass, :b, nil)
37
+ relation = Relation.new(FakeKlass)
53
38
  Relation::MULTI_VALUE_METHODS.each do |method|
54
- values = relation.send("#{method}_values")
39
+ values = relation.public_send("#{method}_values")
55
40
  assert_equal [], values, method.to_s
56
41
  assert_predicate values, :frozen?, method.to_s
57
42
  end
58
43
  end
59
44
 
60
45
  def test_extensions
61
- relation = Relation.new(FakeKlass, :b, nil)
46
+ relation = Relation.new(FakeKlass)
62
47
  assert_equal [], relation.extensions
63
48
  end
64
49
 
65
50
  def test_empty_where_values_hash
66
- relation = Relation.new(FakeKlass, :b, nil)
51
+ relation = Relation.new(FakeKlass)
52
+ assert_equal({}, relation.where_values_hash)
53
+
54
+ relation.where!(relation.table[:id].not_eq(10))
55
+ assert_equal({}, relation.where_values_hash)
56
+
57
+ relation.where!(relation.table[:id].is_distinct_from(10))
67
58
  assert_equal({}, relation.where_values_hash)
68
59
  end
69
60
 
61
+ def test_where_values_hash_with_in_clause
62
+ relation = Relation.new(Post)
63
+ relation.where!(title: ["foo", "bar", "hello"])
64
+
65
+ assert_equal({ "title" => ["foo", "bar", "hello"] }, relation.where_values_hash)
66
+ end
67
+
70
68
  def test_has_values
71
- relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
72
- relation.where! relation.table[:id].eq(10)
73
- assert_equal({:id => 10}, relation.where_values_hash)
69
+ relation = Relation.new(Post)
70
+ relation.where!(id: 10)
71
+ assert_equal({ "id" => 10 }, relation.where_values_hash)
74
72
  end
75
73
 
76
74
  def test_values_wrong_table
77
- relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
75
+ relation = Relation.new(Post)
78
76
  relation.where! Comment.arel_table[:id].eq(10)
79
77
  assert_equal({}, relation.where_values_hash)
80
78
  end
81
79
 
82
80
  def test_tree_is_not_traversed
83
- relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
81
+ relation = Relation.new(Post)
84
82
  left = relation.table[:id].eq(10)
85
83
  right = relation.table[:id].eq(10)
86
- combine = left.and right
84
+ combine = left.or(right)
87
85
  relation.where! combine
88
86
  assert_equal({}, relation.where_values_hash)
89
87
  end
90
88
 
91
- def test_table_name_delegates_to_klass
92
- relation = Relation.new(FakeKlass.new('posts'), :b, Post.predicate_builder)
93
- assert_equal 'posts', relation.table_name
94
- end
95
-
96
89
  def test_scope_for_create
97
- relation = Relation.new(FakeKlass, :b, nil)
90
+ relation = Relation.new(FakeKlass)
98
91
  assert_equal({}, relation.scope_for_create)
99
92
  end
100
93
 
101
94
  def test_create_with_value
102
- relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
103
- hash = { :hello => 'world' }
104
- relation.create_with_value = hash
105
- assert_equal hash, relation.scope_for_create
95
+ relation = Relation.new(Post)
96
+ relation.create_with_value = { hello: "world" }
97
+ assert_equal({ "hello" => "world" }, relation.scope_for_create)
106
98
  end
107
99
 
108
100
  def test_create_with_value_with_wheres
109
- relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
110
- relation.where! relation.table[:id].eq(10)
111
- relation.create_with_value = {:hello => 'world'}
112
- assert_equal({:hello => 'world', :id => 10}, relation.scope_for_create)
101
+ relation = Relation.new(Post)
102
+ assert_equal({}, relation.scope_for_create)
103
+
104
+ relation.where!(id: 10)
105
+ assert_equal({ "id" => 10 }, relation.scope_for_create)
106
+
107
+ relation.create_with_value = { hello: "world" }
108
+ assert_equal({ "hello" => "world", "id" => 10 }, relation.scope_for_create)
113
109
  end
114
110
 
115
- # FIXME: is this really wanted or expected behavior?
116
- def test_scope_for_create_is_cached
117
- relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
118
- assert_equal({}, relation.scope_for_create)
111
+ def test_empty_scope
112
+ relation = Relation.new(Post)
113
+ assert_predicate relation, :empty_scope?
119
114
 
120
- relation.where! relation.table[:id].eq(10)
121
- assert_equal({}, relation.scope_for_create)
115
+ relation.merge!(relation)
116
+ assert_predicate relation, :empty_scope?
122
117
 
123
- relation.create_with_value = {:hello => 'world'}
124
- assert_equal({}, relation.scope_for_create)
118
+ assert_not_predicate NullPost.all, :empty_scope?
119
+ assert_not_predicate FirstPost.all, :empty_scope?
125
120
  end
126
121
 
127
122
  def test_bad_constants_raise_errors
@@ -131,89 +126,89 @@ module ActiveRecord
131
126
  end
132
127
 
133
128
  def test_empty_eager_loading?
134
- relation = Relation.new(FakeKlass, :b, nil)
135
- assert !relation.eager_loading?
129
+ relation = Relation.new(FakeKlass)
130
+ assert_not_predicate relation, :eager_loading?
136
131
  end
137
132
 
138
133
  def test_eager_load_values
139
- relation = Relation.new(FakeKlass, :b, nil)
134
+ relation = Relation.new(FakeKlass)
140
135
  relation.eager_load! :b
141
- assert relation.eager_loading?
136
+ assert_predicate relation, :eager_loading?
142
137
  end
143
138
 
144
139
  def test_references_values
145
- relation = Relation.new(FakeKlass, :b, nil)
140
+ relation = Relation.new(FakeKlass)
146
141
  assert_equal [], relation.references_values
147
142
  relation = relation.references(:foo).references(:omg, :lol)
148
- assert_equal ['foo', 'omg', 'lol'], relation.references_values
143
+ assert_equal [:foo, :omg, :lol], relation.references_values
149
144
  end
150
145
 
151
146
  def test_references_values_dont_duplicate
152
- relation = Relation.new(FakeKlass, :b, nil)
147
+ relation = Relation.new(FakeKlass)
153
148
  relation = relation.references(:foo).references(:foo)
154
- assert_equal ['foo'], relation.references_values
149
+ assert_equal [:foo], relation.references_values
155
150
  end
156
151
 
157
- test 'merging a hash into a relation' do
158
- relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
159
- relation = relation.merge where: {name: :lol}, readonly: true
152
+ test "merging a hash into a relation" do
153
+ relation = Relation.new(Post)
154
+ relation = relation.merge where: { name: :lol }, readonly: true
160
155
 
161
- assert_equal({"name"=>:lol}, relation.where_clause.to_h)
156
+ assert_equal({ "name" => :lol }, relation.where_clause.to_h)
162
157
  assert_equal true, relation.readonly_value
163
158
  end
164
159
 
165
- test 'merging an empty hash into a relation' do
166
- assert_equal Relation::WhereClause.empty, Relation.new(FakeKlass, :b, nil).merge({}).where_clause
160
+ test "merging an empty hash into a relation" do
161
+ assert_equal Relation::WhereClause.empty, Relation.new(FakeKlass).merge({}).where_clause
167
162
  end
168
163
 
169
- test 'merging a hash with unknown keys raises' do
170
- assert_raises(ArgumentError) { Relation::HashMerger.new(nil, omg: 'lol') }
164
+ test "merging a hash with unknown keys raises" do
165
+ assert_raises(ArgumentError) { Relation::HashMerger.new(nil, omg: "lol") }
171
166
  end
172
167
 
173
- test 'merging nil or false raises' do
174
- relation = Relation.new(FakeKlass, :b, nil)
168
+ test "merging nil or false raises" do
169
+ relation = Relation.new(FakeKlass)
175
170
 
176
171
  e = assert_raises(ArgumentError) do
177
172
  relation = relation.merge nil
178
173
  end
179
174
 
180
- assert_equal 'invalid argument: nil.', e.message
175
+ assert_equal "invalid argument: nil.", e.message
181
176
 
182
177
  e = assert_raises(ArgumentError) do
183
178
  relation = relation.merge false
184
179
  end
185
180
 
186
- assert_equal 'invalid argument: false.', e.message
181
+ assert_equal "invalid argument: false.", e.message
187
182
  end
188
183
 
189
- test '#values returns a dup of the values' do
190
- relation = Relation.new(Post, Post.arel_table, Post.predicate_builder).where!(name: :foo)
184
+ test "#values returns a dup of the values" do
185
+ relation = Relation.new(Post).where!(name: :foo)
191
186
  values = relation.values
192
187
 
193
188
  values[:where] = nil
194
189
  assert_not_nil relation.where_clause
195
190
  end
196
191
 
197
- test 'relations can be created with a values hash' do
198
- relation = Relation.new(FakeKlass, :b, nil, select: [:foo])
192
+ test "relations can be created with a values hash" do
193
+ relation = Relation.new(FakeKlass, values: { select: [:foo] })
199
194
  assert_equal [:foo], relation.select_values
200
195
  end
201
196
 
202
- test 'merging a hash interpolates conditions' do
197
+ test "merging a hash interpolates conditions" do
203
198
  klass = Class.new(FakeKlass) do
204
199
  def self.sanitize_sql(args)
205
- raise unless args == ['foo = ?', 'bar']
206
- 'foo = bar'
200
+ raise unless args == ["foo = ?", "bar"]
201
+ "foo = bar"
207
202
  end
208
203
  end
209
204
 
210
- relation = Relation.new(klass, :b, nil)
211
- relation.merge!(where: ['foo = ?', 'bar'])
212
- assert_equal Relation::WhereClause.new(['foo = bar'], []), relation.where_clause
205
+ relation = Relation.new(klass)
206
+ relation.merge!(where: ["foo = ?", "bar"])
207
+ assert_equal Relation::WhereClause.new(["foo = bar"]), relation.where_clause
213
208
  end
214
209
 
215
210
  def test_merging_readonly_false
216
- relation = Relation.new(FakeKlass, :b, nil)
211
+ relation = Relation.new(FakeKlass)
217
212
  readonly_false_relation = relation.readonly(false)
218
213
  # test merging in both directions
219
214
  assert_equal false, relation.merge(readonly_false_relation).readonly_value
@@ -223,7 +218,50 @@ module ActiveRecord
223
218
  def test_relation_merging_with_merged_joins_as_symbols
224
219
  special_comments_with_ratings = SpecialComment.joins(:ratings)
225
220
  posts_with_special_comments_with_ratings = Post.group("posts.id").joins(:special_comments).merge(special_comments_with_ratings)
226
- assert_equal({ 2=>1, 4=>3, 5=>1 }, authors(:david).posts.merge(posts_with_special_comments_with_ratings).count)
221
+ assert_equal({ 4 => 2 }, authors(:david).posts.merge(posts_with_special_comments_with_ratings).count)
222
+ end
223
+
224
+ def test_relation_merging_with_merged_symbol_joins_keeps_inner_joins
225
+ queries = capture_sql { Author.joins(:posts).merge(Post.joins(:comments)).to_a }
226
+
227
+ nb_inner_join = queries.sum { |sql| sql.scan(/INNER\s+JOIN/i).size }
228
+ assert_equal 2, nb_inner_join, "Wrong amount of INNER JOIN in query"
229
+ assert queries.none? { |sql| /LEFT\s+(OUTER)?\s+JOIN/i.match?(sql) }, "Shouldn't have any LEFT JOIN in query"
230
+ end
231
+
232
+ def test_relation_merging_with_merged_symbol_joins_has_correct_size_and_count
233
+ # Has one entry per comment
234
+ merged_authors_with_commented_posts_relation = Author.joins(:posts).merge(Post.joins(:comments))
235
+
236
+ post_ids_with_author = Post.joins(:author).pluck(:id)
237
+ manual_comments_on_post_that_have_author = Comment.where(post_id: post_ids_with_author).pluck(:id)
238
+
239
+ assert_equal manual_comments_on_post_that_have_author.size, merged_authors_with_commented_posts_relation.count
240
+ assert_equal manual_comments_on_post_that_have_author.size, merged_authors_with_commented_posts_relation.to_a.size
241
+ end
242
+
243
+ def test_relation_merging_with_merged_symbol_joins_is_aliased
244
+ categorizations_with_authors = Categorization.joins(:author)
245
+ queries = capture_sql { Post.joins(:author, :categorizations).merge(Author.select(:id)).merge(categorizations_with_authors).to_a }
246
+
247
+ nb_inner_join = queries.sum { |sql| sql.scan(/INNER\s+JOIN/i).size }
248
+ assert_equal 3, nb_inner_join, "Wrong amount of INNER JOIN in query"
249
+
250
+ # using `\W` as the column separator
251
+ assert queries.any? { |sql| %r[INNER\s+JOIN\s+#{Regexp.escape(Author.quoted_table_name)}\s+authors_categorizations]i.match?(sql) }, "Should be aliasing the child INNER JOINs in query"
252
+ end
253
+
254
+ def test_relation_with_merged_joins_aliased_works
255
+ categorizations_with_authors = Categorization.joins(:author)
256
+ posts_with_joins_and_merges = Post.joins(:author, :categorizations)
257
+ .merge(Author.select(:id)).merge(categorizations_with_authors)
258
+
259
+ author_with_posts = Author.joins(:posts).ids
260
+ categorizations_with_author = Categorization.joins(:author).ids
261
+ posts_with_author_and_categorizations = Post.joins(:categorizations).where(author_id: author_with_posts, categorizations: { id: categorizations_with_author }).ids
262
+
263
+ assert_equal posts_with_author_and_categorizations.size, posts_with_joins_and_merges.count
264
+ assert_equal posts_with_author_and_categorizations.size, posts_with_joins_and_merges.to_a.size
227
265
  end
228
266
 
229
267
  def test_relation_merging_with_joins_as_join_dependency_pick_proper_parent
@@ -238,17 +276,17 @@ module ActiveRecord
238
276
 
239
277
  def test_merge_raises_with_invalid_argument
240
278
  assert_raises ArgumentError do
241
- relation = Relation.new(FakeKlass, :b, nil)
279
+ relation = Relation.new(FakeKlass)
242
280
  relation.merge(true)
243
281
  end
244
282
  end
245
283
 
246
284
  def test_respond_to_for_non_selected_element
247
285
  post = Post.select(:title).first
248
- assert_equal false, post.respond_to?(:body), "post should not respond_to?(:body) since invoking it raises exception"
286
+ assert_not_respond_to post, :body, "post should not respond_to?(:body) since invoking it raises exception"
249
287
 
250
288
  silence_warnings { post = Post.select("'title' as post_title").first }
251
- assert_equal false, post.respond_to?(:title), "post should not respond_to?(:body) since invoking it raises exception"
289
+ assert_not_respond_to post, :title, "post should not respond_to?(:body) since invoking it raises exception"
252
290
  end
253
291
 
254
292
  def test_select_quotes_when_using_from_clause
@@ -267,13 +305,85 @@ module ActiveRecord
267
305
  klass.create!(description: "foo")
268
306
 
269
307
  assert_equal ["foo"], klass.select(:description).from(klass.all).map(&:desc)
308
+ assert_equal ["foo"], klass.reselect(:description).from(klass.all).map(&:desc)
270
309
  end
271
310
 
272
311
  def test_relation_merging_with_merged_joins_as_strings
273
312
  join_string = "LEFT OUTER JOIN #{Rating.quoted_table_name} ON #{SpecialComment.quoted_table_name}.id = #{Rating.quoted_table_name}.comment_id"
274
313
  special_comments_with_ratings = SpecialComment.joins join_string
275
314
  posts_with_special_comments_with_ratings = Post.group("posts.id").joins(:special_comments).merge(special_comments_with_ratings)
276
- assert_equal({ 2=>1, 4=>3, 5=>1 }, authors(:david).posts.merge(posts_with_special_comments_with_ratings).count)
315
+ assert_equal({ 2 => 1, 4 => 3, 5 => 1 }, authors(:david).posts.merge(posts_with_special_comments_with_ratings).count)
316
+ end
317
+
318
+ def test_relation_merging_keeps_joining_order
319
+ authors = Author.where(id: 1)
320
+ posts = Post.joins(:author).merge(authors)
321
+ comments = Comment.joins(:post).merge(posts)
322
+ ratings = Rating.joins(:comment).merge(comments)
323
+
324
+ assert_equal 3, ratings.count
325
+ end
326
+
327
+ def test_relation_with_annotation_includes_comment_in_to_sql
328
+ post_with_annotation = Post.where(id: 1).annotate("foo")
329
+ assert_match %r{= 1 /\* foo \*/}, post_with_annotation.to_sql
330
+ end
331
+
332
+ def test_relation_with_annotation_includes_comment_in_sql
333
+ post_with_annotation = Post.where(id: 1).annotate("foo")
334
+ assert_sql(%r{/\* foo \*/}) do
335
+ assert post_with_annotation.first, "record should be found"
336
+ end
337
+ end
338
+
339
+ def test_relation_with_annotation_chains_sql_comments
340
+ post_with_annotation = Post.where(id: 1).annotate("foo").annotate("bar")
341
+ assert_sql(%r{/\* foo \*/ /\* bar \*/}) do
342
+ assert post_with_annotation.first, "record should be found"
343
+ end
344
+ end
345
+
346
+ def test_relation_with_annotation_filters_sql_comment_delimiters
347
+ post_with_annotation = Post.where(id: 1).annotate("**//foo//**")
348
+ assert_match %r{= 1 /\* foo \*/}, post_with_annotation.to_sql
349
+ end
350
+
351
+ def test_relation_with_annotation_includes_comment_in_count_query
352
+ post_with_annotation = Post.annotate("foo")
353
+ all_count = Post.all.to_a.count
354
+ assert_sql(%r{/\* foo \*/}) do
355
+ assert_equal all_count, post_with_annotation.count
356
+ end
357
+ end
358
+
359
+ def test_relation_without_annotation_does_not_include_an_empty_comment
360
+ log = capture_sql do
361
+ Post.where(id: 1).first
362
+ end
363
+
364
+ assert_not_predicate log, :empty?
365
+ assert_predicate log.select { |query| query.match?(%r{/\*}) }, :empty?
366
+ end
367
+
368
+ def test_relation_with_optimizer_hints_filters_sql_comment_delimiters
369
+ post_with_hint = Post.where(id: 1).optimizer_hints("**//BADHINT//**")
370
+ assert_match %r{BADHINT}, post_with_hint.to_sql
371
+ assert_no_match %r{\*/BADHINT}, post_with_hint.to_sql
372
+ assert_no_match %r{\*//BADHINT}, post_with_hint.to_sql
373
+ assert_no_match %r{BADHINT/\*}, post_with_hint.to_sql
374
+ assert_no_match %r{BADHINT//\*}, post_with_hint.to_sql
375
+ post_with_hint = Post.where(id: 1).optimizer_hints("/*+ BADHINT */")
376
+ assert_match %r{/\*\+ BADHINT \*/}, post_with_hint.to_sql
377
+ end
378
+
379
+ def test_does_not_duplicate_optimizer_hints_on_merge
380
+ puts "test_does_not_duplicate_optimizer_hints_on_merge"
381
+ escaped_table = Post.connection.quote_table_name("posts")
382
+ expected = "SELECT /*+ OMGHINT */ #{escaped_table}.* FROM #{escaped_table}"
383
+ query = Post.optimizer_hints("OMGHINT").merge(Post.optimizer_hints("OMGHINT")).to_sql
384
+ puts "Expected = #{expected}"
385
+ puts "Query = #{query}"
386
+ assert_equal expected, query
277
387
  end
278
388
 
279
389
  class EnsureRoundTripTypeCasting < ActiveRecord::Type::Value
@@ -281,19 +391,24 @@ module ActiveRecord
281
391
  :string
282
392
  end
283
393
 
394
+ def cast(value)
395
+ raise value unless value == "value from user"
396
+ "cast value"
397
+ end
398
+
284
399
  def deserialize(value)
285
400
  raise value unless value == "type cast for database"
286
401
  "type cast from database"
287
402
  end
288
403
 
289
404
  def serialize(value)
290
- raise value unless value == "value from user"
405
+ raise value unless value == "cast value"
291
406
  "type cast for database"
292
407
  end
293
408
  end
294
409
 
295
410
  class UpdateAllTestModel < ActiveRecord::Base
296
- self.table_name = 'posts'
411
+ self.table_name = "posts"
297
412
 
298
413
  attribute :body, EnsureRoundTripTypeCasting.new
299
414
  end
@@ -304,25 +419,64 @@ module ActiveRecord
304
419
  assert_equal "type cast from database", UpdateAllTestModel.first.body
305
420
  end
306
421
 
307
- private
422
+ def test_skip_preloading_after_arel_has_been_generated
423
+ assert_nothing_raised do
424
+ relation = Comment.all
425
+ relation.arel
426
+ relation.skip_preloading!
427
+ end
428
+ end
429
+
430
+ def test_marshal_load_legacy_relation
431
+ path = File.expand_path(
432
+ "support/marshal_compatibility_fixtures/legacy_relation.dump",
433
+ TEST_ROOT
434
+ )
435
+ assert_equal 11, Marshal.load(File.read(path)).size
436
+ end
437
+
438
+ test "no queries on empty IN" do
439
+ assert_queries(0) do
440
+ Post.where(id: []).load
441
+ end
442
+ end
308
443
 
309
- def skip_if_sqlite3_version_includes_quoting_bug
310
- if sqlite3_version_includes_quoting_bug?
311
- skip <<-ERROR.squish
312
- You are using an outdated version of SQLite3 which has a bug in
313
- quoted column names. Please update SQLite3 and rebuild the sqlite3
314
- ruby gem
315
- ERROR
444
+ test "can unscope empty IN" do
445
+ assert_queries(1) do
446
+ Post.where(id: []).unscope(where: :id).load
316
447
  end
317
448
  end
318
449
 
319
- def sqlite3_version_includes_quoting_bug?
320
- if current_adapter?(:SQLite3Adapter)
321
- selected_quoted_column_names = ActiveRecord::Base.connection.exec_query(
322
- 'SELECT "join" FROM (SELECT id AS "join" FROM posts) subquery'
323
- ).columns
324
- ["join"] != selected_quoted_column_names
450
+ test "no queries on empty relation exists?" do
451
+ assert_queries(0) do
452
+ Post.where(id: []).exists?(123)
325
453
  end
326
454
  end
455
+
456
+ test "no queries on empty condition exists?" do
457
+ assert_queries(0) do
458
+ Post.all.exists?(id: [])
459
+ end
460
+ end
461
+
462
+ private
463
+ def skip_if_sqlite3_version_includes_quoting_bug
464
+ if sqlite3_version_includes_quoting_bug?
465
+ skip <<-ERROR.squish
466
+ You are using an outdated version of SQLite3 which has a bug in
467
+ quoted column names. Please update SQLite3 and rebuild the sqlite3
468
+ ruby gem
469
+ ERROR
470
+ end
471
+ end
472
+
473
+ def sqlite3_version_includes_quoting_bug?
474
+ if current_adapter?(:SQLite3Adapter)
475
+ selected_quoted_column_names = ActiveRecord::Base.connection.exec_query(
476
+ 'SELECT "join" FROM (SELECT id AS "join" FROM posts) subquery'
477
+ ).columns
478
+ ["join"] != selected_quoted_column_names
479
+ end
480
+ end
327
481
  end
328
482
  end