ibm_db 4.0.0-x86-mingw32 → 5.0.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 (570) hide show
  1. checksums.yaml +5 -5
  2. data/MANIFEST +14 -14
  3. data/README +208 -208
  4. data/ext/Makefile +269 -0
  5. data/ext/Makefile.nt32 +181 -181
  6. data/ext/Makefile.nt32.191 +212 -212
  7. data/ext/extconf.rb +322 -291
  8. data/ext/gil_release_version +3 -0
  9. data/ext/ibm_db.c +11879 -11887
  10. data/ext/mkmf.log +110 -0
  11. data/ext/ruby_ibm_db.h +241 -241
  12. data/ext/ruby_ibm_db_cli.c +866 -866
  13. data/ext/ruby_ibm_db_cli.h +500 -500
  14. data/ext/unicode_support_version +3 -0
  15. data/init.rb +41 -41
  16. data/lib/IBM_DB.rb +27 -27
  17. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3533 -3452
  18. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -5
  19. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  20. data/lib/mswin32/ibm_db.rb +90 -90
  21. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  22. data/test/active_record/connection_adapters/fake_adapter.rb +49 -49
  23. data/test/assets/example.log +1 -1
  24. data/test/assets/test.txt +1 -1
  25. data/test/cases/adapter_test.rb +351 -351
  26. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -193
  27. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -50
  28. data/test/cases/adapters/mysql2/boolean_test.rb +100 -100
  29. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -63
  30. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -54
  31. data/test/cases/adapters/mysql2/connection_test.rb +210 -210
  32. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -45
  33. data/test/cases/adapters/mysql2/enum_test.rb +26 -26
  34. data/test/cases/adapters/mysql2/explain_test.rb +21 -21
  35. data/test/cases/adapters/mysql2/json_test.rb +195 -195
  36. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -83
  37. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -152
  38. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -59
  39. data/test/cases/adapters/mysql2/schema_test.rb +126 -126
  40. data/test/cases/adapters/mysql2/sp_test.rb +36 -36
  41. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -14
  42. data/test/cases/adapters/mysql2/table_options_test.rb +42 -42
  43. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -66
  44. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -98
  45. data/test/cases/adapters/postgresql/array_test.rb +339 -339
  46. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -82
  47. data/test/cases/adapters/postgresql/bytea_test.rb +134 -134
  48. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -26
  49. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -38
  50. data/test/cases/adapters/postgresql/cidr_test.rb +25 -25
  51. data/test/cases/adapters/postgresql/citext_test.rb +78 -78
  52. data/test/cases/adapters/postgresql/collation_test.rb +53 -53
  53. data/test/cases/adapters/postgresql/composite_test.rb +132 -132
  54. data/test/cases/adapters/postgresql/connection_test.rb +257 -257
  55. data/test/cases/adapters/postgresql/datatype_test.rb +92 -92
  56. data/test/cases/adapters/postgresql/domain_test.rb +47 -47
  57. data/test/cases/adapters/postgresql/enum_test.rb +91 -91
  58. data/test/cases/adapters/postgresql/explain_test.rb +20 -20
  59. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -63
  60. data/test/cases/adapters/postgresql/full_text_test.rb +44 -44
  61. data/test/cases/adapters/postgresql/geometric_test.rb +378 -378
  62. data/test/cases/adapters/postgresql/hstore_test.rb +382 -382
  63. data/test/cases/adapters/postgresql/infinity_test.rb +69 -69
  64. data/test/cases/adapters/postgresql/integer_test.rb +25 -25
  65. data/test/cases/adapters/postgresql/json_test.rb +237 -237
  66. data/test/cases/adapters/postgresql/ltree_test.rb +53 -53
  67. data/test/cases/adapters/postgresql/money_test.rb +96 -96
  68. data/test/cases/adapters/postgresql/network_test.rb +94 -94
  69. data/test/cases/adapters/postgresql/numbers_test.rb +49 -49
  70. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -405
  71. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -22
  72. data/test/cases/adapters/postgresql/quoting_test.rb +44 -44
  73. data/test/cases/adapters/postgresql/range_test.rb +343 -343
  74. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -111
  75. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -34
  76. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -119
  77. data/test/cases/adapters/postgresql/schema_test.rb +597 -597
  78. data/test/cases/adapters/postgresql/serial_test.rb +154 -154
  79. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -41
  80. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -90
  81. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -33
  82. data/test/cases/adapters/postgresql/utils_test.rb +62 -62
  83. data/test/cases/adapters/postgresql/uuid_test.rb +294 -294
  84. data/test/cases/adapters/postgresql/xml_test.rb +54 -54
  85. data/test/cases/adapters/sqlite3/collation_test.rb +53 -53
  86. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -98
  87. data/test/cases/adapters/sqlite3/explain_test.rb +21 -21
  88. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -101
  89. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -441
  90. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -24
  91. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -20
  92. data/test/cases/aggregations_test.rb +168 -168
  93. data/test/cases/ar_schema_test.rb +146 -146
  94. data/test/cases/associations/association_scope_test.rb +16 -16
  95. data/test/cases/associations/belongs_to_associations_test.rb +1141 -1141
  96. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -41
  97. data/test/cases/associations/callbacks_test.rb +190 -190
  98. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  99. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  100. data/test/cases/associations/eager_load_nested_include_test.rb +126 -126
  101. data/test/cases/associations/eager_singularization_test.rb +148 -148
  102. data/test/cases/associations/eager_test.rb +1514 -1514
  103. data/test/cases/associations/extension_test.rb +87 -87
  104. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -1004
  105. data/test/cases/associations/has_many_associations_test.rb +2501 -2501
  106. data/test/cases/associations/has_many_through_associations_test.rb +1271 -1271
  107. data/test/cases/associations/has_one_associations_test.rb +707 -707
  108. data/test/cases/associations/has_one_through_associations_test.rb +383 -383
  109. data/test/cases/associations/inner_join_association_test.rb +139 -139
  110. data/test/cases/associations/inverse_associations_test.rb +733 -733
  111. data/test/cases/associations/join_model_test.rb +777 -777
  112. data/test/cases/associations/left_outer_join_association_test.rb +88 -88
  113. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  114. data/test/cases/associations/required_test.rb +102 -102
  115. data/test/cases/associations_test.rb +385 -385
  116. data/test/cases/attribute_decorators_test.rb +126 -125
  117. data/test/cases/attribute_methods/read_test.rb +60 -60
  118. data/test/cases/attribute_methods_test.rb +1009 -1009
  119. data/test/cases/attribute_set_test.rb +270 -270
  120. data/test/cases/attribute_test.rb +246 -246
  121. data/test/cases/attributes_test.rb +253 -253
  122. data/test/cases/autosave_association_test.rb +1708 -1708
  123. data/test/cases/base_test.rb +1713 -1713
  124. data/test/cases/batches_test.rb +489 -489
  125. data/test/cases/binary_test.rb +44 -44
  126. data/test/cases/bind_parameter_test.rb +110 -110
  127. data/test/cases/cache_key_test.rb +26 -25
  128. data/test/cases/calculations_test.rb +798 -798
  129. data/test/cases/callbacks_test.rb +636 -636
  130. data/test/cases/clone_test.rb +40 -40
  131. data/test/cases/coders/json_test.rb +15 -15
  132. data/test/cases/coders/yaml_column_test.rb +63 -63
  133. data/test/cases/collection_cache_key_test.rb +115 -115
  134. data/test/cases/column_alias_test.rb +17 -17
  135. data/test/cases/column_definition_test.rb +92 -92
  136. data/test/cases/comment_test.rb +145 -143
  137. data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -56
  138. data/test/cases/connection_adapters/connection_handler_test.rb +160 -160
  139. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  140. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -255
  141. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -69
  142. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  143. data/test/cases/connection_adapters/schema_cache_test.rb +61 -61
  144. data/test/cases/connection_adapters/type_lookup_test.rb +118 -118
  145. data/test/cases/connection_management_test.rb +112 -112
  146. data/test/cases/connection_pool_test.rb +521 -521
  147. data/test/cases/connection_specification/resolver_test.rb +131 -131
  148. data/test/cases/core_test.rb +112 -112
  149. data/test/cases/counter_cache_test.rb +214 -214
  150. data/test/cases/custom_locking_test.rb +17 -17
  151. data/test/cases/database_statements_test.rb +34 -34
  152. data/test/cases/date_test.rb +44 -44
  153. data/test/cases/date_time_precision_test.rb +107 -106
  154. data/test/cases/date_time_test.rb +61 -61
  155. data/test/cases/defaults_test.rb +219 -218
  156. data/test/cases/dirty_test.rb +763 -763
  157. data/test/cases/disconnected_test.rb +30 -30
  158. data/test/cases/dup_test.rb +157 -157
  159. data/test/cases/enum_test.rb +444 -444
  160. data/test/cases/errors_test.rb +16 -16
  161. data/test/cases/explain_subscriber_test.rb +64 -64
  162. data/test/cases/explain_test.rb +87 -87
  163. data/test/cases/finder_respond_to_test.rb +60 -60
  164. data/test/cases/finder_test.rb +1294 -1294
  165. data/test/cases/fixture_set/file_test.rb +156 -156
  166. data/test/cases/fixtures_test.rb +988 -988
  167. data/test/cases/forbidden_attributes_protection_test.rb +165 -165
  168. data/test/cases/habtm_destroy_order_test.rb +61 -61
  169. data/test/cases/helper.rb +204 -204
  170. data/test/cases/hot_compatibility_test.rb +142 -142
  171. data/test/cases/i18n_test.rb +45 -45
  172. data/test/cases/inheritance_test.rb +606 -606
  173. data/test/cases/integration_test.rb +155 -155
  174. data/test/cases/invalid_connection_test.rb +24 -24
  175. data/test/cases/invertible_migration_test.rb +387 -387
  176. data/test/cases/json_serialization_test.rb +311 -311
  177. data/test/cases/locking_test.rb +493 -493
  178. data/test/cases/log_subscriber_test.rb +225 -225
  179. data/test/cases/migration/change_schema_test.rb +458 -458
  180. data/test/cases/migration/change_table_test.rb +256 -256
  181. data/test/cases/migration/column_attributes_test.rb +176 -176
  182. data/test/cases/migration/column_positioning_test.rb +56 -56
  183. data/test/cases/migration/columns_test.rb +310 -310
  184. data/test/cases/migration/command_recorder_test.rb +350 -350
  185. data/test/cases/migration/compatibility_test.rb +118 -118
  186. data/test/cases/migration/create_join_table_test.rb +157 -157
  187. data/test/cases/migration/foreign_key_test.rb +362 -360
  188. data/test/cases/migration/helper.rb +39 -39
  189. data/test/cases/migration/index_test.rb +218 -218
  190. data/test/cases/migration/logger_test.rb +36 -36
  191. data/test/cases/migration/pending_migrations_test.rb +52 -52
  192. data/test/cases/migration/references_foreign_key_test.rb +221 -216
  193. data/test/cases/migration/references_index_test.rb +101 -101
  194. data/test/cases/migration/references_statements_test.rb +136 -136
  195. data/test/cases/migration/rename_table_test.rb +93 -93
  196. data/test/cases/migration_test.rb +1157 -1157
  197. data/test/cases/migrator_test.rb +471 -470
  198. data/test/cases/mixin_test.rb +68 -68
  199. data/test/cases/modules_test.rb +172 -172
  200. data/test/cases/multiparameter_attributes_test.rb +372 -372
  201. data/test/cases/multiple_db_test.rb +122 -122
  202. data/test/cases/nested_attributes_test.rb +1098 -1098
  203. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  204. data/test/cases/persistence_test.rb +1001 -1001
  205. data/test/cases/pooled_connections_test.rb +81 -81
  206. data/test/cases/primary_keys_test.rb +376 -376
  207. data/test/cases/query_cache_test.rb +446 -446
  208. data/test/cases/quoting_test.rb +202 -202
  209. data/test/cases/readonly_test.rb +119 -119
  210. data/test/cases/reaper_test.rb +85 -85
  211. data/test/cases/reflection_test.rb +509 -509
  212. data/test/cases/relation/delegation_test.rb +63 -63
  213. data/test/cases/relation/merging_test.rb +157 -157
  214. data/test/cases/relation/mutation_test.rb +183 -183
  215. data/test/cases/relation/or_test.rb +92 -92
  216. data/test/cases/relation/predicate_builder_test.rb +16 -16
  217. data/test/cases/relation/record_fetch_warning_test.rb +40 -40
  218. data/test/cases/relation/where_chain_test.rb +105 -105
  219. data/test/cases/relation/where_clause_test.rb +182 -182
  220. data/test/cases/relation/where_test.rb +322 -322
  221. data/test/cases/relation_test.rb +328 -328
  222. data/test/cases/relations_test.rb +2026 -2026
  223. data/test/cases/reload_models_test.rb +22 -22
  224. data/test/cases/result_test.rb +90 -90
  225. data/test/cases/sanitize_test.rb +176 -176
  226. data/test/cases/schema_dumper_test.rb +457 -457
  227. data/test/cases/schema_loading_test.rb +52 -52
  228. data/test/cases/scoping/default_scoping_test.rb +528 -528
  229. data/test/cases/scoping/named_scoping_test.rb +561 -561
  230. data/test/cases/scoping/relation_scoping_test.rb +400 -400
  231. data/test/cases/secure_token_test.rb +32 -32
  232. data/test/cases/serialization_test.rb +104 -104
  233. data/test/cases/serialized_attribute_test.rb +364 -364
  234. data/test/cases/statement_cache_test.rb +136 -136
  235. data/test/cases/store_test.rb +195 -195
  236. data/test/cases/suppressor_test.rb +63 -63
  237. data/test/cases/tasks/database_tasks_test.rb +462 -462
  238. data/test/cases/tasks/mysql_rake_test.rb +345 -345
  239. data/test/cases/tasks/postgresql_rake_test.rb +304 -304
  240. data/test/cases/tasks/sqlite_rake_test.rb +220 -220
  241. data/test/cases/test_case.rb +131 -131
  242. data/test/cases/test_fixtures_test.rb +36 -36
  243. data/test/cases/time_precision_test.rb +103 -102
  244. data/test/cases/timestamp_test.rb +501 -501
  245. data/test/cases/touch_later_test.rb +121 -121
  246. data/test/cases/transaction_callbacks_test.rb +518 -518
  247. data/test/cases/transaction_isolation_test.rb +106 -106
  248. data/test/cases/transactions_test.rb +835 -834
  249. data/test/cases/type/adapter_specific_registry_test.rb +133 -133
  250. data/test/cases/type/date_time_test.rb +14 -14
  251. data/test/cases/type/integer_test.rb +27 -27
  252. data/test/cases/type/string_test.rb +22 -22
  253. data/test/cases/type/type_map_test.rb +177 -177
  254. data/test/cases/type_test.rb +39 -39
  255. data/test/cases/types_test.rb +24 -24
  256. data/test/cases/unconnected_test.rb +33 -33
  257. data/test/cases/validations/absence_validation_test.rb +73 -73
  258. data/test/cases/validations/association_validation_test.rb +97 -97
  259. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  260. data/test/cases/validations/i18n_validation_test.rb +86 -86
  261. data/test/cases/validations/length_validation_test.rb +79 -79
  262. data/test/cases/validations/presence_validation_test.rb +103 -103
  263. data/test/cases/validations/uniqueness_validation_test.rb +548 -548
  264. data/test/cases/validations_repair_helper.rb +19 -19
  265. data/test/cases/validations_test.rb +194 -194
  266. data/test/cases/view_test.rb +216 -216
  267. data/test/cases/yaml_serialization_test.rb +121 -121
  268. data/test/config.example.yml +97 -97
  269. data/test/config.rb +5 -5
  270. data/test/connections/native_ibm_db/connection.rb +44 -0
  271. data/test/fixtures/accounts.yml +29 -29
  272. data/test/fixtures/admin/accounts.yml +2 -2
  273. data/test/fixtures/admin/users.yml +10 -10
  274. data/test/fixtures/author_addresses.yml +17 -17
  275. data/test/fixtures/author_favorites.yml +3 -3
  276. data/test/fixtures/authors.yml +23 -23
  277. data/test/fixtures/bad_posts.yml +9 -9
  278. data/test/fixtures/binaries.yml +133 -133
  279. data/test/fixtures/books.yml +31 -31
  280. data/test/fixtures/bulbs.yml +5 -5
  281. data/test/fixtures/cars.yml +9 -9
  282. data/test/fixtures/categories.yml +19 -19
  283. data/test/fixtures/categories/special_categories.yml +9 -9
  284. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  285. data/test/fixtures/categories_ordered.yml +7 -7
  286. data/test/fixtures/categories_posts.yml +31 -31
  287. data/test/fixtures/categorizations.yml +23 -23
  288. data/test/fixtures/clubs.yml +8 -8
  289. data/test/fixtures/collections.yml +3 -3
  290. data/test/fixtures/colleges.yml +3 -3
  291. data/test/fixtures/comments.yml +65 -65
  292. data/test/fixtures/companies.yml +67 -67
  293. data/test/fixtures/computers.yml +10 -10
  294. data/test/fixtures/content.yml +3 -3
  295. data/test/fixtures/content_positions.yml +3 -3
  296. data/test/fixtures/courses.yml +8 -8
  297. data/test/fixtures/customers.yml +25 -25
  298. data/test/fixtures/dashboards.yml +6 -6
  299. data/test/fixtures/dead_parrots.yml +5 -5
  300. data/test/fixtures/developers.yml +22 -22
  301. data/test/fixtures/developers_projects.yml +16 -16
  302. data/test/fixtures/dog_lovers.yml +7 -7
  303. data/test/fixtures/dogs.yml +4 -4
  304. data/test/fixtures/doubloons.yml +3 -3
  305. data/test/fixtures/edges.yml +5 -5
  306. data/test/fixtures/entrants.yml +14 -14
  307. data/test/fixtures/essays.yml +6 -6
  308. data/test/fixtures/faces.yml +11 -11
  309. data/test/fixtures/fk_test_has_fk.yml +3 -3
  310. data/test/fixtures/fk_test_has_pk.yml +1 -1
  311. data/test/fixtures/friendships.yml +4 -4
  312. data/test/fixtures/funny_jokes.yml +10 -10
  313. data/test/fixtures/interests.yml +33 -33
  314. data/test/fixtures/items.yml +3 -3
  315. data/test/fixtures/jobs.yml +7 -7
  316. data/test/fixtures/legacy_things.yml +3 -3
  317. data/test/fixtures/live_parrots.yml +4 -4
  318. data/test/fixtures/mateys.yml +4 -4
  319. data/test/fixtures/member_details.yml +8 -8
  320. data/test/fixtures/member_types.yml +6 -6
  321. data/test/fixtures/members.yml +11 -11
  322. data/test/fixtures/memberships.yml +34 -34
  323. data/test/fixtures/men.yml +5 -5
  324. data/test/fixtures/minimalistics.yml +2 -2
  325. data/test/fixtures/minivans.yml +5 -5
  326. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  327. data/test/fixtures/mixins.yml +29 -29
  328. data/test/fixtures/movies.yml +7 -7
  329. data/test/fixtures/naked/yml/accounts.yml +1 -1
  330. data/test/fixtures/naked/yml/companies.yml +1 -1
  331. data/test/fixtures/naked/yml/courses.yml +1 -1
  332. data/test/fixtures/naked/yml/parrots.yml +2 -2
  333. data/test/fixtures/naked/yml/trees.yml +3 -3
  334. data/test/fixtures/nodes.yml +29 -29
  335. data/test/fixtures/organizations.yml +5 -5
  336. data/test/fixtures/other_comments.yml +6 -6
  337. data/test/fixtures/other_dogs.yml +2 -2
  338. data/test/fixtures/other_posts.yml +7 -7
  339. data/test/fixtures/other_topics.yml +42 -42
  340. data/test/fixtures/owners.yml +9 -9
  341. data/test/fixtures/parrots.yml +27 -27
  342. data/test/fixtures/parrots_pirates.yml +7 -7
  343. data/test/fixtures/people.yml +24 -24
  344. data/test/fixtures/peoples_treasures.yml +3 -3
  345. data/test/fixtures/pets.yml +19 -19
  346. data/test/fixtures/pirates.yml +12 -15
  347. data/test/fixtures/posts.yml +80 -80
  348. data/test/fixtures/price_estimates.yml +16 -16
  349. data/test/fixtures/products.yml +4 -4
  350. data/test/fixtures/projects.yml +7 -7
  351. data/test/fixtures/ratings.yml +14 -14
  352. data/test/fixtures/readers.yml +11 -11
  353. data/test/fixtures/references.yml +17 -17
  354. data/test/fixtures/reserved_words/distinct.yml +5 -5
  355. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  356. data/test/fixtures/reserved_words/group.yml +14 -14
  357. data/test/fixtures/reserved_words/select.yml +8 -8
  358. data/test/fixtures/reserved_words/values.yml +7 -7
  359. data/test/fixtures/ships.yml +6 -6
  360. data/test/fixtures/speedometers.yml +8 -8
  361. data/test/fixtures/sponsors.yml +12 -12
  362. data/test/fixtures/string_key_objects.yml +7 -7
  363. data/test/fixtures/subscribers.yml +10 -10
  364. data/test/fixtures/subscriptions.yml +12 -12
  365. data/test/fixtures/taggings.yml +78 -78
  366. data/test/fixtures/tags.yml +11 -11
  367. data/test/fixtures/tasks.yml +7 -7
  368. data/test/fixtures/teapots.yml +3 -3
  369. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  370. data/test/fixtures/to_be_linked/users.yml +10 -10
  371. data/test/fixtures/topics.yml +49 -49
  372. data/test/fixtures/toys.yml +14 -14
  373. data/test/fixtures/traffic_lights.yml +9 -9
  374. data/test/fixtures/treasures.yml +10 -10
  375. data/test/fixtures/trees.yml +3 -3
  376. data/test/fixtures/uuid_children.yml +3 -3
  377. data/test/fixtures/uuid_parents.yml +2 -2
  378. data/test/fixtures/variants.yml +4 -4
  379. data/test/fixtures/vegetables.yml +19 -19
  380. data/test/fixtures/vertices.yml +3 -3
  381. data/test/fixtures/warehouse_things.yml +2 -2
  382. data/test/fixtures/zines.yml +5 -5
  383. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  384. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  385. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  386. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -9
  387. data/test/migrations/missing/1_people_have_last_names.rb +9 -9
  388. data/test/migrations/missing/3_we_need_reminders.rb +12 -12
  389. data/test/migrations/missing/4_innocent_jointable.rb +12 -12
  390. data/test/migrations/rename/1_we_need_things.rb +11 -11
  391. data/test/migrations/rename/2_rename_things.rb +9 -9
  392. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  393. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  394. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  395. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  396. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  397. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  398. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  399. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  400. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  401. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  402. data/test/migrations/valid/2_we_need_reminders.rb +12 -12
  403. data/test/migrations/valid/3_innocent_jointable.rb +12 -12
  404. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  405. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -12
  406. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -12
  407. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  408. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  409. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  410. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  411. data/test/models/admin.rb +5 -5
  412. data/test/models/admin/account.rb +3 -3
  413. data/test/models/admin/user.rb +40 -40
  414. data/test/models/aircraft.rb +5 -5
  415. data/test/models/arunit2_model.rb +3 -3
  416. data/test/models/author.rb +209 -209
  417. data/test/models/auto_id.rb +4 -4
  418. data/test/models/autoloadable/extra_firm.rb +2 -2
  419. data/test/models/binary.rb +2 -2
  420. data/test/models/bird.rb +12 -12
  421. data/test/models/book.rb +23 -23
  422. data/test/models/boolean.rb +2 -2
  423. data/test/models/bulb.rb +52 -52
  424. data/test/models/cake_designer.rb +3 -3
  425. data/test/models/car.rb +29 -29
  426. data/test/models/carrier.rb +2 -2
  427. data/test/models/cat.rb +10 -10
  428. data/test/models/categorization.rb +19 -19
  429. data/test/models/category.rb +35 -35
  430. data/test/models/chef.rb +8 -8
  431. data/test/models/citation.rb +3 -3
  432. data/test/models/club.rb +25 -25
  433. data/test/models/college.rb +10 -10
  434. data/test/models/column.rb +3 -3
  435. data/test/models/column_name.rb +3 -3
  436. data/test/models/comment.rb +76 -76
  437. data/test/models/company.rb +230 -230
  438. data/test/models/company_in_module.rb +98 -98
  439. data/test/models/computer.rb +3 -3
  440. data/test/models/contact.rb +41 -41
  441. data/test/models/content.rb +40 -40
  442. data/test/models/contract.rb +20 -20
  443. data/test/models/country.rb +7 -7
  444. data/test/models/course.rb +6 -6
  445. data/test/models/customer.rb +83 -83
  446. data/test/models/customer_carrier.rb +14 -14
  447. data/test/models/dashboard.rb +3 -3
  448. data/test/models/default.rb +2 -2
  449. data/test/models/department.rb +4 -4
  450. data/test/models/developer.rb +274 -274
  451. data/test/models/dog.rb +5 -5
  452. data/test/models/dog_lover.rb +5 -5
  453. data/test/models/doubloon.rb +12 -12
  454. data/test/models/drink_designer.rb +3 -3
  455. data/test/models/edge.rb +5 -5
  456. data/test/models/electron.rb +5 -5
  457. data/test/models/engine.rb +4 -4
  458. data/test/models/entrant.rb +3 -3
  459. data/test/models/essay.rb +5 -5
  460. data/test/models/event.rb +3 -3
  461. data/test/models/eye.rb +37 -37
  462. data/test/models/face.rb +9 -9
  463. data/test/models/friendship.rb +6 -6
  464. data/test/models/guid.rb +2 -2
  465. data/test/models/guitar.rb +4 -4
  466. data/test/models/hotel.rb +11 -11
  467. data/test/models/image.rb +3 -3
  468. data/test/models/interest.rb +5 -5
  469. data/test/models/invoice.rb +4 -4
  470. data/test/models/item.rb +7 -7
  471. data/test/models/job.rb +7 -7
  472. data/test/models/joke.rb +7 -7
  473. data/test/models/keyboard.rb +3 -3
  474. data/test/models/legacy_thing.rb +3 -3
  475. data/test/models/lesson.rb +11 -11
  476. data/test/models/line_item.rb +3 -3
  477. data/test/models/liquid.rb +4 -4
  478. data/test/models/man.rb +11 -11
  479. data/test/models/matey.rb +4 -4
  480. data/test/models/member.rb +42 -42
  481. data/test/models/member_detail.rb +8 -8
  482. data/test/models/member_type.rb +3 -3
  483. data/test/models/membership.rb +35 -35
  484. data/test/models/mentor.rb +2 -2
  485. data/test/models/minimalistic.rb +2 -2
  486. data/test/models/minivan.rb +9 -9
  487. data/test/models/mixed_case_monkey.rb +3 -3
  488. data/test/models/mocktail_designer.rb +2 -2
  489. data/test/models/molecule.rb +6 -6
  490. data/test/models/movie.rb +5 -5
  491. data/test/models/node.rb +5 -5
  492. data/test/models/non_primary_key.rb +2 -2
  493. data/test/models/notification.rb +3 -3
  494. data/test/models/order.rb +4 -4
  495. data/test/models/organization.rb +14 -14
  496. data/test/models/other_dog.rb +5 -5
  497. data/test/models/owner.rb +37 -37
  498. data/test/models/parrot.rb +28 -28
  499. data/test/models/person.rb +142 -142
  500. data/test/models/personal_legacy_thing.rb +4 -4
  501. data/test/models/pet.rb +18 -18
  502. data/test/models/pet_treasure.rb +6 -6
  503. data/test/models/pirate.rb +92 -92
  504. data/test/models/possession.rb +3 -3
  505. data/test/models/post.rb +273 -273
  506. data/test/models/price_estimate.rb +4 -4
  507. data/test/models/professor.rb +5 -5
  508. data/test/models/project.rb +40 -40
  509. data/test/models/publisher.rb +2 -2
  510. data/test/models/publisher/article.rb +4 -4
  511. data/test/models/publisher/magazine.rb +3 -3
  512. data/test/models/rating.rb +4 -4
  513. data/test/models/reader.rb +23 -23
  514. data/test/models/recipe.rb +3 -3
  515. data/test/models/record.rb +2 -2
  516. data/test/models/reference.rb +22 -22
  517. data/test/models/reply.rb +61 -61
  518. data/test/models/ship.rb +39 -39
  519. data/test/models/ship_part.rb +8 -8
  520. data/test/models/shop.rb +17 -17
  521. data/test/models/shop_account.rb +6 -6
  522. data/test/models/speedometer.rb +6 -6
  523. data/test/models/sponsor.rb +7 -7
  524. data/test/models/string_key_object.rb +3 -3
  525. data/test/models/student.rb +4 -4
  526. data/test/models/subject.rb +16 -16
  527. data/test/models/subscriber.rb +8 -8
  528. data/test/models/subscription.rb +4 -4
  529. data/test/models/tag.rb +13 -13
  530. data/test/models/tagging.rb +13 -13
  531. data/test/models/task.rb +5 -5
  532. data/test/models/topic.rb +118 -118
  533. data/test/models/toy.rb +6 -6
  534. data/test/models/traffic_light.rb +4 -4
  535. data/test/models/treasure.rb +14 -14
  536. data/test/models/treaty.rb +7 -7
  537. data/test/models/tree.rb +3 -3
  538. data/test/models/tuning_peg.rb +4 -4
  539. data/test/models/tyre.rb +11 -11
  540. data/test/models/user.rb +14 -14
  541. data/test/models/uuid_child.rb +3 -3
  542. data/test/models/uuid_item.rb +6 -6
  543. data/test/models/uuid_parent.rb +3 -3
  544. data/test/models/vegetables.rb +24 -24
  545. data/test/models/vehicle.rb +6 -6
  546. data/test/models/vertex.rb +9 -9
  547. data/test/models/warehouse_thing.rb +5 -5
  548. data/test/models/wheel.rb +3 -3
  549. data/test/models/without_table.rb +3 -3
  550. data/test/models/zine.rb +3 -3
  551. data/test/schema/i5/ibm_db_specific_schema.rb +137 -0
  552. data/test/schema/ids/ibm_db_specific_schema.rb +140 -0
  553. data/test/schema/luw/ibm_db_specific_schema.rb +137 -0
  554. data/test/schema/mysql2_specific_schema.rb +68 -68
  555. data/test/schema/oracle_specific_schema.rb +40 -40
  556. data/test/schema/postgresql_specific_schema.rb +114 -114
  557. data/test/schema/schema.rb +1057 -1057
  558. data/test/schema/schema.rb.original +1057 -1057
  559. data/test/schema/sqlite_specific_schema.rb +18 -18
  560. data/test/schema/zOS/ibm_db_specific_schema.rb +208 -0
  561. data/test/support/config.rb +43 -43
  562. data/test/support/connection.rb +23 -23
  563. data/test/support/connection_helper.rb +14 -14
  564. data/test/support/ddl_helper.rb +8 -8
  565. data/test/support/schema_dumping_helper.rb +20 -20
  566. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -22
  567. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -182
  568. metadata +24 -13
  569. data/test/fixtures/author_addresses.original +0 -11
  570. data/test/fixtures/authors.original +0 -17
@@ -1,22 +1,22 @@
1
- require "cases/helper"
2
- require "models/developer"
3
-
4
- class PreparedStatementsTest < ActiveRecord::PostgreSQLTestCase
5
- fixtures :developers
6
-
7
- def setup
8
- @default_prepared_statements = Developer.connection_config[:prepared_statements]
9
- Developer.connection_config[:prepared_statements] = false
10
- end
11
-
12
- def teardown
13
- Developer.connection_config[:prepared_statements] = @default_prepared_statements
14
- end
15
-
16
- def nothing_raised_with_falsy_prepared_statements
17
- assert_nothing_raised do
18
- Developer.where(id: 1)
19
- end
20
- end
21
-
22
- end
1
+ require "cases/helper"
2
+ require "models/developer"
3
+
4
+ class PreparedStatementsTest < ActiveRecord::PostgreSQLTestCase
5
+ fixtures :developers
6
+
7
+ def setup
8
+ @default_prepared_statements = Developer.connection_config[:prepared_statements]
9
+ Developer.connection_config[:prepared_statements] = false
10
+ end
11
+
12
+ def teardown
13
+ Developer.connection_config[:prepared_statements] = @default_prepared_statements
14
+ end
15
+
16
+ def nothing_raised_with_falsy_prepared_statements
17
+ assert_nothing_raised do
18
+ Developer.where(id: 1)
19
+ end
20
+ end
21
+
22
+ end
@@ -1,44 +1,44 @@
1
- require "cases/helper"
2
- require 'ipaddr'
3
-
4
- module ActiveRecord
5
- module ConnectionAdapters
6
- class PostgreSQLAdapter
7
- class QuotingTest < ActiveRecord::PostgreSQLTestCase
8
- def setup
9
- @conn = ActiveRecord::Base.connection
10
- end
11
-
12
- def test_type_cast_true
13
- assert_equal 't', @conn.type_cast(true)
14
- end
15
-
16
- def test_type_cast_false
17
- assert_equal 'f', @conn.type_cast(false)
18
- end
19
-
20
- def test_quote_float_nan
21
- nan = 0.0/0
22
- assert_equal "'NaN'", @conn.quote(nan)
23
- end
24
-
25
- def test_quote_float_infinity
26
- infinity = 1.0/0
27
- assert_equal "'Infinity'", @conn.quote(infinity)
28
- end
29
-
30
- def test_quote_range
31
- range = "1,2]'; SELECT * FROM users; --".."a"
32
- type = OID::Range.new(Type::Integer.new, :int8range)
33
- assert_equal "'[1,0]'", @conn.quote(type.serialize(range))
34
- end
35
-
36
- def test_quote_bit_string
37
- value = "'); SELECT * FROM users; /*\n01\n*/--"
38
- type = OID::Bit.new
39
- assert_equal nil, @conn.quote(type.serialize(value))
40
- end
41
- end
42
- end
43
- end
44
- end
1
+ require "cases/helper"
2
+ require 'ipaddr'
3
+
4
+ module ActiveRecord
5
+ module ConnectionAdapters
6
+ class PostgreSQLAdapter
7
+ class QuotingTest < ActiveRecord::PostgreSQLTestCase
8
+ def setup
9
+ @conn = ActiveRecord::Base.connection
10
+ end
11
+
12
+ def test_type_cast_true
13
+ assert_equal 't', @conn.type_cast(true)
14
+ end
15
+
16
+ def test_type_cast_false
17
+ assert_equal 'f', @conn.type_cast(false)
18
+ end
19
+
20
+ def test_quote_float_nan
21
+ nan = 0.0/0
22
+ assert_equal "'NaN'", @conn.quote(nan)
23
+ end
24
+
25
+ def test_quote_float_infinity
26
+ infinity = 1.0/0
27
+ assert_equal "'Infinity'", @conn.quote(infinity)
28
+ end
29
+
30
+ def test_quote_range
31
+ range = "1,2]'; SELECT * FROM users; --".."a"
32
+ type = OID::Range.new(Type::Integer.new, :int8range)
33
+ assert_equal "'[1,0]'", @conn.quote(type.serialize(range))
34
+ end
35
+
36
+ def test_quote_bit_string
37
+ value = "'); SELECT * FROM users; /*\n01\n*/--"
38
+ type = OID::Bit.new
39
+ assert_equal nil, @conn.quote(type.serialize(value))
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -1,343 +1,343 @@
1
- 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"
40
- end
41
-
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)
93
- end
94
-
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
100
-
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
109
-
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
117
-
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
125
-
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
133
-
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
141
-
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
149
-
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
156
-
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
164
-
165
- def test_timezone_awareness_tzrange
166
- tz = "Pacific Time (US & Canada)"
167
-
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)
172
-
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
-
177
- record.save!
178
- record.reload
179
-
180
- assert_equal time..time, record.tstz_range
181
- assert_equal ActiveSupport::TimeZone[tz], record.tstz_range.begin.time_zone
182
- end
183
- end
184
-
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
191
-
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
198
-
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
204
-
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
212
-
213
- def test_timezone_awareness_tsrange
214
- tz = "Pacific Time (US & Canada)"
215
-
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)
220
-
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
224
-
225
- record.save!
226
- record.reload
227
-
228
- assert_equal time..time, record.ts_range
229
- assert_equal ActiveSupport::TimeZone[tz], record.ts_range.begin.time_zone
230
- end
231
- end
232
-
233
- def test_create_numrange
234
- assert_equal_round_trip(@new_range, :num_range,
235
- BigDecimal.new('0.5')...BigDecimal.new('1'))
236
- end
237
-
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'))
243
- end
244
-
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
249
-
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
256
-
257
- def test_create_int4range
258
- assert_equal_round_trip(@new_range, :int4_range, Range.new(3, 50, true))
259
- end
260
-
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
265
-
266
- def test_create_int8range
267
- assert_equal_round_trip(@new_range, :int8_range, Range.new(30, 50, true))
268
- end
269
-
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
274
-
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'']") }
283
- end
284
-
285
- def test_update_all_with_ranges
286
- PostgresqlRange.create!
287
-
288
- PostgresqlRange.update_all(int8_range: 1..100)
289
-
290
- assert_equal 1...101, PostgresqlRange.first.int8_range
291
- end
292
-
293
- def test_ranges_correctly_escape_input
294
- range = "-1,2]'; DROP TABLE postgresql_ranges; --".."a"
295
- PostgresqlRange.update_all(int8_range: range)
296
-
297
- assert_nothing_raised do
298
- PostgresqlRange.first
299
- end
300
- end
301
-
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
307
-
308
- def assert_nil_round_trip(range, attribute, value)
309
- round_trip(range, attribute, value)
310
- assert_nil range.public_send(attribute)
311
- end
312
-
313
- def round_trip(range, attribute, value)
314
- range.public_send "#{attribute}=", value
315
- assert range.save
316
- assert range.reload
317
- end
318
-
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
342
- end
343
- end
1
+ 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"
40
+ end
41
+
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)
93
+ end
94
+
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
100
+
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
109
+
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
117
+
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
125
+
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
133
+
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
141
+
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
149
+
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
156
+
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
164
+
165
+ def test_timezone_awareness_tzrange
166
+ tz = "Pacific Time (US & Canada)"
167
+
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)
172
+
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
+
177
+ record.save!
178
+ record.reload
179
+
180
+ assert_equal time..time, record.tstz_range
181
+ assert_equal ActiveSupport::TimeZone[tz], record.tstz_range.begin.time_zone
182
+ end
183
+ end
184
+
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
191
+
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
198
+
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
204
+
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
212
+
213
+ def test_timezone_awareness_tsrange
214
+ tz = "Pacific Time (US & Canada)"
215
+
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)
220
+
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
224
+
225
+ record.save!
226
+ record.reload
227
+
228
+ assert_equal time..time, record.ts_range
229
+ assert_equal ActiveSupport::TimeZone[tz], record.ts_range.begin.time_zone
230
+ end
231
+ end
232
+
233
+ def test_create_numrange
234
+ assert_equal_round_trip(@new_range, :num_range,
235
+ BigDecimal.new('0.5')...BigDecimal.new('1'))
236
+ end
237
+
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'))
243
+ end
244
+
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
249
+
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
256
+
257
+ def test_create_int4range
258
+ assert_equal_round_trip(@new_range, :int4_range, Range.new(3, 50, true))
259
+ end
260
+
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
265
+
266
+ def test_create_int8range
267
+ assert_equal_round_trip(@new_range, :int8_range, Range.new(30, 50, true))
268
+ end
269
+
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
274
+
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'']") }
283
+ end
284
+
285
+ def test_update_all_with_ranges
286
+ PostgresqlRange.create!
287
+
288
+ PostgresqlRange.update_all(int8_range: 1..100)
289
+
290
+ assert_equal 1...101, PostgresqlRange.first.int8_range
291
+ end
292
+
293
+ def test_ranges_correctly_escape_input
294
+ range = "-1,2]'; DROP TABLE postgresql_ranges; --".."a"
295
+ PostgresqlRange.update_all(int8_range: range)
296
+
297
+ assert_nothing_raised do
298
+ PostgresqlRange.first
299
+ end
300
+ end
301
+
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
307
+
308
+ def assert_nil_round_trip(range, attribute, value)
309
+ round_trip(range, attribute, value)
310
+ assert_nil range.public_send(attribute)
311
+ end
312
+
313
+ def round_trip(range, attribute, value)
314
+ range.public_send "#{attribute}=", value
315
+ assert range.save
316
+ assert range.reload
317
+ end
318
+
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
342
+ end
343
+ end