ibm_db 3.0.5-x86-mingw32 → 5.0.5-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES +4 -0
  3. data/LICENSE +1 -1
  4. data/ParameterizedQueries README +6 -6
  5. data/README +38 -55
  6. data/ext/Makefile +269 -0
  7. data/ext/extconf.rb +34 -3
  8. data/ext/gil_release_version +3 -0
  9. data/ext/ibm_db-i386-mingw32.def +2 -0
  10. data/ext/ibm_db.c +100 -108
  11. data/ext/ibm_db.o +0 -0
  12. data/ext/ibm_db.so +0 -0
  13. data/ext/mkmf.log +110 -0
  14. data/ext/ruby_ibm_db_cli.o +0 -0
  15. data/ext/unicode_support_version +3 -0
  16. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +923 -527
  17. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +4 -1
  18. data/lib/mswin32/ibm_db.rb +7 -39
  19. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  20. data/test/active_record/connection_adapters/fake_adapter.rb +8 -5
  21. data/test/cases/adapter_test.rb +133 -58
  22. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
  23. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
  24. data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
  25. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
  26. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
  27. data/test/cases/adapters/mysql2/connection_test.rb +210 -0
  28. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
  29. data/test/cases/adapters/mysql2/enum_test.rb +26 -0
  30. data/test/cases/adapters/mysql2/explain_test.rb +21 -0
  31. data/test/cases/adapters/mysql2/json_test.rb +195 -0
  32. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
  33. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  34. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
  35. data/test/cases/adapters/mysql2/schema_test.rb +126 -0
  36. data/test/cases/adapters/mysql2/sp_test.rb +36 -0
  37. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
  38. data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
  39. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
  40. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
  41. data/test/cases/adapters/postgresql/array_test.rb +339 -0
  42. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
  43. data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
  44. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
  45. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
  46. data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
  47. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  48. data/test/cases/adapters/postgresql/collation_test.rb +53 -0
  49. data/test/cases/adapters/postgresql/composite_test.rb +132 -0
  50. data/test/cases/adapters/postgresql/connection_test.rb +257 -0
  51. data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
  52. data/test/cases/adapters/postgresql/domain_test.rb +47 -0
  53. data/test/cases/adapters/postgresql/enum_test.rb +91 -0
  54. data/test/cases/adapters/postgresql/explain_test.rb +20 -0
  55. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
  56. data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
  57. data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
  58. data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
  59. data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
  60. data/test/cases/adapters/postgresql/integer_test.rb +25 -0
  61. data/test/cases/adapters/postgresql/json_test.rb +237 -0
  62. data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
  63. data/test/cases/adapters/postgresql/money_test.rb +96 -0
  64. data/test/cases/adapters/postgresql/network_test.rb +94 -0
  65. data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
  66. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
  67. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  68. data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
  69. data/test/cases/adapters/postgresql/range_test.rb +343 -0
  70. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
  71. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
  72. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
  73. data/test/cases/adapters/postgresql/schema_test.rb +597 -0
  74. data/test/cases/adapters/postgresql/serial_test.rb +154 -0
  75. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
  76. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
  77. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
  78. data/test/cases/adapters/postgresql/utils_test.rb +62 -0
  79. data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
  80. data/test/cases/adapters/postgresql/xml_test.rb +54 -0
  81. data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
  82. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
  83. data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
  84. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
  85. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
  86. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  87. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
  88. data/test/cases/aggregations_test.rb +11 -1
  89. data/test/cases/ar_schema_test.rb +35 -50
  90. data/test/cases/associations/association_scope_test.rb +1 -6
  91. data/test/cases/associations/belongs_to_associations_test.rb +122 -10
  92. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
  93. data/test/cases/associations/callbacks_test.rb +5 -7
  94. data/test/cases/associations/cascaded_eager_loading_test.rb +1 -1
  95. data/test/cases/associations/eager_load_nested_include_test.rb +1 -3
  96. data/test/cases/associations/eager_test.rb +158 -73
  97. data/test/cases/associations/extension_test.rb +7 -2
  98. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +64 -32
  99. data/test/cases/associations/has_many_associations_test.rb +362 -43
  100. data/test/cases/associations/has_many_through_associations_test.rb +108 -41
  101. data/test/cases/associations/has_one_associations_test.rb +105 -8
  102. data/test/cases/associations/has_one_through_associations_test.rb +6 -3
  103. data/test/cases/associations/inner_join_association_test.rb +3 -3
  104. data/test/cases/associations/inverse_associations_test.rb +38 -11
  105. data/test/cases/associations/join_model_test.rb +59 -36
  106. data/test/cases/associations/left_outer_join_association_test.rb +88 -0
  107. data/test/cases/associations/nested_through_associations_test.rb +2 -2
  108. data/test/cases/associations/required_test.rb +25 -5
  109. data/test/cases/associations_test.rb +39 -34
  110. data/test/cases/attribute_decorators_test.rb +9 -8
  111. data/test/cases/attribute_methods/read_test.rb +5 -5
  112. data/test/cases/attribute_methods_test.rb +97 -40
  113. data/test/cases/attribute_set_test.rb +64 -4
  114. data/test/cases/attribute_test.rb +84 -18
  115. data/test/cases/attributes_test.rb +151 -34
  116. data/test/cases/autosave_association_test.rb +149 -36
  117. data/test/cases/base_test.rb +290 -241
  118. data/test/cases/batches_test.rb +299 -22
  119. data/test/cases/binary_test.rb +2 -10
  120. data/test/cases/bind_parameter_test.rb +76 -66
  121. data/test/cases/cache_key_test.rb +26 -0
  122. data/test/cases/calculations_test.rb +167 -15
  123. data/test/cases/callbacks_test.rb +161 -68
  124. data/test/cases/coders/json_test.rb +15 -0
  125. data/test/cases/collection_cache_key_test.rb +115 -0
  126. data/test/cases/column_definition_test.rb +26 -57
  127. data/test/cases/comment_test.rb +145 -0
  128. data/test/cases/connection_adapters/adapter_leasing_test.rb +5 -3
  129. data/test/cases/connection_adapters/connection_handler_test.rb +128 -21
  130. data/test/cases/connection_adapters/connection_specification_test.rb +1 -1
  131. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +0 -38
  132. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -1
  133. data/test/cases/connection_adapters/schema_cache_test.rb +8 -3
  134. data/test/cases/connection_adapters/type_lookup_test.rb +15 -7
  135. data/test/cases/connection_management_test.rb +46 -56
  136. data/test/cases/connection_pool_test.rb +195 -20
  137. data/test/cases/connection_specification/resolver_test.rb +15 -0
  138. data/test/cases/counter_cache_test.rb +10 -5
  139. data/test/cases/custom_locking_test.rb +1 -1
  140. data/test/cases/database_statements_test.rb +18 -3
  141. data/test/cases/{invalid_date_test.rb → date_test.rb} +13 -1
  142. data/test/cases/date_time_precision_test.rb +107 -0
  143. data/test/cases/defaults_test.rb +85 -89
  144. data/test/cases/dirty_test.rb +30 -52
  145. data/test/cases/disconnected_test.rb +4 -2
  146. data/test/cases/enum_test.rb +178 -24
  147. data/test/cases/errors_test.rb +16 -0
  148. data/test/cases/explain_test.rb +32 -21
  149. data/test/cases/finder_test.rb +273 -148
  150. data/test/cases/fixture_set/file_test.rb +18 -0
  151. data/test/cases/fixtures_test.rb +112 -32
  152. data/test/cases/forbidden_attributes_protection_test.rb +69 -3
  153. data/test/cases/helper.rb +10 -16
  154. data/test/cases/hot_compatibility_test.rb +89 -1
  155. data/test/cases/inheritance_test.rb +284 -53
  156. data/test/cases/integration_test.rb +23 -7
  157. data/test/cases/invalid_connection_test.rb +4 -2
  158. data/test/cases/invertible_migration_test.rb +124 -32
  159. data/test/cases/json_serialization_test.rb +11 -2
  160. data/test/cases/locking_test.rb +22 -6
  161. data/test/cases/log_subscriber_test.rb +106 -17
  162. data/test/cases/migration/change_schema_test.rb +60 -114
  163. data/test/cases/migration/change_table_test.rb +34 -2
  164. data/test/cases/migration/column_attributes_test.rb +7 -23
  165. data/test/cases/migration/column_positioning_test.rb +8 -8
  166. data/test/cases/migration/columns_test.rb +17 -11
  167. data/test/cases/migration/command_recorder_test.rb +47 -2
  168. data/test/cases/migration/compatibility_test.rb +118 -0
  169. data/test/cases/migration/create_join_table_test.rb +21 -12
  170. data/test/cases/migration/foreign_key_test.rb +52 -18
  171. data/test/cases/migration/index_test.rb +14 -12
  172. data/test/cases/migration/logger_test.rb +1 -1
  173. data/test/cases/migration/pending_migrations_test.rb +0 -1
  174. data/test/cases/migration/references_foreign_key_test.rb +59 -7
  175. data/test/cases/migration/references_index_test.rb +4 -4
  176. data/test/cases/migration/references_statements_test.rb +26 -6
  177. data/test/cases/migration/rename_table_test.rb +25 -25
  178. data/test/cases/migration_test.rb +279 -81
  179. data/test/cases/migrator_test.rb +91 -8
  180. data/test/cases/mixin_test.rb +0 -2
  181. data/test/cases/modules_test.rb +3 -4
  182. data/test/cases/multiparameter_attributes_test.rb +24 -2
  183. data/test/cases/multiple_db_test.rb +11 -4
  184. data/test/cases/nested_attributes_test.rb +61 -33
  185. data/test/cases/persistence_test.rb +102 -10
  186. data/test/cases/pooled_connections_test.rb +3 -3
  187. data/test/cases/primary_keys_test.rb +170 -31
  188. data/test/cases/query_cache_test.rb +216 -96
  189. data/test/cases/quoting_test.rb +65 -19
  190. data/test/cases/readonly_test.rb +2 -1
  191. data/test/cases/reflection_test.rb +68 -22
  192. data/test/cases/relation/delegation_test.rb +3 -8
  193. data/test/cases/relation/merging_test.rb +10 -14
  194. data/test/cases/relation/mutation_test.rb +42 -24
  195. data/test/cases/relation/or_test.rb +92 -0
  196. data/test/cases/relation/predicate_builder_test.rb +4 -2
  197. data/test/cases/relation/record_fetch_warning_test.rb +40 -0
  198. data/test/cases/relation/where_chain_test.rb +23 -99
  199. data/test/cases/relation/where_clause_test.rb +182 -0
  200. data/test/cases/relation/where_test.rb +45 -23
  201. data/test/cases/relation_test.rb +67 -58
  202. data/test/cases/relations_test.rb +249 -38
  203. data/test/cases/result_test.rb +10 -0
  204. data/test/cases/sanitize_test.rb +108 -15
  205. data/test/cases/schema_dumper_test.rb +119 -125
  206. data/test/cases/schema_loading_test.rb +52 -0
  207. data/test/cases/scoping/default_scoping_test.rb +113 -39
  208. data/test/cases/scoping/named_scoping_test.rb +46 -9
  209. data/test/cases/scoping/relation_scoping_test.rb +47 -4
  210. data/test/cases/secure_token_test.rb +32 -0
  211. data/test/cases/serialization_test.rb +1 -1
  212. data/test/cases/serialized_attribute_test.rb +93 -6
  213. data/test/cases/statement_cache_test.rb +38 -0
  214. data/test/cases/store_test.rb +2 -1
  215. data/test/cases/suppressor_test.rb +63 -0
  216. data/test/cases/tasks/database_tasks_test.rb +73 -9
  217. data/test/cases/tasks/mysql_rake_test.rb +139 -118
  218. data/test/cases/tasks/postgresql_rake_test.rb +60 -6
  219. data/test/cases/tasks/sqlite_rake_test.rb +30 -3
  220. data/test/cases/test_case.rb +28 -20
  221. data/test/cases/test_fixtures_test.rb +36 -0
  222. data/test/cases/time_precision_test.rb +103 -0
  223. data/test/cases/timestamp_test.rb +44 -10
  224. data/test/cases/touch_later_test.rb +121 -0
  225. data/test/cases/transaction_callbacks_test.rb +128 -62
  226. data/test/cases/transaction_isolation_test.rb +2 -2
  227. data/test/cases/transactions_test.rb +61 -43
  228. data/test/cases/type/adapter_specific_registry_test.rb +133 -0
  229. data/test/cases/type/date_time_test.rb +14 -0
  230. data/test/cases/type/integer_test.rb +2 -96
  231. data/test/cases/type/string_test.rb +0 -14
  232. data/test/cases/type_test.rb +39 -0
  233. data/test/cases/types_test.rb +1 -118
  234. data/test/cases/unconnected_test.rb +1 -1
  235. data/test/cases/validations/absence_validation_test.rb +73 -0
  236. data/test/cases/validations/association_validation_test.rb +13 -2
  237. data/test/cases/validations/i18n_validation_test.rb +6 -10
  238. data/test/cases/validations/length_validation_test.rb +62 -30
  239. data/test/cases/validations/presence_validation_test.rb +36 -1
  240. data/test/cases/validations/uniqueness_validation_test.rb +128 -37
  241. data/test/cases/validations_repair_helper.rb +2 -6
  242. data/test/cases/validations_test.rb +36 -7
  243. data/test/cases/view_test.rb +102 -5
  244. data/test/cases/yaml_serialization_test.rb +21 -26
  245. data/test/config.example.yml +97 -0
  246. data/test/fixtures/bad_posts.yml +9 -0
  247. data/test/fixtures/books.yml +20 -0
  248. data/test/fixtures/content.yml +3 -0
  249. data/test/fixtures/content_positions.yml +3 -0
  250. data/test/fixtures/dead_parrots.yml +5 -0
  251. data/test/fixtures/live_parrots.yml +4 -0
  252. data/test/fixtures/naked/yml/parrots.yml +2 -0
  253. data/test/fixtures/naked/yml/trees.yml +3 -0
  254. data/test/fixtures/nodes.yml +29 -0
  255. data/test/fixtures/other_comments.yml +6 -0
  256. data/test/fixtures/other_dogs.yml +2 -0
  257. data/test/fixtures/other_posts.yml +7 -0
  258. data/test/fixtures/price_estimates.yml +10 -1
  259. data/test/fixtures/trees.yml +3 -0
  260. data/test/migrations/10_urban/9_add_expressions.rb +1 -1
  261. data/test/migrations/decimal/1_give_me_big_numbers.rb +1 -1
  262. data/test/migrations/magic/1_currencies_have_symbols.rb +1 -1
  263. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -2
  264. data/test/migrations/missing/1_people_have_last_names.rb +2 -2
  265. data/test/migrations/missing/3_we_need_reminders.rb +2 -2
  266. data/test/migrations/missing/4_innocent_jointable.rb +2 -2
  267. data/test/migrations/rename/1_we_need_things.rb +2 -2
  268. data/test/migrations/rename/2_rename_things.rb +2 -2
  269. data/test/migrations/to_copy/1_people_have_hobbies.rb +1 -1
  270. data/test/migrations/to_copy/2_people_have_descriptions.rb +1 -1
  271. data/test/migrations/to_copy2/1_create_articles.rb +1 -1
  272. data/test/migrations/to_copy2/2_create_comments.rb +1 -1
  273. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +1 -1
  274. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +1 -1
  275. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +1 -1
  276. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +1 -1
  277. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +1 -1
  278. data/test/migrations/valid/1_valid_people_have_last_names.rb +1 -1
  279. data/test/migrations/valid/2_we_need_reminders.rb +2 -2
  280. data/test/migrations/valid/3_innocent_jointable.rb +2 -2
  281. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +1 -1
  282. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -2
  283. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +2 -2
  284. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +1 -1
  285. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +1 -1
  286. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +1 -1
  287. data/test/migrations/version_check/20131219224947_migration_version_check.rb +1 -1
  288. data/test/models/admin/randomly_named_c1.rb +6 -2
  289. data/test/models/aircraft.rb +1 -0
  290. data/test/models/author.rb +4 -7
  291. data/test/models/bird.rb +1 -1
  292. data/test/models/book.rb +5 -0
  293. data/test/models/bulb.rb +2 -1
  294. data/test/models/car.rb +3 -0
  295. data/test/models/cat.rb +10 -0
  296. data/test/models/chef.rb +1 -0
  297. data/test/models/club.rb +2 -0
  298. data/test/models/comment.rb +17 -5
  299. data/test/models/company.rb +4 -2
  300. data/test/models/company_in_module.rb +1 -1
  301. data/test/models/contact.rb +1 -1
  302. data/test/models/content.rb +40 -0
  303. data/test/models/customer.rb +8 -2
  304. data/test/models/developer.rb +19 -0
  305. data/test/models/face.rb +1 -1
  306. data/test/models/guitar.rb +4 -0
  307. data/test/models/hotel.rb +2 -0
  308. data/test/models/member.rb +1 -0
  309. data/test/models/member_detail.rb +4 -3
  310. data/test/models/mentor.rb +3 -0
  311. data/test/models/mocktail_designer.rb +2 -0
  312. data/test/models/node.rb +5 -0
  313. data/test/models/non_primary_key.rb +2 -0
  314. data/test/models/notification.rb +3 -0
  315. data/test/models/other_dog.rb +5 -0
  316. data/test/models/owner.rb +4 -1
  317. data/test/models/parrot.rb +6 -7
  318. data/test/models/person.rb +0 -1
  319. data/test/models/pet.rb +3 -0
  320. data/test/models/pet_treasure.rb +6 -0
  321. data/test/models/pirate.rb +3 -3
  322. data/test/models/post.rb +18 -9
  323. data/test/models/project.rb +9 -0
  324. data/test/models/randomly_named_c1.rb +1 -1
  325. data/test/models/recipe.rb +3 -0
  326. data/test/models/ship.rb +8 -2
  327. data/test/models/tag.rb +6 -0
  328. data/test/models/topic.rb +2 -8
  329. data/test/models/tree.rb +3 -0
  330. data/test/models/tuning_peg.rb +4 -0
  331. data/test/models/user.rb +14 -0
  332. data/test/models/uuid_item.rb +6 -0
  333. data/test/schema/mysql2_specific_schema.rb +33 -23
  334. data/test/schema/oracle_specific_schema.rb +1 -4
  335. data/test/schema/postgresql_specific_schema.rb +36 -124
  336. data/test/schema/schema.rb +170 -65
  337. data/test/schema/schema.rb.original +1057 -0
  338. data/test/schema/sqlite_specific_schema.rb +1 -5
  339. data/test/support/connection.rb +1 -0
  340. data/test/support/schema_dumping_helper.rb +1 -1
  341. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  342. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  343. metadata +146 -30
  344. data/lib/mswin32/rb19x/ibm_db.so +0 -0
  345. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  346. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  347. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  348. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
  349. data/test/cases/attribute_methods/serialization_test.rb +0 -29
  350. data/test/cases/migration/change_schema_test - Copy.rb +0 -448
  351. data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
  352. data/test/cases/migration/table_and_index_test.rb +0 -24
  353. data/test/cases/relation/where_test2.rb +0 -36
  354. data/test/cases/type/decimal_test.rb +0 -56
  355. data/test/cases/type/unsigned_integer_test.rb +0 -18
  356. data/test/cases/xml_serialization_test.rb +0 -457
  357. data/test/fixtures/naked/csv/accounts.csv +0 -1
  358. data/test/schema/mysql_specific_schema.rb +0 -70
@@ -0,0 +1,52 @@
1
+ require "cases/helper"
2
+
3
+ module SchemaLoadCounter
4
+ extend ActiveSupport::Concern
5
+
6
+ module ClassMethods
7
+ attr_accessor :load_schema_calls
8
+
9
+ def load_schema!
10
+ self.load_schema_calls ||= 0
11
+ self.load_schema_calls +=1
12
+ super
13
+ end
14
+ end
15
+ end
16
+
17
+ class SchemaLoadingTest < ActiveRecord::TestCase
18
+ def test_basic_model_is_loaded_once
19
+ klass = define_model
20
+ klass.new
21
+ assert_equal 1, klass.load_schema_calls
22
+ end
23
+
24
+ def test_model_with_custom_lock_is_loaded_once
25
+ klass = define_model do |c|
26
+ c.table_name = :lock_without_defaults_cust
27
+ c.locking_column = :custom_lock_version
28
+ end
29
+ klass.new
30
+ assert_equal 1, klass.load_schema_calls
31
+ end
32
+
33
+ def test_model_with_changed_custom_lock_is_loaded_twice
34
+ klass = define_model do |c|
35
+ c.table_name = :lock_without_defaults_cust
36
+ end
37
+ klass.new
38
+ klass.locking_column = :custom_lock_version
39
+ klass.new
40
+ assert_equal 2, klass.load_schema_calls
41
+ end
42
+
43
+ private
44
+
45
+ def define_model
46
+ Class.new(ActiveRecord::Base) do
47
+ include SchemaLoadCounter
48
+ self.table_name = :lock_without_defaults
49
+ yield self if block_given?
50
+ end
51
+ end
52
+ end
@@ -4,13 +4,14 @@ require 'models/comment'
4
4
  require 'models/developer'
5
5
  require 'models/computer'
6
6
  require 'models/vehicle'
7
+ require 'models/cat'
7
8
 
8
9
  class DefaultScopingTest < ActiveRecord::TestCase
9
10
  fixtures :developers, :posts, :comments
10
11
 
11
12
  def test_default_scope
12
- expected = Developer.all.merge!(:order => 'salary DESC').to_a.collect { |dev| dev.salary }
13
- received = DeveloperOrderedBySalary.all.collect { |dev| dev.salary }
13
+ expected = Developer.all.merge!(:order => 'salary DESC').to_a.collect(&:salary)
14
+ received = DeveloperOrderedBySalary.all.collect(&:salary)
14
15
  assert_equal expected, received
15
16
  end
16
17
 
@@ -87,14 +88,14 @@ class DefaultScopingTest < ActiveRecord::TestCase
87
88
  end
88
89
 
89
90
  def test_scope_overwrites_default
90
- expected = Developer.all.merge!(order: 'salary DESC, name DESC').to_a.collect { |dev| dev.name }
91
- received = DeveloperOrderedBySalary.by_name.to_a.collect { |dev| dev.name }
91
+ expected = Developer.all.merge!(order: 'salary DESC, name DESC').to_a.collect(&:name)
92
+ received = DeveloperOrderedBySalary.by_name.to_a.collect(&:name)
92
93
  assert_equal expected, received
93
94
  end
94
95
 
95
96
  def test_reorder_overrides_default_scope_order
96
- expected = Developer.order('name DESC').collect { |dev| dev.name }
97
- received = DeveloperOrderedBySalary.reorder('name DESC').collect { |dev| dev.name }
97
+ expected = Developer.order('name DESC').collect(&:name)
98
+ received = DeveloperOrderedBySalary.reorder('name DESC').collect(&:name)
98
99
  assert_equal expected, received
99
100
  end
100
101
 
@@ -144,6 +145,14 @@ class DefaultScopingTest < ActiveRecord::TestCase
144
145
  expected_5 = Developer.order('salary DESC').collect(&:name)
145
146
  received_5 = DeveloperOrderedBySalary.where.not("name" => ["Jamis", "David"]).unscope(where: :name).collect(&:name)
146
147
  assert_equal expected_5, received_5
148
+
149
+ expected_6 = Developer.order('salary DESC').collect(&:name)
150
+ received_6 = DeveloperOrderedBySalary.where(Developer.arel_table['name'].eq('David')).unscope(where: :name).collect(&:name)
151
+ assert_equal expected_6, received_6
152
+
153
+ expected_7 = Developer.order('salary DESC').collect(&:name)
154
+ received_7 = DeveloperOrderedBySalary.where(Developer.arel_table[:name].eq('David')).unscope(where: :name).collect(&:name)
155
+ assert_equal expected_7, received_7
147
156
  end
148
157
 
149
158
  def test_unscope_comparison_where_clauses
@@ -159,34 +168,34 @@ class DefaultScopingTest < ActiveRecord::TestCase
159
168
  end
160
169
 
161
170
  def test_unscope_multiple_where_clauses
162
- expected = Developer.order('salary DESC').collect { |dev| dev.name }
163
- received = DeveloperOrderedBySalary.where(name: 'Jamis').where(id: 1).unscope(where: [:name, :id]).collect { |dev| dev.name }
171
+ expected = Developer.order('salary DESC').collect(&:name)
172
+ received = DeveloperOrderedBySalary.where(name: 'Jamis').where(id: 1).unscope(where: [:name, :id]).collect(&:name)
164
173
  assert_equal expected, received
165
174
  end
166
175
 
167
176
  def test_unscope_string_where_clauses_involved
168
177
  dev_relation = Developer.order('salary DESC').where("created_at > ?", 1.year.ago)
169
- expected = dev_relation.collect { |dev| dev.name }
178
+ expected = dev_relation.collect(&:name)
170
179
 
171
180
  dev_ordered_relation = DeveloperOrderedBySalary.where(name: 'Jamis').where("created_at > ?", 1.year.ago)
172
- received = dev_ordered_relation.unscope(where: [:name]).collect { |dev| dev.name }
181
+ received = dev_ordered_relation.unscope(where: [:name]).collect(&:name)
173
182
 
174
183
  assert_equal expected, received
175
184
  end
176
185
 
177
186
  def test_unscope_with_grouping_attributes
178
- expected = Developer.order('salary DESC').collect { |dev| dev.name }
179
- received = DeveloperOrderedBySalary.group(:name).unscope(:group).collect { |dev| dev.name }
187
+ expected = Developer.order('salary DESC').collect(&:name)
188
+ received = DeveloperOrderedBySalary.group(:name).unscope(:group).collect(&:name)
180
189
  assert_equal expected, received
181
190
 
182
- expected_2 = Developer.order('salary DESC').collect { |dev| dev.name }
183
- received_2 = DeveloperOrderedBySalary.group("name").unscope(:group).collect { |dev| dev.name }
191
+ expected_2 = Developer.order('salary DESC').collect(&:name)
192
+ received_2 = DeveloperOrderedBySalary.group("name").unscope(:group).collect(&:name)
184
193
  assert_equal expected_2, received_2
185
194
  end
186
195
 
187
196
  def test_unscope_with_limit_in_query
188
- expected = Developer.order('salary DESC').collect { |dev| dev.name }
189
- received = DeveloperOrderedBySalary.limit(1).unscope(:limit).collect { |dev| dev.name }
197
+ expected = Developer.order('salary DESC').collect(&:name)
198
+ received = DeveloperOrderedBySalary.limit(1).unscope(:limit).collect(&:name)
190
199
  assert_equal expected, received
191
200
  end
192
201
 
@@ -196,42 +205,42 @@ class DefaultScopingTest < ActiveRecord::TestCase
196
205
  end
197
206
 
198
207
  def test_unscope_reverse_order
199
- expected = Developer.all.collect { |dev| dev.name }
200
- received = Developer.order('salary DESC').reverse_order.unscope(:order).collect { |dev| dev.name }
208
+ expected = Developer.all.collect(&:name)
209
+ received = Developer.order('salary DESC').reverse_order.unscope(:order).collect(&:name)
201
210
  assert_equal expected, received
202
211
  end
203
212
 
204
213
  def test_unscope_select
205
- expected = Developer.order('salary ASC').collect { |dev| dev.name }
206
- received = Developer.order('salary DESC').reverse_order.select(:name).unscope(:select).collect { |dev| dev.name }
214
+ expected = Developer.order('salary ASC').collect(&:name)
215
+ received = Developer.order('salary DESC').reverse_order.select(:name).unscope(:select).collect(&:name)
207
216
  assert_equal expected, received
208
217
 
209
- expected_2 = Developer.all.collect { |dev| dev.id }
210
- received_2 = Developer.select(:name).unscope(:select).collect { |dev| dev.id }
218
+ expected_2 = Developer.all.collect(&:id)
219
+ received_2 = Developer.select(:name).unscope(:select).collect(&:id)
211
220
  assert_equal expected_2, received_2
212
221
  end
213
222
 
214
223
  def test_unscope_offset
215
- expected = Developer.all.collect { |dev| dev.name }
216
- received = Developer.offset(5).unscope(:offset).collect { |dev| dev.name }
224
+ expected = Developer.all.collect(&:name)
225
+ received = Developer.offset(5).unscope(:offset).collect(&:name)
217
226
  assert_equal expected, received
218
227
  end
219
228
 
220
229
  def test_unscope_joins_and_select_on_developers_projects
221
- expected = Developer.all.collect { |dev| dev.name }
222
- received = Developer.joins('JOIN developers_projects ON id = developer_id').select(:id).unscope(:joins, :select).collect { |dev| dev.name }
230
+ expected = Developer.all.collect(&:name)
231
+ received = Developer.joins('JOIN developers_projects ON id = developer_id').select(:id).unscope(:joins, :select).collect(&:name)
223
232
  assert_equal expected, received
224
233
  end
225
234
 
226
235
  def test_unscope_includes
227
- expected = Developer.all.collect { |dev| dev.name }
228
- received = Developer.includes(:projects).select(:id).unscope(:includes, :select).collect { |dev| dev.name }
236
+ expected = Developer.all.collect(&:name)
237
+ received = Developer.includes(:projects).select(:id).unscope(:includes, :select).collect(&:name)
229
238
  assert_equal expected, received
230
239
  end
231
240
 
232
241
  def test_unscope_having
233
- expected = DeveloperOrderedBySalary.all.collect { |dev| dev.name }
234
- received = DeveloperOrderedBySalary.having("name IN ('Jamis', 'David')").unscope(:having).collect { |dev| dev.name }
242
+ expected = DeveloperOrderedBySalary.all.collect(&:name)
243
+ received = DeveloperOrderedBySalary.having("name IN ('Jamis', 'David')").unscope(:having).collect(&:name)
235
244
  assert_equal expected, received
236
245
  end
237
246
 
@@ -289,13 +298,13 @@ class DefaultScopingTest < ActiveRecord::TestCase
289
298
 
290
299
  def test_unscope_merging
291
300
  merged = Developer.where(name: "Jamis").merge(Developer.unscope(:where))
292
- assert merged.where_values.empty?
293
- assert !merged.where(name: "Jon").where_values.empty?
301
+ assert merged.where_clause.empty?
302
+ assert !merged.where(name: "Jon").where_clause.empty?
294
303
  end
295
304
 
296
305
  def test_order_in_default_scope_should_not_prevail
297
- expected = Developer.all.merge!(order: 'salary desc').to_a.collect { |dev| dev.salary }
298
- received = DeveloperOrderedBySalary.all.merge!(order: 'salary').to_a.collect { |dev| dev.salary }
306
+ expected = Developer.all.merge!(order: 'salary desc').to_a.collect(&:salary)
307
+ received = DeveloperOrderedBySalary.all.merge!(order: 'salary').to_a.collect(&:salary)
299
308
  assert_equal expected, received
300
309
  end
301
310
 
@@ -366,6 +375,46 @@ class DefaultScopingTest < ActiveRecord::TestCase
366
375
  assert_equal 10, DeveloperCalledJamis.unscoped { DeveloperCalledJamis.poor }.length
367
376
  end
368
377
 
378
+ def test_default_scope_with_joins
379
+ assert_equal Comment.where(post_id: SpecialPostWithDefaultScope.pluck(:id)).count,
380
+ Comment.joins(:special_post_with_default_scope).count
381
+ assert_equal Comment.where(post_id: Post.pluck(:id)).count,
382
+ Comment.joins(:post).count
383
+ end
384
+
385
+ def test_joins_not_affected_by_scope_other_than_default_or_unscoped
386
+ without_scope_on_post = Comment.joins(:post).to_a
387
+ with_scope_on_post = nil
388
+ Post.where(id: [1, 5, 6]).scoping do
389
+ with_scope_on_post = Comment.joins(:post).to_a
390
+ end
391
+
392
+ assert_equal with_scope_on_post, without_scope_on_post
393
+ end
394
+
395
+ def test_unscoped_with_joins_should_not_have_default_scope
396
+ assert_equal SpecialPostWithDefaultScope.unscoped { Comment.joins(:special_post_with_default_scope).to_a },
397
+ Comment.joins(:post).to_a
398
+ end
399
+
400
+ def test_sti_association_with_unscoped_not_affected_by_default_scope
401
+ post = posts(:thinking)
402
+ comments = [comments(:does_it_hurt)]
403
+
404
+ post.special_comments.update_all(deleted_at: Time.now)
405
+
406
+ assert_raises(ActiveRecord::RecordNotFound) { Post.joins(:special_comments).find(post.id) }
407
+ assert_equal [], post.special_comments
408
+
409
+ SpecialComment.unscoped do
410
+ assert_equal post, Post.joins(:special_comments).find(post.id)
411
+ assert_equal comments, Post.joins(:special_comments).find(post.id).special_comments
412
+ assert_equal comments, Post.eager_load(:special_comments).find(post.id).special_comments
413
+ assert_equal comments, Post.includes(:special_comments).find(post.id).special_comments
414
+ assert_equal comments, Post.preload(:special_comments).find(post.id).special_comments
415
+ end
416
+ end
417
+
369
418
  def test_default_scope_select_ignored_by_aggregations
370
419
  assert_equal DeveloperWithSelect.all.to_a.count, DeveloperWithSelect.count
371
420
  end
@@ -431,24 +480,49 @@ class DefaultScopingTest < ActiveRecord::TestCase
431
480
 
432
481
  test "additional conditions are ANDed with the default scope" do
433
482
  scope = DeveloperCalledJamis.where(name: "David")
434
- assert_equal 2, scope.where_values.length
483
+ assert_equal 2, scope.where_clause.ast.children.length
435
484
  assert_equal [], scope.to_a
436
485
  end
437
486
 
438
487
  test "additional conditions in a scope are ANDed with the default scope" do
439
488
  scope = DeveloperCalledJamis.david
440
- assert_equal 2, scope.where_values.length
489
+ assert_equal 2, scope.where_clause.ast.children.length
441
490
  assert_equal [], scope.to_a
442
491
  end
443
492
 
444
493
  test "a scope can remove the condition from the default scope" do
445
494
  scope = DeveloperCalledJamis.david2
446
- assert_equal 1, scope.where_values.length
447
- assert_equal Developer.where(name: "David").map(&:id), scope.map(&:id)
495
+ assert_equal 1, scope.where_clause.ast.children.length
496
+ assert_equal Developer.where(name: "David"), scope
448
497
  end
449
498
 
450
499
  def test_with_abstract_class_where_clause_should_not_be_duplicated
451
500
  scope = Bus.all
452
- assert_equal scope.where_values.length, 1
501
+ assert_equal scope.where_clause.ast.children.length, 1
502
+ end
503
+
504
+ def test_sti_conditions_are_not_carried_in_default_scope
505
+ ConditionalStiPost.create! body: ''
506
+ SubConditionalStiPost.create! body: ''
507
+ SubConditionalStiPost.create! title: 'Hello world', body: ''
508
+
509
+ assert_equal 2, ConditionalStiPost.count
510
+ assert_equal 2, ConditionalStiPost.all.to_a.size
511
+ assert_equal 3, ConditionalStiPost.unscope(where: :title).to_a.size
512
+
513
+ assert_equal 1, SubConditionalStiPost.count
514
+ assert_equal 1, SubConditionalStiPost.all.to_a.size
515
+ assert_equal 2, SubConditionalStiPost.unscope(where: :title).to_a.size
516
+ end
517
+
518
+ def test_with_abstract_class_scope_should_be_executed_in_correct_context
519
+ vegetarian_pattern, gender_pattern = if current_adapter?(:Mysql2Adapter)
520
+ [/`lions`.`is_vegetarian`/, /`lions`.`gender`/]
521
+ else
522
+ [/"lions"."is_vegetarian"/, /"lions"."gender"/]
523
+ end
524
+
525
+ assert_match vegetarian_pattern, Lion.all.to_sql
526
+ assert_match gender_pattern, Lion.female.to_sql
453
527
  end
454
528
  end
@@ -188,8 +188,9 @@ class NamedScopingTest < ActiveRecord::TestCase
188
188
  def test_any_should_call_proxy_found_if_using_a_block
189
189
  topics = Topic.base
190
190
  assert_queries(1) do
191
- topics.expects(:empty?).never
192
- topics.any? { true }
191
+ assert_not_called(topics, :empty?) do
192
+ topics.any? { true }
193
+ end
193
194
  end
194
195
  end
195
196
 
@@ -217,8 +218,9 @@ class NamedScopingTest < ActiveRecord::TestCase
217
218
  def test_many_should_call_proxy_found_if_using_a_block
218
219
  topics = Topic.base
219
220
  assert_queries(1) do
220
- topics.expects(:size).never
221
- topics.many? { true }
221
+ assert_not_called(topics, :size) do
222
+ topics.many? { true }
223
+ end
222
224
  end
223
225
  end
224
226
 
@@ -299,7 +301,7 @@ class NamedScopingTest < ActiveRecord::TestCase
299
301
  :relation, # private class method on AR::Base
300
302
  :new, # redefined class method on AR::Base
301
303
  :all, # a default scope
302
- :public, # some imporant methods on Module and Class
304
+ :public, # some important methods on Module and Class
303
305
  :protected,
304
306
  :private,
305
307
  :name,
@@ -317,13 +319,15 @@ class NamedScopingTest < ActiveRecord::TestCase
317
319
  ]
318
320
 
319
321
  conflicts.each do |name|
320
- assert_raises(ArgumentError, "scope `#{name}` should not be allowed") do
322
+ e = assert_raises(ArgumentError, "scope `#{name}` should not be allowed") do
321
323
  klass.class_eval { scope name, ->{ where(approved: true) } }
322
324
  end
325
+ assert_match(/You tried to define a scope named \"#{name}\" on the model/, e.message)
323
326
 
324
- assert_raises(ArgumentError, "scope `#{name}` should not be allowed") do
327
+ e = assert_raises(ArgumentError, "scope `#{name}` should not be allowed") do
325
328
  subklass.class_eval { scope name, ->{ where(approved: true) } }
326
329
  end
330
+ assert_match(/You tried to define a scope named \"#{name}\" on the model/, e.message)
327
331
  end
328
332
 
329
333
  non_conflicts.each do |name|
@@ -380,8 +384,8 @@ class NamedScopingTest < ActiveRecord::TestCase
380
384
  end
381
385
 
382
386
  def test_should_not_duplicates_where_values
383
- where_values = Topic.where("1=1").scope_with_lambda.where_values
384
- assert_equal ["1=1"], where_values
387
+ relation = Topic.where("1=1")
388
+ assert_equal relation.where_clause, relation.scope_with_lambda.where_clause
385
389
  end
386
390
 
387
391
  def test_chaining_with_duplicate_joins
@@ -436,6 +440,25 @@ class NamedScopingTest < ActiveRecord::TestCase
436
440
  end
437
441
  end
438
442
 
443
+ def test_scopes_with_reserved_names
444
+ class << Topic
445
+ def public_method; end
446
+ public :public_method
447
+
448
+ def protected_method; end
449
+ protected :protected_method
450
+
451
+ def private_method; end
452
+ private :private_method
453
+ end
454
+
455
+ [:public_method, :protected_method, :private_method].each do |reserved_method|
456
+ assert Topic.respond_to?(reserved_method, true)
457
+ ActiveRecord::Base.logger.expects(:warn)
458
+ silence_warnings { Topic.scope(reserved_method, -> { }) }
459
+ end
460
+ end
461
+
439
462
  def test_scopes_on_relations
440
463
  # Topic.replied
441
464
  approved_topics = Topic.all.approved.order('id DESC')
@@ -521,4 +544,18 @@ class NamedScopingTest < ActiveRecord::TestCase
521
544
  assert_equal 1, SpecialComment.where(body: 'go crazy').created.count
522
545
  end
523
546
 
547
+ def test_model_class_should_respond_to_none
548
+ assert !Topic.none?
549
+ Topic.delete_all
550
+ assert Topic.none?
551
+ end
552
+
553
+ def test_model_class_should_respond_to_one
554
+ assert !Topic.one?
555
+ Topic.delete_all
556
+ assert !Topic.one?
557
+ Topic.create!
558
+ assert Topic.one?
559
+ end
560
+
524
561
  end
@@ -10,7 +10,7 @@ require 'models/person'
10
10
  require 'models/reference'
11
11
 
12
12
  class RelationScopingTest < ActiveRecord::TestCase
13
- fixtures :authors, :developers, :projects, :comments, :posts, :developers_projects, :author_addresses
13
+ fixtures :authors, :developers, :projects, :comments, :posts, :developers_projects
14
14
 
15
15
  setup do
16
16
  developers(:david)
@@ -184,7 +184,7 @@ class RelationScopingTest < ActiveRecord::TestCase
184
184
  rescue
185
185
  end
186
186
 
187
- assert !Developer.all.where_values.include?("name = 'Jamis'")
187
+ assert_not Developer.all.to_sql.include?("name = 'Jamis'"), "scope was not restored"
188
188
  end
189
189
 
190
190
  def test_default_scope_filters_on_joins
@@ -208,6 +208,49 @@ class RelationScopingTest < ActiveRecord::TestCase
208
208
  assert_equal [], DeveloperFilteredOnJoins.all
209
209
  assert_not_equal [], Developer.all
210
210
  end
211
+
212
+ def test_current_scope_does_not_pollute_sibling_subclasses
213
+ Comment.none.scoping do
214
+ assert_not SpecialComment.all.any?
215
+ assert_not VerySpecialComment.all.any?
216
+ assert_not SubSpecialComment.all.any?
217
+ end
218
+
219
+ SpecialComment.none.scoping do
220
+ assert Comment.all.any?
221
+ assert VerySpecialComment.all.any?
222
+ assert_not SubSpecialComment.all.any?
223
+ end
224
+
225
+ SubSpecialComment.none.scoping do
226
+ assert Comment.all.any?
227
+ assert VerySpecialComment.all.any?
228
+ assert SpecialComment.all.any?
229
+ end
230
+ end
231
+
232
+ def test_scoping_is_correctly_restored
233
+ Comment.unscoped do
234
+ SpecialComment.unscoped.created
235
+ end
236
+
237
+ assert_nil Comment.current_scope
238
+ assert_nil SpecialComment.current_scope
239
+ end
240
+
241
+ def test_circular_joins_with_scoping_does_not_crash
242
+ posts = Post.joins(comments: :post).scoping do
243
+ Post.first(10)
244
+ end
245
+ assert_equal posts, Post.joins(comments: :post).first(10)
246
+ end
247
+
248
+ def test_circular_left_joins_with_scoping_does_not_crash
249
+ posts = Post.left_joins(comments: :post).scoping do
250
+ Post.first(10)
251
+ end
252
+ assert_equal posts, Post.left_joins(comments: :post).first(10)
253
+ end
211
254
  end
212
255
 
213
256
  class NestedRelationScopingTest < ActiveRecord::TestCase
@@ -218,8 +261,8 @@ class NestedRelationScopingTest < ActiveRecord::TestCase
218
261
  Developer.limit(10).scoping do
219
262
  devs = Developer.all
220
263
  sql = devs.to_sql
221
- assert_match '(salary = 80000)', sql
222
- assert_match 'LIMIT 10', sql
264
+ assert_match "(salary = 80000)", sql
265
+ assert_match(/LIMIT 10|ROWNUM <= 10|FETCH FIRST 10 ROWS ONLY/, sql)
223
266
  end
224
267
  end
225
268
  end