ibm_db 3.0.5-x86-mingw32 → 4.0.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 (586) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -0
  3. data/LICENSE +1 -1
  4. data/MANIFEST +14 -14
  5. data/ParameterizedQueries README +6 -6
  6. data/README +208 -225
  7. data/ext/Makefile.nt32 +181 -181
  8. data/ext/Makefile.nt32.191 +212 -212
  9. data/ext/extconf.rb +291 -291
  10. data/ext/ibm_db.c +11887 -11887
  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/init.rb +41 -41
  15. data/lib/IBM_DB.rb +27 -27
  16. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3452 -3177
  17. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -2
  18. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  19. data/lib/mswin32/ibm_db.rb +91 -123
  20. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  21. data/test/active_record/connection_adapters/fake_adapter.rb +49 -46
  22. data/test/assets/example.log +1 -1
  23. data/test/assets/test.txt +1 -1
  24. data/test/cases/adapter_test.rb +351 -276
  25. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
  26. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
  27. data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
  28. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
  29. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
  30. data/test/cases/adapters/mysql2/connection_test.rb +210 -0
  31. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
  32. data/test/cases/adapters/mysql2/enum_test.rb +26 -0
  33. data/test/cases/adapters/mysql2/explain_test.rb +21 -0
  34. data/test/cases/adapters/mysql2/json_test.rb +195 -0
  35. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
  36. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  37. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
  38. data/test/cases/adapters/mysql2/schema_test.rb +126 -0
  39. data/test/cases/adapters/mysql2/sp_test.rb +36 -0
  40. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
  41. data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
  42. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
  43. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
  44. data/test/cases/adapters/postgresql/array_test.rb +339 -0
  45. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
  46. data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
  47. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
  48. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
  49. data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
  50. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  51. data/test/cases/adapters/postgresql/collation_test.rb +53 -0
  52. data/test/cases/adapters/postgresql/composite_test.rb +132 -0
  53. data/test/cases/adapters/postgresql/connection_test.rb +257 -0
  54. data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
  55. data/test/cases/adapters/postgresql/domain_test.rb +47 -0
  56. data/test/cases/adapters/postgresql/enum_test.rb +91 -0
  57. data/test/cases/adapters/postgresql/explain_test.rb +20 -0
  58. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
  59. data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
  60. data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
  61. data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
  62. data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
  63. data/test/cases/adapters/postgresql/integer_test.rb +25 -0
  64. data/test/cases/adapters/postgresql/json_test.rb +237 -0
  65. data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
  66. data/test/cases/adapters/postgresql/money_test.rb +96 -0
  67. data/test/cases/adapters/postgresql/network_test.rb +94 -0
  68. data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
  69. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
  70. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  71. data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
  72. data/test/cases/adapters/postgresql/range_test.rb +343 -0
  73. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
  74. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
  75. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
  76. data/test/cases/adapters/postgresql/schema_test.rb +597 -0
  77. data/test/cases/adapters/postgresql/serial_test.rb +154 -0
  78. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
  79. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
  80. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
  81. data/test/cases/adapters/postgresql/utils_test.rb +62 -0
  82. data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
  83. data/test/cases/adapters/postgresql/xml_test.rb +54 -0
  84. data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
  85. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
  86. data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
  87. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
  88. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
  89. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  90. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
  91. data/test/cases/aggregations_test.rb +168 -158
  92. data/test/cases/ar_schema_test.rb +146 -161
  93. data/test/cases/associations/association_scope_test.rb +16 -21
  94. data/test/cases/associations/belongs_to_associations_test.rb +1141 -1029
  95. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
  96. data/test/cases/associations/callbacks_test.rb +190 -192
  97. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  98. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  99. data/test/cases/associations/eager_load_nested_include_test.rb +126 -128
  100. data/test/cases/associations/eager_singularization_test.rb +148 -148
  101. data/test/cases/associations/eager_test.rb +1514 -1429
  102. data/test/cases/associations/extension_test.rb +87 -82
  103. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -972
  104. data/test/cases/associations/has_many_associations_test.rb +2501 -2182
  105. data/test/cases/associations/has_many_through_associations_test.rb +1271 -1204
  106. data/test/cases/associations/has_one_associations_test.rb +707 -610
  107. data/test/cases/associations/has_one_through_associations_test.rb +383 -380
  108. data/test/cases/associations/inner_join_association_test.rb +139 -139
  109. data/test/cases/associations/inverse_associations_test.rb +733 -706
  110. data/test/cases/associations/join_model_test.rb +777 -754
  111. data/test/cases/associations/left_outer_join_association_test.rb +88 -0
  112. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  113. data/test/cases/associations/required_test.rb +102 -82
  114. data/test/cases/associations_test.rb +385 -380
  115. data/test/cases/attribute_decorators_test.rb +125 -125
  116. data/test/cases/attribute_methods/read_test.rb +60 -60
  117. data/test/cases/attribute_methods_test.rb +1009 -952
  118. data/test/cases/attribute_set_test.rb +270 -210
  119. data/test/cases/attribute_test.rb +246 -180
  120. data/test/cases/attributes_test.rb +253 -136
  121. data/test/cases/autosave_association_test.rb +1708 -1595
  122. data/test/cases/base_test.rb +1713 -1664
  123. data/test/cases/batches_test.rb +489 -212
  124. data/test/cases/binary_test.rb +44 -52
  125. data/test/cases/bind_parameter_test.rb +110 -100
  126. data/test/cases/cache_key_test.rb +25 -0
  127. data/test/cases/calculations_test.rb +798 -646
  128. data/test/cases/callbacks_test.rb +636 -543
  129. data/test/cases/clone_test.rb +40 -40
  130. data/test/cases/coders/json_test.rb +15 -0
  131. data/test/cases/coders/yaml_column_test.rb +63 -63
  132. data/test/cases/collection_cache_key_test.rb +115 -0
  133. data/test/cases/column_alias_test.rb +17 -17
  134. data/test/cases/column_definition_test.rb +92 -123
  135. data/test/cases/comment_test.rb +143 -0
  136. data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -54
  137. data/test/cases/connection_adapters/connection_handler_test.rb +160 -53
  138. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  139. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -293
  140. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -65
  141. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  142. data/test/cases/connection_adapters/schema_cache_test.rb +61 -56
  143. data/test/cases/connection_adapters/type_lookup_test.rb +118 -110
  144. data/test/cases/connection_management_test.rb +112 -122
  145. data/test/cases/connection_pool_test.rb +521 -346
  146. data/test/cases/connection_specification/resolver_test.rb +131 -116
  147. data/test/cases/core_test.rb +112 -112
  148. data/test/cases/counter_cache_test.rb +214 -209
  149. data/test/cases/custom_locking_test.rb +17 -17
  150. data/test/cases/database_statements_test.rb +34 -19
  151. data/test/cases/{invalid_date_test.rb → date_test.rb} +44 -32
  152. data/test/cases/date_time_precision_test.rb +106 -0
  153. data/test/cases/date_time_test.rb +61 -61
  154. data/test/cases/defaults_test.rb +218 -223
  155. data/test/cases/dirty_test.rb +763 -785
  156. data/test/cases/disconnected_test.rb +30 -28
  157. data/test/cases/dup_test.rb +157 -157
  158. data/test/cases/enum_test.rb +444 -290
  159. data/test/cases/errors_test.rb +16 -0
  160. data/test/cases/explain_subscriber_test.rb +64 -64
  161. data/test/cases/explain_test.rb +87 -76
  162. data/test/cases/finder_respond_to_test.rb +60 -60
  163. data/test/cases/finder_test.rb +1294 -1169
  164. data/test/cases/fixture_set/file_test.rb +156 -138
  165. data/test/cases/fixtures_test.rb +988 -908
  166. data/test/cases/forbidden_attributes_protection_test.rb +165 -99
  167. data/test/cases/habtm_destroy_order_test.rb +61 -61
  168. data/test/cases/helper.rb +204 -210
  169. data/test/cases/hot_compatibility_test.rb +142 -54
  170. data/test/cases/i18n_test.rb +45 -45
  171. data/test/cases/inheritance_test.rb +606 -375
  172. data/test/cases/integration_test.rb +155 -139
  173. data/test/cases/invalid_connection_test.rb +24 -22
  174. data/test/cases/invertible_migration_test.rb +387 -295
  175. data/test/cases/json_serialization_test.rb +311 -302
  176. data/test/cases/locking_test.rb +493 -477
  177. data/test/cases/log_subscriber_test.rb +225 -136
  178. data/test/cases/migration/change_schema_test.rb +458 -512
  179. data/test/cases/migration/change_table_test.rb +256 -224
  180. data/test/cases/migration/column_attributes_test.rb +176 -192
  181. data/test/cases/migration/column_positioning_test.rb +56 -56
  182. data/test/cases/migration/columns_test.rb +310 -304
  183. data/test/cases/migration/command_recorder_test.rb +350 -305
  184. data/test/cases/migration/compatibility_test.rb +118 -0
  185. data/test/cases/migration/create_join_table_test.rb +157 -148
  186. data/test/cases/migration/foreign_key_test.rb +360 -328
  187. data/test/cases/migration/helper.rb +39 -39
  188. data/test/cases/migration/index_test.rb +218 -216
  189. data/test/cases/migration/logger_test.rb +36 -36
  190. data/test/cases/migration/pending_migrations_test.rb +52 -53
  191. data/test/cases/migration/references_foreign_key_test.rb +216 -169
  192. data/test/cases/migration/references_index_test.rb +101 -101
  193. data/test/cases/migration/references_statements_test.rb +136 -116
  194. data/test/cases/migration/rename_table_test.rb +93 -93
  195. data/test/cases/migration_test.rb +1157 -959
  196. data/test/cases/migrator_test.rb +470 -388
  197. data/test/cases/mixin_test.rb +68 -70
  198. data/test/cases/modules_test.rb +172 -173
  199. data/test/cases/multiparameter_attributes_test.rb +372 -350
  200. data/test/cases/multiple_db_test.rb +122 -115
  201. data/test/cases/nested_attributes_test.rb +1098 -1070
  202. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  203. data/test/cases/persistence_test.rb +1001 -909
  204. data/test/cases/pooled_connections_test.rb +81 -81
  205. data/test/cases/primary_keys_test.rb +376 -237
  206. data/test/cases/query_cache_test.rb +446 -326
  207. data/test/cases/quoting_test.rb +202 -156
  208. data/test/cases/readonly_test.rb +119 -118
  209. data/test/cases/reaper_test.rb +85 -85
  210. data/test/cases/reflection_test.rb +509 -463
  211. data/test/cases/relation/delegation_test.rb +63 -68
  212. data/test/cases/relation/merging_test.rb +157 -161
  213. data/test/cases/relation/mutation_test.rb +183 -165
  214. data/test/cases/relation/or_test.rb +92 -0
  215. data/test/cases/relation/predicate_builder_test.rb +16 -14
  216. data/test/cases/relation/record_fetch_warning_test.rb +40 -0
  217. data/test/cases/relation/where_chain_test.rb +105 -181
  218. data/test/cases/relation/where_clause_test.rb +182 -0
  219. data/test/cases/relation/where_test.rb +322 -300
  220. data/test/cases/relation_test.rb +328 -319
  221. data/test/cases/relations_test.rb +2026 -1815
  222. data/test/cases/reload_models_test.rb +22 -22
  223. data/test/cases/result_test.rb +90 -80
  224. data/test/cases/sanitize_test.rb +176 -83
  225. data/test/cases/schema_dumper_test.rb +457 -463
  226. data/test/cases/schema_loading_test.rb +52 -0
  227. data/test/cases/scoping/default_scoping_test.rb +528 -454
  228. data/test/cases/scoping/named_scoping_test.rb +561 -524
  229. data/test/cases/scoping/relation_scoping_test.rb +400 -357
  230. data/test/cases/secure_token_test.rb +32 -0
  231. data/test/cases/serialization_test.rb +104 -104
  232. data/test/cases/serialized_attribute_test.rb +364 -277
  233. data/test/cases/statement_cache_test.rb +136 -98
  234. data/test/cases/store_test.rb +195 -194
  235. data/test/cases/suppressor_test.rb +63 -0
  236. data/test/cases/tasks/database_tasks_test.rb +462 -398
  237. data/test/cases/tasks/mysql_rake_test.rb +345 -324
  238. data/test/cases/tasks/postgresql_rake_test.rb +304 -250
  239. data/test/cases/tasks/sqlite_rake_test.rb +220 -193
  240. data/test/cases/test_case.rb +131 -123
  241. data/test/cases/test_fixtures_test.rb +36 -0
  242. data/test/cases/time_precision_test.rb +102 -0
  243. data/test/cases/timestamp_test.rb +501 -467
  244. data/test/cases/touch_later_test.rb +121 -0
  245. data/test/cases/transaction_callbacks_test.rb +518 -452
  246. data/test/cases/transaction_isolation_test.rb +106 -106
  247. data/test/cases/transactions_test.rb +834 -817
  248. data/test/cases/type/adapter_specific_registry_test.rb +133 -0
  249. data/test/cases/type/date_time_test.rb +14 -0
  250. data/test/cases/type/integer_test.rb +27 -121
  251. data/test/cases/type/string_test.rb +22 -36
  252. data/test/cases/type/type_map_test.rb +177 -177
  253. data/test/cases/type_test.rb +39 -0
  254. data/test/cases/types_test.rb +24 -141
  255. data/test/cases/unconnected_test.rb +33 -33
  256. data/test/cases/validations/absence_validation_test.rb +73 -0
  257. data/test/cases/validations/association_validation_test.rb +97 -86
  258. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  259. data/test/cases/validations/i18n_validation_test.rb +86 -90
  260. data/test/cases/validations/length_validation_test.rb +79 -47
  261. data/test/cases/validations/presence_validation_test.rb +103 -68
  262. data/test/cases/validations/uniqueness_validation_test.rb +548 -457
  263. data/test/cases/validations_repair_helper.rb +19 -23
  264. data/test/cases/validations_test.rb +194 -165
  265. data/test/cases/view_test.rb +216 -119
  266. data/test/cases/yaml_serialization_test.rb +121 -126
  267. data/test/config.example.yml +97 -0
  268. data/test/config.rb +5 -5
  269. data/test/fixtures/accounts.yml +29 -29
  270. data/test/fixtures/admin/accounts.yml +2 -2
  271. data/test/fixtures/admin/users.yml +10 -10
  272. data/test/fixtures/author_addresses.original +11 -0
  273. data/test/fixtures/author_addresses.yml +17 -17
  274. data/test/fixtures/author_favorites.yml +3 -3
  275. data/test/fixtures/authors.original +17 -0
  276. data/test/fixtures/authors.yml +23 -23
  277. data/test/fixtures/bad_posts.yml +9 -0
  278. data/test/fixtures/binaries.yml +133 -133
  279. data/test/fixtures/books.yml +31 -11
  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 -0
  295. data/test/fixtures/content_positions.yml +3 -0
  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 -0
  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 -0
  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 -0
  333. data/test/fixtures/naked/yml/trees.yml +3 -0
  334. data/test/fixtures/nodes.yml +29 -0
  335. data/test/fixtures/organizations.yml +5 -5
  336. data/test/fixtures/other_comments.yml +6 -0
  337. data/test/fixtures/other_dogs.yml +2 -0
  338. data/test/fixtures/other_posts.yml +7 -0
  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 +15 -12
  347. data/test/fixtures/posts.yml +80 -80
  348. data/test/fixtures/price_estimates.yml +16 -7
  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 -0
  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/randomly_named_c1.rb +6 -2
  414. data/test/models/admin/user.rb +40 -40
  415. data/test/models/aircraft.rb +5 -4
  416. data/test/models/arunit2_model.rb +3 -3
  417. data/test/models/author.rb +209 -212
  418. data/test/models/auto_id.rb +4 -4
  419. data/test/models/autoloadable/extra_firm.rb +2 -2
  420. data/test/models/binary.rb +2 -2
  421. data/test/models/bird.rb +12 -12
  422. data/test/models/book.rb +23 -18
  423. data/test/models/boolean.rb +2 -2
  424. data/test/models/bulb.rb +52 -51
  425. data/test/models/cake_designer.rb +3 -3
  426. data/test/models/car.rb +29 -26
  427. data/test/models/carrier.rb +2 -2
  428. data/test/models/cat.rb +10 -0
  429. data/test/models/categorization.rb +19 -19
  430. data/test/models/category.rb +35 -35
  431. data/test/models/chef.rb +8 -7
  432. data/test/models/citation.rb +3 -3
  433. data/test/models/club.rb +25 -23
  434. data/test/models/college.rb +10 -10
  435. data/test/models/column.rb +3 -3
  436. data/test/models/column_name.rb +3 -3
  437. data/test/models/comment.rb +76 -64
  438. data/test/models/company.rb +230 -228
  439. data/test/models/company_in_module.rb +98 -98
  440. data/test/models/computer.rb +3 -3
  441. data/test/models/contact.rb +41 -41
  442. data/test/models/content.rb +40 -0
  443. data/test/models/contract.rb +20 -20
  444. data/test/models/country.rb +7 -7
  445. data/test/models/course.rb +6 -6
  446. data/test/models/customer.rb +83 -77
  447. data/test/models/customer_carrier.rb +14 -14
  448. data/test/models/dashboard.rb +3 -3
  449. data/test/models/default.rb +2 -2
  450. data/test/models/department.rb +4 -4
  451. data/test/models/developer.rb +274 -255
  452. data/test/models/dog.rb +5 -5
  453. data/test/models/dog_lover.rb +5 -5
  454. data/test/models/doubloon.rb +12 -12
  455. data/test/models/drink_designer.rb +3 -3
  456. data/test/models/edge.rb +5 -5
  457. data/test/models/electron.rb +5 -5
  458. data/test/models/engine.rb +4 -4
  459. data/test/models/entrant.rb +3 -3
  460. data/test/models/essay.rb +5 -5
  461. data/test/models/event.rb +3 -3
  462. data/test/models/eye.rb +37 -37
  463. data/test/models/face.rb +9 -9
  464. data/test/models/friendship.rb +6 -6
  465. data/test/models/guid.rb +2 -2
  466. data/test/models/guitar.rb +4 -0
  467. data/test/models/hotel.rb +11 -9
  468. data/test/models/image.rb +3 -3
  469. data/test/models/interest.rb +5 -5
  470. data/test/models/invoice.rb +4 -4
  471. data/test/models/item.rb +7 -7
  472. data/test/models/job.rb +7 -7
  473. data/test/models/joke.rb +7 -7
  474. data/test/models/keyboard.rb +3 -3
  475. data/test/models/legacy_thing.rb +3 -3
  476. data/test/models/lesson.rb +11 -11
  477. data/test/models/line_item.rb +3 -3
  478. data/test/models/liquid.rb +4 -4
  479. data/test/models/man.rb +11 -11
  480. data/test/models/matey.rb +4 -4
  481. data/test/models/member.rb +42 -41
  482. data/test/models/member_detail.rb +8 -7
  483. data/test/models/member_type.rb +3 -3
  484. data/test/models/membership.rb +35 -35
  485. data/test/models/mentor.rb +3 -0
  486. data/test/models/minimalistic.rb +2 -2
  487. data/test/models/minivan.rb +9 -9
  488. data/test/models/mixed_case_monkey.rb +3 -3
  489. data/test/models/mocktail_designer.rb +2 -0
  490. data/test/models/molecule.rb +6 -6
  491. data/test/models/movie.rb +5 -5
  492. data/test/models/node.rb +5 -0
  493. data/test/models/non_primary_key.rb +2 -0
  494. data/test/models/notification.rb +3 -0
  495. data/test/models/order.rb +4 -4
  496. data/test/models/organization.rb +14 -14
  497. data/test/models/other_dog.rb +5 -0
  498. data/test/models/owner.rb +37 -34
  499. data/test/models/parrot.rb +28 -29
  500. data/test/models/person.rb +142 -143
  501. data/test/models/personal_legacy_thing.rb +4 -4
  502. data/test/models/pet.rb +18 -15
  503. data/test/models/pet_treasure.rb +6 -0
  504. data/test/models/pirate.rb +92 -92
  505. data/test/models/possession.rb +3 -3
  506. data/test/models/post.rb +273 -264
  507. data/test/models/price_estimate.rb +4 -4
  508. data/test/models/professor.rb +5 -5
  509. data/test/models/project.rb +40 -31
  510. data/test/models/publisher.rb +2 -2
  511. data/test/models/publisher/article.rb +4 -4
  512. data/test/models/publisher/magazine.rb +3 -3
  513. data/test/models/randomly_named_c1.rb +1 -1
  514. data/test/models/rating.rb +4 -4
  515. data/test/models/reader.rb +23 -23
  516. data/test/models/recipe.rb +3 -0
  517. data/test/models/record.rb +2 -2
  518. data/test/models/reference.rb +22 -22
  519. data/test/models/reply.rb +61 -61
  520. data/test/models/ship.rb +39 -33
  521. data/test/models/ship_part.rb +8 -8
  522. data/test/models/shop.rb +17 -17
  523. data/test/models/shop_account.rb +6 -6
  524. data/test/models/speedometer.rb +6 -6
  525. data/test/models/sponsor.rb +7 -7
  526. data/test/models/string_key_object.rb +3 -3
  527. data/test/models/student.rb +4 -4
  528. data/test/models/subject.rb +16 -16
  529. data/test/models/subscriber.rb +8 -8
  530. data/test/models/subscription.rb +4 -4
  531. data/test/models/tag.rb +13 -7
  532. data/test/models/tagging.rb +13 -13
  533. data/test/models/task.rb +5 -5
  534. data/test/models/topic.rb +118 -124
  535. data/test/models/toy.rb +6 -6
  536. data/test/models/traffic_light.rb +4 -4
  537. data/test/models/treasure.rb +14 -14
  538. data/test/models/treaty.rb +7 -7
  539. data/test/models/tree.rb +3 -0
  540. data/test/models/tuning_peg.rb +4 -0
  541. data/test/models/tyre.rb +11 -11
  542. data/test/models/user.rb +14 -0
  543. data/test/models/uuid_child.rb +3 -3
  544. data/test/models/uuid_item.rb +6 -0
  545. data/test/models/uuid_parent.rb +3 -3
  546. data/test/models/vegetables.rb +24 -24
  547. data/test/models/vehicle.rb +6 -6
  548. data/test/models/vertex.rb +9 -9
  549. data/test/models/warehouse_thing.rb +5 -5
  550. data/test/models/wheel.rb +3 -3
  551. data/test/models/without_table.rb +3 -3
  552. data/test/models/zine.rb +3 -3
  553. data/test/schema/mysql2_specific_schema.rb +68 -58
  554. data/test/schema/oracle_specific_schema.rb +40 -43
  555. data/test/schema/postgresql_specific_schema.rb +114 -202
  556. data/test/schema/schema.rb +1057 -952
  557. data/test/schema/schema.rb.original +1057 -0
  558. data/test/schema/sqlite_specific_schema.rb +18 -22
  559. data/test/support/config.rb +43 -43
  560. data/test/support/connection.rb +23 -22
  561. data/test/support/connection_helper.rb +14 -14
  562. data/test/support/ddl_helper.rb +8 -8
  563. data/test/support/schema_dumping_helper.rb +20 -20
  564. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  565. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  566. metadata +129 -28
  567. data/lib/mswin32/rb19x/ibm_db.so +0 -0
  568. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  569. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  570. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  571. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
  572. data/test/cases/attribute_methods/serialization_test.rb +0 -29
  573. data/test/cases/migration/change_schema_test - Copy.rb +0 -448
  574. data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
  575. data/test/cases/migration/table_and_index_test.rb +0 -24
  576. data/test/cases/relation/where_test2.rb +0 -36
  577. data/test/cases/type/decimal_test.rb +0 -56
  578. data/test/cases/type/unsigned_integer_test.rb +0 -18
  579. data/test/cases/xml_serialization_test.rb +0 -457
  580. data/test/connections/native_ibm_db/connection.rb +0 -44
  581. data/test/fixtures/naked/csv/accounts.csv +0 -1
  582. data/test/schema/i5/ibm_db_specific_schema.rb +0 -137
  583. data/test/schema/ids/ibm_db_specific_schema.rb +0 -140
  584. data/test/schema/luw/ibm_db_specific_schema.rb +0 -137
  585. data/test/schema/mysql_specific_schema.rb +0 -70
  586. data/test/schema/zOS/ibm_db_specific_schema.rb +0 -208
@@ -0,0 +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
@@ -0,0 +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
@@ -0,0 +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
@@ -0,0 +1,111 @@
1
+ require 'cases/helper'
2
+ require 'support/connection_helper'
3
+
4
+ class PostgreSQLReferentialIntegrityTest < ActiveRecord::PostgreSQLTestCase
5
+ self.use_transactional_tests = false
6
+
7
+ include ConnectionHelper
8
+
9
+ IS_REFERENTIAL_INTEGRITY_SQL = lambda do |sql|
10
+ sql.match(/DISABLE TRIGGER ALL/) || sql.match(/ENABLE TRIGGER ALL/)
11
+ end
12
+
13
+ module MissingSuperuserPrivileges
14
+ def execute(sql)
15
+ if IS_REFERENTIAL_INTEGRITY_SQL.call(sql)
16
+ super "BROKEN;" rescue nil # put transaction in broken state
17
+ raise ActiveRecord::StatementInvalid, 'PG::InsufficientPrivilege'
18
+ else
19
+ super
20
+ end
21
+ end
22
+ end
23
+
24
+ module ProgrammerMistake
25
+ def execute(sql)
26
+ if IS_REFERENTIAL_INTEGRITY_SQL.call(sql)
27
+ raise ArgumentError, 'something is not right.'
28
+ else
29
+ super
30
+ end
31
+ end
32
+ end
33
+
34
+ def setup
35
+ @connection = ActiveRecord::Base.connection
36
+ end
37
+
38
+ def teardown
39
+ reset_connection
40
+ if ActiveRecord::Base.connection.is_a?(MissingSuperuserPrivileges)
41
+ raise "MissingSuperuserPrivileges patch was not removed"
42
+ end
43
+ end
44
+
45
+ def test_should_reraise_invalid_foreign_key_exception_and_show_warning
46
+ @connection.extend MissingSuperuserPrivileges
47
+
48
+ warning = capture(:stderr) do
49
+ e = assert_raises(ActiveRecord::InvalidForeignKey) do
50
+ @connection.disable_referential_integrity do
51
+ raise ActiveRecord::InvalidForeignKey, 'Should be re-raised'
52
+ end
53
+ end
54
+ assert_equal 'Should be re-raised', e.message
55
+ end
56
+ assert_match (/WARNING: Rails was not able to disable referential integrity/), warning
57
+ assert_match (/cause: PG::InsufficientPrivilege/), warning
58
+ end
59
+
60
+ def test_does_not_print_warning_if_no_invalid_foreign_key_exception_was_raised
61
+ @connection.extend MissingSuperuserPrivileges
62
+
63
+ warning = capture(:stderr) do
64
+ e = assert_raises(ActiveRecord::StatementInvalid) do
65
+ @connection.disable_referential_integrity do
66
+ raise ActiveRecord::StatementInvalid, 'Should be re-raised'
67
+ end
68
+ end
69
+ assert_equal 'Should be re-raised', e.message
70
+ end
71
+ assert warning.blank?, "expected no warnings but got:\n#{warning}"
72
+ end
73
+
74
+ def test_does_not_break_transactions
75
+ @connection.extend MissingSuperuserPrivileges
76
+
77
+ @connection.transaction do
78
+ @connection.disable_referential_integrity do
79
+ assert_transaction_is_not_broken
80
+ end
81
+ assert_transaction_is_not_broken
82
+ end
83
+ end
84
+
85
+ def test_does_not_break_nested_transactions
86
+ @connection.extend MissingSuperuserPrivileges
87
+
88
+ @connection.transaction do
89
+ @connection.transaction(requires_new: true) do
90
+ @connection.disable_referential_integrity do
91
+ assert_transaction_is_not_broken
92
+ end
93
+ end
94
+ assert_transaction_is_not_broken
95
+ end
96
+ end
97
+
98
+ def test_only_catch_active_record_errors_others_bubble_up
99
+ @connection.extend ProgrammerMistake
100
+
101
+ assert_raises ArgumentError do
102
+ @connection.disable_referential_integrity {}
103
+ end
104
+ end
105
+
106
+ private
107
+
108
+ def assert_transaction_is_not_broken
109
+ assert_equal 1, @connection.select_value("SELECT 1")
110
+ end
111
+ end