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,225 +1,225 @@
1
- require "cases/helper"
2
- require "models/binary"
3
- require "models/developer"
4
- require "models/post"
5
- require "active_support/log_subscriber/test_helper"
6
-
7
- class LogSubscriberTest < ActiveRecord::TestCase
8
- include ActiveSupport::LogSubscriber::TestHelper
9
- include ActiveSupport::Logger::Severity
10
- REGEXP_CLEAR = Regexp.escape(ActiveRecord::LogSubscriber::CLEAR)
11
- REGEXP_BOLD = Regexp.escape(ActiveRecord::LogSubscriber::BOLD)
12
- REGEXP_MAGENTA = Regexp.escape(ActiveRecord::LogSubscriber::MAGENTA)
13
- REGEXP_CYAN = Regexp.escape(ActiveRecord::LogSubscriber::CYAN)
14
- SQL_COLORINGS = {
15
- SELECT: Regexp.escape(ActiveRecord::LogSubscriber::BLUE),
16
- INSERT: Regexp.escape(ActiveRecord::LogSubscriber::GREEN),
17
- UPDATE: Regexp.escape(ActiveRecord::LogSubscriber::YELLOW),
18
- DELETE: Regexp.escape(ActiveRecord::LogSubscriber::RED),
19
- LOCK: Regexp.escape(ActiveRecord::LogSubscriber::WHITE),
20
- ROLLBACK: Regexp.escape(ActiveRecord::LogSubscriber::RED),
21
- TRANSACTION: REGEXP_CYAN,
22
- OTHER: REGEXP_MAGENTA
23
- }
24
-
25
- class TestDebugLogSubscriber < ActiveRecord::LogSubscriber
26
- attr_reader :debugs
27
-
28
- def initialize
29
- @debugs = []
30
- super
31
- end
32
-
33
- def debug message
34
- @debugs << message
35
- end
36
- end
37
-
38
- fixtures :posts
39
-
40
- def setup
41
- @old_logger = ActiveRecord::Base.logger
42
- Developer.primary_key
43
- super
44
- ActiveRecord::LogSubscriber.attach_to(:active_record)
45
- end
46
-
47
- def teardown
48
- super
49
- ActiveRecord::LogSubscriber.log_subscribers.pop
50
- ActiveRecord::Base.logger = @old_logger
51
- end
52
-
53
- def set_logger(logger)
54
- ActiveRecord::Base.logger = logger
55
- end
56
-
57
- def test_schema_statements_are_ignored
58
- event = Struct.new(:duration, :payload)
59
-
60
- logger = TestDebugLogSubscriber.new
61
- assert_equal 0, logger.debugs.length
62
-
63
- logger.sql(event.new(0.9, sql: "hi mom!"))
64
- assert_equal 1, logger.debugs.length
65
-
66
- logger.sql(event.new(0.9, sql: "hi mom!", name: "foo"))
67
- assert_equal 2, logger.debugs.length
68
-
69
- logger.sql(event.new(0.9, sql: "hi mom!", name: "SCHEMA"))
70
- assert_equal 2, logger.debugs.length
71
- end
72
-
73
- def test_sql_statements_are_not_squeezed
74
- event = Struct.new(:duration, :payload)
75
- logger = TestDebugLogSubscriber.new
76
- logger.sql(event.new(0.9, sql: "ruby rails"))
77
- assert_match(/ruby rails/, logger.debugs.first)
78
- end
79
-
80
- def test_basic_query_logging
81
- Developer.all.load
82
- wait
83
- assert_equal 1, @logger.logged(:debug).size
84
- assert_match(/Developer Load/, @logger.logged(:debug).last)
85
- assert_match(/SELECT .*?FROM .?developers.?/i, @logger.logged(:debug).last)
86
- end
87
-
88
- def test_basic_query_logging_coloration
89
- event = Struct.new(:duration, :payload)
90
- logger = TestDebugLogSubscriber.new
91
- logger.colorize_logging = true
92
- SQL_COLORINGS.each do |verb, color_regex|
93
- logger.sql(event.new(0.9, sql: verb.to_s))
94
- assert_match(/#{REGEXP_BOLD}#{color_regex}#{verb}#{REGEXP_CLEAR}/i, logger.debugs.last)
95
- end
96
- end
97
-
98
- def test_basic_payload_name_logging_coloration_generic_sql
99
- event = Struct.new(:duration, :payload)
100
- logger = TestDebugLogSubscriber.new
101
- logger.colorize_logging = true
102
- SQL_COLORINGS.each do |verb, _|
103
- logger.sql(event.new(0.9, sql: verb.to_s))
104
- assert_match(/#{REGEXP_BOLD}#{REGEXP_MAGENTA} \(0\.9ms\)#{REGEXP_CLEAR}/i, logger.debugs.last)
105
-
106
- logger.sql(event.new(0.9, sql: verb.to_s, name: "SQL"))
107
- assert_match(/#{REGEXP_BOLD}#{REGEXP_MAGENTA}SQL \(0\.9ms\)#{REGEXP_CLEAR}/i, logger.debugs.last)
108
- end
109
- end
110
-
111
- def test_basic_payload_name_logging_coloration_named_sql
112
- event = Struct.new(:duration, :payload)
113
- logger = TestDebugLogSubscriber.new
114
- logger.colorize_logging = true
115
- SQL_COLORINGS.each do |verb, _|
116
- logger.sql(event.new(0.9, sql: verb.to_s, name: "Model Load"))
117
- assert_match(/#{REGEXP_BOLD}#{REGEXP_CYAN}Model Load \(0\.9ms\)#{REGEXP_CLEAR}/i, logger.debugs.last)
118
-
119
- logger.sql(event.new(0.9, sql: verb.to_s, name: "Model Exists"))
120
- assert_match(/#{REGEXP_BOLD}#{REGEXP_CYAN}Model Exists \(0\.9ms\)#{REGEXP_CLEAR}/i, logger.debugs.last)
121
-
122
- logger.sql(event.new(0.9, sql: verb.to_s, name: "ANY SPECIFIC NAME"))
123
- assert_match(/#{REGEXP_BOLD}#{REGEXP_CYAN}ANY SPECIFIC NAME \(0\.9ms\)#{REGEXP_CLEAR}/i, logger.debugs.last)
124
- end
125
- end
126
-
127
- def test_query_logging_coloration_with_nested_select
128
- event = Struct.new(:duration, :payload)
129
- logger = TestDebugLogSubscriber.new
130
- logger.colorize_logging = true
131
- SQL_COLORINGS.slice(:SELECT, :INSERT, :UPDATE, :DELETE).each do |verb, color_regex|
132
- logger.sql(event.new(0.9, sql: "#{verb} WHERE ID IN SELECT"))
133
- assert_match(/#{REGEXP_BOLD}#{REGEXP_MAGENTA} \(0\.9ms\)#{REGEXP_CLEAR} #{REGEXP_BOLD}#{color_regex}#{verb} WHERE ID IN SELECT#{REGEXP_CLEAR}/i, logger.debugs.last)
134
- end
135
- end
136
-
137
- def test_query_logging_coloration_with_multi_line_nested_select
138
- event = Struct.new(:duration, :payload)
139
- logger = TestDebugLogSubscriber.new
140
- logger.colorize_logging = true
141
- SQL_COLORINGS.slice(:SELECT, :INSERT, :UPDATE, :DELETE).each do |verb, color_regex|
142
- sql = <<-EOS
143
- #{verb}
144
- WHERE ID IN (
145
- SELECT ID FROM THINGS
146
- )
147
- EOS
148
- logger.sql(event.new(0.9, sql: sql))
149
- assert_match(/#{REGEXP_BOLD}#{REGEXP_MAGENTA} \(0\.9ms\)#{REGEXP_CLEAR} #{REGEXP_BOLD}#{color_regex}.*#{verb}.*#{REGEXP_CLEAR}/mi, logger.debugs.last)
150
- end
151
- end
152
-
153
- def test_query_logging_coloration_with_lock
154
- event = Struct.new(:duration, :payload)
155
- logger = TestDebugLogSubscriber.new
156
- logger.colorize_logging = true
157
- sql = <<-EOS
158
- SELECT * FROM
159
- (SELECT * FROM mytable FOR UPDATE) ss
160
- WHERE col1 = 5;
161
- EOS
162
- logger.sql(event.new(0.9, sql: sql))
163
- assert_match(/#{REGEXP_BOLD}#{REGEXP_MAGENTA} \(0\.9ms\)#{REGEXP_CLEAR} #{REGEXP_BOLD}#{SQL_COLORINGS[:LOCK]}.*FOR UPDATE.*#{REGEXP_CLEAR}/mi, logger.debugs.last)
164
-
165
- sql = <<-EOS
166
- LOCK TABLE films IN SHARE MODE;
167
- EOS
168
- logger.sql(event.new(0.9, sql: sql))
169
- assert_match(/#{REGEXP_BOLD}#{REGEXP_MAGENTA} \(0\.9ms\)#{REGEXP_CLEAR} #{REGEXP_BOLD}#{SQL_COLORINGS[:LOCK]}.*LOCK TABLE.*#{REGEXP_CLEAR}/mi, logger.debugs.last)
170
- end
171
-
172
- def test_exists_query_logging
173
- Developer.exists? 1
174
- wait
175
- assert_equal 1, @logger.logged(:debug).size
176
- assert_match(/Developer Exists/, @logger.logged(:debug).last)
177
- assert_match(/SELECT .*?FROM .?developers.?/i, @logger.logged(:debug).last)
178
- end
179
-
180
- def test_cached_queries
181
- ActiveRecord::Base.cache do
182
- Developer.all.load
183
- Developer.all.load
184
- end
185
- wait
186
- assert_equal 2, @logger.logged(:debug).size
187
- assert_match(/CACHE/, @logger.logged(:debug).last)
188
- assert_match(/SELECT .*?FROM .?developers.?/i, @logger.logged(:debug).last)
189
- end
190
-
191
- def test_basic_query_doesnt_log_when_level_is_not_debug
192
- @logger.level = INFO
193
- Developer.all.load
194
- wait
195
- assert_equal 0, @logger.logged(:debug).size
196
- end
197
-
198
- def test_cached_queries_doesnt_log_when_level_is_not_debug
199
- @logger.level = INFO
200
- ActiveRecord::Base.cache do
201
- Developer.all.load
202
- Developer.all.load
203
- end
204
- wait
205
- assert_equal 0, @logger.logged(:debug).size
206
- end
207
-
208
- def test_initializes_runtime
209
- Thread.new { assert_equal 0, ActiveRecord::LogSubscriber.runtime }.join
210
- end
211
-
212
- if ActiveRecord::Base.connection.prepared_statements
213
- def test_binary_data_is_not_logged
214
- Binary.create(data: 'some binary data')
215
- wait
216
- assert_match(/<16 bytes of binary data>/, @logger.logged(:debug).join)
217
- end
218
-
219
- def test_binary_data_hash
220
- Binary.create(data: { a: 1 })
221
- wait
222
- assert_match(/<7 bytes of binary data>/, @logger.logged(:debug).join)
223
- end
224
- end
225
- end
1
+ require "cases/helper"
2
+ require "models/binary"
3
+ require "models/developer"
4
+ require "models/post"
5
+ require "active_support/log_subscriber/test_helper"
6
+
7
+ class LogSubscriberTest < ActiveRecord::TestCase
8
+ include ActiveSupport::LogSubscriber::TestHelper
9
+ include ActiveSupport::Logger::Severity
10
+ REGEXP_CLEAR = Regexp.escape(ActiveRecord::LogSubscriber::CLEAR)
11
+ REGEXP_BOLD = Regexp.escape(ActiveRecord::LogSubscriber::BOLD)
12
+ REGEXP_MAGENTA = Regexp.escape(ActiveRecord::LogSubscriber::MAGENTA)
13
+ REGEXP_CYAN = Regexp.escape(ActiveRecord::LogSubscriber::CYAN)
14
+ SQL_COLORINGS = {
15
+ SELECT: Regexp.escape(ActiveRecord::LogSubscriber::BLUE),
16
+ INSERT: Regexp.escape(ActiveRecord::LogSubscriber::GREEN),
17
+ UPDATE: Regexp.escape(ActiveRecord::LogSubscriber::YELLOW),
18
+ DELETE: Regexp.escape(ActiveRecord::LogSubscriber::RED),
19
+ LOCK: Regexp.escape(ActiveRecord::LogSubscriber::WHITE),
20
+ ROLLBACK: Regexp.escape(ActiveRecord::LogSubscriber::RED),
21
+ TRANSACTION: REGEXP_CYAN,
22
+ OTHER: REGEXP_MAGENTA
23
+ }
24
+
25
+ class TestDebugLogSubscriber < ActiveRecord::LogSubscriber
26
+ attr_reader :debugs
27
+
28
+ def initialize
29
+ @debugs = []
30
+ super
31
+ end
32
+
33
+ def debug message
34
+ @debugs << message
35
+ end
36
+ end
37
+
38
+ fixtures :posts
39
+
40
+ def setup
41
+ @old_logger = ActiveRecord::Base.logger
42
+ Developer.primary_key
43
+ super
44
+ ActiveRecord::LogSubscriber.attach_to(:active_record)
45
+ end
46
+
47
+ def teardown
48
+ super
49
+ ActiveRecord::LogSubscriber.log_subscribers.pop
50
+ ActiveRecord::Base.logger = @old_logger
51
+ end
52
+
53
+ def set_logger(logger)
54
+ ActiveRecord::Base.logger = logger
55
+ end
56
+
57
+ def test_schema_statements_are_ignored
58
+ event = Struct.new(:duration, :payload)
59
+
60
+ logger = TestDebugLogSubscriber.new
61
+ assert_equal 0, logger.debugs.length
62
+
63
+ logger.sql(event.new(0.9, sql: "hi mom!"))
64
+ assert_equal 1, logger.debugs.length
65
+
66
+ logger.sql(event.new(0.9, sql: "hi mom!", name: "foo"))
67
+ assert_equal 2, logger.debugs.length
68
+
69
+ logger.sql(event.new(0.9, sql: "hi mom!", name: "SCHEMA"))
70
+ assert_equal 2, logger.debugs.length
71
+ end
72
+
73
+ def test_sql_statements_are_not_squeezed
74
+ event = Struct.new(:duration, :payload)
75
+ logger = TestDebugLogSubscriber.new
76
+ logger.sql(event.new(0.9, sql: "ruby rails"))
77
+ assert_match(/ruby rails/, logger.debugs.first)
78
+ end
79
+
80
+ def test_basic_query_logging
81
+ Developer.all.load
82
+ wait
83
+ assert_equal 1, @logger.logged(:debug).size
84
+ assert_match(/Developer Load/, @logger.logged(:debug).last)
85
+ assert_match(/SELECT .*?FROM .?developers.?/i, @logger.logged(:debug).last)
86
+ end
87
+
88
+ def test_basic_query_logging_coloration
89
+ event = Struct.new(:duration, :payload)
90
+ logger = TestDebugLogSubscriber.new
91
+ logger.colorize_logging = true
92
+ SQL_COLORINGS.each do |verb, color_regex|
93
+ logger.sql(event.new(0.9, sql: verb.to_s))
94
+ assert_match(/#{REGEXP_BOLD}#{color_regex}#{verb}#{REGEXP_CLEAR}/i, logger.debugs.last)
95
+ end
96
+ end
97
+
98
+ def test_basic_payload_name_logging_coloration_generic_sql
99
+ event = Struct.new(:duration, :payload)
100
+ logger = TestDebugLogSubscriber.new
101
+ logger.colorize_logging = true
102
+ SQL_COLORINGS.each do |verb, _|
103
+ logger.sql(event.new(0.9, sql: verb.to_s))
104
+ assert_match(/#{REGEXP_BOLD}#{REGEXP_MAGENTA} \(0\.9ms\)#{REGEXP_CLEAR}/i, logger.debugs.last)
105
+
106
+ logger.sql(event.new(0.9, sql: verb.to_s, name: "SQL"))
107
+ assert_match(/#{REGEXP_BOLD}#{REGEXP_MAGENTA}SQL \(0\.9ms\)#{REGEXP_CLEAR}/i, logger.debugs.last)
108
+ end
109
+ end
110
+
111
+ def test_basic_payload_name_logging_coloration_named_sql
112
+ event = Struct.new(:duration, :payload)
113
+ logger = TestDebugLogSubscriber.new
114
+ logger.colorize_logging = true
115
+ SQL_COLORINGS.each do |verb, _|
116
+ logger.sql(event.new(0.9, sql: verb.to_s, name: "Model Load"))
117
+ assert_match(/#{REGEXP_BOLD}#{REGEXP_CYAN}Model Load \(0\.9ms\)#{REGEXP_CLEAR}/i, logger.debugs.last)
118
+
119
+ logger.sql(event.new(0.9, sql: verb.to_s, name: "Model Exists"))
120
+ assert_match(/#{REGEXP_BOLD}#{REGEXP_CYAN}Model Exists \(0\.9ms\)#{REGEXP_CLEAR}/i, logger.debugs.last)
121
+
122
+ logger.sql(event.new(0.9, sql: verb.to_s, name: "ANY SPECIFIC NAME"))
123
+ assert_match(/#{REGEXP_BOLD}#{REGEXP_CYAN}ANY SPECIFIC NAME \(0\.9ms\)#{REGEXP_CLEAR}/i, logger.debugs.last)
124
+ end
125
+ end
126
+
127
+ def test_query_logging_coloration_with_nested_select
128
+ event = Struct.new(:duration, :payload)
129
+ logger = TestDebugLogSubscriber.new
130
+ logger.colorize_logging = true
131
+ SQL_COLORINGS.slice(:SELECT, :INSERT, :UPDATE, :DELETE).each do |verb, color_regex|
132
+ logger.sql(event.new(0.9, sql: "#{verb} WHERE ID IN SELECT"))
133
+ assert_match(/#{REGEXP_BOLD}#{REGEXP_MAGENTA} \(0\.9ms\)#{REGEXP_CLEAR} #{REGEXP_BOLD}#{color_regex}#{verb} WHERE ID IN SELECT#{REGEXP_CLEAR}/i, logger.debugs.last)
134
+ end
135
+ end
136
+
137
+ def test_query_logging_coloration_with_multi_line_nested_select
138
+ event = Struct.new(:duration, :payload)
139
+ logger = TestDebugLogSubscriber.new
140
+ logger.colorize_logging = true
141
+ SQL_COLORINGS.slice(:SELECT, :INSERT, :UPDATE, :DELETE).each do |verb, color_regex|
142
+ sql = <<-EOS
143
+ #{verb}
144
+ WHERE ID IN (
145
+ SELECT ID FROM THINGS
146
+ )
147
+ EOS
148
+ logger.sql(event.new(0.9, sql: sql))
149
+ assert_match(/#{REGEXP_BOLD}#{REGEXP_MAGENTA} \(0\.9ms\)#{REGEXP_CLEAR} #{REGEXP_BOLD}#{color_regex}.*#{verb}.*#{REGEXP_CLEAR}/mi, logger.debugs.last)
150
+ end
151
+ end
152
+
153
+ def test_query_logging_coloration_with_lock
154
+ event = Struct.new(:duration, :payload)
155
+ logger = TestDebugLogSubscriber.new
156
+ logger.colorize_logging = true
157
+ sql = <<-EOS
158
+ SELECT * FROM
159
+ (SELECT * FROM mytable FOR UPDATE) ss
160
+ WHERE col1 = 5;
161
+ EOS
162
+ logger.sql(event.new(0.9, sql: sql))
163
+ assert_match(/#{REGEXP_BOLD}#{REGEXP_MAGENTA} \(0\.9ms\)#{REGEXP_CLEAR} #{REGEXP_BOLD}#{SQL_COLORINGS[:LOCK]}.*FOR UPDATE.*#{REGEXP_CLEAR}/mi, logger.debugs.last)
164
+
165
+ sql = <<-EOS
166
+ LOCK TABLE films IN SHARE MODE;
167
+ EOS
168
+ logger.sql(event.new(0.9, sql: sql))
169
+ assert_match(/#{REGEXP_BOLD}#{REGEXP_MAGENTA} \(0\.9ms\)#{REGEXP_CLEAR} #{REGEXP_BOLD}#{SQL_COLORINGS[:LOCK]}.*LOCK TABLE.*#{REGEXP_CLEAR}/mi, logger.debugs.last)
170
+ end
171
+
172
+ def test_exists_query_logging
173
+ Developer.exists? 1
174
+ wait
175
+ assert_equal 1, @logger.logged(:debug).size
176
+ assert_match(/Developer Exists/, @logger.logged(:debug).last)
177
+ assert_match(/SELECT .*?FROM .?developers.?/i, @logger.logged(:debug).last)
178
+ end
179
+
180
+ def test_cached_queries
181
+ ActiveRecord::Base.cache do
182
+ Developer.all.load
183
+ Developer.all.load
184
+ end
185
+ wait
186
+ assert_equal 2, @logger.logged(:debug).size
187
+ assert_match(/CACHE/, @logger.logged(:debug).last)
188
+ assert_match(/SELECT .*?FROM .?developers.?/i, @logger.logged(:debug).last)
189
+ end
190
+
191
+ def test_basic_query_doesnt_log_when_level_is_not_debug
192
+ @logger.level = INFO
193
+ Developer.all.load
194
+ wait
195
+ assert_equal 0, @logger.logged(:debug).size
196
+ end
197
+
198
+ def test_cached_queries_doesnt_log_when_level_is_not_debug
199
+ @logger.level = INFO
200
+ ActiveRecord::Base.cache do
201
+ Developer.all.load
202
+ Developer.all.load
203
+ end
204
+ wait
205
+ assert_equal 0, @logger.logged(:debug).size
206
+ end
207
+
208
+ def test_initializes_runtime
209
+ Thread.new { assert_equal 0, ActiveRecord::LogSubscriber.runtime }.join
210
+ end
211
+
212
+ if ActiveRecord::Base.connection.prepared_statements
213
+ def test_binary_data_is_not_logged
214
+ Binary.create(data: 'some binary data')
215
+ wait
216
+ assert_match(/<16 bytes of binary data>/, @logger.logged(:debug).join)
217
+ end
218
+
219
+ def test_binary_data_hash
220
+ Binary.create(data: { a: 1 })
221
+ wait
222
+ assert_match(/<7 bytes of binary data>/, @logger.logged(:debug).join)
223
+ end
224
+ end
225
+ end
@@ -1,458 +1,458 @@
1
- require 'cases/helper'
2
-
3
- module ActiveRecord
4
- class Migration
5
- class ChangeSchemaTest < ActiveRecord::TestCase
6
- attr_reader :connection, :table_name
7
-
8
- def setup
9
- super
10
- @connection = ActiveRecord::Base.connection
11
- @table_name = :testings
12
- end
13
-
14
- teardown do
15
- connection.drop_table :testings rescue nil
16
- ActiveRecord::Base.primary_key_prefix_type = nil
17
- ActiveRecord::Base.clear_cache!
18
- end
19
-
20
- def test_create_table_without_id
21
- testing_table_with_only_foo_attribute do
22
- assert_equal connection.columns(:testings).size, 1
23
- end
24
- end
25
-
26
- def test_add_column_with_primary_key_attribute
27
- testing_table_with_only_foo_attribute do
28
- connection.add_column :testings, :id, :primary_key
29
- assert_equal connection.columns(:testings).size, 2
30
- end
31
- end
32
-
33
- def test_create_table_adds_id
34
- connection.create_table :testings do |t|
35
- t.column :foo, :string
36
- end
37
-
38
- assert_equal %w(id foo), connection.columns(:testings).map(&:name)
39
- end
40
-
41
- def test_create_table_with_not_null_column
42
- connection.create_table :testings do |t|
43
- t.column :foo, :string, :null => false
44
- end
45
-
46
- assert_raises(ActiveRecord::StatementInvalid) do
47
- connection.execute "insert into testings (foo) values (NULL)"
48
- end
49
- end
50
-
51
- def test_create_table_with_defaults
52
- # MySQL doesn't allow defaults on TEXT or BLOB columns.
53
- mysql = current_adapter?(:Mysql2Adapter)
54
-
55
- connection.create_table :testings do |t|
56
- t.column :one, :string, :default => "hello"
57
- t.column :two, :boolean, :default => true
58
- t.column :three, :boolean, :default => false
59
- t.column :four, :integer, :default => 1
60
- t.column :five, :text, :default => "hello" unless mysql
61
- end
62
-
63
- columns = connection.columns(:testings)
64
- one = columns.detect { |c| c.name == "one" }
65
- two = columns.detect { |c| c.name == "two" }
66
- three = columns.detect { |c| c.name == "three" }
67
- four = columns.detect { |c| c.name == "four" }
68
- five = columns.detect { |c| c.name == "five" } unless mysql
69
-
70
- assert_equal "hello", one.default
71
- assert_equal true, connection.lookup_cast_type_from_column(two).deserialize(two.default)
72
- assert_equal false, connection.lookup_cast_type_from_column(three).deserialize(three.default)
73
- assert_equal '1', four.default
74
- assert_equal "hello", five.default unless mysql
75
- end
76
-
77
- if current_adapter?(:PostgreSQLAdapter)
78
- def test_add_column_with_array
79
- connection.create_table :testings
80
- connection.add_column :testings, :foo, :string, :array => true
81
-
82
- columns = connection.columns(:testings)
83
- array_column = columns.detect { |c| c.name == "foo" }
84
-
85
- assert array_column.array?
86
- end
87
-
88
- def test_create_table_with_array_column
89
- connection.create_table :testings do |t|
90
- t.string :foo, :array => true
91
- end
92
-
93
- columns = connection.columns(:testings)
94
- array_column = columns.detect { |c| c.name == "foo" }
95
-
96
- assert array_column.array?
97
- end
98
- end
99
-
100
- def test_create_table_with_bigint
101
- connection.create_table :testings do |t|
102
- t.bigint :eight_int
103
- end
104
- columns = connection.columns(:testings)
105
- eight = columns.detect { |c| c.name == "eight_int" }
106
-
107
- if current_adapter?(:OracleAdapter)
108
- assert_equal 'NUMBER(19)', eight.sql_type
109
- elsif current_adapter?(:SQLite3Adapter)
110
- assert_equal 'bigint', eight.sql_type
111
- else
112
- assert_equal :integer, eight.type
113
- assert_equal 8, eight.limit
114
- end
115
- ensure
116
- connection.drop_table :testings
117
- end
118
-
119
- def test_create_table_with_limits
120
- connection.create_table :testings do |t|
121
- t.column :foo, :string, :limit => 255
122
-
123
- t.column :default_int, :integer
124
-
125
- t.column :one_int, :integer, :limit => 1
126
- t.column :four_int, :integer, :limit => 4
127
- t.column :eight_int, :integer, :limit => 8
128
- end
129
-
130
- columns = connection.columns(:testings)
131
- foo = columns.detect { |c| c.name == "foo" }
132
- assert_equal 255, foo.limit
133
-
134
- default = columns.detect { |c| c.name == "default_int" }
135
- one = columns.detect { |c| c.name == "one_int" }
136
- four = columns.detect { |c| c.name == "four_int" }
137
- eight = columns.detect { |c| c.name == "eight_int" }
138
-
139
- if current_adapter?(:PostgreSQLAdapter)
140
- assert_equal 'integer', default.sql_type
141
- assert_equal 'smallint', one.sql_type
142
- assert_equal 'integer', four.sql_type
143
- assert_equal 'bigint', eight.sql_type
144
- elsif current_adapter?(:Mysql2Adapter)
145
- assert_match 'int(11)', default.sql_type
146
- assert_match 'tinyint', one.sql_type
147
- assert_match 'int', four.sql_type
148
- assert_match 'bigint', eight.sql_type
149
- elsif current_adapter?(:OracleAdapter)
150
- assert_equal 'NUMBER(38)', default.sql_type
151
- assert_equal 'NUMBER(1)', one.sql_type
152
- assert_equal 'NUMBER(4)', four.sql_type
153
- assert_equal 'NUMBER(8)', eight.sql_type
154
- end
155
- end
156
-
157
- def test_create_table_with_primary_key_prefix_as_table_name_with_underscore
158
- ActiveRecord::Base.primary_key_prefix_type = :table_name_with_underscore
159
-
160
- connection.create_table :testings do |t|
161
- t.column :foo, :string
162
- end
163
-
164
- assert_equal %w(testing_id foo), connection.columns(:testings).map(&:name)
165
- end
166
-
167
- def test_create_table_with_primary_key_prefix_as_table_name
168
- ActiveRecord::Base.primary_key_prefix_type = :table_name
169
-
170
- connection.create_table :testings do |t|
171
- t.column :foo, :string
172
- end
173
-
174
- assert_equal %w(testingid foo), connection.columns(:testings).map(&:name)
175
- end
176
-
177
- def test_create_table_raises_when_redefining_primary_key_column
178
- error = assert_raise(ArgumentError) do
179
- connection.create_table :testings do |t|
180
- t.column :id, :string
181
- end
182
- end
183
-
184
- assert_equal "you can't redefine the primary key column 'id'. To define a custom primary key, pass { id: false } to create_table.", error.message
185
- end
186
-
187
- def test_create_table_raises_when_redefining_custom_primary_key_column
188
- error = assert_raise(ArgumentError) do
189
- connection.create_table :testings, primary_key: :testing_id do |t|
190
- t.column :testing_id, :string
191
- end
192
- end
193
-
194
- assert_equal "you can't redefine the primary key column 'testing_id'. To define a custom primary key, pass { id: false } to create_table.", error.message
195
- end
196
-
197
- def test_create_table_with_timestamps_should_create_datetime_columns
198
- connection.create_table table_name do |t|
199
- t.timestamps
200
- end
201
- created_columns = connection.columns(table_name)
202
-
203
- created_at_column = created_columns.detect {|c| c.name == 'created_at' }
204
- updated_at_column = created_columns.detect {|c| c.name == 'updated_at' }
205
-
206
- assert !created_at_column.null
207
- assert !updated_at_column.null
208
- end
209
-
210
- def test_create_table_with_timestamps_should_create_datetime_columns_with_options
211
- connection.create_table table_name do |t|
212
- t.timestamps null: true
213
- end
214
- created_columns = connection.columns(table_name)
215
-
216
- created_at_column = created_columns.detect {|c| c.name == 'created_at' }
217
- updated_at_column = created_columns.detect {|c| c.name == 'updated_at' }
218
-
219
- assert created_at_column.null
220
- assert updated_at_column.null
221
- end
222
-
223
- def test_create_table_without_a_block
224
- connection.create_table table_name
225
- end
226
-
227
- # SQLite3 will not allow you to add a NOT NULL
228
- # column to a table without a default value.
229
- unless current_adapter?(:SQLite3Adapter)
230
- def test_add_column_not_null_without_default
231
- connection.create_table :testings do |t|
232
- t.column :foo, :string
233
- end
234
- connection.add_column :testings, :bar, :string, :null => false
235
-
236
- assert_raise(ActiveRecord::StatementInvalid) do
237
- connection.execute "insert into testings (foo, bar) values ('hello', NULL)"
238
- end
239
- end
240
- end
241
-
242
- def test_add_column_not_null_with_default
243
- connection.create_table :testings do |t|
244
- t.column :foo, :string
245
- end
246
-
247
- con = connection
248
- connection.execute "insert into testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}) values (1, 'hello')"
249
- assert_nothing_raised {connection.add_column :testings, :bar, :string, :null => false, :default => "default" }
250
-
251
- assert_raises(ActiveRecord::StatementInvalid) do
252
- connection.execute "insert into testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}, #{con.quote_column_name('bar')}) values (2, 'hello', NULL)"
253
- end
254
- end
255
-
256
- def test_add_column_with_timestamp_type
257
- connection.create_table :testings do |t|
258
- t.column :foo, :timestamp
259
- end
260
-
261
- klass = Class.new(ActiveRecord::Base)
262
- klass.table_name = 'testings'
263
-
264
- assert_equal :datetime, klass.columns_hash['foo'].type
265
-
266
- if current_adapter?(:PostgreSQLAdapter)
267
- assert_equal 'timestamp without time zone', klass.columns_hash['foo'].sql_type
268
- else
269
- assert_equal klass.connection.type_to_sql('datetime'), klass.columns_hash['foo'].sql_type
270
- end
271
- end
272
-
273
- def test_change_column_quotes_column_names
274
- connection.create_table :testings do |t|
275
- t.column :select, :string
276
- end
277
-
278
- connection.change_column :testings, :select, :string, :limit => 10
279
-
280
- # Oracle needs primary key value from sequence
281
- if current_adapter?(:OracleAdapter)
282
- connection.execute "insert into testings (id, #{connection.quote_column_name('select')}) values (testings_seq.nextval, '7 chars')"
283
- else
284
- connection.execute "insert into testings (#{connection.quote_column_name('select')}) values ('7 chars')"
285
- end
286
- end
287
-
288
- def test_keeping_default_and_notnull_constraints_on_change
289
- connection.create_table :testings do |t|
290
- t.column :title, :string
291
- end
292
- person_klass = Class.new(ActiveRecord::Base)
293
- person_klass.table_name = 'testings'
294
-
295
- person_klass.connection.add_column "testings", "wealth", :integer, :null => false, :default => 99
296
- person_klass.reset_column_information
297
- assert_equal 99, person_klass.column_defaults["wealth"]
298
- assert_equal false, person_klass.columns_hash["wealth"].null
299
- # Oracle needs primary key value from sequence
300
- if current_adapter?(:OracleAdapter)
301
- assert_nothing_raised {person_klass.connection.execute("insert into testings (id, title) values (testings_seq.nextval, 'tester')")}
302
- else
303
- assert_nothing_raised {person_klass.connection.execute("insert into testings (title) values ('tester')")}
304
- end
305
-
306
- # change column default to see that column doesn't lose its not null definition
307
- person_klass.connection.change_column_default "testings", "wealth", 100
308
- person_klass.reset_column_information
309
- assert_equal 100, person_klass.column_defaults["wealth"]
310
- assert_equal false, person_klass.columns_hash["wealth"].null
311
-
312
- # rename column to see that column doesn't lose its not null and/or default definition
313
- person_klass.connection.rename_column "testings", "wealth", "money"
314
- person_klass.reset_column_information
315
- assert_nil person_klass.columns_hash["wealth"]
316
- assert_equal 100, person_klass.column_defaults["money"]
317
- assert_equal false, person_klass.columns_hash["money"].null
318
-
319
- # change column
320
- person_klass.connection.change_column "testings", "money", :integer, :null => false, :default => 1000
321
- person_klass.reset_column_information
322
- assert_equal 1000, person_klass.column_defaults["money"]
323
- assert_equal false, person_klass.columns_hash["money"].null
324
-
325
- # change column, make it nullable and clear default
326
- person_klass.connection.change_column "testings", "money", :integer, :null => true, :default => nil
327
- person_klass.reset_column_information
328
- assert_nil person_klass.columns_hash["money"].default
329
- assert_equal true, person_klass.columns_hash["money"].null
330
-
331
- # change_column_null, make it not nullable and set null values to a default value
332
- person_klass.connection.execute('UPDATE testings SET money = NULL')
333
- person_klass.connection.change_column_null "testings", "money", false, 2000
334
- person_klass.reset_column_information
335
- assert_nil person_klass.columns_hash["money"].default
336
- assert_equal false, person_klass.columns_hash["money"].null
337
- assert_equal 2000, connection.select_values("SELECT money FROM testings").first.to_i
338
- end
339
-
340
- def test_change_column_null
341
- testing_table_with_only_foo_attribute do
342
- notnull_migration = Class.new(ActiveRecord::Migration::Current) do
343
- def change
344
- change_column_null :testings, :foo, false
345
- end
346
- end
347
- notnull_migration.new.suppress_messages do
348
- notnull_migration.migrate(:up)
349
- assert_equal false, connection.columns(:testings).find{ |c| c.name == "foo"}.null
350
- notnull_migration.migrate(:down)
351
- assert connection.columns(:testings).find{ |c| c.name == "foo"}.null
352
- end
353
- end
354
- end
355
-
356
- def test_column_exists
357
- connection.create_table :testings do |t|
358
- t.column :foo, :string
359
- end
360
-
361
- assert connection.column_exists?(:testings, :foo)
362
- assert_not connection.column_exists?(:testings, :bar)
363
- end
364
-
365
- def test_column_exists_with_type
366
- connection.create_table :testings do |t|
367
- t.column :foo, :string
368
- t.column :bar, :decimal, :precision => 8, :scale => 2
369
- end
370
-
371
- assert connection.column_exists?(:testings, :foo, :string)
372
- assert_not connection.column_exists?(:testings, :foo, :integer)
373
-
374
- assert connection.column_exists?(:testings, :bar, :decimal)
375
- assert_not connection.column_exists?(:testings, :bar, :integer)
376
- end
377
-
378
- def test_column_exists_with_definition
379
- connection.create_table :testings do |t|
380
- t.column :foo, :string, limit: 100
381
- t.column :bar, :decimal, precision: 8, scale: 2
382
- t.column :taggable_id, :integer, null: false
383
- t.column :taggable_type, :string, default: 'Photo'
384
- end
385
-
386
- assert connection.column_exists?(:testings, :foo, :string, limit: 100)
387
- assert_not connection.column_exists?(:testings, :foo, :string, limit: nil)
388
- assert connection.column_exists?(:testings, :bar, :decimal, precision: 8, scale: 2)
389
- assert_not connection.column_exists?(:testings, :bar, :decimal, precision: nil, scale: nil)
390
- assert connection.column_exists?(:testings, :taggable_id, :integer, null: false)
391
- assert_not connection.column_exists?(:testings, :taggable_id, :integer, null: true)
392
- assert connection.column_exists?(:testings, :taggable_type, :string, default: 'Photo')
393
- assert_not connection.column_exists?(:testings, :taggable_type, :string, default: nil)
394
- end
395
-
396
- def test_column_exists_on_table_with_no_options_parameter_supplied
397
- connection.create_table :testings do |t|
398
- t.string :foo
399
- end
400
- connection.change_table :testings do |t|
401
- assert t.column_exists?(:foo)
402
- assert !(t.column_exists?(:bar))
403
- end
404
- end
405
-
406
- def test_drop_table_if_exists
407
- connection.create_table(:testings)
408
- ActiveSupport::Deprecation.silence { assert connection.table_exists?(:testings) }
409
- connection.drop_table(:testings, if_exists: true)
410
- ActiveSupport::Deprecation.silence { assert_not connection.table_exists?(:testings) }
411
- end
412
-
413
- def test_drop_table_if_exists_nothing_raised
414
- assert_nothing_raised { connection.drop_table(:nonexistent, if_exists: true) }
415
- end
416
-
417
- private
418
- def testing_table_with_only_foo_attribute
419
- connection.create_table :testings, :id => false do |t|
420
- t.column :foo, :string
421
- end
422
-
423
- yield
424
- end
425
- end
426
-
427
- if ActiveRecord::Base.connection.supports_foreign_keys?
428
- class ChangeSchemaWithDependentObjectsTest < ActiveRecord::TestCase
429
- self.use_transactional_tests = false
430
-
431
- setup do
432
- @connection = ActiveRecord::Base.connection
433
- @connection.create_table :trains
434
- @connection.create_table(:wagons) { |t| t.references :train }
435
- @connection.add_foreign_key :wagons, :trains
436
- end
437
-
438
- teardown do
439
- [:wagons, :trains].each do |table|
440
- @connection.drop_table table, if_exists: true
441
- end
442
- end
443
-
444
- def test_create_table_with_force_cascade_drops_dependent_objects
445
- skip "MySQL > 5.5 does not drop dependent objects with DROP TABLE CASCADE" if current_adapter?(:Mysql2Adapter)
446
- # can't re-create table referenced by foreign key
447
- assert_raises(ActiveRecord::StatementInvalid) do
448
- @connection.create_table :trains, force: true
449
- end
450
-
451
- # can recreate referenced table with force: :cascade
452
- @connection.create_table :trains, force: :cascade
453
- assert_equal [], @connection.foreign_keys(:wagons)
454
- end
455
- end
456
- end
457
- end
458
- end
1
+ require 'cases/helper'
2
+
3
+ module ActiveRecord
4
+ class Migration
5
+ class ChangeSchemaTest < ActiveRecord::TestCase
6
+ attr_reader :connection, :table_name
7
+
8
+ def setup
9
+ super
10
+ @connection = ActiveRecord::Base.connection
11
+ @table_name = :testings
12
+ end
13
+
14
+ teardown do
15
+ connection.drop_table :testings rescue nil
16
+ ActiveRecord::Base.primary_key_prefix_type = nil
17
+ ActiveRecord::Base.clear_cache!
18
+ end
19
+
20
+ def test_create_table_without_id
21
+ testing_table_with_only_foo_attribute do
22
+ assert_equal connection.columns(:testings).size, 1
23
+ end
24
+ end
25
+
26
+ def test_add_column_with_primary_key_attribute
27
+ testing_table_with_only_foo_attribute do
28
+ connection.add_column :testings, :id, :primary_key
29
+ assert_equal connection.columns(:testings).size, 2
30
+ end
31
+ end
32
+
33
+ def test_create_table_adds_id
34
+ connection.create_table :testings do |t|
35
+ t.column :foo, :string
36
+ end
37
+
38
+ assert_equal %w(id foo), connection.columns(:testings).map(&:name)
39
+ end
40
+
41
+ def test_create_table_with_not_null_column
42
+ connection.create_table :testings do |t|
43
+ t.column :foo, :string, :null => false
44
+ end
45
+
46
+ assert_raises(ActiveRecord::StatementInvalid) do
47
+ connection.execute "insert into testings (foo) values (NULL)"
48
+ end
49
+ end
50
+
51
+ def test_create_table_with_defaults
52
+ # MySQL doesn't allow defaults on TEXT or BLOB columns.
53
+ mysql = current_adapter?(:Mysql2Adapter)
54
+
55
+ connection.create_table :testings do |t|
56
+ t.column :one, :string, :default => "hello"
57
+ t.column :two, :boolean, :default => true
58
+ t.column :three, :boolean, :default => false
59
+ t.column :four, :integer, :default => 1
60
+ t.column :five, :text, :default => "hello" unless mysql
61
+ end
62
+
63
+ columns = connection.columns(:testings)
64
+ one = columns.detect { |c| c.name == "one" }
65
+ two = columns.detect { |c| c.name == "two" }
66
+ three = columns.detect { |c| c.name == "three" }
67
+ four = columns.detect { |c| c.name == "four" }
68
+ five = columns.detect { |c| c.name == "five" } unless mysql
69
+
70
+ assert_equal "hello", one.default
71
+ assert_equal true, connection.lookup_cast_type_from_column(two).deserialize(two.default)
72
+ assert_equal false, connection.lookup_cast_type_from_column(three).deserialize(three.default)
73
+ assert_equal '1', four.default
74
+ assert_equal "hello", five.default unless mysql
75
+ end
76
+
77
+ if current_adapter?(:PostgreSQLAdapter)
78
+ def test_add_column_with_array
79
+ connection.create_table :testings
80
+ connection.add_column :testings, :foo, :string, :array => true
81
+
82
+ columns = connection.columns(:testings)
83
+ array_column = columns.detect { |c| c.name == "foo" }
84
+
85
+ assert array_column.array?
86
+ end
87
+
88
+ def test_create_table_with_array_column
89
+ connection.create_table :testings do |t|
90
+ t.string :foo, :array => true
91
+ end
92
+
93
+ columns = connection.columns(:testings)
94
+ array_column = columns.detect { |c| c.name == "foo" }
95
+
96
+ assert array_column.array?
97
+ end
98
+ end
99
+
100
+ def test_create_table_with_bigint
101
+ connection.create_table :testings do |t|
102
+ t.bigint :eight_int
103
+ end
104
+ columns = connection.columns(:testings)
105
+ eight = columns.detect { |c| c.name == "eight_int" }
106
+
107
+ if current_adapter?(:OracleAdapter)
108
+ assert_equal 'NUMBER(19)', eight.sql_type
109
+ elsif current_adapter?(:SQLite3Adapter)
110
+ assert_equal 'bigint', eight.sql_type
111
+ else
112
+ assert_equal :integer, eight.type
113
+ assert_equal 8, eight.limit
114
+ end
115
+ ensure
116
+ connection.drop_table :testings
117
+ end
118
+
119
+ def test_create_table_with_limits
120
+ connection.create_table :testings do |t|
121
+ t.column :foo, :string, :limit => 255
122
+
123
+ t.column :default_int, :integer
124
+
125
+ t.column :one_int, :integer, :limit => 1
126
+ t.column :four_int, :integer, :limit => 4
127
+ t.column :eight_int, :integer, :limit => 8
128
+ end
129
+
130
+ columns = connection.columns(:testings)
131
+ foo = columns.detect { |c| c.name == "foo" }
132
+ assert_equal 255, foo.limit
133
+
134
+ default = columns.detect { |c| c.name == "default_int" }
135
+ one = columns.detect { |c| c.name == "one_int" }
136
+ four = columns.detect { |c| c.name == "four_int" }
137
+ eight = columns.detect { |c| c.name == "eight_int" }
138
+
139
+ if current_adapter?(:PostgreSQLAdapter)
140
+ assert_equal 'integer', default.sql_type
141
+ assert_equal 'smallint', one.sql_type
142
+ assert_equal 'integer', four.sql_type
143
+ assert_equal 'bigint', eight.sql_type
144
+ elsif current_adapter?(:Mysql2Adapter)
145
+ assert_match 'int(11)', default.sql_type
146
+ assert_match 'tinyint', one.sql_type
147
+ assert_match 'int', four.sql_type
148
+ assert_match 'bigint', eight.sql_type
149
+ elsif current_adapter?(:OracleAdapter)
150
+ assert_equal 'NUMBER(38)', default.sql_type
151
+ assert_equal 'NUMBER(1)', one.sql_type
152
+ assert_equal 'NUMBER(4)', four.sql_type
153
+ assert_equal 'NUMBER(8)', eight.sql_type
154
+ end
155
+ end
156
+
157
+ def test_create_table_with_primary_key_prefix_as_table_name_with_underscore
158
+ ActiveRecord::Base.primary_key_prefix_type = :table_name_with_underscore
159
+
160
+ connection.create_table :testings do |t|
161
+ t.column :foo, :string
162
+ end
163
+
164
+ assert_equal %w(testing_id foo), connection.columns(:testings).map(&:name)
165
+ end
166
+
167
+ def test_create_table_with_primary_key_prefix_as_table_name
168
+ ActiveRecord::Base.primary_key_prefix_type = :table_name
169
+
170
+ connection.create_table :testings do |t|
171
+ t.column :foo, :string
172
+ end
173
+
174
+ assert_equal %w(testingid foo), connection.columns(:testings).map(&:name)
175
+ end
176
+
177
+ def test_create_table_raises_when_redefining_primary_key_column
178
+ error = assert_raise(ArgumentError) do
179
+ connection.create_table :testings do |t|
180
+ t.column :id, :string
181
+ end
182
+ end
183
+
184
+ assert_equal "you can't redefine the primary key column 'id'. To define a custom primary key, pass { id: false } to create_table.", error.message
185
+ end
186
+
187
+ def test_create_table_raises_when_redefining_custom_primary_key_column
188
+ error = assert_raise(ArgumentError) do
189
+ connection.create_table :testings, primary_key: :testing_id do |t|
190
+ t.column :testing_id, :string
191
+ end
192
+ end
193
+
194
+ assert_equal "you can't redefine the primary key column 'testing_id'. To define a custom primary key, pass { id: false } to create_table.", error.message
195
+ end
196
+
197
+ def test_create_table_with_timestamps_should_create_datetime_columns
198
+ connection.create_table table_name do |t|
199
+ t.timestamps
200
+ end
201
+ created_columns = connection.columns(table_name)
202
+
203
+ created_at_column = created_columns.detect {|c| c.name == 'created_at' }
204
+ updated_at_column = created_columns.detect {|c| c.name == 'updated_at' }
205
+
206
+ assert !created_at_column.null
207
+ assert !updated_at_column.null
208
+ end
209
+
210
+ def test_create_table_with_timestamps_should_create_datetime_columns_with_options
211
+ connection.create_table table_name do |t|
212
+ t.timestamps null: true
213
+ end
214
+ created_columns = connection.columns(table_name)
215
+
216
+ created_at_column = created_columns.detect {|c| c.name == 'created_at' }
217
+ updated_at_column = created_columns.detect {|c| c.name == 'updated_at' }
218
+
219
+ assert created_at_column.null
220
+ assert updated_at_column.null
221
+ end
222
+
223
+ def test_create_table_without_a_block
224
+ connection.create_table table_name
225
+ end
226
+
227
+ # SQLite3 will not allow you to add a NOT NULL
228
+ # column to a table without a default value.
229
+ unless current_adapter?(:SQLite3Adapter)
230
+ def test_add_column_not_null_without_default
231
+ connection.create_table :testings do |t|
232
+ t.column :foo, :string
233
+ end
234
+ connection.add_column :testings, :bar, :string, :null => false
235
+
236
+ assert_raise(ActiveRecord::StatementInvalid) do
237
+ connection.execute "insert into testings (foo, bar) values ('hello', NULL)"
238
+ end
239
+ end
240
+ end
241
+
242
+ def test_add_column_not_null_with_default
243
+ connection.create_table :testings do |t|
244
+ t.column :foo, :string
245
+ end
246
+
247
+ con = connection
248
+ connection.execute "insert into testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}) values (1, 'hello')"
249
+ assert_nothing_raised {connection.add_column :testings, :bar, :string, :null => false, :default => "default" }
250
+
251
+ assert_raises(ActiveRecord::StatementInvalid) do
252
+ connection.execute "insert into testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}, #{con.quote_column_name('bar')}) values (2, 'hello', NULL)"
253
+ end
254
+ end
255
+
256
+ def test_add_column_with_timestamp_type
257
+ connection.create_table :testings do |t|
258
+ t.column :foo, :timestamp
259
+ end
260
+
261
+ klass = Class.new(ActiveRecord::Base)
262
+ klass.table_name = 'testings'
263
+
264
+ assert_equal :datetime, klass.columns_hash['foo'].type
265
+
266
+ if current_adapter?(:PostgreSQLAdapter)
267
+ assert_equal 'timestamp without time zone', klass.columns_hash['foo'].sql_type
268
+ else
269
+ assert_equal klass.connection.type_to_sql('datetime'), klass.columns_hash['foo'].sql_type
270
+ end
271
+ end
272
+
273
+ def test_change_column_quotes_column_names
274
+ connection.create_table :testings do |t|
275
+ t.column :select, :string
276
+ end
277
+
278
+ connection.change_column :testings, :select, :string, :limit => 10
279
+
280
+ # Oracle needs primary key value from sequence
281
+ if current_adapter?(:OracleAdapter)
282
+ connection.execute "insert into testings (id, #{connection.quote_column_name('select')}) values (testings_seq.nextval, '7 chars')"
283
+ else
284
+ connection.execute "insert into testings (#{connection.quote_column_name('select')}) values ('7 chars')"
285
+ end
286
+ end
287
+
288
+ def test_keeping_default_and_notnull_constraints_on_change
289
+ connection.create_table :testings do |t|
290
+ t.column :title, :string
291
+ end
292
+ person_klass = Class.new(ActiveRecord::Base)
293
+ person_klass.table_name = 'testings'
294
+
295
+ person_klass.connection.add_column "testings", "wealth", :integer, :null => false, :default => 99
296
+ person_klass.reset_column_information
297
+ assert_equal 99, person_klass.column_defaults["wealth"]
298
+ assert_equal false, person_klass.columns_hash["wealth"].null
299
+ # Oracle needs primary key value from sequence
300
+ if current_adapter?(:OracleAdapter)
301
+ assert_nothing_raised {person_klass.connection.execute("insert into testings (id, title) values (testings_seq.nextval, 'tester')")}
302
+ else
303
+ assert_nothing_raised {person_klass.connection.execute("insert into testings (title) values ('tester')")}
304
+ end
305
+
306
+ # change column default to see that column doesn't lose its not null definition
307
+ person_klass.connection.change_column_default "testings", "wealth", 100
308
+ person_klass.reset_column_information
309
+ assert_equal 100, person_klass.column_defaults["wealth"]
310
+ assert_equal false, person_klass.columns_hash["wealth"].null
311
+
312
+ # rename column to see that column doesn't lose its not null and/or default definition
313
+ person_klass.connection.rename_column "testings", "wealth", "money"
314
+ person_klass.reset_column_information
315
+ assert_nil person_klass.columns_hash["wealth"]
316
+ assert_equal 100, person_klass.column_defaults["money"]
317
+ assert_equal false, person_klass.columns_hash["money"].null
318
+
319
+ # change column
320
+ person_klass.connection.change_column "testings", "money", :integer, :null => false, :default => 1000
321
+ person_klass.reset_column_information
322
+ assert_equal 1000, person_klass.column_defaults["money"]
323
+ assert_equal false, person_klass.columns_hash["money"].null
324
+
325
+ # change column, make it nullable and clear default
326
+ person_klass.connection.change_column "testings", "money", :integer, :null => true, :default => nil
327
+ person_klass.reset_column_information
328
+ assert_nil person_klass.columns_hash["money"].default
329
+ assert_equal true, person_klass.columns_hash["money"].null
330
+
331
+ # change_column_null, make it not nullable and set null values to a default value
332
+ person_klass.connection.execute('UPDATE testings SET money = NULL')
333
+ person_klass.connection.change_column_null "testings", "money", false, 2000
334
+ person_klass.reset_column_information
335
+ assert_nil person_klass.columns_hash["money"].default
336
+ assert_equal false, person_klass.columns_hash["money"].null
337
+ assert_equal 2000, connection.select_values("SELECT money FROM testings").first.to_i
338
+ end
339
+
340
+ def test_change_column_null
341
+ testing_table_with_only_foo_attribute do
342
+ notnull_migration = Class.new(ActiveRecord::Migration::Current) do
343
+ def change
344
+ change_column_null :testings, :foo, false
345
+ end
346
+ end
347
+ notnull_migration.new.suppress_messages do
348
+ notnull_migration.migrate(:up)
349
+ assert_equal false, connection.columns(:testings).find{ |c| c.name == "foo"}.null
350
+ notnull_migration.migrate(:down)
351
+ assert connection.columns(:testings).find{ |c| c.name == "foo"}.null
352
+ end
353
+ end
354
+ end
355
+
356
+ def test_column_exists
357
+ connection.create_table :testings do |t|
358
+ t.column :foo, :string
359
+ end
360
+
361
+ assert connection.column_exists?(:testings, :foo)
362
+ assert_not connection.column_exists?(:testings, :bar)
363
+ end
364
+
365
+ def test_column_exists_with_type
366
+ connection.create_table :testings do |t|
367
+ t.column :foo, :string
368
+ t.column :bar, :decimal, :precision => 8, :scale => 2
369
+ end
370
+
371
+ assert connection.column_exists?(:testings, :foo, :string)
372
+ assert_not connection.column_exists?(:testings, :foo, :integer)
373
+
374
+ assert connection.column_exists?(:testings, :bar, :decimal)
375
+ assert_not connection.column_exists?(:testings, :bar, :integer)
376
+ end
377
+
378
+ def test_column_exists_with_definition
379
+ connection.create_table :testings do |t|
380
+ t.column :foo, :string, limit: 100
381
+ t.column :bar, :decimal, precision: 8, scale: 2
382
+ t.column :taggable_id, :integer, null: false
383
+ t.column :taggable_type, :string, default: 'Photo'
384
+ end
385
+
386
+ assert connection.column_exists?(:testings, :foo, :string, limit: 100)
387
+ assert_not connection.column_exists?(:testings, :foo, :string, limit: nil)
388
+ assert connection.column_exists?(:testings, :bar, :decimal, precision: 8, scale: 2)
389
+ assert_not connection.column_exists?(:testings, :bar, :decimal, precision: nil, scale: nil)
390
+ assert connection.column_exists?(:testings, :taggable_id, :integer, null: false)
391
+ assert_not connection.column_exists?(:testings, :taggable_id, :integer, null: true)
392
+ assert connection.column_exists?(:testings, :taggable_type, :string, default: 'Photo')
393
+ assert_not connection.column_exists?(:testings, :taggable_type, :string, default: nil)
394
+ end
395
+
396
+ def test_column_exists_on_table_with_no_options_parameter_supplied
397
+ connection.create_table :testings do |t|
398
+ t.string :foo
399
+ end
400
+ connection.change_table :testings do |t|
401
+ assert t.column_exists?(:foo)
402
+ assert !(t.column_exists?(:bar))
403
+ end
404
+ end
405
+
406
+ def test_drop_table_if_exists
407
+ connection.create_table(:testings)
408
+ ActiveSupport::Deprecation.silence { assert connection.table_exists?(:testings) }
409
+ connection.drop_table(:testings, if_exists: true)
410
+ ActiveSupport::Deprecation.silence { assert_not connection.table_exists?(:testings) }
411
+ end
412
+
413
+ def test_drop_table_if_exists_nothing_raised
414
+ assert_nothing_raised { connection.drop_table(:nonexistent, if_exists: true) }
415
+ end
416
+
417
+ private
418
+ def testing_table_with_only_foo_attribute
419
+ connection.create_table :testings, :id => false do |t|
420
+ t.column :foo, :string
421
+ end
422
+
423
+ yield
424
+ end
425
+ end
426
+
427
+ if ActiveRecord::Base.connection.supports_foreign_keys?
428
+ class ChangeSchemaWithDependentObjectsTest < ActiveRecord::TestCase
429
+ self.use_transactional_tests = false
430
+
431
+ setup do
432
+ @connection = ActiveRecord::Base.connection
433
+ @connection.create_table :trains
434
+ @connection.create_table(:wagons) { |t| t.references :train }
435
+ @connection.add_foreign_key :wagons, :trains
436
+ end
437
+
438
+ teardown do
439
+ [:wagons, :trains].each do |table|
440
+ @connection.drop_table table, if_exists: true
441
+ end
442
+ end
443
+
444
+ def test_create_table_with_force_cascade_drops_dependent_objects
445
+ skip "MySQL > 5.5 does not drop dependent objects with DROP TABLE CASCADE" if current_adapter?(:Mysql2Adapter)
446
+ # can't re-create table referenced by foreign key
447
+ assert_raises(ActiveRecord::StatementInvalid) do
448
+ @connection.create_table :trains, force: true
449
+ end
450
+
451
+ # can recreate referenced table with force: :cascade
452
+ @connection.create_table :trains, force: :cascade
453
+ assert_equal [], @connection.foreign_keys(:wagons)
454
+ end
455
+ end
456
+ end
457
+ end
458
+ end