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
@@ -4,11 +4,13 @@ require 'models/topic'
4
4
  module ActiveRecord
5
5
  class PredicateBuilderTest < ActiveRecord::TestCase
6
6
  def test_registering_new_handlers
7
- PredicateBuilder.register_handler(Regexp, proc do |column, value|
7
+ Topic.predicate_builder.register_handler(Regexp, proc do |column, value|
8
8
  Arel::Nodes::InfixOperation.new('~', column, Arel.sql(value.source))
9
9
  end)
10
10
 
11
- assert_match %r{["`]topics["`].["`]title["`] ~ rails}i, Topic.where(title: /rails/).to_sql
11
+ assert_match %r{["`]topics["`]\.["`]title["`] ~ rails}i, Topic.where(title: /rails/).to_sql
12
+ ensure
13
+ Topic.reset_column_information
12
14
  end
13
15
  end
14
16
  end
@@ -0,0 +1,40 @@
1
+ require 'cases/helper'
2
+ require 'models/post'
3
+ require 'active_record/relation/record_fetch_warning'
4
+
5
+ module ActiveRecord
6
+ class RecordFetchWarningTest < ActiveRecord::TestCase
7
+ fixtures :posts
8
+
9
+ def setup
10
+ @original_logger = ActiveRecord::Base.logger
11
+ @original_warn_on_records_fetched_greater_than = ActiveRecord::Base.warn_on_records_fetched_greater_than
12
+ @log = StringIO.new
13
+ end
14
+
15
+ def teardown
16
+ ActiveRecord::Base.logger = @original_logger
17
+ ActiveRecord::Base.warn_on_records_fetched_greater_than = @original_warn_on_records_fetched_greater_than
18
+ end
19
+
20
+ def test_warn_on_records_fetched_greater_than_allowed_limit
21
+ ActiveRecord::Base.logger = ActiveSupport::Logger.new(@log)
22
+ ActiveRecord::Base.logger.level = Logger::WARN
23
+ ActiveRecord::Base.warn_on_records_fetched_greater_than = 1
24
+
25
+ Post.all.to_a
26
+
27
+ assert_match(/Query fetched/, @log.string)
28
+ end
29
+
30
+ def test_does_not_warn_on_records_fetched_less_than_allowed_limit
31
+ ActiveRecord::Base.logger = ActiveSupport::Logger.new(@log)
32
+ ActiveRecord::Base.logger.level = Logger::WARN
33
+ ActiveRecord::Base.warn_on_records_fetched_greater_than = 100
34
+
35
+ Post.all.to_a
36
+
37
+ assert_no_match(/Query fetched/, @log.string)
38
+ end
39
+ end
40
+ end
@@ -11,22 +11,11 @@ module ActiveRecord
11
11
  @name = 'title'
12
12
  end
13
13
 
14
- def test_not_eq
14
+ def test_not_inverts_where_clause
15
15
  relation = Post.where.not(title: 'hello')
16
+ expected_where_clause = Post.where(title: 'hello').where_clause.invert
16
17
 
17
- assert_equal 1, relation.where_values.length
18
-
19
- value = relation.where_values.first
20
- bind = relation.bind_values.first
21
-
22
- assert_bound_ast value, Post.arel_table[@name], Arel::Nodes::NotEqual
23
- assert_equal 'hello', bind.last
24
- end
25
-
26
- def test_not_null
27
- expected = Post.arel_table[@name].not_eq(nil)
28
- relation = Post.where.not(title: nil)
29
- assert_equal([expected], relation.where_values)
18
+ assert_equal expected_where_clause, relation.where_clause
30
19
  end
31
20
 
32
21
  def test_not_with_nil
@@ -35,146 +24,81 @@ module ActiveRecord
35
24
  end
36
25
  end
37
26
 
38
- def test_not_in
39
- expected = Post.arel_table[@name].not_in(%w[hello goodbye])
40
- relation = Post.where.not(title: %w[hello goodbye])
41
- assert_equal([expected], relation.where_values)
42
- end
43
-
44
27
  def test_association_not_eq
45
- expected = Comment.arel_table[@name].not_eq('hello')
28
+ expected = Arel::Nodes::Grouping.new(Comment.arel_table[@name].not_eq(Arel::Nodes::BindParam.new))
46
29
  relation = Post.joins(:comments).where.not(comments: {title: 'hello'})
47
- assert_equal(expected.to_sql, relation.where_values.first.to_sql)
30
+ assert_equal(expected.to_sql, relation.where_clause.ast.to_sql)
48
31
  end
49
32
 
50
33
  def test_not_eq_with_preceding_where
51
34
  relation = Post.where(title: 'hello').where.not(title: 'world')
35
+ expected_where_clause =
36
+ Post.where(title: 'hello').where_clause +
37
+ Post.where(title: 'world').where_clause.invert
52
38
 
53
- value = relation.where_values.first
54
- bind = relation.bind_values.first
55
- assert_bound_ast value, Post.arel_table[@name], Arel::Nodes::Equality
56
- assert_equal 'hello', bind.last
57
-
58
- value = relation.where_values.last
59
- bind = relation.bind_values.last
60
- assert_bound_ast value, Post.arel_table[@name], Arel::Nodes::NotEqual
61
- assert_equal 'world', bind.last
39
+ assert_equal expected_where_clause, relation.where_clause
62
40
  end
63
41
 
64
42
  def test_not_eq_with_succeeding_where
65
43
  relation = Post.where.not(title: 'hello').where(title: 'world')
44
+ expected_where_clause =
45
+ Post.where(title: 'hello').where_clause.invert +
46
+ Post.where(title: 'world').where_clause
66
47
 
67
- value = relation.where_values.first
68
- bind = relation.bind_values.first
69
- assert_bound_ast value, Post.arel_table[@name], Arel::Nodes::NotEqual
70
- assert_equal 'hello', bind.last
71
-
72
- value = relation.where_values.last
73
- bind = relation.bind_values.last
74
- assert_bound_ast value, Post.arel_table[@name], Arel::Nodes::Equality
75
- assert_equal 'world', bind.last
76
- end
77
-
78
- def test_not_eq_with_string_parameter
79
- expected = Arel::Nodes::Not.new("title = 'hello'")
80
- relation = Post.where.not("title = 'hello'")
81
- assert_equal([expected], relation.where_values)
82
- end
83
-
84
- def test_not_eq_with_array_parameter
85
- expected = Arel::Nodes::Not.new("title = 'hello'")
86
- relation = Post.where.not(['title = ?', 'hello'])
87
- assert_equal([expected], relation.where_values)
48
+ assert_equal expected_where_clause, relation.where_clause
88
49
  end
89
50
 
90
51
  def test_chaining_multiple
91
52
  relation = Post.where.not(author_id: [1, 2]).where.not(title: 'ruby on rails')
53
+ expected_where_clause =
54
+ Post.where(author_id: [1, 2]).where_clause.invert +
55
+ Post.where(title: 'ruby on rails').where_clause.invert
92
56
 
93
- expected = Post.arel_table['author_id'].not_in([1, 2])
94
- assert_equal(expected, relation.where_values[0])
95
-
96
- value = relation.where_values[1]
97
- bind = relation.bind_values.first
98
-
99
- assert_bound_ast value, Post.arel_table[@name], Arel::Nodes::NotEqual
100
- assert_equal 'ruby on rails', bind.last
57
+ assert_equal expected_where_clause, relation.where_clause
101
58
  end
102
59
 
103
60
  def test_rewhere_with_one_condition
104
61
  relation = Post.where(title: 'hello').where(title: 'world').rewhere(title: 'alone')
62
+ expected = Post.where(title: 'alone')
105
63
 
106
- assert_equal 1, relation.where_values.size
107
- value = relation.where_values.first
108
- bind = relation.bind_values.first
109
- assert_bound_ast value, Post.arel_table[@name], Arel::Nodes::Equality
110
- assert_equal 'alone', bind.last
64
+ assert_equal expected.where_clause, relation.where_clause
111
65
  end
112
66
 
113
67
  def test_rewhere_with_multiple_overwriting_conditions
114
68
  relation = Post.where(title: 'hello').where(body: 'world').rewhere(title: 'alone', body: 'again')
69
+ expected = Post.where(title: 'alone', body: 'again')
115
70
 
116
- assert_equal 2, relation.where_values.size
117
-
118
- value = relation.where_values.first
119
- bind = relation.bind_values.first
120
- assert_bound_ast value, Post.arel_table['title'], Arel::Nodes::Equality
121
- assert_equal 'alone', bind.last
122
-
123
- value = relation.where_values[1]
124
- bind = relation.bind_values[1]
125
- assert_bound_ast value, Post.arel_table['body'], Arel::Nodes::Equality
126
- assert_equal 'again', bind.last
127
- end
128
-
129
- def assert_bound_ast value, table, type
130
- assert_equal table, value.left
131
- assert_kind_of type, value
132
- assert_kind_of Arel::Nodes::BindParam, value.right
71
+ assert_equal expected.where_clause, relation.where_clause
133
72
  end
134
73
 
135
74
  def test_rewhere_with_one_overwriting_condition_and_one_unrelated
136
75
  relation = Post.where(title: 'hello').where(body: 'world').rewhere(title: 'alone')
76
+ expected = Post.where(body: 'world', title: 'alone')
137
77
 
138
- assert_equal 2, relation.where_values.size
139
-
140
- value = relation.where_values.first
141
- bind = relation.bind_values.first
142
-
143
- assert_bound_ast value, Post.arel_table['body'], Arel::Nodes::Equality
144
- assert_equal 'world', bind.last
145
-
146
- value = relation.where_values.second
147
- bind = relation.bind_values.second
148
-
149
- assert_bound_ast value, Post.arel_table['title'], Arel::Nodes::Equality
150
- assert_equal 'alone', bind.last
78
+ assert_equal expected.where_clause, relation.where_clause
151
79
  end
152
80
 
153
81
  def test_rewhere_with_range
154
82
  relation = Post.where(comments_count: 1..3).rewhere(comments_count: 3..5)
155
83
 
156
- assert_equal 1, relation.where_values.size
157
84
  assert_equal Post.where(comments_count: 3..5), relation
158
85
  end
159
86
 
160
87
  def test_rewhere_with_infinite_upper_bound_range
161
88
  relation = Post.where(comments_count: 1..Float::INFINITY).rewhere(comments_count: 3..5)
162
89
 
163
- assert_equal 1, relation.where_values.size
164
90
  assert_equal Post.where(comments_count: 3..5), relation
165
91
  end
166
92
 
167
93
  def test_rewhere_with_infinite_lower_bound_range
168
94
  relation = Post.where(comments_count: -Float::INFINITY..1).rewhere(comments_count: 3..5)
169
95
 
170
- assert_equal 1, relation.where_values.size
171
96
  assert_equal Post.where(comments_count: 3..5), relation
172
97
  end
173
98
 
174
99
  def test_rewhere_with_infinite_range
175
100
  relation = Post.where(comments_count: -Float::INFINITY..Float::INFINITY).rewhere(comments_count: 3..5)
176
101
 
177
- assert_equal 1, relation.where_values.size
178
102
  assert_equal Post.where(comments_count: 3..5), relation
179
103
  end
180
104
  end
@@ -0,0 +1,182 @@
1
+ require "cases/helper"
2
+
3
+ class ActiveRecord::Relation
4
+ class WhereClauseTest < ActiveRecord::TestCase
5
+ test "+ combines two where clauses" do
6
+ first_clause = WhereClause.new([table["id"].eq(bind_param)], [["id", 1]])
7
+ second_clause = WhereClause.new([table["name"].eq(bind_param)], [["name", "Sean"]])
8
+ combined = WhereClause.new(
9
+ [table["id"].eq(bind_param), table["name"].eq(bind_param)],
10
+ [["id", 1], ["name", "Sean"]],
11
+ )
12
+
13
+ assert_equal combined, first_clause + second_clause
14
+ end
15
+
16
+ test "+ is associative, but not commutative" do
17
+ a = WhereClause.new(["a"], ["bind a"])
18
+ b = WhereClause.new(["b"], ["bind b"])
19
+ c = WhereClause.new(["c"], ["bind c"])
20
+
21
+ assert_equal a + (b + c), (a + b) + c
22
+ assert_not_equal a + b, b + a
23
+ end
24
+
25
+ test "an empty where clause is the identity value for +" do
26
+ clause = WhereClause.new([table["id"].eq(bind_param)], [["id", 1]])
27
+
28
+ assert_equal clause, clause + WhereClause.empty
29
+ end
30
+
31
+ test "merge combines two where clauses" do
32
+ a = WhereClause.new([table["id"].eq(1)], [])
33
+ b = WhereClause.new([table["name"].eq("Sean")], [])
34
+ expected = WhereClause.new([table["id"].eq(1), table["name"].eq("Sean")], [])
35
+
36
+ assert_equal expected, a.merge(b)
37
+ end
38
+
39
+ test "merge keeps the right side, when two equality clauses reference the same column" do
40
+ a = WhereClause.new([table["id"].eq(1), table["name"].eq("Sean")], [])
41
+ b = WhereClause.new([table["name"].eq("Jim")], [])
42
+ expected = WhereClause.new([table["id"].eq(1), table["name"].eq("Jim")], [])
43
+
44
+ assert_equal expected, a.merge(b)
45
+ end
46
+
47
+ test "merge removes bind parameters matching overlapping equality clauses" do
48
+ a = WhereClause.new(
49
+ [table["id"].eq(bind_param), table["name"].eq(bind_param)],
50
+ [attribute("id", 1), attribute("name", "Sean")],
51
+ )
52
+ b = WhereClause.new(
53
+ [table["name"].eq(bind_param)],
54
+ [attribute("name", "Jim")]
55
+ )
56
+ expected = WhereClause.new(
57
+ [table["id"].eq(bind_param), table["name"].eq(bind_param)],
58
+ [attribute("id", 1), attribute("name", "Jim")],
59
+ )
60
+
61
+ assert_equal expected, a.merge(b)
62
+ end
63
+
64
+ test "merge allows for columns with the same name from different tables" do
65
+ skip "This is not possible as of 4.2, and the binds do not yet contain sufficient information for this to happen"
66
+ # We might be able to change the implementation to remove conflicts by index, rather than column name
67
+ end
68
+
69
+ test "a clause knows if it is empty" do
70
+ assert WhereClause.empty.empty?
71
+ assert_not WhereClause.new(["anything"], []).empty?
72
+ end
73
+
74
+ test "invert cannot handle nil" do
75
+ where_clause = WhereClause.new([nil], [])
76
+
77
+ assert_raises ArgumentError do
78
+ where_clause.invert
79
+ end
80
+ end
81
+
82
+ test "invert replaces each part of the predicate with its inverse" do
83
+ random_object = Object.new
84
+ original = WhereClause.new([
85
+ table["id"].in([1, 2, 3]),
86
+ table["id"].eq(1),
87
+ "sql literal",
88
+ random_object
89
+ ], [])
90
+ expected = WhereClause.new([
91
+ table["id"].not_in([1, 2, 3]),
92
+ table["id"].not_eq(1),
93
+ Arel::Nodes::Not.new(Arel::Nodes::SqlLiteral.new("sql literal")),
94
+ Arel::Nodes::Not.new(random_object)
95
+ ], [])
96
+
97
+ assert_equal expected, original.invert
98
+ end
99
+
100
+ test "accept removes binary predicates referencing a given column" do
101
+ where_clause = WhereClause.new([
102
+ table["id"].in([1, 2, 3]),
103
+ table["name"].eq(bind_param),
104
+ table["age"].gteq(bind_param),
105
+ ], [
106
+ attribute("name", "Sean"),
107
+ attribute("age", 30),
108
+ ])
109
+ expected = WhereClause.new([table["age"].gteq(bind_param)], [attribute("age", 30)])
110
+
111
+ assert_equal expected, where_clause.except("id", "name")
112
+ end
113
+
114
+ test "ast groups its predicates with AND" do
115
+ predicates = [
116
+ table["id"].in([1, 2, 3]),
117
+ table["name"].eq(bind_param),
118
+ ]
119
+ where_clause = WhereClause.new(predicates, [])
120
+ expected = Arel::Nodes::And.new(predicates)
121
+
122
+ assert_equal expected, where_clause.ast
123
+ end
124
+
125
+ test "ast wraps any SQL literals in parenthesis" do
126
+ random_object = Object.new
127
+ where_clause = WhereClause.new([
128
+ table["id"].in([1, 2, 3]),
129
+ "foo = bar",
130
+ random_object,
131
+ ], [])
132
+ expected = Arel::Nodes::And.new([
133
+ table["id"].in([1, 2, 3]),
134
+ Arel::Nodes::Grouping.new(Arel.sql("foo = bar")),
135
+ Arel::Nodes::Grouping.new(random_object),
136
+ ])
137
+
138
+ assert_equal expected, where_clause.ast
139
+ end
140
+
141
+ test "ast removes any empty strings" do
142
+ where_clause = WhereClause.new([table["id"].in([1, 2, 3])], [])
143
+ where_clause_with_empty = WhereClause.new([table["id"].in([1, 2, 3]), ''], [])
144
+
145
+ assert_equal where_clause.ast, where_clause_with_empty.ast
146
+ end
147
+
148
+ test "or joins the two clauses using OR" do
149
+ where_clause = WhereClause.new([table["id"].eq(bind_param)], [attribute("id", 1)])
150
+ other_clause = WhereClause.new([table["name"].eq(bind_param)], [attribute("name", "Sean")])
151
+ expected_ast =
152
+ Arel::Nodes::Grouping.new(
153
+ Arel::Nodes::Or.new(table["id"].eq(bind_param), table["name"].eq(bind_param))
154
+ )
155
+ expected_binds = where_clause.binds + other_clause.binds
156
+
157
+ assert_equal expected_ast.to_sql, where_clause.or(other_clause).ast.to_sql
158
+ assert_equal expected_binds, where_clause.or(other_clause).binds
159
+ end
160
+
161
+ test "or returns an empty where clause when either side is empty" do
162
+ where_clause = WhereClause.new([table["id"].eq(bind_param)], [attribute("id", 1)])
163
+
164
+ assert_equal WhereClause.empty, where_clause.or(WhereClause.empty)
165
+ assert_equal WhereClause.empty, WhereClause.empty.or(where_clause)
166
+ end
167
+
168
+ private
169
+
170
+ def table
171
+ Arel::Table.new("table")
172
+ end
173
+
174
+ def bind_param
175
+ Arel::Nodes::BindParam.new
176
+ end
177
+
178
+ def attribute(name, value)
179
+ ActiveRecord::Attribute.with_cast_value(name, value, ActiveRecord::Type::Value.new)
180
+ end
181
+ end
182
+ end
@@ -2,7 +2,7 @@ require "cases/helper"
2
2
  require "models/author"
3
3
  require "models/binary"
4
4
  require "models/cake_designer"
5
- require "models/category"
5
+ require "models/car"
6
6
  require "models/chef"
7
7
  require "models/comment"
8
8
  require "models/edge"
@@ -15,7 +15,7 @@ require "models/vertex"
15
15
 
16
16
  module ActiveRecord
17
17
  class WhereTest < ActiveRecord::TestCase
18
- fixtures :posts, :edges, :authors, :binaries, :essays, :author_addresses
18
+ fixtures :posts, :edges, :authors, :binaries, :essays, :cars, :treasures, :price_estimates
19
19
 
20
20
  def test_where_copies_bind_params
21
21
  author = authors(:david)
@@ -30,6 +30,14 @@ module ActiveRecord
30
30
  }
31
31
  end
32
32
 
33
+ def test_where_copies_bind_params_in_the_right_order
34
+ author = authors(:david)
35
+ posts = author.posts.where.not(id: 1)
36
+ joined = Post.where(id: posts, title: posts.first.title)
37
+
38
+ assert_equal joined, [posts.first]
39
+ end
40
+
33
41
  def test_where_copies_arel_bind_params
34
42
  chef = Chef.create!
35
43
  CakeDesigner.create!(chef: chef)
@@ -107,16 +115,15 @@ module ActiveRecord
107
115
  assert_equal expected.to_sql, actual.to_sql
108
116
  end
109
117
 
110
- def test_polymorphic_empty_array_where
111
- treasure = Treasure.new
112
- treasure.id = 1
113
- hidden = HiddenTreasure.new
114
- hidden.id = 2
118
+ def test_polymorphic_array_where_multiple_types
119
+ treasure_1 = treasures(:diamond)
120
+ treasure_2 = treasures(:sapphire)
121
+ car = cars(:honda)
115
122
 
116
- expected = PriceEstimate.where("1=0")
117
- actual = PriceEstimate.where(estimate_of: [])
123
+ expected = [price_estimates(:diamond), price_estimates(:sapphire_1), price_estimates(:sapphire_2), price_estimates(:honda)].sort
124
+ actual = PriceEstimate.where(estimate_of: [treasure_1, treasure_2, car]).to_a.sort
118
125
 
119
- assert_equal expected.to_a, actual.to_a
126
+ assert_equal expected, actual
120
127
  end
121
128
 
122
129
  def test_polymorphic_nested_relation_where
@@ -207,12 +214,6 @@ module ActiveRecord
207
214
  assert_equal 0, Post.where(:id => []).count
208
215
  end
209
216
 
210
- def test_where_with_table_name_and_nested_empty_array
211
- assert_deprecated do
212
- assert_equal [], Post.where(:id => [[]]).to_a
213
- end
214
- end
215
-
216
217
  def test_where_with_empty_hash_and_no_foreign_key
217
218
  assert_equal 0, Edge.where(:sink => {}).count
218
219
  end
@@ -233,12 +234,10 @@ module ActiveRecord
233
234
  assert_equal 0, count
234
235
  end
235
236
 
236
- unless current_adapter?(:IBM_DBAdapter)
237
237
  def test_where_with_boolean_for_string_column
238
238
  count = Post.where(:title => false).count
239
239
  assert_equal 0, count
240
240
  end
241
- end
242
241
 
243
242
  def test_where_with_decimal_for_string_column
244
243
  count = Post.where(:title => BigDecimal.new(0)).count
@@ -249,12 +248,11 @@ module ActiveRecord
249
248
  count = Post.where(:title => 0.seconds).count
250
249
  assert_equal 0, count
251
250
  end
252
- unless current_adapter?(:IBM_DBAdapter)
251
+
253
252
  def test_where_with_integer_for_binary_column
254
253
  count = Binary.where(:data => 0).count
255
254
  assert_equal 0, count
256
255
  end
257
- end
258
256
 
259
257
  def test_where_on_association_with_custom_primary_key
260
258
  author = authors(:david)
@@ -291,10 +289,34 @@ module ActiveRecord
291
289
  assert_equal essays(:david_modest_proposal), essay
292
290
  end
293
291
 
294
- def test_where_on_non_polymorphic_association_with_custom_primary_key
295
- essay = Essay.where(category: [Category.new(name: "General")]).first
292
+ def test_where_with_strong_parameters
293
+ protected_params = Class.new do
294
+ attr_reader :permitted
295
+ alias :permitted? :permitted
296
296
 
297
- assert_equal essays(:david_modest_proposal), essay
297
+ def initialize(parameters)
298
+ @parameters = parameters
299
+ @permitted = false
300
+ end
301
+
302
+ def to_h
303
+ @parameters
304
+ end
305
+
306
+ def permit!
307
+ @permitted = true
308
+ self
309
+ end
310
+ end
311
+
312
+ author = authors(:david)
313
+ params = protected_params.new(name: author.name)
314
+ assert_raises(ActiveModel::ForbiddenAttributesError) { Author.where(params) }
315
+ assert_equal author, Author.where(params.permit!).first
316
+ end
317
+
318
+ def test_where_with_unsupported_arguments
319
+ assert_raises(ArgumentError) { Author.where(42) }
298
320
  end
299
321
  end
300
322
  end