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,59 @@
1
+ require "cases/helper"
2
+
3
+ class SchemaMigrationsTest < ActiveRecord::Mysql2TestCase
4
+ def test_renaming_index_on_foreign_key
5
+ connection.add_index "engines", "car_id"
6
+ connection.add_foreign_key :engines, :cars, name: "fk_engines_cars"
7
+
8
+ connection.rename_index("engines", "index_engines_on_car_id", "idx_renamed")
9
+ assert_equal ["idx_renamed"], connection.indexes("engines").map(&:name)
10
+ ensure
11
+ connection.remove_foreign_key :engines, name: "fk_engines_cars"
12
+ end
13
+
14
+ def test_initializes_schema_migrations_for_encoding_utf8mb4
15
+ with_encoding_utf8mb4 do
16
+ table_name = ActiveRecord::SchemaMigration.table_name
17
+ connection.drop_table table_name, if_exists: true
18
+
19
+ connection.initialize_schema_migrations_table
20
+
21
+ assert connection.column_exists?(table_name, :version, :string, collation: 'utf8_general_ci')
22
+ end
23
+ end
24
+
25
+ def test_initializes_internal_metadata_for_encoding_utf8mb4
26
+ with_encoding_utf8mb4 do
27
+ table_name = ActiveRecord::InternalMetadata.table_name
28
+ connection.drop_table table_name, if_exists: true
29
+
30
+ connection.initialize_internal_metadata_table
31
+
32
+ assert connection.column_exists?(table_name, :key, :string, collation: 'utf8_general_ci')
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def with_encoding_utf8mb4
39
+ database_name = connection.current_database
40
+ database_info = connection.select_one("SELECT * FROM information_schema.schemata WHERE schema_name = '#{database_name}'")
41
+
42
+ original_charset = database_info["DEFAULT_CHARACTER_SET_NAME"]
43
+ original_collation = database_info["DEFAULT_COLLATION_NAME"]
44
+
45
+ execute("ALTER DATABASE #{database_name} DEFAULT CHARACTER SET utf8mb4")
46
+
47
+ yield
48
+ ensure
49
+ execute("ALTER DATABASE #{database_name} DEFAULT CHARACTER SET #{original_charset} COLLATE #{original_collation}")
50
+ end
51
+
52
+ def connection
53
+ @connection ||= ActiveRecord::Base.connection
54
+ end
55
+
56
+ def execute(sql)
57
+ connection.execute(sql)
58
+ end
59
+ end
@@ -0,0 +1,126 @@
1
+ require "cases/helper"
2
+ require 'models/post'
3
+ require 'models/comment'
4
+
5
+ module ActiveRecord
6
+ module ConnectionAdapters
7
+ class Mysql2SchemaTest < ActiveRecord::Mysql2TestCase
8
+ fixtures :posts
9
+
10
+ def setup
11
+ @connection = ActiveRecord::Base.connection
12
+ db = Post.connection_pool.spec.config[:database]
13
+ table = Post.table_name
14
+ @db_name = db
15
+
16
+ @omgpost = Class.new(ActiveRecord::Base) do
17
+ self.inheritance_column = :disabled
18
+ self.table_name = "#{db}.#{table}"
19
+ def self.name; 'Post'; end
20
+ end
21
+ end
22
+
23
+ def test_float_limits
24
+ @connection.create_table :mysql_doubles do |t|
25
+ t.float :float_no_limit
26
+ t.float :float_short, limit: 5
27
+ t.float :float_long, limit: 53
28
+
29
+ t.float :float_23, limit: 23
30
+ t.float :float_24, limit: 24
31
+ t.float :float_25, limit: 25
32
+ end
33
+
34
+ column_no_limit = @connection.columns(:mysql_doubles).find { |c| c.name == 'float_no_limit' }
35
+ column_short = @connection.columns(:mysql_doubles).find { |c| c.name == 'float_short' }
36
+ column_long = @connection.columns(:mysql_doubles).find { |c| c.name == 'float_long' }
37
+
38
+ column_23 = @connection.columns(:mysql_doubles).find { |c| c.name == 'float_23' }
39
+ column_24 = @connection.columns(:mysql_doubles).find { |c| c.name == 'float_24' }
40
+ column_25 = @connection.columns(:mysql_doubles).find { |c| c.name == 'float_25' }
41
+
42
+ # Mysql floats are precision 0..24, Mysql doubles are precision 25..53
43
+ assert_equal 24, column_no_limit.limit
44
+ assert_equal 24, column_short.limit
45
+ assert_equal 53, column_long.limit
46
+
47
+ assert_equal 24, column_23.limit
48
+ assert_equal 24, column_24.limit
49
+ assert_equal 53, column_25.limit
50
+ ensure
51
+ @connection.drop_table "mysql_doubles", if_exists: true
52
+ end
53
+
54
+ def test_schema
55
+ assert @omgpost.first
56
+ end
57
+
58
+ def test_primary_key
59
+ assert_equal 'id', @omgpost.primary_key
60
+ end
61
+
62
+ def test_data_source_exists?
63
+ name = @omgpost.table_name
64
+ assert @connection.data_source_exists?(name), "#{name} data_source should exist"
65
+ end
66
+
67
+ def test_data_source_exists_wrong_schema
68
+ assert(!@connection.data_source_exists?("#{@db_name}.zomg"), "data_source should not exist")
69
+ end
70
+
71
+ def test_dump_indexes
72
+ index_a_name = 'index_key_tests_on_snack'
73
+ index_b_name = 'index_key_tests_on_pizza'
74
+ index_c_name = 'index_key_tests_on_awesome'
75
+
76
+ table = 'key_tests'
77
+
78
+ indexes = @connection.indexes(table).sort_by(&:name)
79
+ assert_equal 3,indexes.size
80
+
81
+ index_a = indexes.select{|i| i.name == index_a_name}[0]
82
+ index_b = indexes.select{|i| i.name == index_b_name}[0]
83
+ index_c = indexes.select{|i| i.name == index_c_name}[0]
84
+ assert_equal :btree, index_a.using
85
+ assert_nil index_a.type
86
+ assert_equal :btree, index_b.using
87
+ assert_nil index_b.type
88
+
89
+ assert_nil index_c.using
90
+ assert_equal :fulltext, index_c.type
91
+ end
92
+
93
+ unless mysql_enforcing_gtid_consistency?
94
+ def test_drop_temporary_table
95
+ @connection.transaction do
96
+ @connection.create_table(:temp_table, temporary: true)
97
+ # if it doesn't properly say DROP TEMPORARY TABLE, the transaction commit
98
+ # will complain that no transaction is active
99
+ @connection.drop_table(:temp_table, temporary: true)
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ class Mysql2AnsiQuotesTest < ActiveRecord::Mysql2TestCase
108
+ def setup
109
+ @connection = ActiveRecord::Base.connection
110
+ @connection.execute("SET SESSION sql_mode='ANSI_QUOTES'")
111
+ end
112
+
113
+ def teardown
114
+ @connection.reconnect!
115
+ end
116
+
117
+ def test_primary_key_method_with_ansi_quotes
118
+ assert_equal "id", @connection.primary_key("topics")
119
+ end
120
+
121
+ def test_foreign_keys_method_with_ansi_quotes
122
+ fks = @connection.foreign_keys("lessons_students")
123
+ assert_equal([["lessons_students", "students", :cascade]],
124
+ fks.map {|fk| [fk.from_table, fk.to_table, fk.on_delete] })
125
+ end
126
+ end
@@ -0,0 +1,36 @@
1
+ require "cases/helper"
2
+ require 'models/topic'
3
+ require 'models/reply'
4
+
5
+ class Mysql2StoredProcedureTest < ActiveRecord::Mysql2TestCase
6
+ fixtures :topics
7
+
8
+ def setup
9
+ @connection = ActiveRecord::Base.connection
10
+ unless ActiveRecord::Base.connection.version >= '5.6.0'
11
+ skip("no stored procedure support")
12
+ end
13
+ end
14
+
15
+ # Test that MySQL allows multiple results for stored procedures
16
+ #
17
+ # In MySQL 5.6, CLIENT_MULTI_RESULTS is enabled by default.
18
+ # http://dev.mysql.com/doc/refman/5.6/en/call.html
19
+ def test_multi_results
20
+ rows = @connection.select_rows('CALL ten();')
21
+ assert_equal 10, rows[0][0].to_i, "ten() did not return 10 as expected: #{rows.inspect}"
22
+ assert @connection.active?, "Bad connection use by 'Mysql2Adapter.select_rows'"
23
+ end
24
+
25
+ def test_multi_results_from_select_one
26
+ row = @connection.select_one('CALL topics(1);')
27
+ assert_equal 'David', row['author_name']
28
+ assert @connection.active?, "Bad connection use by 'Mysql2Adapter.select_one'"
29
+ end
30
+
31
+ def test_multi_results_from_find_by_sql
32
+ topics = Topic.find_by_sql 'CALL topics(3);'
33
+ assert_equal 3, topics.size
34
+ assert @connection.active?, "Bad connection use by 'Mysql2Adapter.select'"
35
+ end
36
+ end
@@ -0,0 +1,14 @@
1
+ require "cases/helper"
2
+
3
+ class Mysql2SqlTypesTest < ActiveRecord::Mysql2TestCase
4
+ def test_binary_types
5
+ assert_equal 'varbinary(64)', type_to_sql(:binary, 64)
6
+ assert_equal 'varbinary(4095)', type_to_sql(:binary, 4095)
7
+ assert_equal 'blob', type_to_sql(:binary, 4096)
8
+ assert_equal 'blob', type_to_sql(:binary)
9
+ end
10
+
11
+ def type_to_sql(*args)
12
+ ActiveRecord::Base.connection.type_to_sql(*args)
13
+ end
14
+ end
@@ -0,0 +1,42 @@
1
+ require "cases/helper"
2
+ require 'support/schema_dumping_helper'
3
+
4
+ class Mysql2TableOptionsTest < ActiveRecord::Mysql2TestCase
5
+ include SchemaDumpingHelper
6
+
7
+ def setup
8
+ @connection = ActiveRecord::Base.connection
9
+ end
10
+
11
+ def teardown
12
+ @connection.drop_table "mysql_table_options", if_exists: true
13
+ end
14
+
15
+ test "table options with ENGINE" do
16
+ @connection.create_table "mysql_table_options", force: true, options: "ENGINE=MyISAM"
17
+ output = dump_table_schema("mysql_table_options")
18
+ options = %r{create_table "mysql_table_options", force: :cascade, options: "(?<options>.*)"}.match(output)[:options]
19
+ assert_match %r{ENGINE=MyISAM}, options
20
+ end
21
+
22
+ test "table options with ROW_FORMAT" do
23
+ @connection.create_table "mysql_table_options", force: true, options: "ROW_FORMAT=REDUNDANT"
24
+ output = dump_table_schema("mysql_table_options")
25
+ options = %r{create_table "mysql_table_options", force: :cascade, options: "(?<options>.*)"}.match(output)[:options]
26
+ assert_match %r{ROW_FORMAT=REDUNDANT}, options
27
+ end
28
+
29
+ test "table options with CHARSET" do
30
+ @connection.create_table "mysql_table_options", force: true, options: "CHARSET=utf8mb4"
31
+ output = dump_table_schema("mysql_table_options")
32
+ options = %r{create_table "mysql_table_options", force: :cascade, options: "(?<options>.*)"}.match(output)[:options]
33
+ assert_match %r{CHARSET=utf8mb4}, options
34
+ end
35
+
36
+ test "table options with COLLATE" do
37
+ @connection.create_table "mysql_table_options", force: true, options: "COLLATE=utf8mb4_bin"
38
+ output = dump_table_schema("mysql_table_options")
39
+ options = %r{create_table "mysql_table_options", force: :cascade, options: "(?<options>.*)"}.match(output)[:options]
40
+ assert_match %r{COLLATE=utf8mb4_bin}, options
41
+ end
42
+ end
@@ -0,0 +1,66 @@
1
+ require "cases/helper"
2
+ require "support/schema_dumping_helper"
3
+
4
+ class Mysql2UnsignedTypeTest < ActiveRecord::Mysql2TestCase
5
+ include SchemaDumpingHelper
6
+ self.use_transactional_tests = false
7
+
8
+ class UnsignedType < ActiveRecord::Base
9
+ end
10
+
11
+ setup do
12
+ @connection = ActiveRecord::Base.connection
13
+ @connection.create_table("unsigned_types", force: true) do |t|
14
+ t.integer :unsigned_integer, unsigned: true
15
+ t.bigint :unsigned_bigint, unsigned: true
16
+ t.float :unsigned_float, unsigned: true
17
+ t.decimal :unsigned_decimal, unsigned: true, precision: 10, scale: 2
18
+ end
19
+ end
20
+
21
+ teardown do
22
+ @connection.drop_table "unsigned_types", if_exists: true
23
+ end
24
+
25
+ test "unsigned int max value is in range" do
26
+ assert expected = UnsignedType.create(unsigned_integer: 4294967295)
27
+ assert_equal expected, UnsignedType.find_by(unsigned_integer: 4294967295)
28
+ end
29
+
30
+ test "minus value is out of range" do
31
+ assert_raise(ActiveModel::RangeError) do
32
+ UnsignedType.create(unsigned_integer: -10)
33
+ end
34
+ assert_raise(ActiveModel::RangeError) do
35
+ UnsignedType.create(unsigned_bigint: -10)
36
+ end
37
+ assert_raise(ActiveRecord::StatementInvalid) do
38
+ UnsignedType.create(unsigned_float: -10.0)
39
+ end
40
+ assert_raise(ActiveRecord::StatementInvalid) do
41
+ UnsignedType.create(unsigned_decimal: -10.0)
42
+ end
43
+ end
44
+
45
+ test "schema definition can use unsigned as the type" do
46
+ @connection.change_table("unsigned_types") do |t|
47
+ t.unsigned_integer :unsigned_integer_t
48
+ t.unsigned_bigint :unsigned_bigint_t
49
+ t.unsigned_float :unsigned_float_t
50
+ t.unsigned_decimal :unsigned_decimal_t, precision: 10, scale: 2
51
+ t.column :unsigned_zerofill, "int unsigned zerofill"
52
+ end
53
+
54
+ @connection.columns("unsigned_types").select { |c| /^unsigned_/ === c.name }.each do |column|
55
+ assert column.unsigned?
56
+ end
57
+ end
58
+
59
+ test "schema dump includes unsigned option" do
60
+ schema = dump_table_schema "unsigned_types"
61
+ assert_match %r{t.integer\s+"unsigned_integer",\s+unsigned: true$}, schema
62
+ assert_match %r{t.bigint\s+"unsigned_bigint",\s+unsigned: true$}, schema
63
+ assert_match %r{t.float\s+"unsigned_float",\s+limit: 24,\s+unsigned: true$}, schema
64
+ assert_match %r{t.decimal\s+"unsigned_decimal",\s+precision: 10,\s+scale: 2,\s+unsigned: true$}, schema
65
+ end
66
+ end
@@ -0,0 +1,98 @@
1
+ require 'cases/helper'
2
+
3
+ class PostgresqlActiveSchemaTest < ActiveRecord::PostgreSQLTestCase
4
+ def setup
5
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
6
+ def execute(sql, name = nil) sql end
7
+ end
8
+ end
9
+
10
+ teardown do
11
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
12
+ remove_method :execute
13
+ end
14
+ end
15
+
16
+ def test_create_database_with_encoding
17
+ assert_equal %(CREATE DATABASE "matt" ENCODING = 'utf8'), create_database(:matt)
18
+ assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'latin1'), create_database(:aimonetti, :encoding => :latin1)
19
+ assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'latin1'), create_database(:aimonetti, 'encoding' => :latin1)
20
+ end
21
+
22
+ def test_create_database_with_collation_and_ctype
23
+ assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'UTF8' LC_COLLATE = 'ja_JP.UTF8' LC_CTYPE = 'ja_JP.UTF8'), create_database(:aimonetti, :encoding => :"UTF8", :collation => :"ja_JP.UTF8", :ctype => :"ja_JP.UTF8")
24
+ end
25
+
26
+ def test_add_index
27
+ # add_index calls index_name_exists? which can't work since execute is stubbed
28
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send(:define_method, :index_name_exists?) { |*| false }
29
+
30
+ expected = %(CREATE UNIQUE INDEX "index_people_on_last_name" ON "people" ("last_name") WHERE state = 'active')
31
+ assert_equal expected, add_index(:people, :last_name, unique: true, where: "state = 'active'")
32
+
33
+ expected = %(CREATE UNIQUE INDEX "index_people_on_lower_last_name" ON "people" (lower(last_name)))
34
+ assert_equal expected, add_index(:people, 'lower(last_name)', unique: true)
35
+
36
+ expected = %(CREATE UNIQUE INDEX "index_people_on_last_name_varchar_pattern_ops" ON "people" (last_name varchar_pattern_ops))
37
+ assert_equal expected, add_index(:people, 'last_name varchar_pattern_ops', unique: true)
38
+
39
+ expected = %(CREATE INDEX CONCURRENTLY "index_people_on_last_name" ON "people" ("last_name"))
40
+ assert_equal expected, add_index(:people, :last_name, algorithm: :concurrently)
41
+
42
+ expected = %(CREATE INDEX "index_people_on_last_name_and_first_name" ON "people" ("last_name" DESC, "first_name" ASC))
43
+ assert_equal expected, add_index(:people, [:last_name, :first_name], order: { last_name: :desc, first_name: :asc })
44
+ assert_equal expected, add_index(:people, ["last_name", :first_name], order: { last_name: :desc, "first_name" => :asc })
45
+
46
+ %w(gin gist hash btree).each do |type|
47
+ expected = %(CREATE INDEX "index_people_on_last_name" ON "people" USING #{type} ("last_name"))
48
+ assert_equal expected, add_index(:people, :last_name, using: type)
49
+
50
+ expected = %(CREATE INDEX CONCURRENTLY "index_people_on_last_name" ON "people" USING #{type} ("last_name"))
51
+ assert_equal expected, add_index(:people, :last_name, using: type, algorithm: :concurrently)
52
+
53
+ expected = %(CREATE UNIQUE INDEX "index_people_on_last_name" ON "people" USING #{type} ("last_name") WHERE state = 'active')
54
+ assert_equal expected, add_index(:people, :last_name, using: type, unique: true, where: "state = 'active'")
55
+
56
+ expected = %(CREATE UNIQUE INDEX "index_people_on_lower_last_name" ON "people" USING #{type} (lower(last_name)))
57
+ assert_equal expected, add_index(:people, 'lower(last_name)', using: type, unique: true)
58
+ end
59
+
60
+ assert_raise ArgumentError do
61
+ add_index(:people, :last_name, algorithm: :copy)
62
+ end
63
+
64
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send :remove_method, :index_name_exists?
65
+ end
66
+
67
+ def test_remove_index
68
+ # remove_index calls index_name_for_remove which can't work since execute is stubbed
69
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send(:define_method, :index_name_for_remove) do |*|
70
+ 'index_people_on_last_name'
71
+ end
72
+
73
+ expected = %(DROP INDEX CONCURRENTLY "index_people_on_last_name")
74
+ assert_equal expected, remove_index(:people, name: "index_people_on_last_name", algorithm: :concurrently)
75
+
76
+ assert_raise ArgumentError do
77
+ add_index(:people, :last_name, algorithm: :copy)
78
+ end
79
+
80
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send :remove_method, :index_name_for_remove
81
+ end
82
+
83
+ def test_remove_index_when_name_is_specified
84
+ expected = %(DROP INDEX CONCURRENTLY "index_people_on_last_name")
85
+ assert_equal expected, remove_index(:people, name: "index_people_on_last_name", algorithm: :concurrently)
86
+ end
87
+
88
+ def test_remove_index_with_wrong_option
89
+ assert_raises ArgumentError do
90
+ remove_index(:people, coulmn: :last_name)
91
+ end
92
+ end
93
+
94
+ private
95
+ def method_missing(method_symbol, *arguments)
96
+ ActiveRecord::Base.connection.send(method_symbol, *arguments)
97
+ end
98
+ end