Просмотр исходного кода

remove PG_TRY from TPgTypeDescriptor. Resolves #7287 (#7723)

qrort 7 месяцев назад
Родитель
Сommit
b7a4f9528a

+ 16 - 0
ydb/core/kqp/ut/pg/pg_catalog_ut.cpp

@@ -497,6 +497,22 @@ Y_UNIT_TEST_SUITE(PgCatalog) {
                 ["pg_proc"]
             ])", FormatResultSetYson(result.GetResultSet(0)));
         }
+        { //https://github.com/ydb-platform/ydb/issues/7287
+            auto result = db.ExecuteQuery(R"(
+                drop table table1;
+            )", NYdb::NQuery::TTxControl::NoTx(), settings).ExtractValueSync();
+            UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
+            result = db.ExecuteQuery(R"(
+                create table table1(id serial primary key);
+            )", NYdb::NQuery::TTxControl::NoTx(), settings).ExtractValueSync();
+            UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
+
+            result = db.ExecuteQuery(R"(
+                select tablename from pg_tables where hasindexes='pg_proc';
+            )", NYdb::NQuery::TTxControl::BeginTx().CommitTx(), settings).ExtractValueSync();
+            UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::PRECONDITION_FAILED, result.GetIssues().ToString());
+            UNIT_ASSERT(result.GetIssues().ToString().Contains("invalid input syntax for type boolean: \"pg_proc\""));
+        }
     }
 }
 

+ 1 - 0
ydb/core/sys_view/pg_tables/pg_tables.cpp

@@ -19,6 +19,7 @@ namespace NSysView {
 using namespace NActors;
 
 TStringBuf TPgTablesScanBase::GetColumnName(NTable::TTag tag) const {
+    Y_ENSURE(tag > 0 && tag <= SchemaColumns_.size());
     return SchemaColumns_.at(tag - 1)._ColumnName;
 }
 

+ 10 - 0
ydb/library/yql/minikql/mkql_terminator.cpp

@@ -32,6 +32,16 @@ void TThrowingBindTerminator::Terminate(const char* message) const {
     ythrow yexception() << fullMessage;
 }
 
+TOnlyThrowingBindTerminator::TOnlyThrowingBindTerminator()
+    : TBindTerminator(this)
+{
+}
+
+void TOnlyThrowingBindTerminator::Terminate(const char* message) const {
+    ythrow yexception() << message;
+}
+
+
 [[noreturn]] void MKQLTerminate(const char* message) {
     if (const auto t = TBindTerminator::Terminator)
         t->Terminate(message);

+ 7 - 0
ydb/library/yql/minikql/mkql_terminator.h

@@ -31,6 +31,13 @@ struct TThrowingBindTerminator : public TBindTerminator, public ITerminator {
     void Terminate(const char* message) const final;
 };
 
+struct TOnlyThrowingBindTerminator : public TBindTerminator, public ITerminator {
+    TOnlyThrowingBindTerminator();
+    void Terminate(const char* message) const final;
+};
+
+
+
 [[noreturn]] void MKQLTerminate(const char* message);
 
 }

+ 59 - 89
ydb/library/yql/parser/pg_wrapper/comp_factory.cpp

@@ -2116,7 +2116,7 @@ NUdf::TUnboxedValuePod ConvertToPgValue(NUdf::TUnboxedValuePod value, TMaybe<NUd
     }
     case NUdf::EDataSlot::TzDate:
     case NUdf::EDataSlot::TzDatetime:
-    case NUdf::EDataSlot::TzTimestamp: 
+    case NUdf::EDataSlot::TzTimestamp:
     case NUdf::EDataSlot::TzDate32:
     case NUdf::EDataSlot::TzDatetime64:
     case NUdf::EDataSlot::TzTimestamp64: {
@@ -3755,7 +3755,7 @@ NUdf::TUnboxedValue PgValueFromNativeBinary(const TStringBuf binary, ui32 pgType
     if (!NPg::HasType(pgTypeId)) {
         return MakeString(binary);
     }
-    
+
     TPAllocScope call;
     StringInfoData stringInfo;
     stringInfo.data = (char*)binary.Data();
@@ -5275,6 +5275,7 @@ public:
     }
 
     TConvertResult NativeBinaryFromNativeText(const TString& str) const {
+        NMiniKQL::TOnlyThrowingBindTerminator bind;
         NMiniKQL::TScopedAlloc alloc(__LOCATION__);
         NMiniKQL::TPAllocScope scope;
         Datum datum = 0;
@@ -5287,51 +5288,45 @@ public:
                 pfree(serialized);
             }
         };
-        PG_TRY();
-        {
-        {
+        try {
+            {
+                FmgrInfo finfo;
+                InitFunc(InFuncId, &finfo, 1, 3);
+                LOCAL_FCINFO(callInfo, 3);
+                Zero(*callInfo);
+                callInfo->flinfo = &finfo;
+                callInfo->nargs = 3;
+                callInfo->fncollation = DEFAULT_COLLATION_OID;
+                callInfo->isnull = false;
+                callInfo->args[0] = { (Datum)str.Data(), false };
+                callInfo->args[1] = { ObjectIdGetDatum(NMiniKQL::MakeTypeIOParam(*this)), false };
+                callInfo->args[2] = { Int32GetDatum(-1), false };
+
+                datum = finfo.fn_addr(callInfo);
+                Y_ENSURE(!callInfo->isnull);
+            }
             FmgrInfo finfo;
-            InitFunc(InFuncId, &finfo, 1, 3);
-            LOCAL_FCINFO(callInfo, 3);
+            InitFunc(SendFuncId, &finfo, 1, 1);
+            LOCAL_FCINFO(callInfo, 1);
             Zero(*callInfo);
             callInfo->flinfo = &finfo;
-            callInfo->nargs = 3;
+            callInfo->nargs = 1;
             callInfo->fncollation = DEFAULT_COLLATION_OID;
             callInfo->isnull = false;
-            callInfo->args[0] = { (Datum)str.Data(), false };
-            callInfo->args[1] = { ObjectIdGetDatum(NMiniKQL::MakeTypeIOParam(*this)), false };
-            callInfo->args[2] = { Int32GetDatum(-1), false };
+            callInfo->args[0] = { datum, false };
 
-            datum = finfo.fn_addr(callInfo);
+            serialized = (text*)finfo.fn_addr(callInfo);
             Y_ENSURE(!callInfo->isnull);
-        }
-        FmgrInfo finfo;
-        InitFunc(SendFuncId, &finfo, 1, 1);
-        LOCAL_FCINFO(callInfo, 1);
-        Zero(*callInfo);
-        callInfo->flinfo = &finfo;
-        callInfo->nargs = 1;
-        callInfo->fncollation = DEFAULT_COLLATION_OID;
-        callInfo->isnull = false;
-        callInfo->args[0] = { datum, false };
-
-        serialized = (text*)finfo.fn_addr(callInfo);
-        Y_ENSURE(!callInfo->isnull);
-        return {TString(NMiniKQL::GetVarBuf(serialized)), {}};
-    }
-        PG_CATCH();
-        {
-            auto error_data = CopyErrorData();
+            return {TString(NMiniKQL::GetVarBuf(serialized)), {}};
+        } catch (const yexception& e) {
             TStringBuilder errMsg;
-            errMsg << "Error while converting text to binary: " << error_data->message;
-            FreeErrorData(error_data);
-            FlushErrorState();
+            errMsg << "Error while converting text to binary: " << e.what();
             return {"", errMsg};
         }
-        PG_END_TRY();
     }
 
     TConvertResult NativeTextFromNativeBinary(const TStringBuf binary) const {
+        NMiniKQL::TOnlyThrowingBindTerminator bind;
         NMiniKQL::TScopedAlloc alloc(__LOCATION__);
         NMiniKQL::TPAllocScope scope;
         Datum datum = 0;
@@ -5344,33 +5339,26 @@ public:
                 pfree(str);
             }
         };
-        PG_TRY();
-        {
-        datum = Receive(binary.Data(), binary.Size());
-        FmgrInfo finfo;
-        InitFunc(OutFuncId, &finfo, 1, 1);
-        LOCAL_FCINFO(callInfo, 1);
-        Zero(*callInfo);
-        callInfo->flinfo = &finfo;
-        callInfo->nargs = 1;
-        callInfo->fncollation = DEFAULT_COLLATION_OID;
-        callInfo->isnull = false;
-        callInfo->args[0] = { datum, false };
+        try {
+            datum = Receive(binary.Data(), binary.Size());
+            FmgrInfo finfo;
+            InitFunc(OutFuncId, &finfo, 1, 1);
+            LOCAL_FCINFO(callInfo, 1);
+            Zero(*callInfo);
+            callInfo->flinfo = &finfo;
+            callInfo->nargs = 1;
+            callInfo->fncollation = DEFAULT_COLLATION_OID;
+            callInfo->isnull = false;
+            callInfo->args[0] = { datum, false };
 
-        str = (char*)finfo.fn_addr(callInfo);
-        Y_ENSURE(!callInfo->isnull);
-        return {TString(str), {}};
-        }
-        PG_CATCH();
-        {
-            auto error_data = CopyErrorData();
+            str = (char*)finfo.fn_addr(callInfo);
+            Y_ENSURE(!callInfo->isnull);
+            return {TString(str), {}};
+        } catch (const yexception& e) {
             TStringBuilder errMsg;
-            errMsg << "Error while converting binary to text: " << error_data->message;
-            FreeErrorData(error_data);
-            FlushErrorState();
+            errMsg << "Error while converting binary to text: " << e.what();
             return {"", errMsg};
         }
-        PG_END_TRY();
     }
 
     TTypeModResult ReadTypeMod(const TString& str) const {
@@ -5413,6 +5401,7 @@ public:
             }
         }
 
+        NMiniKQL::TOnlyThrowingBindTerminator bind;
         NMiniKQL::TScopedAlloc alloc(__LOCATION__);
         NMiniKQL::TPAllocScope scope;
         ArrayType* paramsArray = nullptr;
@@ -5421,8 +5410,7 @@ public:
                 pfree(paramsArray);
             }
         };
-        PG_TRY();
-        {
+        try {
             int ndims = 0;
             int dims[MAXDIM];
             int lbs[MAXDIM];
@@ -5451,22 +5439,17 @@ public:
             auto result = finfo.fn_addr(callInfo);
             Y_ENSURE(!callInfo->isnull);
             return {DatumGetInt32(result), {}};
-        }
-        PG_CATCH();
-        {
-            auto error_data = CopyErrorData();
+        } catch (const yexception& e) {
             TStringBuilder errMsg;
             errMsg << "Error in 'typemodin' function: "
                 << NYql::NPg::LookupProc(TypeModInFuncId).Name
-                << ", reason: " << error_data->message;
-            FreeErrorData(error_data);
-            FlushErrorState();
+                << ", reason: " << e.what();
             return {-1, errMsg};
         }
-        PG_END_TRY();
     }
 
     TMaybe<TString> Validate(const TStringBuf binary) {
+        NMiniKQL::TOnlyThrowingBindTerminator bind;
         NMiniKQL::TScopedAlloc alloc(__LOCATION__);
         NMiniKQL::TPAllocScope scope;
         Datum datum = 0;
@@ -5475,23 +5458,16 @@ public:
                 pfree((void*)datum);
             }
         };
-        PG_TRY();
-        {
-        datum = Receive(binary.Data(), binary.Size());
-        return {};
-    }
-        PG_CATCH();
-        {
-            auto error_data = CopyErrorData();
+        try {
+            datum = Receive(binary.Data(), binary.Size());
+            return {};
+        } catch (const yexception& e) {
             TStringBuilder errMsg;
             errMsg << "Error in 'recv' function: "
                 << NYql::NPg::LookupProc(ReceiveFuncId).Name
-                << ", reason: " << error_data->message;
-            FreeErrorData(error_data);
-            FlushErrorState();
+                << ", reason: " << e.what();
             return errMsg;
         }
-        PG_END_TRY();
     }
 
     TCoerceResult Coerce(const TStringBuf binary, i32 typmod) {
@@ -5508,6 +5484,7 @@ public:
 
 private:
     TCoerceResult Coerce(bool isSourceBinary, const TStringBuf binary, Datum datum, i32 typmod) {
+        NMiniKQL::TOnlyThrowingBindTerminator bind;
         NMiniKQL::TScopedAlloc alloc(__LOCATION__);
         NMiniKQL::TPAllocScope scope;
 
@@ -5535,8 +5512,7 @@ private:
                 pfree(serialized);
             }
         };
-        PG_TRY();
-        {
+        try {
             if (isSourceBinary) {
                 datum = Receive(binary.Data(), binary.Size());
             }
@@ -5602,17 +5578,11 @@ private:
                 Y_ENSURE(!callInfo->isnull);
                 return {TString(NMiniKQL::GetVarBuf(serialized)), {}};
             }
-        }
-        PG_CATCH();
-        {
-            auto error_data = CopyErrorData();
+        } catch (const yexception& e) {
             TStringBuilder errMsg;
-            errMsg << "Error while coercing value, reason: " << error_data->message;
-            FreeErrorData(error_data);
-            FlushErrorState();
+            errMsg << "Error while coercing value, reason: " << e.what();
             return {{}, errMsg};
         }
-        PG_END_TRY();
     }
 
     Datum CoerceOne(ui32 typeId, Datum datum, i32 typmod) const {