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
@@ -37,9 +37,9 @@ class EachTest < ActiveRecord::TestCase
37
37
 
38
38
  if Enumerator.method_defined? :size
39
39
  def test_each_should_return_a_sized_enumerator
40
- assert_equal 11, Post.find_each(:batch_size => 1).size
41
- assert_equal 5, Post.find_each(:batch_size => 2, :start => 7).size
42
- assert_equal 11, Post.find_each(:batch_size => 10_000).size
40
+ assert_equal 11, Post.find_each(batch_size: 1).size
41
+ assert_equal 5, Post.find_each(batch_size: 2, start: 7).size
42
+ assert_equal 11, Post.find_each(batch_size: 10_000).size
43
43
  end
44
44
  end
45
45
 
@@ -53,7 +53,7 @@ class EachTest < ActiveRecord::TestCase
53
53
  end
54
54
 
55
55
  def test_each_should_raise_if_select_is_set_without_id
56
- assert_raise(RuntimeError) do
56
+ assert_raise(ArgumentError) do
57
57
  Post.select(:title).find_each(batch_size: 1) { |post|
58
58
  flunk "should not call this block"
59
59
  }
@@ -69,13 +69,15 @@ class EachTest < ActiveRecord::TestCase
69
69
  end
70
70
 
71
71
  def test_warn_if_limit_scope_is_set
72
- ActiveRecord::Base.logger.expects(:warn)
73
- Post.limit(1).find_each { |post| post }
72
+ assert_called(ActiveRecord::Base.logger, :warn) do
73
+ Post.limit(1).find_each { |post| post }
74
+ end
74
75
  end
75
76
 
76
77
  def test_warn_if_order_scope_is_set
77
- ActiveRecord::Base.logger.expects(:warn)
78
- Post.order("title").find_each { |post| post }
78
+ assert_called(ActiveRecord::Base.logger, :warn) do
79
+ Post.order("title").find_each { |post| post }
80
+ end
79
81
  end
80
82
 
81
83
  def test_logger_not_required
@@ -99,7 +101,16 @@ class EachTest < ActiveRecord::TestCase
99
101
 
100
102
  def test_find_in_batches_should_start_from_the_start_option
101
103
  assert_queries(@total) do
102
- Post.find_in_batches(:batch_size => 1, :start => 2) do |batch|
104
+ Post.find_in_batches(batch_size: 1, start: 2) do |batch|
105
+ assert_kind_of Array, batch
106
+ assert_kind_of Post, batch.first
107
+ end
108
+ end
109
+ end
110
+
111
+ def test_find_in_batches_should_end_at_the_finish_option
112
+ assert_queries(6) do
113
+ Post.find_in_batches(batch_size: 1, finish: 5) do |batch|
103
114
  assert_kind_of Array, batch
104
115
  assert_kind_of Post, batch.first
105
116
  end
@@ -128,14 +139,15 @@ class EachTest < ActiveRecord::TestCase
128
139
 
129
140
  def test_find_in_batches_should_not_use_records_after_yielding_them_in_case_original_array_is_modified
130
141
  not_a_post = "not a post"
131
- not_a_post.stubs(:id).raises(StandardError, "not_a_post had #id called on it")
142
+ def not_a_post.id; end
143
+ not_a_post.stub(:id, ->{ raise StandardError.new("not_a_post had #id called on it") }) do
144
+ assert_nothing_raised do
145
+ Post.find_in_batches(:batch_size => 1) do |batch|
146
+ assert_kind_of Array, batch
147
+ assert_kind_of Post, batch.first
132
148
 
133
- assert_nothing_raised do
134
- Post.find_in_batches(:batch_size => 1) do |batch|
135
- assert_kind_of Array, batch
136
- assert_kind_of Post, batch.first
137
-
138
- batch.map! { not_a_post }
149
+ batch.map! { not_a_post }
150
+ end
139
151
  end
140
152
  end
141
153
  end
@@ -149,7 +161,43 @@ class EachTest < ActiveRecord::TestCase
149
161
  end
150
162
  # posts.first will be ordered using id only. Title order scope should not apply here
151
163
  assert_not_equal first_post, posts.first
152
- assert_equal posts(:welcome), posts.first
164
+ assert_equal posts(:welcome).id, posts.first.id
165
+ end
166
+
167
+ def test_find_in_batches_should_error_on_ignore_the_order
168
+ assert_raise(ArgumentError) do
169
+ PostWithDefaultScope.find_in_batches(error_on_ignore: true){}
170
+ end
171
+ end
172
+
173
+ def test_find_in_batches_should_not_error_if_config_overriden
174
+ # Set the config option which will be overriden
175
+ prev = ActiveRecord::Base.error_on_ignored_order_or_limit
176
+ ActiveRecord::Base.error_on_ignored_order_or_limit = true
177
+ assert_nothing_raised do
178
+ PostWithDefaultScope.find_in_batches(error_on_ignore: false){}
179
+ end
180
+ ensure
181
+ # Set back to default
182
+ ActiveRecord::Base.error_on_ignored_order_or_limit = prev
183
+ end
184
+
185
+ def test_find_in_batches_should_error_on_config_specified_to_error
186
+ # Set the config option
187
+ prev = ActiveRecord::Base.error_on_ignored_order_or_limit
188
+ ActiveRecord::Base.error_on_ignored_order_or_limit = true
189
+ assert_raise(ArgumentError) do
190
+ PostWithDefaultScope.find_in_batches(){}
191
+ end
192
+ ensure
193
+ # Set back to default
194
+ ActiveRecord::Base.error_on_ignored_order_or_limit = prev
195
+ end
196
+
197
+ def test_find_in_batches_should_not_error_by_default
198
+ assert_nothing_raised do
199
+ PostWithDefaultScope.find_in_batches(){}
200
+ end
153
201
  end
154
202
 
155
203
  def test_find_in_batches_should_not_ignore_the_default_scope_if_it_is_other_then_order
@@ -172,7 +220,7 @@ class EachTest < ActiveRecord::TestCase
172
220
  start_nick = nick_order_subscribers.second.nick
173
221
 
174
222
  subscribers = []
175
- Subscriber.find_in_batches(:batch_size => 1, :start => start_nick) do |batch|
223
+ Subscriber.find_in_batches(batch_size: 1, start: start_nick) do |batch|
176
224
  subscribers.concat(batch)
177
225
  end
178
226
 
@@ -181,15 +229,16 @@ class EachTest < ActiveRecord::TestCase
181
229
 
182
230
  def test_find_in_batches_should_use_any_column_as_primary_key_when_start_is_not_specified
183
231
  assert_queries(Subscriber.count + 1) do
184
- Subscriber.find_each(:batch_size => 1) do |subscriber|
185
- assert_kind_of Subscriber, subscriber
232
+ Subscriber.find_in_batches(batch_size: 1) do |batch|
233
+ assert_kind_of Array, batch
234
+ assert_kind_of Subscriber, batch.first
186
235
  end
187
236
  end
188
237
  end
189
238
 
190
239
  def test_find_in_batches_should_return_an_enumerator
191
240
  enum = nil
192
- assert_queries(0) do
241
+ assert_no_queries do
193
242
  enum = Post.find_in_batches(:batch_size => 1)
194
243
  end
195
244
  assert_queries(4) do
@@ -200,11 +249,239 @@ class EachTest < ActiveRecord::TestCase
200
249
  end
201
250
  end
202
251
 
252
+ def test_in_batches_should_not_execute_any_query
253
+ assert_no_queries do
254
+ assert_kind_of ActiveRecord::Batches::BatchEnumerator, Post.in_batches(of: 2)
255
+ end
256
+ end
257
+
258
+ def test_in_batches_should_yield_relation_if_block_given
259
+ assert_queries(6) do
260
+ Post.in_batches(of: 2) do |relation|
261
+ assert_kind_of ActiveRecord::Relation, relation
262
+ end
263
+ end
264
+ end
265
+
266
+ def test_in_batches_should_be_enumerable_if_no_block_given
267
+ assert_queries(6) do
268
+ Post.in_batches(of: 2).each do |relation|
269
+ assert_kind_of ActiveRecord::Relation, relation
270
+ end
271
+ end
272
+ end
273
+
274
+ def test_in_batches_each_record_should_yield_record_if_block_is_given
275
+ assert_queries(6) do
276
+ Post.in_batches(of: 2).each_record do |post|
277
+ assert post.title.present?
278
+ assert_kind_of Post, post
279
+ end
280
+ end
281
+ end
282
+
283
+ def test_in_batches_each_record_should_return_enumerator_if_no_block_given
284
+ assert_queries(6) do
285
+ Post.in_batches(of: 2).each_record.with_index do |post, i|
286
+ assert post.title.present?
287
+ assert_kind_of Post, post
288
+ end
289
+ end
290
+ end
291
+
292
+ def test_in_batches_each_record_should_be_ordered_by_id
293
+ ids = Post.order('id ASC').pluck(:id)
294
+ assert_queries(6) do
295
+ Post.in_batches(of: 2).each_record.with_index do |post, i|
296
+ assert_equal ids[i], post.id
297
+ end
298
+ end
299
+ end
300
+
301
+ def test_in_batches_update_all_affect_all_records
302
+ assert_queries(6 + 6) do # 6 selects, 6 updates
303
+ Post.in_batches(of: 2).update_all(title: "updated-title")
304
+ end
305
+ assert_equal Post.all.pluck(:title), ["updated-title"] * Post.count
306
+ end
307
+
308
+ def test_in_batches_delete_all_should_not_delete_records_in_other_batches
309
+ not_deleted_count = Post.where('id <= 2').count
310
+ Post.where('id > 2').in_batches(of: 2).delete_all
311
+ assert_equal 0, Post.where('id > 2').count
312
+ assert_equal not_deleted_count, Post.count
313
+ end
314
+
315
+ def test_in_batches_should_not_be_loaded
316
+ Post.in_batches(of: 1) do |relation|
317
+ assert_not relation.loaded?
318
+ end
319
+
320
+ Post.in_batches(of: 1, load: false) do |relation|
321
+ assert_not relation.loaded?
322
+ end
323
+ end
324
+
325
+ def test_in_batches_should_be_loaded
326
+ Post.in_batches(of: 1, load: true) do |relation|
327
+ assert relation.loaded?
328
+ end
329
+ end
330
+
331
+ def test_in_batches_if_not_loaded_executes_more_queries
332
+ assert_queries(@total + 1) do
333
+ Post.in_batches(of: 1, load: false) do |relation|
334
+ assert_not relation.loaded?
335
+ end
336
+ end
337
+ end
338
+
339
+ def test_in_batches_should_return_relations
340
+ assert_queries(@total + 1) do
341
+ Post.in_batches(of: 1) do |relation|
342
+ assert_kind_of ActiveRecord::Relation, relation
343
+ end
344
+ end
345
+ end
346
+
347
+ def test_in_batches_should_start_from_the_start_option
348
+ post = Post.order('id ASC').where('id >= ?', 2).first
349
+ assert_queries(2) do
350
+ relation = Post.in_batches(of: 1, start: 2).first
351
+ assert_equal post, relation.first
352
+ end
353
+ end
354
+
355
+ def test_in_batches_should_end_at_the_finish_option
356
+ post = Post.order('id DESC').where('id <= ?', 5).first
357
+ assert_queries(7) do
358
+ relation = Post.in_batches(of: 1, finish: 5, load: true).reverse_each.first
359
+ assert_equal post, relation.last
360
+ end
361
+ end
362
+
363
+ def test_in_batches_shouldnt_execute_query_unless_needed
364
+ assert_queries(2) do
365
+ Post.in_batches(of: @total) { |relation| assert_kind_of ActiveRecord::Relation, relation }
366
+ end
367
+
368
+ assert_queries(1) do
369
+ Post.in_batches(of: @total + 1) { |relation| assert_kind_of ActiveRecord::Relation, relation }
370
+ end
371
+ end
372
+
373
+ def test_in_batches_should_quote_batch_order
374
+ c = Post.connection
375
+ assert_sql(/ORDER BY #{c.quote_table_name('posts')}.#{c.quote_column_name('id')}/) do
376
+ Post.in_batches(of: 1) do |relation|
377
+ assert_kind_of ActiveRecord::Relation, relation
378
+ assert_kind_of Post, relation.first
379
+ end
380
+ end
381
+ end
382
+
383
+ def test_in_batches_should_not_use_records_after_yielding_them_in_case_original_array_is_modified
384
+ not_a_post = "not a post"
385
+ def not_a_post.id
386
+ raise StandardError.new("not_a_post had #id called on it")
387
+ end
388
+
389
+ assert_nothing_raised do
390
+ Post.in_batches(of: 1) do |relation|
391
+ assert_kind_of ActiveRecord::Relation, relation
392
+ assert_kind_of Post, relation.first
393
+
394
+ relation = [not_a_post] * relation.count
395
+ end
396
+ end
397
+ end
398
+
399
+ def test_in_batches_should_not_ignore_default_scope_without_order_statements
400
+ special_posts_ids = SpecialPostWithDefaultScope.all.map(&:id).sort
401
+ posts = []
402
+ SpecialPostWithDefaultScope.in_batches do |relation|
403
+ posts.concat(relation)
404
+ end
405
+ assert_equal special_posts_ids, posts.map(&:id)
406
+ end
407
+
408
+ def test_in_batches_should_not_modify_passed_options
409
+ assert_nothing_raised do
410
+ Post.in_batches({ of: 42, start: 1 }.freeze){}
411
+ end
412
+ end
413
+
414
+ def test_in_batches_should_use_any_column_as_primary_key
415
+ nick_order_subscribers = Subscriber.order('nick asc')
416
+ start_nick = nick_order_subscribers.second.nick
417
+
418
+ subscribers = []
419
+ Subscriber.in_batches(of: 1, start: start_nick) do |relation|
420
+ subscribers.concat(relation)
421
+ end
422
+
423
+ assert_equal nick_order_subscribers[1..-1].map(&:id), subscribers.map(&:id)
424
+ end
425
+
426
+ def test_in_batches_should_use_any_column_as_primary_key_when_start_is_not_specified
427
+ assert_queries(Subscriber.count + 1) do
428
+ Subscriber.in_batches(of: 1, load: true) do |relation|
429
+ assert_kind_of ActiveRecord::Relation, relation
430
+ assert_kind_of Subscriber, relation.first
431
+ end
432
+ end
433
+ end
434
+
435
+ def test_in_batches_should_return_an_enumerator
436
+ enum = nil
437
+ assert_no_queries do
438
+ enum = Post.in_batches(of: 1)
439
+ end
440
+ assert_queries(4) do
441
+ enum.first(4) do |relation|
442
+ assert_kind_of ActiveRecord::Relation, relation
443
+ assert_kind_of Post, relation.first
444
+ end
445
+ end
446
+ end
447
+
448
+ def test_in_batches_relations_should_not_overlap_with_each_other
449
+ seen_posts = []
450
+ Post.in_batches(of: 2, load: true) do |relation|
451
+ relation.to_a.each do |post|
452
+ assert_not seen_posts.include?(post)
453
+ seen_posts << post
454
+ end
455
+ end
456
+ end
457
+
458
+ def test_in_batches_relations_with_condition_should_not_overlap_with_each_other
459
+ seen_posts = []
460
+ author_id = Post.first.author_id
461
+ posts_by_author = Post.where(author_id: author_id)
462
+ Post.in_batches(of: 2) do |batch|
463
+ seen_posts += batch.where(author_id: author_id)
464
+ end
465
+
466
+ assert_equal posts_by_author.pluck(:id).sort, seen_posts.map(&:id).sort
467
+ end
468
+
469
+ def test_in_batches_relations_update_all_should_not_affect_matching_records_in_other_batches
470
+ Post.update_all(author_id: 0)
471
+ person = Post.last
472
+ person.update_attributes(author_id: 1)
473
+
474
+ Post.in_batches(of: 2) do |batch|
475
+ batch.where('author_id >= 1').update_all('author_id = author_id + 1')
476
+ end
477
+ assert_equal 2, person.reload.author_id # incremented only once
478
+ end
479
+
203
480
  if Enumerator.method_defined? :size
204
481
  def test_find_in_batches_should_return_a_sized_enumerator
205
482
  assert_equal 11, Post.find_in_batches(:batch_size => 1).size
206
483
  assert_equal 6, Post.find_in_batches(:batch_size => 2).size
207
- assert_equal 4, Post.find_in_batches(:batch_size => 2, :start => 4).size
484
+ assert_equal 4, Post.find_in_batches(batch_size: 2, start: 4).size
208
485
  assert_equal 4, Post.find_in_batches(:batch_size => 3).size
209
486
  assert_equal 1, Post.find_in_batches(:batch_size => 10_000).size
210
487
  end
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  require "cases/helper"
3
2
 
4
3
  # Without using prepared statements, it makes no sense to test
@@ -21,10 +20,6 @@ unless current_adapter?(:DB2Adapter)
21
20
 
22
21
  name = binary.name
23
22
 
24
- # MySQL adapter doesn't properly encode things, so we have to do it
25
- if current_adapter?(:MysqlAdapter, :DB2Adapter)
26
- name.force_encoding(Encoding::UTF_8)
27
- end
28
23
  assert_equal 'いただきます!', name
29
24
  end
30
25
 
@@ -32,11 +27,8 @@ unless current_adapter?(:DB2Adapter)
32
27
  Binary.delete_all
33
28
 
34
29
  FIXTURES.each do |filename|
35
- data = File.read(ASSETS_ROOT + "/#{filename}")
30
+ data = File.read(ASSETS_ROOT + "/#{filename}")
36
31
  data.force_encoding('ASCII-8BIT')
37
- if current_adapter?(:DB2Adapter)
38
- data.force_encoding(Encoding::UTF_8)
39
- end
40
32
  data.freeze
41
33
 
42
34
  bin = Binary.new(:data => data)
@@ -44,7 +36,7 @@ unless current_adapter?(:DB2Adapter)
44
36
 
45
37
  bin.save!
46
38
  assert_equal data, bin.data, 'Data differs from original after save'
47
-
39
+
48
40
  assert_equal data, bin.reload.data, 'Reloaded data differs from original'
49
41
  end
50
42
  end
@@ -3,44 +3,49 @@ require 'models/topic'
3
3
  require 'models/author'
4
4
  require 'models/post'
5
5
 
6
- module ActiveRecord
7
- class BindParameterTest < ActiveRecord::TestCase
8
- fixtures :topics, :authors, :posts
9
-
10
- class LogListener
11
- attr_accessor :calls
12
-
13
- def initialize
14
- @calls = []
6
+ if ActiveRecord::Base.connection.supports_statement_cache? &&
7
+ ActiveRecord::Base.connection.prepared_statements
8
+ module ActiveRecord
9
+ class BindParameterTest < ActiveRecord::TestCase
10
+ fixtures :topics, :authors, :posts
11
+
12
+ class LogListener
13
+ attr_accessor :calls
14
+
15
+ def initialize
16
+ @calls = []
17
+ end
18
+
19
+ def call(*args)
20
+ calls << args
21
+ end
15
22
  end
16
23
 
17
- def call(*args)
18
- calls << args
24
+ def setup
25
+ super
26
+ puts "BindParameterTest - setup"
27
+ @connection = ActiveRecord::Base.connection
28
+ @subscriber = LogListener.new
29
+ @pk = Topic.columns_hash[Topic.primary_key]
30
+ @subscription = ActiveSupport::Notifications.subscribe("sql.active_record", @subscriber)
19
31
  end
20
- end
21
-
22
- def setup
23
- super
24
- @connection = ActiveRecord::Base.connection
25
- @subscriber = LogListener.new
26
- @pk = Topic.columns_hash[Topic.primary_key]
27
- @subscription = ActiveSupport::Notifications.subscribe('sql.active_record', @subscriber)
28
- end
29
32
 
30
- teardown do
31
- ActiveSupport::Notifications.unsubscribe(@subscription)
32
- end
33
+ def teardown
34
+ puts "BindParameterTest - teardown"
35
+ ActiveSupport::Notifications.unsubscribe(@subscription)
36
+ end
33
37
 
34
- if ActiveRecord::Base.connection.supports_statement_cache?
35
38
  def test_bind_from_join_in_subquery
39
+ puts "BindParameterTest - test_bind_from_join_in_subquery"
36
40
  subquery = Author.joins(:thinking_posts).where(name: 'David')
37
41
  scope = Author.from(subquery, 'authors').where(id: 1)
38
42
  assert_equal 1, scope.count
39
43
  end
40
44
 
41
45
  def test_binds_are_logged
42
- sub = @connection.substitute_at(@pk)
43
- binds = [[@pk, 1]]
46
+ puts "BindParameterTest - test_binds_are_logged"
47
+ sub = Arel::Nodes::BindParam.new
48
+ binds = [Relation::QueryAttribute.new("id", 1, Type::Value.new)]
44
49
  sql = "select * from topics where id = #{sub.to_sql}"
45
50
 
46
51
  @connection.exec_query(sql, 'SQL', binds)
@@ -49,52 +54,57 @@ module ActiveRecord
49
54
  assert_equal binds, message[4][:binds]
50
55
  end
51
56
 
52
- def test_binds_are_logged_after_type_cast
53
- sub = @connection.substitute_at(@pk)
54
- binds = [[@pk, "3"]]
55
- sql = "select * from topics where id = #{sub.to_sql}"
56
-
57
- @connection.exec_query(sql, 'SQL', binds)
58
-
59
- message = @subscriber.calls.find { |args| args[4][:sql] == sql }
60
- assert_equal [[@pk, 3]], message[4][:binds]
61
- end
62
-
63
57
  def test_find_one_uses_binds
58
+ puts "BindParameterTest - test_find_one_uses_binds"
64
59
  Topic.find(1)
65
- binds = [[@pk, 1]]
66
- message = @subscriber.calls.find { |args| args[4][:binds] == binds }
60
+ message = @subscriber.calls.find { |args| args[4][:binds].any? { |attr| attr.value == 1 } }
67
61
  assert message, 'expected a message with binds'
68
62
  end
69
63
 
70
- def test_logs_bind_vars
71
- payload = {
72
- :name => 'SQL',
73
- :sql => 'select * from topics where id = ?',
74
- :binds => [[@pk, 10]]
75
- }
76
- event = ActiveSupport::Notifications::Event.new(
77
- 'foo',
78
- Time.now,
79
- Time.now,
80
- 123,
81
- payload)
82
-
83
- logger = Class.new(ActiveRecord::LogSubscriber) {
84
- attr_reader :debugs
85
- def initialize
86
- super
87
- @debugs = []
88
- end
89
-
90
- def debug str
91
- @debugs << str
92
- end
93
- }.new
94
-
95
- logger.sql event
96
- assert_match([[@pk.name, 10]].inspect, logger.debugs.first)
64
+ def test_logs_binds_after_type_cast
65
+ puts "BindParameterTest - test_logs_binds_after_type_cast"
66
+ binds = [Relation::QueryAttribute.new("id", "10", Type::Integer.new)]
67
+ assert_logs_binds(binds)
68
+ end
69
+
70
+ def test_logs_legacy_binds_after_type_cast
71
+ puts "BindParameterTest - test_logs_legacy_binds_after_type_cast"
72
+ binds = [[@pk, "10"]]
73
+ assert_logs_binds(binds)
97
74
  end
75
+
76
+ private
77
+ def assert_logs_binds(binds)
78
+ payload = {
79
+ name: "SQL",
80
+ sql: "select * from topics where id = ?",
81
+ binds: binds,
82
+ type_casted_binds: @connection.type_casted_binds(binds)
83
+ }
84
+
85
+ event = ActiveSupport::Notifications::Event.new(
86
+ "foo",
87
+ Time.now,
88
+ Time.now,
89
+ 123,
90
+ payload)
91
+
92
+ logger = Class.new(ActiveRecord::LogSubscriber) {
93
+ attr_reader :debugs
94
+
95
+ def initialize
96
+ super
97
+ @debugs = []
98
+ end
99
+
100
+ def debug(str)
101
+ @debugs << str
102
+ end
103
+ }.new
104
+
105
+ logger.sql(event)
106
+ assert_match([[@pk.name, 10]].inspect, logger.debugs.first)
107
+ end
98
108
  end
99
109
  end
100
110
  end