ibm_db 3.0.4-x86-mingw32 → 5.0.4-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 (593) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES +8 -1
  3. data/LICENSE +1 -1
  4. data/MANIFEST +14 -14
  5. data/ParameterizedQueries README +6 -6
  6. data/README +208 -225
  7. data/ext/Makefile +269 -0
  8. data/ext/Makefile.nt32 +181 -181
  9. data/ext/Makefile.nt32.191 +212 -212
  10. data/ext/extconf.rb +322 -291
  11. data/ext/gil_release_version +3 -0
  12. data/ext/ibm_db-i386-mingw32.def +2 -0
  13. data/ext/ibm_db.c +11879 -11884
  14. data/ext/ibm_db.o +0 -0
  15. data/ext/ibm_db.so +0 -0
  16. data/ext/mkmf.log +110 -0
  17. data/ext/ruby_ibm_db.h +241 -241
  18. data/ext/ruby_ibm_db_cli.c +866 -866
  19. data/ext/ruby_ibm_db_cli.h +500 -500
  20. data/ext/ruby_ibm_db_cli.o +0 -0
  21. data/ext/unicode_support_version +3 -0
  22. data/init.rb +41 -41
  23. data/lib/IBM_DB.rb +27 -27
  24. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3561 -3177
  25. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -2
  26. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  27. data/lib/mswin32/ibm_db.rb +91 -123
  28. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  29. data/test/active_record/connection_adapters/fake_adapter.rb +49 -46
  30. data/test/assets/example.log +1 -1
  31. data/test/assets/test.txt +1 -1
  32. data/test/cases/adapter_test.rb +351 -261
  33. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
  34. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
  35. data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
  36. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
  37. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
  38. data/test/cases/adapters/mysql2/connection_test.rb +210 -0
  39. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
  40. data/test/cases/adapters/mysql2/enum_test.rb +26 -0
  41. data/test/cases/adapters/mysql2/explain_test.rb +21 -0
  42. data/test/cases/adapters/mysql2/json_test.rb +195 -0
  43. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
  44. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  45. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
  46. data/test/cases/adapters/mysql2/schema_test.rb +126 -0
  47. data/test/cases/adapters/mysql2/sp_test.rb +36 -0
  48. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
  49. data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
  50. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
  51. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
  52. data/test/cases/adapters/postgresql/array_test.rb +339 -0
  53. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
  54. data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
  55. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
  56. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
  57. data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
  58. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  59. data/test/cases/adapters/postgresql/collation_test.rb +53 -0
  60. data/test/cases/adapters/postgresql/composite_test.rb +132 -0
  61. data/test/cases/adapters/postgresql/connection_test.rb +257 -0
  62. data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
  63. data/test/cases/adapters/postgresql/domain_test.rb +47 -0
  64. data/test/cases/adapters/postgresql/enum_test.rb +91 -0
  65. data/test/cases/adapters/postgresql/explain_test.rb +20 -0
  66. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
  67. data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
  68. data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
  69. data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
  70. data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
  71. data/test/cases/adapters/postgresql/integer_test.rb +25 -0
  72. data/test/cases/adapters/postgresql/json_test.rb +237 -0
  73. data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
  74. data/test/cases/adapters/postgresql/money_test.rb +96 -0
  75. data/test/cases/adapters/postgresql/network_test.rb +94 -0
  76. data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
  77. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
  78. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  79. data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
  80. data/test/cases/adapters/postgresql/range_test.rb +343 -0
  81. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
  82. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
  83. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
  84. data/test/cases/adapters/postgresql/schema_test.rb +597 -0
  85. data/test/cases/adapters/postgresql/serial_test.rb +154 -0
  86. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
  87. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
  88. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
  89. data/test/cases/adapters/postgresql/utils_test.rb +62 -0
  90. data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
  91. data/test/cases/adapters/postgresql/xml_test.rb +54 -0
  92. data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
  93. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
  94. data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
  95. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
  96. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
  97. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  98. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
  99. data/test/cases/aggregations_test.rb +168 -158
  100. data/test/cases/ar_schema_test.rb +146 -161
  101. data/test/cases/associations/association_scope_test.rb +16 -21
  102. data/test/cases/associations/belongs_to_associations_test.rb +1141 -1029
  103. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
  104. data/test/cases/associations/callbacks_test.rb +190 -192
  105. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  106. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  107. data/test/cases/associations/eager_load_nested_include_test.rb +126 -128
  108. data/test/cases/associations/eager_singularization_test.rb +148 -148
  109. data/test/cases/associations/eager_test.rb +1514 -1411
  110. data/test/cases/associations/extension_test.rb +87 -82
  111. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -932
  112. data/test/cases/associations/has_many_associations_test.rb +2501 -2162
  113. data/test/cases/associations/has_many_through_associations_test.rb +1271 -1204
  114. data/test/cases/associations/has_one_associations_test.rb +707 -610
  115. data/test/cases/associations/has_one_through_associations_test.rb +383 -380
  116. data/test/cases/associations/inner_join_association_test.rb +139 -139
  117. data/test/cases/associations/inverse_associations_test.rb +733 -693
  118. data/test/cases/associations/join_model_test.rb +777 -754
  119. data/test/cases/associations/left_outer_join_association_test.rb +88 -0
  120. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  121. data/test/cases/associations/required_test.rb +102 -82
  122. data/test/cases/associations_test.rb +385 -380
  123. data/test/cases/attribute_decorators_test.rb +126 -125
  124. data/test/cases/attribute_methods/read_test.rb +60 -60
  125. data/test/cases/attribute_methods_test.rb +1009 -952
  126. data/test/cases/attribute_set_test.rb +270 -200
  127. data/test/cases/attribute_test.rb +246 -180
  128. data/test/cases/attributes_test.rb +253 -136
  129. data/test/cases/autosave_association_test.rb +1708 -1595
  130. data/test/cases/base_test.rb +1713 -1638
  131. data/test/cases/batches_test.rb +489 -212
  132. data/test/cases/binary_test.rb +44 -52
  133. data/test/cases/bind_parameter_test.rb +110 -100
  134. data/test/cases/cache_key_test.rb +26 -0
  135. data/test/cases/calculations_test.rb +798 -646
  136. data/test/cases/callbacks_test.rb +636 -543
  137. data/test/cases/clone_test.rb +40 -40
  138. data/test/cases/coders/json_test.rb +15 -0
  139. data/test/cases/coders/yaml_column_test.rb +63 -63
  140. data/test/cases/collection_cache_key_test.rb +115 -0
  141. data/test/cases/column_alias_test.rb +17 -17
  142. data/test/cases/column_definition_test.rb +92 -123
  143. data/test/cases/comment_test.rb +145 -0
  144. data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -54
  145. data/test/cases/connection_adapters/connection_handler_test.rb +160 -53
  146. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  147. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -293
  148. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -65
  149. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  150. data/test/cases/connection_adapters/schema_cache_test.rb +61 -56
  151. data/test/cases/connection_adapters/type_lookup_test.rb +118 -110
  152. data/test/cases/connection_management_test.rb +112 -122
  153. data/test/cases/connection_pool_test.rb +521 -346
  154. data/test/cases/connection_specification/resolver_test.rb +131 -116
  155. data/test/cases/core_test.rb +112 -112
  156. data/test/cases/counter_cache_test.rb +214 -209
  157. data/test/cases/custom_locking_test.rb +17 -17
  158. data/test/cases/database_statements_test.rb +34 -19
  159. data/test/cases/{invalid_date_test.rb → date_test.rb} +44 -32
  160. data/test/cases/date_time_precision_test.rb +107 -0
  161. data/test/cases/date_time_test.rb +61 -61
  162. data/test/cases/defaults_test.rb +219 -223
  163. data/test/cases/dirty_test.rb +763 -775
  164. data/test/cases/disconnected_test.rb +30 -28
  165. data/test/cases/dup_test.rb +157 -157
  166. data/test/cases/enum_test.rb +444 -290
  167. data/test/cases/errors_test.rb +16 -0
  168. data/test/cases/explain_subscriber_test.rb +64 -64
  169. data/test/cases/explain_test.rb +87 -76
  170. data/test/cases/finder_respond_to_test.rb +60 -60
  171. data/test/cases/finder_test.rb +1294 -1166
  172. data/test/cases/fixture_set/file_test.rb +156 -138
  173. data/test/cases/fixtures_test.rb +988 -897
  174. data/test/cases/forbidden_attributes_protection_test.rb +165 -99
  175. data/test/cases/habtm_destroy_order_test.rb +61 -61
  176. data/test/cases/helper.rb +204 -210
  177. data/test/cases/hot_compatibility_test.rb +142 -54
  178. data/test/cases/i18n_test.rb +45 -45
  179. data/test/cases/inheritance_test.rb +606 -375
  180. data/test/cases/integration_test.rb +155 -139
  181. data/test/cases/invalid_connection_test.rb +24 -22
  182. data/test/cases/invertible_migration_test.rb +387 -295
  183. data/test/cases/json_serialization_test.rb +311 -302
  184. data/test/cases/locking_test.rb +493 -477
  185. data/test/cases/log_subscriber_test.rb +225 -136
  186. data/test/cases/migration/change_schema_test.rb +458 -472
  187. data/test/cases/migration/change_table_test.rb +256 -224
  188. data/test/cases/migration/column_attributes_test.rb +176 -192
  189. data/test/cases/migration/column_positioning_test.rb +56 -56
  190. data/test/cases/migration/columns_test.rb +310 -304
  191. data/test/cases/migration/command_recorder_test.rb +350 -305
  192. data/test/cases/migration/compatibility_test.rb +118 -0
  193. data/test/cases/migration/create_join_table_test.rb +157 -148
  194. data/test/cases/migration/foreign_key_test.rb +362 -360
  195. data/test/cases/migration/helper.rb +39 -39
  196. data/test/cases/migration/index_test.rb +218 -216
  197. data/test/cases/migration/logger_test.rb +36 -36
  198. data/test/cases/migration/pending_migrations_test.rb +52 -53
  199. data/test/cases/migration/references_foreign_key_test.rb +221 -214
  200. data/test/cases/migration/references_index_test.rb +101 -101
  201. data/test/cases/migration/references_statements_test.rb +136 -116
  202. data/test/cases/migration/rename_table_test.rb +93 -93
  203. data/test/cases/migration_test.rb +1157 -959
  204. data/test/cases/migrator_test.rb +471 -388
  205. data/test/cases/mixin_test.rb +68 -70
  206. data/test/cases/modules_test.rb +172 -173
  207. data/test/cases/multiparameter_attributes_test.rb +372 -350
  208. data/test/cases/multiple_db_test.rb +122 -115
  209. data/test/cases/nested_attributes_test.rb +1098 -1057
  210. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  211. data/test/cases/persistence_test.rb +1001 -909
  212. data/test/cases/pooled_connections_test.rb +81 -81
  213. data/test/cases/primary_keys_test.rb +376 -237
  214. data/test/cases/query_cache_test.rb +446 -326
  215. data/test/cases/quoting_test.rb +202 -156
  216. data/test/cases/readonly_test.rb +119 -118
  217. data/test/cases/reaper_test.rb +85 -85
  218. data/test/cases/reflection_test.rb +509 -454
  219. data/test/cases/relation/delegation_test.rb +63 -68
  220. data/test/cases/relation/merging_test.rb +157 -161
  221. data/test/cases/relation/mutation_test.rb +183 -165
  222. data/test/cases/relation/or_test.rb +92 -0
  223. data/test/cases/relation/predicate_builder_test.rb +16 -14
  224. data/test/cases/relation/record_fetch_warning_test.rb +40 -0
  225. data/test/cases/relation/where_chain_test.rb +105 -181
  226. data/test/cases/relation/where_clause_test.rb +182 -0
  227. data/test/cases/relation/where_test.rb +322 -300
  228. data/test/cases/relation_test.rb +328 -297
  229. data/test/cases/relations_test.rb +2026 -1815
  230. data/test/cases/reload_models_test.rb +22 -22
  231. data/test/cases/result_test.rb +90 -80
  232. data/test/cases/sanitize_test.rb +176 -83
  233. data/test/cases/schema_dumper_test.rb +457 -463
  234. data/test/cases/schema_loading_test.rb +52 -0
  235. data/test/cases/scoping/default_scoping_test.rb +528 -454
  236. data/test/cases/scoping/named_scoping_test.rb +561 -524
  237. data/test/cases/scoping/relation_scoping_test.rb +400 -357
  238. data/test/cases/secure_token_test.rb +32 -0
  239. data/test/cases/serialization_test.rb +104 -104
  240. data/test/cases/serialized_attribute_test.rb +364 -277
  241. data/test/cases/statement_cache_test.rb +136 -98
  242. data/test/cases/store_test.rb +195 -194
  243. data/test/cases/suppressor_test.rb +63 -0
  244. data/test/cases/tasks/database_tasks_test.rb +462 -396
  245. data/test/cases/tasks/mysql_rake_test.rb +345 -311
  246. data/test/cases/tasks/postgresql_rake_test.rb +304 -245
  247. data/test/cases/tasks/sqlite_rake_test.rb +220 -193
  248. data/test/cases/test_case.rb +131 -123
  249. data/test/cases/test_fixtures_test.rb +36 -0
  250. data/test/cases/time_precision_test.rb +103 -0
  251. data/test/cases/timestamp_test.rb +501 -468
  252. data/test/cases/touch_later_test.rb +121 -0
  253. data/test/cases/transaction_callbacks_test.rb +518 -452
  254. data/test/cases/transaction_isolation_test.rb +106 -106
  255. data/test/cases/transactions_test.rb +835 -817
  256. data/test/cases/type/adapter_specific_registry_test.rb +133 -0
  257. data/test/cases/type/date_time_test.rb +14 -0
  258. data/test/cases/type/integer_test.rb +27 -121
  259. data/test/cases/type/string_test.rb +22 -36
  260. data/test/cases/type/type_map_test.rb +177 -177
  261. data/test/cases/type_test.rb +39 -0
  262. data/test/cases/types_test.rb +24 -141
  263. data/test/cases/unconnected_test.rb +33 -33
  264. data/test/cases/validations/absence_validation_test.rb +73 -0
  265. data/test/cases/validations/association_validation_test.rb +97 -86
  266. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  267. data/test/cases/validations/i18n_validation_test.rb +86 -90
  268. data/test/cases/validations/length_validation_test.rb +79 -47
  269. data/test/cases/validations/presence_validation_test.rb +103 -68
  270. data/test/cases/validations/uniqueness_validation_test.rb +548 -434
  271. data/test/cases/validations_repair_helper.rb +19 -23
  272. data/test/cases/validations_test.rb +194 -165
  273. data/test/cases/view_test.rb +216 -113
  274. data/test/cases/yaml_serialization_test.rb +121 -86
  275. data/test/config.example.yml +97 -0
  276. data/test/config.rb +5 -5
  277. data/test/config.yml +154 -154
  278. data/test/connections/native_ibm_db/connection.rb +43 -43
  279. data/test/fixtures/accounts.yml +29 -29
  280. data/test/fixtures/admin/accounts.yml +2 -2
  281. data/test/fixtures/admin/randomly_named_a9.yml +7 -7
  282. data/test/fixtures/admin/randomly_named_b0.yml +7 -7
  283. data/test/fixtures/admin/users.yml +10 -10
  284. data/test/fixtures/author_addresses.yml +17 -17
  285. data/test/fixtures/author_favorites.yml +3 -3
  286. data/test/fixtures/authors.yml +23 -23
  287. data/test/fixtures/bad_posts.yml +9 -0
  288. data/test/fixtures/binaries.yml +133 -133
  289. data/test/fixtures/books.yml +31 -11
  290. data/test/fixtures/bulbs.yml +5 -5
  291. data/test/fixtures/cars.yml +9 -9
  292. data/test/fixtures/categories.yml +19 -19
  293. data/test/fixtures/categories/special_categories.yml +9 -9
  294. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  295. data/test/fixtures/categories_ordered.yml +7 -7
  296. data/test/fixtures/categories_posts.yml +31 -31
  297. data/test/fixtures/categorizations.yml +23 -23
  298. data/test/fixtures/clubs.yml +8 -8
  299. data/test/fixtures/collections.yml +3 -3
  300. data/test/fixtures/colleges.yml +3 -3
  301. data/test/fixtures/comments.yml +65 -65
  302. data/test/fixtures/companies.yml +67 -67
  303. data/test/fixtures/computers.yml +10 -10
  304. data/test/fixtures/content.yml +3 -0
  305. data/test/fixtures/content_positions.yml +3 -0
  306. data/test/fixtures/courses.yml +8 -8
  307. data/test/fixtures/customers.yml +25 -25
  308. data/test/fixtures/dashboards.yml +6 -6
  309. data/test/fixtures/dead_parrots.yml +5 -0
  310. data/test/fixtures/developers.yml +21 -21
  311. data/test/fixtures/developers_projects.yml +16 -16
  312. data/test/fixtures/dog_lovers.yml +7 -7
  313. data/test/fixtures/dogs.yml +4 -4
  314. data/test/fixtures/doubloons.yml +3 -3
  315. data/test/fixtures/edges.yml +5 -5
  316. data/test/fixtures/entrants.yml +14 -14
  317. data/test/fixtures/essays.yml +6 -6
  318. data/test/fixtures/faces.yml +11 -11
  319. data/test/fixtures/fk_test_has_fk.yml +3 -3
  320. data/test/fixtures/fk_test_has_pk.yml +1 -1
  321. data/test/fixtures/friendships.yml +4 -4
  322. data/test/fixtures/funny_jokes.yml +10 -10
  323. data/test/fixtures/interests.yml +33 -33
  324. data/test/fixtures/items.yml +3 -3
  325. data/test/fixtures/jobs.yml +7 -7
  326. data/test/fixtures/legacy_things.yml +3 -3
  327. data/test/fixtures/live_parrots.yml +4 -0
  328. data/test/fixtures/mateys.yml +4 -4
  329. data/test/fixtures/member_details.yml +8 -8
  330. data/test/fixtures/member_types.yml +6 -6
  331. data/test/fixtures/members.yml +11 -11
  332. data/test/fixtures/memberships.yml +34 -34
  333. data/test/fixtures/men.yml +5 -5
  334. data/test/fixtures/minimalistics.yml +2 -2
  335. data/test/fixtures/minivans.yml +5 -5
  336. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  337. data/test/fixtures/mixins.yml +29 -29
  338. data/test/fixtures/movies.yml +7 -7
  339. data/test/fixtures/naked/yml/accounts.yml +1 -1
  340. data/test/fixtures/naked/yml/companies.yml +1 -1
  341. data/test/fixtures/naked/yml/courses.yml +1 -1
  342. data/test/fixtures/naked/yml/parrots.yml +2 -0
  343. data/test/fixtures/naked/yml/trees.yml +3 -0
  344. data/test/fixtures/nodes.yml +29 -0
  345. data/test/fixtures/organizations.yml +5 -5
  346. data/test/fixtures/other_comments.yml +6 -0
  347. data/test/fixtures/other_dogs.yml +2 -0
  348. data/test/fixtures/other_posts.yml +7 -0
  349. data/test/fixtures/other_topics.yml +42 -42
  350. data/test/fixtures/owners.yml +9 -9
  351. data/test/fixtures/parrots.yml +27 -27
  352. data/test/fixtures/parrots_pirates.yml +7 -7
  353. data/test/fixtures/people.yml +24 -24
  354. data/test/fixtures/peoples_treasures.yml +3 -3
  355. data/test/fixtures/pets.yml +19 -19
  356. data/test/fixtures/pirates.yml +12 -12
  357. data/test/fixtures/posts.yml +80 -80
  358. data/test/fixtures/price_estimates.yml +16 -7
  359. data/test/fixtures/products.yml +4 -4
  360. data/test/fixtures/projects.yml +7 -7
  361. data/test/fixtures/randomly_named_a9.yml +7 -7
  362. data/test/fixtures/ratings.yml +14 -14
  363. data/test/fixtures/readers.yml +11 -11
  364. data/test/fixtures/references.yml +17 -17
  365. data/test/fixtures/reserved_words/distinct.yml +5 -5
  366. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  367. data/test/fixtures/reserved_words/group.yml +14 -14
  368. data/test/fixtures/reserved_words/select.yml +8 -8
  369. data/test/fixtures/reserved_words/values.yml +7 -7
  370. data/test/fixtures/ships.yml +6 -6
  371. data/test/fixtures/speedometers.yml +8 -8
  372. data/test/fixtures/sponsors.yml +12 -12
  373. data/test/fixtures/string_key_objects.yml +7 -7
  374. data/test/fixtures/subscribers.yml +10 -10
  375. data/test/fixtures/subscriptions.yml +12 -12
  376. data/test/fixtures/taggings.yml +78 -78
  377. data/test/fixtures/tags.yml +11 -11
  378. data/test/fixtures/tasks.yml +7 -7
  379. data/test/fixtures/teapots.yml +3 -3
  380. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  381. data/test/fixtures/to_be_linked/users.yml +10 -10
  382. data/test/fixtures/topics.yml +49 -49
  383. data/test/fixtures/toys.yml +14 -14
  384. data/test/fixtures/traffic_lights.yml +9 -9
  385. data/test/fixtures/treasures.yml +10 -10
  386. data/test/fixtures/trees.yml +3 -0
  387. data/test/fixtures/uuid_children.yml +3 -3
  388. data/test/fixtures/uuid_parents.yml +2 -2
  389. data/test/fixtures/variants.yml +4 -4
  390. data/test/fixtures/vegetables.yml +19 -19
  391. data/test/fixtures/vertices.yml +3 -3
  392. data/test/fixtures/warehouse_things.yml +2 -2
  393. data/test/fixtures/zines.yml +5 -5
  394. data/test/ibm_db_test.rb +24 -24
  395. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  396. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  397. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  398. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -9
  399. data/test/migrations/missing/1_people_have_last_names.rb +9 -9
  400. data/test/migrations/missing/3_we_need_reminders.rb +12 -12
  401. data/test/migrations/missing/4_innocent_jointable.rb +12 -12
  402. data/test/migrations/rename/1_we_need_things.rb +11 -11
  403. data/test/migrations/rename/2_rename_things.rb +9 -9
  404. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  405. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  406. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  407. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  408. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  409. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  410. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  411. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  412. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  413. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  414. data/test/migrations/valid/2_we_need_reminders.rb +12 -12
  415. data/test/migrations/valid/3_innocent_jointable.rb +12 -12
  416. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  417. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -12
  418. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -12
  419. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  420. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  421. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  422. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  423. data/test/models/admin.rb +4 -4
  424. data/test/models/admin/account.rb +2 -2
  425. data/test/models/admin/randomly_named_c1.rb +7 -3
  426. data/test/models/admin/user.rb +40 -40
  427. data/test/models/aircraft.rb +5 -4
  428. data/test/models/arunit2_model.rb +3 -3
  429. data/test/models/author.rb +209 -212
  430. data/test/models/auto_id.rb +4 -4
  431. data/test/models/autoloadable/extra_firm.rb +2 -2
  432. data/test/models/binary.rb +1 -1
  433. data/test/models/bird.rb +12 -12
  434. data/test/models/book.rb +23 -18
  435. data/test/models/boolean.rb +2 -2
  436. data/test/models/bulb.rb +52 -51
  437. data/test/models/cake_designer.rb +3 -3
  438. data/test/models/car.rb +29 -26
  439. data/test/models/carrier.rb +2 -2
  440. data/test/models/cat.rb +10 -0
  441. data/test/models/categorization.rb +19 -19
  442. data/test/models/category.rb +35 -35
  443. data/test/models/chef.rb +8 -3
  444. data/test/models/citation.rb +3 -3
  445. data/test/models/club.rb +25 -23
  446. data/test/models/college.rb +10 -10
  447. data/test/models/column.rb +3 -3
  448. data/test/models/column_name.rb +3 -3
  449. data/test/models/comment.rb +76 -64
  450. data/test/models/company.rb +230 -225
  451. data/test/models/company_in_module.rb +98 -98
  452. data/test/models/computer.rb +3 -3
  453. data/test/models/contact.rb +41 -41
  454. data/test/models/content.rb +40 -0
  455. data/test/models/contract.rb +20 -20
  456. data/test/models/country.rb +7 -7
  457. data/test/models/course.rb +6 -6
  458. data/test/models/customer.rb +83 -77
  459. data/test/models/customer_carrier.rb +14 -14
  460. data/test/models/dashboard.rb +3 -3
  461. data/test/models/default.rb +2 -2
  462. data/test/models/department.rb +4 -4
  463. data/test/models/developer.rb +274 -252
  464. data/test/models/dog.rb +5 -5
  465. data/test/models/dog_lover.rb +5 -5
  466. data/test/models/doubloon.rb +12 -12
  467. data/test/models/drink_designer.rb +3 -3
  468. data/test/models/edge.rb +5 -5
  469. data/test/models/electron.rb +5 -5
  470. data/test/models/engine.rb +4 -4
  471. data/test/models/entrant.rb +3 -3
  472. data/test/models/essay.rb +5 -5
  473. data/test/models/event.rb +2 -2
  474. data/test/models/eye.rb +37 -37
  475. data/test/models/face.rb +9 -9
  476. data/test/models/friendship.rb +6 -6
  477. data/test/models/guid.rb +1 -1
  478. data/test/models/guitar.rb +4 -0
  479. data/test/models/hotel.rb +11 -6
  480. data/test/models/image.rb +3 -3
  481. data/test/models/interest.rb +5 -5
  482. data/test/models/invoice.rb +4 -4
  483. data/test/models/item.rb +7 -7
  484. data/test/models/job.rb +7 -7
  485. data/test/models/joke.rb +7 -7
  486. data/test/models/keyboard.rb +3 -3
  487. data/test/models/legacy_thing.rb +3 -3
  488. data/test/models/lesson.rb +11 -11
  489. data/test/models/line_item.rb +3 -3
  490. data/test/models/liquid.rb +4 -4
  491. data/test/models/man.rb +11 -11
  492. data/test/models/matey.rb +4 -4
  493. data/test/models/member.rb +42 -41
  494. data/test/models/member_detail.rb +8 -7
  495. data/test/models/member_type.rb +3 -3
  496. data/test/models/membership.rb +35 -35
  497. data/test/models/mentor.rb +3 -0
  498. data/test/models/minimalistic.rb +2 -2
  499. data/test/models/minivan.rb +9 -9
  500. data/test/models/mixed_case_monkey.rb +3 -3
  501. data/test/models/mocktail_designer.rb +2 -0
  502. data/test/models/molecule.rb +6 -6
  503. data/test/models/movie.rb +5 -5
  504. data/test/models/node.rb +5 -0
  505. data/test/models/non_primary_key.rb +2 -0
  506. data/test/models/notification.rb +3 -0
  507. data/test/models/order.rb +4 -4
  508. data/test/models/organization.rb +14 -14
  509. data/test/models/other_dog.rb +5 -0
  510. data/test/models/owner.rb +37 -34
  511. data/test/models/parrot.rb +28 -29
  512. data/test/models/person.rb +142 -143
  513. data/test/models/personal_legacy_thing.rb +4 -4
  514. data/test/models/pet.rb +18 -15
  515. data/test/models/pet_treasure.rb +6 -0
  516. data/test/models/pirate.rb +92 -92
  517. data/test/models/possession.rb +3 -3
  518. data/test/models/post.rb +273 -264
  519. data/test/models/price_estimate.rb +4 -4
  520. data/test/models/professor.rb +5 -5
  521. data/test/models/project.rb +40 -29
  522. data/test/models/publisher.rb +2 -2
  523. data/test/models/publisher/article.rb +4 -4
  524. data/test/models/publisher/magazine.rb +3 -3
  525. data/test/models/randomly_named_c1.rb +3 -3
  526. data/test/models/rating.rb +4 -4
  527. data/test/models/reader.rb +23 -23
  528. data/test/models/recipe.rb +3 -0
  529. data/test/models/record.rb +2 -2
  530. data/test/models/reference.rb +22 -22
  531. data/test/models/reply.rb +61 -61
  532. data/test/models/ship.rb +39 -33
  533. data/test/models/ship_part.rb +7 -7
  534. data/test/models/shop.rb +17 -17
  535. data/test/models/shop_account.rb +6 -6
  536. data/test/models/speedometer.rb +6 -6
  537. data/test/models/sponsor.rb +7 -7
  538. data/test/models/string_key_object.rb +3 -3
  539. data/test/models/student.rb +4 -4
  540. data/test/models/subject.rb +16 -16
  541. data/test/models/subscriber.rb +8 -8
  542. data/test/models/subscription.rb +4 -4
  543. data/test/models/tag.rb +13 -7
  544. data/test/models/tagging.rb +13 -13
  545. data/test/models/task.rb +5 -5
  546. data/test/models/topic.rb +118 -124
  547. data/test/models/toy.rb +6 -6
  548. data/test/models/traffic_light.rb +4 -4
  549. data/test/models/treasure.rb +14 -14
  550. data/test/models/treaty.rb +7 -7
  551. data/test/models/tree.rb +3 -0
  552. data/test/models/tuning_peg.rb +4 -0
  553. data/test/models/tyre.rb +11 -11
  554. data/test/models/user.rb +14 -0
  555. data/test/models/uuid_child.rb +3 -3
  556. data/test/models/uuid_item.rb +6 -0
  557. data/test/models/uuid_parent.rb +3 -3
  558. data/test/models/vegetables.rb +24 -24
  559. data/test/models/vehicle.rb +6 -6
  560. data/test/models/vertex.rb +9 -9
  561. data/test/models/warehouse_thing.rb +5 -5
  562. data/test/models/wheel.rb +3 -3
  563. data/test/models/without_table.rb +3 -3
  564. data/test/models/zine.rb +3 -3
  565. data/test/schema/mysql2_specific_schema.rb +68 -58
  566. data/test/schema/oracle_specific_schema.rb +40 -43
  567. data/test/schema/postgresql_specific_schema.rb +114 -202
  568. data/test/schema/schema.rb +1057 -938
  569. data/test/schema/schema.rb.original +1057 -0
  570. data/test/schema/sqlite_specific_schema.rb +18 -22
  571. data/test/support/config.rb +43 -43
  572. data/test/support/connection.rb +23 -22
  573. data/test/support/connection_helper.rb +14 -14
  574. data/test/support/ddl_helper.rb +8 -8
  575. data/test/support/schema_dumping_helper.rb +20 -20
  576. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  577. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  578. metadata +146 -30
  579. data/lib/mswin32/rb19x/ibm_db.so +0 -0
  580. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  581. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  582. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  583. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
  584. data/test/cases/attribute_methods/serialization_test.rb +0 -29
  585. data/test/cases/migration/change_schema_test - Copy.rb +0 -448
  586. data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
  587. data/test/cases/migration/table_and_index_test.rb +0 -24
  588. data/test/cases/relation/where_test2.rb +0 -36
  589. data/test/cases/type/decimal_test.rb +0 -51
  590. data/test/cases/type/unsigned_integer_test.rb +0 -18
  591. data/test/cases/xml_serialization_test.rb +0 -457
  592. data/test/fixtures/naked/csv/accounts.csv +0 -1
  593. data/test/schema/mysql_specific_schema.rb +0 -70
@@ -0,0 +1,154 @@
1
+ require "cases/helper"
2
+ require 'support/schema_dumping_helper'
3
+
4
+ class PostgresqlSerialTest < ActiveRecord::PostgreSQLTestCase
5
+ include SchemaDumpingHelper
6
+
7
+ class PostgresqlSerial < ActiveRecord::Base; end
8
+
9
+ setup do
10
+ @connection = ActiveRecord::Base.connection
11
+ @connection.create_table "postgresql_serials", force: true do |t|
12
+ t.serial :seq
13
+ t.integer :serials_id, default: -> { "nextval('postgresql_serials_id_seq')" }
14
+ end
15
+ end
16
+
17
+ teardown do
18
+ @connection.drop_table "postgresql_serials", if_exists: true
19
+ end
20
+
21
+ def test_serial_column
22
+ column = PostgresqlSerial.columns_hash["seq"]
23
+ assert_equal :integer, column.type
24
+ assert_equal "integer", column.sql_type
25
+ assert column.serial?
26
+ end
27
+
28
+ def test_not_serial_column
29
+ column = PostgresqlSerial.columns_hash["serials_id"]
30
+ assert_equal :integer, column.type
31
+ assert_equal "integer", column.sql_type
32
+ assert_not column.serial?
33
+ end
34
+
35
+ def test_schema_dump_with_shorthand
36
+ output = dump_table_schema "postgresql_serials"
37
+ assert_match %r{t\.serial\s+"seq",\s+null: false$}, output
38
+ end
39
+
40
+ def test_schema_dump_with_not_serial
41
+ output = dump_table_schema "postgresql_serials"
42
+ assert_match %r{t\.integer\s+"serials_id",\s+default: -> \{ "nextval\('postgresql_serials_id_seq'::regclass\)" \}$}, output
43
+ end
44
+ end
45
+
46
+ class PostgresqlBigSerialTest < ActiveRecord::PostgreSQLTestCase
47
+ include SchemaDumpingHelper
48
+
49
+ class PostgresqlBigSerial < ActiveRecord::Base; end
50
+
51
+ setup do
52
+ @connection = ActiveRecord::Base.connection
53
+ @connection.create_table "postgresql_big_serials", force: true do |t|
54
+ t.bigserial :seq
55
+ t.bigint :serials_id, default: -> { "nextval('postgresql_big_serials_id_seq')" }
56
+ end
57
+ end
58
+
59
+ teardown do
60
+ @connection.drop_table "postgresql_big_serials", if_exists: true
61
+ end
62
+
63
+ def test_bigserial_column
64
+ column = PostgresqlBigSerial.columns_hash["seq"]
65
+ assert_equal :integer, column.type
66
+ assert_equal "bigint", column.sql_type
67
+ assert column.serial?
68
+ end
69
+
70
+ def test_not_bigserial_column
71
+ column = PostgresqlBigSerial.columns_hash["serials_id"]
72
+ assert_equal :integer, column.type
73
+ assert_equal "bigint", column.sql_type
74
+ assert_not column.serial?
75
+ end
76
+
77
+ def test_schema_dump_with_shorthand
78
+ output = dump_table_schema "postgresql_big_serials"
79
+ assert_match %r{t\.bigserial\s+"seq",\s+null: false$}, output
80
+ end
81
+
82
+ def test_schema_dump_with_not_bigserial
83
+ output = dump_table_schema "postgresql_big_serials"
84
+ assert_match %r{t\.bigint\s+"serials_id",\s+default: -> \{ "nextval\('postgresql_big_serials_id_seq'::regclass\)" \}$}, output
85
+ end
86
+ end
87
+
88
+ module SequenceNameDetectionTestCases
89
+ class CollidedSequenceNameTest < ActiveRecord::PostgreSQLTestCase
90
+ include SchemaDumpingHelper
91
+
92
+ def setup
93
+ @connection = ActiveRecord::Base.connection
94
+ @connection.create_table :foo_bar, force: true do |t|
95
+ t.serial :baz_id
96
+ end
97
+ @connection.create_table :foo, force: true do |t|
98
+ t.serial :bar_id
99
+ t.bigserial :bar_baz_id
100
+ end
101
+ end
102
+
103
+ def teardown
104
+ @connection.drop_table :foo_bar, if_exists: true
105
+ @connection.drop_table :foo, if_exists: true
106
+ end
107
+
108
+ def test_serial_columns
109
+ columns = @connection.columns(:foo)
110
+ columns.each do |column|
111
+ assert_equal :integer, column.type
112
+ assert column.serial?
113
+ end
114
+ end
115
+
116
+ def test_schema_dump_with_collided_sequence_name
117
+ output = dump_table_schema "foo"
118
+ assert_match %r{t\.serial\s+"bar_id",\s+null: false$}, output
119
+ assert_match %r{t\.bigserial\s+"bar_baz_id",\s+null: false$}, output
120
+ end
121
+ end
122
+
123
+ class LongerSequenceNameDetectionTest < ActiveRecord::PostgreSQLTestCase
124
+ include SchemaDumpingHelper
125
+
126
+ def setup
127
+ @table_name = "long_table_name_to_test_sequence_name_detection_for_serial_cols"
128
+ @connection = ActiveRecord::Base.connection
129
+ @connection.create_table @table_name, force: true do |t|
130
+ t.serial :seq
131
+ t.bigserial :bigseq
132
+ end
133
+ end
134
+
135
+ def teardown
136
+ @connection.drop_table @table_name, if_exists: true
137
+ end
138
+
139
+ def test_serial_columns
140
+ columns = @connection.columns(@table_name)
141
+ columns.each do |column|
142
+ assert_equal :integer, column.type
143
+ assert column.serial?
144
+ end
145
+ end
146
+
147
+ def test_schema_dump_with_long_table_name
148
+ output = dump_table_schema @table_name
149
+ assert_match %r{create_table "#{@table_name}", force: :cascade}, output
150
+ assert_match %r{t\.serial\s+"seq",\s+null: false$}, output
151
+ assert_match %r{t\.bigserial\s+"bigseq",\s+null: false$}, output
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,41 @@
1
+ require 'cases/helper'
2
+
3
+ module ActiveRecord
4
+ module ConnectionAdapters
5
+ class PostgreSQLAdapter < AbstractAdapter
6
+ class InactivePgConnection
7
+ def query(*args)
8
+ raise PG::Error
9
+ end
10
+
11
+ def status
12
+ PG::CONNECTION_BAD
13
+ end
14
+ end
15
+
16
+ class StatementPoolTest < ActiveRecord::PostgreSQLTestCase
17
+ if Process.respond_to?(:fork)
18
+ def test_cache_is_per_pid
19
+ cache = StatementPool.new nil, 10
20
+ cache['foo'] = 'bar'
21
+ assert_equal 'bar', cache['foo']
22
+
23
+ pid = fork {
24
+ lookup = cache['foo'];
25
+ exit!(!lookup)
26
+ }
27
+
28
+ Process.waitpid pid
29
+ assert $?.success?, 'process should exit successfully'
30
+ end
31
+ end
32
+
33
+ def test_dealloc_does_not_raise_on_inactive_connection
34
+ cache = StatementPool.new InactivePgConnection.new, 10
35
+ cache['foo'] = 'bar'
36
+ assert_nothing_raised { cache.clear }
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,90 @@
1
+ require 'cases/helper'
2
+ require 'models/developer'
3
+ require 'models/topic'
4
+
5
+ class PostgresqlTimestampTest < ActiveRecord::PostgreSQLTestCase
6
+ class PostgresqlTimestampWithZone < ActiveRecord::Base; end
7
+
8
+ self.use_transactional_tests = false
9
+
10
+ setup do
11
+ @connection = ActiveRecord::Base.connection
12
+ @connection.execute("INSERT INTO postgresql_timestamp_with_zones (id, time) VALUES (1, '2010-01-01 10:00:00-1')")
13
+ end
14
+
15
+ teardown do
16
+ PostgresqlTimestampWithZone.delete_all
17
+ end
18
+
19
+ def test_timestamp_with_zone_values_with_rails_time_zone_support
20
+ with_timezone_config default: :utc, aware_attributes: true do
21
+ @connection.reconnect!
22
+
23
+ timestamp = PostgresqlTimestampWithZone.find(1)
24
+ assert_equal Time.utc(2010,1,1, 11,0,0), timestamp.time
25
+ assert_instance_of Time, timestamp.time
26
+ end
27
+ ensure
28
+ @connection.reconnect!
29
+ end
30
+
31
+ def test_timestamp_with_zone_values_without_rails_time_zone_support
32
+ with_timezone_config default: :local, aware_attributes: false do
33
+ @connection.reconnect!
34
+ # make sure to use a non-UTC time zone
35
+ @connection.execute("SET time zone 'America/Jamaica'", 'SCHEMA')
36
+
37
+ timestamp = PostgresqlTimestampWithZone.find(1)
38
+ assert_equal Time.utc(2010,1,1, 11,0,0), timestamp.time
39
+ assert_instance_of Time, timestamp.time
40
+ end
41
+ ensure
42
+ @connection.reconnect!
43
+ end
44
+ end
45
+
46
+ class PostgresqlTimestampFixtureTest < ActiveRecord::PostgreSQLTestCase
47
+ fixtures :topics
48
+
49
+ def test_group_by_date
50
+ keys = Topic.group("date_trunc('month', created_at)").count.keys
51
+ assert_operator keys.length, :>, 0
52
+ keys.each { |k| assert_kind_of Time, k }
53
+ end
54
+
55
+ def test_load_infinity_and_beyond
56
+ d = Developer.find_by_sql("select 'infinity'::timestamp as updated_at")
57
+ assert d.first.updated_at.infinite?, 'timestamp should be infinite'
58
+
59
+ d = Developer.find_by_sql("select '-infinity'::timestamp as updated_at")
60
+ time = d.first.updated_at
61
+ assert time.infinite?, 'timestamp should be infinite'
62
+ assert_operator time, :<, 0
63
+ end
64
+
65
+ def test_save_infinity_and_beyond
66
+ d = Developer.create!(:name => 'aaron', :updated_at => 1.0 / 0.0)
67
+ assert_equal(1.0 / 0.0, d.updated_at)
68
+
69
+ d = Developer.create!(:name => 'aaron', :updated_at => -1.0 / 0.0)
70
+ assert_equal(-1.0 / 0.0, d.updated_at)
71
+ end
72
+
73
+ def test_bc_timestamp
74
+ date = Date.new(0) - 1.week
75
+ Developer.create!(:name => "aaron", :updated_at => date)
76
+ assert_equal date, Developer.find_by_name("aaron").updated_at
77
+ end
78
+
79
+ def test_bc_timestamp_leap_year
80
+ date = Time.utc(-4, 2, 29)
81
+ Developer.create!(:name => "taihou", :updated_at => date)
82
+ assert_equal date, Developer.find_by_name("taihou").updated_at
83
+ end
84
+
85
+ def test_bc_timestamp_year_zero
86
+ date = Time.utc(0, 4, 7)
87
+ Developer.create!(:name => "yahagi", :updated_at => date)
88
+ assert_equal date, Developer.find_by_name("yahagi").updated_at
89
+ end
90
+ end
@@ -0,0 +1,33 @@
1
+ require 'cases/helper'
2
+
3
+ class PostgresqlTypeLookupTest < ActiveRecord::PostgreSQLTestCase
4
+ setup do
5
+ @connection = ActiveRecord::Base.connection
6
+ end
7
+
8
+ test "array delimiters are looked up correctly" do
9
+ box_array = @connection.type_map.lookup(1020)
10
+ int_array = @connection.type_map.lookup(1007)
11
+
12
+ assert_equal ';', box_array.delimiter
13
+ assert_equal ',', int_array.delimiter
14
+ end
15
+
16
+ test "array types correctly respect registration of subtypes" do
17
+ int_array = @connection.type_map.lookup(1007, -1, "integer[]")
18
+ bigint_array = @connection.type_map.lookup(1016, -1, "bigint[]")
19
+ big_array = [123456789123456789]
20
+
21
+ assert_raises(ActiveModel::RangeError) { int_array.serialize(big_array) }
22
+ assert_equal "{123456789123456789}", @connection.type_cast(bigint_array.serialize(big_array))
23
+ end
24
+
25
+ test "range types correctly respect registration of subtypes" do
26
+ int_range = @connection.type_map.lookup(3904, -1, "int4range")
27
+ bigint_range = @connection.type_map.lookup(3926, -1, "int8range")
28
+ big_range = 0..123456789123456789
29
+
30
+ assert_raises(ActiveModel::RangeError) { int_range.serialize(big_range) }
31
+ assert_equal "[0,123456789123456789]", bigint_range.serialize(big_range)
32
+ end
33
+ end
@@ -0,0 +1,62 @@
1
+ require 'cases/helper'
2
+ require 'active_record/connection_adapters/postgresql/utils'
3
+
4
+ class PostgreSQLUtilsTest < ActiveRecord::PostgreSQLTestCase
5
+ Name = ActiveRecord::ConnectionAdapters::PostgreSQL::Name
6
+ include ActiveRecord::ConnectionAdapters::PostgreSQL::Utils
7
+
8
+ def test_extract_schema_qualified_name
9
+ {
10
+ %(table_name) => [nil,'table_name'],
11
+ %("table.name") => [nil,'table.name'],
12
+ %(schema.table_name) => %w{schema table_name},
13
+ %("schema".table_name) => %w{schema table_name},
14
+ %(schema."table_name") => %w{schema table_name},
15
+ %("schema"."table_name") => %w{schema table_name},
16
+ %("even spaces".table) => ['even spaces','table'],
17
+ %(schema."table.name") => ['schema', 'table.name']
18
+ }.each do |given, expect|
19
+ assert_equal Name.new(*expect), extract_schema_qualified_name(given)
20
+ end
21
+ end
22
+ end
23
+
24
+ class PostgreSQLNameTest < ActiveRecord::PostgreSQLTestCase
25
+ Name = ActiveRecord::ConnectionAdapters::PostgreSQL::Name
26
+
27
+ test "represents itself as schema.name" do
28
+ obj = Name.new("public", "articles")
29
+ assert_equal "public.articles", obj.to_s
30
+ end
31
+
32
+ test "without schema, represents itself as name only" do
33
+ obj = Name.new(nil, "articles")
34
+ assert_equal "articles", obj.to_s
35
+ end
36
+
37
+ test "quoted returns a string representation usable in a query" do
38
+ assert_equal %("articles"), Name.new(nil, "articles").quoted
39
+ assert_equal %("public"."articles"), Name.new("public", "articles").quoted
40
+ end
41
+
42
+ test "prevents double quoting" do
43
+ name = Name.new('"quoted_schema"', '"quoted_table"')
44
+ assert_equal "quoted_schema.quoted_table", name.to_s
45
+ assert_equal %("quoted_schema"."quoted_table"), name.quoted
46
+ end
47
+
48
+ test "equality based on state" do
49
+ assert_equal Name.new("access", "users"), Name.new("access", "users")
50
+ assert_equal Name.new(nil, "users"), Name.new(nil, "users")
51
+ assert_not_equal Name.new(nil, "users"), Name.new("access", "users")
52
+ assert_not_equal Name.new("access", "users"), Name.new("public", "users")
53
+ assert_not_equal Name.new("public", "users"), Name.new("public", "articles")
54
+ end
55
+
56
+ test "can be used as hash key" do
57
+ hash = {Name.new("schema", "article_seq") => "success"}
58
+ assert_equal "success", hash[Name.new("schema", "article_seq")]
59
+ assert_equal nil, hash[Name.new("schema", "articles")]
60
+ assert_equal nil, hash[Name.new("public", "article_seq")]
61
+ end
62
+ end
@@ -0,0 +1,294 @@
1
+ require "cases/helper"
2
+ require 'support/schema_dumping_helper'
3
+
4
+ module PostgresqlUUIDHelper
5
+ def connection
6
+ @connection ||= ActiveRecord::Base.connection
7
+ end
8
+
9
+ def drop_table(name)
10
+ connection.drop_table name, if_exists: true
11
+ end
12
+ end
13
+
14
+ class PostgresqlUUIDTest < ActiveRecord::PostgreSQLTestCase
15
+ include PostgresqlUUIDHelper
16
+ include SchemaDumpingHelper
17
+
18
+ class UUIDType < ActiveRecord::Base
19
+ self.table_name = "uuid_data_type"
20
+ end
21
+
22
+ setup do
23
+ enable_extension!('uuid-ossp', connection)
24
+
25
+ connection.create_table "uuid_data_type" do |t|
26
+ t.uuid 'guid'
27
+ end
28
+ end
29
+
30
+ teardown do
31
+ drop_table "uuid_data_type"
32
+ end
33
+
34
+ def test_change_column_default
35
+ @connection.add_column :uuid_data_type, :thingy, :uuid, null: false, default: "uuid_generate_v1()"
36
+ UUIDType.reset_column_information
37
+ column = UUIDType.columns_hash['thingy']
38
+ assert_equal "uuid_generate_v1()", column.default_function
39
+
40
+ @connection.change_column :uuid_data_type, :thingy, :uuid, null: false, default: "uuid_generate_v4()"
41
+
42
+ UUIDType.reset_column_information
43
+ column = UUIDType.columns_hash['thingy']
44
+ assert_equal "uuid_generate_v4()", column.default_function
45
+ ensure
46
+ UUIDType.reset_column_information
47
+ end
48
+
49
+ def test_data_type_of_uuid_types
50
+ column = UUIDType.columns_hash["guid"]
51
+ assert_equal :uuid, column.type
52
+ assert_equal "uuid", column.sql_type
53
+ assert_not column.array?
54
+
55
+ type = UUIDType.type_for_attribute("guid")
56
+ assert_not type.binary?
57
+ end
58
+
59
+ def test_treat_blank_uuid_as_nil
60
+ UUIDType.create! guid: ''
61
+ assert_equal(nil, UUIDType.last.guid)
62
+ end
63
+
64
+ def test_treat_invalid_uuid_as_nil
65
+ uuid = UUIDType.create! guid: 'foobar'
66
+ assert_equal(nil, uuid.guid)
67
+ end
68
+
69
+ def test_invalid_uuid_dont_modify_before_type_cast
70
+ uuid = UUIDType.new guid: 'foobar'
71
+ assert_equal 'foobar', uuid.guid_before_type_cast
72
+ end
73
+
74
+ def test_acceptable_uuid_regex
75
+ # Valid uuids
76
+ ['A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11',
77
+ '{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}',
78
+ 'a0eebc999c0b4ef8bb6d6bb9bd380a11',
79
+ 'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11',
80
+ '{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}',
81
+ # The following is not a valid RFC 4122 UUID, but PG doesn't seem to care,
82
+ # so we shouldn't block it either. (Pay attention to "fb6d" – the "f" here
83
+ # is invalid – it must be one of 8, 9, A, B, a, b according to the spec.)
84
+ '{a0eebc99-9c0b-4ef8-fb6d-6bb9bd380a11}',
85
+ ].each do |valid_uuid|
86
+ uuid = UUIDType.new guid: valid_uuid
87
+ assert_not_nil uuid.guid
88
+ end
89
+
90
+ # Invalid uuids
91
+ [['A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11'],
92
+ Hash.new,
93
+ 0,
94
+ 0.0,
95
+ true,
96
+ 'Z0000C99-9C0B-4EF8-BB6D-6BB9BD380A11',
97
+ 'a0eebc999r0b4ef8ab6d6bb9bd380a11',
98
+ 'a0ee-bc99------4ef8-bb6d-6bb9-bd38-0a11',
99
+ '{a0eebc99-bb6d6bb9-bd380a11}'].each do |invalid_uuid|
100
+ uuid = UUIDType.new guid: invalid_uuid
101
+ assert_nil uuid.guid
102
+ end
103
+ end
104
+
105
+ def test_uuid_formats
106
+ ["A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11",
107
+ "{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}",
108
+ "a0eebc999c0b4ef8bb6d6bb9bd380a11",
109
+ "a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11",
110
+ "{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}"].each do |valid_uuid|
111
+ UUIDType.create(guid: valid_uuid)
112
+ uuid = UUIDType.last
113
+ assert_equal "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11", uuid.guid
114
+ end
115
+ end
116
+
117
+ def test_schema_dump_with_shorthand
118
+ output = dump_table_schema "uuid_data_type"
119
+ assert_match %r{t\.uuid "guid"}, output
120
+ end
121
+
122
+ def test_uniqueness_validation_ignores_uuid
123
+ klass = Class.new(ActiveRecord::Base) do
124
+ self.table_name = "uuid_data_type"
125
+ validates :guid, uniqueness: { case_sensitive: false }
126
+
127
+ def self.name
128
+ "UUIDType"
129
+ end
130
+ end
131
+
132
+ record = klass.create!(guid: "a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11")
133
+ duplicate = klass.new(guid: record.guid)
134
+
135
+ assert record.guid.present? # Ensure we actually are testing a UUID
136
+ assert_not duplicate.valid?
137
+ end
138
+ end
139
+
140
+ class PostgresqlUUIDGenerationTest < ActiveRecord::PostgreSQLTestCase
141
+ include PostgresqlUUIDHelper
142
+ include SchemaDumpingHelper
143
+
144
+ class UUID < ActiveRecord::Base
145
+ self.table_name = 'pg_uuids'
146
+ end
147
+
148
+ setup do
149
+ connection.create_table('pg_uuids', id: :uuid, default: 'uuid_generate_v1()') do |t|
150
+ t.string 'name'
151
+ t.uuid 'other_uuid', default: 'uuid_generate_v4()'
152
+ end
153
+
154
+ # Create custom PostgreSQL function to generate UUIDs
155
+ # to test dumping tables which columns have defaults with custom functions
156
+ connection.execute <<-SQL
157
+ CREATE OR REPLACE FUNCTION my_uuid_generator() RETURNS uuid
158
+ AS $$ SELECT * FROM uuid_generate_v4() $$
159
+ LANGUAGE SQL VOLATILE;
160
+ SQL
161
+
162
+ # Create such a table with custom function as default value generator
163
+ connection.create_table('pg_uuids_2', id: :uuid, default: 'my_uuid_generator()') do |t|
164
+ t.string 'name'
165
+ t.uuid 'other_uuid_2', default: 'my_uuid_generator()'
166
+ end
167
+ end
168
+
169
+ teardown do
170
+ drop_table "pg_uuids"
171
+ drop_table 'pg_uuids_2'
172
+ connection.execute 'DROP FUNCTION IF EXISTS my_uuid_generator();'
173
+ end
174
+
175
+ if ActiveRecord::Base.connection.supports_extensions?
176
+ def test_id_is_uuid
177
+ assert_equal :uuid, UUID.columns_hash['id'].type
178
+ assert UUID.primary_key
179
+ end
180
+
181
+ def test_id_has_a_default
182
+ u = UUID.create
183
+ assert_not_nil u.id
184
+ end
185
+
186
+ def test_auto_create_uuid
187
+ u = UUID.create
188
+ u.reload
189
+ assert_not_nil u.other_uuid
190
+ end
191
+
192
+ def test_pk_and_sequence_for_uuid_primary_key
193
+ pk, seq = connection.pk_and_sequence_for('pg_uuids')
194
+ assert_equal 'id', pk
195
+ assert_equal nil, seq
196
+ end
197
+
198
+ def test_schema_dumper_for_uuid_primary_key
199
+ schema = dump_table_schema "pg_uuids"
200
+ assert_match(/\bcreate_table "pg_uuids", id: :uuid, default: -> { "uuid_generate_v1\(\)" }/, schema)
201
+ assert_match(/t\.uuid "other_uuid", default: -> { "uuid_generate_v4\(\)" }/, schema)
202
+ end
203
+
204
+ def test_schema_dumper_for_uuid_primary_key_with_custom_default
205
+ schema = dump_table_schema "pg_uuids_2"
206
+ assert_match(/\bcreate_table "pg_uuids_2", id: :uuid, default: -> { "my_uuid_generator\(\)" }/, schema)
207
+ assert_match(/t\.uuid "other_uuid_2", default: -> { "my_uuid_generator\(\)" }/, schema)
208
+ end
209
+ end
210
+ end
211
+
212
+ class PostgresqlUUIDTestNilDefault < ActiveRecord::PostgreSQLTestCase
213
+ include PostgresqlUUIDHelper
214
+ include SchemaDumpingHelper
215
+
216
+ setup do
217
+ connection.create_table('pg_uuids', id: false) do |t|
218
+ t.primary_key :id, :uuid, default: nil
219
+ t.string 'name'
220
+ end
221
+ end
222
+
223
+ teardown do
224
+ drop_table "pg_uuids"
225
+ end
226
+
227
+ if ActiveRecord::Base.connection.supports_extensions?
228
+ def test_id_allows_default_override_via_nil
229
+ col_desc = connection.execute("SELECT pg_get_expr(d.adbin, d.adrelid) as default
230
+ FROM pg_attribute a
231
+ LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
232
+ WHERE a.attname='id' AND a.attrelid = 'pg_uuids'::regclass").first
233
+ assert_nil col_desc["default"]
234
+ end
235
+
236
+ def test_schema_dumper_for_uuid_primary_key_with_default_override_via_nil
237
+ schema = dump_table_schema "pg_uuids"
238
+ assert_match(/\bcreate_table "pg_uuids", id: :uuid, default: nil/, schema)
239
+ end
240
+ end
241
+ end
242
+
243
+ class PostgresqlUUIDTestInverseOf < ActiveRecord::PostgreSQLTestCase
244
+ include PostgresqlUUIDHelper
245
+
246
+ class UuidPost < ActiveRecord::Base
247
+ self.table_name = 'pg_uuid_posts'
248
+ has_many :uuid_comments, inverse_of: :uuid_post
249
+ end
250
+
251
+ class UuidComment < ActiveRecord::Base
252
+ self.table_name = 'pg_uuid_comments'
253
+ belongs_to :uuid_post
254
+ end
255
+
256
+ setup do
257
+ connection.transaction do
258
+ connection.create_table('pg_uuid_posts', id: :uuid) do |t|
259
+ t.string 'title'
260
+ end
261
+ connection.create_table('pg_uuid_comments', id: :uuid) do |t|
262
+ t.references :uuid_post, type: :uuid
263
+ t.string 'content'
264
+ end
265
+ end
266
+ end
267
+
268
+ teardown do
269
+ drop_table "pg_uuid_comments"
270
+ drop_table "pg_uuid_posts"
271
+ end
272
+
273
+ if ActiveRecord::Base.connection.supports_extensions?
274
+ def test_collection_association_with_uuid
275
+ post = UuidPost.create!
276
+ comment = post.uuid_comments.create!
277
+ assert post.uuid_comments.find(comment.id)
278
+ end
279
+
280
+ def test_find_with_uuid
281
+ UuidPost.create!
282
+ assert_raise ActiveRecord::RecordNotFound do
283
+ UuidPost.find(123456)
284
+ end
285
+
286
+ end
287
+
288
+ def test_find_by_with_uuid
289
+ UuidPost.create!
290
+ assert_nil UuidPost.find_by(id: 789)
291
+ end
292
+ end
293
+
294
+ end