diff --git a/ydb/library/yql/parser/pg_catalog/catalog.cpp b/ydb/library/yql/parser/pg_catalog/catalog.cpp index 14893cc2e572..849dddeeeab4 100644 --- a/ydb/library/yql/parser/pg_catalog/catalog.cpp +++ b/ydb/library/yql/parser/pg_catalog/catalog.cpp @@ -1594,6 +1594,7 @@ const TColumnInfoRaw AllStaticColumnsRaw[] = { const char* AllowedProcsRaw[] = { #include "safe_procs.h" #include "used_procs.h" +#include "postgis_procs.h" }; struct TCatalog : public IExtensionDDLBuilder { diff --git a/ydb/library/yql/parser/pg_catalog/postgis_procs.h b/ydb/library/yql/parser/pg_catalog/postgis_procs.h new file mode 100644 index 000000000000..21e2f4b792a7 --- /dev/null +++ b/ydb/library/yql/parser/pg_catalog/postgis_procs.h @@ -0,0 +1,241 @@ +"box2d", +"box2df_in", +"box2df_out", +"box2d_in", +"box2d_out", +"box3d", +"box3d_in", +"box3d_out", +"brin_summarize_new_values", +"geography", +"geography_in", +"geography_out", +"geography_recv", +"geography_send", +"geography_typmod_in", +"geography_typmod_out", +"geometry", +"geometry_in", +"geometry_out", +"geometry_recv", +"geometry_send", +"geometrytype", +"geometry_typmod_in", +"geometry_typmod_out", +"gidx_in", +"gidx_out", +"postgis_addbbox", +"postgis_dropbbox", +"_postgis_index_extent", +"_postgis_join_selectivity", +"_postgis_selectivity", +"_postgis_stats", +"spheroid_in", +"spheroid_out", +"st_3dclosestpoint", +"st_3ddfullywithin", +"st_3ddistance", +"st_3ddwithin", +"st_3dintersects", +"st_3dlength", +"st_3dlineinterpolatepoint", +"st_3dlongestline", +"st_3dmakebox", +"st_3dmaxdistance", +"st_3dperimeter", +"st_3dshortestline", +"st_addmeasure", +"st_addpoint", +"st_angle", +"st_area", +"st_area2d", +"st_asbinary", +"st_asencodedpolyline", +"st_asewkb", +"st_asewkt", +"st_asgeojson", +"st_asgml", +"st_askml", +"st_aslatlontext", +"st_asmarc21", +"st_asmvtgeom", +"st_assvg", +"st_astext", +"st_astwkb", +"st_azimuth", +"st_boundary", +"st_box2dfromgeohash", +"st_buffer", +"st_buildarea", +"st_centroid", +"st_chaikinsmoothing", +"st_closestpoint", +"st_closestpointofapproach", +"st_collect", +"st_collectionextract", +"st_contains", +"st_containsproperly", +"st_convexhull", +"st_coveredby", +"st_covers", +"st_cpawithin", +"st_crosses", +"st_curvetoline", +"st_delaunaytriangles", +"st_dfullywithin", +"st_difference", +"st_dimension", +"st_disjoint", +"st_distance", +"st_distancecpa", +"st_distancespheroid", +"st_dump", +"st_dumppoints", +"st_dumpsegments", +"st_dwithin", +"st_endpoint", +"st_envelope", +"st_equals", +"st_estimatedextent", +"st_expand", +"st_filterbym", +"st_flipcoordinates", +"st_force2d", +"st_force3dm", +"st_force3dz", +"st_force4d", +"st_forcecollection", +"st_forcecurve", +"st_forcepolygoncw", +"st_forcerhr", +"st_frechetdistance", +"st_generatepoints", +"st_geogfromtext", +"st_geographyfromtext", +"st_geohash", +"st_geometricmedian", +"st_geometryfromtext", +"st_geometryn", +"st_geometrytype", +"st_geomfromewkb", +"st_geomfromewkt", +"st_geomfromgeojson", +"st_geomfromgml", +"st_geomfromkml", +"st_geomfrommarc21", +"st_geomfromtext", +"st_geomfromtwkb", +"st_geomfromwkb", +"st_hasarc", +"st_hausdorffdistance", +"st_hexagon", +"st_hexagongrid", +"st_interpolatepoint", +"st_intersection", +"st_intersects", +"st_isclosed", +"st_iscollection", +"st_ispolygonccw", +"st_ispolygoncw", +"st_isring", +"st_issimple", +"st_isvalid", +"st_isvaliddetail", +"st_isvalidreason", +"st_isvalidtrajectory", +"st_largestemptycircle", +"st_length", +"st_length2d", +"st_length2dspheroid", +"st_lengthspheroid", +"st_linecrossingdirection", +"st_lineextend", +"st_linefromencodedpolyline", +"st_lineinterpolatepoint", +"st_lineinterpolatepoints", +"st_linelocatepoint", +"st_linemerge", +"st_linesubstring", +"st_linetocurve", +"st_locatealong", +"st_locatebetween", +"st_locatebetweenelevations", +"st_m", +"st_makebox2d", +"st_makeenvelope", +"st_makeline", +"st_makepoint", +"st_makepointm", +"st_makepolygon", +"st_makevalid", +"st_maximuminscribedcircle", +"st_memsize", +"st_minimumboundingcircle", +"st_minimumboundingradius", +"st_minimumclearance", +"st_minimumclearanceline", +"st_multi", +"st_ndims", +"st_normalize", +"st_npoints", +"st_nrings", +"st_numgeometries", +"st_numinteriorrings", +"st_numpoints", +"st_offsetcurve", +"st_orderingequals", +"st_orientedenvelope", +"st_overlaps", +"st_perimeter", +"st_perimeter2d", +"st_point", +"st_pointfromgeohash", +"st_pointm", +"st_pointn", +"st_pointonsurface", +"st_points", +"st_pointz", +"st_pointzm", +"st_polygonize", +"st_project", +"st_quantizecoordinates", +"st_reduceprecision", +"st_relate", +"st_relatematch", +"st_removepoint", +"st_removerepeatedpoints", +"st_reverse", +"st_scale", +"st_scroll", +"st_segmentize", +"st_setpoint", +"st_setsrid", +"st_sharedpaths", +"st_shiftlongitude", +"st_shortestline", +"st_simplify", +"st_simplifypolygonhull", +"st_simplifypreservetopology", +"st_simplifyvw", +"st_snap", +"st_snaptogrid", +"st_split", +"st_square", +"st_squaregrid", +"st_srid", +"st_startpoint", +"st_subdivide", +"st_summary", +"st_swapordinates", +"st_symdifference", +"st_tileenvelope", +"st_touches", +"st_transform", +"st_triangulatepolygon", +"st_unaryunion", +"st_union", +"st_within", +"st_wkbtosql", +"st_x", +"st_y", +"st_z", diff --git a/ydb/library/yql/parser/pg_catalog/safe_procs.h b/ydb/library/yql/parser/pg_catalog/safe_procs.h index fcc613cd874b..2a6eb3ae7c91 100644 --- a/ydb/library/yql/parser/pg_catalog/safe_procs.h +++ b/ydb/library/yql/parser/pg_catalog/safe_procs.h @@ -4,6 +4,7 @@ "pg_total_relation_size", "row_to_json", "version", +"pow", "set_config",//pgadmin "pg_is_in_recovery",//pgadmin diff --git a/ydb/library/yql/parser/pg_wrapper/comp_factory.cpp b/ydb/library/yql/parser/pg_wrapper/comp_factory.cpp index af67af2eb903..d67350f92a47 100644 --- a/ydb/library/yql/parser/pg_wrapper/comp_factory.cpp +++ b/ydb/library/yql/parser/pg_wrapper/comp_factory.cpp @@ -4992,6 +4992,7 @@ void PgReleaseThreadContext(void* ctx) { class TExtensionLoader : public NYql::NPg::IExtensionLoader { public: void Load(ui32 extensionIndex, const TString& name, const TString& path) final { + RebuildSysCache(); TExtensionsRegistry::Instance().Load(extensionIndex, name, path); } }; diff --git a/ydb/library/yql/parser/pg_wrapper/postgresql/src/backend/commands/extension.c b/ydb/library/yql/parser/pg_wrapper/postgresql/src/backend/commands/extension.c index 878d7fd4932e..c810b888246c 100644 --- a/ydb/library/yql/parser/pg_wrapper/postgresql/src/backend/commands/extension.c +++ b/ydb/library/yql/parser/pg_wrapper/postgresql/src/backend/commands/extension.c @@ -141,7 +141,7 @@ static char *read_whole_file(const char *filename, int *length); * true, just return InvalidOid. */ Oid -get_extension_oid(const char *extname, bool missing_ok) +get_extension_oid_original(const char *extname, bool missing_ok) { Oid result; Relation rel; @@ -186,7 +186,7 @@ get_extension_oid(const char *extname, bool missing_ok) * Returns a palloc'd string, or NULL if no such extension. */ char * -get_extension_name(Oid ext_oid) +get_extension_name_original(Oid ext_oid) { char *result; Relation rel; @@ -225,7 +225,7 @@ get_extension_name(Oid ext_oid) * Returns InvalidOid if no such extension. */ Oid -get_extension_schema(Oid ext_oid) +get_extension_schema_original(Oid ext_oid) { Oid result; Relation rel; diff --git a/ydb/library/yql/parser/pg_wrapper/syscache.cpp b/ydb/library/yql/parser/pg_wrapper/syscache.cpp index beb7ddccc428..b7bf73808698 100644 --- a/ydb/library/yql/parser/pg_wrapper/syscache.cpp +++ b/ydb/library/yql/parser/pg_wrapper/syscache.cpp @@ -197,27 +197,40 @@ struct TSysCache { return *Singleton(); } + static TSysCache& MutableInstance() { + return *Singleton(); + } + TSysCache() { - InitializeProcs(); - InitializeTypes(); - InitializeDatabase(); - InitializeAuthId(); - InitializeNameNamespaces(); - InitializeRelNameNamespaces(); - for (auto& item : Items) { - if (item) { - item->FinalizeRangeMaps(); - } - } - Arena.Release(); + Rebuild(); } ~TSysCache() { Arena.Acquire(); } + void Rebuild() { + with_lock(Arena) { + for (auto& x : Items) { + x.reset(); + } + + InitializeProcs(); + InitializeTypes(); + InitializeDatabase(); + InitializeAuthId(); + InitializeNameAndOidNamespaces(); + InitializeRelNameNamespaces(); + for (auto& item : Items) { + if (item) { + item->FinalizeRangeMaps(); + } + } + } + } + static void FillDatum(ui32 count, Datum* values, bool* nulls, ui32 attrNum, Datum value) { Y_ENSURE(attrNum > 0 && attrNum <= count); values[attrNum - 1] = value; @@ -408,12 +421,12 @@ struct TSysCache { FillAttr(tupleDesc, Anum_pg_type_typdefaultbin, PG_NODE_TREEOID); FillAttr(tupleDesc, Anum_pg_type_typdefault, TEXTOID); FillAttr(tupleDesc, Anum_pg_type_typacl, ACLITEMARRAYOID); - auto& cacheItem = Items[TYPEOID] = std::make_unique(OidHasher1, OidEquals1, tupleDesc); - auto& lookupMap = cacheItem->LookupMap; + auto& cacheItem1 = Items[TYPEOID] = std::make_unique(OidHasher1, OidEquals1, tupleDesc); + auto& lookupMap1 = cacheItem1->LookupMap; + auto& cacheItem2 = Items[TYPENAMENSP] = std::make_unique(NsNameHasher, NsNameEquals, tupleDesc); + auto& lookupMap2 = cacheItem2->LookupMap; NPg::EnumTypes([&](ui32 oid, const NPg::TTypeDesc& desc){ - auto key = THeapTupleKey(oid, 0, 0, 0); - Datum values[Natts_pg_type]; bool nulls[Natts_pg_type]; Zero(values); @@ -463,7 +476,11 @@ struct TSysCache { Y_ENSURE(row->typmodout == desc.TypeModOutFuncId); Y_ENSURE(row->typalign == desc.TypeAlign); Y_ENSURE(row->typstorage == storage); - lookupMap.emplace(key, h); + + auto key1 = THeapTupleKey(oid, 0, 0, 0); + lookupMap1.emplace(key1, h); + auto key2 = THeapTupleKey((Datum)desc.Name.c_str(), PG_CATALOG_NAMESPACE, 0, 0); + lookupMap2.emplace(key2, h); }); } @@ -692,14 +709,16 @@ struct TSysCache { } } - void InitializeNameNamespaces() { + void InitializeNameAndOidNamespaces() { TupleDesc tupleDesc = CreateTemplateTupleDesc(Natts_pg_namespace); FillAttr(tupleDesc, Anum_pg_namespace_oid, OIDOID); FillAttr(tupleDesc, Anum_pg_namespace_nspname, NAMEOID); FillAttr(tupleDesc, Anum_pg_namespace_nspowner, OIDOID); FillAttr(tupleDesc, Anum_pg_namespace_nspacl, ACLITEMARRAYOID); - auto& cacheItem = Items[NAMESPACENAME] = std::make_unique(NsNameHasher, NsNameEquals, tupleDesc); - auto& lookupMap = cacheItem->LookupMap; + auto& cacheItem1 = Items[NAMESPACENAME] = std::make_unique(NsNameHasher, NsNameEquals, tupleDesc); + auto& lookupMap1 = cacheItem1->LookupMap; + auto& cacheItem2 = Items[NAMESPACEOID] = std::make_unique(OidHasher1, OidEquals1, tupleDesc); + auto& lookupMap2 = cacheItem2->LookupMap; NPg::EnumNamespace([&](ui32 oid, const NPg::TNamespaceDesc& desc) { Datum values[Natts_pg_namespace]; @@ -716,13 +735,20 @@ struct TSysCache { Y_ENSURE(NameStr(row->nspname) == desc.Name); Y_ENSURE(row->nspowner == 1); - auto key = THeapTupleKey((Datum)name, 0, 0, 0); - lookupMap.emplace(key, h); + auto key1 = THeapTupleKey((Datum)name, 0, 0, 0); + lookupMap1.emplace(key1, h); + auto key2 = THeapTupleKey((Datum)oid, 0, 0, 0); + lookupMap2.emplace(key2, h); }); } }; } + +void RebuildSysCache() { + TSysCache::MutableInstance().Rebuild(); +} + } namespace NKikimr { namespace NMiniKQL { diff --git a/ydb/library/yql/parser/pg_wrapper/utils.cpp b/ydb/library/yql/parser/pg_wrapper/utils.cpp index 31561cd292a5..b014e9ec8bd7 100644 --- a/ydb/library/yql/parser/pg_wrapper/utils.cpp +++ b/ydb/library/yql/parser/pg_wrapper/utils.cpp @@ -6,6 +6,7 @@ extern "C" { #include "fmgr.h" #include "utils/array.h" #include "pgstat.h" +#include "catalog/pg_namespace_d.h" } #undef Max @@ -164,4 +165,33 @@ bool GetPgFuncAddr(ui32 procOid, FmgrInfo& finfo) { return true; } +extern "C" Oid get_extension_oid(const char *extname, bool missing_ok) +{ + Oid result = InvalidOid; + try { + result = NPg::LookupExtensionByName(extname); + } catch (const yexception&) { + } + + if (!OidIsValid(result) && !missing_ok) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("extension \"%s\" does not exist", + extname))); + + return result; +} + +extern "C" char *get_extension_name(Oid ext_oid) { + try { + return pstrdup(NPg::LookupExtension(ext_oid).Name.c_str()); + } catch (const yexception&) { + return nullptr; + } +} + +extern "C" Oid get_extension_schema(Oid) { + return PG_CATALOG_NAMESPACE; +} + } diff --git a/ydb/library/yql/parser/pg_wrapper/utils.h b/ydb/library/yql/parser/pg_wrapper/utils.h index f79923000b06..6d1c7589388a 100644 --- a/ydb/library/yql/parser/pg_wrapper/utils.h +++ b/ydb/library/yql/parser/pg_wrapper/utils.h @@ -166,4 +166,6 @@ class TImpl; std::unique_ptr Impl_; }; +void RebuildSysCache(); + } diff --git a/ydb/library/yql/tests/sql/yt_native_file/part12/canondata/result.json b/ydb/library/yql/tests/sql/yt_native_file/part12/canondata/result.json index 2eb3d0708909..45465c8b3f33 100644 --- a/ydb/library/yql/tests/sql/yt_native_file/part12/canondata/result.json +++ b/ydb/library/yql/tests/sql/yt_native_file/part12/canondata/result.json @@ -2408,9 +2408,9 @@ ], "test.test[pg-regoids-default.txt-Results]": [ { - "checksum": "bb246f8c24343d5c41a7083b36b47891", - "size": 5302, - "uri": "https://{canondata_backend}/1881367/cac296ddad7a609e7e71ad12cdda0f2a48675019/resource.tar.gz#test.test_pg-regoids-default.txt-Results_/results.txt" + "checksum": "e494fcff75b860ed2d2674a76d11140e", + "size": 5321, + "uri": "https://{canondata_backend}/1924537/5093fc61be2be46b7fb62a7bcae27f23c56cc7ea/resource.tar.gz#test.test_pg-regoids-default.txt-Results_/results.txt" } ], "test.test[pg-select_agg_expr_projection-default.txt-Debug]": [ @@ -2933,9 +2933,9 @@ ], "test.test[pg_catalog-pg_description_pg_syntax-default.txt-Results]": [ { - "checksum": "ef973b40e478dfa6be2fef50d12a0076", + "checksum": "3a9969956a7c8733e206e1c48b69fb6b", "size": 2768, - "uri": "https://{canondata_backend}/1946324/22a41345f3e8fa8e44c5ac24e1c1025ef337bff8/resource.tar.gz#test.test_pg_catalog-pg_description_pg_syntax-default.txt-Results_/results.txt" + "uri": "https://{canondata_backend}/1781765/06385bbe3cc26f7636fda0884cd00a6af1e2b081/resource.tar.gz#test.test_pg_catalog-pg_description_pg_syntax-default.txt-Results_/results.txt" } ], "test.test[pg_catalog-pg_timezone_abbrevs-default.txt-Debug]": [ diff --git a/ydb/library/yql/tools/exports.symlist b/ydb/library/yql/tools/exports.symlist index 86b404025da6..c1c2b129dacd 100644 --- a/ydb/library/yql/tools/exports.symlist +++ b/ydb/library/yql/tools/exports.symlist @@ -1041,6 +1041,7 @@ get_call_result_type; get_commutator; get_element_type; get_extension_oid; +get_extension_schema; get_fn_expr_argtype; get_func_name; get_func_namespace;