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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/README +1 -1
  5. data/debug.log +1 -0
  6. data/ext/Makefile +28 -24
  7. data/ext/ibm_db.c +66 -65
  8. data/ext/ibm_db.o +0 -0
  9. data/ext/ibm_db.so +0 -0
  10. data/ext/mkmf.log +26 -24
  11. data/ext/ruby_ibm_db_cli.c +1 -0
  12. data/ext/ruby_ibm_db_cli.o +0 -0
  13. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1520 -1282
  14. data/lib/ibm_db.so +1 -0
  15. data/lib/mswin32/ibm_db.rb +3 -1
  16. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  17. data/lib/mswin32/rb3x/i386/ruby31/ibm_db.so +0 -0
  18. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  19. data/test/activejob/destroy_association_async_test.rb +305 -0
  20. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  21. data/test/activejob/helper.rb +15 -0
  22. data/test/assets/schema_dump_5_1.yml +345 -0
  23. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  24. data/test/cases/adapter_test.rb +432 -218
  25. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  26. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  27. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  28. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  29. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  30. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  31. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  32. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  33. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  34. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  35. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  36. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  37. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  38. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  39. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  40. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  41. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  42. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  43. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  44. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  45. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  46. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  47. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  48. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  49. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  50. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  51. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  52. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  53. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  54. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  55. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  56. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  57. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  58. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  59. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  60. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  61. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  62. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  63. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  64. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  65. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  66. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  67. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  68. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  69. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  70. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  71. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  72. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  73. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  74. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  75. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  76. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  77. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  78. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  79. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  80. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  81. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  82. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  83. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  84. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  85. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  86. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  87. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  88. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  89. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  90. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  91. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  92. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  93. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  94. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  95. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  96. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  97. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  98. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  99. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  100. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  101. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  102. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  103. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  104. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  105. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  106. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  107. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  108. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  109. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  110. data/test/cases/aggregations_test.rb +14 -12
  111. data/test/cases/annotate_test.rb +46 -0
  112. data/test/cases/ar_schema_test.rb +153 -86
  113. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  114. data/test/cases/arel/attributes/math_test.rb +83 -0
  115. data/test/cases/arel/attributes_test.rb +27 -0
  116. data/test/cases/arel/collectors/bind_test.rb +40 -0
  117. data/test/cases/arel/collectors/composite_test.rb +47 -0
  118. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  119. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  120. data/test/cases/arel/crud_test.rb +65 -0
  121. data/test/cases/arel/delete_manager_test.rb +53 -0
  122. data/test/cases/arel/factory_methods_test.rb +46 -0
  123. data/test/cases/arel/helper.rb +45 -0
  124. data/test/cases/arel/insert_manager_test.rb +241 -0
  125. data/test/cases/arel/nodes/and_test.rb +30 -0
  126. data/test/cases/arel/nodes/as_test.rb +36 -0
  127. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  128. data/test/cases/arel/nodes/bin_test.rb +35 -0
  129. data/test/cases/arel/nodes/binary_test.rb +29 -0
  130. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  131. data/test/cases/arel/nodes/case_test.rb +96 -0
  132. data/test/cases/arel/nodes/casted_test.rb +18 -0
  133. data/test/cases/arel/nodes/comment_test.rb +22 -0
  134. data/test/cases/arel/nodes/count_test.rb +35 -0
  135. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  136. data/test/cases/arel/nodes/descending_test.rb +46 -0
  137. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  138. data/test/cases/arel/nodes/equality_test.rb +62 -0
  139. data/test/cases/arel/nodes/extract_test.rb +43 -0
  140. data/test/cases/arel/nodes/false_test.rb +21 -0
  141. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  142. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  143. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  144. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  145. data/test/cases/arel/nodes/node_test.rb +22 -0
  146. data/test/cases/arel/nodes/not_test.rb +31 -0
  147. data/test/cases/arel/nodes/or_test.rb +36 -0
  148. data/test/cases/arel/nodes/over_test.rb +69 -0
  149. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  150. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  151. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  152. data/test/cases/arel/nodes/sum_test.rb +35 -0
  153. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  154. data/test/cases/arel/nodes/true_test.rb +21 -0
  155. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  156. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  157. data/test/cases/arel/nodes/window_test.rb +81 -0
  158. data/test/cases/arel/nodes_test.rb +34 -0
  159. data/test/cases/arel/select_manager_test.rb +1238 -0
  160. data/test/cases/arel/support/fake_record.rb +135 -0
  161. data/test/cases/arel/table_test.rb +216 -0
  162. data/test/cases/arel/update_manager_test.rb +126 -0
  163. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  164. data/test/cases/arel/visitors/dot_test.rb +90 -0
  165. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  166. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  167. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  168. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  169. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  170. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  171. data/test/cases/associations/callbacks_test.rb +56 -38
  172. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  173. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  174. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  175. data/test/cases/associations/eager_singularization_test.rb +21 -21
  176. data/test/cases/associations/eager_test.rb +559 -415
  177. data/test/cases/associations/extension_test.rb +18 -12
  178. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  179. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  180. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  181. data/test/cases/associations/has_one_associations_test.rb +294 -129
  182. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  183. data/test/cases/associations/inner_join_association_test.rb +114 -38
  184. data/test/cases/associations/inverse_associations_test.rb +606 -398
  185. data/test/cases/associations/join_model_test.rb +158 -148
  186. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  187. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  188. data/test/cases/associations/required_test.rb +35 -10
  189. data/test/cases/associations_test.rb +241 -110
  190. data/test/cases/attribute_methods/read_test.rb +11 -11
  191. data/test/cases/attribute_methods_test.rb +413 -298
  192. data/test/cases/attributes_test.rb +145 -27
  193. data/test/cases/autosave_association_test.rb +681 -436
  194. data/test/cases/base_prevent_writes_test.rb +229 -0
  195. data/test/cases/base_test.rb +599 -542
  196. data/test/cases/batches_test.rb +288 -82
  197. data/test/cases/binary_test.rb +26 -31
  198. data/test/cases/bind_parameter_test.rb +194 -21
  199. data/test/cases/boolean_test.rb +52 -0
  200. data/test/cases/cache_key_test.rb +110 -5
  201. data/test/cases/calculations_test.rb +740 -177
  202. data/test/cases/callbacks_test.rb +74 -207
  203. data/test/cases/clone_test.rb +15 -10
  204. data/test/cases/coders/json_test.rb +2 -0
  205. data/test/cases/coders/yaml_column_test.rb +16 -13
  206. data/test/cases/collection_cache_key_test.rb +177 -20
  207. data/test/cases/column_alias_test.rb +9 -7
  208. data/test/cases/column_definition_test.rb +10 -68
  209. data/test/cases/comment_test.rb +166 -107
  210. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  211. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  212. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  213. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  214. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  215. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  216. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  217. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  218. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  219. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  220. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  221. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  222. data/test/cases/connection_management_test.rb +13 -11
  223. data/test/cases/connection_pool_test.rb +316 -83
  224. data/test/cases/core_test.rb +82 -58
  225. data/test/cases/counter_cache_test.rb +204 -50
  226. data/test/cases/custom_locking_test.rb +5 -3
  227. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  228. data/test/cases/database_configurations/resolver_test.rb +150 -0
  229. data/test/cases/database_configurations_test.rb +145 -0
  230. data/test/cases/database_selector_test.rb +296 -0
  231. data/test/cases/database_statements_test.rb +18 -16
  232. data/test/cases/date_test.rb +8 -16
  233. data/test/cases/date_time_precision_test.rb +100 -78
  234. data/test/cases/date_time_test.rb +23 -8
  235. data/test/cases/defaults_test.rb +106 -71
  236. data/test/cases/delegated_type_test.rb +57 -0
  237. data/test/cases/dirty_test.rb +419 -223
  238. data/test/cases/disconnected_test.rb +6 -6
  239. data/test/cases/dup_test.rb +54 -27
  240. data/test/cases/enum_test.rb +461 -82
  241. data/test/cases/errors_test.rb +7 -7
  242. data/test/cases/explain_subscriber_test.rb +17 -15
  243. data/test/cases/explain_test.rb +11 -19
  244. data/test/cases/filter_attributes_test.rb +153 -0
  245. data/test/cases/finder_respond_to_test.rb +14 -14
  246. data/test/cases/finder_test.rb +669 -287
  247. data/test/cases/fixture_set/file_test.rb +34 -38
  248. data/test/cases/fixtures_test.rb +833 -176
  249. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  250. data/test/cases/habtm_destroy_order_test.rb +25 -25
  251. data/test/cases/helper.rb +78 -49
  252. data/test/cases/hot_compatibility_test.rb +33 -32
  253. data/test/cases/i18n_test.rb +18 -17
  254. data/test/cases/inheritance_test.rb +180 -115
  255. data/test/cases/insert_all_test.rb +489 -0
  256. data/test/cases/instrumentation_test.rb +101 -0
  257. data/test/cases/integration_test.rb +119 -31
  258. data/test/cases/invalid_connection_test.rb +18 -16
  259. data/test/cases/invertible_migration_test.rb +183 -43
  260. data/test/cases/json_attribute_test.rb +35 -0
  261. data/test/cases/json_serialization_test.rb +57 -58
  262. data/test/cases/json_shared_test_cases.rb +290 -0
  263. data/test/cases/locking_test.rb +413 -119
  264. data/test/cases/log_subscriber_test.rb +68 -26
  265. data/test/cases/marshal_serialization_test.rb +39 -0
  266. data/test/cases/migration/change_schema_test.rb +118 -72
  267. data/test/cases/migration/change_table_test.rb +138 -30
  268. data/test/cases/migration/check_constraint_test.rb +162 -0
  269. data/test/cases/migration/column_attributes_test.rb +45 -35
  270. data/test/cases/migration/column_positioning_test.rb +18 -6
  271. data/test/cases/migration/columns_test.rb +93 -77
  272. data/test/cases/migration/command_recorder_test.rb +121 -34
  273. data/test/cases/migration/compatibility_test.rb +578 -23
  274. data/test/cases/migration/create_join_table_test.rb +35 -25
  275. data/test/cases/migration/foreign_key_test.rb +503 -284
  276. data/test/cases/migration/helper.rb +4 -3
  277. data/test/cases/migration/index_test.rb +119 -70
  278. data/test/cases/migration/logger_test.rb +9 -6
  279. data/test/cases/migration/pending_migrations_test.rb +88 -34
  280. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  281. data/test/cases/migration/references_index_test.rb +38 -19
  282. data/test/cases/migration/references_statements_test.rb +15 -14
  283. data/test/cases/migration/rename_table_test.rb +53 -30
  284. data/test/cases/migration_test.rb +637 -269
  285. data/test/cases/migrator_test.rb +191 -135
  286. data/test/cases/mixin_test.rb +7 -11
  287. data/test/cases/modules_test.rb +36 -34
  288. data/test/cases/multi_db_migrator_test.rb +223 -0
  289. data/test/cases/multiparameter_attributes_test.rb +60 -33
  290. data/test/cases/multiple_db_test.rb +16 -22
  291. data/test/cases/nested_attributes_test.rb +341 -320
  292. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  293. data/test/cases/null_relation_test.rb +84 -0
  294. data/test/cases/numeric_data_test.rb +93 -0
  295. data/test/cases/persistence_test.rb +361 -269
  296. data/test/cases/pooled_connections_test.rb +18 -26
  297. data/test/cases/prepared_statement_status_test.rb +48 -0
  298. data/test/cases/primary_keys_test.rb +210 -104
  299. data/test/cases/query_cache_test.rb +610 -141
  300. data/test/cases/quoting_test.rb +132 -31
  301. data/test/cases/readonly_test.rb +49 -48
  302. data/test/cases/reaper_test.rb +146 -32
  303. data/test/cases/reflection_test.rb +167 -156
  304. data/test/cases/relation/delegation_test.rb +49 -36
  305. data/test/cases/relation/delete_all_test.rb +117 -0
  306. data/test/cases/relation/merging_test.rb +319 -42
  307. data/test/cases/relation/mutation_test.rb +55 -93
  308. data/test/cases/relation/or_test.rb +129 -29
  309. data/test/cases/relation/predicate_builder_test.rb +21 -6
  310. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  311. data/test/cases/relation/select_test.rb +67 -0
  312. data/test/cases/relation/update_all_test.rb +317 -0
  313. data/test/cases/relation/where_chain_test.rb +68 -32
  314. data/test/cases/relation/where_clause_test.rb +136 -61
  315. data/test/cases/relation/where_test.rb +155 -48
  316. data/test/cases/relation_test.rb +266 -112
  317. data/test/cases/relations_test.rb +969 -744
  318. data/test/cases/reload_models_test.rb +13 -9
  319. data/test/cases/reserved_word_test.rb +141 -0
  320. data/test/cases/result_test.rb +68 -17
  321. data/test/cases/sanitize_test.rb +87 -71
  322. data/test/cases/schema_dumper_test.rb +221 -128
  323. data/test/cases/schema_loading_test.rb +3 -2
  324. data/test/cases/scoping/default_scoping_test.rb +185 -144
  325. data/test/cases/scoping/named_scoping_test.rb +177 -89
  326. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  327. data/test/cases/secure_token_test.rb +18 -3
  328. data/test/cases/serialization_test.rb +30 -28
  329. data/test/cases/serialized_attribute_test.rb +133 -42
  330. data/test/cases/signed_id_test.rb +168 -0
  331. data/test/cases/statement_cache_test.rb +41 -24
  332. data/test/cases/statement_invalid_test.rb +42 -0
  333. data/test/cases/store_test.rb +180 -55
  334. data/test/cases/strict_loading_test.rb +473 -0
  335. data/test/cases/suppressor_test.rb +26 -12
  336. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  337. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  338. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  339. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  340. data/test/cases/test_case.rb +51 -40
  341. data/test/cases/test_databases_test.rb +79 -0
  342. data/test/cases/test_fixtures_test.rb +79 -19
  343. data/test/cases/time_precision_test.rb +98 -76
  344. data/test/cases/timestamp_test.rb +102 -99
  345. data/test/cases/touch_later_test.rb +12 -10
  346. data/test/cases/transaction_callbacks_test.rb +344 -90
  347. data/test/cases/transaction_isolation_test.rb +12 -12
  348. data/test/cases/transactions_test.rb +612 -162
  349. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  350. data/test/cases/type/date_time_test.rb +4 -2
  351. data/test/cases/type/integer_test.rb +4 -2
  352. data/test/cases/type/string_test.rb +10 -8
  353. data/test/cases/type/time_test.rb +28 -0
  354. data/test/cases/type/type_map_test.rb +29 -28
  355. data/test/cases/type/unsigned_integer_test.rb +19 -0
  356. data/test/cases/type_test.rb +2 -0
  357. data/test/cases/types_test.rb +3 -1
  358. data/test/cases/unconnected_test.rb +14 -1
  359. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  360. data/test/cases/validations/absence_validation_test.rb +19 -17
  361. data/test/cases/validations/association_validation_test.rb +30 -28
  362. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  363. data/test/cases/validations/i18n_validation_test.rb +22 -21
  364. data/test/cases/validations/length_validation_test.rb +34 -33
  365. data/test/cases/validations/numericality_validation_test.rb +181 -0
  366. data/test/cases/validations/presence_validation_test.rb +21 -19
  367. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  368. data/test/cases/validations_repair_helper.rb +2 -0
  369. data/test/cases/validations_test.rb +61 -26
  370. data/test/cases/view_test.rb +122 -116
  371. data/test/cases/yaml_serialization_test.rb +79 -34
  372. data/test/config.example.yml +19 -19
  373. data/test/config.rb +3 -1
  374. data/test/config.yml +16 -6
  375. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  376. data/test/fixtures/author_addresses.yml +1 -8
  377. data/test/fixtures/authors.yml +1 -7
  378. data/test/fixtures/binaries.yml +4 -0
  379. data/test/fixtures/books.yml +9 -2
  380. data/test/fixtures/categories_posts.yml +3 -0
  381. data/test/fixtures/citations.yml +5 -0
  382. data/test/fixtures/comments.yml +7 -0
  383. data/test/fixtures/companies.yml +5 -0
  384. data/test/fixtures/computers.yml +2 -0
  385. data/test/fixtures/customers.yml +10 -1
  386. data/test/fixtures/developers.yml +1 -1
  387. data/test/fixtures/essays.yml +10 -0
  388. data/test/fixtures/faces.yml +3 -3
  389. data/test/fixtures/humans.yml +5 -0
  390. data/test/fixtures/interests.yml +7 -7
  391. data/test/fixtures/memberships.yml +7 -0
  392. data/test/fixtures/minimalistics.yml +3 -0
  393. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  394. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  395. data/test/fixtures/naked/yml/parrots.yml +1 -0
  396. data/test/fixtures/other_books.yml +26 -0
  397. data/test/fixtures/other_posts.yml +1 -0
  398. data/test/fixtures/parrots.yml +7 -1
  399. data/test/fixtures/pirates.yml +3 -0
  400. data/test/fixtures/posts.yml +11 -3
  401. data/test/fixtures/readers.yml +6 -0
  402. data/test/fixtures/reserved_words/values.yml +2 -2
  403. data/test/fixtures/sponsors.yml +3 -0
  404. data/test/fixtures/strict_zines.yml +2 -0
  405. data/test/fixtures/subscribers.yml +1 -1
  406. data/test/fixtures/tasks.yml +1 -1
  407. data/test/fixtures/warehouse-things.yml +3 -0
  408. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  409. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  410. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  411. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  412. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  413. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  414. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  415. data/test/migrations/rename/1_we_need_things.rb +2 -0
  416. data/test/migrations/rename/2_rename_things.rb +2 -0
  417. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  419. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  420. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  421. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  422. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  423. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  424. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  425. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  426. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  427. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  428. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  429. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  430. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  431. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  432. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  433. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  434. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  435. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  436. data/test/models/account.rb +46 -0
  437. data/test/models/admin/account.rb +3 -1
  438. data/test/models/admin/randomly_named_c1.rb +2 -0
  439. data/test/models/admin/user.rb +16 -8
  440. data/test/models/admin.rb +4 -2
  441. data/test/models/aircraft.rb +3 -1
  442. data/test/models/arunit2_model.rb +2 -0
  443. data/test/models/author.rb +153 -102
  444. data/test/models/auto_id.rb +2 -0
  445. data/test/models/autoloadable/extra_firm.rb +2 -0
  446. data/test/models/binary.rb +3 -1
  447. data/test/models/binary_field.rb +6 -0
  448. data/test/models/bird.rb +13 -1
  449. data/test/models/book.rb +14 -4
  450. data/test/models/book_destroy_async.rb +24 -0
  451. data/test/models/boolean.rb +5 -0
  452. data/test/models/bulb.rb +13 -4
  453. data/test/models/cake_designer.rb +2 -0
  454. data/test/models/car.rb +17 -10
  455. data/test/models/carrier.rb +2 -0
  456. data/test/models/cart.rb +5 -0
  457. data/test/models/cat.rb +2 -0
  458. data/test/models/categorization.rb +8 -6
  459. data/test/models/category.rb +28 -16
  460. data/test/models/chef.rb +2 -0
  461. data/test/models/citation.rb +5 -1
  462. data/test/models/club.rb +13 -10
  463. data/test/models/college.rb +4 -2
  464. data/test/models/column.rb +2 -0
  465. data/test/models/column_name.rb +2 -0
  466. data/test/models/comment.rb +32 -10
  467. data/test/models/company.rb +102 -106
  468. data/test/models/company_in_module.rb +27 -26
  469. data/test/models/computer.rb +3 -1
  470. data/test/models/contact.rb +15 -13
  471. data/test/models/content.rb +5 -3
  472. data/test/models/contract.rb +21 -3
  473. data/test/models/country.rb +2 -4
  474. data/test/models/course.rb +3 -1
  475. data/test/models/customer.rb +10 -8
  476. data/test/models/customer_carrier.rb +2 -0
  477. data/test/models/dashboard.rb +2 -0
  478. data/test/models/default.rb +2 -0
  479. data/test/models/department.rb +2 -0
  480. data/test/models/destroy_async_parent.rb +15 -0
  481. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  482. data/test/models/developer.rb +152 -85
  483. data/test/models/dl_keyed_belongs_to.rb +13 -0
  484. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  485. data/test/models/dl_keyed_has_many.rb +5 -0
  486. data/test/models/dl_keyed_has_many_through.rb +5 -0
  487. data/test/models/dl_keyed_has_one.rb +5 -0
  488. data/test/models/dl_keyed_join.rb +10 -0
  489. data/test/models/dog.rb +2 -0
  490. data/test/models/dog_lover.rb +2 -0
  491. data/test/models/doubloon.rb +3 -1
  492. data/test/models/drink_designer.rb +17 -0
  493. data/test/models/edge.rb +4 -2
  494. data/test/models/electron.rb +2 -0
  495. data/test/models/engine.rb +3 -2
  496. data/test/models/entrant.rb +2 -0
  497. data/test/models/entry.rb +5 -0
  498. data/test/models/essay.rb +6 -3
  499. data/test/models/essay_destroy_async.rb +12 -0
  500. data/test/models/event.rb +3 -1
  501. data/test/models/eye.rb +5 -3
  502. data/test/models/face.rb +14 -6
  503. data/test/models/family.rb +6 -0
  504. data/test/models/family_tree.rb +6 -0
  505. data/test/models/friendship.rb +5 -3
  506. data/test/models/frog.rb +8 -0
  507. data/test/models/guid.rb +3 -1
  508. data/test/models/guitar.rb +2 -0
  509. data/test/models/hotel.rb +5 -3
  510. data/test/models/human.rb +39 -0
  511. data/test/models/image.rb +3 -1
  512. data/test/models/interest.rb +14 -3
  513. data/test/models/invoice.rb +4 -2
  514. data/test/models/item.rb +3 -1
  515. data/test/models/job.rb +5 -3
  516. data/test/models/joke.rb +4 -2
  517. data/test/models/keyboard.rb +3 -1
  518. data/test/models/legacy_thing.rb +2 -0
  519. data/test/models/lesson.rb +2 -0
  520. data/test/models/line_item.rb +3 -1
  521. data/test/models/liquid.rb +2 -0
  522. data/test/models/matey.rb +3 -1
  523. data/test/models/measurement.rb +4 -0
  524. data/test/models/member.rb +23 -20
  525. data/test/models/member_detail.rb +3 -0
  526. data/test/models/member_type.rb +2 -0
  527. data/test/models/membership.rb +4 -1
  528. data/test/models/mentor.rb +3 -1
  529. data/test/models/message.rb +5 -0
  530. data/test/models/minimalistic.rb +2 -0
  531. data/test/models/minivan.rb +3 -2
  532. data/test/models/mixed_case_monkey.rb +3 -1
  533. data/test/models/molecule.rb +2 -0
  534. data/test/models/mouse.rb +6 -0
  535. data/test/models/movie.rb +2 -0
  536. data/test/models/node.rb +4 -2
  537. data/test/models/non_primary_key.rb +2 -0
  538. data/test/models/notification.rb +2 -0
  539. data/test/models/numeric_data.rb +12 -0
  540. data/test/models/order.rb +4 -2
  541. data/test/models/organization.rb +9 -7
  542. data/test/models/other_dog.rb +3 -1
  543. data/test/models/owner.rb +6 -4
  544. data/test/models/parrot.rb +12 -4
  545. data/test/models/person.rb +59 -54
  546. data/test/models/personal_legacy_thing.rb +3 -1
  547. data/test/models/pet.rb +4 -2
  548. data/test/models/pet_treasure.rb +2 -0
  549. data/test/models/pirate.rb +67 -43
  550. data/test/models/possession.rb +3 -1
  551. data/test/models/post.rb +184 -86
  552. data/test/models/price_estimate.rb +11 -1
  553. data/test/models/professor.rb +3 -1
  554. data/test/models/project.rb +14 -12
  555. data/test/models/publisher/article.rb +2 -0
  556. data/test/models/publisher/magazine.rb +2 -0
  557. data/test/models/publisher.rb +2 -0
  558. data/test/models/randomly_named_c1.rb +2 -0
  559. data/test/models/rating.rb +5 -1
  560. data/test/models/reader.rb +7 -5
  561. data/test/models/recipe.rb +2 -0
  562. data/test/models/record.rb +2 -0
  563. data/test/models/reference.rb +6 -3
  564. data/test/models/reply.rb +39 -21
  565. data/test/models/room.rb +6 -0
  566. data/test/models/section.rb +6 -0
  567. data/test/models/seminar.rb +6 -0
  568. data/test/models/session.rb +6 -0
  569. data/test/models/ship.rb +12 -9
  570. data/test/models/ship_part.rb +5 -3
  571. data/test/models/shop.rb +4 -2
  572. data/test/models/shop_account.rb +2 -0
  573. data/test/models/speedometer.rb +2 -0
  574. data/test/models/sponsor.rb +8 -5
  575. data/test/models/squeak.rb +6 -0
  576. data/test/models/strict_zine.rb +7 -0
  577. data/test/models/string_key_object.rb +2 -0
  578. data/test/models/student.rb +2 -0
  579. data/test/models/subscriber.rb +4 -2
  580. data/test/models/subscription.rb +5 -1
  581. data/test/models/tag.rb +6 -3
  582. data/test/models/tagging.rb +13 -6
  583. data/test/models/task.rb +2 -0
  584. data/test/models/topic.rb +54 -19
  585. data/test/models/toy.rb +4 -0
  586. data/test/models/traffic_light.rb +2 -0
  587. data/test/models/treasure.rb +5 -3
  588. data/test/models/treaty.rb +2 -4
  589. data/test/models/tree.rb +2 -0
  590. data/test/models/tuning_peg.rb +2 -0
  591. data/test/models/tyre.rb +2 -0
  592. data/test/models/user.rb +12 -4
  593. data/test/models/uuid_child.rb +2 -0
  594. data/test/models/uuid_item.rb +2 -0
  595. data/test/models/uuid_parent.rb +2 -0
  596. data/test/models/vegetables.rb +12 -3
  597. data/test/models/vertex.rb +6 -4
  598. data/test/models/warehouse_thing.rb +2 -0
  599. data/test/models/wheel.rb +3 -1
  600. data/test/models/without_table.rb +3 -1
  601. data/test/models/zine.rb +3 -1
  602. data/test/schema/mysql2_specific_schema.rb +49 -35
  603. data/test/schema/oracle_specific_schema.rb +13 -15
  604. data/test/schema/postgresql_specific_schema.rb +51 -40
  605. data/test/schema/schema.rb +334 -154
  606. data/test/schema/sqlite_specific_schema.rb +9 -16
  607. data/test/support/config.rb +26 -26
  608. data/test/support/connection.rb +14 -8
  609. data/test/support/connection_helper.rb +3 -1
  610. data/test/support/ddl_helper.rb +2 -0
  611. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  618. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  619. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  620. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  621. data/test/support/schema_dumping_helper.rb +2 -0
  622. data/test/support/stubs/strong_parameters.rb +40 -0
  623. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  624. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  625. metadata +192 -14
@@ -1,343 +1,457 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'support/connection_helper'
3
-
4
- if ActiveRecord::Base.connection.respond_to?(:supports_ranges?) && ActiveRecord::Base.connection.supports_ranges?
5
- class PostgresqlRange < ActiveRecord::Base
6
- self.table_name = "postgresql_ranges"
7
- self.time_zone_aware_types += [:tsrange, :tstzrange]
8
- end
9
-
10
- class PostgresqlRangeTest < ActiveRecord::PostgreSQLTestCase
11
- self.use_transactional_tests = false
12
- include ConnectionHelper
13
- include InTimeZone
14
-
15
- def setup
16
- @connection = PostgresqlRange.connection
17
- begin
18
- @connection.transaction do
19
- @connection.execute <<_SQL
20
- CREATE TYPE floatrange AS RANGE (
21
- subtype = float8,
22
- subtype_diff = float8mi
23
- );
24
- _SQL
25
-
26
- @connection.create_table('postgresql_ranges') do |t|
27
- t.daterange :date_range
28
- t.numrange :num_range
29
- t.tsrange :ts_range
30
- t.tstzrange :tstz_range
31
- t.int4range :int4_range
32
- t.int8range :int8_range
33
- end
34
-
35
- @connection.add_column 'postgresql_ranges', 'float_range', 'floatrange'
36
- end
37
- PostgresqlRange.reset_column_information
38
- rescue ActiveRecord::StatementInvalid
39
- skip "do not test on PG without range"
4
+ require "support/connection_helper"
5
+
6
+ class PostgresqlRange < ActiveRecord::Base
7
+ self.table_name = "postgresql_ranges"
8
+ self.time_zone_aware_types += [:tsrange, :tstzrange]
9
+ end
10
+
11
+ class PostgresqlRangeTest < ActiveRecord::PostgreSQLTestCase
12
+ self.use_transactional_tests = false
13
+ include ConnectionHelper
14
+ include InTimeZone
15
+
16
+ def setup
17
+ @connection = PostgresqlRange.connection
18
+ @connection.transaction do
19
+ @connection.execute <<~SQL
20
+ CREATE TYPE floatrange AS RANGE (
21
+ subtype = float8,
22
+ subtype_diff = float8mi
23
+ );
24
+
25
+ CREATE TYPE stringrange AS RANGE (
26
+ subtype = varchar
27
+ );
28
+ SQL
29
+
30
+ @connection.create_table("postgresql_ranges") do |t|
31
+ t.daterange :date_range
32
+ t.numrange :num_range
33
+ t.tsrange :ts_range
34
+ t.tstzrange :tstz_range
35
+ t.int4range :int4_range
36
+ t.int8range :int8_range
40
37
  end
41
38
 
42
- insert_range(id: 101,
43
- date_range: "[''2012-01-02'', ''2012-01-04'']",
44
- num_range: "[0.1, 0.2]",
45
- ts_range: "[''2010-01-01 14:30'', ''2011-01-01 14:30'']",
46
- tstz_range: "[''2010-01-01 14:30:00+05'', ''2011-01-01 14:30:00-03'']",
47
- int4_range: "[1, 10]",
48
- int8_range: "[10, 100]",
49
- float_range: "[0.5, 0.7]")
50
-
51
- insert_range(id: 102,
52
- date_range: "[''2012-01-02'', ''2012-01-04'')",
53
- num_range: "[0.1, 0.2)",
54
- ts_range: "[''2010-01-01 14:30'', ''2011-01-01 14:30'')",
55
- tstz_range: "[''2010-01-01 14:30:00+05'', ''2011-01-01 14:30:00-03'')",
56
- int4_range: "[1, 10)",
57
- int8_range: "[10, 100)",
58
- float_range: "[0.5, 0.7)")
59
-
60
- insert_range(id: 103,
61
- date_range: "[''2012-01-02'',]",
62
- num_range: "[0.1,]",
63
- ts_range: "[''2010-01-01 14:30'',]",
64
- tstz_range: "[''2010-01-01 14:30:00+05'',]",
65
- int4_range: "[1,]",
66
- int8_range: "[10,]",
67
- float_range: "[0.5,]")
68
-
69
- insert_range(id: 104,
70
- date_range: "[,]",
71
- num_range: "[,]",
72
- ts_range: "[,]",
73
- tstz_range: "[,]",
74
- int4_range: "[,]",
75
- int8_range: "[,]",
76
- float_range: "[,]")
77
-
78
- insert_range(id: 105,
79
- date_range: "[''2012-01-02'', ''2012-01-02'')",
80
- num_range: "[0.1, 0.1)",
81
- ts_range: "[''2010-01-01 14:30'', ''2010-01-01 14:30'')",
82
- tstz_range: "[''2010-01-01 14:30:00+05'', ''2010-01-01 06:30:00-03'')",
83
- int4_range: "[1, 1)",
84
- int8_range: "[10, 10)",
85
- float_range: "[0.5, 0.5)")
86
-
87
- @new_range = PostgresqlRange.new
88
- @first_range = PostgresqlRange.find(101)
89
- @second_range = PostgresqlRange.find(102)
90
- @third_range = PostgresqlRange.find(103)
91
- @fourth_range = PostgresqlRange.find(104)
92
- @empty_range = PostgresqlRange.find(105)
39
+ @connection.add_column "postgresql_ranges", "float_range", "floatrange"
40
+ @connection.add_column "postgresql_ranges", "string_range", "stringrange"
93
41
  end
42
+ PostgresqlRange.reset_column_information
43
+
44
+ insert_range(id: 101,
45
+ date_range: "[''2012-01-02'', ''2012-01-04'']",
46
+ num_range: "[0.1, 0.2]",
47
+ ts_range: "[''2010-01-01 14:30'', ''2011-01-01 14:30'']",
48
+ tstz_range: "[''2010-01-01 14:30:00+05'', ''2011-01-01 14:30:00-03'']",
49
+ int4_range: "[1, 10]",
50
+ int8_range: "[10, 100]",
51
+ float_range: "[0.5, 0.7]")
52
+
53
+ insert_range(id: 102,
54
+ date_range: "[''2012-01-02'', ''2012-01-04'')",
55
+ num_range: "[0.1, 0.2)",
56
+ ts_range: "[''2010-01-01 14:30'', ''2011-01-01 14:30'')",
57
+ tstz_range: "[''2010-01-01 14:30:00+05'', ''2011-01-01 14:30:00-03'')",
58
+ int4_range: "[1, 10)",
59
+ int8_range: "[10, 100)",
60
+ float_range: "[0.5, 0.7)")
61
+
62
+ insert_range(id: 103,
63
+ date_range: "[''2012-01-02'',]",
64
+ num_range: "[0.1,]",
65
+ ts_range: "[''2010-01-01 14:30'',]",
66
+ tstz_range: "[''2010-01-01 14:30:00+05'',]",
67
+ int4_range: "[1,]",
68
+ int8_range: "[10,]",
69
+ float_range: "[0.5,]")
70
+
71
+ insert_range(id: 104,
72
+ date_range: "[,]",
73
+ num_range: "[,]",
74
+ ts_range: "[,]",
75
+ tstz_range: "[,]",
76
+ int4_range: "[,]",
77
+ int8_range: "[,]",
78
+ float_range: "[,]")
79
+
80
+ insert_range(id: 105,
81
+ date_range: "[''2012-01-02'', ''2012-01-02'')",
82
+ num_range: "[0.1, 0.1)",
83
+ ts_range: "[''2010-01-01 14:30'', ''2010-01-01 14:30'')",
84
+ tstz_range: "[''2010-01-01 14:30:00+05'', ''2010-01-01 06:30:00-03'')",
85
+ int4_range: "[1, 1)",
86
+ int8_range: "[10, 10)",
87
+ float_range: "[0.5, 0.5)")
88
+
89
+ @new_range = PostgresqlRange.new
90
+ @first_range = PostgresqlRange.find(101)
91
+ @second_range = PostgresqlRange.find(102)
92
+ @third_range = PostgresqlRange.find(103)
93
+ @fourth_range = PostgresqlRange.find(104)
94
+ @empty_range = PostgresqlRange.find(105)
95
+ end
94
96
 
95
- teardown do
96
- @connection.drop_table 'postgresql_ranges', if_exists: true
97
- @connection.execute 'DROP TYPE IF EXISTS floatrange'
98
- reset_connection
99
- end
97
+ teardown do
98
+ @connection.drop_table "postgresql_ranges", if_exists: true
99
+ @connection.execute "DROP TYPE IF EXISTS floatrange"
100
+ @connection.execute "DROP TYPE IF EXISTS stringrange"
101
+ reset_connection
102
+ end
100
103
 
101
- def test_data_type_of_range_types
102
- assert_equal :daterange, @first_range.column_for_attribute(:date_range).type
103
- assert_equal :numrange, @first_range.column_for_attribute(:num_range).type
104
- assert_equal :tsrange, @first_range.column_for_attribute(:ts_range).type
105
- assert_equal :tstzrange, @first_range.column_for_attribute(:tstz_range).type
106
- assert_equal :int4range, @first_range.column_for_attribute(:int4_range).type
107
- assert_equal :int8range, @first_range.column_for_attribute(:int8_range).type
108
- end
104
+ def test_data_type_of_range_types
105
+ assert_equal :daterange, @first_range.column_for_attribute(:date_range).type
106
+ assert_equal :numrange, @first_range.column_for_attribute(:num_range).type
107
+ assert_equal :tsrange, @first_range.column_for_attribute(:ts_range).type
108
+ assert_equal :tstzrange, @first_range.column_for_attribute(:tstz_range).type
109
+ assert_equal :int4range, @first_range.column_for_attribute(:int4_range).type
110
+ assert_equal :int8range, @first_range.column_for_attribute(:int8_range).type
111
+ end
109
112
 
110
- def test_int4range_values
111
- assert_equal 1...11, @first_range.int4_range
112
- assert_equal 1...10, @second_range.int4_range
113
- assert_equal 1...Float::INFINITY, @third_range.int4_range
114
- assert_equal(-Float::INFINITY...Float::INFINITY, @fourth_range.int4_range)
115
- assert_nil @empty_range.int4_range
116
- end
113
+ def test_int4range_values
114
+ assert_equal 1...11, @first_range.int4_range
115
+ assert_equal 1...10, @second_range.int4_range
116
+ assert_equal 1...Float::INFINITY, @third_range.int4_range
117
+ assert_equal(-Float::INFINITY...Float::INFINITY, @fourth_range.int4_range)
118
+ assert_nil @empty_range.int4_range
119
+ end
117
120
 
118
- def test_int8range_values
119
- assert_equal 10...101, @first_range.int8_range
120
- assert_equal 10...100, @second_range.int8_range
121
- assert_equal 10...Float::INFINITY, @third_range.int8_range
122
- assert_equal(-Float::INFINITY...Float::INFINITY, @fourth_range.int8_range)
123
- assert_nil @empty_range.int8_range
124
- end
121
+ def test_int8range_values
122
+ assert_equal 10...101, @first_range.int8_range
123
+ assert_equal 10...100, @second_range.int8_range
124
+ assert_equal 10...Float::INFINITY, @third_range.int8_range
125
+ assert_equal(-Float::INFINITY...Float::INFINITY, @fourth_range.int8_range)
126
+ assert_nil @empty_range.int8_range
127
+ end
125
128
 
126
- def test_daterange_values
127
- assert_equal Date.new(2012, 1, 2)...Date.new(2012, 1, 5), @first_range.date_range
128
- assert_equal Date.new(2012, 1, 2)...Date.new(2012, 1, 4), @second_range.date_range
129
- assert_equal Date.new(2012, 1, 2)...Float::INFINITY, @third_range.date_range
130
- assert_equal(-Float::INFINITY...Float::INFINITY, @fourth_range.date_range)
131
- assert_nil @empty_range.date_range
132
- end
129
+ def test_daterange_values
130
+ assert_equal Date.new(2012, 1, 2)...Date.new(2012, 1, 5), @first_range.date_range
131
+ assert_equal Date.new(2012, 1, 2)...Date.new(2012, 1, 4), @second_range.date_range
132
+ assert_equal Date.new(2012, 1, 2)...Float::INFINITY, @third_range.date_range
133
+ assert_equal(-Float::INFINITY...Float::INFINITY, @fourth_range.date_range)
134
+ assert_nil @empty_range.date_range
135
+ end
133
136
 
134
- def test_numrange_values
135
- assert_equal BigDecimal.new('0.1')..BigDecimal.new('0.2'), @first_range.num_range
136
- assert_equal BigDecimal.new('0.1')...BigDecimal.new('0.2'), @second_range.num_range
137
- assert_equal BigDecimal.new('0.1')...BigDecimal.new('Infinity'), @third_range.num_range
138
- assert_equal BigDecimal.new('-Infinity')...BigDecimal.new('Infinity'), @fourth_range.num_range
139
- assert_nil @empty_range.num_range
140
- end
137
+ def test_numrange_values
138
+ assert_equal BigDecimal("0.1")..BigDecimal("0.2"), @first_range.num_range
139
+ assert_equal BigDecimal("0.1")...BigDecimal("0.2"), @second_range.num_range
140
+ assert_equal BigDecimal("0.1")...BigDecimal("Infinity"), @third_range.num_range
141
+ assert_equal BigDecimal("-Infinity")...BigDecimal("Infinity"), @fourth_range.num_range
142
+ assert_nil @empty_range.num_range
143
+ end
141
144
 
142
- def test_tsrange_values
143
- tz = ::ActiveRecord::Base.default_timezone
144
- assert_equal Time.send(tz, 2010, 1, 1, 14, 30, 0)..Time.send(tz, 2011, 1, 1, 14, 30, 0), @first_range.ts_range
145
- assert_equal Time.send(tz, 2010, 1, 1, 14, 30, 0)...Time.send(tz, 2011, 1, 1, 14, 30, 0), @second_range.ts_range
146
- assert_equal(-Float::INFINITY...Float::INFINITY, @fourth_range.ts_range)
147
- assert_nil @empty_range.ts_range
148
- end
145
+ def test_tsrange_values
146
+ tz = ::ActiveRecord::Base.default_timezone
147
+ assert_equal Time.public_send(tz, 2010, 1, 1, 14, 30, 0)..Time.public_send(tz, 2011, 1, 1, 14, 30, 0), @first_range.ts_range
148
+ assert_equal Time.public_send(tz, 2010, 1, 1, 14, 30, 0)...Time.public_send(tz, 2011, 1, 1, 14, 30, 0), @second_range.ts_range
149
+ assert_equal(-Float::INFINITY...Float::INFINITY, @fourth_range.ts_range)
150
+ assert_nil @empty_range.ts_range
151
+ end
149
152
 
150
- def test_tstzrange_values
151
- assert_equal Time.parse('2010-01-01 09:30:00 UTC')..Time.parse('2011-01-01 17:30:00 UTC'), @first_range.tstz_range
152
- assert_equal Time.parse('2010-01-01 09:30:00 UTC')...Time.parse('2011-01-01 17:30:00 UTC'), @second_range.tstz_range
153
- assert_equal(-Float::INFINITY...Float::INFINITY, @fourth_range.tstz_range)
154
- assert_nil @empty_range.tstz_range
155
- end
153
+ def test_tstzrange_values
154
+ assert_equal Time.parse("2010-01-01 09:30:00 UTC")..Time.parse("2011-01-01 17:30:00 UTC"), @first_range.tstz_range
155
+ assert_equal Time.parse("2010-01-01 09:30:00 UTC")...Time.parse("2011-01-01 17:30:00 UTC"), @second_range.tstz_range
156
+ assert_equal(-Float::INFINITY...Float::INFINITY, @fourth_range.tstz_range)
157
+ assert_nil @empty_range.tstz_range
158
+ end
156
159
 
157
- def test_custom_range_values
158
- assert_equal 0.5..0.7, @first_range.float_range
159
- assert_equal 0.5...0.7, @second_range.float_range
160
- assert_equal 0.5...Float::INFINITY, @third_range.float_range
161
- assert_equal(-Float::INFINITY...Float::INFINITY, @fourth_range.float_range)
162
- assert_nil @empty_range.float_range
163
- end
160
+ def test_custom_range_values
161
+ assert_equal 0.5..0.7, @first_range.float_range
162
+ assert_equal 0.5...0.7, @second_range.float_range
163
+ assert_equal 0.5...Float::INFINITY, @third_range.float_range
164
+ assert_equal(-Float::INFINITY...Float::INFINITY, @fourth_range.float_range)
165
+ assert_nil @empty_range.float_range
166
+ end
164
167
 
165
- def test_timezone_awareness_tzrange
166
- tz = "Pacific Time (US & Canada)"
168
+ def test_timezone_awareness_tzrange
169
+ tz = "Pacific Time (US & Canada)"
167
170
 
168
- in_time_zone tz do
169
- PostgresqlRange.reset_column_information
170
- time_string = Time.current.to_s
171
- time = Time.zone.parse(time_string)
171
+ in_time_zone tz do
172
+ PostgresqlRange.reset_column_information
173
+ time_string = Time.current.to_s
174
+ time = Time.zone.parse(time_string)
172
175
 
173
- record = PostgresqlRange.new(tstz_range: time_string..time_string)
174
- assert_equal time..time, record.tstz_range
175
- assert_equal ActiveSupport::TimeZone[tz], record.tstz_range.begin.time_zone
176
+ record = PostgresqlRange.new(tstz_range: time_string..time_string)
177
+ assert_equal time..time, record.tstz_range
178
+ assert_equal ActiveSupport::TimeZone[tz], record.tstz_range.begin.time_zone
176
179
 
177
- record.save!
178
- record.reload
180
+ record.save!
181
+ record.reload
179
182
 
180
- assert_equal time..time, record.tstz_range
181
- assert_equal ActiveSupport::TimeZone[tz], record.tstz_range.begin.time_zone
182
- end
183
+ assert_equal time..time, record.tstz_range
184
+ assert_equal ActiveSupport::TimeZone[tz], record.tstz_range.begin.time_zone
183
185
  end
186
+ end
184
187
 
185
- def test_create_tstzrange
186
- tstzrange = Time.parse('2010-01-01 14:30:00 +0100')...Time.parse('2011-02-02 14:30:00 CDT')
187
- round_trip(@new_range, :tstz_range, tstzrange)
188
- assert_equal @new_range.tstz_range, tstzrange
189
- assert_equal @new_range.tstz_range, Time.parse('2010-01-01 13:30:00 UTC')...Time.parse('2011-02-02 19:30:00 UTC')
190
- end
188
+ def test_create_tstzrange
189
+ tstzrange = Time.parse("2010-01-01 14:30:00 +0100")...Time.parse("2011-02-02 14:30:00 CDT")
190
+ round_trip(@new_range, :tstz_range, tstzrange)
191
+ assert_equal @new_range.tstz_range, tstzrange
192
+ assert_equal @new_range.tstz_range, Time.parse("2010-01-01 13:30:00 UTC")...Time.parse("2011-02-02 19:30:00 UTC")
193
+ end
191
194
 
192
- def test_update_tstzrange
193
- assert_equal_round_trip(@first_range, :tstz_range,
194
- Time.parse('2010-01-01 14:30:00 CDT')...Time.parse('2011-02-02 14:30:00 CET'))
195
- assert_nil_round_trip(@first_range, :tstz_range,
196
- Time.parse('2010-01-01 14:30:00 +0100')...Time.parse('2010-01-01 13:30:00 +0000'))
197
- end
195
+ def test_update_tstzrange
196
+ assert_equal_round_trip(@first_range, :tstz_range,
197
+ Time.parse("2010-01-01 14:30:00 CDT")...Time.parse("2011-02-02 14:30:00 CET"))
198
+ assert_nil_round_trip(@first_range, :tstz_range,
199
+ Time.parse("2010-01-01 14:30:00 +0100")...Time.parse("2010-01-01 13:30:00 +0000"))
200
+ end
198
201
 
199
- def test_create_tsrange
200
- tz = ::ActiveRecord::Base.default_timezone
201
- assert_equal_round_trip(@new_range, :ts_range,
202
- Time.send(tz, 2010, 1, 1, 14, 30, 0)...Time.send(tz, 2011, 2, 2, 14, 30, 0))
203
- end
202
+ def test_escaped_tstzrange
203
+ assert_equal_round_trip(@first_range, :tstz_range,
204
+ Time.parse("-1000-01-01 14:30:00 CDT")...Time.parse("2020-02-02 14:30:00 CET"))
205
+ end
204
206
 
205
- def test_update_tsrange
206
- tz = ::ActiveRecord::Base.default_timezone
207
- assert_equal_round_trip(@first_range, :ts_range,
208
- Time.send(tz, 2010, 1, 1, 14, 30, 0)...Time.send(tz, 2011, 2, 2, 14, 30, 0))
209
- assert_nil_round_trip(@first_range, :ts_range,
210
- Time.send(tz, 2010, 1, 1, 14, 30, 0)...Time.send(tz, 2010, 1, 1, 14, 30, 0))
211
- end
207
+ def test_create_tsrange
208
+ tz = ::ActiveRecord::Base.default_timezone
209
+ assert_equal_round_trip(@new_range, :ts_range,
210
+ Time.public_send(tz, 2010, 1, 1, 14, 30, 0)...Time.public_send(tz, 2011, 2, 2, 14, 30, 0))
211
+ end
212
212
 
213
- def test_timezone_awareness_tsrange
214
- tz = "Pacific Time (US & Canada)"
213
+ def test_update_tsrange
214
+ tz = ::ActiveRecord::Base.default_timezone
215
+ assert_equal_round_trip(@first_range, :ts_range,
216
+ Time.public_send(tz, 2010, 1, 1, 14, 30, 0)...Time.public_send(tz, 2011, 2, 2, 14, 30, 0))
217
+ assert_nil_round_trip(@first_range, :ts_range,
218
+ Time.public_send(tz, 2010, 1, 1, 14, 30, 0)...Time.public_send(tz, 2010, 1, 1, 14, 30, 0))
219
+ end
215
220
 
216
- in_time_zone tz do
217
- PostgresqlRange.reset_column_information
218
- time_string = Time.current.to_s
219
- time = Time.zone.parse(time_string)
221
+ def test_escaped_tsrange
222
+ tz = ::ActiveRecord::Base.default_timezone
223
+ assert_equal_round_trip(@first_range, :ts_range,
224
+ Time.public_send(tz, -1000, 1, 1, 14, 30, 0)...Time.public_send(tz, 2020, 2, 2, 14, 30, 0))
225
+ end
220
226
 
221
- record = PostgresqlRange.new(ts_range: time_string..time_string)
222
- assert_equal time..time, record.ts_range
223
- assert_equal ActiveSupport::TimeZone[tz], record.ts_range.begin.time_zone
227
+ def test_timezone_awareness_tsrange
228
+ tz = "Pacific Time (US & Canada)"
224
229
 
225
- record.save!
226
- record.reload
230
+ in_time_zone tz do
231
+ PostgresqlRange.reset_column_information
232
+ time_string = Time.current.to_s
233
+ time = Time.zone.parse(time_string)
227
234
 
228
- assert_equal time..time, record.ts_range
229
- assert_equal ActiveSupport::TimeZone[tz], record.ts_range.begin.time_zone
230
- end
231
- end
235
+ record = PostgresqlRange.new(ts_range: time_string..time_string)
236
+ assert_equal time..time, record.ts_range
237
+ assert_equal ActiveSupport::TimeZone[tz], record.ts_range.begin.time_zone
232
238
 
233
- def test_create_numrange
234
- assert_equal_round_trip(@new_range, :num_range,
235
- BigDecimal.new('0.5')...BigDecimal.new('1'))
236
- end
239
+ record.save!
240
+ record.reload
237
241
 
238
- def test_update_numrange
239
- assert_equal_round_trip(@first_range, :num_range,
240
- BigDecimal.new('0.5')...BigDecimal.new('1'))
241
- assert_nil_round_trip(@first_range, :num_range,
242
- BigDecimal.new('0.5')...BigDecimal.new('0.5'))
242
+ assert_equal time..time, record.ts_range
243
+ assert_equal ActiveSupport::TimeZone[tz], record.ts_range.begin.time_zone
243
244
  end
245
+ end
244
246
 
245
- def test_create_daterange
246
- assert_equal_round_trip(@new_range, :date_range,
247
- Range.new(Date.new(2012, 1, 1), Date.new(2013, 1, 1), true))
248
- end
247
+ def test_create_tstzrange_preserve_usec
248
+ tstzrange = Time.parse("2010-01-01 14:30:00.670277 +0100")...Time.parse("2011-02-02 14:30:00.745125 CDT")
249
+ round_trip(@new_range, :tstz_range, tstzrange)
250
+ assert_equal @new_range.tstz_range, tstzrange
251
+ assert_equal @new_range.tstz_range, Time.parse("2010-01-01 13:30:00.670277 UTC")...Time.parse("2011-02-02 19:30:00.745125 UTC")
252
+ end
249
253
 
250
- def test_update_daterange
251
- assert_equal_round_trip(@first_range, :date_range,
252
- Date.new(2012, 2, 3)...Date.new(2012, 2, 10))
253
- assert_nil_round_trip(@first_range, :date_range,
254
- Date.new(2012, 2, 3)...Date.new(2012, 2, 3))
255
- end
254
+ def test_update_tstzrange_preserve_usec
255
+ assert_equal_round_trip(@first_range, :tstz_range,
256
+ Time.parse("2010-01-01 14:30:00.245124 CDT")...Time.parse("2011-02-02 14:30:00.451274 CET"))
257
+ assert_nil_round_trip(@first_range, :tstz_range,
258
+ Time.parse("2010-01-01 14:30:00.245124 +0100")...Time.parse("2010-01-01 13:30:00.245124 +0000"))
259
+ end
256
260
 
257
- def test_create_int4range
258
- assert_equal_round_trip(@new_range, :int4_range, Range.new(3, 50, true))
259
- end
261
+ def test_create_tsrange_preseve_usec
262
+ tz = ::ActiveRecord::Base.default_timezone
263
+ assert_equal_round_trip(@new_range, :ts_range,
264
+ Time.public_send(tz, 2010, 1, 1, 14, 30, 0, 125435)...Time.public_send(tz, 2011, 2, 2, 14, 30, 0, 225435))
265
+ end
260
266
 
261
- def test_update_int4range
262
- assert_equal_round_trip(@first_range, :int4_range, 6...10)
263
- assert_nil_round_trip(@first_range, :int4_range, 3...3)
264
- end
267
+ def test_update_tsrange_preserve_usec
268
+ tz = ::ActiveRecord::Base.default_timezone
269
+ assert_equal_round_trip(@first_range, :ts_range,
270
+ Time.public_send(tz, 2010, 1, 1, 14, 30, 0, 142432)...Time.public_send(tz, 2011, 2, 2, 14, 30, 0, 224242))
271
+ assert_nil_round_trip(@first_range, :ts_range,
272
+ Time.public_send(tz, 2010, 1, 1, 14, 30, 0, 142432)...Time.public_send(tz, 2010, 1, 1, 14, 30, 0, 142432))
273
+ end
265
274
 
266
- def test_create_int8range
267
- assert_equal_round_trip(@new_range, :int8_range, Range.new(30, 50, true))
268
- end
275
+ def test_timezone_awareness_tsrange_preserve_usec
276
+ tz = "Pacific Time (US & Canada)"
269
277
 
270
- def test_update_int8range
271
- assert_equal_round_trip(@first_range, :int8_range, 60000...10000000)
272
- assert_nil_round_trip(@first_range, :int8_range, 39999...39999)
273
- end
278
+ in_time_zone tz do
279
+ PostgresqlRange.reset_column_information
280
+ time_string = "2017-09-26 07:30:59.132451 -0700"
281
+ time = Time.zone.parse(time_string)
282
+ assert time.usec > 0
274
283
 
275
- def test_exclude_beginning_for_subtypes_without_succ_method_is_not_supported
276
- assert_raises(ArgumentError) { PostgresqlRange.create!(num_range: "(0.1, 0.2]") }
277
- assert_raises(ArgumentError) { PostgresqlRange.create!(float_range: "(0.5, 0.7]") }
278
- assert_raises(ArgumentError) { PostgresqlRange.create!(int4_range: "(1, 10]") }
279
- assert_raises(ArgumentError) { PostgresqlRange.create!(int8_range: "(10, 100]") }
280
- assert_raises(ArgumentError) { PostgresqlRange.create!(date_range: "(''2012-01-02'', ''2012-01-04'']") }
281
- assert_raises(ArgumentError) { PostgresqlRange.create!(ts_range: "(''2010-01-01 14:30'', ''2011-01-01 14:30'']") }
282
- assert_raises(ArgumentError) { PostgresqlRange.create!(tstz_range: "(''2010-01-01 14:30:00+05'', ''2011-01-01 14:30:00-03'']") }
284
+ record = PostgresqlRange.new(ts_range: time_string..time_string)
285
+ assert_equal time..time, record.ts_range
286
+ assert_equal ActiveSupport::TimeZone[tz], record.ts_range.begin.time_zone
287
+ assert_equal time.usec, record.ts_range.begin.usec
288
+
289
+ record.save!
290
+ record.reload
291
+
292
+ assert_equal time..time, record.ts_range
293
+ assert_equal ActiveSupport::TimeZone[tz], record.ts_range.begin.time_zone
294
+ assert_equal time.usec, record.ts_range.begin.usec
283
295
  end
296
+ end
284
297
 
285
- def test_update_all_with_ranges
286
- PostgresqlRange.create!
298
+ def test_create_numrange
299
+ assert_equal_round_trip(@new_range, :num_range,
300
+ BigDecimal("0.5")...BigDecimal("1"))
301
+ end
287
302
 
288
- PostgresqlRange.update_all(int8_range: 1..100)
303
+ def test_update_numrange
304
+ assert_equal_round_trip(@first_range, :num_range,
305
+ BigDecimal("0.5")...BigDecimal("1"))
306
+ assert_nil_round_trip(@first_range, :num_range,
307
+ BigDecimal("0.5")...BigDecimal("0.5"))
308
+ end
289
309
 
290
- assert_equal 1...101, PostgresqlRange.first.int8_range
291
- end
310
+ def test_create_daterange
311
+ assert_equal_round_trip(@new_range, :date_range,
312
+ Range.new(Date.new(2012, 1, 1), Date.new(2013, 1, 1), true))
313
+ end
292
314
 
293
- def test_ranges_correctly_escape_input
294
- range = "-1,2]'; DROP TABLE postgresql_ranges; --".."a"
295
- PostgresqlRange.update_all(int8_range: range)
315
+ def test_update_daterange
316
+ assert_equal_round_trip(@first_range, :date_range,
317
+ Date.new(2012, 2, 3)...Date.new(2012, 2, 10))
318
+ assert_nil_round_trip(@first_range, :date_range,
319
+ Date.new(2012, 2, 3)...Date.new(2012, 2, 3))
320
+ end
296
321
 
297
- assert_nothing_raised do
298
- PostgresqlRange.first
299
- end
322
+ def test_create_int4range
323
+ assert_equal_round_trip(@new_range, :int4_range, Range.new(3, 50, true))
324
+ end
325
+
326
+ def test_update_int4range
327
+ assert_equal_round_trip(@first_range, :int4_range, 6...10)
328
+ assert_nil_round_trip(@first_range, :int4_range, 3...3)
329
+ end
330
+
331
+ def test_create_int8range
332
+ assert_equal_round_trip(@new_range, :int8_range, Range.new(30, 50, true))
333
+ end
334
+
335
+ def test_update_int8range
336
+ assert_equal_round_trip(@first_range, :int8_range, 60000...10000000)
337
+ assert_nil_round_trip(@first_range, :int8_range, 39999...39999)
338
+ end
339
+
340
+ def test_exclude_beginning_for_subtypes_without_succ_method_is_not_supported
341
+ assert_raises(ArgumentError) { PostgresqlRange.create!(num_range: "(0.1, 0.2]") }
342
+ assert_raises(ArgumentError) { PostgresqlRange.create!(float_range: "(0.5, 0.7]") }
343
+ assert_raises(ArgumentError) { PostgresqlRange.create!(int4_range: "(1, 10]") }
344
+ assert_raises(ArgumentError) { PostgresqlRange.create!(int8_range: "(10, 100]") }
345
+ assert_raises(ArgumentError) { PostgresqlRange.create!(date_range: "(''2012-01-02'', ''2012-01-04'']") }
346
+ assert_raises(ArgumentError) { PostgresqlRange.create!(ts_range: "(''2010-01-01 14:30'', ''2011-01-01 14:30'']") }
347
+ assert_raises(ArgumentError) { PostgresqlRange.create!(tstz_range: "(''2010-01-01 14:30:00+05'', ''2011-01-01 14:30:00-03'']") }
348
+ end
349
+
350
+ def test_where_by_attribute_with_range
351
+ range = 1..100
352
+ record = PostgresqlRange.create!(int4_range: range)
353
+ assert_equal record, PostgresqlRange.where(int4_range: range).take
354
+ end
355
+
356
+ def test_where_by_attribute_with_range_in_array
357
+ range = 1..100
358
+ record = PostgresqlRange.create!(int4_range: range)
359
+ assert_equal record, PostgresqlRange.where(int4_range: [range]).take
360
+ end
361
+
362
+ def test_update_all_with_ranges
363
+ PostgresqlRange.create!
364
+
365
+ PostgresqlRange.update_all(int8_range: 1..100)
366
+
367
+ assert_equal 1...101, PostgresqlRange.first.int8_range
368
+ end
369
+
370
+ def test_ranges_correctly_escape_input
371
+ range = "-1,2]'; DROP TABLE postgresql_ranges; --".."a"
372
+ PostgresqlRange.update_all(int8_range: range)
373
+
374
+ assert_nothing_raised do
375
+ PostgresqlRange.first
300
376
  end
377
+ end
301
378
 
302
- private
303
- def assert_equal_round_trip(range, attribute, value)
304
- round_trip(range, attribute, value)
305
- assert_equal value, range.public_send(attribute)
306
- end
379
+ def test_ranges_correctly_unescape_output
380
+ @connection.execute(<<~SQL)
381
+ INSERT INTO postgresql_ranges (id, string_range)
382
+ VALUES (106, '["ca""t","do\\\\g")')
383
+ SQL
307
384
 
308
- def assert_nil_round_trip(range, attribute, value)
309
- round_trip(range, attribute, value)
310
- assert_nil range.public_send(attribute)
311
- end
385
+ escaped_range = PostgresqlRange.find(106)
386
+ assert_equal('ca"t'...'do\\g', escaped_range.string_range)
387
+ end
312
388
 
313
- def round_trip(range, attribute, value)
314
- range.public_send "#{attribute}=", value
315
- assert range.save
316
- assert range.reload
317
- end
389
+ def test_infinity_values
390
+ PostgresqlRange.create!(int4_range: 1..Float::INFINITY,
391
+ int8_range: -Float::INFINITY..0,
392
+ float_range: -Float::INFINITY..Float::INFINITY)
318
393
 
319
- def insert_range(values)
320
- @connection.execute <<-SQL
321
- INSERT INTO postgresql_ranges (
322
- id,
323
- date_range,
324
- num_range,
325
- ts_range,
326
- tstz_range,
327
- int4_range,
328
- int8_range,
329
- float_range
330
- ) VALUES (
331
- #{values[:id]},
332
- '#{values[:date_range]}',
333
- '#{values[:num_range]}',
334
- '#{values[:ts_range]}',
335
- '#{values[:tstz_range]}',
336
- '#{values[:int4_range]}',
337
- '#{values[:int8_range]}',
338
- '#{values[:float_range]}'
339
- )
340
- SQL
341
- end
394
+ record = PostgresqlRange.first
395
+
396
+ assert_equal(1...Float::INFINITY, record.int4_range)
397
+ assert_equal(-Float::INFINITY...1, record.int8_range)
398
+ assert_equal(-Float::INFINITY...Float::INFINITY, record.float_range)
399
+ end
400
+
401
+ if RUBY_VERSION >= "2.6"
402
+ def test_endless_range_values
403
+ record = PostgresqlRange.create!(
404
+ int4_range: eval("1.."),
405
+ int8_range: eval("10.."),
406
+ float_range: eval("0.5..")
407
+ )
408
+
409
+ record = PostgresqlRange.find(record.id)
410
+
411
+ assert_equal 1...Float::INFINITY, record.int4_range
412
+ assert_equal 10...Float::INFINITY, record.int8_range
413
+ assert_equal 0.5...Float::INFINITY, record.float_range
414
+ end
342
415
  end
416
+
417
+ private
418
+ def assert_equal_round_trip(range, attribute, value)
419
+ round_trip(range, attribute, value)
420
+ assert_equal value, range.public_send(attribute)
421
+ end
422
+
423
+ def assert_nil_round_trip(range, attribute, value)
424
+ round_trip(range, attribute, value)
425
+ assert_nil range.public_send(attribute)
426
+ end
427
+
428
+ def round_trip(range, attribute, value)
429
+ range.public_send "#{attribute}=", value
430
+ assert range.save
431
+ assert range.reload
432
+ end
433
+
434
+ def insert_range(values)
435
+ @connection.execute <<~SQL
436
+ INSERT INTO postgresql_ranges (
437
+ id,
438
+ date_range,
439
+ num_range,
440
+ ts_range,
441
+ tstz_range,
442
+ int4_range,
443
+ int8_range,
444
+ float_range
445
+ ) VALUES (
446
+ #{values[:id]},
447
+ '#{values[:date_range]}',
448
+ '#{values[:num_range]}',
449
+ '#{values[:ts_range]}',
450
+ '#{values[:tstz_range]}',
451
+ '#{values[:int4_range]}',
452
+ '#{values[:int8_range]}',
453
+ '#{values[:float_range]}'
454
+ )
455
+ SQL
456
+ end
343
457
  end