diff options
author | monster <monster@ydb.tech> | 2022-12-14 17:52:19 +0300 |
---|---|---|
committer | monster <monster@ydb.tech> | 2022-12-14 17:52:19 +0300 |
commit | 09f3375e360fbe97794e53c803af3f34e98994fb (patch) | |
tree | d48e7a53bf6d9b79788ecb7571b8da165f4c2ddb | |
parent | 58e33e587065c6bac9600a43369d97363ed84184 (diff) | |
download | ydb-09f3375e360fbe97794e53c803af3f34e98994fb.tar.gz |
use native big-endian storage for simple types; more tests
-rw-r--r-- | ydb/core/kqp/ut/pg/kqp_pg_ut.cpp | 129 | ||||
-rw-r--r-- | ydb/library/yql/parser/pg_wrapper/comp_factory.cpp | 63 |
2 files changed, 75 insertions, 117 deletions
diff --git a/ydb/core/kqp/ut/pg/kqp_pg_ut.cpp b/ydb/core/kqp/ut/pg/kqp_pg_ut.cpp index ef4192ffe1..67edc49d04 100644 --- a/ydb/core/kqp/ut/pg/kqp_pg_ut.cpp +++ b/ydb/core/kqp/ut/pg/kqp_pg_ut.cpp @@ -21,7 +21,7 @@ Y_UNIT_TEST_SUITE(KqpPg) { TKikimrRunner kikimr; auto testSingleType = [&kikimr] (ui32 id, bool isKey, - std::function<TString(size_t)> binaryIn, + std::function<TString(size_t)> textIn, std::function<TString(size_t)> textOut) { auto db = kikimr.GetTableClient(); @@ -43,7 +43,7 @@ Y_UNIT_TEST_SUITE(KqpPg) { NYdb::TValueBuilder rows; rows.BeginList(); for (size_t i = 0; i < 10; ++i) { - auto str = binaryIn(i); + auto str = NPg::PgNativeBinaryFromNativeText(textIn(i), id); if (isKey) { rows.AddListItem() .BeginStruct() @@ -102,214 +102,217 @@ Y_UNIT_TEST_SUITE(KqpPg) { }; auto testType = [&] (ui32 id, bool isKey, - std::function<TString(size_t)> binaryIn, + std::function<TString(size_t)> textIn, std::function<TString(size_t)> textOut, std::function<TString(TString)> arrayPrint = [] (auto s) { return Sprintf("{%s,%s}", s.c_str(), s.c_str()); }) { - testSingleType(id, isKey, binaryIn, textOut); + testSingleType(id, isKey, textIn, textOut); auto arrayId = NYql::NPg::LookupType(id).ArrayTypeId; - auto binaryInArray = [&] (auto i) { - auto binary = binaryIn(i); - auto str = NPg::PgNativeTextFromNativeBinary(binary, id); - auto arrayStr = arrayPrint(str); - return NPg::PgNativeBinaryFromNativeText(arrayStr, arrayId); + auto textInArray = [&] (auto i) { + auto str = textIn(i); + return arrayPrint(str); }; + auto textOutArray = [&] (auto i) { auto str = textOut(i); return arrayPrint(str); }; - testSingleType(arrayId, false, binaryInArray, textOutArray); + testSingleType(arrayId, false, textInArray, textOutArray); }; auto testByteaType = [&] () { testSingleType(BYTEAOID, true, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("bytea %u", i), BYTEAOID); }, + [] (auto i) { return Sprintf("bytea %u", i); }, [] (auto i) { return Sprintf("\\x627974656120%x", i + 48); }); testSingleType(BYTEAARRAYOID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("{a%u, b%u}", i, i + 10), BYTEAARRAYOID); }, + [] (auto i) { return Sprintf("{a%u, b%u}", i, i + 10); }, [] (auto i) { return Sprintf("{\"\\\\x61%x\",\"\\\\x6231%x\"}", i + 48, i + 48); }); }; testType(BOOLOID, true, - [] (auto i) { auto val = (bool)i; return TString((const char*)&val, sizeof(val)); }, + [] (auto i) { return TString(i ? "true" : "false"); }, [] (auto i) { return TString(i ? "t" : "f"); }); testType(CHAROID, true, - [] (auto i) { auto val = (char)(i + '0'); return TString((const char*)&val, sizeof(val)); }, + [] (auto i) { return Sprintf("%c", (char)(i + '0')); }, [] (auto i) { return Sprintf("%c", (char)(i + '0')); }); testType(INT2OID, true, - [] (auto i) { auto val = (i16)i; return TString((const char*)&val, sizeof(val)); }, + [] (auto i) { return Sprintf("%u", i); }, [] (auto i) { return Sprintf("%u", i); }); testType(INT4OID, true, - [] (auto i) { auto val = (i32)i; return TString((const char*)&val, sizeof(val)); }, + [] (auto i) { return Sprintf("%u", i); }, [] (auto i) { return Sprintf("%u", i); }); testType(INT8OID, true, - [] (auto i) { auto val = (i64)i; return TString((const char*)&val, sizeof(val)); }, + [] (auto i) { return Sprintf("%u", i); }, [] (auto i) { return Sprintf("%u", i); }); testType(FLOAT4OID, true, - [] (auto i) { auto val = (float)i; return TString((const char*)&val, sizeof(val)); }, - [] (auto i) { return Sprintf("%g", (float)i); }); + [] (auto i) { return Sprintf("%g", i + 0.5f); }, + [] (auto i) { return Sprintf("%g", i + 0.5f); }); testType(FLOAT8OID, true, - [] (auto i) { auto val = (double)i; return TString((const char*)&val, sizeof(val)); }, - [] (auto i) { return Sprintf("%lg", (double)i); }); + [] (auto i) { return Sprintf("%lg", i + 0.5); }, + [] (auto i) { return Sprintf("%lg", i + 0.5); }); testByteaType(); testType(TEXTOID, true, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("text %u", i), TEXTOID); }, + [] (auto i) { return Sprintf("text %u", i); }, [] (auto i) { return Sprintf("text %u", i); }, [] (auto s) { return Sprintf("{\"%s\",\"%s\"}", s.c_str(), s.c_str()); }); testType(BPCHAROID, true, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("bpchar %u", i), BPCHAROID); }, + [] (auto i) { return Sprintf("bpchar %u", i); }, [] (auto i) { return Sprintf("bpchar %u", i); }, [] (auto s) { return Sprintf("{\"%s\",\"%s\"}", s.c_str(), s.c_str()); }); testType(VARCHAROID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("varchar %u", i), VARCHAROID); }, + [] (auto i) { return Sprintf("varchar %u", i); }, [] (auto i) { return Sprintf("varchar %u", i); }, [] (auto s) { return Sprintf("{\"%s\",\"%s\"}", s.c_str(), s.c_str()); }); testType(NAMEOID, true, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("name %u", i), NAMEOID); }, + [] (auto i) { return Sprintf("name %u", i); }, [] (auto i) { return Sprintf("name %u", i); }, [] (auto s) { return Sprintf("{\"%s\",\"%s\"}", s.c_str(), s.c_str()); }); testType(NUMERICOID, true, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("%lg", i + 0.12345), NUMERICOID); }, + [] (auto i) { return Sprintf("%lg", i + 0.12345); }, [] (auto i) { return Sprintf("%lg", i + 0.12345); }); -// testType(DATEOID, true, -// [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("1970-01-%02u", i + 1), DATEOID); }, -// [] (auto i) { return Sprintf("1970-01-%02u", i + 1); }); + testType(MONEYOID, true, + [] (auto i) { return Sprintf("%lg", i + i / 100.); }, + [] (auto i) { return Sprintf("$%.2lf", i + i / 100.); }); + + testType(DATEOID, true, + [] (auto i) { return Sprintf("1970-01-%02u", i + 1); }, + [] (auto i) { return Sprintf("1970-01-%02u", i + 1); }); -// testType(TIMEOID, true, -// [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("%02u:01:02.345", i), TIMEOID); }, -// [] (auto i) { return ""; }); + testType(TIMEOID, true, + [] (auto i) { return Sprintf("%02u:01:02.345", i); }, + [] (auto i) { return Sprintf("%02u:01:02.345", i); }); -// testType(TIMESTAMPOID, true, -// [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("1970-01-01 %02u:01:02.345", i), TIMESTAMPOID); }, -// [] (auto i) { return ""; }); + testType(TIMESTAMPOID, true, + [] (auto i) { return Sprintf("1970-01-01 %02u:01:02.345", i); }, + [] (auto i) { return Sprintf("1970-01-01 %02u:01:02.345", i); }, + [] (auto s) { return Sprintf("{\"%s\",\"%s\"}", s.c_str(), s.c_str()); }); testType(TIMETZOID, true, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("%02u:01:02.345-03", i), TIMETZOID); }, + [] (auto i) { return Sprintf("%02u:01:02.345-03", i); }, [] (auto i) { return Sprintf("%02u:01:02.345-03", i); }); -// testType(TIMESTAMPTZOID, true, -// [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("1970-01-01 %02u:01:02.345 -3:00", i), TIMESTAMPTZOID); }, -// [] (auto i) { return ""; }); + testType(TIMESTAMPTZOID, true, + [] (auto i) { return Sprintf("1970-01-01 %02u:01:02.345 -3:00", i); }, + [] (auto i) { return Sprintf("1970-01-01 %02u:01:02.345+00", i + 3); }, // TODO: investigate + [] (auto s) { return Sprintf("{\"%s\",\"%s\"}", s.c_str(), s.c_str()); }); testType(INTERVALOID, true, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("P01-02-03T04:05:%02u", i), INTERVALOID); }, + [] (auto i) { return Sprintf("P01-02-03T04:05:%02u", i); }, [] (auto i) { return Sprintf("1 year 2 mons 3 days 04:05:%02u", i); }, [] (auto s) { return Sprintf("{\"%s\",\"%s\"}", s.c_str(), s.c_str()); }); testType(BITOID, true, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("%c%c%c%c", (i&8)?'1':'0', (i&4)?'1':'0', (i&2)?'1':'0', (i&1)?'1':'0'), BITOID); }, + [] (auto i) { return Sprintf("%c%c%c%c", (i&8)?'1':'0', (i&4)?'1':'0', (i&2)?'1':'0', (i&1)?'1':'0'); }, [] (auto i) { return Sprintf("%c%c%c%c", (i&8)?'1':'0', (i&4)?'1':'0', (i&2)?'1':'0', (i&1)?'1':'0'); }); testType(VARBITOID, true, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("%c%c%c%c", (i&8)?'1':'0', (i&4)?'1':'0', (i&2)?'1':'0', (i&1)?'1':'0'), VARBITOID); }, + [] (auto i) { return Sprintf("%c%c%c%c", (i&8)?'1':'0', (i&4)?'1':'0', (i&2)?'1':'0', (i&1)?'1':'0'); }, [] (auto i) { return Sprintf("%c%c%c%c", (i&8)?'1':'0', (i&4)?'1':'0', (i&2)?'1':'0', (i&1)?'1':'0'); }); testType(POINTOID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("(10, %u)", i), POINTOID); }, + [] (auto i) { return Sprintf("(10, %u)", i); }, [] (auto i) { return Sprintf("(10,%u)", i); }, [] (auto s) { return Sprintf("{\"%s\",\"%s\"}", s.c_str(), s.c_str()); }); testType(LINEOID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("{1, 2, %u}", i), LINEOID); }, + [] (auto i) { return Sprintf("{1, 2, %u}", i); }, [] (auto i) { return Sprintf("{1,2,%u}", i); }, [] (auto s) { return Sprintf("{\"%s\",\"%s\"}", s.c_str(), s.c_str()); }); testType(LSEGOID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("[(0, 0), (1, %u)]", i), LSEGOID); }, + [] (auto i) { return Sprintf("[(0, 0), (1, %u)]", i); }, [] (auto i) { return Sprintf("[(0,0),(1,%u)]", i); }, [] (auto s) { return Sprintf("{\"%s\",\"%s\"}", s.c_str(), s.c_str()); }); testType(BOXOID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("(1, %u), (0, 0)", i + 1), BOXOID); }, + [] (auto i) { return Sprintf("(1, %u), (0, 0)", i + 1); }, [] (auto i) { return Sprintf("(1,%u),(0,0)", i + 1); }, [] (auto s) { return Sprintf("{%s;%s}", s.c_str(), s.c_str()); }); testType(PATHOID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("((0, 1), (2, 3), (4, %u))", i), PATHOID); }, + [] (auto i) { return Sprintf("((0, 1), (2, 3), (4, %u))", i); }, [] (auto i) { return Sprintf("((0,1),(2,3),(4,%u))", i); }, [] (auto s) { return Sprintf("{\"%s\",\"%s\"}", s.c_str(), s.c_str()); }); testType(POLYGONOID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("((0, 1), (2, 3), (4, %u))", i), POLYGONOID); }, + [] (auto i) { return Sprintf("((0, 1), (2, 3), (4, %u))", i); }, [] (auto i) { return Sprintf("((0,1),(2,3),(4,%u))", i); }, [] (auto s) { return Sprintf("{\"%s\",\"%s\"}", s.c_str(), s.c_str()); }); testType(CIRCLEOID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("<(0, 1), %u>", i), CIRCLEOID); }, + [] (auto i) { return Sprintf("<(0, 1), %u>", i); }, [] (auto i) { return Sprintf("<(0,1),%u>", i); }, [] (auto s) { return Sprintf("{\"%s\",\"%s\"}", s.c_str(), s.c_str()); }); testType(INETOID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("128.%u.0.0/16", i), INETOID); }, + [] (auto i) { return Sprintf("128.%u.0.0/16", i); }, [] (auto i) { return Sprintf("128.%u.0.0/16", i); }); testType(CIDROID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("128.%u.0.0/16", i), CIDROID); }, + [] (auto i) { return Sprintf("128.%u.0.0/16", i); }, [] (auto i) { return Sprintf("128.%u.0.0/16", i); }); testType(MACADDROID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("08:00:2b:01:02:%02u", i), MACADDROID); }, + [] (auto i) { return Sprintf("08:00:2b:01:02:%02u", i); }, [] (auto i) { return Sprintf("08:00:2b:01:02:%02u", i); }); testType(MACADDR8OID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("08:00:2b:01:02:03:04:%02u", i), MACADDR8OID); }, + [] (auto i) { return Sprintf("08:00:2b:01:02:03:04:%02u", i); }, [] (auto i) { return Sprintf("08:00:2b:01:02:03:04:%02u", i); }); testType(UUIDOID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("00000000-0000-0000-0000-0000000000%02u", i), UUIDOID); }, + [] (auto i) { return Sprintf("00000000-0000-0000-0000-0000000000%02u", i); }, [] (auto i) { return Sprintf("00000000-0000-0000-0000-0000000000%02u", i); }); testType(JSONOID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("[%u]", i), JSONOID); }, + [] (auto i) { return Sprintf("[%u]", i); }, [] (auto i) { return Sprintf("[%u]", i); }); testType(JSONBOID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("[%u]", i), JSONBOID); }, + [] (auto i) { return Sprintf("[%u]", i); }, [] (auto i) { return Sprintf("[%u]", i); }); testType(JSONPATHOID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("$[%u]", i), JSONPATHOID); }, + [] (auto i) { return Sprintf("$[%u]", i); }, [] (auto i) { return Sprintf("$[%u]", i); }); testType(XMLOID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("<a>%u</a>", i), XMLOID); }, + [] (auto i) { return Sprintf("<a>%u</a>", i); }, [] (auto i) { return Sprintf("<a>%u</a>", i); }); testType(TSQUERYOID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("a&b%u", i), TSQUERYOID); }, + [] (auto i) { return Sprintf("a&b%u", i); }, [] (auto i) { return Sprintf("'a' & 'b%u'", i); }, [] (auto s) { return Sprintf("{\"%s\",\"%s\"}", s.c_str(), s.c_str()); }); testType(TSVECTOROID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("a:1 b:%u", i + 2), TSVECTOROID); }, + [] (auto i) { return Sprintf("a:1 b:%u", i + 2); }, [] (auto i) { return Sprintf("'a':1 'b':%u", i + 2); }, [] (auto s) { return Sprintf("{\"%s\",\"%s\"}", s.c_str(), s.c_str()); }); testType(INT2VECTOROID, false, - [] (auto i) { return NPg::PgNativeBinaryFromNativeText(Sprintf("%u %u %u", i, i + 1, i + 2), INT2VECTOROID); }, + [] (auto i) { return Sprintf("%u %u %u", i, i + 1, i + 2); }, [] (auto i) { return Sprintf("%u %u %u", i, i + 1, i + 2); }, [] (auto s) { return Sprintf("{\"%s\",\"%s\"}", s.c_str(), s.c_str()); }); // TODO: varchar as a key - // TODO: date/time types (?) - // TODO: money (uses PGLC_localeconv()) // TODO: native range/multirange types (use get_range_io_data()) } diff --git a/ydb/library/yql/parser/pg_wrapper/comp_factory.cpp b/ydb/library/yql/parser/pg_wrapper/comp_factory.cpp index 741eecedcb..f97fe581e6 100644 --- a/ydb/library/yql/parser/pg_wrapper/comp_factory.cpp +++ b/ydb/library/yql/parser/pg_wrapper/comp_factory.cpp @@ -2978,13 +2978,8 @@ public: }; PG_TRY(); { - if (PassByValue) { - datumL = ScalarDatumFromData(dataL, sizeL); - datumR = ScalarDatumFromData(dataR, sizeR); - } else { - datumL = PointerDatumFromData(dataL, sizeL); - datumR = PointerDatumFromData(dataR, sizeR); - } + datumL = Receive(dataL, sizeL); + datumR = Receive(dataR, sizeR); FmgrInfo finfo; InitFunc(CompareProcId, &finfo, 2, 2); LOCAL_FCINFO(callInfo, 2); @@ -3003,7 +2998,7 @@ public: PG_CATCH(); { // TODO - Y_VERIFY(false, "PG error in Compare"); + Y_FAIL("PG error in Compare"); } PG_END_TRY(); return 0; @@ -3020,11 +3015,7 @@ public: }; PG_TRY(); { - if (PassByValue) { - datum = ScalarDatumFromData(data, size); - } else { - datum = PointerDatumFromData(data, size); - } + datum = Receive(data, size); FmgrInfo finfo; InitFunc(HashProcId, &finfo, 1, 1); LOCAL_FCINFO(callInfo, 1); @@ -3042,7 +3033,7 @@ public: PG_CATCH(); { // TODO - Y_VERIFY(false, "PG error in Hash"); + Y_FAIL("PG error in Hash"); } PG_END_TRY(); return 0; @@ -3096,7 +3087,7 @@ public: PG_CATCH(); { // TODO - Y_VERIFY(false, "PG error in NativeBinaryFromNativeText"); + Y_FAIL("PG error in NativeBinaryFromNativeText"); } PG_END_TRY(); return 0; @@ -3117,11 +3108,7 @@ public: }; PG_TRY(); { - if (PassByValue) { - datum = ScalarDatumFromData(binary.Data(), binary.Size()); - } else { - datum = PointerDatumFromData(binary.Data(), binary.Size()); - } + datum = Receive(binary.Data(), binary.Size()); FmgrInfo finfo; InitFunc(OutFuncId, &finfo, 1, 1); LOCAL_FCINFO(callInfo, 1); @@ -3139,46 +3126,14 @@ public: PG_CATCH(); { // TODO - Y_VERIFY(false, "PG error in NativeTextFromNativeBinary"); + Y_FAIL("PG error in NativeTextFromNativeBinary"); } PG_END_TRY(); return 0; } private: - Datum ScalarDatumFromData(const char* data, size_t size) const { - switch (TypeId) { - case BOOLOID: - Y_ENSURE(size == sizeof(bool)); - return BoolGetDatum(ReadUnaligned<bool>(data)); - case CHAROID: - Y_ENSURE(size == sizeof(char)); - return CharGetDatum(ReadUnaligned<char>(data)); - case INT2OID: - Y_ENSURE(size == sizeof(i16)); - return Int16GetDatum(ReadUnaligned<i16>(data)); - case INT4OID: - Y_ENSURE(size == sizeof(i32)); - return Int32GetDatum(ReadUnaligned<i32>(data)); - case INT8OID: - Y_ENSURE(size == sizeof(i64)); - return Int64GetDatum(ReadUnaligned<i64>(data)); - case FLOAT4OID: - Y_ENSURE(size == sizeof(float)); - return Float4GetDatum(ReadUnaligned<float>(data)); - case FLOAT8OID: - Y_ENSURE(size == sizeof(double)); - return Float8GetDatum(ReadUnaligned<double>(data)); - default: { - Y_ENSURE(size <= sizeof(ui64)); - ui64 val = 0; - std::memcpy(&val, data, size); - return (Datum)val; - } - } - } - - Datum PointerDatumFromData(const char* data, size_t size) const { + Datum Receive(const char* data, size_t size) const { StringInfoData stringInfo; stringInfo.data = (char*)data; stringInfo.len = size; |