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,49 @@
1
+ require "cases/helper"
2
+
3
+ class PostgresqlNumberTest < ActiveRecord::PostgreSQLTestCase
4
+ class PostgresqlNumber < ActiveRecord::Base; end
5
+
6
+ setup do
7
+ @connection = ActiveRecord::Base.connection
8
+ @connection.create_table('postgresql_numbers', force: true) do |t|
9
+ t.column 'single', 'REAL'
10
+ t.column 'double', 'DOUBLE PRECISION'
11
+ end
12
+ end
13
+
14
+ teardown do
15
+ @connection.drop_table 'postgresql_numbers', if_exists: true
16
+ end
17
+
18
+ def test_data_type
19
+ assert_equal :float, PostgresqlNumber.columns_hash["single"].type
20
+ assert_equal :float, PostgresqlNumber.columns_hash["double"].type
21
+ end
22
+
23
+ def test_values
24
+ @connection.execute("INSERT INTO postgresql_numbers (id, single, double) VALUES (1, 123.456, 123456.789)")
25
+ @connection.execute("INSERT INTO postgresql_numbers (id, single, double) VALUES (2, '-Infinity', 'Infinity')")
26
+ @connection.execute("INSERT INTO postgresql_numbers (id, single, double) VALUES (3, 123.456, 'NaN')")
27
+
28
+ first, second, third = PostgresqlNumber.find(1, 2, 3)
29
+
30
+ assert_equal 123.456, first.single
31
+ assert_equal 123456.789, first.double
32
+ assert_equal(-::Float::INFINITY, second.single)
33
+ assert_equal ::Float::INFINITY, second.double
34
+ assert_send [third.double, :nan?]
35
+ end
36
+
37
+ def test_update
38
+ record = PostgresqlNumber.create! single: "123.456", double: "123456.789"
39
+ new_single = 789.012
40
+ new_double = 789012.345
41
+ record.single = new_single
42
+ record.double = new_double
43
+ record.save!
44
+
45
+ record.reload
46
+ assert_equal new_single, record.single
47
+ assert_equal new_double, record.double
48
+ end
49
+ end
@@ -0,0 +1,405 @@
1
+ require "cases/helper"
2
+ require 'support/ddl_helper'
3
+ require 'support/connection_helper'
4
+
5
+ module ActiveRecord
6
+ module ConnectionAdapters
7
+ class PostgreSQLAdapterTest < ActiveRecord::PostgreSQLTestCase
8
+ self.use_transactional_tests = false
9
+ include DdlHelper
10
+ include ConnectionHelper
11
+
12
+ def setup
13
+ @connection = ActiveRecord::Base.connection
14
+ end
15
+
16
+ def test_bad_connection
17
+ assert_raise ActiveRecord::NoDatabaseError do
18
+ configuration = ActiveRecord::Base.configurations['arunit'].merge(database: 'should_not_exist-cinco-dog-db')
19
+ connection = ActiveRecord::Base.postgresql_connection(configuration)
20
+ connection.exec_query('SELECT 1')
21
+ end
22
+ end
23
+
24
+ def test_valid_column
25
+ with_example_table do
26
+ column = @connection.columns('ex').find { |col| col.name == 'id' }
27
+ assert @connection.valid_type?(column.type)
28
+ end
29
+ end
30
+
31
+ def test_invalid_column
32
+ assert_not @connection.valid_type?(:foobar)
33
+ end
34
+
35
+ def test_primary_key
36
+ with_example_table do
37
+ assert_equal 'id', @connection.primary_key('ex')
38
+ end
39
+ end
40
+
41
+ def test_primary_key_works_tables_containing_capital_letters
42
+ assert_equal 'id', @connection.primary_key('CamelCase')
43
+ end
44
+
45
+ def test_non_standard_primary_key
46
+ with_example_table 'data character varying(255) primary key' do
47
+ assert_equal 'data', @connection.primary_key('ex')
48
+ end
49
+ end
50
+
51
+ def test_primary_key_returns_nil_for_no_pk
52
+ with_example_table 'id integer' do
53
+ assert_nil @connection.primary_key('ex')
54
+ end
55
+ end
56
+
57
+ def test_primary_key_raises_error_if_table_not_found
58
+ assert_raises(ActiveRecord::StatementInvalid) do
59
+ @connection.primary_key('unobtainium')
60
+ end
61
+ end
62
+
63
+ def test_exec_insert_with_returning_disabled
64
+ connection = connection_without_insert_returning
65
+ result = connection.exec_insert("insert into postgresql_partitioned_table_parent (number) VALUES (1)", nil, [], 'id', 'postgresql_partitioned_table_parent_id_seq')
66
+ expect = connection.query('select max(id) from postgresql_partitioned_table_parent').first.first
67
+ assert_equal expect.to_i, result.rows.first.first
68
+ end
69
+
70
+ def test_exec_insert_with_returning_disabled_and_no_sequence_name_given
71
+ connection = connection_without_insert_returning
72
+ result = connection.exec_insert("insert into postgresql_partitioned_table_parent (number) VALUES (1)", nil, [], 'id')
73
+ expect = connection.query('select max(id) from postgresql_partitioned_table_parent').first.first
74
+ assert_equal expect.to_i, result.rows.first.first
75
+ end
76
+
77
+ def test_exec_insert_default_values_with_returning_disabled_and_no_sequence_name_given
78
+ connection = connection_without_insert_returning
79
+ result = connection.exec_insert("insert into postgresql_partitioned_table_parent DEFAULT VALUES", nil, [], 'id')
80
+ expect = connection.query('select max(id) from postgresql_partitioned_table_parent').first.first
81
+ assert_equal expect.to_i, result.rows.first.first
82
+ end
83
+
84
+ def test_exec_insert_default_values_quoted_schema_with_returning_disabled_and_no_sequence_name_given
85
+ connection = connection_without_insert_returning
86
+ result = connection.exec_insert('insert into "public"."postgresql_partitioned_table_parent" DEFAULT VALUES', nil, [], 'id')
87
+ expect = connection.query('select max(id) from postgresql_partitioned_table_parent').first.first
88
+ assert_equal expect.to_i, result.rows.first.first
89
+ end
90
+
91
+ def test_sql_for_insert_with_returning_disabled
92
+ connection = connection_without_insert_returning
93
+ sql, binds = connection.sql_for_insert('sql', nil, nil, nil, 'binds')
94
+ assert_equal ['sql', 'binds'], [sql, binds]
95
+ end
96
+
97
+ def test_serial_sequence
98
+ assert_equal 'public.accounts_id_seq',
99
+ @connection.serial_sequence('accounts', 'id')
100
+
101
+ assert_raises(ActiveRecord::StatementInvalid) do
102
+ @connection.serial_sequence('zomg', 'id')
103
+ end
104
+ end
105
+
106
+ def test_default_sequence_name
107
+ assert_equal 'public.accounts_id_seq',
108
+ @connection.default_sequence_name('accounts', 'id')
109
+
110
+ assert_equal 'public.accounts_id_seq',
111
+ @connection.default_sequence_name('accounts')
112
+ end
113
+
114
+ def test_default_sequence_name_bad_table
115
+ assert_equal 'zomg_id_seq',
116
+ @connection.default_sequence_name('zomg', 'id')
117
+
118
+ assert_equal 'zomg_id_seq',
119
+ @connection.default_sequence_name('zomg')
120
+ end
121
+
122
+ def test_pk_and_sequence_for
123
+ with_example_table do
124
+ pk, seq = @connection.pk_and_sequence_for('ex')
125
+ assert_equal 'id', pk
126
+ assert_equal @connection.default_sequence_name('ex', 'id'), seq.to_s
127
+ end
128
+ end
129
+
130
+ def test_pk_and_sequence_for_with_non_standard_primary_key
131
+ with_example_table 'code serial primary key' do
132
+ pk, seq = @connection.pk_and_sequence_for('ex')
133
+ assert_equal 'code', pk
134
+ assert_equal @connection.default_sequence_name('ex', 'code'), seq.to_s
135
+ end
136
+ end
137
+
138
+ def test_pk_and_sequence_for_returns_nil_if_no_seq
139
+ with_example_table 'id integer primary key' do
140
+ assert_nil @connection.pk_and_sequence_for('ex')
141
+ end
142
+ end
143
+
144
+ def test_pk_and_sequence_for_returns_nil_if_no_pk
145
+ with_example_table 'id integer' do
146
+ assert_nil @connection.pk_and_sequence_for('ex')
147
+ end
148
+ end
149
+
150
+ def test_pk_and_sequence_for_returns_nil_if_table_not_found
151
+ assert_nil @connection.pk_and_sequence_for('unobtainium')
152
+ end
153
+
154
+ def test_pk_and_sequence_for_with_collision_pg_class_oid
155
+ @connection.exec_query('create table ex(id serial primary key)')
156
+ @connection.exec_query('create table ex2(id serial primary key)')
157
+
158
+ correct_depend_record = [
159
+ "'pg_class'::regclass",
160
+ "'ex_id_seq'::regclass",
161
+ '0',
162
+ "'pg_class'::regclass",
163
+ "'ex'::regclass",
164
+ '1',
165
+ "'a'"
166
+ ]
167
+
168
+ collision_depend_record = [
169
+ "'pg_attrdef'::regclass",
170
+ "'ex2_id_seq'::regclass",
171
+ '0',
172
+ "'pg_class'::regclass",
173
+ "'ex'::regclass",
174
+ '1',
175
+ "'a'"
176
+ ]
177
+
178
+ @connection.exec_query(
179
+ "DELETE FROM pg_depend WHERE objid = 'ex_id_seq'::regclass AND refobjid = 'ex'::regclass AND deptype = 'a'"
180
+ )
181
+ @connection.exec_query(
182
+ "INSERT INTO pg_depend VALUES(#{collision_depend_record.join(',')})"
183
+ )
184
+ @connection.exec_query(
185
+ "INSERT INTO pg_depend VALUES(#{correct_depend_record.join(',')})"
186
+ )
187
+
188
+ seq = @connection.pk_and_sequence_for('ex').last
189
+ assert_equal PostgreSQL::Name.new("public", "ex_id_seq"), seq
190
+
191
+ @connection.exec_query(
192
+ "DELETE FROM pg_depend WHERE objid = 'ex2_id_seq'::regclass AND refobjid = 'ex'::regclass AND deptype = 'a'"
193
+ )
194
+ ensure
195
+ @connection.drop_table 'ex', if_exists: true
196
+ @connection.drop_table 'ex2', if_exists: true
197
+ end
198
+
199
+ def test_table_alias_length
200
+ assert_nothing_raised do
201
+ @connection.table_alias_length
202
+ end
203
+ end
204
+
205
+ def test_exec_no_binds
206
+ with_example_table do
207
+ result = @connection.exec_query('SELECT id, data FROM ex')
208
+ assert_equal 0, result.rows.length
209
+ assert_equal 2, result.columns.length
210
+ assert_equal %w{ id data }, result.columns
211
+
212
+ string = @connection.quote('foo')
213
+ @connection.exec_query("INSERT INTO ex (id, data) VALUES (1, #{string})")
214
+ result = @connection.exec_query('SELECT id, data FROM ex')
215
+ assert_equal 1, result.rows.length
216
+ assert_equal 2, result.columns.length
217
+
218
+ assert_equal [[1, 'foo']], result.rows
219
+ end
220
+ end
221
+
222
+ if ActiveRecord::Base.connection.prepared_statements
223
+ def test_exec_with_binds
224
+ with_example_table do
225
+ string = @connection.quote('foo')
226
+ @connection.exec_query("INSERT INTO ex (id, data) VALUES (1, #{string})")
227
+
228
+ bind = Relation::QueryAttribute.new("id", 1, Type::Value.new)
229
+ result = @connection.exec_query('SELECT id, data FROM ex WHERE id = $1', nil, [bind])
230
+
231
+ assert_equal 1, result.rows.length
232
+ assert_equal 2, result.columns.length
233
+
234
+ assert_equal [[1, 'foo']], result.rows
235
+ end
236
+ end
237
+
238
+ def test_exec_typecasts_bind_vals
239
+ with_example_table do
240
+ string = @connection.quote('foo')
241
+ @connection.exec_query("INSERT INTO ex (id, data) VALUES (1, #{string})")
242
+
243
+ bind = Relation::QueryAttribute.new("id", "1-fuu", Type::Integer.new)
244
+ result = @connection.exec_query('SELECT id, data FROM ex WHERE id = $1', nil, [bind])
245
+
246
+ assert_equal 1, result.rows.length
247
+ assert_equal 2, result.columns.length
248
+
249
+ assert_equal [[1, 'foo']], result.rows
250
+ end
251
+ end
252
+ end
253
+
254
+ def test_partial_index
255
+ with_example_table do
256
+ @connection.add_index 'ex', %w{ id number }, :name => 'partial', :where => "number > 100"
257
+ index = @connection.indexes('ex').find { |idx| idx.name == 'partial' }
258
+ assert_equal "(number > 100)", index.where
259
+ end
260
+ end
261
+
262
+ def test_expression_index
263
+ with_example_table do
264
+ @connection.add_index 'ex', 'mod(id, 10), abs(number)', name: 'expression'
265
+ index = @connection.indexes('ex').find { |idx| idx.name == 'expression' }
266
+ assert_equal 'mod(id, 10), abs(number)', index.columns
267
+ end
268
+ end
269
+
270
+ def test_index_with_opclass
271
+ with_example_table do
272
+ @connection.add_index "ex", "data varchar_pattern_ops"
273
+ index = @connection.indexes("ex").find { |idx| idx.name == "index_ex_on_data_varchar_pattern_ops" }
274
+ assert_equal "data varchar_pattern_ops", index.columns
275
+
276
+ @connection.remove_index "ex", "data varchar_pattern_ops"
277
+ assert_not @connection.indexes("ex").find { |idx| idx.name == "index_ex_on_data_varchar_pattern_ops" }
278
+ end
279
+ end
280
+
281
+ def test_columns_for_distinct_zero_orders
282
+ assert_equal "posts.id",
283
+ @connection.columns_for_distinct("posts.id", [])
284
+ end
285
+
286
+ def test_columns_for_distinct_one_order
287
+ assert_equal "posts.id, posts.created_at AS alias_0",
288
+ @connection.columns_for_distinct("posts.id", ["posts.created_at desc"])
289
+ end
290
+
291
+ def test_columns_for_distinct_few_orders
292
+ assert_equal "posts.id, posts.created_at AS alias_0, posts.position AS alias_1",
293
+ @connection.columns_for_distinct("posts.id", ["posts.created_at desc", "posts.position asc"])
294
+ end
295
+
296
+ def test_columns_for_distinct_with_case
297
+ assert_equal(
298
+ 'posts.id, CASE WHEN author.is_active THEN UPPER(author.name) ELSE UPPER(author.email) END AS alias_0',
299
+ @connection.columns_for_distinct('posts.id',
300
+ ["CASE WHEN author.is_active THEN UPPER(author.name) ELSE UPPER(author.email) END"])
301
+ )
302
+ end
303
+
304
+ def test_columns_for_distinct_blank_not_nil_orders
305
+ assert_equal "posts.id, posts.created_at AS alias_0",
306
+ @connection.columns_for_distinct("posts.id", ["posts.created_at desc", "", " "])
307
+ end
308
+
309
+ def test_columns_for_distinct_with_arel_order
310
+ order = Object.new
311
+ def order.to_sql
312
+ "posts.created_at desc"
313
+ end
314
+ assert_equal "posts.id, posts.created_at AS alias_0",
315
+ @connection.columns_for_distinct("posts.id", [order])
316
+ end
317
+
318
+ def test_columns_for_distinct_with_nulls
319
+ assert_equal "posts.title, posts.updater_id AS alias_0", @connection.columns_for_distinct("posts.title", ["posts.updater_id desc nulls first"])
320
+ assert_equal "posts.title, posts.updater_id AS alias_0", @connection.columns_for_distinct("posts.title", ["posts.updater_id desc nulls last"])
321
+ end
322
+
323
+ def test_columns_for_distinct_without_order_specifiers
324
+ assert_equal "posts.title, posts.updater_id AS alias_0",
325
+ @connection.columns_for_distinct("posts.title", ["posts.updater_id"])
326
+
327
+ assert_equal "posts.title, posts.updater_id AS alias_0",
328
+ @connection.columns_for_distinct("posts.title", ["posts.updater_id nulls last"])
329
+
330
+ assert_equal "posts.title, posts.updater_id AS alias_0",
331
+ @connection.columns_for_distinct("posts.title", ["posts.updater_id nulls first"])
332
+ end
333
+
334
+ def test_raise_error_when_cannot_translate_exception
335
+ assert_raise TypeError do
336
+ @connection.send(:log, nil) { @connection.execute(nil) }
337
+ end
338
+ end
339
+
340
+ def test_reload_type_map_for_newly_defined_types
341
+ @connection.execute "CREATE TYPE feeling AS ENUM ('good', 'bad')"
342
+ result = @connection.select_all "SELECT 'good'::feeling"
343
+ assert_instance_of(PostgreSQLAdapter::OID::Enum,
344
+ result.column_types["feeling"])
345
+ ensure
346
+ @connection.execute "DROP TYPE IF EXISTS feeling"
347
+ reset_connection
348
+ end
349
+
350
+ def test_only_reload_type_map_once_for_every_unknown_type
351
+ silence_warnings do
352
+ assert_queries 2, ignore_none: true do
353
+ @connection.select_all "SELECT NULL::anyelement"
354
+ end
355
+ assert_queries 1, ignore_none: true do
356
+ @connection.select_all "SELECT NULL::anyelement"
357
+ end
358
+ assert_queries 2, ignore_none: true do
359
+ @connection.select_all "SELECT NULL::anyarray"
360
+ end
361
+ end
362
+ ensure
363
+ reset_connection
364
+ end
365
+
366
+ def test_only_warn_on_first_encounter_of_unknown_oid
367
+ warning = capture(:stderr) {
368
+ @connection.select_all "SELECT NULL::anyelement"
369
+ @connection.select_all "SELECT NULL::anyelement"
370
+ @connection.select_all "SELECT NULL::anyelement"
371
+ }
372
+ assert_match(/\Aunknown OID \d+: failed to recognize type of 'anyelement'. It will be treated as String.\n\z/, warning)
373
+ ensure
374
+ reset_connection
375
+ end
376
+
377
+ def test_unparsed_defaults_are_at_least_set_when_saving
378
+ with_example_table "id SERIAL PRIMARY KEY, number INTEGER NOT NULL DEFAULT (4 + 4) * 2 / 4" do
379
+ number_klass = Class.new(ActiveRecord::Base) do
380
+ self.table_name = 'ex'
381
+ end
382
+ column = number_klass.columns_hash["number"]
383
+ assert_nil column.default
384
+ assert_nil column.default_function
385
+
386
+ first_number = number_klass.new
387
+ assert_nil first_number.number
388
+
389
+ first_number.save!
390
+ assert_equal 4, first_number.reload.number
391
+ end
392
+ end
393
+
394
+ private
395
+
396
+ def with_example_table(definition = 'id serial primary key, number integer, data character varying(255)', &block)
397
+ super(@connection, 'ex', definition, &block)
398
+ end
399
+
400
+ def connection_without_insert_returning
401
+ ActiveRecord::Base.postgresql_connection(ActiveRecord::Base.configurations['arunit'].merge(:insert_returning => false))
402
+ end
403
+ end
404
+ end
405
+ end