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