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,26 @@
1
+ require "cases/helper"
2
+
3
+ class PostgresqlCaseInsensitiveTest < ActiveRecord::PostgreSQLTestCase
4
+ class Default < ActiveRecord::Base; end
5
+
6
+ def test_case_insensitiveness
7
+ connection = ActiveRecord::Base.connection
8
+ table = Default.arel_table
9
+
10
+ column = Default.columns_hash["char1"]
11
+ comparison = connection.case_insensitive_comparison table, :char1, column, nil
12
+ assert_match(/lower/i, comparison.to_sql)
13
+
14
+ column = Default.columns_hash["char2"]
15
+ comparison = connection.case_insensitive_comparison table, :char2, column, nil
16
+ assert_match(/lower/i, comparison.to_sql)
17
+
18
+ column = Default.columns_hash["char3"]
19
+ comparison = connection.case_insensitive_comparison table, :char3, column, nil
20
+ assert_match(/lower/i, comparison.to_sql)
21
+
22
+ column = Default.columns_hash["multiline_default"]
23
+ comparison = connection.case_insensitive_comparison table, :multiline_default, column, nil
24
+ assert_match(/lower/i, comparison.to_sql)
25
+ end
26
+ end
@@ -0,0 +1,38 @@
1
+ require 'cases/helper'
2
+
3
+ module ActiveRecord
4
+ class Migration
5
+ class PGChangeSchemaTest < ActiveRecord::PostgreSQLTestCase
6
+ attr_reader :connection
7
+
8
+ def setup
9
+ super
10
+ @connection = ActiveRecord::Base.connection
11
+ connection.create_table(:strings) do |t|
12
+ t.string :somedate
13
+ end
14
+ end
15
+
16
+ def teardown
17
+ connection.drop_table :strings
18
+ end
19
+
20
+ def test_change_string_to_date
21
+ connection.change_column :strings, :somedate, :timestamp, using: 'CAST("somedate" AS timestamp)'
22
+ assert_equal :datetime, connection.columns(:strings).find { |c| c.name == 'somedate' }.type
23
+ end
24
+
25
+ def test_change_type_with_symbol
26
+ connection.change_column :strings, :somedate, :timestamp, cast_as: :timestamp
27
+ assert_equal :datetime, connection.columns(:strings).find { |c| c.name == 'somedate' }.type
28
+ end
29
+
30
+ def test_change_type_with_array
31
+ connection.change_column :strings, :somedate, :timestamp, array: true, cast_as: :timestamp
32
+ column = connection.columns(:strings).find { |c| c.name == 'somedate' }
33
+ assert_equal :datetime, column.type
34
+ assert column.array?
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,25 @@
1
+ require "cases/helper"
2
+ require "ipaddr"
3
+
4
+ module ActiveRecord
5
+ module ConnectionAdapters
6
+ class PostgreSQLAdapter < AbstractAdapter
7
+ class CidrTest < ActiveRecord::PostgreSQLTestCase
8
+ test "type casting IPAddr for database" do
9
+ type = OID::Cidr.new
10
+ ip = IPAddr.new("255.0.0.0/8")
11
+ ip2 = IPAddr.new("127.0.0.1")
12
+
13
+ assert_equal "255.0.0.0/8", type.serialize(ip)
14
+ assert_equal "127.0.0.1/32", type.serialize(ip2)
15
+ end
16
+
17
+ test "casting does nothing with non-IPAddr objects" do
18
+ type = OID::Cidr.new
19
+
20
+ assert_equal "foo", type.serialize("foo")
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,78 @@
1
+ require 'cases/helper'
2
+ require 'support/schema_dumping_helper'
3
+
4
+ if ActiveRecord::Base.connection.supports_extensions?
5
+ class PostgresqlCitextTest < ActiveRecord::PostgreSQLTestCase
6
+ include SchemaDumpingHelper
7
+ class Citext < ActiveRecord::Base
8
+ self.table_name = 'citexts'
9
+ end
10
+
11
+ def setup
12
+ @connection = ActiveRecord::Base.connection
13
+
14
+ enable_extension!('citext', @connection)
15
+
16
+ @connection.create_table('citexts') do |t|
17
+ t.citext 'cival'
18
+ end
19
+ end
20
+
21
+ teardown do
22
+ @connection.drop_table 'citexts', if_exists: true
23
+ disable_extension!('citext', @connection)
24
+ end
25
+
26
+ def test_citext_enabled
27
+ assert @connection.extension_enabled?('citext')
28
+ end
29
+
30
+ def test_column
31
+ column = Citext.columns_hash['cival']
32
+ assert_equal :citext, column.type
33
+ assert_equal 'citext', column.sql_type
34
+ assert_not column.array?
35
+
36
+ type = Citext.type_for_attribute('cival')
37
+ assert_not type.binary?
38
+ end
39
+
40
+ def test_change_table_supports_json
41
+ @connection.transaction do
42
+ @connection.change_table('citexts') do |t|
43
+ t.citext 'username'
44
+ end
45
+ Citext.reset_column_information
46
+ column = Citext.columns_hash['username']
47
+ assert_equal :citext, column.type
48
+
49
+ raise ActiveRecord::Rollback # reset the schema change
50
+ end
51
+ ensure
52
+ Citext.reset_column_information
53
+ end
54
+
55
+ def test_write
56
+ x = Citext.new(cival: 'Some CI Text')
57
+ x.save!
58
+ citext = Citext.first
59
+ assert_equal "Some CI Text", citext.cival
60
+
61
+ citext.cival = "Some NEW CI Text"
62
+ citext.save!
63
+
64
+ assert_equal "Some NEW CI Text", citext.reload.cival
65
+ end
66
+
67
+ def test_select_case_insensitive
68
+ @connection.execute "insert into citexts (cival) values('Cased Text')"
69
+ x = Citext.where(cival: 'cased text').first
70
+ assert_equal 'Cased Text', x.cival
71
+ end
72
+
73
+ def test_schema_dump_with_shorthand
74
+ output = dump_table_schema("citexts")
75
+ assert_match %r[t\.citext "cival"], output
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,53 @@
1
+ require "cases/helper"
2
+ require 'support/schema_dumping_helper'
3
+
4
+ class PostgresqlCollationTest < ActiveRecord::PostgreSQLTestCase
5
+ include SchemaDumpingHelper
6
+
7
+ def setup
8
+ @connection = ActiveRecord::Base.connection
9
+ @connection.create_table :postgresql_collations, force: true do |t|
10
+ t.string :string_c, collation: 'C'
11
+ t.text :text_posix, collation: 'POSIX'
12
+ end
13
+ end
14
+
15
+ def teardown
16
+ @connection.drop_table :postgresql_collations, if_exists: true
17
+ end
18
+
19
+ test "string column with collation" do
20
+ column = @connection.columns(:postgresql_collations).find { |c| c.name == 'string_c' }
21
+ assert_equal :string, column.type
22
+ assert_equal 'C', column.collation
23
+ end
24
+
25
+ test "text column with collation" do
26
+ column = @connection.columns(:postgresql_collations).find { |c| c.name == 'text_posix' }
27
+ assert_equal :text, column.type
28
+ assert_equal 'POSIX', column.collation
29
+ end
30
+
31
+ test "add column with collation" do
32
+ @connection.add_column :postgresql_collations, :title, :string, collation: 'C'
33
+
34
+ column = @connection.columns(:postgresql_collations).find { |c| c.name == 'title' }
35
+ assert_equal :string, column.type
36
+ assert_equal 'C', column.collation
37
+ end
38
+
39
+ test "change column with collation" do
40
+ @connection.add_column :postgresql_collations, :description, :string
41
+ @connection.change_column :postgresql_collations, :description, :text, collation: 'POSIX'
42
+
43
+ column = @connection.columns(:postgresql_collations).find { |c| c.name == 'description' }
44
+ assert_equal :text, column.type
45
+ assert_equal 'POSIX', column.collation
46
+ end
47
+
48
+ test "schema dump includes collation" do
49
+ output = dump_table_schema("postgresql_collations")
50
+ assert_match %r{t.string\s+"string_c",\s+collation: "C"$}, output
51
+ assert_match %r{t.text\s+"text_posix",\s+collation: "POSIX"$}, output
52
+ end
53
+ end
@@ -0,0 +1,132 @@
1
+ require "cases/helper"
2
+ require 'support/connection_helper'
3
+
4
+ module PostgresqlCompositeBehavior
5
+ include ConnectionHelper
6
+
7
+ class PostgresqlComposite < ActiveRecord::Base
8
+ self.table_name = "postgresql_composites"
9
+ end
10
+
11
+ def setup
12
+ super
13
+
14
+ @connection = ActiveRecord::Base.connection
15
+ @connection.transaction do
16
+ @connection.execute <<-SQL
17
+ CREATE TYPE full_address AS
18
+ (
19
+ city VARCHAR(90),
20
+ street VARCHAR(90)
21
+ );
22
+ SQL
23
+ @connection.create_table('postgresql_composites') do |t|
24
+ t.column :address, :full_address
25
+ end
26
+ end
27
+ end
28
+
29
+ def teardown
30
+ super
31
+
32
+ @connection.drop_table 'postgresql_composites', if_exists: true
33
+ @connection.execute 'DROP TYPE IF EXISTS full_address'
34
+ reset_connection
35
+ PostgresqlComposite.reset_column_information
36
+ end
37
+ end
38
+
39
+ # Composites are mapped to `OID::Identity` by default. The user is informed by a warning like:
40
+ # "unknown OID 5653508: failed to recognize type of 'address'. It will be treated as String."
41
+ # To take full advantage of composite types, we suggest you register your own +OID::Type+.
42
+ # See PostgresqlCompositeWithCustomOIDTest
43
+ class PostgresqlCompositeTest < ActiveRecord::PostgreSQLTestCase
44
+ include PostgresqlCompositeBehavior
45
+
46
+ def test_column
47
+ ensure_warning_is_issued
48
+
49
+ column = PostgresqlComposite.columns_hash["address"]
50
+ assert_nil column.type
51
+ assert_equal "full_address", column.sql_type
52
+ assert_not column.array?
53
+
54
+ type = PostgresqlComposite.type_for_attribute("address")
55
+ assert_not type.binary?
56
+ end
57
+
58
+ def test_composite_mapping
59
+ ensure_warning_is_issued
60
+
61
+ @connection.execute "INSERT INTO postgresql_composites VALUES (1, ROW('Paris', 'Champs-Élysées'));"
62
+ composite = PostgresqlComposite.first
63
+ assert_equal "(Paris,Champs-Élysées)", composite.address
64
+
65
+ composite.address = "(Paris,Rue Basse)"
66
+ composite.save!
67
+
68
+ assert_equal '(Paris,"Rue Basse")', composite.reload.address
69
+ end
70
+
71
+ private
72
+ def ensure_warning_is_issued
73
+ warning = capture(:stderr) do
74
+ PostgresqlComposite.columns_hash
75
+ end
76
+ assert_match(/unknown OID \d+: failed to recognize type of 'address'\. It will be treated as String\./, warning)
77
+ end
78
+ end
79
+
80
+ class PostgresqlCompositeWithCustomOIDTest < ActiveRecord::PostgreSQLTestCase
81
+ include PostgresqlCompositeBehavior
82
+
83
+ class FullAddressType < ActiveRecord::Type::Value
84
+ def type; :full_address end
85
+
86
+ def deserialize(value)
87
+ if value =~ /\("?([^",]*)"?,"?([^",]*)"?\)/
88
+ FullAddress.new($1, $2)
89
+ end
90
+ end
91
+
92
+ def cast(value)
93
+ value
94
+ end
95
+
96
+ def serialize(value)
97
+ return if value.nil?
98
+ "(#{value.city},#{value.street})"
99
+ end
100
+ end
101
+
102
+ FullAddress = Struct.new(:city, :street)
103
+
104
+ def setup
105
+ super
106
+
107
+ @connection.type_map.register_type "full_address", FullAddressType.new
108
+ end
109
+
110
+ def test_column
111
+ column = PostgresqlComposite.columns_hash["address"]
112
+ assert_equal :full_address, column.type
113
+ assert_equal "full_address", column.sql_type
114
+ assert_not column.array?
115
+
116
+ type = PostgresqlComposite.type_for_attribute("address")
117
+ assert_not type.binary?
118
+ end
119
+
120
+ def test_composite_mapping
121
+ @connection.execute "INSERT INTO postgresql_composites VALUES (1, ROW('Paris', 'Champs-Élysées'));"
122
+ composite = PostgresqlComposite.first
123
+ assert_equal "Paris", composite.address.city
124
+ assert_equal "Champs-Élysées", composite.address.street
125
+
126
+ composite.address = FullAddress.new("Paris", "Rue Basse")
127
+ composite.save!
128
+
129
+ assert_equal 'Paris', composite.reload.address.city
130
+ assert_equal 'Rue Basse', composite.reload.address.street
131
+ end
132
+ end
@@ -0,0 +1,257 @@
1
+ require "cases/helper"
2
+ require 'support/connection_helper'
3
+
4
+ module ActiveRecord
5
+ class PostgresqlConnectionTest < ActiveRecord::PostgreSQLTestCase
6
+ include ConnectionHelper
7
+
8
+ class NonExistentTable < ActiveRecord::Base
9
+ end
10
+
11
+ fixtures :comments
12
+
13
+ def setup
14
+ super
15
+ @subscriber = SQLSubscriber.new
16
+ @subscription = ActiveSupport::Notifications.subscribe('sql.active_record', @subscriber)
17
+ @connection = ActiveRecord::Base.connection
18
+ end
19
+
20
+ def teardown
21
+ ActiveSupport::Notifications.unsubscribe(@subscription)
22
+ super
23
+ end
24
+
25
+ def test_truncate
26
+ count = ActiveRecord::Base.connection.execute("select count(*) from comments").first['count'].to_i
27
+ assert_operator count, :>, 0
28
+ ActiveRecord::Base.connection.truncate("comments")
29
+ count = ActiveRecord::Base.connection.execute("select count(*) from comments").first['count'].to_i
30
+ assert_equal 0, count
31
+ end
32
+
33
+ def test_encoding
34
+ assert_not_nil @connection.encoding
35
+ end
36
+
37
+ def test_collation
38
+ assert_not_nil @connection.collation
39
+ end
40
+
41
+ def test_ctype
42
+ assert_not_nil @connection.ctype
43
+ end
44
+
45
+ def test_default_client_min_messages
46
+ assert_equal "warning", @connection.client_min_messages
47
+ end
48
+
49
+ # Ensure, we can set connection params using the example of Generic
50
+ # Query Optimizer (geqo). It is 'on' per default.
51
+ def test_connection_options
52
+ params = ActiveRecord::Base.connection_config.dup
53
+ params[:options] = "-c geqo=off"
54
+ NonExistentTable.establish_connection(params)
55
+
56
+ # Verify the connection param has been applied.
57
+ expect = NonExistentTable.connection.query('show geqo').first.first
58
+ assert_equal 'off', expect
59
+ end
60
+
61
+ def test_reset
62
+ @connection.query('ROLLBACK')
63
+ @connection.query('SET geqo TO off')
64
+
65
+ # Verify the setting has been applied.
66
+ expect = @connection.query('show geqo').first.first
67
+ assert_equal 'off', expect
68
+
69
+ @connection.reset!
70
+
71
+ # Verify the setting has been cleared.
72
+ expect = @connection.query('show geqo').first.first
73
+ assert_equal 'on', expect
74
+ end
75
+
76
+ def test_reset_with_transaction
77
+ @connection.query('ROLLBACK')
78
+ @connection.query('SET geqo TO off')
79
+
80
+ # Verify the setting has been applied.
81
+ expect = @connection.query('show geqo').first.first
82
+ assert_equal 'off', expect
83
+
84
+ @connection.query('BEGIN')
85
+ @connection.reset!
86
+
87
+ # Verify the setting has been cleared.
88
+ expect = @connection.query('show geqo').first.first
89
+ assert_equal 'on', expect
90
+ end
91
+
92
+ def test_tables_logs_name
93
+ ActiveSupport::Deprecation.silence { @connection.tables('hello') }
94
+ assert_equal 'SCHEMA', @subscriber.logged[0][1]
95
+ end
96
+
97
+ def test_indexes_logs_name
98
+ @connection.indexes('items', 'hello')
99
+ assert_equal 'SCHEMA', @subscriber.logged[0][1]
100
+ end
101
+
102
+ def test_table_exists_logs_name
103
+ ActiveSupport::Deprecation.silence { @connection.table_exists?('items') }
104
+ assert_equal 'SCHEMA', @subscriber.logged[0][1]
105
+ end
106
+
107
+ def test_table_alias_length_logs_name
108
+ @connection.instance_variable_set("@max_identifier_length", nil)
109
+ @connection.table_alias_length
110
+ assert_equal 'SCHEMA', @subscriber.logged[0][1]
111
+ end
112
+
113
+ def test_current_database_logs_name
114
+ @connection.current_database
115
+ assert_equal 'SCHEMA', @subscriber.logged[0][1]
116
+ end
117
+
118
+ def test_encoding_logs_name
119
+ @connection.encoding
120
+ assert_equal 'SCHEMA', @subscriber.logged[0][1]
121
+ end
122
+
123
+ def test_schema_names_logs_name
124
+ @connection.schema_names
125
+ assert_equal 'SCHEMA', @subscriber.logged[0][1]
126
+ end
127
+
128
+ if ActiveRecord::Base.connection.prepared_statements
129
+ def test_statement_key_is_logged
130
+ bind = Relation::QueryAttribute.new(nil, 1, Type::Value.new)
131
+ @connection.exec_query('SELECT $1::integer', 'SQL', [bind], prepare: true)
132
+ name = @subscriber.payloads.last[:statement_name]
133
+ assert name
134
+ res = @connection.exec_query("EXPLAIN (FORMAT JSON) EXECUTE #{name}(1)")
135
+ plan = res.column_types['QUERY PLAN'].deserialize res.rows.first.first
136
+ assert_operator plan.length, :>, 0
137
+ end
138
+ end
139
+
140
+ # Must have PostgreSQL >= 9.2, or with_manual_interventions set to
141
+ # true for this test to run.
142
+ #
143
+ # When prompted, restart the PostgreSQL server with the
144
+ # "-m fast" option or kill the individual connection assuming
145
+ # you know the incantation to do that.
146
+ # To restart PostgreSQL 9.1 on OS X, installed via MacPorts, ...
147
+ # sudo su postgres -c "pg_ctl restart -D /opt/local/var/db/postgresql91/defaultdb/ -m fast"
148
+ def test_reconnection_after_actual_disconnection_with_verify
149
+ original_connection_pid = @connection.query('select pg_backend_pid()')
150
+
151
+ # Sanity check.
152
+ assert @connection.active?
153
+
154
+ if @connection.send(:postgresql_version) >= 90200
155
+ secondary_connection = ActiveRecord::Base.connection_pool.checkout
156
+ secondary_connection.query("select pg_terminate_backend(#{original_connection_pid.first.first})")
157
+ ActiveRecord::Base.connection_pool.checkin(secondary_connection)
158
+ elsif ARTest.config['with_manual_interventions']
159
+ puts 'Kill the connection now (e.g. by restarting the PostgreSQL ' +
160
+ 'server with the "-m fast" option) and then press enter.'
161
+ $stdin.gets
162
+ else
163
+ # We're not capable of terminating the backend ourselves, and
164
+ # we're not allowed to seek assistance; bail out without
165
+ # actually testing anything.
166
+ return
167
+ end
168
+
169
+ @connection.verify!
170
+
171
+ assert @connection.active?
172
+
173
+ # If we get no exception here, then either we re-connected successfully, or
174
+ # we never actually got disconnected.
175
+ new_connection_pid = @connection.query('select pg_backend_pid()')
176
+
177
+ assert_not_equal original_connection_pid, new_connection_pid,
178
+ "umm -- looks like you didn't break the connection, because we're still " +
179
+ "successfully querying with the same connection pid."
180
+ ensure
181
+ # Repair all fixture connections so other tests won't break.
182
+ @fixture_connections.each(&:verify!)
183
+ end
184
+
185
+ def test_set_session_variable_true
186
+ run_without_connection do |orig_connection|
187
+ ActiveRecord::Base.establish_connection(orig_connection.deep_merge({:variables => {:debug_print_plan => true}}))
188
+ set_true = ActiveRecord::Base.connection.exec_query "SHOW DEBUG_PRINT_PLAN"
189
+ assert_equal set_true.rows, [["on"]]
190
+ end
191
+ end
192
+
193
+ def test_set_session_variable_false
194
+ run_without_connection do |orig_connection|
195
+ ActiveRecord::Base.establish_connection(orig_connection.deep_merge({:variables => {:debug_print_plan => false}}))
196
+ set_false = ActiveRecord::Base.connection.exec_query "SHOW DEBUG_PRINT_PLAN"
197
+ assert_equal set_false.rows, [["off"]]
198
+ end
199
+ end
200
+
201
+ def test_set_session_variable_nil
202
+ run_without_connection do |orig_connection|
203
+ # This should be a no-op that does not raise an error
204
+ ActiveRecord::Base.establish_connection(orig_connection.deep_merge({:variables => {:debug_print_plan => nil}}))
205
+ end
206
+ end
207
+
208
+ def test_set_session_variable_default
209
+ run_without_connection do |orig_connection|
210
+ # This should execute a query that does not raise an error
211
+ ActiveRecord::Base.establish_connection(orig_connection.deep_merge({:variables => {:debug_print_plan => :default}}))
212
+ end
213
+ end
214
+
215
+ def test_get_and_release_advisory_lock
216
+ lock_id = 5295901941911233559
217
+ list_advisory_locks = <<-SQL
218
+ SELECT locktype,
219
+ (classid::bigint << 32) | objid::bigint AS lock_id
220
+ FROM pg_locks
221
+ WHERE locktype = 'advisory'
222
+ SQL
223
+
224
+ got_lock = @connection.get_advisory_lock(lock_id)
225
+ assert got_lock, "get_advisory_lock should have returned true but it didn't"
226
+
227
+ advisory_lock = @connection.query(list_advisory_locks).find {|l| l[1] == lock_id}
228
+ assert advisory_lock,
229
+ "expected to find an advisory lock with lock_id #{lock_id} but there wasn't one"
230
+
231
+ released_lock = @connection.release_advisory_lock(lock_id)
232
+ assert released_lock, "expected release_advisory_lock to return true but it didn't"
233
+
234
+ advisory_locks = @connection.query(list_advisory_locks).select {|l| l[1] == lock_id}
235
+ assert_empty advisory_locks,
236
+ "expected to have released advisory lock with lock_id #{lock_id} but it was still held"
237
+ end
238
+
239
+ def test_release_non_existent_advisory_lock
240
+ fake_lock_id = 2940075057017742022
241
+ with_warning_suppression do
242
+ released_non_existent_lock = @connection.release_advisory_lock(fake_lock_id)
243
+ assert_equal released_non_existent_lock, false,
244
+ 'expected release_advisory_lock to return false when there was no lock to release'
245
+ end
246
+ end
247
+
248
+ protected
249
+
250
+ def with_warning_suppression
251
+ log_level = @connection.client_min_messages
252
+ @connection.client_min_messages = 'error'
253
+ yield
254
+ @connection.client_min_messages = log_level
255
+ end
256
+ end
257
+ end