aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormonster <monster@ydb.tech>2022-12-14 17:52:19 +0300
committermonster <monster@ydb.tech>2022-12-14 17:52:19 +0300
commit09f3375e360fbe97794e53c803af3f34e98994fb (patch)
treed48e7a53bf6d9b79788ecb7571b8da165f4c2ddb
parent58e33e587065c6bac9600a43369d97363ed84184 (diff)
downloadydb-09f3375e360fbe97794e53c803af3f34e98994fb.tar.gz
use native big-endian storage for simple types; more tests
-rw-r--r--ydb/core/kqp/ut/pg/kqp_pg_ut.cpp129
-rw-r--r--ydb/library/yql/parser/pg_wrapper/comp_factory.cpp63
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;