ibm_db 3.0.5-x86-mingw32 → 5.0.5-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 (358) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES +4 -0
  3. data/LICENSE +1 -1
  4. data/ParameterizedQueries README +6 -6
  5. data/README +38 -55
  6. data/ext/Makefile +269 -0
  7. data/ext/extconf.rb +34 -3
  8. data/ext/gil_release_version +3 -0
  9. data/ext/ibm_db-i386-mingw32.def +2 -0
  10. data/ext/ibm_db.c +100 -108
  11. data/ext/ibm_db.o +0 -0
  12. data/ext/ibm_db.so +0 -0
  13. data/ext/mkmf.log +110 -0
  14. data/ext/ruby_ibm_db_cli.o +0 -0
  15. data/ext/unicode_support_version +3 -0
  16. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +923 -527
  17. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +4 -1
  18. data/lib/mswin32/ibm_db.rb +7 -39
  19. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  20. data/test/active_record/connection_adapters/fake_adapter.rb +8 -5
  21. data/test/cases/adapter_test.rb +133 -58
  22. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
  23. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
  24. data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
  25. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
  26. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
  27. data/test/cases/adapters/mysql2/connection_test.rb +210 -0
  28. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
  29. data/test/cases/adapters/mysql2/enum_test.rb +26 -0
  30. data/test/cases/adapters/mysql2/explain_test.rb +21 -0
  31. data/test/cases/adapters/mysql2/json_test.rb +195 -0
  32. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
  33. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  34. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
  35. data/test/cases/adapters/mysql2/schema_test.rb +126 -0
  36. data/test/cases/adapters/mysql2/sp_test.rb +36 -0
  37. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
  38. data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
  39. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
  40. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
  41. data/test/cases/adapters/postgresql/array_test.rb +339 -0
  42. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
  43. data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
  44. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
  45. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
  46. data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
  47. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  48. data/test/cases/adapters/postgresql/collation_test.rb +53 -0
  49. data/test/cases/adapters/postgresql/composite_test.rb +132 -0
  50. data/test/cases/adapters/postgresql/connection_test.rb +257 -0
  51. data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
  52. data/test/cases/adapters/postgresql/domain_test.rb +47 -0
  53. data/test/cases/adapters/postgresql/enum_test.rb +91 -0
  54. data/test/cases/adapters/postgresql/explain_test.rb +20 -0
  55. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
  56. data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
  57. data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
  58. data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
  59. data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
  60. data/test/cases/adapters/postgresql/integer_test.rb +25 -0
  61. data/test/cases/adapters/postgresql/json_test.rb +237 -0
  62. data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
  63. data/test/cases/adapters/postgresql/money_test.rb +96 -0
  64. data/test/cases/adapters/postgresql/network_test.rb +94 -0
  65. data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
  66. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
  67. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  68. data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
  69. data/test/cases/adapters/postgresql/range_test.rb +343 -0
  70. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
  71. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
  72. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
  73. data/test/cases/adapters/postgresql/schema_test.rb +597 -0
  74. data/test/cases/adapters/postgresql/serial_test.rb +154 -0
  75. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
  76. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
  77. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
  78. data/test/cases/adapters/postgresql/utils_test.rb +62 -0
  79. data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
  80. data/test/cases/adapters/postgresql/xml_test.rb +54 -0
  81. data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
  82. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
  83. data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
  84. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
  85. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
  86. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  87. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
  88. data/test/cases/aggregations_test.rb +11 -1
  89. data/test/cases/ar_schema_test.rb +35 -50
  90. data/test/cases/associations/association_scope_test.rb +1 -6
  91. data/test/cases/associations/belongs_to_associations_test.rb +122 -10
  92. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
  93. data/test/cases/associations/callbacks_test.rb +5 -7
  94. data/test/cases/associations/cascaded_eager_loading_test.rb +1 -1
  95. data/test/cases/associations/eager_load_nested_include_test.rb +1 -3
  96. data/test/cases/associations/eager_test.rb +158 -73
  97. data/test/cases/associations/extension_test.rb +7 -2
  98. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +64 -32
  99. data/test/cases/associations/has_many_associations_test.rb +362 -43
  100. data/test/cases/associations/has_many_through_associations_test.rb +108 -41
  101. data/test/cases/associations/has_one_associations_test.rb +105 -8
  102. data/test/cases/associations/has_one_through_associations_test.rb +6 -3
  103. data/test/cases/associations/inner_join_association_test.rb +3 -3
  104. data/test/cases/associations/inverse_associations_test.rb +38 -11
  105. data/test/cases/associations/join_model_test.rb +59 -36
  106. data/test/cases/associations/left_outer_join_association_test.rb +88 -0
  107. data/test/cases/associations/nested_through_associations_test.rb +2 -2
  108. data/test/cases/associations/required_test.rb +25 -5
  109. data/test/cases/associations_test.rb +39 -34
  110. data/test/cases/attribute_decorators_test.rb +9 -8
  111. data/test/cases/attribute_methods/read_test.rb +5 -5
  112. data/test/cases/attribute_methods_test.rb +97 -40
  113. data/test/cases/attribute_set_test.rb +64 -4
  114. data/test/cases/attribute_test.rb +84 -18
  115. data/test/cases/attributes_test.rb +151 -34
  116. data/test/cases/autosave_association_test.rb +149 -36
  117. data/test/cases/base_test.rb +290 -241
  118. data/test/cases/batches_test.rb +299 -22
  119. data/test/cases/binary_test.rb +2 -10
  120. data/test/cases/bind_parameter_test.rb +76 -66
  121. data/test/cases/cache_key_test.rb +26 -0
  122. data/test/cases/calculations_test.rb +167 -15
  123. data/test/cases/callbacks_test.rb +161 -68
  124. data/test/cases/coders/json_test.rb +15 -0
  125. data/test/cases/collection_cache_key_test.rb +115 -0
  126. data/test/cases/column_definition_test.rb +26 -57
  127. data/test/cases/comment_test.rb +145 -0
  128. data/test/cases/connection_adapters/adapter_leasing_test.rb +5 -3
  129. data/test/cases/connection_adapters/connection_handler_test.rb +128 -21
  130. data/test/cases/connection_adapters/connection_specification_test.rb +1 -1
  131. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +0 -38
  132. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -1
  133. data/test/cases/connection_adapters/schema_cache_test.rb +8 -3
  134. data/test/cases/connection_adapters/type_lookup_test.rb +15 -7
  135. data/test/cases/connection_management_test.rb +46 -56
  136. data/test/cases/connection_pool_test.rb +195 -20
  137. data/test/cases/connection_specification/resolver_test.rb +15 -0
  138. data/test/cases/counter_cache_test.rb +10 -5
  139. data/test/cases/custom_locking_test.rb +1 -1
  140. data/test/cases/database_statements_test.rb +18 -3
  141. data/test/cases/{invalid_date_test.rb → date_test.rb} +13 -1
  142. data/test/cases/date_time_precision_test.rb +107 -0
  143. data/test/cases/defaults_test.rb +85 -89
  144. data/test/cases/dirty_test.rb +30 -52
  145. data/test/cases/disconnected_test.rb +4 -2
  146. data/test/cases/enum_test.rb +178 -24
  147. data/test/cases/errors_test.rb +16 -0
  148. data/test/cases/explain_test.rb +32 -21
  149. data/test/cases/finder_test.rb +273 -148
  150. data/test/cases/fixture_set/file_test.rb +18 -0
  151. data/test/cases/fixtures_test.rb +112 -32
  152. data/test/cases/forbidden_attributes_protection_test.rb +69 -3
  153. data/test/cases/helper.rb +10 -16
  154. data/test/cases/hot_compatibility_test.rb +89 -1
  155. data/test/cases/inheritance_test.rb +284 -53
  156. data/test/cases/integration_test.rb +23 -7
  157. data/test/cases/invalid_connection_test.rb +4 -2
  158. data/test/cases/invertible_migration_test.rb +124 -32
  159. data/test/cases/json_serialization_test.rb +11 -2
  160. data/test/cases/locking_test.rb +22 -6
  161. data/test/cases/log_subscriber_test.rb +106 -17
  162. data/test/cases/migration/change_schema_test.rb +60 -114
  163. data/test/cases/migration/change_table_test.rb +34 -2
  164. data/test/cases/migration/column_attributes_test.rb +7 -23
  165. data/test/cases/migration/column_positioning_test.rb +8 -8
  166. data/test/cases/migration/columns_test.rb +17 -11
  167. data/test/cases/migration/command_recorder_test.rb +47 -2
  168. data/test/cases/migration/compatibility_test.rb +118 -0
  169. data/test/cases/migration/create_join_table_test.rb +21 -12
  170. data/test/cases/migration/foreign_key_test.rb +52 -18
  171. data/test/cases/migration/index_test.rb +14 -12
  172. data/test/cases/migration/logger_test.rb +1 -1
  173. data/test/cases/migration/pending_migrations_test.rb +0 -1
  174. data/test/cases/migration/references_foreign_key_test.rb +59 -7
  175. data/test/cases/migration/references_index_test.rb +4 -4
  176. data/test/cases/migration/references_statements_test.rb +26 -6
  177. data/test/cases/migration/rename_table_test.rb +25 -25
  178. data/test/cases/migration_test.rb +279 -81
  179. data/test/cases/migrator_test.rb +91 -8
  180. data/test/cases/mixin_test.rb +0 -2
  181. data/test/cases/modules_test.rb +3 -4
  182. data/test/cases/multiparameter_attributes_test.rb +24 -2
  183. data/test/cases/multiple_db_test.rb +11 -4
  184. data/test/cases/nested_attributes_test.rb +61 -33
  185. data/test/cases/persistence_test.rb +102 -10
  186. data/test/cases/pooled_connections_test.rb +3 -3
  187. data/test/cases/primary_keys_test.rb +170 -31
  188. data/test/cases/query_cache_test.rb +216 -96
  189. data/test/cases/quoting_test.rb +65 -19
  190. data/test/cases/readonly_test.rb +2 -1
  191. data/test/cases/reflection_test.rb +68 -22
  192. data/test/cases/relation/delegation_test.rb +3 -8
  193. data/test/cases/relation/merging_test.rb +10 -14
  194. data/test/cases/relation/mutation_test.rb +42 -24
  195. data/test/cases/relation/or_test.rb +92 -0
  196. data/test/cases/relation/predicate_builder_test.rb +4 -2
  197. data/test/cases/relation/record_fetch_warning_test.rb +40 -0
  198. data/test/cases/relation/where_chain_test.rb +23 -99
  199. data/test/cases/relation/where_clause_test.rb +182 -0
  200. data/test/cases/relation/where_test.rb +45 -23
  201. data/test/cases/relation_test.rb +67 -58
  202. data/test/cases/relations_test.rb +249 -38
  203. data/test/cases/result_test.rb +10 -0
  204. data/test/cases/sanitize_test.rb +108 -15
  205. data/test/cases/schema_dumper_test.rb +119 -125
  206. data/test/cases/schema_loading_test.rb +52 -0
  207. data/test/cases/scoping/default_scoping_test.rb +113 -39
  208. data/test/cases/scoping/named_scoping_test.rb +46 -9
  209. data/test/cases/scoping/relation_scoping_test.rb +47 -4
  210. data/test/cases/secure_token_test.rb +32 -0
  211. data/test/cases/serialization_test.rb +1 -1
  212. data/test/cases/serialized_attribute_test.rb +93 -6
  213. data/test/cases/statement_cache_test.rb +38 -0
  214. data/test/cases/store_test.rb +2 -1
  215. data/test/cases/suppressor_test.rb +63 -0
  216. data/test/cases/tasks/database_tasks_test.rb +73 -9
  217. data/test/cases/tasks/mysql_rake_test.rb +139 -118
  218. data/test/cases/tasks/postgresql_rake_test.rb +60 -6
  219. data/test/cases/tasks/sqlite_rake_test.rb +30 -3
  220. data/test/cases/test_case.rb +28 -20
  221. data/test/cases/test_fixtures_test.rb +36 -0
  222. data/test/cases/time_precision_test.rb +103 -0
  223. data/test/cases/timestamp_test.rb +44 -10
  224. data/test/cases/touch_later_test.rb +121 -0
  225. data/test/cases/transaction_callbacks_test.rb +128 -62
  226. data/test/cases/transaction_isolation_test.rb +2 -2
  227. data/test/cases/transactions_test.rb +61 -43
  228. data/test/cases/type/adapter_specific_registry_test.rb +133 -0
  229. data/test/cases/type/date_time_test.rb +14 -0
  230. data/test/cases/type/integer_test.rb +2 -96
  231. data/test/cases/type/string_test.rb +0 -14
  232. data/test/cases/type_test.rb +39 -0
  233. data/test/cases/types_test.rb +1 -118
  234. data/test/cases/unconnected_test.rb +1 -1
  235. data/test/cases/validations/absence_validation_test.rb +73 -0
  236. data/test/cases/validations/association_validation_test.rb +13 -2
  237. data/test/cases/validations/i18n_validation_test.rb +6 -10
  238. data/test/cases/validations/length_validation_test.rb +62 -30
  239. data/test/cases/validations/presence_validation_test.rb +36 -1
  240. data/test/cases/validations/uniqueness_validation_test.rb +128 -37
  241. data/test/cases/validations_repair_helper.rb +2 -6
  242. data/test/cases/validations_test.rb +36 -7
  243. data/test/cases/view_test.rb +102 -5
  244. data/test/cases/yaml_serialization_test.rb +21 -26
  245. data/test/config.example.yml +97 -0
  246. data/test/fixtures/bad_posts.yml +9 -0
  247. data/test/fixtures/books.yml +20 -0
  248. data/test/fixtures/content.yml +3 -0
  249. data/test/fixtures/content_positions.yml +3 -0
  250. data/test/fixtures/dead_parrots.yml +5 -0
  251. data/test/fixtures/live_parrots.yml +4 -0
  252. data/test/fixtures/naked/yml/parrots.yml +2 -0
  253. data/test/fixtures/naked/yml/trees.yml +3 -0
  254. data/test/fixtures/nodes.yml +29 -0
  255. data/test/fixtures/other_comments.yml +6 -0
  256. data/test/fixtures/other_dogs.yml +2 -0
  257. data/test/fixtures/other_posts.yml +7 -0
  258. data/test/fixtures/price_estimates.yml +10 -1
  259. data/test/fixtures/trees.yml +3 -0
  260. data/test/migrations/10_urban/9_add_expressions.rb +1 -1
  261. data/test/migrations/decimal/1_give_me_big_numbers.rb +1 -1
  262. data/test/migrations/magic/1_currencies_have_symbols.rb +1 -1
  263. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -2
  264. data/test/migrations/missing/1_people_have_last_names.rb +2 -2
  265. data/test/migrations/missing/3_we_need_reminders.rb +2 -2
  266. data/test/migrations/missing/4_innocent_jointable.rb +2 -2
  267. data/test/migrations/rename/1_we_need_things.rb +2 -2
  268. data/test/migrations/rename/2_rename_things.rb +2 -2
  269. data/test/migrations/to_copy/1_people_have_hobbies.rb +1 -1
  270. data/test/migrations/to_copy/2_people_have_descriptions.rb +1 -1
  271. data/test/migrations/to_copy2/1_create_articles.rb +1 -1
  272. data/test/migrations/to_copy2/2_create_comments.rb +1 -1
  273. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +1 -1
  274. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +1 -1
  275. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +1 -1
  276. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +1 -1
  277. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +1 -1
  278. data/test/migrations/valid/1_valid_people_have_last_names.rb +1 -1
  279. data/test/migrations/valid/2_we_need_reminders.rb +2 -2
  280. data/test/migrations/valid/3_innocent_jointable.rb +2 -2
  281. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +1 -1
  282. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -2
  283. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +2 -2
  284. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +1 -1
  285. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +1 -1
  286. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +1 -1
  287. data/test/migrations/version_check/20131219224947_migration_version_check.rb +1 -1
  288. data/test/models/admin/randomly_named_c1.rb +6 -2
  289. data/test/models/aircraft.rb +1 -0
  290. data/test/models/author.rb +4 -7
  291. data/test/models/bird.rb +1 -1
  292. data/test/models/book.rb +5 -0
  293. data/test/models/bulb.rb +2 -1
  294. data/test/models/car.rb +3 -0
  295. data/test/models/cat.rb +10 -0
  296. data/test/models/chef.rb +1 -0
  297. data/test/models/club.rb +2 -0
  298. data/test/models/comment.rb +17 -5
  299. data/test/models/company.rb +4 -2
  300. data/test/models/company_in_module.rb +1 -1
  301. data/test/models/contact.rb +1 -1
  302. data/test/models/content.rb +40 -0
  303. data/test/models/customer.rb +8 -2
  304. data/test/models/developer.rb +19 -0
  305. data/test/models/face.rb +1 -1
  306. data/test/models/guitar.rb +4 -0
  307. data/test/models/hotel.rb +2 -0
  308. data/test/models/member.rb +1 -0
  309. data/test/models/member_detail.rb +4 -3
  310. data/test/models/mentor.rb +3 -0
  311. data/test/models/mocktail_designer.rb +2 -0
  312. data/test/models/node.rb +5 -0
  313. data/test/models/non_primary_key.rb +2 -0
  314. data/test/models/notification.rb +3 -0
  315. data/test/models/other_dog.rb +5 -0
  316. data/test/models/owner.rb +4 -1
  317. data/test/models/parrot.rb +6 -7
  318. data/test/models/person.rb +0 -1
  319. data/test/models/pet.rb +3 -0
  320. data/test/models/pet_treasure.rb +6 -0
  321. data/test/models/pirate.rb +3 -3
  322. data/test/models/post.rb +18 -9
  323. data/test/models/project.rb +9 -0
  324. data/test/models/randomly_named_c1.rb +1 -1
  325. data/test/models/recipe.rb +3 -0
  326. data/test/models/ship.rb +8 -2
  327. data/test/models/tag.rb +6 -0
  328. data/test/models/topic.rb +2 -8
  329. data/test/models/tree.rb +3 -0
  330. data/test/models/tuning_peg.rb +4 -0
  331. data/test/models/user.rb +14 -0
  332. data/test/models/uuid_item.rb +6 -0
  333. data/test/schema/mysql2_specific_schema.rb +33 -23
  334. data/test/schema/oracle_specific_schema.rb +1 -4
  335. data/test/schema/postgresql_specific_schema.rb +36 -124
  336. data/test/schema/schema.rb +170 -65
  337. data/test/schema/schema.rb.original +1057 -0
  338. data/test/schema/sqlite_specific_schema.rb +1 -5
  339. data/test/support/connection.rb +1 -0
  340. data/test/support/schema_dumping_helper.rb +1 -1
  341. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  342. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  343. metadata +146 -30
  344. data/lib/mswin32/rb19x/ibm_db.so +0 -0
  345. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  346. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  347. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  348. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
  349. data/test/cases/attribute_methods/serialization_test.rb +0 -29
  350. data/test/cases/migration/change_schema_test - Copy.rb +0 -448
  351. data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
  352. data/test/cases/migration/table_and_index_test.rb +0 -24
  353. data/test/cases/relation/where_test2.rb +0 -36
  354. data/test/cases/type/decimal_test.rb +0 -56
  355. data/test/cases/type/unsigned_integer_test.rb +0 -18
  356. data/test/cases/xml_serialization_test.rb +0 -457
  357. data/test/fixtures/naked/csv/accounts.csv +0 -1
  358. data/test/schema/mysql_specific_schema.rb +0 -70
@@ -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