ibm_db 3.0.5 → 4.0.0

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 (580) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -0
  3. data/LICENSE +1 -1
  4. data/MANIFEST +14 -14
  5. data/ParameterizedQueries README +6 -6
  6. data/README +208 -225
  7. data/ext/Makefile.nt32 +181 -181
  8. data/ext/Makefile.nt32.191 +212 -212
  9. data/ext/extconf.rb +291 -291
  10. data/ext/ibm_db.c +11887 -11887
  11. data/ext/ruby_ibm_db.h +241 -241
  12. data/ext/ruby_ibm_db_cli.c +866 -866
  13. data/ext/ruby_ibm_db_cli.h +500 -500
  14. data/init.rb +41 -41
  15. data/lib/IBM_DB.rb +27 -27
  16. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3452 -3177
  17. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -2
  18. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  19. data/test/active_record/connection_adapters/fake_adapter.rb +49 -46
  20. data/test/assets/example.log +1 -1
  21. data/test/assets/test.txt +1 -1
  22. data/test/cases/adapter_test.rb +351 -276
  23. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
  24. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
  25. data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
  26. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
  27. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
  28. data/test/cases/adapters/mysql2/connection_test.rb +210 -0
  29. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
  30. data/test/cases/adapters/mysql2/enum_test.rb +26 -0
  31. data/test/cases/adapters/mysql2/explain_test.rb +21 -0
  32. data/test/cases/adapters/mysql2/json_test.rb +195 -0
  33. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
  34. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  35. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
  36. data/test/cases/adapters/mysql2/schema_test.rb +126 -0
  37. data/test/cases/adapters/mysql2/sp_test.rb +36 -0
  38. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
  39. data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
  40. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
  41. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
  42. data/test/cases/adapters/postgresql/array_test.rb +339 -0
  43. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
  44. data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
  45. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
  46. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
  47. data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
  48. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  49. data/test/cases/adapters/postgresql/collation_test.rb +53 -0
  50. data/test/cases/adapters/postgresql/composite_test.rb +132 -0
  51. data/test/cases/adapters/postgresql/connection_test.rb +257 -0
  52. data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
  53. data/test/cases/adapters/postgresql/domain_test.rb +47 -0
  54. data/test/cases/adapters/postgresql/enum_test.rb +91 -0
  55. data/test/cases/adapters/postgresql/explain_test.rb +20 -0
  56. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
  57. data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
  58. data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
  59. data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
  60. data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
  61. data/test/cases/adapters/postgresql/integer_test.rb +25 -0
  62. data/test/cases/adapters/postgresql/json_test.rb +237 -0
  63. data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
  64. data/test/cases/adapters/postgresql/money_test.rb +96 -0
  65. data/test/cases/adapters/postgresql/network_test.rb +94 -0
  66. data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
  67. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
  68. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  69. data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
  70. data/test/cases/adapters/postgresql/range_test.rb +343 -0
  71. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
  72. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
  73. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
  74. data/test/cases/adapters/postgresql/schema_test.rb +597 -0
  75. data/test/cases/adapters/postgresql/serial_test.rb +154 -0
  76. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
  77. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
  78. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
  79. data/test/cases/adapters/postgresql/utils_test.rb +62 -0
  80. data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
  81. data/test/cases/adapters/postgresql/xml_test.rb +54 -0
  82. data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
  83. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
  84. data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
  85. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
  86. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
  87. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  88. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
  89. data/test/cases/aggregations_test.rb +168 -158
  90. data/test/cases/ar_schema_test.rb +146 -161
  91. data/test/cases/associations/association_scope_test.rb +16 -21
  92. data/test/cases/associations/belongs_to_associations_test.rb +1141 -1029
  93. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
  94. data/test/cases/associations/callbacks_test.rb +190 -192
  95. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  96. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  97. data/test/cases/associations/eager_load_nested_include_test.rb +126 -128
  98. data/test/cases/associations/eager_singularization_test.rb +148 -148
  99. data/test/cases/associations/eager_test.rb +1514 -1429
  100. data/test/cases/associations/extension_test.rb +87 -82
  101. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -972
  102. data/test/cases/associations/has_many_associations_test.rb +2501 -2182
  103. data/test/cases/associations/has_many_through_associations_test.rb +1271 -1204
  104. data/test/cases/associations/has_one_associations_test.rb +707 -610
  105. data/test/cases/associations/has_one_through_associations_test.rb +383 -380
  106. data/test/cases/associations/inner_join_association_test.rb +139 -139
  107. data/test/cases/associations/inverse_associations_test.rb +733 -706
  108. data/test/cases/associations/join_model_test.rb +777 -754
  109. data/test/cases/associations/left_outer_join_association_test.rb +88 -0
  110. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  111. data/test/cases/associations/required_test.rb +102 -82
  112. data/test/cases/associations_test.rb +385 -380
  113. data/test/cases/attribute_decorators_test.rb +125 -125
  114. data/test/cases/attribute_methods/read_test.rb +60 -60
  115. data/test/cases/attribute_methods_test.rb +1009 -952
  116. data/test/cases/attribute_set_test.rb +270 -210
  117. data/test/cases/attribute_test.rb +246 -180
  118. data/test/cases/attributes_test.rb +253 -136
  119. data/test/cases/autosave_association_test.rb +1708 -1595
  120. data/test/cases/base_test.rb +1713 -1664
  121. data/test/cases/batches_test.rb +489 -212
  122. data/test/cases/binary_test.rb +44 -52
  123. data/test/cases/bind_parameter_test.rb +110 -100
  124. data/test/cases/cache_key_test.rb +25 -0
  125. data/test/cases/calculations_test.rb +798 -646
  126. data/test/cases/callbacks_test.rb +636 -543
  127. data/test/cases/clone_test.rb +40 -40
  128. data/test/cases/coders/json_test.rb +15 -0
  129. data/test/cases/coders/yaml_column_test.rb +63 -63
  130. data/test/cases/collection_cache_key_test.rb +115 -0
  131. data/test/cases/column_alias_test.rb +17 -17
  132. data/test/cases/column_definition_test.rb +92 -123
  133. data/test/cases/comment_test.rb +143 -0
  134. data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -54
  135. data/test/cases/connection_adapters/connection_handler_test.rb +160 -53
  136. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  137. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -293
  138. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -65
  139. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  140. data/test/cases/connection_adapters/schema_cache_test.rb +61 -56
  141. data/test/cases/connection_adapters/type_lookup_test.rb +118 -110
  142. data/test/cases/connection_management_test.rb +112 -122
  143. data/test/cases/connection_pool_test.rb +521 -346
  144. data/test/cases/connection_specification/resolver_test.rb +131 -116
  145. data/test/cases/core_test.rb +112 -112
  146. data/test/cases/counter_cache_test.rb +214 -209
  147. data/test/cases/custom_locking_test.rb +17 -17
  148. data/test/cases/database_statements_test.rb +34 -19
  149. data/test/cases/{invalid_date_test.rb → date_test.rb} +44 -32
  150. data/test/cases/date_time_precision_test.rb +106 -0
  151. data/test/cases/date_time_test.rb +61 -61
  152. data/test/cases/defaults_test.rb +218 -223
  153. data/test/cases/dirty_test.rb +763 -785
  154. data/test/cases/disconnected_test.rb +30 -28
  155. data/test/cases/dup_test.rb +157 -157
  156. data/test/cases/enum_test.rb +444 -290
  157. data/test/cases/errors_test.rb +16 -0
  158. data/test/cases/explain_subscriber_test.rb +64 -64
  159. data/test/cases/explain_test.rb +87 -76
  160. data/test/cases/finder_respond_to_test.rb +60 -60
  161. data/test/cases/finder_test.rb +1294 -1169
  162. data/test/cases/fixture_set/file_test.rb +156 -138
  163. data/test/cases/fixtures_test.rb +988 -908
  164. data/test/cases/forbidden_attributes_protection_test.rb +165 -99
  165. data/test/cases/habtm_destroy_order_test.rb +61 -61
  166. data/test/cases/helper.rb +204 -210
  167. data/test/cases/hot_compatibility_test.rb +142 -54
  168. data/test/cases/i18n_test.rb +45 -45
  169. data/test/cases/inheritance_test.rb +606 -375
  170. data/test/cases/integration_test.rb +155 -139
  171. data/test/cases/invalid_connection_test.rb +24 -22
  172. data/test/cases/invertible_migration_test.rb +387 -295
  173. data/test/cases/json_serialization_test.rb +311 -302
  174. data/test/cases/locking_test.rb +493 -477
  175. data/test/cases/log_subscriber_test.rb +225 -136
  176. data/test/cases/migration/change_schema_test.rb +458 -512
  177. data/test/cases/migration/change_table_test.rb +256 -224
  178. data/test/cases/migration/column_attributes_test.rb +176 -192
  179. data/test/cases/migration/column_positioning_test.rb +56 -56
  180. data/test/cases/migration/columns_test.rb +310 -304
  181. data/test/cases/migration/command_recorder_test.rb +350 -305
  182. data/test/cases/migration/compatibility_test.rb +118 -0
  183. data/test/cases/migration/create_join_table_test.rb +157 -148
  184. data/test/cases/migration/foreign_key_test.rb +360 -328
  185. data/test/cases/migration/helper.rb +39 -39
  186. data/test/cases/migration/index_test.rb +218 -216
  187. data/test/cases/migration/logger_test.rb +36 -36
  188. data/test/cases/migration/pending_migrations_test.rb +52 -53
  189. data/test/cases/migration/references_foreign_key_test.rb +216 -169
  190. data/test/cases/migration/references_index_test.rb +101 -101
  191. data/test/cases/migration/references_statements_test.rb +136 -116
  192. data/test/cases/migration/rename_table_test.rb +93 -93
  193. data/test/cases/migration_test.rb +1157 -959
  194. data/test/cases/migrator_test.rb +470 -388
  195. data/test/cases/mixin_test.rb +68 -70
  196. data/test/cases/modules_test.rb +172 -173
  197. data/test/cases/multiparameter_attributes_test.rb +372 -350
  198. data/test/cases/multiple_db_test.rb +122 -115
  199. data/test/cases/nested_attributes_test.rb +1098 -1070
  200. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  201. data/test/cases/persistence_test.rb +1001 -909
  202. data/test/cases/pooled_connections_test.rb +81 -81
  203. data/test/cases/primary_keys_test.rb +376 -237
  204. data/test/cases/query_cache_test.rb +446 -326
  205. data/test/cases/quoting_test.rb +202 -156
  206. data/test/cases/readonly_test.rb +119 -118
  207. data/test/cases/reaper_test.rb +85 -85
  208. data/test/cases/reflection_test.rb +509 -463
  209. data/test/cases/relation/delegation_test.rb +63 -68
  210. data/test/cases/relation/merging_test.rb +157 -161
  211. data/test/cases/relation/mutation_test.rb +183 -165
  212. data/test/cases/relation/or_test.rb +92 -0
  213. data/test/cases/relation/predicate_builder_test.rb +16 -14
  214. data/test/cases/relation/record_fetch_warning_test.rb +40 -0
  215. data/test/cases/relation/where_chain_test.rb +105 -181
  216. data/test/cases/relation/where_clause_test.rb +182 -0
  217. data/test/cases/relation/where_test.rb +322 -300
  218. data/test/cases/relation_test.rb +328 -319
  219. data/test/cases/relations_test.rb +2026 -1815
  220. data/test/cases/reload_models_test.rb +22 -22
  221. data/test/cases/result_test.rb +90 -80
  222. data/test/cases/sanitize_test.rb +176 -83
  223. data/test/cases/schema_dumper_test.rb +457 -463
  224. data/test/cases/schema_loading_test.rb +52 -0
  225. data/test/cases/scoping/default_scoping_test.rb +528 -454
  226. data/test/cases/scoping/named_scoping_test.rb +561 -524
  227. data/test/cases/scoping/relation_scoping_test.rb +400 -357
  228. data/test/cases/secure_token_test.rb +32 -0
  229. data/test/cases/serialization_test.rb +104 -104
  230. data/test/cases/serialized_attribute_test.rb +364 -277
  231. data/test/cases/statement_cache_test.rb +136 -98
  232. data/test/cases/store_test.rb +195 -194
  233. data/test/cases/suppressor_test.rb +63 -0
  234. data/test/cases/tasks/database_tasks_test.rb +462 -398
  235. data/test/cases/tasks/mysql_rake_test.rb +345 -324
  236. data/test/cases/tasks/postgresql_rake_test.rb +304 -250
  237. data/test/cases/tasks/sqlite_rake_test.rb +220 -193
  238. data/test/cases/test_case.rb +131 -123
  239. data/test/cases/test_fixtures_test.rb +36 -0
  240. data/test/cases/time_precision_test.rb +102 -0
  241. data/test/cases/timestamp_test.rb +501 -467
  242. data/test/cases/touch_later_test.rb +121 -0
  243. data/test/cases/transaction_callbacks_test.rb +518 -452
  244. data/test/cases/transaction_isolation_test.rb +106 -106
  245. data/test/cases/transactions_test.rb +834 -817
  246. data/test/cases/type/adapter_specific_registry_test.rb +133 -0
  247. data/test/cases/type/date_time_test.rb +14 -0
  248. data/test/cases/type/integer_test.rb +27 -121
  249. data/test/cases/type/string_test.rb +22 -36
  250. data/test/cases/type/type_map_test.rb +177 -177
  251. data/test/cases/type_test.rb +39 -0
  252. data/test/cases/types_test.rb +24 -141
  253. data/test/cases/unconnected_test.rb +33 -33
  254. data/test/cases/validations/absence_validation_test.rb +73 -0
  255. data/test/cases/validations/association_validation_test.rb +97 -86
  256. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  257. data/test/cases/validations/i18n_validation_test.rb +86 -90
  258. data/test/cases/validations/length_validation_test.rb +79 -47
  259. data/test/cases/validations/presence_validation_test.rb +103 -68
  260. data/test/cases/validations/uniqueness_validation_test.rb +548 -457
  261. data/test/cases/validations_repair_helper.rb +19 -23
  262. data/test/cases/validations_test.rb +194 -165
  263. data/test/cases/view_test.rb +216 -119
  264. data/test/cases/yaml_serialization_test.rb +121 -126
  265. data/test/config.example.yml +97 -0
  266. data/test/config.rb +5 -5
  267. data/test/fixtures/accounts.yml +29 -29
  268. data/test/fixtures/admin/accounts.yml +2 -2
  269. data/test/fixtures/admin/users.yml +10 -10
  270. data/test/fixtures/author_addresses.original +11 -0
  271. data/test/fixtures/author_addresses.yml +17 -17
  272. data/test/fixtures/author_favorites.yml +3 -3
  273. data/test/fixtures/authors.original +17 -0
  274. data/test/fixtures/authors.yml +23 -23
  275. data/test/fixtures/bad_posts.yml +9 -0
  276. data/test/fixtures/binaries.yml +133 -133
  277. data/test/fixtures/books.yml +31 -11
  278. data/test/fixtures/bulbs.yml +5 -5
  279. data/test/fixtures/cars.yml +9 -9
  280. data/test/fixtures/categories.yml +19 -19
  281. data/test/fixtures/categories/special_categories.yml +9 -9
  282. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  283. data/test/fixtures/categories_ordered.yml +7 -7
  284. data/test/fixtures/categories_posts.yml +31 -31
  285. data/test/fixtures/categorizations.yml +23 -23
  286. data/test/fixtures/clubs.yml +8 -8
  287. data/test/fixtures/collections.yml +3 -3
  288. data/test/fixtures/colleges.yml +3 -3
  289. data/test/fixtures/comments.yml +65 -65
  290. data/test/fixtures/companies.yml +67 -67
  291. data/test/fixtures/computers.yml +10 -10
  292. data/test/fixtures/content.yml +3 -0
  293. data/test/fixtures/content_positions.yml +3 -0
  294. data/test/fixtures/courses.yml +8 -8
  295. data/test/fixtures/customers.yml +25 -25
  296. data/test/fixtures/dashboards.yml +6 -6
  297. data/test/fixtures/dead_parrots.yml +5 -0
  298. data/test/fixtures/developers.yml +22 -22
  299. data/test/fixtures/developers_projects.yml +16 -16
  300. data/test/fixtures/dog_lovers.yml +7 -7
  301. data/test/fixtures/dogs.yml +4 -4
  302. data/test/fixtures/doubloons.yml +3 -3
  303. data/test/fixtures/edges.yml +5 -5
  304. data/test/fixtures/entrants.yml +14 -14
  305. data/test/fixtures/essays.yml +6 -6
  306. data/test/fixtures/faces.yml +11 -11
  307. data/test/fixtures/fk_test_has_fk.yml +3 -3
  308. data/test/fixtures/fk_test_has_pk.yml +1 -1
  309. data/test/fixtures/friendships.yml +4 -4
  310. data/test/fixtures/funny_jokes.yml +10 -10
  311. data/test/fixtures/interests.yml +33 -33
  312. data/test/fixtures/items.yml +3 -3
  313. data/test/fixtures/jobs.yml +7 -7
  314. data/test/fixtures/legacy_things.yml +3 -3
  315. data/test/fixtures/live_parrots.yml +4 -0
  316. data/test/fixtures/mateys.yml +4 -4
  317. data/test/fixtures/member_details.yml +8 -8
  318. data/test/fixtures/member_types.yml +6 -6
  319. data/test/fixtures/members.yml +11 -11
  320. data/test/fixtures/memberships.yml +34 -34
  321. data/test/fixtures/men.yml +5 -5
  322. data/test/fixtures/minimalistics.yml +2 -2
  323. data/test/fixtures/minivans.yml +5 -5
  324. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  325. data/test/fixtures/mixins.yml +29 -29
  326. data/test/fixtures/movies.yml +7 -7
  327. data/test/fixtures/naked/yml/accounts.yml +1 -1
  328. data/test/fixtures/naked/yml/companies.yml +1 -1
  329. data/test/fixtures/naked/yml/courses.yml +1 -1
  330. data/test/fixtures/naked/yml/parrots.yml +2 -0
  331. data/test/fixtures/naked/yml/trees.yml +3 -0
  332. data/test/fixtures/nodes.yml +29 -0
  333. data/test/fixtures/organizations.yml +5 -5
  334. data/test/fixtures/other_comments.yml +6 -0
  335. data/test/fixtures/other_dogs.yml +2 -0
  336. data/test/fixtures/other_posts.yml +7 -0
  337. data/test/fixtures/other_topics.yml +42 -42
  338. data/test/fixtures/owners.yml +9 -9
  339. data/test/fixtures/parrots.yml +27 -27
  340. data/test/fixtures/parrots_pirates.yml +7 -7
  341. data/test/fixtures/people.yml +24 -24
  342. data/test/fixtures/peoples_treasures.yml +3 -3
  343. data/test/fixtures/pets.yml +19 -19
  344. data/test/fixtures/pirates.yml +15 -12
  345. data/test/fixtures/posts.yml +80 -80
  346. data/test/fixtures/price_estimates.yml +16 -7
  347. data/test/fixtures/products.yml +4 -4
  348. data/test/fixtures/projects.yml +7 -7
  349. data/test/fixtures/ratings.yml +14 -14
  350. data/test/fixtures/readers.yml +11 -11
  351. data/test/fixtures/references.yml +17 -17
  352. data/test/fixtures/reserved_words/distinct.yml +5 -5
  353. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  354. data/test/fixtures/reserved_words/group.yml +14 -14
  355. data/test/fixtures/reserved_words/select.yml +8 -8
  356. data/test/fixtures/reserved_words/values.yml +7 -7
  357. data/test/fixtures/ships.yml +6 -6
  358. data/test/fixtures/speedometers.yml +8 -8
  359. data/test/fixtures/sponsors.yml +12 -12
  360. data/test/fixtures/string_key_objects.yml +7 -7
  361. data/test/fixtures/subscribers.yml +10 -10
  362. data/test/fixtures/subscriptions.yml +12 -12
  363. data/test/fixtures/taggings.yml +78 -78
  364. data/test/fixtures/tags.yml +11 -11
  365. data/test/fixtures/tasks.yml +7 -7
  366. data/test/fixtures/teapots.yml +3 -3
  367. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  368. data/test/fixtures/to_be_linked/users.yml +10 -10
  369. data/test/fixtures/topics.yml +49 -49
  370. data/test/fixtures/toys.yml +14 -14
  371. data/test/fixtures/traffic_lights.yml +9 -9
  372. data/test/fixtures/treasures.yml +10 -10
  373. data/test/fixtures/trees.yml +3 -0
  374. data/test/fixtures/uuid_children.yml +3 -3
  375. data/test/fixtures/uuid_parents.yml +2 -2
  376. data/test/fixtures/variants.yml +4 -4
  377. data/test/fixtures/vegetables.yml +19 -19
  378. data/test/fixtures/vertices.yml +3 -3
  379. data/test/fixtures/warehouse_things.yml +2 -2
  380. data/test/fixtures/zines.yml +5 -5
  381. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  382. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  383. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  384. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -9
  385. data/test/migrations/missing/1_people_have_last_names.rb +9 -9
  386. data/test/migrations/missing/3_we_need_reminders.rb +12 -12
  387. data/test/migrations/missing/4_innocent_jointable.rb +12 -12
  388. data/test/migrations/rename/1_we_need_things.rb +11 -11
  389. data/test/migrations/rename/2_rename_things.rb +9 -9
  390. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  391. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  392. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  393. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  394. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  395. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  396. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  397. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  398. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  399. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  400. data/test/migrations/valid/2_we_need_reminders.rb +12 -12
  401. data/test/migrations/valid/3_innocent_jointable.rb +12 -12
  402. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  403. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -12
  404. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -12
  405. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  406. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  407. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  408. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  409. data/test/models/admin.rb +5 -5
  410. data/test/models/admin/account.rb +3 -3
  411. data/test/models/admin/randomly_named_c1.rb +6 -2
  412. data/test/models/admin/user.rb +40 -40
  413. data/test/models/aircraft.rb +5 -4
  414. data/test/models/arunit2_model.rb +3 -3
  415. data/test/models/author.rb +209 -212
  416. data/test/models/auto_id.rb +4 -4
  417. data/test/models/autoloadable/extra_firm.rb +2 -2
  418. data/test/models/binary.rb +2 -2
  419. data/test/models/bird.rb +12 -12
  420. data/test/models/book.rb +23 -18
  421. data/test/models/boolean.rb +2 -2
  422. data/test/models/bulb.rb +52 -51
  423. data/test/models/cake_designer.rb +3 -3
  424. data/test/models/car.rb +29 -26
  425. data/test/models/carrier.rb +2 -2
  426. data/test/models/cat.rb +10 -0
  427. data/test/models/categorization.rb +19 -19
  428. data/test/models/category.rb +35 -35
  429. data/test/models/chef.rb +8 -7
  430. data/test/models/citation.rb +3 -3
  431. data/test/models/club.rb +25 -23
  432. data/test/models/college.rb +10 -10
  433. data/test/models/column.rb +3 -3
  434. data/test/models/column_name.rb +3 -3
  435. data/test/models/comment.rb +76 -64
  436. data/test/models/company.rb +230 -228
  437. data/test/models/company_in_module.rb +98 -98
  438. data/test/models/computer.rb +3 -3
  439. data/test/models/contact.rb +41 -41
  440. data/test/models/content.rb +40 -0
  441. data/test/models/contract.rb +20 -20
  442. data/test/models/country.rb +7 -7
  443. data/test/models/course.rb +6 -6
  444. data/test/models/customer.rb +83 -77
  445. data/test/models/customer_carrier.rb +14 -14
  446. data/test/models/dashboard.rb +3 -3
  447. data/test/models/default.rb +2 -2
  448. data/test/models/department.rb +4 -4
  449. data/test/models/developer.rb +274 -255
  450. data/test/models/dog.rb +5 -5
  451. data/test/models/dog_lover.rb +5 -5
  452. data/test/models/doubloon.rb +12 -12
  453. data/test/models/drink_designer.rb +3 -3
  454. data/test/models/edge.rb +5 -5
  455. data/test/models/electron.rb +5 -5
  456. data/test/models/engine.rb +4 -4
  457. data/test/models/entrant.rb +3 -3
  458. data/test/models/essay.rb +5 -5
  459. data/test/models/event.rb +3 -3
  460. data/test/models/eye.rb +37 -37
  461. data/test/models/face.rb +9 -9
  462. data/test/models/friendship.rb +6 -6
  463. data/test/models/guid.rb +2 -2
  464. data/test/models/guitar.rb +4 -0
  465. data/test/models/hotel.rb +11 -9
  466. data/test/models/image.rb +3 -3
  467. data/test/models/interest.rb +5 -5
  468. data/test/models/invoice.rb +4 -4
  469. data/test/models/item.rb +7 -7
  470. data/test/models/job.rb +7 -7
  471. data/test/models/joke.rb +7 -7
  472. data/test/models/keyboard.rb +3 -3
  473. data/test/models/legacy_thing.rb +3 -3
  474. data/test/models/lesson.rb +11 -11
  475. data/test/models/line_item.rb +3 -3
  476. data/test/models/liquid.rb +4 -4
  477. data/test/models/man.rb +11 -11
  478. data/test/models/matey.rb +4 -4
  479. data/test/models/member.rb +42 -41
  480. data/test/models/member_detail.rb +8 -7
  481. data/test/models/member_type.rb +3 -3
  482. data/test/models/membership.rb +35 -35
  483. data/test/models/mentor.rb +3 -0
  484. data/test/models/minimalistic.rb +2 -2
  485. data/test/models/minivan.rb +9 -9
  486. data/test/models/mixed_case_monkey.rb +3 -3
  487. data/test/models/mocktail_designer.rb +2 -0
  488. data/test/models/molecule.rb +6 -6
  489. data/test/models/movie.rb +5 -5
  490. data/test/models/node.rb +5 -0
  491. data/test/models/non_primary_key.rb +2 -0
  492. data/test/models/notification.rb +3 -0
  493. data/test/models/order.rb +4 -4
  494. data/test/models/organization.rb +14 -14
  495. data/test/models/other_dog.rb +5 -0
  496. data/test/models/owner.rb +37 -34
  497. data/test/models/parrot.rb +28 -29
  498. data/test/models/person.rb +142 -143
  499. data/test/models/personal_legacy_thing.rb +4 -4
  500. data/test/models/pet.rb +18 -15
  501. data/test/models/pet_treasure.rb +6 -0
  502. data/test/models/pirate.rb +92 -92
  503. data/test/models/possession.rb +3 -3
  504. data/test/models/post.rb +273 -264
  505. data/test/models/price_estimate.rb +4 -4
  506. data/test/models/professor.rb +5 -5
  507. data/test/models/project.rb +40 -31
  508. data/test/models/publisher.rb +2 -2
  509. data/test/models/publisher/article.rb +4 -4
  510. data/test/models/publisher/magazine.rb +3 -3
  511. data/test/models/randomly_named_c1.rb +1 -1
  512. data/test/models/rating.rb +4 -4
  513. data/test/models/reader.rb +23 -23
  514. data/test/models/recipe.rb +3 -0
  515. data/test/models/record.rb +2 -2
  516. data/test/models/reference.rb +22 -22
  517. data/test/models/reply.rb +61 -61
  518. data/test/models/ship.rb +39 -33
  519. data/test/models/ship_part.rb +8 -8
  520. data/test/models/shop.rb +17 -17
  521. data/test/models/shop_account.rb +6 -6
  522. data/test/models/speedometer.rb +6 -6
  523. data/test/models/sponsor.rb +7 -7
  524. data/test/models/string_key_object.rb +3 -3
  525. data/test/models/student.rb +4 -4
  526. data/test/models/subject.rb +16 -16
  527. data/test/models/subscriber.rb +8 -8
  528. data/test/models/subscription.rb +4 -4
  529. data/test/models/tag.rb +13 -7
  530. data/test/models/tagging.rb +13 -13
  531. data/test/models/task.rb +5 -5
  532. data/test/models/topic.rb +118 -124
  533. data/test/models/toy.rb +6 -6
  534. data/test/models/traffic_light.rb +4 -4
  535. data/test/models/treasure.rb +14 -14
  536. data/test/models/treaty.rb +7 -7
  537. data/test/models/tree.rb +3 -0
  538. data/test/models/tuning_peg.rb +4 -0
  539. data/test/models/tyre.rb +11 -11
  540. data/test/models/user.rb +14 -0
  541. data/test/models/uuid_child.rb +3 -3
  542. data/test/models/uuid_item.rb +6 -0
  543. data/test/models/uuid_parent.rb +3 -3
  544. data/test/models/vegetables.rb +24 -24
  545. data/test/models/vehicle.rb +6 -6
  546. data/test/models/vertex.rb +9 -9
  547. data/test/models/warehouse_thing.rb +5 -5
  548. data/test/models/wheel.rb +3 -3
  549. data/test/models/without_table.rb +3 -3
  550. data/test/models/zine.rb +3 -3
  551. data/test/schema/mysql2_specific_schema.rb +68 -58
  552. data/test/schema/oracle_specific_schema.rb +40 -43
  553. data/test/schema/postgresql_specific_schema.rb +114 -202
  554. data/test/schema/schema.rb +1057 -952
  555. data/test/schema/schema.rb.original +1057 -0
  556. data/test/schema/sqlite_specific_schema.rb +18 -22
  557. data/test/support/config.rb +43 -43
  558. data/test/support/connection.rb +23 -22
  559. data/test/support/connection_helper.rb +14 -14
  560. data/test/support/ddl_helper.rb +8 -8
  561. data/test/support/schema_dumping_helper.rb +20 -20
  562. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  563. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  564. metadata +129 -24
  565. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
  566. data/test/cases/attribute_methods/serialization_test.rb +0 -29
  567. data/test/cases/migration/change_schema_test - Copy.rb +0 -448
  568. data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
  569. data/test/cases/migration/table_and_index_test.rb +0 -24
  570. data/test/cases/relation/where_test2.rb +0 -36
  571. data/test/cases/type/decimal_test.rb +0 -56
  572. data/test/cases/type/unsigned_integer_test.rb +0 -18
  573. data/test/cases/xml_serialization_test.rb +0 -457
  574. data/test/connections/native_ibm_db/connection.rb +0 -44
  575. data/test/fixtures/naked/csv/accounts.csv +0 -1
  576. data/test/schema/i5/ibm_db_specific_schema.rb +0 -137
  577. data/test/schema/ids/ibm_db_specific_schema.rb +0 -140
  578. data/test/schema/luw/ibm_db_specific_schema.rb +0 -137
  579. data/test/schema/mysql_specific_schema.rb +0 -70
  580. data/test/schema/zOS/ibm_db_specific_schema.rb +0 -208
@@ -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
@@ -1,300 +1,322 @@
1
- require "cases/helper"
2
- require "models/author"
3
- require "models/binary"
4
- require "models/cake_designer"
5
- require "models/category"
6
- require "models/chef"
7
- require "models/comment"
8
- require "models/edge"
9
- require "models/essay"
10
- require "models/post"
11
- require "models/price_estimate"
12
- require "models/topic"
13
- require "models/treasure"
14
- require "models/vertex"
15
-
16
- module ActiveRecord
17
- class WhereTest < ActiveRecord::TestCase
18
- fixtures :posts, :edges, :authors, :binaries, :essays, :author_addresses
19
-
20
- def test_where_copies_bind_params
21
- author = authors(:david)
22
- posts = author.posts.where('posts.id != 1')
23
- joined = Post.where(id: posts)
24
-
25
- assert_operator joined.length, :>, 0
26
-
27
- joined.each { |post|
28
- assert_equal author, post.author
29
- assert_not_equal 1, post.id
30
- }
31
- end
32
-
33
- def test_where_copies_arel_bind_params
34
- chef = Chef.create!
35
- CakeDesigner.create!(chef: chef)
36
-
37
- cake_designers = CakeDesigner.joins(:chef).where(chefs: { id: chef.id })
38
- chefs = Chef.where(employable: cake_designers)
39
-
40
- assert_equal [chef], chefs.to_a
41
- end
42
-
43
- def test_rewhere_on_root
44
- assert_equal posts(:welcome), Post.rewhere(title: 'Welcome to the weblog').first
45
- end
46
-
47
- def test_belongs_to_shallow_where
48
- author = Author.new
49
- author.id = 1
50
-
51
- assert_equal Post.where(author_id: 1).to_sql, Post.where(author: author).to_sql
52
- end
53
-
54
- def test_belongs_to_nil_where
55
- assert_equal Post.where(author_id: nil).to_sql, Post.where(author: nil).to_sql
56
- end
57
-
58
- def test_belongs_to_array_value_where
59
- assert_equal Post.where(author_id: [1,2]).to_sql, Post.where(author: [1,2]).to_sql
60
- end
61
-
62
- def test_belongs_to_nested_relation_where
63
- expected = Post.where(author_id: Author.where(id: [1,2])).to_sql
64
- actual = Post.where(author: Author.where(id: [1,2])).to_sql
65
-
66
- assert_equal expected, actual
67
- end
68
-
69
- def test_belongs_to_nested_where
70
- parent = Comment.new
71
- parent.id = 1
72
-
73
- expected = Post.where(comments: { parent_id: 1 }).joins(:comments)
74
- actual = Post.where(comments: { parent: parent }).joins(:comments)
75
-
76
- assert_equal expected.to_sql, actual.to_sql
77
- end
78
-
79
- def test_belongs_to_nested_where_with_relation
80
- author = authors(:david)
81
-
82
- expected = Author.where(id: author ).joins(:posts)
83
- actual = Author.where(posts: { author_id: Author.where(id: author.id) }).joins(:posts)
84
-
85
- assert_equal expected.to_a, actual.to_a
86
- end
87
-
88
- def test_polymorphic_shallow_where
89
- treasure = Treasure.new
90
- treasure.id = 1
91
-
92
- expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
93
- actual = PriceEstimate.where(estimate_of: treasure)
94
-
95
- assert_equal expected.to_sql, actual.to_sql
96
- end
97
-
98
- def test_polymorphic_nested_array_where
99
- treasure = Treasure.new
100
- treasure.id = 1
101
- hidden = HiddenTreasure.new
102
- hidden.id = 2
103
-
104
- expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: [treasure, hidden])
105
- actual = PriceEstimate.where(estimate_of: [treasure, hidden])
106
-
107
- assert_equal expected.to_sql, actual.to_sql
108
- end
109
-
110
- def test_polymorphic_empty_array_where
111
- treasure = Treasure.new
112
- treasure.id = 1
113
- hidden = HiddenTreasure.new
114
- hidden.id = 2
115
-
116
- expected = PriceEstimate.where("1=0")
117
- actual = PriceEstimate.where(estimate_of: [])
118
-
119
- assert_equal expected.to_a, actual.to_a
120
- end
121
-
122
- def test_polymorphic_nested_relation_where
123
- expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: Treasure.where(id: [1,2]))
124
- actual = PriceEstimate.where(estimate_of: Treasure.where(id: [1,2]))
125
-
126
- assert_equal expected.to_sql, actual.to_sql
127
- end
128
-
129
- def test_polymorphic_sti_shallow_where
130
- treasure = HiddenTreasure.new
131
- treasure.id = 1
132
-
133
- expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
134
- actual = PriceEstimate.where(estimate_of: treasure)
135
-
136
- assert_equal expected.to_sql, actual.to_sql
137
- end
138
-
139
- def test_polymorphic_nested_where
140
- thing = Post.new
141
- thing.id = 1
142
-
143
- expected = Treasure.where(price_estimates: { thing_type: 'Post', thing_id: 1 }).joins(:price_estimates)
144
- actual = Treasure.where(price_estimates: { thing: thing }).joins(:price_estimates)
145
-
146
- assert_equal expected.to_sql, actual.to_sql
147
- end
148
-
149
- def test_polymorphic_sti_nested_where
150
- treasure = HiddenTreasure.new
151
- treasure.id = 1
152
-
153
- expected = Treasure.where(price_estimates: { estimate_of_type: 'Treasure', estimate_of_id: 1 }).joins(:price_estimates)
154
- actual = Treasure.where(price_estimates: { estimate_of: treasure }).joins(:price_estimates)
155
-
156
- assert_equal expected.to_sql, actual.to_sql
157
- end
158
-
159
- def test_decorated_polymorphic_where
160
- treasure_decorator = Struct.new(:model) do
161
- def self.method_missing(method, *args, &block)
162
- Treasure.send(method, *args, &block)
163
- end
164
-
165
- def is_a?(klass)
166
- model.is_a?(klass)
167
- end
168
-
169
- def method_missing(method, *args, &block)
170
- model.send(method, *args, &block)
171
- end
172
- end
173
-
174
- treasure = Treasure.new
175
- treasure.id = 1
176
- decorated_treasure = treasure_decorator.new(treasure)
177
-
178
- expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
179
- actual = PriceEstimate.where(estimate_of: decorated_treasure)
180
-
181
- assert_equal expected.to_sql, actual.to_sql
182
- end
183
-
184
- def test_aliased_attribute
185
- expected = Topic.where(heading: 'The First Topic')
186
- actual = Topic.where(title: 'The First Topic')
187
-
188
- assert_equal expected.to_sql, actual.to_sql
189
- end
190
-
191
- def test_where_error
192
- assert_raises(ActiveRecord::StatementInvalid) do
193
- Post.where(:id => { 'posts.author_id' => 10 }).first
194
- end
195
- end
196
-
197
- def test_where_with_table_name
198
- post = Post.first
199
- assert_equal post, Post.where(:posts => { 'id' => post.id }).first
200
- end
201
-
202
- def test_where_with_table_name_and_empty_hash
203
- assert_equal 0, Post.where(:posts => {}).count
204
- end
205
-
206
- def test_where_with_table_name_and_empty_array
207
- assert_equal 0, Post.where(:id => []).count
208
- end
209
-
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
- def test_where_with_empty_hash_and_no_foreign_key
217
- assert_equal 0, Edge.where(:sink => {}).count
218
- end
219
-
220
- def test_where_with_blank_conditions
221
- [[], {}, nil, ""].each do |blank|
222
- assert_equal 4, Edge.where(blank).order("sink_id").to_a.size
223
- end
224
- end
225
-
226
- def test_where_with_integer_for_string_column
227
- count = Post.where(:title => 0).count
228
- assert_equal 0, count
229
- end
230
-
231
- def test_where_with_float_for_string_column
232
- count = Post.where(:title => 0.0).count
233
- assert_equal 0, count
234
- end
235
-
236
- unless current_adapter?(:IBM_DBAdapter)
237
- def test_where_with_boolean_for_string_column
238
- count = Post.where(:title => false).count
239
- assert_equal 0, count
240
- end
241
- end
242
-
243
- def test_where_with_decimal_for_string_column
244
- count = Post.where(:title => BigDecimal.new(0)).count
245
- assert_equal 0, count
246
- end
247
-
248
- def test_where_with_duration_for_string_column
249
- count = Post.where(:title => 0.seconds).count
250
- assert_equal 0, count
251
- end
252
- unless current_adapter?(:IBM_DBAdapter)
253
- def test_where_with_integer_for_binary_column
254
- count = Binary.where(:data => 0).count
255
- assert_equal 0, count
256
- end
257
- end
258
-
259
- def test_where_on_association_with_custom_primary_key
260
- author = authors(:david)
261
- essay = Essay.where(writer: author).first
262
-
263
- assert_equal essays(:david_modest_proposal), essay
264
- end
265
-
266
- def test_where_on_association_with_custom_primary_key_with_relation
267
- author = authors(:david)
268
- essay = Essay.where(writer: Author.where(id: author.id)).first
269
-
270
- assert_equal essays(:david_modest_proposal), essay
271
- end
272
-
273
- def test_where_on_association_with_relation_performs_subselect_not_two_queries
274
- author = authors(:david)
275
-
276
- assert_queries(1) do
277
- Essay.where(writer: Author.where(id: author.id)).to_a
278
- end
279
- end
280
-
281
- def test_where_on_association_with_custom_primary_key_with_array_of_base
282
- author = authors(:david)
283
- essay = Essay.where(writer: [author]).first
284
-
285
- assert_equal essays(:david_modest_proposal), essay
286
- end
287
-
288
- def test_where_on_association_with_custom_primary_key_with_array_of_ids
289
- essay = Essay.where(writer: ["David"]).first
290
-
291
- assert_equal essays(:david_modest_proposal), essay
292
- end
293
-
294
- def test_where_on_non_polymorphic_association_with_custom_primary_key
295
- essay = Essay.where(category: [Category.new(name: "General")]).first
296
-
297
- assert_equal essays(:david_modest_proposal), essay
298
- end
299
- end
300
- end
1
+ require "cases/helper"
2
+ require "models/author"
3
+ require "models/binary"
4
+ require "models/cake_designer"
5
+ require "models/car"
6
+ require "models/chef"
7
+ require "models/comment"
8
+ require "models/edge"
9
+ require "models/essay"
10
+ require "models/post"
11
+ require "models/price_estimate"
12
+ require "models/topic"
13
+ require "models/treasure"
14
+ require "models/vertex"
15
+
16
+ module ActiveRecord
17
+ class WhereTest < ActiveRecord::TestCase
18
+ fixtures :posts, :edges, :authors, :binaries, :essays, :cars, :treasures, :price_estimates
19
+
20
+ def test_where_copies_bind_params
21
+ author = authors(:david)
22
+ posts = author.posts.where('posts.id != 1')
23
+ joined = Post.where(id: posts)
24
+
25
+ assert_operator joined.length, :>, 0
26
+
27
+ joined.each { |post|
28
+ assert_equal author, post.author
29
+ assert_not_equal 1, post.id
30
+ }
31
+ end
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
+
41
+ def test_where_copies_arel_bind_params
42
+ chef = Chef.create!
43
+ CakeDesigner.create!(chef: chef)
44
+
45
+ cake_designers = CakeDesigner.joins(:chef).where(chefs: { id: chef.id })
46
+ chefs = Chef.where(employable: cake_designers)
47
+
48
+ assert_equal [chef], chefs.to_a
49
+ end
50
+
51
+ def test_rewhere_on_root
52
+ assert_equal posts(:welcome), Post.rewhere(title: 'Welcome to the weblog').first
53
+ end
54
+
55
+ def test_belongs_to_shallow_where
56
+ author = Author.new
57
+ author.id = 1
58
+
59
+ assert_equal Post.where(author_id: 1).to_sql, Post.where(author: author).to_sql
60
+ end
61
+
62
+ def test_belongs_to_nil_where
63
+ assert_equal Post.where(author_id: nil).to_sql, Post.where(author: nil).to_sql
64
+ end
65
+
66
+ def test_belongs_to_array_value_where
67
+ assert_equal Post.where(author_id: [1,2]).to_sql, Post.where(author: [1,2]).to_sql
68
+ end
69
+
70
+ def test_belongs_to_nested_relation_where
71
+ expected = Post.where(author_id: Author.where(id: [1,2])).to_sql
72
+ actual = Post.where(author: Author.where(id: [1,2])).to_sql
73
+
74
+ assert_equal expected, actual
75
+ end
76
+
77
+ def test_belongs_to_nested_where
78
+ parent = Comment.new
79
+ parent.id = 1
80
+
81
+ expected = Post.where(comments: { parent_id: 1 }).joins(:comments)
82
+ actual = Post.where(comments: { parent: parent }).joins(:comments)
83
+
84
+ assert_equal expected.to_sql, actual.to_sql
85
+ end
86
+
87
+ def test_belongs_to_nested_where_with_relation
88
+ author = authors(:david)
89
+
90
+ expected = Author.where(id: author ).joins(:posts)
91
+ actual = Author.where(posts: { author_id: Author.where(id: author.id) }).joins(:posts)
92
+
93
+ assert_equal expected.to_a, actual.to_a
94
+ end
95
+
96
+ def test_polymorphic_shallow_where
97
+ treasure = Treasure.new
98
+ treasure.id = 1
99
+
100
+ expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
101
+ actual = PriceEstimate.where(estimate_of: treasure)
102
+
103
+ assert_equal expected.to_sql, actual.to_sql
104
+ end
105
+
106
+ def test_polymorphic_nested_array_where
107
+ treasure = Treasure.new
108
+ treasure.id = 1
109
+ hidden = HiddenTreasure.new
110
+ hidden.id = 2
111
+
112
+ expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: [treasure, hidden])
113
+ actual = PriceEstimate.where(estimate_of: [treasure, hidden])
114
+
115
+ assert_equal expected.to_sql, actual.to_sql
116
+ end
117
+
118
+ def test_polymorphic_array_where_multiple_types
119
+ treasure_1 = treasures(:diamond)
120
+ treasure_2 = treasures(:sapphire)
121
+ car = cars(:honda)
122
+
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
125
+
126
+ assert_equal expected, actual
127
+ end
128
+
129
+ def test_polymorphic_nested_relation_where
130
+ expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: Treasure.where(id: [1,2]))
131
+ actual = PriceEstimate.where(estimate_of: Treasure.where(id: [1,2]))
132
+
133
+ assert_equal expected.to_sql, actual.to_sql
134
+ end
135
+
136
+ def test_polymorphic_sti_shallow_where
137
+ treasure = HiddenTreasure.new
138
+ treasure.id = 1
139
+
140
+ expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
141
+ actual = PriceEstimate.where(estimate_of: treasure)
142
+
143
+ assert_equal expected.to_sql, actual.to_sql
144
+ end
145
+
146
+ def test_polymorphic_nested_where
147
+ thing = Post.new
148
+ thing.id = 1
149
+
150
+ expected = Treasure.where(price_estimates: { thing_type: 'Post', thing_id: 1 }).joins(:price_estimates)
151
+ actual = Treasure.where(price_estimates: { thing: thing }).joins(:price_estimates)
152
+
153
+ assert_equal expected.to_sql, actual.to_sql
154
+ end
155
+
156
+ def test_polymorphic_sti_nested_where
157
+ treasure = HiddenTreasure.new
158
+ treasure.id = 1
159
+
160
+ expected = Treasure.where(price_estimates: { estimate_of_type: 'Treasure', estimate_of_id: 1 }).joins(:price_estimates)
161
+ actual = Treasure.where(price_estimates: { estimate_of: treasure }).joins(:price_estimates)
162
+
163
+ assert_equal expected.to_sql, actual.to_sql
164
+ end
165
+
166
+ def test_decorated_polymorphic_where
167
+ treasure_decorator = Struct.new(:model) do
168
+ def self.method_missing(method, *args, &block)
169
+ Treasure.send(method, *args, &block)
170
+ end
171
+
172
+ def is_a?(klass)
173
+ model.is_a?(klass)
174
+ end
175
+
176
+ def method_missing(method, *args, &block)
177
+ model.send(method, *args, &block)
178
+ end
179
+ end
180
+
181
+ treasure = Treasure.new
182
+ treasure.id = 1
183
+ decorated_treasure = treasure_decorator.new(treasure)
184
+
185
+ expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
186
+ actual = PriceEstimate.where(estimate_of: decorated_treasure)
187
+
188
+ assert_equal expected.to_sql, actual.to_sql
189
+ end
190
+
191
+ def test_aliased_attribute
192
+ expected = Topic.where(heading: 'The First Topic')
193
+ actual = Topic.where(title: 'The First Topic')
194
+
195
+ assert_equal expected.to_sql, actual.to_sql
196
+ end
197
+
198
+ def test_where_error
199
+ assert_raises(ActiveRecord::StatementInvalid) do
200
+ Post.where(:id => { 'posts.author_id' => 10 }).first
201
+ end
202
+ end
203
+
204
+ def test_where_with_table_name
205
+ post = Post.first
206
+ assert_equal post, Post.where(:posts => { 'id' => post.id }).first
207
+ end
208
+
209
+ def test_where_with_table_name_and_empty_hash
210
+ assert_equal 0, Post.where(:posts => {}).count
211
+ end
212
+
213
+ def test_where_with_table_name_and_empty_array
214
+ assert_equal 0, Post.where(:id => []).count
215
+ end
216
+
217
+ def test_where_with_empty_hash_and_no_foreign_key
218
+ assert_equal 0, Edge.where(:sink => {}).count
219
+ end
220
+
221
+ def test_where_with_blank_conditions
222
+ [[], {}, nil, ""].each do |blank|
223
+ assert_equal 4, Edge.where(blank).order("sink_id").to_a.size
224
+ end
225
+ end
226
+
227
+ def test_where_with_integer_for_string_column
228
+ count = Post.where(:title => 0).count
229
+ assert_equal 0, count
230
+ end
231
+
232
+ def test_where_with_float_for_string_column
233
+ count = Post.where(:title => 0.0).count
234
+ assert_equal 0, count
235
+ end
236
+
237
+ def test_where_with_boolean_for_string_column
238
+ count = Post.where(:title => false).count
239
+ assert_equal 0, count
240
+ end
241
+
242
+ def test_where_with_decimal_for_string_column
243
+ count = Post.where(:title => BigDecimal.new(0)).count
244
+ assert_equal 0, count
245
+ end
246
+
247
+ def test_where_with_duration_for_string_column
248
+ count = Post.where(:title => 0.seconds).count
249
+ assert_equal 0, count
250
+ end
251
+
252
+ def test_where_with_integer_for_binary_column
253
+ count = Binary.where(:data => 0).count
254
+ assert_equal 0, count
255
+ end
256
+
257
+ def test_where_on_association_with_custom_primary_key
258
+ author = authors(:david)
259
+ essay = Essay.where(writer: author).first
260
+
261
+ assert_equal essays(:david_modest_proposal), essay
262
+ end
263
+
264
+ def test_where_on_association_with_custom_primary_key_with_relation
265
+ author = authors(:david)
266
+ essay = Essay.where(writer: Author.where(id: author.id)).first
267
+
268
+ assert_equal essays(:david_modest_proposal), essay
269
+ end
270
+
271
+ def test_where_on_association_with_relation_performs_subselect_not_two_queries
272
+ author = authors(:david)
273
+
274
+ assert_queries(1) do
275
+ Essay.where(writer: Author.where(id: author.id)).to_a
276
+ end
277
+ end
278
+
279
+ def test_where_on_association_with_custom_primary_key_with_array_of_base
280
+ author = authors(:david)
281
+ essay = Essay.where(writer: [author]).first
282
+
283
+ assert_equal essays(:david_modest_proposal), essay
284
+ end
285
+
286
+ def test_where_on_association_with_custom_primary_key_with_array_of_ids
287
+ essay = Essay.where(writer: ["David"]).first
288
+
289
+ assert_equal essays(:david_modest_proposal), essay
290
+ end
291
+
292
+ def test_where_with_strong_parameters
293
+ protected_params = Class.new do
294
+ attr_reader :permitted
295
+ alias :permitted? :permitted
296
+
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) }
320
+ end
321
+ end
322
+ end