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
@@ -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