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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/ext/Makefile +15 -13
  5. data/ext/ibm_db.c +62 -57
  6. data/ext/ibm_db.o +0 -0
  7. data/ext/ibm_db.so +0 -0
  8. data/ext/mkmf.log +26 -24
  9. data/ext/ruby_ibm_db_cli.c +1 -0
  10. data/ext/ruby_ibm_db_cli.o +0 -0
  11. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
  12. data/lib/ibm_db.so +1 -0
  13. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  14. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  15. data/test/activejob/destroy_association_async_test.rb +305 -0
  16. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  17. data/test/activejob/helper.rb +15 -0
  18. data/test/assets/schema_dump_5_1.yml +345 -0
  19. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  20. data/test/cases/adapter_test.rb +432 -218
  21. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  22. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  23. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  24. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  25. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  26. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  27. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  28. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  29. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  30. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  31. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  32. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  33. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  34. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  35. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  36. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  37. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  38. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  39. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  40. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  41. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  42. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  43. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  44. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  45. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  46. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  47. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  48. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  49. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  50. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  51. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  52. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  53. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  54. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  55. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  56. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  57. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  58. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  59. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  60. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  61. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  62. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  63. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  64. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  65. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  66. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  67. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  68. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  69. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  70. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  71. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  72. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  73. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  74. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  75. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  76. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  77. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  78. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  79. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  80. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  81. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  82. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  83. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  84. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  85. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  86. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  87. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  88. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  89. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  90. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  91. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  92. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  93. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  94. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  95. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  96. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  97. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  98. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  99. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  100. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  101. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  102. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  103. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  104. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  105. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  106. data/test/cases/aggregations_test.rb +14 -12
  107. data/test/cases/annotate_test.rb +46 -0
  108. data/test/cases/ar_schema_test.rb +153 -86
  109. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  110. data/test/cases/arel/attributes/math_test.rb +83 -0
  111. data/test/cases/arel/attributes_test.rb +27 -0
  112. data/test/cases/arel/collectors/bind_test.rb +40 -0
  113. data/test/cases/arel/collectors/composite_test.rb +47 -0
  114. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  115. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  116. data/test/cases/arel/crud_test.rb +65 -0
  117. data/test/cases/arel/delete_manager_test.rb +53 -0
  118. data/test/cases/arel/factory_methods_test.rb +46 -0
  119. data/test/cases/arel/helper.rb +45 -0
  120. data/test/cases/arel/insert_manager_test.rb +241 -0
  121. data/test/cases/arel/nodes/and_test.rb +30 -0
  122. data/test/cases/arel/nodes/as_test.rb +36 -0
  123. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  124. data/test/cases/arel/nodes/bin_test.rb +35 -0
  125. data/test/cases/arel/nodes/binary_test.rb +29 -0
  126. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  127. data/test/cases/arel/nodes/case_test.rb +96 -0
  128. data/test/cases/arel/nodes/casted_test.rb +18 -0
  129. data/test/cases/arel/nodes/comment_test.rb +22 -0
  130. data/test/cases/arel/nodes/count_test.rb +35 -0
  131. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  132. data/test/cases/arel/nodes/descending_test.rb +46 -0
  133. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  134. data/test/cases/arel/nodes/equality_test.rb +62 -0
  135. data/test/cases/arel/nodes/extract_test.rb +43 -0
  136. data/test/cases/arel/nodes/false_test.rb +21 -0
  137. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  138. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  139. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  140. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  141. data/test/cases/arel/nodes/node_test.rb +22 -0
  142. data/test/cases/arel/nodes/not_test.rb +31 -0
  143. data/test/cases/arel/nodes/or_test.rb +36 -0
  144. data/test/cases/arel/nodes/over_test.rb +69 -0
  145. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  146. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  147. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  148. data/test/cases/arel/nodes/sum_test.rb +35 -0
  149. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  150. data/test/cases/arel/nodes/true_test.rb +21 -0
  151. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  152. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  153. data/test/cases/arel/nodes/window_test.rb +81 -0
  154. data/test/cases/arel/nodes_test.rb +34 -0
  155. data/test/cases/arel/select_manager_test.rb +1238 -0
  156. data/test/cases/arel/support/fake_record.rb +135 -0
  157. data/test/cases/arel/table_test.rb +216 -0
  158. data/test/cases/arel/update_manager_test.rb +126 -0
  159. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  160. data/test/cases/arel/visitors/dot_test.rb +90 -0
  161. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  162. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  163. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  164. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  165. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  166. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  167. data/test/cases/associations/callbacks_test.rb +56 -38
  168. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  169. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  170. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  171. data/test/cases/associations/eager_singularization_test.rb +21 -21
  172. data/test/cases/associations/eager_test.rb +559 -415
  173. data/test/cases/associations/extension_test.rb +18 -12
  174. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  175. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  176. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  177. data/test/cases/associations/has_one_associations_test.rb +294 -129
  178. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  179. data/test/cases/associations/inner_join_association_test.rb +114 -38
  180. data/test/cases/associations/inverse_associations_test.rb +606 -398
  181. data/test/cases/associations/join_model_test.rb +158 -148
  182. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  183. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  184. data/test/cases/associations/required_test.rb +35 -10
  185. data/test/cases/associations_test.rb +241 -110
  186. data/test/cases/attribute_methods/read_test.rb +11 -11
  187. data/test/cases/attribute_methods_test.rb +413 -298
  188. data/test/cases/attributes_test.rb +145 -27
  189. data/test/cases/autosave_association_test.rb +681 -436
  190. data/test/cases/base_prevent_writes_test.rb +229 -0
  191. data/test/cases/base_test.rb +599 -542
  192. data/test/cases/batches_test.rb +288 -82
  193. data/test/cases/binary_test.rb +26 -31
  194. data/test/cases/bind_parameter_test.rb +194 -21
  195. data/test/cases/boolean_test.rb +52 -0
  196. data/test/cases/cache_key_test.rb +110 -5
  197. data/test/cases/calculations_test.rb +740 -177
  198. data/test/cases/callbacks_test.rb +74 -207
  199. data/test/cases/clone_test.rb +15 -10
  200. data/test/cases/coders/json_test.rb +2 -0
  201. data/test/cases/coders/yaml_column_test.rb +16 -13
  202. data/test/cases/collection_cache_key_test.rb +177 -20
  203. data/test/cases/column_alias_test.rb +9 -7
  204. data/test/cases/column_definition_test.rb +10 -68
  205. data/test/cases/comment_test.rb +166 -107
  206. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  207. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  208. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  209. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  210. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  211. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  212. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  213. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  214. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  215. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  216. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  217. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  218. data/test/cases/connection_management_test.rb +13 -11
  219. data/test/cases/connection_pool_test.rb +316 -83
  220. data/test/cases/core_test.rb +82 -58
  221. data/test/cases/counter_cache_test.rb +204 -50
  222. data/test/cases/custom_locking_test.rb +5 -3
  223. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  224. data/test/cases/database_configurations/resolver_test.rb +150 -0
  225. data/test/cases/database_configurations_test.rb +145 -0
  226. data/test/cases/database_selector_test.rb +296 -0
  227. data/test/cases/database_statements_test.rb +18 -16
  228. data/test/cases/date_test.rb +8 -16
  229. data/test/cases/date_time_precision_test.rb +100 -78
  230. data/test/cases/date_time_test.rb +23 -8
  231. data/test/cases/defaults_test.rb +106 -71
  232. data/test/cases/delegated_type_test.rb +57 -0
  233. data/test/cases/dirty_test.rb +419 -223
  234. data/test/cases/disconnected_test.rb +6 -6
  235. data/test/cases/dup_test.rb +54 -27
  236. data/test/cases/enum_test.rb +461 -82
  237. data/test/cases/errors_test.rb +7 -7
  238. data/test/cases/explain_subscriber_test.rb +17 -15
  239. data/test/cases/explain_test.rb +11 -19
  240. data/test/cases/filter_attributes_test.rb +153 -0
  241. data/test/cases/finder_respond_to_test.rb +14 -14
  242. data/test/cases/finder_test.rb +669 -287
  243. data/test/cases/fixture_set/file_test.rb +34 -38
  244. data/test/cases/fixtures_test.rb +833 -176
  245. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  246. data/test/cases/habtm_destroy_order_test.rb +25 -25
  247. data/test/cases/helper.rb +78 -49
  248. data/test/cases/hot_compatibility_test.rb +33 -32
  249. data/test/cases/i18n_test.rb +18 -17
  250. data/test/cases/inheritance_test.rb +180 -115
  251. data/test/cases/insert_all_test.rb +489 -0
  252. data/test/cases/instrumentation_test.rb +101 -0
  253. data/test/cases/integration_test.rb +119 -31
  254. data/test/cases/invalid_connection_test.rb +18 -16
  255. data/test/cases/invertible_migration_test.rb +183 -43
  256. data/test/cases/json_attribute_test.rb +35 -0
  257. data/test/cases/json_serialization_test.rb +57 -58
  258. data/test/cases/json_shared_test_cases.rb +290 -0
  259. data/test/cases/locking_test.rb +413 -119
  260. data/test/cases/log_subscriber_test.rb +68 -26
  261. data/test/cases/marshal_serialization_test.rb +39 -0
  262. data/test/cases/migration/change_schema_test.rb +118 -72
  263. data/test/cases/migration/change_table_test.rb +138 -30
  264. data/test/cases/migration/check_constraint_test.rb +162 -0
  265. data/test/cases/migration/column_attributes_test.rb +45 -35
  266. data/test/cases/migration/column_positioning_test.rb +18 -6
  267. data/test/cases/migration/columns_test.rb +93 -77
  268. data/test/cases/migration/command_recorder_test.rb +121 -34
  269. data/test/cases/migration/compatibility_test.rb +578 -23
  270. data/test/cases/migration/create_join_table_test.rb +35 -25
  271. data/test/cases/migration/foreign_key_test.rb +503 -284
  272. data/test/cases/migration/helper.rb +4 -3
  273. data/test/cases/migration/index_test.rb +119 -70
  274. data/test/cases/migration/logger_test.rb +9 -6
  275. data/test/cases/migration/pending_migrations_test.rb +88 -34
  276. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  277. data/test/cases/migration/references_index_test.rb +38 -19
  278. data/test/cases/migration/references_statements_test.rb +15 -14
  279. data/test/cases/migration/rename_table_test.rb +53 -30
  280. data/test/cases/migration_test.rb +637 -269
  281. data/test/cases/migrator_test.rb +191 -135
  282. data/test/cases/mixin_test.rb +7 -11
  283. data/test/cases/modules_test.rb +36 -34
  284. data/test/cases/multi_db_migrator_test.rb +223 -0
  285. data/test/cases/multiparameter_attributes_test.rb +60 -33
  286. data/test/cases/multiple_db_test.rb +16 -22
  287. data/test/cases/nested_attributes_test.rb +341 -320
  288. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  289. data/test/cases/null_relation_test.rb +84 -0
  290. data/test/cases/numeric_data_test.rb +93 -0
  291. data/test/cases/persistence_test.rb +361 -269
  292. data/test/cases/pooled_connections_test.rb +18 -26
  293. data/test/cases/prepared_statement_status_test.rb +48 -0
  294. data/test/cases/primary_keys_test.rb +210 -104
  295. data/test/cases/query_cache_test.rb +610 -141
  296. data/test/cases/quoting_test.rb +132 -31
  297. data/test/cases/readonly_test.rb +49 -48
  298. data/test/cases/reaper_test.rb +146 -32
  299. data/test/cases/reflection_test.rb +167 -156
  300. data/test/cases/relation/delegation_test.rb +49 -36
  301. data/test/cases/relation/delete_all_test.rb +117 -0
  302. data/test/cases/relation/merging_test.rb +319 -42
  303. data/test/cases/relation/mutation_test.rb +55 -93
  304. data/test/cases/relation/or_test.rb +129 -29
  305. data/test/cases/relation/predicate_builder_test.rb +21 -6
  306. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  307. data/test/cases/relation/select_test.rb +67 -0
  308. data/test/cases/relation/update_all_test.rb +317 -0
  309. data/test/cases/relation/where_chain_test.rb +68 -32
  310. data/test/cases/relation/where_clause_test.rb +136 -61
  311. data/test/cases/relation/where_test.rb +155 -48
  312. data/test/cases/relation_test.rb +266 -112
  313. data/test/cases/relations_test.rb +969 -744
  314. data/test/cases/reload_models_test.rb +13 -9
  315. data/test/cases/reserved_word_test.rb +141 -0
  316. data/test/cases/result_test.rb +68 -17
  317. data/test/cases/sanitize_test.rb +87 -71
  318. data/test/cases/schema_dumper_test.rb +221 -128
  319. data/test/cases/schema_loading_test.rb +3 -2
  320. data/test/cases/scoping/default_scoping_test.rb +185 -144
  321. data/test/cases/scoping/named_scoping_test.rb +177 -89
  322. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  323. data/test/cases/secure_token_test.rb +18 -3
  324. data/test/cases/serialization_test.rb +30 -28
  325. data/test/cases/serialized_attribute_test.rb +133 -42
  326. data/test/cases/signed_id_test.rb +168 -0
  327. data/test/cases/statement_cache_test.rb +41 -24
  328. data/test/cases/statement_invalid_test.rb +42 -0
  329. data/test/cases/store_test.rb +180 -55
  330. data/test/cases/strict_loading_test.rb +473 -0
  331. data/test/cases/suppressor_test.rb +26 -12
  332. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  333. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  334. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  335. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  336. data/test/cases/test_case.rb +51 -40
  337. data/test/cases/test_databases_test.rb +79 -0
  338. data/test/cases/test_fixtures_test.rb +79 -19
  339. data/test/cases/time_precision_test.rb +98 -76
  340. data/test/cases/timestamp_test.rb +102 -99
  341. data/test/cases/touch_later_test.rb +12 -10
  342. data/test/cases/transaction_callbacks_test.rb +344 -90
  343. data/test/cases/transaction_isolation_test.rb +12 -12
  344. data/test/cases/transactions_test.rb +612 -162
  345. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  346. data/test/cases/type/date_time_test.rb +4 -2
  347. data/test/cases/type/integer_test.rb +4 -2
  348. data/test/cases/type/string_test.rb +10 -8
  349. data/test/cases/type/time_test.rb +28 -0
  350. data/test/cases/type/type_map_test.rb +29 -28
  351. data/test/cases/type/unsigned_integer_test.rb +19 -0
  352. data/test/cases/type_test.rb +2 -0
  353. data/test/cases/types_test.rb +3 -1
  354. data/test/cases/unconnected_test.rb +14 -1
  355. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  356. data/test/cases/validations/absence_validation_test.rb +19 -17
  357. data/test/cases/validations/association_validation_test.rb +30 -28
  358. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  359. data/test/cases/validations/i18n_validation_test.rb +22 -21
  360. data/test/cases/validations/length_validation_test.rb +34 -33
  361. data/test/cases/validations/numericality_validation_test.rb +181 -0
  362. data/test/cases/validations/presence_validation_test.rb +21 -19
  363. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  364. data/test/cases/validations_repair_helper.rb +2 -0
  365. data/test/cases/validations_test.rb +61 -26
  366. data/test/cases/view_test.rb +122 -116
  367. data/test/cases/yaml_serialization_test.rb +79 -34
  368. data/test/config.example.yml +19 -19
  369. data/test/config.rb +3 -1
  370. data/test/config.yml +16 -6
  371. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  372. data/test/fixtures/author_addresses.yml +1 -8
  373. data/test/fixtures/authors.yml +1 -7
  374. data/test/fixtures/binaries.yml +4 -0
  375. data/test/fixtures/books.yml +9 -2
  376. data/test/fixtures/categories_posts.yml +3 -0
  377. data/test/fixtures/citations.yml +5 -0
  378. data/test/fixtures/comments.yml +7 -0
  379. data/test/fixtures/companies.yml +5 -0
  380. data/test/fixtures/computers.yml +2 -0
  381. data/test/fixtures/customers.yml +10 -1
  382. data/test/fixtures/developers.yml +1 -1
  383. data/test/fixtures/essays.yml +10 -0
  384. data/test/fixtures/faces.yml +3 -3
  385. data/test/fixtures/humans.yml +5 -0
  386. data/test/fixtures/interests.yml +7 -7
  387. data/test/fixtures/memberships.yml +7 -0
  388. data/test/fixtures/minimalistics.yml +3 -0
  389. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  390. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  391. data/test/fixtures/naked/yml/parrots.yml +1 -0
  392. data/test/fixtures/other_books.yml +26 -0
  393. data/test/fixtures/other_posts.yml +1 -0
  394. data/test/fixtures/parrots.yml +7 -1
  395. data/test/fixtures/pirates.yml +3 -0
  396. data/test/fixtures/posts.yml +11 -3
  397. data/test/fixtures/readers.yml +6 -0
  398. data/test/fixtures/reserved_words/values.yml +2 -2
  399. data/test/fixtures/sponsors.yml +3 -0
  400. data/test/fixtures/strict_zines.yml +2 -0
  401. data/test/fixtures/subscribers.yml +1 -1
  402. data/test/fixtures/tasks.yml +1 -1
  403. data/test/fixtures/warehouse-things.yml +3 -0
  404. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  405. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  406. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  407. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  408. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  409. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  410. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  411. data/test/migrations/rename/1_we_need_things.rb +2 -0
  412. data/test/migrations/rename/2_rename_things.rb +2 -0
  413. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  414. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  415. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  416. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  417. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  419. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  420. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  421. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  422. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  423. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  424. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  425. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  426. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  427. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  428. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  429. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  430. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  431. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  432. data/test/models/account.rb +46 -0
  433. data/test/models/admin/account.rb +3 -1
  434. data/test/models/admin/randomly_named_c1.rb +2 -0
  435. data/test/models/admin/user.rb +16 -8
  436. data/test/models/admin.rb +4 -2
  437. data/test/models/aircraft.rb +3 -1
  438. data/test/models/arunit2_model.rb +2 -0
  439. data/test/models/author.rb +153 -102
  440. data/test/models/auto_id.rb +2 -0
  441. data/test/models/autoloadable/extra_firm.rb +2 -0
  442. data/test/models/binary.rb +3 -1
  443. data/test/models/binary_field.rb +6 -0
  444. data/test/models/bird.rb +13 -1
  445. data/test/models/book.rb +14 -4
  446. data/test/models/book_destroy_async.rb +24 -0
  447. data/test/models/boolean.rb +5 -0
  448. data/test/models/bulb.rb +13 -4
  449. data/test/models/cake_designer.rb +2 -0
  450. data/test/models/car.rb +17 -10
  451. data/test/models/carrier.rb +2 -0
  452. data/test/models/cart.rb +5 -0
  453. data/test/models/cat.rb +2 -0
  454. data/test/models/categorization.rb +8 -6
  455. data/test/models/category.rb +28 -16
  456. data/test/models/chef.rb +2 -0
  457. data/test/models/citation.rb +5 -1
  458. data/test/models/club.rb +13 -10
  459. data/test/models/college.rb +4 -2
  460. data/test/models/column.rb +2 -0
  461. data/test/models/column_name.rb +2 -0
  462. data/test/models/comment.rb +32 -10
  463. data/test/models/company.rb +102 -106
  464. data/test/models/company_in_module.rb +27 -26
  465. data/test/models/computer.rb +3 -1
  466. data/test/models/contact.rb +15 -13
  467. data/test/models/content.rb +5 -3
  468. data/test/models/contract.rb +21 -3
  469. data/test/models/country.rb +2 -4
  470. data/test/models/course.rb +3 -1
  471. data/test/models/customer.rb +10 -8
  472. data/test/models/customer_carrier.rb +2 -0
  473. data/test/models/dashboard.rb +2 -0
  474. data/test/models/default.rb +2 -0
  475. data/test/models/department.rb +2 -0
  476. data/test/models/destroy_async_parent.rb +15 -0
  477. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  478. data/test/models/developer.rb +152 -85
  479. data/test/models/dl_keyed_belongs_to.rb +13 -0
  480. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  481. data/test/models/dl_keyed_has_many.rb +5 -0
  482. data/test/models/dl_keyed_has_many_through.rb +5 -0
  483. data/test/models/dl_keyed_has_one.rb +5 -0
  484. data/test/models/dl_keyed_join.rb +10 -0
  485. data/test/models/dog.rb +2 -0
  486. data/test/models/dog_lover.rb +2 -0
  487. data/test/models/doubloon.rb +3 -1
  488. data/test/models/drink_designer.rb +17 -0
  489. data/test/models/edge.rb +4 -2
  490. data/test/models/electron.rb +2 -0
  491. data/test/models/engine.rb +3 -2
  492. data/test/models/entrant.rb +2 -0
  493. data/test/models/entry.rb +5 -0
  494. data/test/models/essay.rb +6 -3
  495. data/test/models/essay_destroy_async.rb +12 -0
  496. data/test/models/event.rb +3 -1
  497. data/test/models/eye.rb +5 -3
  498. data/test/models/face.rb +14 -6
  499. data/test/models/family.rb +6 -0
  500. data/test/models/family_tree.rb +6 -0
  501. data/test/models/friendship.rb +5 -3
  502. data/test/models/frog.rb +8 -0
  503. data/test/models/guid.rb +3 -1
  504. data/test/models/guitar.rb +2 -0
  505. data/test/models/hotel.rb +5 -3
  506. data/test/models/human.rb +39 -0
  507. data/test/models/image.rb +3 -1
  508. data/test/models/interest.rb +14 -3
  509. data/test/models/invoice.rb +4 -2
  510. data/test/models/item.rb +3 -1
  511. data/test/models/job.rb +5 -3
  512. data/test/models/joke.rb +4 -2
  513. data/test/models/keyboard.rb +3 -1
  514. data/test/models/legacy_thing.rb +2 -0
  515. data/test/models/lesson.rb +2 -0
  516. data/test/models/line_item.rb +3 -1
  517. data/test/models/liquid.rb +2 -0
  518. data/test/models/matey.rb +3 -1
  519. data/test/models/measurement.rb +4 -0
  520. data/test/models/member.rb +23 -20
  521. data/test/models/member_detail.rb +3 -0
  522. data/test/models/member_type.rb +2 -0
  523. data/test/models/membership.rb +4 -1
  524. data/test/models/mentor.rb +3 -1
  525. data/test/models/message.rb +5 -0
  526. data/test/models/minimalistic.rb +2 -0
  527. data/test/models/minivan.rb +3 -2
  528. data/test/models/mixed_case_monkey.rb +3 -1
  529. data/test/models/molecule.rb +2 -0
  530. data/test/models/mouse.rb +6 -0
  531. data/test/models/movie.rb +2 -0
  532. data/test/models/node.rb +4 -2
  533. data/test/models/non_primary_key.rb +2 -0
  534. data/test/models/notification.rb +2 -0
  535. data/test/models/numeric_data.rb +12 -0
  536. data/test/models/order.rb +4 -2
  537. data/test/models/organization.rb +9 -7
  538. data/test/models/other_dog.rb +3 -1
  539. data/test/models/owner.rb +6 -4
  540. data/test/models/parrot.rb +12 -4
  541. data/test/models/person.rb +59 -54
  542. data/test/models/personal_legacy_thing.rb +3 -1
  543. data/test/models/pet.rb +4 -2
  544. data/test/models/pet_treasure.rb +2 -0
  545. data/test/models/pirate.rb +67 -43
  546. data/test/models/possession.rb +3 -1
  547. data/test/models/post.rb +184 -86
  548. data/test/models/price_estimate.rb +11 -1
  549. data/test/models/professor.rb +3 -1
  550. data/test/models/project.rb +14 -12
  551. data/test/models/publisher/article.rb +2 -0
  552. data/test/models/publisher/magazine.rb +2 -0
  553. data/test/models/publisher.rb +2 -0
  554. data/test/models/randomly_named_c1.rb +2 -0
  555. data/test/models/rating.rb +5 -1
  556. data/test/models/reader.rb +7 -5
  557. data/test/models/recipe.rb +2 -0
  558. data/test/models/record.rb +2 -0
  559. data/test/models/reference.rb +6 -3
  560. data/test/models/reply.rb +39 -21
  561. data/test/models/room.rb +6 -0
  562. data/test/models/section.rb +6 -0
  563. data/test/models/seminar.rb +6 -0
  564. data/test/models/session.rb +6 -0
  565. data/test/models/ship.rb +12 -9
  566. data/test/models/ship_part.rb +5 -3
  567. data/test/models/shop.rb +4 -2
  568. data/test/models/shop_account.rb +2 -0
  569. data/test/models/speedometer.rb +2 -0
  570. data/test/models/sponsor.rb +8 -5
  571. data/test/models/squeak.rb +6 -0
  572. data/test/models/strict_zine.rb +7 -0
  573. data/test/models/string_key_object.rb +2 -0
  574. data/test/models/student.rb +2 -0
  575. data/test/models/subscriber.rb +4 -2
  576. data/test/models/subscription.rb +5 -1
  577. data/test/models/tag.rb +6 -3
  578. data/test/models/tagging.rb +13 -6
  579. data/test/models/task.rb +2 -0
  580. data/test/models/topic.rb +54 -19
  581. data/test/models/toy.rb +4 -0
  582. data/test/models/traffic_light.rb +2 -0
  583. data/test/models/treasure.rb +5 -3
  584. data/test/models/treaty.rb +2 -4
  585. data/test/models/tree.rb +2 -0
  586. data/test/models/tuning_peg.rb +2 -0
  587. data/test/models/tyre.rb +2 -0
  588. data/test/models/user.rb +12 -4
  589. data/test/models/uuid_child.rb +2 -0
  590. data/test/models/uuid_item.rb +2 -0
  591. data/test/models/uuid_parent.rb +2 -0
  592. data/test/models/vegetables.rb +12 -3
  593. data/test/models/vertex.rb +6 -4
  594. data/test/models/warehouse_thing.rb +2 -0
  595. data/test/models/wheel.rb +3 -1
  596. data/test/models/without_table.rb +3 -1
  597. data/test/models/zine.rb +3 -1
  598. data/test/schema/mysql2_specific_schema.rb +49 -35
  599. data/test/schema/oracle_specific_schema.rb +13 -15
  600. data/test/schema/postgresql_specific_schema.rb +51 -40
  601. data/test/schema/schema.rb +334 -154
  602. data/test/schema/sqlite_specific_schema.rb +9 -16
  603. data/test/support/config.rb +26 -26
  604. data/test/support/connection.rb +14 -8
  605. data/test/support/connection_helper.rb +3 -1
  606. data/test/support/ddl_helper.rb +2 -0
  607. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  608. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  609. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  610. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  611. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  617. data/test/support/schema_dumping_helper.rb +2 -0
  618. data/test/support/stubs/strong_parameters.rb +40 -0
  619. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  620. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  621. metadata +190 -14
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/owner'
3
- require 'tempfile'
4
- require 'support/ddl_helper'
4
+ require "models/owner"
5
+ require "tempfile"
6
+ require "support/ddl_helper"
5
7
 
6
8
  module ActiveRecord
7
9
  module ConnectionAdapters
@@ -14,22 +16,35 @@ module ActiveRecord
14
16
  end
15
17
 
16
18
  def setup
17
- @conn = Base.sqlite3_connection database: ':memory:',
18
- adapter: 'sqlite3',
19
+ @conn = Base.sqlite3_connection database: ":memory:",
20
+ adapter: "sqlite3",
19
21
  timeout: 100
22
+
23
+ @connection_handler = ActiveRecord::Base.connection_handler
20
24
  end
21
25
 
22
26
  def test_bad_connection
23
27
  assert_raise ActiveRecord::NoDatabaseError do
24
28
  connection = ActiveRecord::Base.sqlite3_connection(adapter: "sqlite3", database: "/tmp/should/_not/_exist/-cinco-dog.db")
25
- connection.drop_table 'ex', if_exists: true
29
+ connection.drop_table "ex", if_exists: true
26
30
  end
27
31
  end
28
32
 
33
+ def test_database_exists_returns_false_when_the_database_does_not_exist
34
+ assert_not SQLite3Adapter.database_exists?(adapter: "sqlite3", database: "non_extant_db"),
35
+ "expected non_extant_db to not exist"
36
+ end
37
+
38
+ def test_database_exists_returns_true_when_database_exists
39
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
40
+ assert SQLite3Adapter.database_exists?(db_config.configuration_hash),
41
+ "expected #{db_config.database} to exist"
42
+ end
43
+
29
44
  unless in_memory_db?
30
45
  def test_connect_with_url
31
46
  original_connection = ActiveRecord::Base.remove_connection
32
- tf = Tempfile.open 'whatever'
47
+ tf = Tempfile.open "whatever"
33
48
  url = "sqlite3:#{tf.path}"
34
49
  ActiveRecord::Base.establish_connection(url)
35
50
  assert ActiveRecord::Base.connection
@@ -49,33 +64,22 @@ module ActiveRecord
49
64
  end
50
65
  end
51
66
 
52
- def test_valid_column
53
- with_example_table do
54
- column = @conn.columns('ex').find { |col| col.name == 'id' }
55
- assert @conn.valid_type?(column.type)
56
- end
57
- end
58
-
59
- # sqlite3 databases should be able to support any type and not just the
60
- # ones mentioned in the native_database_types.
61
- #
62
- # Therefore test_invalid column should always return true even if the
63
- # type is not valid.
64
- def test_invalid_column
65
- assert @conn.valid_type?(:foobar)
67
+ def test_database_exists_returns_true_for_an_in_memory_db
68
+ assert SQLite3Adapter.database_exists?(database: ":memory:"),
69
+ "Expected in memory database to exist"
66
70
  end
67
71
 
68
72
  def test_column_types
69
- owner = Owner.create!(name: "hello".encode('ascii-8bit'))
73
+ owner = Owner.create!(name: "hello".encode("ascii-8bit"))
70
74
  owner.reload
71
- select = Owner.columns.map { |c| "typeof(#{c.name})" }.join ', '
72
- result = Owner.connection.exec_query <<-esql
75
+ select = Owner.columns.map { |c| "typeof(#{c.name})" }.join ", "
76
+ result = Owner.connection.exec_query <<~SQL
73
77
  SELECT #{select}
74
78
  FROM #{Owner.table_name}
75
79
  WHERE #{Owner.primary_key} = #{owner.id}
76
- esql
80
+ SQL
77
81
 
78
- assert(!result.rows.first.include?("blob"), "should not store blobs")
82
+ assert_not(result.rows.first.include?("blob"), "should not store blobs")
79
83
  ensure
80
84
  owner.delete
81
85
  end
@@ -83,10 +87,10 @@ module ActiveRecord
83
87
  def test_exec_insert
84
88
  with_example_table do
85
89
  vals = [Relation::QueryAttribute.new("number", 10, Type::Value.new)]
86
- @conn.exec_insert('insert into ex (number) VALUES (?)', 'SQL', vals)
90
+ @conn.exec_insert("insert into ex (number) VALUES (?)", "SQL", vals)
87
91
 
88
92
  result = @conn.exec_query(
89
- 'select number from ex where number = ?', 'SQL', vals)
93
+ "select number from ex where number = ?", "SQL", vals)
90
94
 
91
95
  assert_equal 1, result.rows.length
92
96
  assert_equal 10, result.rows.first.first
@@ -94,103 +98,103 @@ module ActiveRecord
94
98
  end
95
99
 
96
100
  def test_primary_key_returns_nil_for_no_pk
97
- with_example_table 'id int, data string' do
98
- assert_nil @conn.primary_key('ex')
101
+ with_example_table "id int, data string" do
102
+ assert_nil @conn.primary_key("ex")
99
103
  end
100
104
  end
101
105
 
102
106
  def test_connection_no_db
103
107
  assert_raises(ArgumentError) do
104
- Base.sqlite3_connection {}
108
+ Base.sqlite3_connection { }
105
109
  end
106
110
  end
107
111
 
108
112
  def test_bad_timeout
109
113
  assert_raises(TypeError) do
110
- Base.sqlite3_connection database: ':memory:',
111
- adapter: 'sqlite3',
112
- timeout: 'usa'
114
+ Base.sqlite3_connection database: ":memory:",
115
+ adapter: "sqlite3",
116
+ timeout: "usa"
113
117
  end
114
118
  end
115
119
 
116
120
  # connection is OK with a nil timeout
117
121
  def test_nil_timeout
118
- conn = Base.sqlite3_connection database: ':memory:',
119
- adapter: 'sqlite3',
122
+ conn = Base.sqlite3_connection database: ":memory:",
123
+ adapter: "sqlite3",
120
124
  timeout: nil
121
- assert conn, 'made a connection'
125
+ assert conn, "made a connection"
122
126
  end
123
127
 
124
128
  def test_connect
125
- assert @conn, 'should have connection'
129
+ assert @conn, "should have connection"
126
130
  end
127
131
 
128
132
  # sqlite3 defaults to UTF-8 encoding
129
133
  def test_encoding
130
- assert_equal 'UTF-8', @conn.encoding
134
+ assert_equal "UTF-8", @conn.encoding
131
135
  end
132
136
 
133
137
  def test_exec_no_binds
134
- with_example_table 'id int, data string' do
135
- result = @conn.exec_query('SELECT id, data FROM ex')
138
+ with_example_table "id int, data string" do
139
+ result = @conn.exec_query("SELECT id, data FROM ex")
136
140
  assert_equal 0, result.rows.length
137
141
  assert_equal 2, result.columns.length
138
142
  assert_equal %w{ id data }, result.columns
139
143
 
140
144
  @conn.exec_query('INSERT INTO ex (id, data) VALUES (1, "foo")')
141
- result = @conn.exec_query('SELECT id, data FROM ex')
145
+ result = @conn.exec_query("SELECT id, data FROM ex")
142
146
  assert_equal 1, result.rows.length
143
147
  assert_equal 2, result.columns.length
144
148
 
145
- assert_equal [[1, 'foo']], result.rows
149
+ assert_equal [[1, "foo"]], result.rows
146
150
  end
147
151
  end
148
152
 
149
153
  def test_exec_query_with_binds
150
- with_example_table 'id int, data string' do
154
+ with_example_table "id int, data string" do
151
155
  @conn.exec_query('INSERT INTO ex (id, data) VALUES (1, "foo")')
152
156
  result = @conn.exec_query(
153
- 'SELECT id, data FROM ex WHERE id = ?', nil, [Relation::QueryAttribute.new(nil, 1, Type::Value.new)])
157
+ "SELECT id, data FROM ex WHERE id = ?", nil, [Relation::QueryAttribute.new(nil, 1, Type::Value.new)])
154
158
 
155
159
  assert_equal 1, result.rows.length
156
160
  assert_equal 2, result.columns.length
157
161
 
158
- assert_equal [[1, 'foo']], result.rows
162
+ assert_equal [[1, "foo"]], result.rows
159
163
  end
160
164
  end
161
165
 
162
166
  def test_exec_query_typecasts_bind_vals
163
- with_example_table 'id int, data string' do
167
+ with_example_table "id int, data string" do
164
168
  @conn.exec_query('INSERT INTO ex (id, data) VALUES (1, "foo")')
165
169
 
166
170
  result = @conn.exec_query(
167
- 'SELECT id, data FROM ex WHERE id = ?', nil, [Relation::QueryAttribute.new("id", "1-fuu", Type::Integer.new)])
171
+ "SELECT id, data FROM ex WHERE id = ?", nil, [Relation::QueryAttribute.new("id", "1-fuu", Type::Integer.new)])
168
172
 
169
173
  assert_equal 1, result.rows.length
170
174
  assert_equal 2, result.columns.length
171
175
 
172
- assert_equal [[1, 'foo']], result.rows
176
+ assert_equal [[1, "foo"]], result.rows
173
177
  end
174
178
  end
175
179
 
176
180
  def test_quote_binary_column_escapes_it
177
- DualEncoding.connection.execute(<<-eosql)
181
+ DualEncoding.connection.execute(<<~SQL)
178
182
  CREATE TABLE IF NOT EXISTS dual_encodings (
179
183
  id integer PRIMARY KEY AUTOINCREMENT,
180
184
  name varchar(255),
181
185
  data binary
182
186
  )
183
- eosql
184
- str = "\x80".force_encoding("ASCII-8BIT")
185
- binary = DualEncoding.new name: 'いただきます!', data: str
187
+ SQL
188
+ str = (+"\x80").force_encoding("ASCII-8BIT")
189
+ binary = DualEncoding.new name: "いただきます!", data: str
186
190
  binary.save!
187
191
  assert_equal str, binary.data
188
192
  ensure
189
- DualEncoding.connection.drop_table 'dual_encodings', if_exists: true
193
+ DualEncoding.connection.drop_table "dual_encodings", if_exists: true
190
194
  end
191
195
 
192
196
  def test_type_cast_should_not_mutate_encoding
193
- name = 'hello'.force_encoding(Encoding::ASCII_8BIT)
197
+ name = (+"hello").force_encoding(Encoding::ASCII_8BIT)
194
198
  Owner.create(name: name)
195
199
  assert_equal Encoding::ASCII_8BIT, name.encoding
196
200
  ensure
@@ -204,8 +208,8 @@ module ActiveRecord
204
208
  assert_equal 1, records.length
205
209
 
206
210
  record = records.first
207
- assert_equal 10, record['number']
208
- assert_equal 1, record['id']
211
+ assert_equal 10, record["number"]
212
+ assert_equal 1, record["id"]
209
213
  end
210
214
  end
211
215
 
@@ -226,7 +230,7 @@ module ActiveRecord
226
230
  def test_insert_id_value_returned
227
231
  with_example_table do
228
232
  sql = "INSERT INTO ex (number) VALUES (10)"
229
- idval = 'vuvuzela'
233
+ idval = "vuvuzela"
230
234
  id = @conn.insert(sql, nil, nil, idval)
231
235
  assert_equal idval, id
232
236
  end
@@ -237,7 +241,7 @@ module ActiveRecord
237
241
  2.times do |i|
238
242
  @conn.create "INSERT INTO ex (number) VALUES (#{i})"
239
243
  end
240
- rows = @conn.select_rows 'select number, id from ex'
244
+ rows = @conn.select_rows "select number, id from ex"
241
245
  assert_equal [[0, 1], [1, 2]], rows
242
246
  end
243
247
  end
@@ -254,7 +258,7 @@ module ActiveRecord
254
258
 
255
259
  def test_transaction
256
260
  with_example_table do
257
- count_sql = 'select count(*) from ex'
261
+ count_sql = "select count(*) from ex"
258
262
 
259
263
  @conn.begin_db_transaction
260
264
  @conn.create "INSERT INTO ex (number) VALUES (10)"
@@ -267,50 +271,36 @@ module ActiveRecord
267
271
 
268
272
  def test_tables
269
273
  with_example_table do
270
- ActiveSupport::Deprecation.silence { assert_equal %w{ ex }, @conn.tables }
271
- with_example_table 'id integer PRIMARY KEY AUTOINCREMENT, number integer', 'people' do
272
- ActiveSupport::Deprecation.silence { assert_equal %w{ ex people }.sort, @conn.tables.sort }
274
+ assert_equal %w{ ex }, @conn.tables
275
+ with_example_table "id integer PRIMARY KEY AUTOINCREMENT, number integer", "people" do
276
+ assert_equal %w{ ex people }.sort, @conn.tables.sort
273
277
  end
274
278
  end
275
279
  end
276
280
 
277
281
  def test_tables_logs_name
278
- sql = <<-SQL
279
- SELECT name FROM sqlite_master
280
- WHERE type IN ('table','view') AND name <> 'sqlite_sequence'
282
+ sql = <<~SQL
283
+ SELECT name FROM sqlite_master WHERE name <> 'sqlite_sequence' AND type IN ('table')
281
284
  SQL
282
- assert_logged [[sql.squish, 'SCHEMA', []]] do
283
- ActiveSupport::Deprecation.silence do
284
- @conn.tables('hello')
285
- end
286
- end
287
- end
288
-
289
- def test_indexes_logs_name
290
- with_example_table do
291
- assert_logged [["PRAGMA index_list(\"ex\")", 'SCHEMA', []]] do
292
- @conn.indexes('ex', 'hello')
293
- end
285
+ assert_logged [[sql.squish, "SCHEMA", []]] do
286
+ @conn.tables
294
287
  end
295
288
  end
296
289
 
297
290
  def test_table_exists_logs_name
298
291
  with_example_table do
299
- sql = <<-SQL
300
- SELECT name FROM sqlite_master
301
- WHERE type IN ('table','view') AND name <> 'sqlite_sequence' AND name = 'ex'
292
+ sql = <<~SQL
293
+ SELECT name FROM sqlite_master WHERE name <> 'sqlite_sequence' AND name = 'ex' AND type IN ('table')
302
294
  SQL
303
- assert_logged [[sql.squish, 'SCHEMA', []]] do
304
- ActiveSupport::Deprecation.silence do
305
- assert @conn.table_exists?('ex')
306
- end
295
+ assert_logged [[sql.squish, "SCHEMA", []]] do
296
+ assert @conn.table_exists?("ex")
307
297
  end
308
298
  end
309
299
  end
310
300
 
311
301
  def test_columns
312
302
  with_example_table do
313
- columns = @conn.columns('ex').sort_by(&:name)
303
+ columns = @conn.columns("ex").sort_by(&:name)
314
304
  assert_equal 2, columns.length
315
305
  assert_equal %w{ id number }.sort, columns.map(&:name)
316
306
  assert_equal [nil, nil], columns.map(&:default)
@@ -319,17 +309,25 @@ module ActiveRecord
319
309
  end
320
310
 
321
311
  def test_columns_with_default
322
- with_example_table 'id integer PRIMARY KEY AUTOINCREMENT, number integer default 10' do
323
- column = @conn.columns('ex').find { |x|
324
- x.name == 'number'
312
+ with_example_table "id integer PRIMARY KEY AUTOINCREMENT, number integer default 10" do
313
+ column = @conn.columns("ex").find { |x|
314
+ x.name == "number"
325
315
  }
326
- assert_equal '10', column.default
316
+ assert_equal "10", column.default
327
317
  end
328
318
  end
329
319
 
330
320
  def test_columns_with_not_null
331
- with_example_table 'id integer PRIMARY KEY AUTOINCREMENT, number integer not null' do
332
- column = @conn.columns('ex').find { |x| x.name == 'number' }
321
+ with_example_table "id integer PRIMARY KEY AUTOINCREMENT, number integer not null" do
322
+ column = @conn.columns("ex").find { |x| x.name == "number" }
323
+ assert_not column.null, "column should not be null"
324
+ end
325
+ end
326
+
327
+ def test_add_column_with_not_null
328
+ with_example_table "id integer PRIMARY KEY AUTOINCREMENT, number integer not null" do
329
+ assert_nothing_raised { @conn.add_column :ex, :name, :string, null: false }
330
+ column = @conn.columns("ex").find { |x| x.name == "name" }
333
331
  assert_not column.null, "column should not be null"
334
332
  end
335
333
  end
@@ -337,80 +335,237 @@ module ActiveRecord
337
335
  def test_indexes_logs
338
336
  with_example_table do
339
337
  assert_logged [["PRAGMA index_list(\"ex\")", "SCHEMA", []]] do
340
- @conn.indexes('ex')
338
+ @conn.indexes("ex")
341
339
  end
342
340
  end
343
341
  end
344
342
 
345
343
  def test_no_indexes
346
- assert_equal [], @conn.indexes('items')
344
+ assert_equal [], @conn.indexes("items")
347
345
  end
348
346
 
349
347
  def test_index
350
348
  with_example_table do
351
- @conn.add_index 'ex', 'id', unique: true, name: 'fun'
352
- index = @conn.indexes('ex').find { |idx| idx.name == 'fun' }
349
+ @conn.add_index "ex", "id", unique: true, name: "fun"
350
+ index = @conn.indexes("ex").find { |idx| idx.name == "fun" }
353
351
 
354
- assert_equal 'ex', index.table
355
- assert index.unique, 'index is unique'
356
- assert_equal ['id'], index.columns
352
+ assert_equal "ex", index.table
353
+ assert index.unique, "index is unique"
354
+ assert_equal ["id"], index.columns
355
+ end
356
+ end
357
+
358
+ def test_index_with_if_not_exists
359
+ with_example_table do
360
+ @conn.add_index "ex", "id"
361
+
362
+ assert_nothing_raised do
363
+ @conn.add_index "ex", "id", if_not_exists: true
364
+ end
357
365
  end
358
366
  end
359
367
 
360
368
  def test_non_unique_index
361
369
  with_example_table do
362
- @conn.add_index 'ex', 'id', name: 'fun'
363
- index = @conn.indexes('ex').find { |idx| idx.name == 'fun' }
364
- assert_not index.unique, 'index is not unique'
370
+ @conn.add_index "ex", "id", name: "fun"
371
+ index = @conn.indexes("ex").find { |idx| idx.name == "fun" }
372
+ assert_not index.unique, "index is not unique"
365
373
  end
366
374
  end
367
375
 
368
376
  def test_compound_index
369
377
  with_example_table do
370
- @conn.add_index 'ex', %w{ id number }, name: 'fun'
371
- index = @conn.indexes('ex').find { |idx| idx.name == 'fun' }
378
+ @conn.add_index "ex", %w{ id number }, name: "fun"
379
+ index = @conn.indexes("ex").find { |idx| idx.name == "fun" }
372
380
  assert_equal %w{ id number }.sort, index.columns.sort
373
381
  end
374
382
  end
375
383
 
384
+ if ActiveRecord::Base.connection.supports_expression_index?
385
+ def test_expression_index
386
+ with_example_table do
387
+ @conn.add_index "ex", "max(id, number)", name: "expression"
388
+ index = @conn.indexes("ex").find { |idx| idx.name == "expression" }
389
+ assert_equal "max(id, number)", index.columns
390
+ end
391
+ end
392
+
393
+ def test_expression_index_with_where
394
+ with_example_table do
395
+ @conn.add_index "ex", "id % 10, max(id, number)", name: "expression", where: "id > 1000"
396
+ index = @conn.indexes("ex").find { |idx| idx.name == "expression" }
397
+ assert_equal "id % 10, max(id, number)", index.columns
398
+ assert_equal "id > 1000", index.where
399
+ end
400
+ end
401
+
402
+ def test_complicated_expression
403
+ with_example_table do
404
+ @conn.execute "CREATE INDEX expression ON ex (id % 10, (CASE WHEN number > 0 THEN max(id, number) END))WHERE(id > 1000)"
405
+ index = @conn.indexes("ex").find { |idx| idx.name == "expression" }
406
+ assert_equal "id % 10, (CASE WHEN number > 0 THEN max(id, number) END)", index.columns
407
+ assert_equal "(id > 1000)", index.where
408
+ end
409
+ end
410
+
411
+ def test_not_everything_an_expression
412
+ with_example_table do
413
+ @conn.add_index "ex", "id, max(id, number)", name: "expression"
414
+ index = @conn.indexes("ex").find { |idx| idx.name == "expression" }
415
+ assert_equal "id, max(id, number)", index.columns
416
+ end
417
+ end
418
+ end
419
+
376
420
  def test_primary_key
377
421
  with_example_table do
378
- assert_equal 'id', @conn.primary_key('ex')
379
- with_example_table 'internet integer PRIMARY KEY AUTOINCREMENT, number integer not null', 'foos' do
380
- assert_equal 'internet', @conn.primary_key('foos')
422
+ assert_equal "id", @conn.primary_key("ex")
423
+ with_example_table "internet integer PRIMARY KEY AUTOINCREMENT, number integer not null", "foos" do
424
+ assert_equal "internet", @conn.primary_key("foos")
381
425
  end
382
426
  end
383
427
  end
384
428
 
385
429
  def test_no_primary_key
386
- with_example_table 'number integer not null' do
387
- assert_nil @conn.primary_key('ex')
430
+ with_example_table "number integer not null" do
431
+ assert_nil @conn.primary_key("ex")
388
432
  end
389
433
  end
390
434
 
435
+ class Barcode < ActiveRecord::Base
436
+ self.primary_key = "code"
437
+ end
438
+
439
+ def test_copy_table_with_existing_records_have_custom_primary_key
440
+ connection = Barcode.connection
441
+ connection.create_table(:barcodes, primary_key: "code", id: :string, limit: 42, force: true) do |t|
442
+ t.text :other_attr
443
+ end
444
+ code = "214fe0c2-dd47-46df-b53b-66090b3c1d40"
445
+ Barcode.create!(code: code, other_attr: "xxx")
446
+
447
+ connection.remove_column("barcodes", "other_attr")
448
+
449
+ assert_equal code, Barcode.first.id
450
+ ensure
451
+ Barcode.reset_column_information
452
+ end
453
+
454
+ def test_copy_table_with_composite_primary_keys
455
+ connection = Barcode.connection
456
+ connection.create_table(:barcodes, primary_key: ["region", "code"], force: true) do |t|
457
+ t.string :region
458
+ t.string :code
459
+ t.text :other_attr
460
+ end
461
+ region = "US"
462
+ code = "214fe0c2-dd47-46df-b53b-66090b3c1d40"
463
+ Barcode.create!(region: region, code: code, other_attr: "xxx")
464
+
465
+ connection.remove_column("barcodes", "other_attr")
466
+
467
+ assert_equal ["region", "code"], connection.primary_keys("barcodes")
468
+
469
+ barcode = Barcode.first
470
+ assert_equal region, barcode.region
471
+ assert_equal code, barcode.code
472
+ ensure
473
+ Barcode.reset_column_information
474
+ end
475
+
476
+ def test_custom_primary_key_in_create_table
477
+ connection = Barcode.connection
478
+ connection.create_table :barcodes, id: false, force: true do |t|
479
+ t.primary_key :id, :string
480
+ end
481
+
482
+ assert_equal "id", connection.primary_key("barcodes")
483
+
484
+ custom_pk = Barcode.columns_hash["id"]
485
+
486
+ assert_equal :string, custom_pk.type
487
+ assert_not custom_pk.null
488
+ ensure
489
+ Barcode.reset_column_information
490
+ end
491
+
492
+ def test_custom_primary_key_in_change_table
493
+ connection = Barcode.connection
494
+ connection.create_table :barcodes, id: false, force: true do |t|
495
+ t.integer :dummy
496
+ end
497
+ connection.change_table :barcodes do |t|
498
+ t.primary_key :id, :string
499
+ end
500
+
501
+ assert_equal "id", connection.primary_key("barcodes")
502
+
503
+ custom_pk = Barcode.columns_hash["id"]
504
+
505
+ assert_equal :string, custom_pk.type
506
+ assert_not custom_pk.null
507
+ ensure
508
+ Barcode.reset_column_information
509
+ end
510
+
511
+ def test_add_column_with_custom_primary_key
512
+ connection = Barcode.connection
513
+ connection.create_table :barcodes, id: false, force: true do |t|
514
+ t.integer :dummy
515
+ end
516
+ connection.add_column :barcodes, :id, :string, primary_key: true
517
+
518
+ assert_equal "id", connection.primary_key("barcodes")
519
+
520
+ custom_pk = Barcode.columns_hash["id"]
521
+
522
+ assert_equal :string, custom_pk.type
523
+ assert_not custom_pk.null
524
+ ensure
525
+ Barcode.reset_column_information
526
+ end
527
+
528
+ def test_remove_column_preserves_partial_indexes
529
+ connection = Barcode.connection
530
+ connection.create_table :barcodes, force: true do |t|
531
+ t.string :code
532
+ t.string :region
533
+ t.boolean :bool_attr
534
+
535
+ t.index :code, unique: true, where: :bool_attr, name: "partial"
536
+ end
537
+ connection.remove_column :barcodes, :region
538
+
539
+ index = connection.indexes("barcodes").find { |idx| idx.name == "partial" }
540
+ assert_equal "bool_attr", index.where
541
+ ensure
542
+ Barcode.reset_column_information
543
+ end
544
+
391
545
  def test_supports_extensions
392
- assert_not @conn.supports_extensions?, 'does not support extensions'
546
+ assert_not @conn.supports_extensions?, "does not support extensions"
393
547
  end
394
548
 
395
549
  def test_respond_to_enable_extension
396
- assert @conn.respond_to?(:enable_extension)
550
+ assert_respond_to @conn, :enable_extension
397
551
  end
398
552
 
399
553
  def test_respond_to_disable_extension
400
- assert @conn.respond_to?(:disable_extension)
554
+ assert_respond_to @conn, :disable_extension
401
555
  end
402
556
 
403
557
  def test_statement_closed
404
- db = ::SQLite3::Database.new(ActiveRecord::Base.
405
- configurations['arunit']['database'])
558
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
559
+ db = ::SQLite3::Database.new(db_config.database)
560
+
406
561
  statement = ::SQLite3::Statement.new(db,
407
- 'CREATE TABLE statement_test (number integer not null)')
408
- statement.stub(:step, ->{ raise ::SQLite3::BusyException.new('busy') }) do
562
+ "CREATE TABLE statement_test (number integer not null)")
563
+ statement.stub(:step, -> { raise ::SQLite3::BusyException.new("busy") }) do
409
564
  assert_called(statement, :columns, returns: []) do
410
565
  assert_called(statement, :close) do
411
566
  ::SQLite3::Statement.stub(:new, statement) do
412
567
  assert_raises ActiveRecord::StatementInvalid do
413
- @conn.exec_query 'select * from statement_test'
568
+ @conn.exec_query "select * from statement_test"
414
569
  end
415
570
  end
416
571
  end
@@ -418,24 +573,56 @@ module ActiveRecord
418
573
  end
419
574
  end
420
575
 
421
- private
576
+ def test_db_is_not_readonly_when_readonly_option_is_false
577
+ conn = Base.sqlite3_connection database: ":memory:",
578
+ adapter: "sqlite3",
579
+ readonly: false
422
580
 
423
- def assert_logged logs
424
- subscriber = SQLSubscriber.new
425
- subscription = ActiveSupport::Notifications.subscribe('sql.active_record', subscriber)
426
- yield
427
- assert_equal logs, subscriber.logged
428
- ensure
429
- ActiveSupport::Notifications.unsubscribe(subscription)
581
+ assert_not_predicate conn.raw_connection, :readonly?
430
582
  end
431
583
 
432
- def with_example_table(definition = nil, table_name = 'ex', &block)
433
- definition ||= <<-SQL
434
- id integer PRIMARY KEY AUTOINCREMENT,
435
- number integer
436
- SQL
437
- super(@conn, table_name, definition, &block)
584
+ def test_db_is_not_readonly_when_readonly_option_is_unspecified
585
+ conn = Base.sqlite3_connection database: ":memory:",
586
+ adapter: "sqlite3"
587
+
588
+ assert_not_predicate conn.raw_connection, :readonly?
589
+ end
590
+
591
+ def test_db_is_readonly_when_readonly_option_is_true
592
+ conn = Base.sqlite3_connection database: ":memory:",
593
+ adapter: "sqlite3",
594
+ readonly: true
595
+
596
+ assert_predicate conn.raw_connection, :readonly?
438
597
  end
598
+
599
+ def test_writes_are_not_permitted_to_readonly_databases
600
+ conn = Base.sqlite3_connection database: ":memory:",
601
+ adapter: "sqlite3",
602
+ readonly: true
603
+
604
+ assert_raises(ActiveRecord::StatementInvalid, /SQLite3::ReadOnlyException/) do
605
+ conn.execute("CREATE TABLE test(id integer)")
606
+ end
607
+ end
608
+
609
+ private
610
+ def assert_logged(logs)
611
+ subscriber = SQLSubscriber.new
612
+ subscription = ActiveSupport::Notifications.subscribe("sql.active_record", subscriber)
613
+ yield
614
+ assert_equal logs, subscriber.logged
615
+ ensure
616
+ ActiveSupport::Notifications.unsubscribe(subscription)
617
+ end
618
+
619
+ def with_example_table(definition = nil, table_name = "ex", &block)
620
+ definition ||= <<~SQL
621
+ id integer PRIMARY KEY AUTOINCREMENT,
622
+ number integer
623
+ SQL
624
+ super(@conn, table_name, definition, &block)
625
+ end
439
626
  end
440
627
  end
441
628
  end