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,45 @@
1
+ require "cases/helper"
2
+
3
+ class Mysql2DatetimePrecisionQuotingTest < ActiveRecord::Mysql2TestCase
4
+ setup do
5
+ @connection = ActiveRecord::Base.connection
6
+ end
7
+
8
+ test 'microsecond precision for MySQL gte 5.6.4' do
9
+ stub_version '5.6.4'
10
+ assert_microsecond_precision
11
+ end
12
+
13
+ test 'no microsecond precision for MySQL lt 5.6.4' do
14
+ stub_version '5.6.3'
15
+ assert_no_microsecond_precision
16
+ end
17
+
18
+ test 'microsecond precision for MariaDB gte 5.3.0' do
19
+ stub_version '5.5.5-10.1.8-MariaDB-log'
20
+ assert_microsecond_precision
21
+ end
22
+
23
+ test 'no microsecond precision for MariaDB lt 5.3.0' do
24
+ stub_version '5.2.9-MariaDB'
25
+ assert_no_microsecond_precision
26
+ end
27
+
28
+ private
29
+ def assert_microsecond_precision
30
+ assert_match_quoted_microsecond_datetime(/\.000001\z/)
31
+ end
32
+
33
+ def assert_no_microsecond_precision
34
+ assert_match_quoted_microsecond_datetime(/\d\z/)
35
+ end
36
+
37
+ def assert_match_quoted_microsecond_datetime(match)
38
+ assert_match match, @connection.quoted_date(Time.now.change(usec: 1))
39
+ end
40
+
41
+ def stub_version(full_version_string)
42
+ @connection.stubs(:full_version).returns(full_version_string)
43
+ @connection.remove_instance_variable(:@version) if @connection.instance_variable_defined?(:@version)
44
+ end
45
+ end
@@ -0,0 +1,26 @@
1
+ require "cases/helper"
2
+
3
+ class Mysql2EnumTest < ActiveRecord::Mysql2TestCase
4
+ class EnumTest < ActiveRecord::Base
5
+ end
6
+
7
+ def test_enum_limit
8
+ column = EnumTest.columns_hash['enum_column']
9
+ assert_equal 8, column.limit
10
+ end
11
+
12
+ def test_should_not_be_blob_or_text_column
13
+ column = EnumTest.columns_hash['enum_column']
14
+ assert_not column.blob_or_text_column?
15
+ end
16
+
17
+ def test_should_not_be_unsigned
18
+ column = EnumTest.columns_hash['enum_column']
19
+ assert_not column.unsigned?
20
+ end
21
+
22
+ def test_should_not_be_bigint
23
+ column = EnumTest.columns_hash['enum_column']
24
+ assert_not column.bigint?
25
+ end
26
+ end
@@ -0,0 +1,21 @@
1
+ require "cases/helper"
2
+ require 'models/developer'
3
+ require 'models/computer'
4
+
5
+ class Mysql2ExplainTest < ActiveRecord::Mysql2TestCase
6
+ fixtures :developers
7
+
8
+ def test_explain_for_one_query
9
+ explain = Developer.where(id: 1).explain
10
+ assert_match %(EXPLAIN for: SELECT `developers`.* FROM `developers` WHERE `developers`.`id` = 1), explain
11
+ assert_match %r(developers |.* const), explain
12
+ end
13
+
14
+ def test_explain_with_eager_loading
15
+ explain = Developer.where(id: 1).includes(:audit_logs).explain
16
+ assert_match %(EXPLAIN for: SELECT `developers`.* FROM `developers` WHERE `developers`.`id` = 1), explain
17
+ assert_match %r(developers |.* const), explain
18
+ assert_match %(EXPLAIN for: SELECT `audit_logs`.* FROM `audit_logs` WHERE `audit_logs`.`developer_id` = 1), explain
19
+ assert_match %r(audit_logs |.* ALL), explain
20
+ end
21
+ end
@@ -0,0 +1,195 @@
1
+ require 'cases/helper'
2
+ require 'support/schema_dumping_helper'
3
+
4
+ if ActiveRecord::Base.connection.supports_json?
5
+ class Mysql2JSONTest < ActiveRecord::Mysql2TestCase
6
+ include SchemaDumpingHelper
7
+ self.use_transactional_tests = false
8
+
9
+ class JsonDataType < ActiveRecord::Base
10
+ self.table_name = 'json_data_type'
11
+
12
+ store_accessor :settings, :resolution
13
+ end
14
+
15
+ def setup
16
+ @connection = ActiveRecord::Base.connection
17
+ begin
18
+ @connection.create_table('json_data_type') do |t|
19
+ t.json 'payload'
20
+ t.json 'settings'
21
+ end
22
+ end
23
+ end
24
+
25
+ def teardown
26
+ @connection.drop_table :json_data_type, if_exists: true
27
+ JsonDataType.reset_column_information
28
+ end
29
+
30
+ def test_column
31
+ column = JsonDataType.columns_hash["payload"]
32
+ assert_equal :json, column.type
33
+ assert_equal 'json', column.sql_type
34
+
35
+ type = JsonDataType.type_for_attribute("payload")
36
+ assert_not type.binary?
37
+ end
38
+
39
+ def test_change_table_supports_json
40
+ @connection.change_table('json_data_type') do |t|
41
+ t.json 'users'
42
+ end
43
+ JsonDataType.reset_column_information
44
+ column = JsonDataType.columns_hash['users']
45
+ assert_equal :json, column.type
46
+ end
47
+
48
+ def test_schema_dumping
49
+ output = dump_table_schema("json_data_type")
50
+ assert_match(/t\.json\s+"settings"/, output)
51
+ end
52
+
53
+ def test_cast_value_on_write
54
+ x = JsonDataType.new payload: {"string" => "foo", :symbol => :bar}
55
+ assert_equal({"string" => "foo", :symbol => :bar}, x.payload_before_type_cast)
56
+ assert_equal({"string" => "foo", "symbol" => "bar"}, x.payload)
57
+ x.save
58
+ assert_equal({"string" => "foo", "symbol" => "bar"}, x.reload.payload)
59
+ end
60
+
61
+ def test_type_cast_json
62
+ type = JsonDataType.type_for_attribute("payload")
63
+
64
+ data = "{\"a_key\":\"a_value\"}"
65
+ hash = type.deserialize(data)
66
+ assert_equal({'a_key' => 'a_value'}, hash)
67
+ assert_equal({'a_key' => 'a_value'}, type.deserialize(data))
68
+
69
+ assert_equal({}, type.deserialize("{}"))
70
+ assert_equal({'key'=>nil}, type.deserialize('{"key": null}'))
71
+ assert_equal({'c'=>'}','"a"'=>'b "a b'}, type.deserialize(%q({"c":"}", "\"a\"":"b \"a b"})))
72
+ end
73
+
74
+ def test_rewrite
75
+ @connection.execute "insert into json_data_type (payload) VALUES ('{\"k\":\"v\"}')"
76
+ x = JsonDataType.first
77
+ x.payload = { '"a\'' => 'b' }
78
+ assert x.save!
79
+ end
80
+
81
+ def test_select
82
+ @connection.execute "insert into json_data_type (payload) VALUES ('{\"k\":\"v\"}')"
83
+ x = JsonDataType.first
84
+ assert_equal({'k' => 'v'}, x.payload)
85
+ end
86
+
87
+ def test_select_multikey
88
+ @connection.execute %q|insert into json_data_type (payload) VALUES ('{"k1":"v1", "k2":"v2", "k3":[1,2,3]}')|
89
+ x = JsonDataType.first
90
+ assert_equal({'k1' => 'v1', 'k2' => 'v2', 'k3' => [1,2,3]}, x.payload)
91
+ end
92
+
93
+ def test_null_json
94
+ @connection.execute %q|insert into json_data_type (payload) VALUES(null)|
95
+ x = JsonDataType.first
96
+ assert_equal(nil, x.payload)
97
+ end
98
+
99
+ def test_select_array_json_value
100
+ @connection.execute %q|insert into json_data_type (payload) VALUES ('["v0",{"k1":"v1"}]')|
101
+ x = JsonDataType.first
102
+ assert_equal(['v0', {'k1' => 'v1'}], x.payload)
103
+ end
104
+
105
+ def test_select_nil_json_after_create
106
+ json = JsonDataType.create(payload: nil)
107
+ x = JsonDataType.where(payload:nil).first
108
+ assert_equal(json, x)
109
+ end
110
+
111
+ def test_select_nil_json_after_update
112
+ json = JsonDataType.create(payload: "foo")
113
+ x = JsonDataType.where(payload:nil).first
114
+ assert_equal(nil, x)
115
+
116
+ json.update_attributes payload: nil
117
+ x = JsonDataType.where(payload:nil).first
118
+ assert_equal(json.reload, x)
119
+ end
120
+
121
+ def test_rewrite_array_json_value
122
+ @connection.execute %q|insert into json_data_type (payload) VALUES ('["v0",{"k1":"v1"}]')|
123
+ x = JsonDataType.first
124
+ x.payload = ["v1", { "k2" => "v2" }, "v3"]
125
+ assert x.save!
126
+ end
127
+
128
+ def test_with_store_accessors
129
+ x = JsonDataType.new(resolution: "320×480")
130
+ assert_equal "320×480", x.resolution
131
+
132
+ x.save!
133
+ x = JsonDataType.first
134
+ assert_equal "320×480", x.resolution
135
+
136
+ x.resolution = "640×1136"
137
+ x.save!
138
+
139
+ x = JsonDataType.first
140
+ assert_equal "640×1136", x.resolution
141
+ end
142
+
143
+ def test_duplication_with_store_accessors
144
+ x = JsonDataType.new(resolution: "320×480")
145
+ assert_equal "320×480", x.resolution
146
+
147
+ y = x.dup
148
+ assert_equal "320×480", y.resolution
149
+ end
150
+
151
+ def test_yaml_round_trip_with_store_accessors
152
+ x = JsonDataType.new(resolution: "320×480")
153
+ assert_equal "320×480", x.resolution
154
+
155
+ y = YAML.load(YAML.dump(x))
156
+ assert_equal "320×480", y.resolution
157
+ end
158
+
159
+ def test_changes_in_place
160
+ json = JsonDataType.new
161
+ assert_not json.changed?
162
+
163
+ json.payload = { 'one' => 'two' }
164
+ assert json.changed?
165
+ assert json.payload_changed?
166
+
167
+ json.save!
168
+ assert_not json.changed?
169
+
170
+ json.payload['three'] = 'four'
171
+ assert json.payload_changed?
172
+
173
+ json.save!
174
+ json.reload
175
+
176
+ assert_equal({ 'one' => 'two', 'three' => 'four' }, json.payload)
177
+ assert_not json.changed?
178
+ end
179
+
180
+ def test_assigning_string_literal
181
+ json = JsonDataType.create(payload: "foo")
182
+ assert_equal "foo", json.payload
183
+ end
184
+
185
+ def test_assigning_number
186
+ json = JsonDataType.create(payload: 1.234)
187
+ assert_equal 1.234, json.payload
188
+ end
189
+
190
+ def test_assigning_boolean
191
+ json = JsonDataType.create(payload: true)
192
+ assert_equal true, json.payload
193
+ end
194
+ end
195
+ end
@@ -0,0 +1,83 @@
1
+ require "cases/helper"
2
+ require "support/ddl_helper"
3
+
4
+ class Mysql2AdapterTest < ActiveRecord::Mysql2TestCase
5
+ include DdlHelper
6
+
7
+ def setup
8
+ @conn = ActiveRecord::Base.connection
9
+ end
10
+
11
+ def test_exec_query_nothing_raises_with_no_result_queries
12
+ assert_nothing_raised do
13
+ with_example_table do
14
+ @conn.exec_query('INSERT INTO ex (number) VALUES (1)')
15
+ @conn.exec_query('DELETE FROM ex WHERE number = 1')
16
+ end
17
+ end
18
+ end
19
+
20
+ def test_valid_column
21
+ with_example_table do
22
+ column = @conn.columns('ex').find { |col| col.name == 'id' }
23
+ assert @conn.valid_type?(column.type)
24
+ end
25
+ end
26
+
27
+ def test_invalid_column
28
+ assert_not @conn.valid_type?(:foobar)
29
+ end
30
+
31
+ def test_columns_for_distinct_zero_orders
32
+ assert_equal "posts.id",
33
+ @conn.columns_for_distinct("posts.id", [])
34
+ end
35
+
36
+ def test_columns_for_distinct_one_order
37
+ assert_equal "posts.id, posts.created_at AS alias_0",
38
+ @conn.columns_for_distinct("posts.id", ["posts.created_at desc"])
39
+ end
40
+
41
+ def test_columns_for_distinct_few_orders
42
+ assert_equal "posts.id, posts.created_at AS alias_0, posts.position AS alias_1",
43
+ @conn.columns_for_distinct("posts.id", ["posts.created_at desc", "posts.position asc"])
44
+ end
45
+
46
+ def test_columns_for_distinct_with_case
47
+ assert_equal(
48
+ 'posts.id, CASE WHEN author.is_active THEN UPPER(author.name) ELSE UPPER(author.email) END AS alias_0',
49
+ @conn.columns_for_distinct('posts.id',
50
+ ["CASE WHEN author.is_active THEN UPPER(author.name) ELSE UPPER(author.email) END"])
51
+ )
52
+ end
53
+
54
+ def test_columns_for_distinct_blank_not_nil_orders
55
+ assert_equal "posts.id, posts.created_at AS alias_0",
56
+ @conn.columns_for_distinct("posts.id", ["posts.created_at desc", "", " "])
57
+ end
58
+
59
+ def test_columns_for_distinct_with_arel_order
60
+ order = Object.new
61
+ def order.to_sql
62
+ "posts.created_at desc"
63
+ end
64
+ assert_equal "posts.id, posts.created_at AS alias_0",
65
+ @conn.columns_for_distinct("posts.id", [order])
66
+ end
67
+
68
+ def test_table_exists_acts_upon_current_database
69
+ previous_db = @conn.select_value("SELECT DATABASE()")
70
+
71
+ assert @conn.table_exists?("accounts")
72
+ @conn.execute("USE activerecord_unittest2")
73
+ assert_not @conn.table_exists?("accounts")
74
+ ensure
75
+ @conn.execute("USE #{previous_db}")
76
+ end
77
+
78
+ private
79
+
80
+ def with_example_table(definition = 'id int auto_increment primary key, number int, data varchar(255)', &block)
81
+ super(@conn, 'ex', definition, &block)
82
+ end
83
+ end
@@ -0,0 +1,152 @@
1
+ require "cases/helper"
2
+
3
+ # a suite of tests to ensure the ConnectionAdapters#MysqlAdapter can handle tables with
4
+ # reserved word names (ie: group, order, values, etc...)
5
+ class Mysql2ReservedWordTest < ActiveRecord::Mysql2TestCase
6
+ class Group < ActiveRecord::Base
7
+ Group.table_name = 'group'
8
+ belongs_to :select
9
+ has_one :values
10
+ end
11
+
12
+ class Select < ActiveRecord::Base
13
+ Select.table_name = 'select'
14
+ has_many :groups
15
+ end
16
+
17
+ class Values < ActiveRecord::Base
18
+ Values.table_name = 'values'
19
+ end
20
+
21
+ class Distinct < ActiveRecord::Base
22
+ Distinct.table_name = 'distinct'
23
+ has_and_belongs_to_many :selects
24
+ has_many :values, :through => :groups
25
+ end
26
+
27
+ def setup
28
+ @connection = ActiveRecord::Base.connection
29
+
30
+ # we call execute directly here (and do similar below) because ActiveRecord::Base#create_table()
31
+ # will fail with these table names if these test cases fail
32
+
33
+ create_tables_directly 'group'=>'id int auto_increment primary key, `order` varchar(255), select_id int',
34
+ 'select'=>'id int auto_increment primary key',
35
+ 'values'=>'id int auto_increment primary key, group_id int',
36
+ 'distinct'=>'id int auto_increment primary key',
37
+ 'distinct_select'=>'distinct_id int, select_id int'
38
+ end
39
+
40
+ teardown do
41
+ drop_tables_directly ['group', 'select', 'values', 'distinct', 'distinct_select', 'order']
42
+ end
43
+
44
+ # create tables with reserved-word names and columns
45
+ def test_create_tables
46
+ assert_nothing_raised {
47
+ @connection.create_table :order do |t|
48
+ t.column :group, :string
49
+ end
50
+ }
51
+ end
52
+
53
+ # rename tables with reserved-word names
54
+ def test_rename_tables
55
+ assert_nothing_raised { @connection.rename_table(:group, :order) }
56
+ end
57
+
58
+ # alter column with a reserved-word name in a table with a reserved-word name
59
+ def test_change_columns
60
+ assert_nothing_raised { @connection.change_column_default(:group, :order, 'whatever') }
61
+ #the quoting here will reveal any double quoting issues in change_column's interaction with the column method in the adapter
62
+ assert_nothing_raised { @connection.change_column('group', 'order', :Int, :default => 0) }
63
+ assert_nothing_raised { @connection.rename_column(:group, :order, :values) }
64
+ end
65
+
66
+ # introspect table with reserved word name
67
+ def test_introspect
68
+ assert_nothing_raised { @connection.columns(:group) }
69
+ assert_nothing_raised { @connection.indexes(:group) }
70
+ end
71
+
72
+ #fixtures
73
+ self.use_instantiated_fixtures = true
74
+ self.use_transactional_tests = false
75
+
76
+ #activerecord model class with reserved-word table name
77
+ def test_activerecord_model
78
+ create_test_fixtures :select, :distinct, :group, :values, :distinct_select
79
+ x = nil
80
+ assert_nothing_raised { x = Group.new }
81
+ x.order = 'x'
82
+ assert_nothing_raised { x.save }
83
+ x.order = 'y'
84
+ assert_nothing_raised { x.save }
85
+ assert_nothing_raised { Group.find_by_order('y') }
86
+ assert_nothing_raised { Group.find(1) }
87
+ end
88
+
89
+ # has_one association with reserved-word table name
90
+ def test_has_one_associations
91
+ create_test_fixtures :select, :distinct, :group, :values, :distinct_select
92
+ v = nil
93
+ assert_nothing_raised { v = Group.find(1).values }
94
+ assert_equal 2, v.id
95
+ end
96
+
97
+ # belongs_to association with reserved-word table name
98
+ def test_belongs_to_associations
99
+ create_test_fixtures :select, :distinct, :group, :values, :distinct_select
100
+ gs = nil
101
+ assert_nothing_raised { gs = Select.find(2).groups }
102
+ assert_equal gs.length, 2
103
+ assert(gs.collect(&:id).sort == [2, 3])
104
+ end
105
+
106
+ # has_and_belongs_to_many with reserved-word table name
107
+ def test_has_and_belongs_to_many
108
+ create_test_fixtures :select, :distinct, :group, :values, :distinct_select
109
+ s = nil
110
+ assert_nothing_raised { s = Distinct.find(1).selects }
111
+ assert_equal s.length, 2
112
+ assert(s.collect(&:id).sort == [1, 2])
113
+ end
114
+
115
+ # activerecord model introspection with reserved-word table and column names
116
+ def test_activerecord_introspection
117
+ assert_nothing_raised { Group.table_exists? }
118
+ assert_nothing_raised { Group.columns }
119
+ end
120
+
121
+ # Calculations
122
+ def test_calculations_work_with_reserved_words
123
+ assert_nothing_raised { Group.count }
124
+ end
125
+
126
+ def test_associations_work_with_reserved_words
127
+ assert_nothing_raised { Select.all.merge!(:includes => [:groups]).to_a }
128
+ end
129
+
130
+ #the following functions were added to DRY test cases
131
+
132
+ private
133
+ # custom fixture loader, uses FixtureSet#create_fixtures and appends base_path to the current file's path
134
+ def create_test_fixtures(*fixture_names)
135
+ ActiveRecord::FixtureSet.create_fixtures(FIXTURES_ROOT + "/reserved_words", fixture_names)
136
+ end
137
+
138
+ # custom drop table, uses execute on connection to drop a table if it exists. note: escapes table_name
139
+ def drop_tables_directly(table_names, connection = @connection)
140
+ table_names.each do |name|
141
+ connection.drop_table name, if_exists: true
142
+ end
143
+ end
144
+
145
+ # custom create table, uses execute on connection to create a table, note: escapes table_name, does NOT escape columns
146
+ def create_tables_directly(tables, connection = @connection)
147
+ tables.each do |table_name, column_properties|
148
+ connection.execute("CREATE TABLE `#{table_name}` ( #{column_properties} )")
149
+ end
150
+ end
151
+
152
+ end