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