#include "Pgsql_oids.h" #include #include #include namespace { /* SELECT 'constexpr Oid ' || t1.typname || '_oid = ' || t1.oid::varchar || ';', 'constexpr Oid ' || t1.typname || '_array_oid = ' || t2.oid::text || ';', ' { ' || t1.oid::text || ', ' || t2.oid::text || ' },' FROM pg_type t1 JOIN pg_type t2 ON (t1.typarray=t2.oid) WHERE t1.typtype IN ('b', 'e', 'r') AND t1.typcategory <> 'A' ORDER BY t1.oid */ struct ElemArray { Oid elem; Oid array; }; std::vector g_ElemToArray = { { 16, 1000 }, { 17, 1001 }, { 18, 1002 }, { 19, 1003 }, { 20, 1016 }, { 21, 1005 }, { 23, 1007 }, { 24, 1008 }, { 25, 1009 }, { 26, 1028 }, { 27, 1010 }, { 28, 1011 }, { 29, 1012 }, { 114, 199 }, { 142, 143 }, { 600, 1017 }, { 601, 1018 }, { 602, 1019 }, { 603, 1020 }, { 604, 1027 }, { 628, 629 }, { 650, 651 }, { 700, 1021 }, { 701, 1022 }, { 702, 1023 }, { 703, 1024 }, { 704, 1025 }, { 718, 719 }, { 790, 791 }, { 829, 1040 }, { 869, 1041 }, { 1033, 1034 }, { 1042, 1014 }, { 1043, 1015 }, { 1082, 1182 }, { 1083, 1183 }, { 1114, 1115 }, { 1184, 1185 }, { 1186, 1187 }, { 1266, 1270 }, { 1560, 1561 }, { 1562, 1563 }, { 1700, 1231 }, { 1790, 2201 }, { 2202, 2207 }, { 2203, 2208 }, { 2204, 2209 }, { 2205, 2210 }, { 2206, 2211 }, { 2950, 2951 }, { 2970, 2949 }, { 3220, 3221 }, { 3614, 3643 }, { 3615, 3645 }, { 3642, 3644 }, { 3734, 3735 }, { 3769, 3770 }, { 3802, 3807 }, { 3904, 3905 }, { 3906, 3907 }, { 3908, 3909 }, { 3910, 3911 }, { 3912, 3913 }, { 3926, 3927 }, { 4089, 4090 }, { 4096, 4097 } }; std::vector g_ArrayToElem = { { 142, 143 }, { 114, 199 }, { 628, 629 }, { 650, 651 }, { 718, 719 }, { 790, 791 }, { 16, 1000 }, { 17, 1001 }, { 18, 1002 }, { 19, 1003 }, { 21, 1005 }, { 23, 1007 }, { 24, 1008 }, { 25, 1009 }, { 27, 1010 }, { 28, 1011 }, { 29, 1012 }, { 1042, 1014 }, { 1043, 1015 }, { 20, 1016 }, { 600, 1017 }, { 601, 1018 }, { 602, 1019 }, { 603, 1020 }, { 700, 1021 }, { 701, 1022 }, { 702, 1023 }, { 703, 1024 }, { 704, 1025 }, { 604, 1027 }, { 26, 1028 }, { 1033, 1034 }, { 829, 1040 }, { 869, 1041 }, { 1114, 1115 }, { 1082, 1182 }, { 1083, 1183 }, { 1184, 1185 }, { 1186, 1187 }, { 1700, 1231 }, { 1266, 1270 }, { 1560, 1561 }, { 1562, 1563 }, { 1790, 2201 }, { 2202, 2207 }, { 2203, 2208 }, { 2204, 2209 }, { 2205, 2210 }, { 2206, 2211 }, { 2970, 2949 }, { 2950, 2951 }, { 3220, 3221 }, { 3614, 3643 }, { 3642, 3644 }, { 3615, 3645 }, { 3734, 3735 }, { 3769, 3770 }, { 3802, 3807 }, { 3904, 3905 }, { 3906, 3907 }, { 3908, 3909 }, { 3910, 3911 }, { 3912, 3913 }, { 3926, 3927 }, { 4089, 4090 }, { 4096, 4097 } }; } Oid Pgsql::ElemOidFromArrayOid(Oid oid) noexcept { auto iter = std::lower_bound(g_ArrayToElem.begin(), g_ArrayToElem.end(), ElemArray{oid, oid}, [] (auto l, auto r) -> bool { return l.array < r.array; }); if (iter == g_ArrayToElem.end()) return InvalidOid; return iter->elem; } Oid Pgsql::ArrayOidFromElemOid(Oid oid) noexcept { auto iter = std::lower_bound(g_ElemToArray.begin(), g_ElemToArray.end(), ElemArray{oid, oid}, [] (auto l, auto r) -> bool { return l.elem < r.elem; }); if (iter == g_ElemToArray.end()) return InvalidOid; return iter->array; }