ibm_db 5.2.0-x86-mingw32 → 5.3.2-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/ext/Makefile +15 -13
  5. data/ext/ibm_db.c +62 -57
  6. data/ext/ibm_db.o +0 -0
  7. data/ext/ibm_db.so +0 -0
  8. data/ext/mkmf.log +26 -24
  9. data/ext/ruby_ibm_db_cli.c +1 -0
  10. data/ext/ruby_ibm_db_cli.o +0 -0
  11. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
  12. data/lib/ibm_db.so +1 -0
  13. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  14. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  15. data/test/activejob/destroy_association_async_test.rb +305 -0
  16. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  17. data/test/activejob/helper.rb +15 -0
  18. data/test/assets/schema_dump_5_1.yml +345 -0
  19. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  20. data/test/cases/adapter_test.rb +432 -218
  21. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  22. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  23. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  24. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  25. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  26. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  27. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  28. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  29. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  30. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  31. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  32. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  33. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  34. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  35. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  36. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  37. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  38. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  39. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  40. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  41. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  42. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  43. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  44. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  45. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  46. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  47. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  48. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  49. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  50. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  51. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  52. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  53. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  54. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  55. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  56. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  57. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  58. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  59. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  60. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  61. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  62. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  63. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  64. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  65. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  66. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  67. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  68. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  69. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  70. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  71. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  72. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  73. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  74. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  75. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  76. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  77. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  78. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  79. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  80. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  81. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  82. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  83. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  84. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  85. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  86. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  87. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  88. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  89. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  90. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  91. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  92. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  93. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  94. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  95. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  96. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  97. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  98. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  99. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  100. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  101. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  102. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  103. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  104. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  105. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  106. data/test/cases/aggregations_test.rb +14 -12
  107. data/test/cases/annotate_test.rb +46 -0
  108. data/test/cases/ar_schema_test.rb +153 -86
  109. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  110. data/test/cases/arel/attributes/math_test.rb +83 -0
  111. data/test/cases/arel/attributes_test.rb +27 -0
  112. data/test/cases/arel/collectors/bind_test.rb +40 -0
  113. data/test/cases/arel/collectors/composite_test.rb +47 -0
  114. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  115. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  116. data/test/cases/arel/crud_test.rb +65 -0
  117. data/test/cases/arel/delete_manager_test.rb +53 -0
  118. data/test/cases/arel/factory_methods_test.rb +46 -0
  119. data/test/cases/arel/helper.rb +45 -0
  120. data/test/cases/arel/insert_manager_test.rb +241 -0
  121. data/test/cases/arel/nodes/and_test.rb +30 -0
  122. data/test/cases/arel/nodes/as_test.rb +36 -0
  123. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  124. data/test/cases/arel/nodes/bin_test.rb +35 -0
  125. data/test/cases/arel/nodes/binary_test.rb +29 -0
  126. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  127. data/test/cases/arel/nodes/case_test.rb +96 -0
  128. data/test/cases/arel/nodes/casted_test.rb +18 -0
  129. data/test/cases/arel/nodes/comment_test.rb +22 -0
  130. data/test/cases/arel/nodes/count_test.rb +35 -0
  131. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  132. data/test/cases/arel/nodes/descending_test.rb +46 -0
  133. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  134. data/test/cases/arel/nodes/equality_test.rb +62 -0
  135. data/test/cases/arel/nodes/extract_test.rb +43 -0
  136. data/test/cases/arel/nodes/false_test.rb +21 -0
  137. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  138. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  139. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  140. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  141. data/test/cases/arel/nodes/node_test.rb +22 -0
  142. data/test/cases/arel/nodes/not_test.rb +31 -0
  143. data/test/cases/arel/nodes/or_test.rb +36 -0
  144. data/test/cases/arel/nodes/over_test.rb +69 -0
  145. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  146. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  147. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  148. data/test/cases/arel/nodes/sum_test.rb +35 -0
  149. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  150. data/test/cases/arel/nodes/true_test.rb +21 -0
  151. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  152. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  153. data/test/cases/arel/nodes/window_test.rb +81 -0
  154. data/test/cases/arel/nodes_test.rb +34 -0
  155. data/test/cases/arel/select_manager_test.rb +1238 -0
  156. data/test/cases/arel/support/fake_record.rb +135 -0
  157. data/test/cases/arel/table_test.rb +216 -0
  158. data/test/cases/arel/update_manager_test.rb +126 -0
  159. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  160. data/test/cases/arel/visitors/dot_test.rb +90 -0
  161. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  162. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  163. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  164. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  165. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  166. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  167. data/test/cases/associations/callbacks_test.rb +56 -38
  168. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  169. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  170. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  171. data/test/cases/associations/eager_singularization_test.rb +21 -21
  172. data/test/cases/associations/eager_test.rb +559 -415
  173. data/test/cases/associations/extension_test.rb +18 -12
  174. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  175. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  176. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  177. data/test/cases/associations/has_one_associations_test.rb +294 -129
  178. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  179. data/test/cases/associations/inner_join_association_test.rb +114 -38
  180. data/test/cases/associations/inverse_associations_test.rb +606 -398
  181. data/test/cases/associations/join_model_test.rb +158 -148
  182. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  183. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  184. data/test/cases/associations/required_test.rb +35 -10
  185. data/test/cases/associations_test.rb +241 -110
  186. data/test/cases/attribute_methods/read_test.rb +11 -11
  187. data/test/cases/attribute_methods_test.rb +413 -298
  188. data/test/cases/attributes_test.rb +145 -27
  189. data/test/cases/autosave_association_test.rb +681 -436
  190. data/test/cases/base_prevent_writes_test.rb +229 -0
  191. data/test/cases/base_test.rb +599 -542
  192. data/test/cases/batches_test.rb +288 -82
  193. data/test/cases/binary_test.rb +26 -31
  194. data/test/cases/bind_parameter_test.rb +194 -21
  195. data/test/cases/boolean_test.rb +52 -0
  196. data/test/cases/cache_key_test.rb +110 -5
  197. data/test/cases/calculations_test.rb +740 -177
  198. data/test/cases/callbacks_test.rb +74 -207
  199. data/test/cases/clone_test.rb +15 -10
  200. data/test/cases/coders/json_test.rb +2 -0
  201. data/test/cases/coders/yaml_column_test.rb +16 -13
  202. data/test/cases/collection_cache_key_test.rb +177 -20
  203. data/test/cases/column_alias_test.rb +9 -7
  204. data/test/cases/column_definition_test.rb +10 -68
  205. data/test/cases/comment_test.rb +166 -107
  206. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  207. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  208. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  209. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  210. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  211. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  212. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  213. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  214. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  215. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  216. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  217. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  218. data/test/cases/connection_management_test.rb +13 -11
  219. data/test/cases/connection_pool_test.rb +316 -83
  220. data/test/cases/core_test.rb +82 -58
  221. data/test/cases/counter_cache_test.rb +204 -50
  222. data/test/cases/custom_locking_test.rb +5 -3
  223. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  224. data/test/cases/database_configurations/resolver_test.rb +150 -0
  225. data/test/cases/database_configurations_test.rb +145 -0
  226. data/test/cases/database_selector_test.rb +296 -0
  227. data/test/cases/database_statements_test.rb +18 -16
  228. data/test/cases/date_test.rb +8 -16
  229. data/test/cases/date_time_precision_test.rb +100 -78
  230. data/test/cases/date_time_test.rb +23 -8
  231. data/test/cases/defaults_test.rb +106 -71
  232. data/test/cases/delegated_type_test.rb +57 -0
  233. data/test/cases/dirty_test.rb +419 -223
  234. data/test/cases/disconnected_test.rb +6 -6
  235. data/test/cases/dup_test.rb +54 -27
  236. data/test/cases/enum_test.rb +461 -82
  237. data/test/cases/errors_test.rb +7 -7
  238. data/test/cases/explain_subscriber_test.rb +17 -15
  239. data/test/cases/explain_test.rb +11 -19
  240. data/test/cases/filter_attributes_test.rb +153 -0
  241. data/test/cases/finder_respond_to_test.rb +14 -14
  242. data/test/cases/finder_test.rb +669 -287
  243. data/test/cases/fixture_set/file_test.rb +34 -38
  244. data/test/cases/fixtures_test.rb +833 -176
  245. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  246. data/test/cases/habtm_destroy_order_test.rb +25 -25
  247. data/test/cases/helper.rb +78 -49
  248. data/test/cases/hot_compatibility_test.rb +33 -32
  249. data/test/cases/i18n_test.rb +18 -17
  250. data/test/cases/inheritance_test.rb +180 -115
  251. data/test/cases/insert_all_test.rb +489 -0
  252. data/test/cases/instrumentation_test.rb +101 -0
  253. data/test/cases/integration_test.rb +119 -31
  254. data/test/cases/invalid_connection_test.rb +18 -16
  255. data/test/cases/invertible_migration_test.rb +183 -43
  256. data/test/cases/json_attribute_test.rb +35 -0
  257. data/test/cases/json_serialization_test.rb +57 -58
  258. data/test/cases/json_shared_test_cases.rb +290 -0
  259. data/test/cases/locking_test.rb +413 -119
  260. data/test/cases/log_subscriber_test.rb +68 -26
  261. data/test/cases/marshal_serialization_test.rb +39 -0
  262. data/test/cases/migration/change_schema_test.rb +118 -72
  263. data/test/cases/migration/change_table_test.rb +138 -30
  264. data/test/cases/migration/check_constraint_test.rb +162 -0
  265. data/test/cases/migration/column_attributes_test.rb +45 -35
  266. data/test/cases/migration/column_positioning_test.rb +18 -6
  267. data/test/cases/migration/columns_test.rb +93 -77
  268. data/test/cases/migration/command_recorder_test.rb +121 -34
  269. data/test/cases/migration/compatibility_test.rb +578 -23
  270. data/test/cases/migration/create_join_table_test.rb +35 -25
  271. data/test/cases/migration/foreign_key_test.rb +503 -284
  272. data/test/cases/migration/helper.rb +4 -3
  273. data/test/cases/migration/index_test.rb +119 -70
  274. data/test/cases/migration/logger_test.rb +9 -6
  275. data/test/cases/migration/pending_migrations_test.rb +88 -34
  276. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  277. data/test/cases/migration/references_index_test.rb +38 -19
  278. data/test/cases/migration/references_statements_test.rb +15 -14
  279. data/test/cases/migration/rename_table_test.rb +53 -30
  280. data/test/cases/migration_test.rb +637 -269
  281. data/test/cases/migrator_test.rb +191 -135
  282. data/test/cases/mixin_test.rb +7 -11
  283. data/test/cases/modules_test.rb +36 -34
  284. data/test/cases/multi_db_migrator_test.rb +223 -0
  285. data/test/cases/multiparameter_attributes_test.rb +60 -33
  286. data/test/cases/multiple_db_test.rb +16 -22
  287. data/test/cases/nested_attributes_test.rb +341 -320
  288. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  289. data/test/cases/null_relation_test.rb +84 -0
  290. data/test/cases/numeric_data_test.rb +93 -0
  291. data/test/cases/persistence_test.rb +361 -269
  292. data/test/cases/pooled_connections_test.rb +18 -26
  293. data/test/cases/prepared_statement_status_test.rb +48 -0
  294. data/test/cases/primary_keys_test.rb +210 -104
  295. data/test/cases/query_cache_test.rb +610 -141
  296. data/test/cases/quoting_test.rb +132 -31
  297. data/test/cases/readonly_test.rb +49 -48
  298. data/test/cases/reaper_test.rb +146 -32
  299. data/test/cases/reflection_test.rb +167 -156
  300. data/test/cases/relation/delegation_test.rb +49 -36
  301. data/test/cases/relation/delete_all_test.rb +117 -0
  302. data/test/cases/relation/merging_test.rb +319 -42
  303. data/test/cases/relation/mutation_test.rb +55 -93
  304. data/test/cases/relation/or_test.rb +129 -29
  305. data/test/cases/relation/predicate_builder_test.rb +21 -6
  306. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  307. data/test/cases/relation/select_test.rb +67 -0
  308. data/test/cases/relation/update_all_test.rb +317 -0
  309. data/test/cases/relation/where_chain_test.rb +68 -32
  310. data/test/cases/relation/where_clause_test.rb +136 -61
  311. data/test/cases/relation/where_test.rb +155 -48
  312. data/test/cases/relation_test.rb +266 -112
  313. data/test/cases/relations_test.rb +969 -744
  314. data/test/cases/reload_models_test.rb +13 -9
  315. data/test/cases/reserved_word_test.rb +141 -0
  316. data/test/cases/result_test.rb +68 -17
  317. data/test/cases/sanitize_test.rb +87 -71
  318. data/test/cases/schema_dumper_test.rb +221 -128
  319. data/test/cases/schema_loading_test.rb +3 -2
  320. data/test/cases/scoping/default_scoping_test.rb +185 -144
  321. data/test/cases/scoping/named_scoping_test.rb +177 -89
  322. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  323. data/test/cases/secure_token_test.rb +18 -3
  324. data/test/cases/serialization_test.rb +30 -28
  325. data/test/cases/serialized_attribute_test.rb +133 -42
  326. data/test/cases/signed_id_test.rb +168 -0
  327. data/test/cases/statement_cache_test.rb +41 -24
  328. data/test/cases/statement_invalid_test.rb +42 -0
  329. data/test/cases/store_test.rb +180 -55
  330. data/test/cases/strict_loading_test.rb +473 -0
  331. data/test/cases/suppressor_test.rb +26 -12
  332. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  333. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  334. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  335. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  336. data/test/cases/test_case.rb +51 -40
  337. data/test/cases/test_databases_test.rb +79 -0
  338. data/test/cases/test_fixtures_test.rb +79 -19
  339. data/test/cases/time_precision_test.rb +98 -76
  340. data/test/cases/timestamp_test.rb +102 -99
  341. data/test/cases/touch_later_test.rb +12 -10
  342. data/test/cases/transaction_callbacks_test.rb +344 -90
  343. data/test/cases/transaction_isolation_test.rb +12 -12
  344. data/test/cases/transactions_test.rb +612 -162
  345. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  346. data/test/cases/type/date_time_test.rb +4 -2
  347. data/test/cases/type/integer_test.rb +4 -2
  348. data/test/cases/type/string_test.rb +10 -8
  349. data/test/cases/type/time_test.rb +28 -0
  350. data/test/cases/type/type_map_test.rb +29 -28
  351. data/test/cases/type/unsigned_integer_test.rb +19 -0
  352. data/test/cases/type_test.rb +2 -0
  353. data/test/cases/types_test.rb +3 -1
  354. data/test/cases/unconnected_test.rb +14 -1
  355. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  356. data/test/cases/validations/absence_validation_test.rb +19 -17
  357. data/test/cases/validations/association_validation_test.rb +30 -28
  358. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  359. data/test/cases/validations/i18n_validation_test.rb +22 -21
  360. data/test/cases/validations/length_validation_test.rb +34 -33
  361. data/test/cases/validations/numericality_validation_test.rb +181 -0
  362. data/test/cases/validations/presence_validation_test.rb +21 -19
  363. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  364. data/test/cases/validations_repair_helper.rb +2 -0
  365. data/test/cases/validations_test.rb +61 -26
  366. data/test/cases/view_test.rb +122 -116
  367. data/test/cases/yaml_serialization_test.rb +79 -34
  368. data/test/config.example.yml +19 -19
  369. data/test/config.rb +3 -1
  370. data/test/config.yml +16 -6
  371. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  372. data/test/fixtures/author_addresses.yml +1 -8
  373. data/test/fixtures/authors.yml +1 -7
  374. data/test/fixtures/binaries.yml +4 -0
  375. data/test/fixtures/books.yml +9 -2
  376. data/test/fixtures/categories_posts.yml +3 -0
  377. data/test/fixtures/citations.yml +5 -0
  378. data/test/fixtures/comments.yml +7 -0
  379. data/test/fixtures/companies.yml +5 -0
  380. data/test/fixtures/computers.yml +2 -0
  381. data/test/fixtures/customers.yml +10 -1
  382. data/test/fixtures/developers.yml +1 -1
  383. data/test/fixtures/essays.yml +10 -0
  384. data/test/fixtures/faces.yml +3 -3
  385. data/test/fixtures/humans.yml +5 -0
  386. data/test/fixtures/interests.yml +7 -7
  387. data/test/fixtures/memberships.yml +7 -0
  388. data/test/fixtures/minimalistics.yml +3 -0
  389. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  390. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  391. data/test/fixtures/naked/yml/parrots.yml +1 -0
  392. data/test/fixtures/other_books.yml +26 -0
  393. data/test/fixtures/other_posts.yml +1 -0
  394. data/test/fixtures/parrots.yml +7 -1
  395. data/test/fixtures/pirates.yml +3 -0
  396. data/test/fixtures/posts.yml +11 -3
  397. data/test/fixtures/readers.yml +6 -0
  398. data/test/fixtures/reserved_words/values.yml +2 -2
  399. data/test/fixtures/sponsors.yml +3 -0
  400. data/test/fixtures/strict_zines.yml +2 -0
  401. data/test/fixtures/subscribers.yml +1 -1
  402. data/test/fixtures/tasks.yml +1 -1
  403. data/test/fixtures/warehouse-things.yml +3 -0
  404. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  405. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  406. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  407. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  408. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  409. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  410. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  411. data/test/migrations/rename/1_we_need_things.rb +2 -0
  412. data/test/migrations/rename/2_rename_things.rb +2 -0
  413. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  414. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  415. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  416. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  417. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  419. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  420. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  421. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  422. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  423. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  424. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  425. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  426. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  427. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  428. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  429. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  430. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  431. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  432. data/test/models/account.rb +46 -0
  433. data/test/models/admin/account.rb +3 -1
  434. data/test/models/admin/randomly_named_c1.rb +2 -0
  435. data/test/models/admin/user.rb +16 -8
  436. data/test/models/admin.rb +4 -2
  437. data/test/models/aircraft.rb +3 -1
  438. data/test/models/arunit2_model.rb +2 -0
  439. data/test/models/author.rb +153 -102
  440. data/test/models/auto_id.rb +2 -0
  441. data/test/models/autoloadable/extra_firm.rb +2 -0
  442. data/test/models/binary.rb +3 -1
  443. data/test/models/binary_field.rb +6 -0
  444. data/test/models/bird.rb +13 -1
  445. data/test/models/book.rb +14 -4
  446. data/test/models/book_destroy_async.rb +24 -0
  447. data/test/models/boolean.rb +5 -0
  448. data/test/models/bulb.rb +13 -4
  449. data/test/models/cake_designer.rb +2 -0
  450. data/test/models/car.rb +17 -10
  451. data/test/models/carrier.rb +2 -0
  452. data/test/models/cart.rb +5 -0
  453. data/test/models/cat.rb +2 -0
  454. data/test/models/categorization.rb +8 -6
  455. data/test/models/category.rb +28 -16
  456. data/test/models/chef.rb +2 -0
  457. data/test/models/citation.rb +5 -1
  458. data/test/models/club.rb +13 -10
  459. data/test/models/college.rb +4 -2
  460. data/test/models/column.rb +2 -0
  461. data/test/models/column_name.rb +2 -0
  462. data/test/models/comment.rb +32 -10
  463. data/test/models/company.rb +102 -106
  464. data/test/models/company_in_module.rb +27 -26
  465. data/test/models/computer.rb +3 -1
  466. data/test/models/contact.rb +15 -13
  467. data/test/models/content.rb +5 -3
  468. data/test/models/contract.rb +21 -3
  469. data/test/models/country.rb +2 -4
  470. data/test/models/course.rb +3 -1
  471. data/test/models/customer.rb +10 -8
  472. data/test/models/customer_carrier.rb +2 -0
  473. data/test/models/dashboard.rb +2 -0
  474. data/test/models/default.rb +2 -0
  475. data/test/models/department.rb +2 -0
  476. data/test/models/destroy_async_parent.rb +15 -0
  477. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  478. data/test/models/developer.rb +152 -85
  479. data/test/models/dl_keyed_belongs_to.rb +13 -0
  480. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  481. data/test/models/dl_keyed_has_many.rb +5 -0
  482. data/test/models/dl_keyed_has_many_through.rb +5 -0
  483. data/test/models/dl_keyed_has_one.rb +5 -0
  484. data/test/models/dl_keyed_join.rb +10 -0
  485. data/test/models/dog.rb +2 -0
  486. data/test/models/dog_lover.rb +2 -0
  487. data/test/models/doubloon.rb +3 -1
  488. data/test/models/drink_designer.rb +17 -0
  489. data/test/models/edge.rb +4 -2
  490. data/test/models/electron.rb +2 -0
  491. data/test/models/engine.rb +3 -2
  492. data/test/models/entrant.rb +2 -0
  493. data/test/models/entry.rb +5 -0
  494. data/test/models/essay.rb +6 -3
  495. data/test/models/essay_destroy_async.rb +12 -0
  496. data/test/models/event.rb +3 -1
  497. data/test/models/eye.rb +5 -3
  498. data/test/models/face.rb +14 -6
  499. data/test/models/family.rb +6 -0
  500. data/test/models/family_tree.rb +6 -0
  501. data/test/models/friendship.rb +5 -3
  502. data/test/models/frog.rb +8 -0
  503. data/test/models/guid.rb +3 -1
  504. data/test/models/guitar.rb +2 -0
  505. data/test/models/hotel.rb +5 -3
  506. data/test/models/human.rb +39 -0
  507. data/test/models/image.rb +3 -1
  508. data/test/models/interest.rb +14 -3
  509. data/test/models/invoice.rb +4 -2
  510. data/test/models/item.rb +3 -1
  511. data/test/models/job.rb +5 -3
  512. data/test/models/joke.rb +4 -2
  513. data/test/models/keyboard.rb +3 -1
  514. data/test/models/legacy_thing.rb +2 -0
  515. data/test/models/lesson.rb +2 -0
  516. data/test/models/line_item.rb +3 -1
  517. data/test/models/liquid.rb +2 -0
  518. data/test/models/matey.rb +3 -1
  519. data/test/models/measurement.rb +4 -0
  520. data/test/models/member.rb +23 -20
  521. data/test/models/member_detail.rb +3 -0
  522. data/test/models/member_type.rb +2 -0
  523. data/test/models/membership.rb +4 -1
  524. data/test/models/mentor.rb +3 -1
  525. data/test/models/message.rb +5 -0
  526. data/test/models/minimalistic.rb +2 -0
  527. data/test/models/minivan.rb +3 -2
  528. data/test/models/mixed_case_monkey.rb +3 -1
  529. data/test/models/molecule.rb +2 -0
  530. data/test/models/mouse.rb +6 -0
  531. data/test/models/movie.rb +2 -0
  532. data/test/models/node.rb +4 -2
  533. data/test/models/non_primary_key.rb +2 -0
  534. data/test/models/notification.rb +2 -0
  535. data/test/models/numeric_data.rb +12 -0
  536. data/test/models/order.rb +4 -2
  537. data/test/models/organization.rb +9 -7
  538. data/test/models/other_dog.rb +3 -1
  539. data/test/models/owner.rb +6 -4
  540. data/test/models/parrot.rb +12 -4
  541. data/test/models/person.rb +59 -54
  542. data/test/models/personal_legacy_thing.rb +3 -1
  543. data/test/models/pet.rb +4 -2
  544. data/test/models/pet_treasure.rb +2 -0
  545. data/test/models/pirate.rb +67 -43
  546. data/test/models/possession.rb +3 -1
  547. data/test/models/post.rb +184 -86
  548. data/test/models/price_estimate.rb +11 -1
  549. data/test/models/professor.rb +3 -1
  550. data/test/models/project.rb +14 -12
  551. data/test/models/publisher/article.rb +2 -0
  552. data/test/models/publisher/magazine.rb +2 -0
  553. data/test/models/publisher.rb +2 -0
  554. data/test/models/randomly_named_c1.rb +2 -0
  555. data/test/models/rating.rb +5 -1
  556. data/test/models/reader.rb +7 -5
  557. data/test/models/recipe.rb +2 -0
  558. data/test/models/record.rb +2 -0
  559. data/test/models/reference.rb +6 -3
  560. data/test/models/reply.rb +39 -21
  561. data/test/models/room.rb +6 -0
  562. data/test/models/section.rb +6 -0
  563. data/test/models/seminar.rb +6 -0
  564. data/test/models/session.rb +6 -0
  565. data/test/models/ship.rb +12 -9
  566. data/test/models/ship_part.rb +5 -3
  567. data/test/models/shop.rb +4 -2
  568. data/test/models/shop_account.rb +2 -0
  569. data/test/models/speedometer.rb +2 -0
  570. data/test/models/sponsor.rb +8 -5
  571. data/test/models/squeak.rb +6 -0
  572. data/test/models/strict_zine.rb +7 -0
  573. data/test/models/string_key_object.rb +2 -0
  574. data/test/models/student.rb +2 -0
  575. data/test/models/subscriber.rb +4 -2
  576. data/test/models/subscription.rb +5 -1
  577. data/test/models/tag.rb +6 -3
  578. data/test/models/tagging.rb +13 -6
  579. data/test/models/task.rb +2 -0
  580. data/test/models/topic.rb +54 -19
  581. data/test/models/toy.rb +4 -0
  582. data/test/models/traffic_light.rb +2 -0
  583. data/test/models/treasure.rb +5 -3
  584. data/test/models/treaty.rb +2 -4
  585. data/test/models/tree.rb +2 -0
  586. data/test/models/tuning_peg.rb +2 -0
  587. data/test/models/tyre.rb +2 -0
  588. data/test/models/user.rb +12 -4
  589. data/test/models/uuid_child.rb +2 -0
  590. data/test/models/uuid_item.rb +2 -0
  591. data/test/models/uuid_parent.rb +2 -0
  592. data/test/models/vegetables.rb +12 -3
  593. data/test/models/vertex.rb +6 -4
  594. data/test/models/warehouse_thing.rb +2 -0
  595. data/test/models/wheel.rb +3 -1
  596. data/test/models/without_table.rb +3 -1
  597. data/test/models/zine.rb +3 -1
  598. data/test/schema/mysql2_specific_schema.rb +49 -35
  599. data/test/schema/oracle_specific_schema.rb +13 -15
  600. data/test/schema/postgresql_specific_schema.rb +51 -40
  601. data/test/schema/schema.rb +334 -154
  602. data/test/schema/sqlite_specific_schema.rb +9 -16
  603. data/test/support/config.rb +26 -26
  604. data/test/support/connection.rb +14 -8
  605. data/test/support/connection_helper.rb +3 -1
  606. data/test/support/ddl_helper.rb +2 -0
  607. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  608. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  609. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  610. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  611. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  617. data/test/support/schema_dumping_helper.rb +2 -0
  618. data/test/support/stubs/strong_parameters.rb +40 -0
  619. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  620. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  621. metadata +190 -14
@@ -0,0 +1,135 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/enumerable"
4
+
5
+ require "date"
6
+ module FakeRecord
7
+ class Column < Struct.new(:name, :type)
8
+ end
9
+
10
+ class Connection
11
+ attr_reader :tables
12
+ attr_accessor :visitor
13
+
14
+ def initialize(visitor = nil)
15
+ @tables = %w{ users photos developers products}
16
+ @columns = {
17
+ "users" => [
18
+ Column.new("id", :integer),
19
+ Column.new("name", :string),
20
+ Column.new("bool", :boolean),
21
+ Column.new("created_at", :date)
22
+ ],
23
+ "products" => [
24
+ Column.new("id", :integer),
25
+ Column.new("price", :decimal)
26
+ ]
27
+ }
28
+ @columns_hash = {
29
+ "users" => @columns["users"].index_by(&:name),
30
+ "products" => @columns["products"].index_by(&:name)
31
+ }
32
+ @primary_keys = {
33
+ "users" => "id",
34
+ "products" => "id"
35
+ }
36
+ @visitor = visitor
37
+ end
38
+
39
+ def columns_hash(table_name)
40
+ @columns_hash[table_name]
41
+ end
42
+
43
+ def primary_key(name)
44
+ @primary_keys[name.to_s]
45
+ end
46
+
47
+ def data_source_exists?(name)
48
+ @tables.include? name.to_s
49
+ end
50
+
51
+ def columns(name, message = nil)
52
+ @columns[name.to_s]
53
+ end
54
+
55
+ def quote_table_name(name)
56
+ "\"#{name}\""
57
+ end
58
+
59
+ def quote_column_name(name)
60
+ "\"#{name}\""
61
+ end
62
+
63
+ def sanitize_as_sql_comment(comment)
64
+ comment
65
+ end
66
+
67
+ def schema_cache
68
+ self
69
+ end
70
+
71
+ def quote(thing)
72
+ case thing
73
+ when DateTime
74
+ "'#{thing.strftime("%Y-%m-%d %H:%M:%S")}'"
75
+ when Date
76
+ "'#{thing.strftime("%Y-%m-%d")}'"
77
+ when true
78
+ "'t'"
79
+ when false
80
+ "'f'"
81
+ when nil
82
+ "NULL"
83
+ when Numeric
84
+ thing
85
+ else
86
+ "'#{thing.to_s.gsub("'", "\\\\'")}'"
87
+ end
88
+ end
89
+ end
90
+
91
+ class ConnectionPool
92
+ class Spec < Struct.new(:adapter, keyword_init: true)
93
+ end
94
+
95
+ attr_reader :spec, :connection
96
+
97
+ def initialize
98
+ @spec = Spec.new(adapter: "america")
99
+ @connection = Connection.new
100
+ @connection.visitor = Arel::Visitors::ToSql.new(connection)
101
+ end
102
+
103
+ def with_connection
104
+ yield connection
105
+ end
106
+
107
+ def table_exists?(name)
108
+ connection.tables.include? name.to_s
109
+ end
110
+
111
+ def columns_hash
112
+ connection.columns_hash
113
+ end
114
+
115
+ def schema_cache
116
+ connection
117
+ end
118
+
119
+ def quote(thing)
120
+ connection.quote thing
121
+ end
122
+ end
123
+
124
+ class Base
125
+ attr_accessor :connection_pool
126
+
127
+ def initialize
128
+ @connection_pool = ConnectionPool.new
129
+ end
130
+
131
+ def connection
132
+ connection_pool.connection
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,216 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "helper"
4
+
5
+ module Arel
6
+ class TableTest < Arel::Spec
7
+ before do
8
+ @relation = Table.new(:users)
9
+ end
10
+
11
+ it "should create join nodes" do
12
+ join = @relation.create_string_join "foo"
13
+ assert_kind_of Arel::Nodes::StringJoin, join
14
+ assert_equal "foo", join.left
15
+ end
16
+
17
+ it "should create join nodes" do
18
+ join = @relation.create_join "foo", "bar"
19
+ assert_kind_of Arel::Nodes::InnerJoin, join
20
+ assert_equal "foo", join.left
21
+ assert_equal "bar", join.right
22
+ end
23
+
24
+ it "should create join nodes with a klass" do
25
+ join = @relation.create_join "foo", "bar", Arel::Nodes::FullOuterJoin
26
+ assert_kind_of Arel::Nodes::FullOuterJoin, join
27
+ assert_equal "foo", join.left
28
+ assert_equal "bar", join.right
29
+ end
30
+
31
+ it "should create join nodes with a klass" do
32
+ join = @relation.create_join "foo", "bar", Arel::Nodes::OuterJoin
33
+ assert_kind_of Arel::Nodes::OuterJoin, join
34
+ assert_equal "foo", join.left
35
+ assert_equal "bar", join.right
36
+ end
37
+
38
+ it "should create join nodes with a klass" do
39
+ join = @relation.create_join "foo", "bar", Arel::Nodes::RightOuterJoin
40
+ assert_kind_of Arel::Nodes::RightOuterJoin, join
41
+ assert_equal "foo", join.left
42
+ assert_equal "bar", join.right
43
+ end
44
+
45
+ it "should return an insert manager" do
46
+ im = @relation.compile_insert "VALUES(NULL)"
47
+ assert_kind_of Arel::InsertManager, im
48
+ im.into Table.new(:users)
49
+ assert_equal "INSERT INTO \"users\" VALUES(NULL)", im.to_sql
50
+ end
51
+
52
+ describe "skip" do
53
+ it "should add an offset" do
54
+ sm = @relation.skip 2
55
+ _(sm.to_sql).must_be_like "SELECT FROM \"users\" OFFSET 2"
56
+ end
57
+ end
58
+
59
+ describe "having" do
60
+ it "adds a having clause" do
61
+ mgr = @relation.having @relation[:id].eq(10)
62
+ _(mgr.to_sql).must_be_like %{
63
+ SELECT FROM "users" HAVING "users"."id" = 10
64
+ }
65
+ end
66
+ end
67
+
68
+ describe "backwards compat" do
69
+ describe "join" do
70
+ it "noops on nil" do
71
+ mgr = @relation.join nil
72
+
73
+ _(mgr.to_sql).must_be_like %{ SELECT FROM "users" }
74
+ end
75
+
76
+ it "raises EmptyJoinError on empty" do
77
+ assert_raises(EmptyJoinError) do
78
+ @relation.join ""
79
+ end
80
+ end
81
+
82
+ it "takes a second argument for join type" do
83
+ right = @relation.alias
84
+ predicate = @relation[:id].eq(right[:id])
85
+ mgr = @relation.join(right, Nodes::OuterJoin).on(predicate)
86
+
87
+ _(mgr.to_sql).must_be_like %{
88
+ SELECT FROM "users"
89
+ LEFT OUTER JOIN "users" "users_2"
90
+ ON "users"."id" = "users_2"."id"
91
+ }
92
+ end
93
+ end
94
+
95
+ describe "join" do
96
+ it "creates an outer join" do
97
+ right = @relation.alias
98
+ predicate = @relation[:id].eq(right[:id])
99
+ mgr = @relation.outer_join(right).on(predicate)
100
+
101
+ _(mgr.to_sql).must_be_like %{
102
+ SELECT FROM "users"
103
+ LEFT OUTER JOIN "users" "users_2"
104
+ ON "users"."id" = "users_2"."id"
105
+ }
106
+ end
107
+ end
108
+ end
109
+
110
+ describe "group" do
111
+ it "should create a group" do
112
+ manager = @relation.group @relation[:id]
113
+ _(manager.to_sql).must_be_like %{
114
+ SELECT FROM "users" GROUP BY "users"."id"
115
+ }
116
+ end
117
+ end
118
+
119
+ describe "alias" do
120
+ it "should create a node that proxies to a table" do
121
+ node = @relation.alias
122
+ _(node.name).must_equal "users_2"
123
+ _(node[:id].relation).must_equal node
124
+ end
125
+ end
126
+
127
+ describe "new" do
128
+ it "should accept a hash" do
129
+ rel = Table.new :users, as: "foo"
130
+ _(rel.table_alias).must_equal "foo"
131
+ end
132
+
133
+ it "ignores as if it equals name" do
134
+ rel = Table.new :users, as: "users"
135
+ _(rel.table_alias).must_be_nil
136
+ end
137
+ end
138
+
139
+ describe "order" do
140
+ it "should take an order" do
141
+ manager = @relation.order "foo"
142
+ _(manager.to_sql).must_be_like %{ SELECT FROM "users" ORDER BY foo }
143
+ end
144
+ end
145
+
146
+ describe "take" do
147
+ it "should add a limit" do
148
+ manager = @relation.take 1
149
+ manager.project Nodes::SqlLiteral.new "*"
150
+ _(manager.to_sql).must_be_like %{ SELECT * FROM "users" LIMIT 1 }
151
+ end
152
+ end
153
+
154
+ describe "project" do
155
+ it "can project" do
156
+ manager = @relation.project Nodes::SqlLiteral.new "*"
157
+ _(manager.to_sql).must_be_like %{ SELECT * FROM "users" }
158
+ end
159
+
160
+ it "takes multiple parameters" do
161
+ manager = @relation.project Nodes::SqlLiteral.new("*"), Nodes::SqlLiteral.new("*")
162
+ _(manager.to_sql).must_be_like %{ SELECT *, * FROM "users" }
163
+ end
164
+ end
165
+
166
+ describe "where" do
167
+ it "returns a tree manager" do
168
+ manager = @relation.where @relation[:id].eq 1
169
+ manager.project @relation[:id]
170
+ _(manager).must_be_kind_of TreeManager
171
+ _(manager.to_sql).must_be_like %{
172
+ SELECT "users"."id"
173
+ FROM "users"
174
+ WHERE "users"."id" = 1
175
+ }
176
+ end
177
+ end
178
+
179
+ it "should have a name" do
180
+ _(@relation.name).must_equal "users"
181
+ end
182
+
183
+ it "should have a table name" do
184
+ _(@relation.table_name).must_equal "users"
185
+ end
186
+
187
+ describe "[]" do
188
+ describe "when given a Symbol" do
189
+ it "manufactures an attribute if the symbol names an attribute within the relation" do
190
+ column = @relation[:id]
191
+ _(column.name).must_equal "id"
192
+ end
193
+ end
194
+ end
195
+
196
+ describe "equality" do
197
+ it "is equal with equal ivars" do
198
+ relation1 = Table.new(:users)
199
+ relation1.table_alias = "zomg"
200
+ relation2 = Table.new(:users)
201
+ relation2.table_alias = "zomg"
202
+ array = [relation1, relation2]
203
+ assert_equal 1, array.uniq.size
204
+ end
205
+
206
+ it "is not equal with different ivars" do
207
+ relation1 = Table.new(:users)
208
+ relation1.table_alias = "zomg"
209
+ relation2 = Table.new(:users)
210
+ relation2.table_alias = "zomg2"
211
+ array = [relation1, relation2]
212
+ assert_equal 2, array.uniq.size
213
+ end
214
+ end
215
+ end
216
+ end
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "helper"
4
+
5
+ module Arel
6
+ class UpdateManagerTest < Arel::Spec
7
+ describe "new" do
8
+ it "takes an engine" do
9
+ Arel::UpdateManager.new
10
+ end
11
+ end
12
+
13
+ it "should not quote sql literals" do
14
+ table = Table.new(:users)
15
+ um = Arel::UpdateManager.new
16
+ um.table table
17
+ um.set [[table[:name], Arel::Nodes::BindParam.new(1)]]
18
+ _(um.to_sql).must_be_like %{ UPDATE "users" SET "name" = ? }
19
+ end
20
+
21
+ it "handles limit properly" do
22
+ table = Table.new(:users)
23
+ um = Arel::UpdateManager.new
24
+ um.key = "id"
25
+ um.take 10
26
+ um.table table
27
+ um.set [[table[:name], nil]]
28
+ assert_match(/LIMIT 10/, um.to_sql)
29
+ end
30
+
31
+ describe "set" do
32
+ it "updates with null" do
33
+ table = Table.new(:users)
34
+ um = Arel::UpdateManager.new
35
+ um.table table
36
+ um.set [[table[:name], nil]]
37
+ _(um.to_sql).must_be_like %{ UPDATE "users" SET "name" = NULL }
38
+ end
39
+
40
+ it "takes a string" do
41
+ table = Table.new(:users)
42
+ um = Arel::UpdateManager.new
43
+ um.table table
44
+ um.set Nodes::SqlLiteral.new "foo = bar"
45
+ _(um.to_sql).must_be_like %{ UPDATE "users" SET foo = bar }
46
+ end
47
+
48
+ it "takes a list of lists" do
49
+ table = Table.new(:users)
50
+ um = Arel::UpdateManager.new
51
+ um.table table
52
+ um.set [[table[:id], 1], [table[:name], "hello"]]
53
+ _(um.to_sql).must_be_like %{
54
+ UPDATE "users" SET "id" = 1, "name" = 'hello'
55
+ }
56
+ end
57
+
58
+ it "chains" do
59
+ table = Table.new(:users)
60
+ um = Arel::UpdateManager.new
61
+ _(um.set([[table[:id], 1], [table[:name], "hello"]])).must_equal um
62
+ end
63
+ end
64
+
65
+ describe "table" do
66
+ it "generates an update statement" do
67
+ um = Arel::UpdateManager.new
68
+ um.table Table.new(:users)
69
+ _(um.to_sql).must_be_like %{ UPDATE "users" }
70
+ end
71
+
72
+ it "chains" do
73
+ um = Arel::UpdateManager.new
74
+ _(um.table(Table.new(:users))).must_equal um
75
+ end
76
+
77
+ it "generates an update statement with joins" do
78
+ um = Arel::UpdateManager.new
79
+
80
+ table = Table.new(:users)
81
+ join_source = Arel::Nodes::JoinSource.new(
82
+ table,
83
+ [table.create_join(Table.new(:posts))]
84
+ )
85
+
86
+ um.table join_source
87
+ _(um.to_sql).must_be_like %{ UPDATE "users" INNER JOIN "posts" }
88
+ end
89
+ end
90
+
91
+ describe "where" do
92
+ it "generates a where clause" do
93
+ table = Table.new :users
94
+ um = Arel::UpdateManager.new
95
+ um.table table
96
+ um.where table[:id].eq(1)
97
+ _(um.to_sql).must_be_like %{
98
+ UPDATE "users" WHERE "users"."id" = 1
99
+ }
100
+ end
101
+
102
+ it "chains" do
103
+ table = Table.new :users
104
+ um = Arel::UpdateManager.new
105
+ um.table table
106
+ _(um.where(table[:id].eq(1))).must_equal um
107
+ end
108
+ end
109
+
110
+ describe "key" do
111
+ before do
112
+ @table = Table.new :users
113
+ @um = Arel::UpdateManager.new
114
+ @um.key = @table[:foo]
115
+ end
116
+
117
+ it "can be set" do
118
+ _(@um.ast.key).must_equal @table[:foo]
119
+ end
120
+
121
+ it "can be accessed" do
122
+ _(@um.key).must_equal @table[:foo]
123
+ end
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+ require "concurrent"
5
+
6
+ module Arel
7
+ module Visitors
8
+ class DummyVisitor < Visitor
9
+ def initialize
10
+ super
11
+ @barrier = Concurrent::CyclicBarrier.new(2)
12
+ end
13
+
14
+ def visit_Arel_Visitors_DummySuperNode(node)
15
+ 42
16
+ end
17
+
18
+ # This is terrible, but it's the only way to reliably reproduce
19
+ # the possible race where two threads attempt to correct the
20
+ # dispatch hash at the same time.
21
+ def send(*args)
22
+ super
23
+ rescue
24
+ # Both threads try (and fail) to dispatch to the subclass's name
25
+ @barrier.wait
26
+ raise
27
+ ensure
28
+ # Then one thread successfully completes (updating the dispatch
29
+ # table in the process) before the other finishes raising its
30
+ # exception.
31
+ Thread.current[:delay].wait if Thread.current[:delay]
32
+ end
33
+ end
34
+
35
+ class DummySuperNode
36
+ end
37
+
38
+ class DummySubNode < DummySuperNode
39
+ end
40
+
41
+ class DispatchContaminationTest < Arel::Spec
42
+ before do
43
+ @connection = Table.engine.connection
44
+ @table = Table.new(:users)
45
+ end
46
+
47
+ it "dispatches properly after failing upwards" do
48
+ node = Nodes::Union.new(Nodes::True.new, Nodes::False.new)
49
+ assert_equal "( TRUE UNION FALSE )", node.to_sql
50
+
51
+ visitor = Class.new(Visitor) {
52
+ def visit_Arel_Nodes_Union(o); end
53
+ alias :visit_Arel_Nodes_True :visit_Arel_Nodes_Union
54
+ alias :visit_Arel_Nodes_False :visit_Arel_Nodes_Union
55
+ }.new
56
+
57
+ visitor.accept(node)
58
+
59
+ assert_equal "( TRUE UNION FALSE )", node.to_sql
60
+ end
61
+
62
+ it "is threadsafe when implementing superclass fallback" do
63
+ visitor = DummyVisitor.new
64
+ main_thread_finished = Concurrent::Event.new
65
+
66
+ racing_thread = Thread.new do
67
+ Thread.current[:delay] = main_thread_finished
68
+ visitor.accept DummySubNode.new
69
+ end
70
+
71
+ assert_equal 42, visitor.accept(DummySubNode.new)
72
+ main_thread_finished.set
73
+
74
+ assert_equal 42, racing_thread.value
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+ require "active_model/attribute"
5
+
6
+ module Arel
7
+ module Visitors
8
+ class TestDot < Arel::Test
9
+ def setup
10
+ @visitor = Visitors::Dot.new
11
+ end
12
+
13
+ # functions
14
+ [
15
+ Nodes::Sum,
16
+ Nodes::Exists,
17
+ Nodes::Max,
18
+ Nodes::Min,
19
+ Nodes::Avg,
20
+ ].each do |klass|
21
+ define_method("test_#{klass.name.gsub('::', '_')}") do
22
+ op = klass.new(:a, "z")
23
+ @visitor.accept op, Collectors::PlainString.new
24
+ end
25
+ end
26
+
27
+ def test_named_function
28
+ func = Nodes::NamedFunction.new "omg", "omg"
29
+ @visitor.accept func, Collectors::PlainString.new
30
+ end
31
+
32
+ # unary ops
33
+ [
34
+ Arel::Nodes::Not,
35
+ Arel::Nodes::Group,
36
+ Arel::Nodes::On,
37
+ Arel::Nodes::Grouping,
38
+ Arel::Nodes::Offset,
39
+ Arel::Nodes::Ordering,
40
+ Arel::Nodes::UnqualifiedColumn,
41
+ Arel::Nodes::ValuesList,
42
+ Arel::Nodes::Limit,
43
+ ].each do |klass|
44
+ define_method("test_#{klass.name.gsub('::', '_')}") do
45
+ op = klass.new(:a)
46
+ @visitor.accept op, Collectors::PlainString.new
47
+ end
48
+ end
49
+
50
+ # binary ops
51
+ [
52
+ Arel::Nodes::Assignment,
53
+ Arel::Nodes::Between,
54
+ Arel::Nodes::DoesNotMatch,
55
+ Arel::Nodes::Equality,
56
+ Arel::Nodes::GreaterThan,
57
+ Arel::Nodes::GreaterThanOrEqual,
58
+ Arel::Nodes::In,
59
+ Arel::Nodes::LessThan,
60
+ Arel::Nodes::LessThanOrEqual,
61
+ Arel::Nodes::Matches,
62
+ Arel::Nodes::NotEqual,
63
+ Arel::Nodes::NotIn,
64
+ Arel::Nodes::Or,
65
+ Arel::Nodes::TableAlias,
66
+ Arel::Nodes::As,
67
+ Arel::Nodes::DeleteStatement,
68
+ Arel::Nodes::JoinSource,
69
+ Arel::Nodes::Casted,
70
+ ].each do |klass|
71
+ define_method("test_#{klass.name.gsub('::', '_')}") do
72
+ binary = klass.new(:a, :b)
73
+ @visitor.accept binary, Collectors::PlainString.new
74
+ end
75
+ end
76
+
77
+ def test_Arel_Nodes_BindParam
78
+ node = Arel::Nodes::BindParam.new(1)
79
+ collector = Collectors::PlainString.new
80
+ assert_match '[label="<f0>Arel::Nodes::BindParam"]', @visitor.accept(node, collector).value
81
+ end
82
+
83
+ def test_ActiveModel_Attribute
84
+ node = ActiveModel::Attribute.with_cast_value("LIMIT", 1, nil)
85
+ collector = Collectors::PlainString.new
86
+ assert_match '[label="<f0>ActiveModel::Attribute::WithCastValue"]', @visitor.accept(node, collector).value
87
+ end
88
+ end
89
+ end
90
+ end