ibm_db 5.2.0-x86-mingw32 → 5.4.0-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/README +1 -1
  5. data/debug.log +1 -0
  6. data/ext/Makefile +28 -24
  7. data/ext/ibm_db.c +66 -65
  8. data/ext/ibm_db.o +0 -0
  9. data/ext/ibm_db.so +0 -0
  10. data/ext/mkmf.log +26 -24
  11. data/ext/ruby_ibm_db_cli.c +1 -0
  12. data/ext/ruby_ibm_db_cli.o +0 -0
  13. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1520 -1282
  14. data/lib/ibm_db.so +1 -0
  15. data/lib/mswin32/ibm_db.rb +3 -1
  16. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  17. data/lib/mswin32/rb3x/i386/ruby31/ibm_db.so +0 -0
  18. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  19. data/test/activejob/destroy_association_async_test.rb +305 -0
  20. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  21. data/test/activejob/helper.rb +15 -0
  22. data/test/assets/schema_dump_5_1.yml +345 -0
  23. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  24. data/test/cases/adapter_test.rb +432 -218
  25. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  26. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  27. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  28. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  29. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  30. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  31. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  32. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  33. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  34. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  35. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  36. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  37. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  38. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  39. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  40. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  41. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  42. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  43. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  44. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  45. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  46. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  47. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  48. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  49. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  50. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  51. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  52. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  53. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  54. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  55. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  56. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  57. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  58. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  59. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  60. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  61. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  62. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  63. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  64. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  65. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  66. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  67. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  68. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  69. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  70. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  71. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  72. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  73. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  74. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  75. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  76. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  77. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  78. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  79. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  80. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  81. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  82. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  83. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  84. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  85. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  86. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  87. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  88. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  89. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  90. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  91. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  92. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  93. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  94. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  95. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  96. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  97. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  98. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  99. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  100. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  101. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  102. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  103. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  104. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  105. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  106. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  107. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  108. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  109. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  110. data/test/cases/aggregations_test.rb +14 -12
  111. data/test/cases/annotate_test.rb +46 -0
  112. data/test/cases/ar_schema_test.rb +153 -86
  113. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  114. data/test/cases/arel/attributes/math_test.rb +83 -0
  115. data/test/cases/arel/attributes_test.rb +27 -0
  116. data/test/cases/arel/collectors/bind_test.rb +40 -0
  117. data/test/cases/arel/collectors/composite_test.rb +47 -0
  118. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  119. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  120. data/test/cases/arel/crud_test.rb +65 -0
  121. data/test/cases/arel/delete_manager_test.rb +53 -0
  122. data/test/cases/arel/factory_methods_test.rb +46 -0
  123. data/test/cases/arel/helper.rb +45 -0
  124. data/test/cases/arel/insert_manager_test.rb +241 -0
  125. data/test/cases/arel/nodes/and_test.rb +30 -0
  126. data/test/cases/arel/nodes/as_test.rb +36 -0
  127. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  128. data/test/cases/arel/nodes/bin_test.rb +35 -0
  129. data/test/cases/arel/nodes/binary_test.rb +29 -0
  130. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  131. data/test/cases/arel/nodes/case_test.rb +96 -0
  132. data/test/cases/arel/nodes/casted_test.rb +18 -0
  133. data/test/cases/arel/nodes/comment_test.rb +22 -0
  134. data/test/cases/arel/nodes/count_test.rb +35 -0
  135. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  136. data/test/cases/arel/nodes/descending_test.rb +46 -0
  137. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  138. data/test/cases/arel/nodes/equality_test.rb +62 -0
  139. data/test/cases/arel/nodes/extract_test.rb +43 -0
  140. data/test/cases/arel/nodes/false_test.rb +21 -0
  141. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  142. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  143. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  144. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  145. data/test/cases/arel/nodes/node_test.rb +22 -0
  146. data/test/cases/arel/nodes/not_test.rb +31 -0
  147. data/test/cases/arel/nodes/or_test.rb +36 -0
  148. data/test/cases/arel/nodes/over_test.rb +69 -0
  149. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  150. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  151. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  152. data/test/cases/arel/nodes/sum_test.rb +35 -0
  153. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  154. data/test/cases/arel/nodes/true_test.rb +21 -0
  155. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  156. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  157. data/test/cases/arel/nodes/window_test.rb +81 -0
  158. data/test/cases/arel/nodes_test.rb +34 -0
  159. data/test/cases/arel/select_manager_test.rb +1238 -0
  160. data/test/cases/arel/support/fake_record.rb +135 -0
  161. data/test/cases/arel/table_test.rb +216 -0
  162. data/test/cases/arel/update_manager_test.rb +126 -0
  163. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  164. data/test/cases/arel/visitors/dot_test.rb +90 -0
  165. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  166. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  167. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  168. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  169. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  170. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  171. data/test/cases/associations/callbacks_test.rb +56 -38
  172. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  173. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  174. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  175. data/test/cases/associations/eager_singularization_test.rb +21 -21
  176. data/test/cases/associations/eager_test.rb +559 -415
  177. data/test/cases/associations/extension_test.rb +18 -12
  178. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  179. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  180. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  181. data/test/cases/associations/has_one_associations_test.rb +294 -129
  182. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  183. data/test/cases/associations/inner_join_association_test.rb +114 -38
  184. data/test/cases/associations/inverse_associations_test.rb +606 -398
  185. data/test/cases/associations/join_model_test.rb +158 -148
  186. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  187. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  188. data/test/cases/associations/required_test.rb +35 -10
  189. data/test/cases/associations_test.rb +241 -110
  190. data/test/cases/attribute_methods/read_test.rb +11 -11
  191. data/test/cases/attribute_methods_test.rb +413 -298
  192. data/test/cases/attributes_test.rb +145 -27
  193. data/test/cases/autosave_association_test.rb +681 -436
  194. data/test/cases/base_prevent_writes_test.rb +229 -0
  195. data/test/cases/base_test.rb +599 -542
  196. data/test/cases/batches_test.rb +288 -82
  197. data/test/cases/binary_test.rb +26 -31
  198. data/test/cases/bind_parameter_test.rb +194 -21
  199. data/test/cases/boolean_test.rb +52 -0
  200. data/test/cases/cache_key_test.rb +110 -5
  201. data/test/cases/calculations_test.rb +740 -177
  202. data/test/cases/callbacks_test.rb +74 -207
  203. data/test/cases/clone_test.rb +15 -10
  204. data/test/cases/coders/json_test.rb +2 -0
  205. data/test/cases/coders/yaml_column_test.rb +16 -13
  206. data/test/cases/collection_cache_key_test.rb +177 -20
  207. data/test/cases/column_alias_test.rb +9 -7
  208. data/test/cases/column_definition_test.rb +10 -68
  209. data/test/cases/comment_test.rb +166 -107
  210. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  211. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  212. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  213. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  214. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  215. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  216. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  217. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  218. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  219. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  220. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  221. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  222. data/test/cases/connection_management_test.rb +13 -11
  223. data/test/cases/connection_pool_test.rb +316 -83
  224. data/test/cases/core_test.rb +82 -58
  225. data/test/cases/counter_cache_test.rb +204 -50
  226. data/test/cases/custom_locking_test.rb +5 -3
  227. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  228. data/test/cases/database_configurations/resolver_test.rb +150 -0
  229. data/test/cases/database_configurations_test.rb +145 -0
  230. data/test/cases/database_selector_test.rb +296 -0
  231. data/test/cases/database_statements_test.rb +18 -16
  232. data/test/cases/date_test.rb +8 -16
  233. data/test/cases/date_time_precision_test.rb +100 -78
  234. data/test/cases/date_time_test.rb +23 -8
  235. data/test/cases/defaults_test.rb +106 -71
  236. data/test/cases/delegated_type_test.rb +57 -0
  237. data/test/cases/dirty_test.rb +419 -223
  238. data/test/cases/disconnected_test.rb +6 -6
  239. data/test/cases/dup_test.rb +54 -27
  240. data/test/cases/enum_test.rb +461 -82
  241. data/test/cases/errors_test.rb +7 -7
  242. data/test/cases/explain_subscriber_test.rb +17 -15
  243. data/test/cases/explain_test.rb +11 -19
  244. data/test/cases/filter_attributes_test.rb +153 -0
  245. data/test/cases/finder_respond_to_test.rb +14 -14
  246. data/test/cases/finder_test.rb +669 -287
  247. data/test/cases/fixture_set/file_test.rb +34 -38
  248. data/test/cases/fixtures_test.rb +833 -176
  249. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  250. data/test/cases/habtm_destroy_order_test.rb +25 -25
  251. data/test/cases/helper.rb +78 -49
  252. data/test/cases/hot_compatibility_test.rb +33 -32
  253. data/test/cases/i18n_test.rb +18 -17
  254. data/test/cases/inheritance_test.rb +180 -115
  255. data/test/cases/insert_all_test.rb +489 -0
  256. data/test/cases/instrumentation_test.rb +101 -0
  257. data/test/cases/integration_test.rb +119 -31
  258. data/test/cases/invalid_connection_test.rb +18 -16
  259. data/test/cases/invertible_migration_test.rb +183 -43
  260. data/test/cases/json_attribute_test.rb +35 -0
  261. data/test/cases/json_serialization_test.rb +57 -58
  262. data/test/cases/json_shared_test_cases.rb +290 -0
  263. data/test/cases/locking_test.rb +413 -119
  264. data/test/cases/log_subscriber_test.rb +68 -26
  265. data/test/cases/marshal_serialization_test.rb +39 -0
  266. data/test/cases/migration/change_schema_test.rb +118 -72
  267. data/test/cases/migration/change_table_test.rb +138 -30
  268. data/test/cases/migration/check_constraint_test.rb +162 -0
  269. data/test/cases/migration/column_attributes_test.rb +45 -35
  270. data/test/cases/migration/column_positioning_test.rb +18 -6
  271. data/test/cases/migration/columns_test.rb +93 -77
  272. data/test/cases/migration/command_recorder_test.rb +121 -34
  273. data/test/cases/migration/compatibility_test.rb +578 -23
  274. data/test/cases/migration/create_join_table_test.rb +35 -25
  275. data/test/cases/migration/foreign_key_test.rb +503 -284
  276. data/test/cases/migration/helper.rb +4 -3
  277. data/test/cases/migration/index_test.rb +119 -70
  278. data/test/cases/migration/logger_test.rb +9 -6
  279. data/test/cases/migration/pending_migrations_test.rb +88 -34
  280. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  281. data/test/cases/migration/references_index_test.rb +38 -19
  282. data/test/cases/migration/references_statements_test.rb +15 -14
  283. data/test/cases/migration/rename_table_test.rb +53 -30
  284. data/test/cases/migration_test.rb +637 -269
  285. data/test/cases/migrator_test.rb +191 -135
  286. data/test/cases/mixin_test.rb +7 -11
  287. data/test/cases/modules_test.rb +36 -34
  288. data/test/cases/multi_db_migrator_test.rb +223 -0
  289. data/test/cases/multiparameter_attributes_test.rb +60 -33
  290. data/test/cases/multiple_db_test.rb +16 -22
  291. data/test/cases/nested_attributes_test.rb +341 -320
  292. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  293. data/test/cases/null_relation_test.rb +84 -0
  294. data/test/cases/numeric_data_test.rb +93 -0
  295. data/test/cases/persistence_test.rb +361 -269
  296. data/test/cases/pooled_connections_test.rb +18 -26
  297. data/test/cases/prepared_statement_status_test.rb +48 -0
  298. data/test/cases/primary_keys_test.rb +210 -104
  299. data/test/cases/query_cache_test.rb +610 -141
  300. data/test/cases/quoting_test.rb +132 -31
  301. data/test/cases/readonly_test.rb +49 -48
  302. data/test/cases/reaper_test.rb +146 -32
  303. data/test/cases/reflection_test.rb +167 -156
  304. data/test/cases/relation/delegation_test.rb +49 -36
  305. data/test/cases/relation/delete_all_test.rb +117 -0
  306. data/test/cases/relation/merging_test.rb +319 -42
  307. data/test/cases/relation/mutation_test.rb +55 -93
  308. data/test/cases/relation/or_test.rb +129 -29
  309. data/test/cases/relation/predicate_builder_test.rb +21 -6
  310. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  311. data/test/cases/relation/select_test.rb +67 -0
  312. data/test/cases/relation/update_all_test.rb +317 -0
  313. data/test/cases/relation/where_chain_test.rb +68 -32
  314. data/test/cases/relation/where_clause_test.rb +136 -61
  315. data/test/cases/relation/where_test.rb +155 -48
  316. data/test/cases/relation_test.rb +266 -112
  317. data/test/cases/relations_test.rb +969 -744
  318. data/test/cases/reload_models_test.rb +13 -9
  319. data/test/cases/reserved_word_test.rb +141 -0
  320. data/test/cases/result_test.rb +68 -17
  321. data/test/cases/sanitize_test.rb +87 -71
  322. data/test/cases/schema_dumper_test.rb +221 -128
  323. data/test/cases/schema_loading_test.rb +3 -2
  324. data/test/cases/scoping/default_scoping_test.rb +185 -144
  325. data/test/cases/scoping/named_scoping_test.rb +177 -89
  326. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  327. data/test/cases/secure_token_test.rb +18 -3
  328. data/test/cases/serialization_test.rb +30 -28
  329. data/test/cases/serialized_attribute_test.rb +133 -42
  330. data/test/cases/signed_id_test.rb +168 -0
  331. data/test/cases/statement_cache_test.rb +41 -24
  332. data/test/cases/statement_invalid_test.rb +42 -0
  333. data/test/cases/store_test.rb +180 -55
  334. data/test/cases/strict_loading_test.rb +473 -0
  335. data/test/cases/suppressor_test.rb +26 -12
  336. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  337. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  338. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  339. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  340. data/test/cases/test_case.rb +51 -40
  341. data/test/cases/test_databases_test.rb +79 -0
  342. data/test/cases/test_fixtures_test.rb +79 -19
  343. data/test/cases/time_precision_test.rb +98 -76
  344. data/test/cases/timestamp_test.rb +102 -99
  345. data/test/cases/touch_later_test.rb +12 -10
  346. data/test/cases/transaction_callbacks_test.rb +344 -90
  347. data/test/cases/transaction_isolation_test.rb +12 -12
  348. data/test/cases/transactions_test.rb +612 -162
  349. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  350. data/test/cases/type/date_time_test.rb +4 -2
  351. data/test/cases/type/integer_test.rb +4 -2
  352. data/test/cases/type/string_test.rb +10 -8
  353. data/test/cases/type/time_test.rb +28 -0
  354. data/test/cases/type/type_map_test.rb +29 -28
  355. data/test/cases/type/unsigned_integer_test.rb +19 -0
  356. data/test/cases/type_test.rb +2 -0
  357. data/test/cases/types_test.rb +3 -1
  358. data/test/cases/unconnected_test.rb +14 -1
  359. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  360. data/test/cases/validations/absence_validation_test.rb +19 -17
  361. data/test/cases/validations/association_validation_test.rb +30 -28
  362. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  363. data/test/cases/validations/i18n_validation_test.rb +22 -21
  364. data/test/cases/validations/length_validation_test.rb +34 -33
  365. data/test/cases/validations/numericality_validation_test.rb +181 -0
  366. data/test/cases/validations/presence_validation_test.rb +21 -19
  367. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  368. data/test/cases/validations_repair_helper.rb +2 -0
  369. data/test/cases/validations_test.rb +61 -26
  370. data/test/cases/view_test.rb +122 -116
  371. data/test/cases/yaml_serialization_test.rb +79 -34
  372. data/test/config.example.yml +19 -19
  373. data/test/config.rb +3 -1
  374. data/test/config.yml +16 -6
  375. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  376. data/test/fixtures/author_addresses.yml +1 -8
  377. data/test/fixtures/authors.yml +1 -7
  378. data/test/fixtures/binaries.yml +4 -0
  379. data/test/fixtures/books.yml +9 -2
  380. data/test/fixtures/categories_posts.yml +3 -0
  381. data/test/fixtures/citations.yml +5 -0
  382. data/test/fixtures/comments.yml +7 -0
  383. data/test/fixtures/companies.yml +5 -0
  384. data/test/fixtures/computers.yml +2 -0
  385. data/test/fixtures/customers.yml +10 -1
  386. data/test/fixtures/developers.yml +1 -1
  387. data/test/fixtures/essays.yml +10 -0
  388. data/test/fixtures/faces.yml +3 -3
  389. data/test/fixtures/humans.yml +5 -0
  390. data/test/fixtures/interests.yml +7 -7
  391. data/test/fixtures/memberships.yml +7 -0
  392. data/test/fixtures/minimalistics.yml +3 -0
  393. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  394. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  395. data/test/fixtures/naked/yml/parrots.yml +1 -0
  396. data/test/fixtures/other_books.yml +26 -0
  397. data/test/fixtures/other_posts.yml +1 -0
  398. data/test/fixtures/parrots.yml +7 -1
  399. data/test/fixtures/pirates.yml +3 -0
  400. data/test/fixtures/posts.yml +11 -3
  401. data/test/fixtures/readers.yml +6 -0
  402. data/test/fixtures/reserved_words/values.yml +2 -2
  403. data/test/fixtures/sponsors.yml +3 -0
  404. data/test/fixtures/strict_zines.yml +2 -0
  405. data/test/fixtures/subscribers.yml +1 -1
  406. data/test/fixtures/tasks.yml +1 -1
  407. data/test/fixtures/warehouse-things.yml +3 -0
  408. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  409. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  410. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  411. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  412. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  413. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  414. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  415. data/test/migrations/rename/1_we_need_things.rb +2 -0
  416. data/test/migrations/rename/2_rename_things.rb +2 -0
  417. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  419. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  420. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  421. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  422. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  423. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  424. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  425. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  426. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  427. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  428. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  429. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  430. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  431. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  432. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  433. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  434. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  435. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  436. data/test/models/account.rb +46 -0
  437. data/test/models/admin/account.rb +3 -1
  438. data/test/models/admin/randomly_named_c1.rb +2 -0
  439. data/test/models/admin/user.rb +16 -8
  440. data/test/models/admin.rb +4 -2
  441. data/test/models/aircraft.rb +3 -1
  442. data/test/models/arunit2_model.rb +2 -0
  443. data/test/models/author.rb +153 -102
  444. data/test/models/auto_id.rb +2 -0
  445. data/test/models/autoloadable/extra_firm.rb +2 -0
  446. data/test/models/binary.rb +3 -1
  447. data/test/models/binary_field.rb +6 -0
  448. data/test/models/bird.rb +13 -1
  449. data/test/models/book.rb +14 -4
  450. data/test/models/book_destroy_async.rb +24 -0
  451. data/test/models/boolean.rb +5 -0
  452. data/test/models/bulb.rb +13 -4
  453. data/test/models/cake_designer.rb +2 -0
  454. data/test/models/car.rb +17 -10
  455. data/test/models/carrier.rb +2 -0
  456. data/test/models/cart.rb +5 -0
  457. data/test/models/cat.rb +2 -0
  458. data/test/models/categorization.rb +8 -6
  459. data/test/models/category.rb +28 -16
  460. data/test/models/chef.rb +2 -0
  461. data/test/models/citation.rb +5 -1
  462. data/test/models/club.rb +13 -10
  463. data/test/models/college.rb +4 -2
  464. data/test/models/column.rb +2 -0
  465. data/test/models/column_name.rb +2 -0
  466. data/test/models/comment.rb +32 -10
  467. data/test/models/company.rb +102 -106
  468. data/test/models/company_in_module.rb +27 -26
  469. data/test/models/computer.rb +3 -1
  470. data/test/models/contact.rb +15 -13
  471. data/test/models/content.rb +5 -3
  472. data/test/models/contract.rb +21 -3
  473. data/test/models/country.rb +2 -4
  474. data/test/models/course.rb +3 -1
  475. data/test/models/customer.rb +10 -8
  476. data/test/models/customer_carrier.rb +2 -0
  477. data/test/models/dashboard.rb +2 -0
  478. data/test/models/default.rb +2 -0
  479. data/test/models/department.rb +2 -0
  480. data/test/models/destroy_async_parent.rb +15 -0
  481. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  482. data/test/models/developer.rb +152 -85
  483. data/test/models/dl_keyed_belongs_to.rb +13 -0
  484. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  485. data/test/models/dl_keyed_has_many.rb +5 -0
  486. data/test/models/dl_keyed_has_many_through.rb +5 -0
  487. data/test/models/dl_keyed_has_one.rb +5 -0
  488. data/test/models/dl_keyed_join.rb +10 -0
  489. data/test/models/dog.rb +2 -0
  490. data/test/models/dog_lover.rb +2 -0
  491. data/test/models/doubloon.rb +3 -1
  492. data/test/models/drink_designer.rb +17 -0
  493. data/test/models/edge.rb +4 -2
  494. data/test/models/electron.rb +2 -0
  495. data/test/models/engine.rb +3 -2
  496. data/test/models/entrant.rb +2 -0
  497. data/test/models/entry.rb +5 -0
  498. data/test/models/essay.rb +6 -3
  499. data/test/models/essay_destroy_async.rb +12 -0
  500. data/test/models/event.rb +3 -1
  501. data/test/models/eye.rb +5 -3
  502. data/test/models/face.rb +14 -6
  503. data/test/models/family.rb +6 -0
  504. data/test/models/family_tree.rb +6 -0
  505. data/test/models/friendship.rb +5 -3
  506. data/test/models/frog.rb +8 -0
  507. data/test/models/guid.rb +3 -1
  508. data/test/models/guitar.rb +2 -0
  509. data/test/models/hotel.rb +5 -3
  510. data/test/models/human.rb +39 -0
  511. data/test/models/image.rb +3 -1
  512. data/test/models/interest.rb +14 -3
  513. data/test/models/invoice.rb +4 -2
  514. data/test/models/item.rb +3 -1
  515. data/test/models/job.rb +5 -3
  516. data/test/models/joke.rb +4 -2
  517. data/test/models/keyboard.rb +3 -1
  518. data/test/models/legacy_thing.rb +2 -0
  519. data/test/models/lesson.rb +2 -0
  520. data/test/models/line_item.rb +3 -1
  521. data/test/models/liquid.rb +2 -0
  522. data/test/models/matey.rb +3 -1
  523. data/test/models/measurement.rb +4 -0
  524. data/test/models/member.rb +23 -20
  525. data/test/models/member_detail.rb +3 -0
  526. data/test/models/member_type.rb +2 -0
  527. data/test/models/membership.rb +4 -1
  528. data/test/models/mentor.rb +3 -1
  529. data/test/models/message.rb +5 -0
  530. data/test/models/minimalistic.rb +2 -0
  531. data/test/models/minivan.rb +3 -2
  532. data/test/models/mixed_case_monkey.rb +3 -1
  533. data/test/models/molecule.rb +2 -0
  534. data/test/models/mouse.rb +6 -0
  535. data/test/models/movie.rb +2 -0
  536. data/test/models/node.rb +4 -2
  537. data/test/models/non_primary_key.rb +2 -0
  538. data/test/models/notification.rb +2 -0
  539. data/test/models/numeric_data.rb +12 -0
  540. data/test/models/order.rb +4 -2
  541. data/test/models/organization.rb +9 -7
  542. data/test/models/other_dog.rb +3 -1
  543. data/test/models/owner.rb +6 -4
  544. data/test/models/parrot.rb +12 -4
  545. data/test/models/person.rb +59 -54
  546. data/test/models/personal_legacy_thing.rb +3 -1
  547. data/test/models/pet.rb +4 -2
  548. data/test/models/pet_treasure.rb +2 -0
  549. data/test/models/pirate.rb +67 -43
  550. data/test/models/possession.rb +3 -1
  551. data/test/models/post.rb +184 -86
  552. data/test/models/price_estimate.rb +11 -1
  553. data/test/models/professor.rb +3 -1
  554. data/test/models/project.rb +14 -12
  555. data/test/models/publisher/article.rb +2 -0
  556. data/test/models/publisher/magazine.rb +2 -0
  557. data/test/models/publisher.rb +2 -0
  558. data/test/models/randomly_named_c1.rb +2 -0
  559. data/test/models/rating.rb +5 -1
  560. data/test/models/reader.rb +7 -5
  561. data/test/models/recipe.rb +2 -0
  562. data/test/models/record.rb +2 -0
  563. data/test/models/reference.rb +6 -3
  564. data/test/models/reply.rb +39 -21
  565. data/test/models/room.rb +6 -0
  566. data/test/models/section.rb +6 -0
  567. data/test/models/seminar.rb +6 -0
  568. data/test/models/session.rb +6 -0
  569. data/test/models/ship.rb +12 -9
  570. data/test/models/ship_part.rb +5 -3
  571. data/test/models/shop.rb +4 -2
  572. data/test/models/shop_account.rb +2 -0
  573. data/test/models/speedometer.rb +2 -0
  574. data/test/models/sponsor.rb +8 -5
  575. data/test/models/squeak.rb +6 -0
  576. data/test/models/strict_zine.rb +7 -0
  577. data/test/models/string_key_object.rb +2 -0
  578. data/test/models/student.rb +2 -0
  579. data/test/models/subscriber.rb +4 -2
  580. data/test/models/subscription.rb +5 -1
  581. data/test/models/tag.rb +6 -3
  582. data/test/models/tagging.rb +13 -6
  583. data/test/models/task.rb +2 -0
  584. data/test/models/topic.rb +54 -19
  585. data/test/models/toy.rb +4 -0
  586. data/test/models/traffic_light.rb +2 -0
  587. data/test/models/treasure.rb +5 -3
  588. data/test/models/treaty.rb +2 -4
  589. data/test/models/tree.rb +2 -0
  590. data/test/models/tuning_peg.rb +2 -0
  591. data/test/models/tyre.rb +2 -0
  592. data/test/models/user.rb +12 -4
  593. data/test/models/uuid_child.rb +2 -0
  594. data/test/models/uuid_item.rb +2 -0
  595. data/test/models/uuid_parent.rb +2 -0
  596. data/test/models/vegetables.rb +12 -3
  597. data/test/models/vertex.rb +6 -4
  598. data/test/models/warehouse_thing.rb +2 -0
  599. data/test/models/wheel.rb +3 -1
  600. data/test/models/without_table.rb +3 -1
  601. data/test/models/zine.rb +3 -1
  602. data/test/schema/mysql2_specific_schema.rb +49 -35
  603. data/test/schema/oracle_specific_schema.rb +13 -15
  604. data/test/schema/postgresql_specific_schema.rb +51 -40
  605. data/test/schema/schema.rb +334 -154
  606. data/test/schema/sqlite_specific_schema.rb +9 -16
  607. data/test/support/config.rb +26 -26
  608. data/test/support/connection.rb +14 -8
  609. data/test/support/connection_helper.rb +3 -1
  610. data/test/support/ddl_helper.rb +2 -0
  611. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  618. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  619. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  620. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  621. data/test/support/schema_dumping_helper.rb +2 -0
  622. data/test/support/stubs/strong_parameters.rb +40 -0
  623. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  624. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  625. metadata +192 -14
@@ -0,0 +1,157 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+
5
+ module Arel
6
+ module Visitors
7
+ class MysqlTest < Arel::Spec
8
+ before do
9
+ @visitor = MySQL.new Table.engine.connection
10
+ end
11
+
12
+ def compile(node)
13
+ @visitor.accept(node, Collectors::SQLString.new).value
14
+ end
15
+
16
+ ###
17
+ # :'(
18
+ # To retrieve all rows from a certain offset up to the end of the result set,
19
+ # you can use some large number for the second parameter.
20
+ # https://dev.mysql.com/doc/refman/en/select.html
21
+ it "defaults limit to 18446744073709551615" do
22
+ stmt = Nodes::SelectStatement.new
23
+ stmt.offset = Nodes::Offset.new(1)
24
+ sql = compile(stmt)
25
+ _(sql).must_be_like "SELECT FROM DUAL LIMIT 18446744073709551615 OFFSET 1"
26
+ end
27
+
28
+ it "should escape LIMIT" do
29
+ sc = Arel::Nodes::UpdateStatement.new
30
+ sc.relation = Table.new(:users)
31
+ sc.limit = Nodes::Limit.new(Nodes.build_quoted("omg"))
32
+ assert_equal("UPDATE \"users\" LIMIT 'omg'", compile(sc))
33
+ end
34
+
35
+ it "uses DUAL for empty from" do
36
+ stmt = Nodes::SelectStatement.new
37
+ sql = compile(stmt)
38
+ _(sql).must_be_like "SELECT FROM DUAL"
39
+ end
40
+
41
+ describe "locking" do
42
+ it "defaults to FOR UPDATE when locking" do
43
+ node = Nodes::Lock.new(Arel.sql("FOR UPDATE"))
44
+ _(compile(node)).must_be_like "FOR UPDATE"
45
+ end
46
+
47
+ it "allows a custom string to be used as a lock" do
48
+ node = Nodes::Lock.new(Arel.sql("LOCK IN SHARE MODE"))
49
+ _(compile(node)).must_be_like "LOCK IN SHARE MODE"
50
+ end
51
+ end
52
+
53
+ describe "concat" do
54
+ it "concats columns" do
55
+ @table = Table.new(:users)
56
+ query = @table[:name].concat(@table[:name])
57
+ _(compile(query)).must_be_like %{
58
+ CONCAT("users"."name", "users"."name")
59
+ }
60
+ end
61
+
62
+ it "concats a string" do
63
+ @table = Table.new(:users)
64
+ query = @table[:name].concat(Nodes.build_quoted("abc"))
65
+ _(compile(query)).must_be_like %{
66
+ CONCAT("users"."name", 'abc')
67
+ }
68
+ end
69
+ end
70
+
71
+ describe "Nodes::IsNotDistinctFrom" do
72
+ it "should construct a valid generic SQL statement" do
73
+ test = Table.new(:users)[:name].is_not_distinct_from "Aaron Patterson"
74
+ _(compile(test)).must_be_like %{
75
+ "users"."name" <=> 'Aaron Patterson'
76
+ }
77
+ end
78
+
79
+ it "should handle column names on both sides" do
80
+ test = Table.new(:users)[:first_name].is_not_distinct_from Table.new(:users)[:last_name]
81
+ _(compile(test)).must_be_like %{
82
+ "users"."first_name" <=> "users"."last_name"
83
+ }
84
+ end
85
+
86
+ it "should handle nil" do
87
+ @table = Table.new(:users)
88
+ val = Nodes.build_quoted(nil, @table[:active])
89
+ sql = compile Nodes::IsNotDistinctFrom.new(@table[:name], val)
90
+ _(sql).must_be_like %{ "users"."name" <=> NULL }
91
+ end
92
+ end
93
+
94
+ describe "Nodes::IsDistinctFrom" do
95
+ it "should handle column names on both sides" do
96
+ test = Table.new(:users)[:first_name].is_distinct_from Table.new(:users)[:last_name]
97
+ _(compile(test)).must_be_like %{
98
+ NOT "users"."first_name" <=> "users"."last_name"
99
+ }
100
+ end
101
+
102
+ it "should handle nil" do
103
+ @table = Table.new(:users)
104
+ val = Nodes.build_quoted(nil, @table[:active])
105
+ sql = compile Nodes::IsDistinctFrom.new(@table[:name], val)
106
+ _(sql).must_be_like %{ NOT "users"."name" <=> NULL }
107
+ end
108
+ end
109
+
110
+ describe "Nodes::Regexp" do
111
+ before do
112
+ @table = Table.new(:users)
113
+ @attr = @table[:id]
114
+ end
115
+
116
+ it "should know how to visit" do
117
+ node = @table[:name].matches_regexp("foo.*")
118
+ _(node).must_be_kind_of Nodes::Regexp
119
+ _(compile(node)).must_be_like %{
120
+ "users"."name" REGEXP 'foo.*'
121
+ }
122
+ end
123
+
124
+ it "can handle subqueries" do
125
+ subquery = @table.project(:id).where(@table[:name].matches_regexp("foo.*"))
126
+ node = @attr.in subquery
127
+ _(compile(node)).must_be_like %{
128
+ "users"."id" IN (SELECT id FROM "users" WHERE "users"."name" REGEXP 'foo.*')
129
+ }
130
+ end
131
+ end
132
+
133
+ describe "Nodes::NotRegexp" do
134
+ before do
135
+ @table = Table.new(:users)
136
+ @attr = @table[:id]
137
+ end
138
+
139
+ it "should know how to visit" do
140
+ node = @table[:name].does_not_match_regexp("foo.*")
141
+ _(node).must_be_kind_of Nodes::NotRegexp
142
+ _(compile(node)).must_be_like %{
143
+ "users"."name" NOT REGEXP 'foo.*'
144
+ }
145
+ end
146
+
147
+ it "can handle subqueries" do
148
+ subquery = @table.project(:id).where(@table[:name].does_not_match_regexp("foo.*"))
149
+ node = @attr.in subquery
150
+ _(compile(node)).must_be_like %{
151
+ "users"."id" IN (SELECT id FROM "users" WHERE "users"."name" NOT REGEXP 'foo.*')
152
+ }
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,366 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+
5
+ module Arel
6
+ module Visitors
7
+ class PostgresTest < Arel::Spec
8
+ before do
9
+ @visitor = PostgreSQL.new Table.engine.connection
10
+ @table = Table.new(:users)
11
+ @attr = @table[:id]
12
+ end
13
+
14
+ def compile(node)
15
+ @visitor.accept(node, Collectors::SQLString.new).value
16
+ end
17
+
18
+ describe "locking" do
19
+ it "defaults to FOR UPDATE" do
20
+ _(compile(Nodes::Lock.new(Arel.sql("FOR UPDATE")))).must_be_like %{
21
+ FOR UPDATE
22
+ }
23
+ end
24
+
25
+ it "allows a custom string to be used as a lock" do
26
+ node = Nodes::Lock.new(Arel.sql("FOR SHARE"))
27
+ _(compile(node)).must_be_like %{
28
+ FOR SHARE
29
+ }
30
+ end
31
+ end
32
+
33
+ it "should escape LIMIT" do
34
+ sc = Arel::Nodes::SelectStatement.new
35
+ sc.limit = Nodes::Limit.new(Nodes.build_quoted("omg"))
36
+ sc.cores.first.projections << Arel.sql("DISTINCT ON")
37
+ sc.orders << Arel.sql("xyz")
38
+ sql = compile(sc)
39
+ assert_match(/LIMIT 'omg'/, sql)
40
+ assert_equal 1, sql.scan(/LIMIT/).length, "should have one limit"
41
+ end
42
+
43
+ it "should support DISTINCT ON" do
44
+ core = Arel::Nodes::SelectCore.new
45
+ core.set_quantifier = Arel::Nodes::DistinctOn.new(Arel.sql("aaron"))
46
+ assert_match "DISTINCT ON ( aaron )", compile(core)
47
+ end
48
+
49
+ it "should support DISTINCT" do
50
+ core = Arel::Nodes::SelectCore.new
51
+ core.set_quantifier = Arel::Nodes::Distinct.new
52
+ assert_equal "SELECT DISTINCT", compile(core)
53
+ end
54
+
55
+ it "encloses LATERAL queries in parens" do
56
+ subquery = @table.project(:id).where(@table[:name].matches("foo%"))
57
+ _(compile(subquery.lateral)).must_be_like %{
58
+ LATERAL (SELECT id FROM "users" WHERE "users"."name" ILIKE 'foo%')
59
+ }
60
+ end
61
+
62
+ it "produces LATERAL queries with alias" do
63
+ subquery = @table.project(:id).where(@table[:name].matches("foo%"))
64
+ _(compile(subquery.lateral("bar"))).must_be_like %{
65
+ LATERAL (SELECT id FROM "users" WHERE "users"."name" ILIKE 'foo%') bar
66
+ }
67
+ end
68
+
69
+ describe "Nodes::Matches" do
70
+ it "should know how to visit" do
71
+ node = @table[:name].matches("foo%")
72
+ _(node).must_be_kind_of Nodes::Matches
73
+ _(node.case_sensitive).must_equal(false)
74
+ _(compile(node)).must_be_like %{
75
+ "users"."name" ILIKE 'foo%'
76
+ }
77
+ end
78
+
79
+ it "should know how to visit case sensitive" do
80
+ node = @table[:name].matches("foo%", nil, true)
81
+ _(node.case_sensitive).must_equal(true)
82
+ _(compile(node)).must_be_like %{
83
+ "users"."name" LIKE 'foo%'
84
+ }
85
+ end
86
+
87
+ it "can handle ESCAPE" do
88
+ node = @table[:name].matches("foo!%", "!")
89
+ _(compile(node)).must_be_like %{
90
+ "users"."name" ILIKE 'foo!%' ESCAPE '!'
91
+ }
92
+ end
93
+
94
+ it "can handle subqueries" do
95
+ subquery = @table.project(:id).where(@table[:name].matches("foo%"))
96
+ node = @attr.in subquery
97
+ _(compile(node)).must_be_like %{
98
+ "users"."id" IN (SELECT id FROM "users" WHERE "users"."name" ILIKE 'foo%')
99
+ }
100
+ end
101
+ end
102
+
103
+ describe "Nodes::DoesNotMatch" do
104
+ it "should know how to visit" do
105
+ node = @table[:name].does_not_match("foo%")
106
+ _(node).must_be_kind_of Nodes::DoesNotMatch
107
+ _(node.case_sensitive).must_equal(false)
108
+ _(compile(node)).must_be_like %{
109
+ "users"."name" NOT ILIKE 'foo%'
110
+ }
111
+ end
112
+
113
+ it "should know how to visit case sensitive" do
114
+ node = @table[:name].does_not_match("foo%", nil, true)
115
+ _(node.case_sensitive).must_equal(true)
116
+ _(compile(node)).must_be_like %{
117
+ "users"."name" NOT LIKE 'foo%'
118
+ }
119
+ end
120
+
121
+ it "can handle ESCAPE" do
122
+ node = @table[:name].does_not_match("foo!%", "!")
123
+ _(compile(node)).must_be_like %{
124
+ "users"."name" NOT ILIKE 'foo!%' ESCAPE '!'
125
+ }
126
+ end
127
+
128
+ it "can handle subqueries" do
129
+ subquery = @table.project(:id).where(@table[:name].does_not_match("foo%"))
130
+ node = @attr.in subquery
131
+ _(compile(node)).must_be_like %{
132
+ "users"."id" IN (SELECT id FROM "users" WHERE "users"."name" NOT ILIKE 'foo%')
133
+ }
134
+ end
135
+ end
136
+
137
+ describe "Nodes::Regexp" do
138
+ it "should know how to visit" do
139
+ node = @table[:name].matches_regexp("foo.*")
140
+ _(node).must_be_kind_of Nodes::Regexp
141
+ _(node.case_sensitive).must_equal(true)
142
+ _(compile(node)).must_be_like %{
143
+ "users"."name" ~ 'foo.*'
144
+ }
145
+ end
146
+
147
+ it "can handle case insensitive" do
148
+ node = @table[:name].matches_regexp("foo.*", false)
149
+ _(node).must_be_kind_of Nodes::Regexp
150
+ _(node.case_sensitive).must_equal(false)
151
+ _(compile(node)).must_be_like %{
152
+ "users"."name" ~* 'foo.*'
153
+ }
154
+ end
155
+
156
+ it "can handle subqueries" do
157
+ subquery = @table.project(:id).where(@table[:name].matches_regexp("foo.*"))
158
+ node = @attr.in subquery
159
+ _(compile(node)).must_be_like %{
160
+ "users"."id" IN (SELECT id FROM "users" WHERE "users"."name" ~ 'foo.*')
161
+ }
162
+ end
163
+ end
164
+
165
+ describe "Nodes::NotRegexp" do
166
+ it "should know how to visit" do
167
+ node = @table[:name].does_not_match_regexp("foo.*")
168
+ _(node).must_be_kind_of Nodes::NotRegexp
169
+ _(node.case_sensitive).must_equal(true)
170
+ _(compile(node)).must_be_like %{
171
+ "users"."name" !~ 'foo.*'
172
+ }
173
+ end
174
+
175
+ it "can handle case insensitive" do
176
+ node = @table[:name].does_not_match_regexp("foo.*", false)
177
+ _(node.case_sensitive).must_equal(false)
178
+ _(compile(node)).must_be_like %{
179
+ "users"."name" !~* 'foo.*'
180
+ }
181
+ end
182
+
183
+ it "can handle subqueries" do
184
+ subquery = @table.project(:id).where(@table[:name].does_not_match_regexp("foo.*"))
185
+ node = @attr.in subquery
186
+ _(compile(node)).must_be_like %{
187
+ "users"."id" IN (SELECT id FROM "users" WHERE "users"."name" !~ 'foo.*')
188
+ }
189
+ end
190
+ end
191
+
192
+ describe "Nodes::BindParam" do
193
+ it "increments each bind param" do
194
+ query = @table[:name].eq(Arel::Nodes::BindParam.new(1))
195
+ .and(@table[:id].eq(Arel::Nodes::BindParam.new(1)))
196
+ _(compile(query)).must_be_like %{
197
+ "users"."name" = $1 AND "users"."id" = $2
198
+ }
199
+ end
200
+ end
201
+
202
+ describe "Nodes::Cube" do
203
+ it "should know how to visit with array arguments" do
204
+ node = Arel::Nodes::Cube.new([@table[:name], @table[:bool]])
205
+ _(compile(node)).must_be_like %{
206
+ CUBE( "users"."name", "users"."bool" )
207
+ }
208
+ end
209
+
210
+ it "should know how to visit with CubeDimension Argument" do
211
+ dimensions = Arel::Nodes::GroupingElement.new([@table[:name], @table[:bool]])
212
+ node = Arel::Nodes::Cube.new(dimensions)
213
+ _(compile(node)).must_be_like %{
214
+ CUBE( "users"."name", "users"."bool" )
215
+ }
216
+ end
217
+
218
+ it "should know how to generate parenthesis when supplied with many Dimensions" do
219
+ dim1 = Arel::Nodes::GroupingElement.new(@table[:name])
220
+ dim2 = Arel::Nodes::GroupingElement.new([@table[:bool], @table[:created_at]])
221
+ node = Arel::Nodes::Cube.new([dim1, dim2])
222
+ _(compile(node)).must_be_like %{
223
+ CUBE( ( "users"."name" ), ( "users"."bool", "users"."created_at" ) )
224
+ }
225
+ end
226
+ end
227
+
228
+ describe "Nodes::GroupingSet" do
229
+ it "should know how to visit with array arguments" do
230
+ node = Arel::Nodes::GroupingSet.new([@table[:name], @table[:bool]])
231
+ _(compile(node)).must_be_like %{
232
+ GROUPING SETS( "users"."name", "users"."bool" )
233
+ }
234
+ end
235
+
236
+ it "should know how to visit with CubeDimension Argument" do
237
+ group = Arel::Nodes::GroupingElement.new([@table[:name], @table[:bool]])
238
+ node = Arel::Nodes::GroupingSet.new(group)
239
+ _(compile(node)).must_be_like %{
240
+ GROUPING SETS( "users"."name", "users"."bool" )
241
+ }
242
+ end
243
+
244
+ it "should know how to generate parenthesis when supplied with many Dimensions" do
245
+ group1 = Arel::Nodes::GroupingElement.new(@table[:name])
246
+ group2 = Arel::Nodes::GroupingElement.new([@table[:bool], @table[:created_at]])
247
+ node = Arel::Nodes::GroupingSet.new([group1, group2])
248
+ _(compile(node)).must_be_like %{
249
+ GROUPING SETS( ( "users"."name" ), ( "users"."bool", "users"."created_at" ) )
250
+ }
251
+ end
252
+ end
253
+
254
+ describe "Nodes::RollUp" do
255
+ it "should know how to visit with array arguments" do
256
+ node = Arel::Nodes::RollUp.new([@table[:name], @table[:bool]])
257
+ _(compile(node)).must_be_like %{
258
+ ROLLUP( "users"."name", "users"."bool" )
259
+ }
260
+ end
261
+
262
+ it "should know how to visit with CubeDimension Argument" do
263
+ group = Arel::Nodes::GroupingElement.new([@table[:name], @table[:bool]])
264
+ node = Arel::Nodes::RollUp.new(group)
265
+ _(compile(node)).must_be_like %{
266
+ ROLLUP( "users"."name", "users"."bool" )
267
+ }
268
+ end
269
+
270
+ it "should know how to generate parenthesis when supplied with many Dimensions" do
271
+ group1 = Arel::Nodes::GroupingElement.new(@table[:name])
272
+ group2 = Arel::Nodes::GroupingElement.new([@table[:bool], @table[:created_at]])
273
+ node = Arel::Nodes::RollUp.new([group1, group2])
274
+ _(compile(node)).must_be_like %{
275
+ ROLLUP( ( "users"."name" ), ( "users"."bool", "users"."created_at" ) )
276
+ }
277
+ end
278
+ end
279
+
280
+ describe "Nodes::IsNotDistinctFrom" do
281
+ it "should construct a valid generic SQL statement" do
282
+ test = Table.new(:users)[:name].is_not_distinct_from "Aaron Patterson"
283
+ _(compile(test)).must_be_like %{
284
+ "users"."name" IS NOT DISTINCT FROM 'Aaron Patterson'
285
+ }
286
+ end
287
+
288
+ it "should handle column names on both sides" do
289
+ test = Table.new(:users)[:first_name].is_not_distinct_from Table.new(:users)[:last_name]
290
+ _(compile(test)).must_be_like %{
291
+ "users"."first_name" IS NOT DISTINCT FROM "users"."last_name"
292
+ }
293
+ end
294
+
295
+ it "should handle nil" do
296
+ @table = Table.new(:users)
297
+ val = Nodes.build_quoted(nil, @table[:active])
298
+ sql = compile Nodes::IsNotDistinctFrom.new(@table[:name], val)
299
+ _(sql).must_be_like %{ "users"."name" IS NOT DISTINCT FROM NULL }
300
+ end
301
+ end
302
+
303
+ describe "Nodes::IsDistinctFrom" do
304
+ it "should handle column names on both sides" do
305
+ test = Table.new(:users)[:first_name].is_distinct_from Table.new(:users)[:last_name]
306
+ _(compile(test)).must_be_like %{
307
+ "users"."first_name" IS DISTINCT FROM "users"."last_name"
308
+ }
309
+ end
310
+
311
+ it "should handle nil" do
312
+ @table = Table.new(:users)
313
+ val = Nodes.build_quoted(nil, @table[:active])
314
+ sql = compile Nodes::IsDistinctFrom.new(@table[:name], val)
315
+ _(sql).must_be_like %{ "users"."name" IS DISTINCT FROM NULL }
316
+ end
317
+ end
318
+
319
+ describe "Nodes::Ordering" do
320
+ it "should handle nulls first" do
321
+ test = Table.new(:users)[:first_name].desc.nulls_first
322
+ _(compile(test)).must_be_like %{
323
+ "users"."first_name" DESC NULLS FIRST
324
+ }
325
+ end
326
+
327
+ it "should handle nulls last" do
328
+ test = Table.new(:users)[:first_name].desc.nulls_last
329
+ _(compile(test)).must_be_like %{
330
+ "users"."first_name" DESC NULLS LAST
331
+ }
332
+ end
333
+
334
+ it "should handle nulls first reversed" do
335
+ test = Table.new(:users)[:first_name].desc.nulls_first.reverse
336
+ _(compile(test)).must_be_like %{
337
+ "users"."first_name" ASC NULLS LAST
338
+ }
339
+ end
340
+
341
+ it "should handle nulls last reversed" do
342
+ test = Table.new(:users)[:first_name].desc.nulls_last.reverse
343
+ _(compile(test)).must_be_like %{
344
+ "users"."first_name" ASC NULLS FIRST
345
+ }
346
+ end
347
+ end
348
+
349
+ describe "Nodes::InfixOperation" do
350
+ it "should handle Contains" do
351
+ inner = Nodes.build_quoted('{"foo":"bar"}')
352
+ outer = Table.new(:products)[:metadata]
353
+ sql = compile Nodes::Contains.new(outer, inner)
354
+ _(sql).must_be_like %{ "products"."metadata" @> '{"foo":"bar"}' }
355
+ end
356
+
357
+ it "should handle Overlaps" do
358
+ column = Table.new(:products)[:tags]
359
+ search = Nodes.build_quoted("{foo,bar,baz}")
360
+ sql = compile Nodes::Overlaps.new(column, search)
361
+ _(sql).must_be_like %{ "products"."tags" && '{foo,bar,baz}' }
362
+ end
363
+ end
364
+ end
365
+ end
366
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+
5
+ module Arel
6
+ module Visitors
7
+ class SqliteTest < Arel::Spec
8
+ before do
9
+ @visitor = SQLite.new Table.engine.connection
10
+ end
11
+
12
+ def compile(node)
13
+ @visitor.accept(node, Collectors::SQLString.new).value
14
+ end
15
+
16
+ it "defaults limit to -1" do
17
+ stmt = Nodes::SelectStatement.new
18
+ stmt.offset = Nodes::Offset.new(1)
19
+ sql = @visitor.accept(stmt, Collectors::SQLString.new).value
20
+ _(sql).must_be_like "SELECT LIMIT -1 OFFSET 1"
21
+ end
22
+
23
+ it "does not support locking" do
24
+ node = Nodes::Lock.new(Arel.sql("FOR UPDATE"))
25
+ assert_equal "", @visitor.accept(node, Collectors::SQLString.new).value
26
+ end
27
+
28
+ it "does not support boolean" do
29
+ node = Nodes::True.new()
30
+ assert_equal "1", @visitor.accept(node, Collectors::SQLString.new).value
31
+ node = Nodes::False.new()
32
+ assert_equal "0", @visitor.accept(node, Collectors::SQLString.new).value
33
+ end
34
+
35
+ describe "Nodes::IsNotDistinctFrom" do
36
+ it "should construct a valid generic SQL statement" do
37
+ test = Table.new(:users)[:name].is_not_distinct_from "Aaron Patterson"
38
+ _(compile(test)).must_be_like %{
39
+ "users"."name" IS 'Aaron Patterson'
40
+ }
41
+ end
42
+
43
+ it "should handle column names on both sides" do
44
+ test = Table.new(:users)[:first_name].is_not_distinct_from Table.new(:users)[:last_name]
45
+ _(compile(test)).must_be_like %{
46
+ "users"."first_name" IS "users"."last_name"
47
+ }
48
+ end
49
+
50
+ it "should handle nil" do
51
+ @table = Table.new(:users)
52
+ val = Nodes.build_quoted(nil, @table[:active])
53
+ sql = compile Nodes::IsNotDistinctFrom.new(@table[:name], val)
54
+ _(sql).must_be_like %{ "users"."name" IS NULL }
55
+ end
56
+ end
57
+
58
+ describe "Nodes::IsDistinctFrom" do
59
+ it "should handle column names on both sides" do
60
+ test = Table.new(:users)[:first_name].is_distinct_from Table.new(:users)[:last_name]
61
+ _(compile(test)).must_be_like %{
62
+ "users"."first_name" IS NOT "users"."last_name"
63
+ }
64
+ end
65
+
66
+ it "should handle nil" do
67
+ @table = Table.new(:users)
68
+ val = Nodes.build_quoted(nil, @table[:active])
69
+ sql = compile Nodes::IsDistinctFrom.new(@table[:name], val)
70
+ _(sql).must_be_like %{ "users"."name" IS NOT NULL }
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end