From fb20dc830fdffdcc59f6430ce87088dd71b692ac Mon Sep 17 00:00:00 2001 From: dengxuyue Date: Wed, 30 Dec 2020 21:29:17 +0800 Subject: [PATCH 1/2] 2nd round patches for openGauss 1.1.0 --- build.sh | 214 +- build/script/build_opengauss.sh | 1 + build/script/mpp_package.sh | 7 - .../mpp_release_list_openeuler_aarch64_single | 5 - .../opengauss_release_list_centos_single | 1 + ...ngauss_release_list_euleros_aarch64_single | 1 + .../opengauss_release_list_euleros_single | 1 + ...auss_release_list_openeuler_aarch64_single | 1 + .../opengauss_release_list_openeuler_single | 1323 ++ build/script/package_opengauss.sh | 33 +- configure | 6 +- src/Makefile.global.in | 17 +- src/bin/pg_probackup/Makefile | 2 +- src/bin/pg_probackup/backup.cpp | 2 +- src/bin/pg_probackup/catalog.cpp | 4 +- src/gausskernel/Makefile | 7 +- .../optimizer/commands/explain.cpp | 11 +- src/gausskernel/optimizer/commands/user.cpp | 5 + src/gausskernel/optimizer/prep/prepunion.cpp | 5 + .../optimizer/rewrite/rewriteManip.cpp | 6 + .../process/threadpool/knl_session.cpp | 4 + .../runtime/executor/execProcnode.cpp | 4 +- src/gausskernel/storage/mot/core/src/Makefile | 57 - .../storage/mot/core/src/Makefile.local | 4 +- .../src/concurrency_control/row_header.cpp | 8 +- .../garbage_collector/mm_gc_manager.cpp | 2 +- .../core/src/storage/index/masstree/config.h | 62 - .../index/masstree/mot_masstree_config.hpp | 77 - .../index/masstree/mot_masstree_kvthread.cpp | 123 + .../core/src/storage/index/masstree_index.h | 2 +- .../system/recovery/checkpoint_recovery.cpp | 2 +- .../src/system/transaction/txn_access.cpp | 34 +- .../system/transaction_logger/redo_log.cpp | 5 +- .../storage/mot/fdw_adapter/src/mot_fdw.cpp | 9 +- .../mot/fdw_adapter/src/mot_fdw_xlog.cpp | 4 +- .../mot/jit_exec/src/jit_llvm_blocks.cpp | 6 +- .../mot/jit_exec/src/jit_plan_expr.cpp | 2 +- .../mot/jit_exec/src/jit_tvm_blocks.cpp | 6 +- src/get_PlatForm_str.sh | 6 + .../rollback-post_catalog_maindb_92_200.sql | 10674 ---------------- .../rollback_catalog_maindb_92_200.sql | 2129 --- .../rollback-post_catalog_otherdb_92_200.sql | 10674 ---------------- .../rollback_catalog_otherdb_92_200.sql | 2151 ---- .../upgrade-post_catalog_maindb_92_200.sql | 7795 ++--------- .../upgrade_catalog_maindb_92_200.sql | 445 - .../upgrade-post_catalog_otherdb_92_200.sql | 7795 ++--------- .../upgrade_catalog_otherdb_92_200.sql | 448 - 47 files changed, 3346 insertions(+), 40834 deletions(-) create mode 100644 build/script/opengauss_release_list_openeuler_single delete mode 100644 src/gausskernel/storage/mot/core/src/storage/index/masstree/config.h delete mode 100644 src/gausskernel/storage/mot/core/src/storage/index/masstree/mot_masstree_config.hpp create mode 100644 src/gausskernel/storage/mot/core/src/storage/index/masstree/mot_masstree_kvthread.cpp diff --git a/build.sh b/build.sh index 97385265e..2b5e2cee9 100755 --- a/build.sh +++ b/build.sh @@ -2,9 +2,8 @@ declare build_version_mode='release' declare build_binarylib_dir='None' -declare to_package='NO' -declare optimized='true' -declare distribute='NO' +declare wrap_binaries='NO' +declare not_optimized='' ######################################################################### ##read command line paramenters ####################################################################### @@ -15,9 +14,9 @@ function print_help() -h|--help show help information -m|--version_mode this values of paramenter is debug, release or memcheck, the default value is release -3rd|--binarylib_dir the parent directory of binarylibs - -pkg|--package package the project,by default, only compile the project - -nopt|--not_optimized on kunpeng platform , like 1616 version, without LSE optimized - -d|--distribute compiling on distribute mode + -pkg|--package (deprecated option)package the project,by default, only compile the project + -wrap|--wrap_binaries wrop up the project binaries. By default, only compile the project + -nopt|--not_optimized on kunpeng platform, like 1616 version, without LSE optimized " } @@ -35,12 +34,8 @@ while [ $# -gt 0 ]; do build_version_mode=$2 shift 2 ;; - -pkg|--package) - to_package='YES' - shift 1 - ;; - -d|--distribute) - distribute='YES' + -pkg|--package|-wrap|--wrap_binaries) + wrap_binaries='YES' shift 1 ;; -3rd|--binarylib_dir) @@ -51,206 +46,27 @@ while [ $# -gt 0 ]; do build_binarylib_dir=$2 shift 2 ;; - -nopt|--not_optimized) - optimized='false' + not_optimized='-nopt' shift 1 ;; *) echo "Internal Error: option processing error: $1" 1>&2 echo "please input right paramtenter, the following command may help you" - echo "./package.sh --help or ./package.sh -h" + echo "./build.sh --help or ./build.sh -h" exit 1 esac done -if [ "$build_version_mode" != "debug" ] && [ "$build_version_mode" != "release" ] && [ "$build_version_mode" != "memcheck" ]; then - echo "no given correct version information, such as: debug/release/memcheck" - exit 1 -fi ROOT_DIR=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd) echo "ROOT_DIR : $ROOT_DIR" - -declare ERR_MKGS_FAILED=1 -declare LOG_FILE="${ROOT_DIR}/make_compile.log" -declare BUILD_DIR="${ROOT_DIR}/dest" - -PLAT_FORM_STR=$(sh "${ROOT_DIR}/src/get_PlatForm_str.sh") -if [ "${PLAT_FORM_STR}"x == "Failed"x ] +cd build/script +chmod a+x build_opengauss.sh +sh build_opengauss.sh -m ${build_version_mode} -3rd ${build_binarylib_dir} ${not_optimized} -pkg server -mc off +if [ "${wrap_binaries}"X = "YES"X ] then - echo "We only support OPENEULER(aarch64), CentOS(x86-64) platform." - exit 1; -fi - -##add platform architecture information -PLATFORM_ARCH=$(uname -p) -if [ "$PLATFORM_ARCH"X == "aarch64"X ] ; then - GAUSSDB_EXTRA_FLAGS=" -D__USE_NUMA -D__ARM_LSE" -fi - -gcc_version="8.2" - -if [ ${build_binarylib_dir} != 'None' ] && [ -d ${build_binarylib_dir} ]; then - BUILD_TOOLS_PATH="${build_binarylib_dir}/buildtools/${PLAT_FORM_STR}" -else - BUILD_TOOLS_PATH="${ROOT_DIR}/binarylibs/buildtools/${PLAT_FORM_STR}" -fi - -export CC=$BUILD_TOOLS_PATH/gcc$gcc_version/gcc/bin/gcc -export CXX=$BUILD_TOOLS_PATH/gcc$gcc_version/gcc/bin/g++ -export LD_LIBRARY_PATH=$BUILD_TOOLS_PATH/gcc$gcc_version/gcc/lib64:$BUILD_TOOLS_PATH/gcc$gcc_version/isl/lib:$BUILD_TOOLS_PATH/gcc$gcc_version/mpc/lib/:$BUILD_TOOLS_PATH/gcc$gcc_version/mpfr/lib/:$BUILD_TOOLS_PATH/gcc$gcc_version/gmp/lib/:$LD_LIBRARY_PATH -export PATH=$BUILD_TOOLS_PATH/gcc$gcc_version/gcc/bin:$PATH -if [ "${distribute}"X = "YES"X ] -then - export JAVA_HOME=${ROOT_DIR}/third_party/buildtools/${PLAT_FORM_STR}/jdk8/jdk1.8.0_77 - export JRE_HOME=$JAVA_HOME/jre -fi - -log() -{ - echo "[makegaussdb] $(date +%y-%m-%d' '%T): $@" - echo "[makegaussdb] $(date +%y-%m-%d' '%T): $@" >> "$LOG_FILE" 2>&1 -} - -die() -{ - log "$@" - echo "$@" - exit $ERR_MKGS_FAILED -} - -function srv_pkg_pre_check() -{ - if [ -d "$BUILD_DIR" ]; then - rm -rf $BUILD_DIR - fi - if [ -d "$LOG_FILE" ]; then - rm -rf $LOG_FILE - fi - if [ $? -eq 0 ]; then - echo "Everything is ready." - else - echo "clean enviroment failed." - exit 1 - fi -} -# 1. clean install path and log file -srv_pkg_pre_check - -#get OS distributed version. -kernel="" -version="" -if [ -f "/etc/openEuler-release" ] -then - kernel=$(cat /etc/openEuler-release | awk -F ' ' '{print $1}' | tr A-Z a-z) - version=$(cat /etc/openEuler-release | awk -F '(' '{print $2}'| awk -F ')' '{print $1}' | tr A-Z a-z) -elif [ -f "/etc/centos-release" ] -then - kernel=$(cat /etc/centos-release | awk -F ' ' '{print $1}' | tr A-Z a-z) - version=$(cat /etc/centos-release | awk -F '(' '{print $2}'| awk -F ')' '{print $1}' | tr A-Z a-z) -elif [ -f "/etc/euleros-release" ] -then - kernel=$(cat /etc/centos-release | awk -F ' ' '{print $1}' | tr A-Z a-z) - version=$(cat /etc/centos-release | awk -F '(' '{print $2}'| awk -F ')' '{print $1}' | tr A-Z a-z) -else - kernel=$(lsb_release -d | awk -F ' ' '{print $2}'| tr A-Z a-z) - version=$(lsb_release -r | awk -F ' ' '{print $2}') -fi - -## to solve kernel="name=openeuler" -if echo $kernel | grep -q 'openeuler' -then - kernel="openeuler" -fi - -if [ X"$kernel" == X"centos" ]; then - dist_version="CentOS" -elif [ X"$kernel" == X"openeuler" ]; then - dist_version="openEuler" -elif [ X"$kernel" == X"euleros" ]; then - dist_version="EulerOS" -else - echo "We only support openEuler(aarch64), EulerOS(aarch64), CentOS platform." - echo "Kernel is $kernel" - exit 1 -fi - -function getExtraFlags() -{ - if [ "$PLATFORM_ARCH"X == "aarch64"X ] ; then - if [ "$dist_version" == "openEuler" ] || [ "$dist_version" == "EulerOS" ] ; then - GAUSSDB_EXTRA_FLAGS=" -D__USE_NUMA" - if [ "${optimized}"x == "true"x ] ; then - GAUSSDB_EXTRA_FLAGS=" -D__USE_NUMA -D__ARM_LSE" - echo "Attention: Make sure your target platforms support LSE." - fi - fi - fi -} - - -function compile_gaussdb() -{ - cd "$ROOT_DIR" - echo "begin to make distclean" - if [ $? -ne 0 ]; then - die "change dir to $SRC_DIR failed." - fi - with_3rd=${ROOT_DIR}/binarylibs - if [ "${build_binarylib_dir}"x != "None"x ]; then - with_3rd=${build_binarylib_dir} - fi - getExtraFlags - #configure - make distclean -sj >> "$LOG_FILE" 2>&1 - echo "Begin configure, Please wait a few minutes..." - chmod 755 configure - - if [ "${distribute}"X = "YES"X ]; then - if [ "${build_version_mode}"x == "release"x ]; then - ./configure --prefix="${BUILD_DIR}" --3rd=${with_3rd} CFLAGS="-O2 -g3 ${GAUSSDB_EXTRA_FLAGS}" --enable-thread-safety --without-readline --without-zlib --enable-multiple-nodes CC=g++ >> "$LOG_FILE" 2>&1 - elif [ "${build_version_mode}"x == "memcheck"x ]; then - ./configure --prefix="${BUILD_DIR}" --3rd=${with_3rd} CFLAGS='-O0' --enable-debug --enable-cassert --enable-thread-safety --without-readline --without-zlib --enable-memory-check --enable-multiple-nodes CC=g++ >> "$LOG_FILE" 2>&1 - else - ./configure --prefix="${BUILD_DIR}" --3rd=${with_3rd} CFLAGS="-O0 ${GAUSSDB_EXTRA_FLAGS}" --enable-debug --enable-cassert --enable-thread-safety --without-readline --without-zlib --enable-multiple-nodes CC=g++ >> "$LOG_FILE" 2>&1 - fi - else - if [ "${build_version_mode}"x == "release"x ]; then - ./configure --prefix="${BUILD_DIR}" --3rd=${with_3rd} CFLAGS="-O2 -g3 ${GAUSSDB_EXTRA_FLAGS}" --enable-thread-safety --without-readline --without-zlib CC=g++ >> "$LOG_FILE" 2>&1 - elif [ "${build_version_mode}"x == "memcheck"x ]; then - ./configure --prefix="${BUILD_DIR}" --3rd=${with_3rd} CFLAGS='-O0' --enable-debug --enable-cassert --enable-thread-safety --without-readline --without-zlib --enable-memory-check CC=g++ >> "$LOG_FILE" 2>&1 - else - ./configure --prefix="${BUILD_DIR}" --3rd=${with_3rd} CFLAGS="-O0 ${GAUSSDB_EXTRA_FLAGS}" --enable-debug --enable-cassert --enable-thread-safety --without-readline --without-zlib CC=g++ >> "$LOG_FILE" 2>&1 - fi - fi - - if [ $? -ne 0 ]; then - die "configure failed." - fi - echo "End configure" - - echo "Begin make compile database, Please wait a few minutes..." - export GAUSSHOME=${BUILD_DIR} - export LD_LIBRARY_PATH=${BUILD_DIR}/lib:${BUILD_DIR}/lib/postgresql:${LD_LIBRARY_PATH} - make -sj >> "$LOG_FILE" 2>&1 - make install -sj>> "$LOG_FILE" 2>&1 - - if [ $? -ne 0 ]; then - die "make compile failed." - fi - echo "make compile sucessfully!" -} -compile_gaussdb - -if [ "${to_package}"X = "YES"X ] -then - chmod +x ${ROOT_DIR}/package/package.sh - if [ "${build_binarylib_dir}"x != "None"x ] - then - ${ROOT_DIR}/package/package.sh -m ${build_version_mode} --binarylibs_dir ${build_binarylib_dir} - else - ${ROOT_DIR}/package/package.sh -m ${build_version_mode} - fi + chmod a+x build_opengauss.sh + sh package_opengauss.sh -3rd ${build_binarylib_dir} fi exit 0 diff --git a/build/script/build_opengauss.sh b/build/script/build_opengauss.sh index 7e755589d..a488ff813 100644 --- a/build/script/build_opengauss.sh +++ b/build/script/build_opengauss.sh @@ -30,6 +30,7 @@ test -d $ROOT_DIR/contrib/carbondata && mv $ROOT_DIR/contrib/carbondata $ROOT_DI cp opengauss.spec gauss.spec #(3) invoke mpp_package +chmod a+x mpp_package.sh echo "mpp_package.sh $@ -nopkg -pm opengauss" ./mpp_package.sh $@ -nopkg -pm opengauss if [ $? != "0" ]; then diff --git a/build/script/mpp_package.sh b/build/script/mpp_package.sh index 2f12bc086..469b000a0 100644 --- a/build/script/mpp_package.sh +++ b/build/script/mpp_package.sh @@ -300,13 +300,6 @@ fi if [ "$product_mode"x == "opengauss"x ]; then release_file_list=$(echo ${release_file_list}_single | sed -e 's/mpp_release/opengauss_release/') - if [ ! -f $binarylib_dir/dependency/masstree/masstree-beta-0.9.0.tar.gz ]; then - echo "ERROR: there is no necessary files in $binarylib_dir/dependency/masstree/" - echo " You may copy them from 'third_party' repo by executing:" - echo " mkdir -p $binarylib_dir/dependency/masstree && cp -fr /dependency/masstree/* $binarylib_dir/dependency/masstree" - echo " You should substitute by real path to third_party repo" - exit 1 - fi fi read_mpp_version diff --git a/build/script/mpp_release_list_openeuler_aarch64_single b/build/script/mpp_release_list_openeuler_aarch64_single index 05513edd4..b69f25404 100644 --- a/build/script/mpp_release_list_openeuler_aarch64_single +++ b/build/script/mpp_release_list_openeuler_aarch64_single @@ -82,8 +82,6 @@ ./share/postgresql/extension/gc_fdw.control ./share/postgresql/extension/log_fdw--1.0.sql ./share/postgresql/extension/log_fdw.control -./share/postgresql/extension/mot_fdw--1.0.sql -./share/postgresql/extension/mot_fdw.control ./share/postgresql/extension/dimsearch--1.0.sql ./share/postgresql/extension/dimsearch.control ./share/postgresql/extension/packages--1.0.sql @@ -779,9 +777,6 @@ ./lib/libcom_err_gauss.so ./lib/libcom_err_gauss.so.3 ./lib/libcom_err_gauss.so.3.0 -./lib/libatomic.so -./lib/libatomic.so.1 -./lib/libatomic.so.1.2.0 ./lib/libgpr.so ./lib/libgpr.so.9 ./lib/libgpr.so.9.0.0 diff --git a/build/script/opengauss_release_list_centos_single b/build/script/opengauss_release_list_centos_single index eb278eb16..fca9b7d5e 100644 --- a/build/script/opengauss_release_list_centos_single +++ b/build/script/opengauss_release_list_centos_single @@ -788,6 +788,7 @@ ./lib/libatomic.so ./lib/libatomic.so.1 ./lib/libatomic.so.1.2.0 +./lib/libmasstree.so ./lib/libgpr.so ./lib/libgpr.so.9 ./lib/libgpr.so.9.0.0 diff --git a/build/script/opengauss_release_list_euleros_aarch64_single b/build/script/opengauss_release_list_euleros_aarch64_single index 92e30ed01..b1926ed03 100644 --- a/build/script/opengauss_release_list_euleros_aarch64_single +++ b/build/script/opengauss_release_list_euleros_aarch64_single @@ -792,6 +792,7 @@ ./lib/libatomic.so ./lib/libatomic.so.1 ./lib/libatomic.so.1.2.0 +./lib/libmasstree.so ./lib/libgpr.so ./lib/libgpr.so.9 ./lib/libgpr.so.9.0.0 diff --git a/build/script/opengauss_release_list_euleros_single b/build/script/opengauss_release_list_euleros_single index 4fef74374..ee5a18de8 100644 --- a/build/script/opengauss_release_list_euleros_single +++ b/build/script/opengauss_release_list_euleros_single @@ -786,6 +786,7 @@ ./lib/libatomic.so ./lib/libatomic.so.1 ./lib/libatomic.so.1.2.0 +./lib/libmasstree.so ./lib/libgpr.so ./lib/libgpr.so.9 ./lib/libgpr.so.9.0.0 diff --git a/build/script/opengauss_release_list_openeuler_aarch64_single b/build/script/opengauss_release_list_openeuler_aarch64_single index c806b5582..d237b429b 100644 --- a/build/script/opengauss_release_list_openeuler_aarch64_single +++ b/build/script/opengauss_release_list_openeuler_aarch64_single @@ -782,6 +782,7 @@ ./lib/libatomic.so ./lib/libatomic.so.1 ./lib/libatomic.so.1.2.0 +./lib/libmasstree.so ./lib/libgpr.so ./lib/libgpr.so.9 ./lib/libgpr.so.9.0.0 diff --git a/build/script/opengauss_release_list_openeuler_single b/build/script/opengauss_release_list_openeuler_single new file mode 100644 index 000000000..4fef74374 --- /dev/null +++ b/build/script/opengauss_release_list_openeuler_single @@ -0,0 +1,1323 @@ +[server] +./bin/gs_log +./bin/gsql +./bin/gaussdb +./bin/gaussdb.version.GaussDB200 +./bin/gaussdb.version.GaussDB300 +./bin/gaussdb.license.GaussDB200_Standard +./bin/gaussmaster +./bin/gstrace +./bin/gs_encrypt +./bin/gs_dump +./bin/gs_dumpall +./bin/gs_initdb +./bin/gs_ctl +./bin/gs_guc +./bin/encrypt +./bin/openssl +./bin/gs_restore +./bin/gs_cgroup +./bin/gs_basebackup +./bin/gs_probackup +./bin/pg_config +./bin/pg_controldata +./bin/pg_format_cu +./bin/pg_resetxlog +./bin/alarmItem.conf +./bin/retry_errcodes.conf +./bin/cluster_guc.conf +./bin/runsessionstat.sh +./bin/drop_caches.sh +./bin/run_drop_cache.sh +./bin/transfer.py +./bin/gs_plan_simulator.sh +./bin/dependences/clean_temp.sql +./bin/dependences/initdb.py +./bin/dependences/restore_temp.sql +./bin/dependences/store_pg_class_stats.sql +./bin/dependences/store_pg_statistic_ext_stats.sql +./bin/dependences/store_pg_statistic_stats.sql +./bin/dependences/store_pgxc_class.sql +./bin/krb5kdc +./bin/klist +./bin/kinit +./bin/kdestroy +./bin/kdb5_util +./bin/kadmin.local +./etc/kerberos/kadm5.acl +./etc/kerberos/kdc.conf +./etc/kerberos/krb5.conf +./etc/kerberos/mppdb-site.xml +./share/postgis/PostGIS_install.sh +./share/postgresql/tmp/udstools.py +./share/postgresql/snowball_create.sql +./share/postgresql/pmk_schema.sql +./share/postgresql/pmk_schema_single_inst.sql +./share/postgresql/pg_hba.conf.sample +./share/postgresql/pg_service.conf.sample +./share/postgresql/psqlrc.sample +./share/postgresql/conversion_create.sql +./share/postgresql/postgres.shdescription +./share/postgresql/pg_ident.conf.sample +./share/postgresql/postgres.description +./share/postgresql/postgresql.conf.sample +./share/postgresql/extension/plpgsql--1.0.sql +./share/postgresql/extension/hstore.control +./share/postgresql/extension/security_plugin.control +./share/postgresql/extension/security_plugin--1.0.sql +./share/postgresql/extension/tsdb.control +./share/postgresql/extension/tsdb--1.0.sql +./share/postgresql/extension/file_fdw--1.0.sql +./share/postgresql/extension/plpgsql.control +./share/postgresql/extension/dist_fdw.control +./share/postgresql/extension/dist_fdw--1.0.sql +./share/postgresql/extension/hstore--1.1.sql +./share/postgresql/extension/plpgsql--unpackaged--1.0.sql +./share/postgresql/extension/file_fdw.control +./share/postgresql/extension/hstore--unpackaged--1.0.sql +./share/postgresql/extension/hstore--1.0--1.1.sql +./share/postgresql/extension/hdfs_fdw--1.0.sql +./share/postgresql/extension/hdfs_fdw.control +./share/postgresql/extension/gc_fdw--1.0.sql +./share/postgresql/extension/gc_fdw.control +./share/postgresql/extension/log_fdw--1.0.sql +./share/postgresql/extension/log_fdw.control +./share/postgresql/extension/mot_fdw--1.0.sql +./share/postgresql/extension/mot_fdw.control +./share/postgresql/extension/dimsearch--1.0.sql +./share/postgresql/extension/dimsearch.control +./share/postgresql/extension/packages--1.0.sql +./share/postgresql/extension/packages--1.0--1.1.sql +./share/postgresql/extension/packages.control +./share/postgresql/extension/gsredistribute.control +./share/postgresql/extension/gsredistribute--1.0.sql +./share/postgresql/extension/gsredistribute--unpackaged--1.0.sql +./share/postgresql/extension/postgres_fdw--1.0.sql +./share/postgresql/extension/postgres_fdw.control +./share/postgresql/timezone/GB-Eire +./share/postgresql/timezone/Turkey +./share/postgresql/timezone/Kwajalein +./share/postgresql/timezone/UCT +./share/postgresql/timezone/Mexico/BajaSur +./share/postgresql/timezone/Mexico/BajaNorte +./share/postgresql/timezone/Mexico/General +./share/postgresql/timezone/Japan +./share/postgresql/timezone/Israel +./share/postgresql/timezone/US/Eastern +./share/postgresql/timezone/US/Samoa +./share/postgresql/timezone/US/Michigan +./share/postgresql/timezone/US/Aleutian +./share/postgresql/timezone/US/Pacific +./share/postgresql/timezone/US/Pacific-New +./share/postgresql/timezone/US/Indiana-Starke +./share/postgresql/timezone/US/Mountain +./share/postgresql/timezone/US/East-Indiana +./share/postgresql/timezone/US/Hawaii +./share/postgresql/timezone/US/Arizona +./share/postgresql/timezone/US/Alaska +./share/postgresql/timezone/US/Central +./share/postgresql/timezone/Greenwich +./share/postgresql/timezone/Poland +./share/postgresql/timezone/CET +./share/postgresql/timezone/GMT-0 +./share/postgresql/timezone/Indian/Mauritius +./share/postgresql/timezone/Indian/Cocos +./share/postgresql/timezone/Indian/Reunion +./share/postgresql/timezone/Indian/Maldives +./share/postgresql/timezone/Indian/Comoro +./share/postgresql/timezone/Indian/Antananarivo +./share/postgresql/timezone/Indian/Christmas +./share/postgresql/timezone/Indian/Kerguelen +./share/postgresql/timezone/Indian/Chagos +./share/postgresql/timezone/Indian/Mayotte +./share/postgresql/timezone/Indian/Mahe +./share/postgresql/timezone/GMT0 +./share/postgresql/timezone/Antarctica/Palmer +./share/postgresql/timezone/Antarctica/Syowa +./share/postgresql/timezone/Antarctica/South_Pole +./share/postgresql/timezone/Antarctica/McMurdo +./share/postgresql/timezone/Antarctica/Rothera +./share/postgresql/timezone/Antarctica/Mawson +./share/postgresql/timezone/Antarctica/Casey +./share/postgresql/timezone/Antarctica/Davis +./share/postgresql/timezone/Antarctica/DumontDUrville +./share/postgresql/timezone/Antarctica/Vostok +./share/postgresql/timezone/Antarctica/Macquarie +./share/postgresql/timezone/ROK +./share/postgresql/timezone/Chile/EasterIsland +./share/postgresql/timezone/Chile/Continental +./share/postgresql/timezone/posixrules +./share/postgresql/timezone/Atlantic/Azores +./share/postgresql/timezone/Atlantic/St_Helena +./share/postgresql/timezone/Atlantic/Madeira +./share/postgresql/timezone/Atlantic/Jan_Mayen +./share/postgresql/timezone/Atlantic/Faroe +./share/postgresql/timezone/Atlantic/Stanley +./share/postgresql/timezone/Atlantic/Cape_Verde +./share/postgresql/timezone/Atlantic/Reykjavik +./share/postgresql/timezone/Atlantic/Canary +./share/postgresql/timezone/Atlantic/South_Georgia +./share/postgresql/timezone/Atlantic/Bermuda +./share/postgresql/timezone/Atlantic/Faeroe +./share/postgresql/timezone/Hongkong +./share/postgresql/timezone/Libya +./share/postgresql/timezone/Iceland +./share/postgresql/timezone/UTC +./share/postgresql/timezone/Australia/Darwin +./share/postgresql/timezone/Australia/North +./share/postgresql/timezone/Australia/NSW +./share/postgresql/timezone/Australia/Sydney +./share/postgresql/timezone/Australia/Hobart +./share/postgresql/timezone/Australia/LHI +./share/postgresql/timezone/Australia/Victoria +./share/postgresql/timezone/Australia/South +./share/postgresql/timezone/Australia/Melbourne +./share/postgresql/timezone/Australia/Lord_Howe +./share/postgresql/timezone/Australia/West +./share/postgresql/timezone/Australia/Brisbane +./share/postgresql/timezone/Australia/Perth +./share/postgresql/timezone/Australia/Eucla +./share/postgresql/timezone/Australia/Canberra +./share/postgresql/timezone/Australia/Queensland +./share/postgresql/timezone/Australia/Broken_Hill +./share/postgresql/timezone/Australia/Lindeman +./share/postgresql/timezone/Australia/ACT +./share/postgresql/timezone/Australia/Currie +./share/postgresql/timezone/Australia/Adelaide +./share/postgresql/timezone/Australia/Yancowinna +./share/postgresql/timezone/Australia/Tasmania +./share/postgresql/timezone/Jamaica +./share/postgresql/timezone/EST5EDT +./share/postgresql/timezone/MET +./share/postgresql/timezone/W-SU +./share/postgresql/timezone/Mideast/Riyadh87 +./share/postgresql/timezone/Mideast/Riyadh88 +./share/postgresql/timezone/Mideast/Riyadh89 +./share/postgresql/timezone/WET +./share/postgresql/timezone/ROC +./share/postgresql/timezone/Factory +./share/postgresql/timezone/EET +./share/postgresql/timezone/PST8PDT +./share/postgresql/timezone/Portugal +./share/postgresql/timezone/NZ +./share/postgresql/timezone/Brazil/West +./share/postgresql/timezone/Brazil/DeNoronha +./share/postgresql/timezone/Brazil/Acre +./share/postgresql/timezone/Brazil/East +./share/postgresql/timezone/EST +./share/postgresql/timezone/Egypt +./share/postgresql/timezone/Universal +./share/postgresql/timezone/Pacific/Enderbury +./share/postgresql/timezone/Pacific/Noumea +./share/postgresql/timezone/Pacific/Kwajalein +./share/postgresql/timezone/Pacific/Norfolk +./share/postgresql/timezone/Pacific/Nauru +./share/postgresql/timezone/Pacific/Efate +./share/postgresql/timezone/Pacific/Kosrae +./share/postgresql/timezone/Pacific/Galapagos +./share/postgresql/timezone/Pacific/Truk +./share/postgresql/timezone/Pacific/Fiji +./share/postgresql/timezone/Pacific/Auckland +./share/postgresql/timezone/Pacific/Samoa +./share/postgresql/timezone/Pacific/Port_Moresby +./share/postgresql/timezone/Pacific/Johnston +./share/postgresql/timezone/Pacific/Apia +./share/postgresql/timezone/Pacific/Tarawa +./share/postgresql/timezone/Pacific/Pitcairn +./share/postgresql/timezone/Pacific/Marquesas +./share/postgresql/timezone/Pacific/Chatham +./share/postgresql/timezone/Pacific/Tahiti +./share/postgresql/timezone/Pacific/Tongatapu +./share/postgresql/timezone/Pacific/Saipan +./share/postgresql/timezone/Pacific/Fakaofo +./share/postgresql/timezone/Pacific/Guam +./share/postgresql/timezone/Pacific/Niue +./share/postgresql/timezone/Pacific/Chuuk +./share/postgresql/timezone/Pacific/Easter +./share/postgresql/timezone/Pacific/Wallis +./share/postgresql/timezone/Pacific/Gambier +./share/postgresql/timezone/Pacific/Majuro +./share/postgresql/timezone/Pacific/Kiritimati +./share/postgresql/timezone/Pacific/Guadalcanal +./share/postgresql/timezone/Pacific/Funafuti +./share/postgresql/timezone/Pacific/Rarotonga +./share/postgresql/timezone/Pacific/Pago_Pago +./share/postgresql/timezone/Pacific/Midway +./share/postgresql/timezone/Pacific/Palau +./share/postgresql/timezone/Pacific/Honolulu +./share/postgresql/timezone/Pacific/Yap +./share/postgresql/timezone/Pacific/Pohnpei +./share/postgresql/timezone/Pacific/Wake +./share/postgresql/timezone/Pacific/Ponape +./share/postgresql/timezone/Iran +./share/postgresql/timezone/Etc/GMT-4 +./share/postgresql/timezone/Etc/GMT-9 +./share/postgresql/timezone/Etc/UCT +./share/postgresql/timezone/Etc/GMT-7 +./share/postgresql/timezone/Etc/Greenwich +./share/postgresql/timezone/Etc/GMT-0 +./share/postgresql/timezone/Etc/GMT-5 +./share/postgresql/timezone/Etc/GMT0 +./share/postgresql/timezone/Etc/GMT+7 +./share/postgresql/timezone/Etc/GMT-2 +./share/postgresql/timezone/Etc/GMT-10 +./share/postgresql/timezone/Etc/GMT+6 +./share/postgresql/timezone/Etc/GMT+1 +./share/postgresql/timezone/Etc/UTC +./share/postgresql/timezone/Etc/GMT-3 +./share/postgresql/timezone/Etc/GMT-1 +./share/postgresql/timezone/Etc/GMT-8 +./share/postgresql/timezone/Etc/GMT-11 +./share/postgresql/timezone/Etc/GMT+12 +./share/postgresql/timezone/Etc/GMT+10 +./share/postgresql/timezone/Etc/GMT-12 +./share/postgresql/timezone/Etc/GMT+5 +./share/postgresql/timezone/Etc/Universal +./share/postgresql/timezone/Etc/GMT-13 +./share/postgresql/timezone/Etc/GMT-6 +./share/postgresql/timezone/Etc/GMT+9 +./share/postgresql/timezone/Etc/GMT+3 +./share/postgresql/timezone/Etc/GMT-14 +./share/postgresql/timezone/Etc/GMT+4 +./share/postgresql/timezone/Etc/Zulu +./share/postgresql/timezone/Etc/GMT+2 +./share/postgresql/timezone/Etc/GMT+0 +./share/postgresql/timezone/Etc/GMT+8 +./share/postgresql/timezone/Etc/GMT+11 +./share/postgresql/timezone/Etc/GMT +./share/postgresql/timezone/Zulu +./share/postgresql/timezone/GMT+0 +./share/postgresql/timezone/Singapore +./share/postgresql/timezone/NZ-CHAT +./share/postgresql/timezone/Cuba +./share/postgresql/timezone/GB +./share/postgresql/timezone/Arctic/Longyearbyen +./share/postgresql/timezone/MST7MDT +./share/postgresql/timezone/PRC +./share/postgresql/timezone/Canada/Eastern +./share/postgresql/timezone/Canada/Yukon +./share/postgresql/timezone/Canada/Atlantic +./share/postgresql/timezone/Canada/Newfoundland +./share/postgresql/timezone/Canada/Saskatchewan +./share/postgresql/timezone/Canada/Pacific +./share/postgresql/timezone/Canada/East-Saskatchewan +./share/postgresql/timezone/Canada/Mountain +./share/postgresql/timezone/Canada/Central +./share/postgresql/timezone/CST6CDT +./share/postgresql/timezone/HST +./share/postgresql/timezone/America/Boa_Vista +./share/postgresql/timezone/America/New_York +./share/postgresql/timezone/America/Santarem +./share/postgresql/timezone/America/Boise +./share/postgresql/timezone/America/St_Lucia +./share/postgresql/timezone/America/Mendoza +./share/postgresql/timezone/America/Mexico_City +./share/postgresql/timezone/America/Chihuahua +./share/postgresql/timezone/America/Indianapolis +./share/postgresql/timezone/America/Virgin +./share/postgresql/timezone/America/Atka +./share/postgresql/timezone/America/Winnipeg +./share/postgresql/timezone/America/Hermosillo +./share/postgresql/timezone/America/Indiana/Indianapolis +./share/postgresql/timezone/America/Indiana/Tell_City +./share/postgresql/timezone/America/Indiana/Winamac +./share/postgresql/timezone/America/Indiana/Knox +./share/postgresql/timezone/America/Indiana/Vincennes +./share/postgresql/timezone/America/Indiana/Vevay +./share/postgresql/timezone/America/Indiana/Petersburg +./share/postgresql/timezone/America/Indiana/Marengo +./share/postgresql/timezone/America/Moncton +./share/postgresql/timezone/America/Campo_Grande +./share/postgresql/timezone/America/Guyana +./share/postgresql/timezone/America/Caracas +./share/postgresql/timezone/America/Maceio +./share/postgresql/timezone/America/Godthab +./share/postgresql/timezone/America/Thunder_Bay +./share/postgresql/timezone/America/Havana +./share/postgresql/timezone/America/Santiago +./share/postgresql/timezone/America/Los_Angeles +./share/postgresql/timezone/America/Buenos_Aires +./share/postgresql/timezone/America/Manaus +./share/postgresql/timezone/America/Bahia +./share/postgresql/timezone/America/North_Dakota/New_Salem +./share/postgresql/timezone/America/North_Dakota/Beulah +./share/postgresql/timezone/America/North_Dakota/Center +./share/postgresql/timezone/America/Bahia_Banderas +./share/postgresql/timezone/America/Edmonton +./share/postgresql/timezone/America/Tegucigalpa +./share/postgresql/timezone/America/Rankin_Inlet +./share/postgresql/timezone/America/Monterrey +./share/postgresql/timezone/America/Cambridge_Bay +./share/postgresql/timezone/America/Porto_Velho +./share/postgresql/timezone/America/Antigua +./share/postgresql/timezone/America/Atikokan +./share/postgresql/timezone/America/Vancouver +./share/postgresql/timezone/America/Anchorage +./share/postgresql/timezone/America/Port-au-Prince +./share/postgresql/timezone/America/Lima +./share/postgresql/timezone/America/Grenada +./share/postgresql/timezone/America/Creston +./share/postgresql/timezone/America/La_Paz +./share/postgresql/timezone/America/Panama +./share/postgresql/timezone/America/Blanc-Sablon +./share/postgresql/timezone/America/Cayenne +./share/postgresql/timezone/America/Santo_Domingo +./share/postgresql/timezone/America/Grand_Turk +./share/postgresql/timezone/America/Toronto +./share/postgresql/timezone/America/Rainy_River +./share/postgresql/timezone/America/Merida +./share/postgresql/timezone/America/Port_of_Spain +./share/postgresql/timezone/America/Nipigon +./share/postgresql/timezone/America/Jamaica +./share/postgresql/timezone/America/Rosario +./share/postgresql/timezone/America/Dawson_Creek +./share/postgresql/timezone/America/Belize +./share/postgresql/timezone/America/Costa_Rica +./share/postgresql/timezone/America/Barbados +./share/postgresql/timezone/America/Danmarkshavn +./share/postgresql/timezone/America/Argentina/La_Rioja +./share/postgresql/timezone/America/Argentina/Mendoza +./share/postgresql/timezone/America/Argentina/Buenos_Aires +./share/postgresql/timezone/America/Argentina/Tucuman +./share/postgresql/timezone/America/Argentina/Ushuaia +./share/postgresql/timezone/America/Argentina/Catamarca +./share/postgresql/timezone/America/Argentina/ComodRivadavia +./share/postgresql/timezone/America/Argentina/Jujuy +./share/postgresql/timezone/America/Argentina/Cordoba +./share/postgresql/timezone/America/Argentina/San_Luis +./share/postgresql/timezone/America/Argentina/Rio_Gallegos +./share/postgresql/timezone/America/Argentina/Salta +./share/postgresql/timezone/America/Argentina/San_Juan +./share/postgresql/timezone/America/Pangnirtung +./share/postgresql/timezone/America/Anguilla +./share/postgresql/timezone/America/Curacao +./share/postgresql/timezone/America/Cancun +./share/postgresql/timezone/America/Montreal +./share/postgresql/timezone/America/Shiprock +./share/postgresql/timezone/America/Thule +./share/postgresql/timezone/America/Scoresbysund +./share/postgresql/timezone/America/Catamarca +./share/postgresql/timezone/America/Sao_Paulo +./share/postgresql/timezone/America/Sitka +./share/postgresql/timezone/America/Asuncion +./share/postgresql/timezone/America/Regina +./share/postgresql/timezone/America/St_Johns +./share/postgresql/timezone/America/Montevideo +./share/postgresql/timezone/America/Eirunepe +./share/postgresql/timezone/America/Denver +./share/postgresql/timezone/America/Metlakatla +./share/postgresql/timezone/America/Araguaina +./share/postgresql/timezone/America/Juneau +./share/postgresql/timezone/America/Marigot +./share/postgresql/timezone/America/Menominee +./share/postgresql/timezone/America/Glace_Bay +./share/postgresql/timezone/America/Tijuana +./share/postgresql/timezone/America/Detroit +./share/postgresql/timezone/America/Belem +./share/postgresql/timezone/America/Jujuy +./share/postgresql/timezone/America/St_Thomas +./share/postgresql/timezone/America/Resolute +./share/postgresql/timezone/America/Cuiaba +./share/postgresql/timezone/America/Halifax +./share/postgresql/timezone/America/St_Barthelemy +./share/postgresql/timezone/America/Guatemala +./share/postgresql/timezone/America/Nassau +./share/postgresql/timezone/America/St_Kitts +./share/postgresql/timezone/America/Cordoba +./share/postgresql/timezone/America/Miquelon +./share/postgresql/timezone/America/Bogota +./share/postgresql/timezone/America/Rio_Branco +./share/postgresql/timezone/America/Ensenada +./share/postgresql/timezone/America/Yakutat +./share/postgresql/timezone/America/Noronha +./share/postgresql/timezone/America/Kentucky/Monticello +./share/postgresql/timezone/America/Kentucky/Louisville +./share/postgresql/timezone/America/Porto_Acre +./share/postgresql/timezone/America/Santa_Isabel +./share/postgresql/timezone/America/El_Salvador +./share/postgresql/timezone/America/Yellowknife +./share/postgresql/timezone/America/Cayman +./share/postgresql/timezone/America/Whitehorse +./share/postgresql/timezone/America/Ojinaga +./share/postgresql/timezone/America/Aruba +./share/postgresql/timezone/America/Nome +./share/postgresql/timezone/America/Fortaleza +./share/postgresql/timezone/America/Martinique +./share/postgresql/timezone/America/Recife +./share/postgresql/timezone/America/Knox_IN +./share/postgresql/timezone/America/Guayaquil +./share/postgresql/timezone/America/Goose_Bay +./share/postgresql/timezone/America/Iqaluit +./share/postgresql/timezone/America/Matamoros +./share/postgresql/timezone/America/Lower_Princes +./share/postgresql/timezone/America/Louisville +./share/postgresql/timezone/America/Coral_Harbour +./share/postgresql/timezone/America/Phoenix +./share/postgresql/timezone/America/Guadeloupe +./share/postgresql/timezone/America/Mazatlan +./share/postgresql/timezone/America/Swift_Current +./share/postgresql/timezone/America/Paramaribo +./share/postgresql/timezone/America/Dominica +./share/postgresql/timezone/America/Kralendijk +./share/postgresql/timezone/America/Montserrat +./share/postgresql/timezone/America/St_Vincent +./share/postgresql/timezone/America/Fort_Wayne +./share/postgresql/timezone/America/Dawson +./share/postgresql/timezone/America/Inuvik +./share/postgresql/timezone/America/Adak +./share/postgresql/timezone/America/Managua +./share/postgresql/timezone/America/Puerto_Rico +./share/postgresql/timezone/America/Tortola +./share/postgresql/timezone/America/Chicago +./share/postgresql/timezone/Africa/Lome +./share/postgresql/timezone/Africa/Brazzaville +./share/postgresql/timezone/Africa/Khartoum +./share/postgresql/timezone/Africa/Ceuta +./share/postgresql/timezone/Africa/Djibouti +./share/postgresql/timezone/Africa/Lagos +./share/postgresql/timezone/Africa/Accra +./share/postgresql/timezone/Africa/El_Aaiun +./share/postgresql/timezone/Africa/Malabo +./share/postgresql/timezone/Africa/Windhoek +./share/postgresql/timezone/Africa/Tripoli +./share/postgresql/timezone/Africa/Bissau +./share/postgresql/timezone/Africa/Blantyre +./share/postgresql/timezone/Africa/Kinshasa +./share/postgresql/timezone/Africa/Porto-Novo +./share/postgresql/timezone/Africa/Nairobi +./share/postgresql/timezone/Africa/Ouagadougou +./share/postgresql/timezone/Africa/Asmera +./share/postgresql/timezone/Africa/Cairo +./share/postgresql/timezone/Africa/Lubumbashi +./share/postgresql/timezone/Africa/Tunis +./share/postgresql/timezone/Africa/Dar_es_Salaam +./share/postgresql/timezone/Africa/Casablanca +./share/postgresql/timezone/Africa/Algiers +./share/postgresql/timezone/Africa/Mbabane +./share/postgresql/timezone/Africa/Monrovia +./share/postgresql/timezone/Africa/Nouakchott +./share/postgresql/timezone/Africa/Banjul +./share/postgresql/timezone/Africa/Kampala +./share/postgresql/timezone/Africa/Conakry +./share/postgresql/timezone/Africa/Mogadishu +./share/postgresql/timezone/Africa/Ndjamena +./share/postgresql/timezone/Africa/Niamey +./share/postgresql/timezone/Africa/Lusaka +./share/postgresql/timezone/Africa/Addis_Ababa +./share/postgresql/timezone/Africa/Sao_Tome +./share/postgresql/timezone/Africa/Abidjan +./share/postgresql/timezone/Africa/Harare +./share/postgresql/timezone/Africa/Asmara +./share/postgresql/timezone/Africa/Douala +./share/postgresql/timezone/Africa/Freetown +./share/postgresql/timezone/Africa/Libreville +./share/postgresql/timezone/Africa/Luanda +./share/postgresql/timezone/Africa/Maseru +./share/postgresql/timezone/Africa/Gaborone +./share/postgresql/timezone/Africa/Maputo +./share/postgresql/timezone/Africa/Timbuktu +./share/postgresql/timezone/Africa/Bangui +./share/postgresql/timezone/Africa/Bamako +./share/postgresql/timezone/Africa/Dakar +./share/postgresql/timezone/Africa/Juba +./share/postgresql/timezone/Africa/Bujumbura +./share/postgresql/timezone/Africa/Johannesburg +./share/postgresql/timezone/Africa/Kigali +./share/postgresql/timezone/Eire +./share/postgresql/timezone/Europe/Vaduz +./share/postgresql/timezone/Europe/Podgorica +./share/postgresql/timezone/Europe/Rome +./share/postgresql/timezone/Europe/Vienna +./share/postgresql/timezone/Europe/Dublin +./share/postgresql/timezone/Europe/Zurich +./share/postgresql/timezone/Europe/London +./share/postgresql/timezone/Europe/Monaco +./share/postgresql/timezone/Europe/Sofia +./share/postgresql/timezone/Europe/Uzhgorod +./share/postgresql/timezone/Europe/Minsk +./share/postgresql/timezone/Europe/Malta +./share/postgresql/timezone/Europe/Busingen +./share/postgresql/timezone/Europe/Gibraltar +./share/postgresql/timezone/Europe/Volgograd +./share/postgresql/timezone/Europe/Budapest +./share/postgresql/timezone/Europe/Vatican +./share/postgresql/timezone/Europe/Luxembourg +./share/postgresql/timezone/Europe/Chisinau +./share/postgresql/timezone/Europe/Nicosia +./share/postgresql/timezone/Europe/Warsaw +./share/postgresql/timezone/Europe/San_Marino +./share/postgresql/timezone/Europe/Copenhagen +./share/postgresql/timezone/Europe/Ljubljana +./share/postgresql/timezone/Europe/Athens +./share/postgresql/timezone/Europe/Skopje +./share/postgresql/timezone/Europe/Andorra +./share/postgresql/timezone/Europe/Kaliningrad +./share/postgresql/timezone/Europe/Amsterdam +./share/postgresql/timezone/Europe/Guernsey +./share/postgresql/timezone/Europe/Isle_of_Man +./share/postgresql/timezone/Europe/Tirane +./share/postgresql/timezone/Europe/Jersey +./share/postgresql/timezone/Europe/Madrid +./share/postgresql/timezone/Europe/Helsinki +./share/postgresql/timezone/Europe/Riga +./share/postgresql/timezone/Europe/Zagreb +./share/postgresql/timezone/Europe/Bratislava +./share/postgresql/timezone/Europe/Prague +./share/postgresql/timezone/Europe/Tallinn +./share/postgresql/timezone/Europe/Stockholm +./share/postgresql/timezone/Europe/Tiraspol +./share/postgresql/timezone/Europe/Belgrade +./share/postgresql/timezone/Europe/Bucharest +./share/postgresql/timezone/Europe/Vilnius +./share/postgresql/timezone/Europe/Sarajevo +./share/postgresql/timezone/Europe/Belfast +./share/postgresql/timezone/Europe/Zaporozhye +./share/postgresql/timezone/Europe/Oslo +./share/postgresql/timezone/Europe/Mariehamn +./share/postgresql/timezone/Europe/Moscow +./share/postgresql/timezone/Europe/Brussels +./share/postgresql/timezone/Europe/Paris +./share/postgresql/timezone/Europe/Istanbul +./share/postgresql/timezone/Europe/Simferopol +./share/postgresql/timezone/Europe/Lisbon +./share/postgresql/timezone/Europe/Berlin +./share/postgresql/timezone/Europe/Kiev +./share/postgresql/timezone/Europe/Samara +./share/postgresql/timezone/MST +./share/postgresql/timezone/Asia/Khandyga +./share/postgresql/timezone/Asia/Manila +./share/postgresql/timezone/Asia/Novokuznetsk +./share/postgresql/timezone/Asia/Baghdad +./share/postgresql/timezone/Asia/Macau +./share/postgresql/timezone/Asia/Urumqi +./share/postgresql/timezone/Asia/Ujung_Pandang +./share/postgresql/timezone/Asia/Ulan_Bator +./share/postgresql/timezone/Asia/Bishkek +./share/postgresql/timezone/Asia/Qatar +./share/postgresql/timezone/Asia/Qyzylorda +./share/postgresql/timezone/Asia/Calcutta +./share/postgresql/timezone/Asia/Riyadh87 +./share/postgresql/timezone/Asia/Dushanbe +./share/postgresql/timezone/Asia/Yekaterinburg +./share/postgresql/timezone/Asia/Dhaka +./share/postgresql/timezone/Asia/Jakarta +./share/postgresql/timezone/Asia/Shanghai +./share/postgresql/timezone/Asia/Ulaanbaatar +./share/postgresql/timezone/Asia/Jerusalem +./share/postgresql/timezone/Asia/Ashkhabad +./share/postgresql/timezone/Asia/Tokyo +./share/postgresql/timezone/Asia/Macao +./share/postgresql/timezone/Asia/Krasnoyarsk +./share/postgresql/timezone/Asia/Saigon +./share/postgresql/timezone/Asia/Omsk +./share/postgresql/timezone/Asia/Damascus +./share/postgresql/timezone/Asia/Phnom_Penh +./share/postgresql/timezone/Asia/Bangkok +./share/postgresql/timezone/Asia/Kamchatka +./share/postgresql/timezone/Asia/Choibalsan +./share/postgresql/timezone/Asia/Ust-Nera +./share/postgresql/timezone/Asia/Aden +./share/postgresql/timezone/Asia/Vientiane +./share/postgresql/timezone/Asia/Sakhalin +./share/postgresql/timezone/Asia/Ashgabat +./share/postgresql/timezone/Asia/Katmandu +./share/postgresql/timezone/Asia/Almaty +./share/postgresql/timezone/Asia/Baku +./share/postgresql/timezone/Asia/Nicosia +./share/postgresql/timezone/Asia/Riyadh88 +./share/postgresql/timezone/Asia/Kashgar +./share/postgresql/timezone/Asia/Riyadh89 +./share/postgresql/timezone/Asia/Taipei +./share/postgresql/timezone/Asia/Tehran +./share/postgresql/timezone/Asia/Kabul +./share/postgresql/timezone/Asia/Samarkand +./share/postgresql/timezone/Asia/Kuala_Lumpur +./share/postgresql/timezone/Asia/Tashkent +./share/postgresql/timezone/Asia/Thimbu +./share/postgresql/timezone/Asia/Thimphu +./share/postgresql/timezone/Asia/Yerevan +./share/postgresql/timezone/Asia/Chungking +./share/postgresql/timezone/Asia/Hebron +./share/postgresql/timezone/Asia/Karachi +./share/postgresql/timezone/Asia/Kolkata +./share/postgresql/timezone/Asia/Aqtobe +./share/postgresql/timezone/Asia/Muscat +./share/postgresql/timezone/Asia/Hong_Kong +./share/postgresql/timezone/Asia/Chongqing +./share/postgresql/timezone/Asia/Oral +./share/postgresql/timezone/Asia/Pontianak +./share/postgresql/timezone/Asia/Colombo +./share/postgresql/timezone/Asia/Pyongyang +./share/postgresql/timezone/Asia/Hovd +./share/postgresql/timezone/Asia/Kuwait +./share/postgresql/timezone/Asia/Anadyr +./share/postgresql/timezone/Asia/Kathmandu +./share/postgresql/timezone/Asia/Irkutsk +./share/postgresql/timezone/Asia/Bahrain +./share/postgresql/timezone/Asia/Dubai +./share/postgresql/timezone/Asia/Jayapura +./share/postgresql/timezone/Asia/Riyadh +./share/postgresql/timezone/Asia/Ho_Chi_Minh +./share/postgresql/timezone/Asia/Singapore +./share/postgresql/timezone/Asia/Tel_Aviv +./share/postgresql/timezone/Asia/Dili +./share/postgresql/timezone/Asia/Rangoon +./share/postgresql/timezone/Asia/Harbin +./share/postgresql/timezone/Asia/Yakutsk +./share/postgresql/timezone/Asia/Magadan +./share/postgresql/timezone/Asia/Amman +./share/postgresql/timezone/Asia/Kuching +./share/postgresql/timezone/Asia/Novosibirsk +./share/postgresql/timezone/Asia/Seoul +./share/postgresql/timezone/Asia/Dacca +./share/postgresql/timezone/Asia/Vladivostok +./share/postgresql/timezone/Asia/Istanbul +./share/postgresql/timezone/Asia/Beirut +./share/postgresql/timezone/Asia/Aqtau +./share/postgresql/timezone/Asia/Brunei +./share/postgresql/timezone/Asia/Gaza +./share/postgresql/timezone/Asia/Tbilisi +./share/postgresql/timezone/Asia/Makassar +./share/postgresql/timezone/Asia/Beijing +./share/postgresql/timezone/Navajo +./share/postgresql/timezone/GMT +./share/postgresql/system_views.sql +./share/postgresql/performance_views.sql +./share/postgresql/sql_features.txt +./share/postgresql/pg_cast_oid.txt +./share/postgresql/recovery.conf.sample +./share/postgresql/cm_server.conf.sample +./share/postgresql/cm_agent.conf.sample +./share/postgresql/tsearch_data/english.stop +./share/postgresql/tsearch_data/dutch.stop +./share/postgresql/tsearch_data/hungarian.stop +./share/postgresql/tsearch_data/french.stop +./share/postgresql/tsearch_data/synonym_sample.syn +./share/postgresql/tsearch_data/turkish.stop +./share/postgresql/tsearch_data/portuguese.stop +./share/postgresql/tsearch_data/spanish.stop +./share/postgresql/tsearch_data/hunspell_sample.affix +./share/postgresql/tsearch_data/ispell_sample.affix +./share/postgresql/tsearch_data/danish.stop +./share/postgresql/tsearch_data/german.stop +./share/postgresql/tsearch_data/thesaurus_sample.ths +./share/postgresql/tsearch_data/norwegian.stop +./share/postgresql/tsearch_data/finnish.stop +./share/postgresql/tsearch_data/russian.stop +./share/postgresql/tsearch_data/swedish.stop +./share/postgresql/tsearch_data/ispell_sample.dict +./share/postgresql/tsearch_data/italian.stop +./share/postgresql/information_schema.sql +./share/postgresql/timezonesets/Antarctica.txt +./share/postgresql/timezonesets/Australia.txt +./share/postgresql/timezonesets/Europe.txt +./share/postgresql/timezonesets/America.txt +./share/postgresql/timezonesets/Australia +./share/postgresql/timezonesets/Indian.txt +./share/postgresql/timezonesets/India +./share/postgresql/timezonesets/Pacific.txt +./share/postgresql/timezonesets/Atlantic.txt +./share/postgresql/timezonesets/Africa.txt +./share/postgresql/timezonesets/Asia.txt +./share/postgresql/timezonesets/Default +./share/postgresql/timezonesets/Etc.txt +./share/postgresql/postgres.bki +./share/llvmir/GaussDB_expr.ir +./share/sslcert/gsql/openssl.cnf +./share/sslcert/gds/openssl.cnf +./share/sslcert/grpc/openssl.cnf +./share/sslcert/etcd/openssl.cnf +./lib/libsimsearch/ +./lib/postgresql/latin2_and_win1250.so +./lib/postgresql/euc2004_sjis2004.so +./lib/postgresql/euc_kr_and_mic.so +./lib/postgresql/utf8_and_uhc.so +./lib/postgresql/euc_tw_and_big5.so +./lib/postgresql/cyrillic_and_mic.so +./lib/postgresql/utf8_and_johab.so +./lib/postgresql/utf8_and_gb18030.so +./lib/postgresql/pgxs/src/makefiles/pgxs.mk +./lib/postgresql/pgxs/src/Makefile.shlib +./lib/postgresql/pgxs/src/Makefile.port +./lib/postgresql/pgxs/src/nls-global.mk +./lib/postgresql/pgxs/src/Makefile.global +./lib/postgresql/pgxs/config/install-sh +./lib/postgresql/euc_cn_and_mic.so +./lib/postgresql/latin_and_mic.so +./lib/postgresql/utf8_and_sjis2004.so +./lib/postgresql/utf8_and_euc_jp.so +./lib/postgresql/utf8_and_sjis.so +./lib/postgresql/utf8_and_cyrillic.so +./lib/postgresql/hstore.so +./lib/postgresql/tsdb.so +./lib/postgresql/packages.so +./lib/postgresql/utf8_and_euc_kr.so +./lib/postgresql/ascii_and_mic.so +./lib/postgresql/utf8_and_iso8859_1.so +./lib/postgresql/euc_jp_and_sjis.so +./lib/postgresql/dict_snowball.so +./lib/postgresql/utf8_and_ascii.so +./lib/postgresql/utf8_and_euc_tw.so +./lib/postgresql/utf8_and_iso8859.so +./lib/postgresql/utf8_and_win.so +./lib/postgresql/utf8_and_euc_cn.so +./lib/postgresql/utf8_and_gbk.so +./lib/postgresql/utf8_and_euc2004.so +./lib/postgresql/utf8_and_big5.so +./lib/postgresql/mppdb_decoding.so +./lib/postgresql/gsredistribute.so +./lib/postgresql/dimsearch.so +./lib/postgresql/pg_plugin +./lib/postgresql/proc_srclib +./lib/postgresql/security_plugin.so +./lib/postgresql/pg_upgrade_support.so +./lib/postgresql/java/pljava.jar +./lib/postgresql/postgres_fdw.so +./lib/libpljava.so +./lib/libpq.a +./lib/libpq.so +./lib/libpq.so.5 +./lib/libpq.so.5.5 +./lib/libcgroup.so +./lib/libcgroup.so.1 +./lib/libcom_err_gauss.so +./lib/libcom_err_gauss.so.3 +./lib/libcom_err_gauss.so.3.0 +./lib/libatomic.so +./lib/libatomic.so.1 +./lib/libatomic.so.1.2.0 +./lib/libgpr.so +./lib/libgpr.so.9 +./lib/libgpr.so.9.0.0 +./lib/libgrpc.so +./lib/libgrpc++.so +./lib/libgrpc++.so.1 +./lib/libgrpc++.so.1.28.1 +./lib/libgrpc.so.9 +./lib/libgrpc.so.9.0.0 +./lib/libupb.so +./lib/libupb.so.9 +./lib/libupb.so.9.0.0 +./lib/libabsl_str_format_internal.so +./lib/libabsl_strings.so +./lib/libabsl_throw_delegate.so +./lib/libabsl_strings_internal.so +./lib/libabsl_base.so +./lib/libabsl_dynamic_annotations.so +./lib/libabsl_spinlock_wait.so +./lib/libabsl_int128.so +./lib/libabsl_bad_optional_access.so +./lib/libabsl_raw_logging_internal.so +./lib/libabsl_log_severity.so +./lib/libaddress_sorting.so +./lib/libaddress_sorting.so.9 +./lib/libgssapi_krb5_gauss.so +./lib/libgssapi_krb5_gauss.so.2 +./lib/libgssapi_krb5_gauss.so.2.2 +./lib/libgssrpc_gauss.so +./lib/libgssrpc_gauss.so.4 +./lib/libgssrpc_gauss.so.4.2 +./lib/libk5crypto_gauss.so +./lib/libk5crypto_gauss.so.3 +./lib/libk5crypto_gauss.so.3.1 +./lib/libkadm5clnt.so +./lib/libkadm5clnt_mit.so +./lib/libkadm5clnt_mit.so.11 +./lib/libkadm5clnt_mit.so.11.0 +./lib/libkadm5srv.so +./lib/libkadm5srv_mit.so +./lib/libkadm5srv_mit.so.11 +./lib/libkadm5srv_mit.so.11.0 +./lib/libkdb5.so +./lib/libkdb5.so.9 +./lib/libkdb5.so.9.0 +./lib/libkrad.so +./lib/libkrad.so.0 +./lib/libkrad.so.0.0 +./lib/libkrb5_gauss.so +./lib/libkrb5_gauss.so.3 +./lib/libkrb5_gauss.so.3.3 +./lib/libkrb5support_gauss.so +./lib/libkrb5support_gauss.so.0 +./lib/libkrb5support_gauss.so.0.1 +./lib/krb5/plugins/kdb/db2.so +./lib/libverto.so +./lib/libverto.so.0 +./lib/libverto.so.0.0 +./lib/libcrypto.so +./lib/libcrypto.so.1.1 +./lib/libssl.so +./lib/libssl.so.1.1 +./lib/libgcc_s.so.1 +./lib/libstdc++.so.6 +./lib/libz.so +./lib/libz.so.1 +./lib/libz.so.1.2.11 +./lib/liblz4.so +./lib/liblz4.so.1 +./lib/liblz4.so.1.9.2 +./lib/libcjson.so +./lib/libcjson.so.1 +./lib/libcjson.so.1.7.13 +./lib/libconfig.so +./lib/libconfig.so.4 +./lib/libpgport_tool.so +./lib/libpgport_tool.so.1 +./share/llvmir/GaussDB_expr.ir +./lib/libeSDKLogAPI.so +./lib/libeSDKOBS.so +./lib/liblog4cpp.so +./lib/liblog4cpp.so.5 +./lib/liblog4cpp.so.5.0.6 +./lib/libcharset.so +./lib/libcharset.so.1 +./lib/libcharset.so.1.0.0 +./lib/libiconv.so +./lib/libiconv.so.2 +./lib/libiconv.so.2.6.1 +./lib/libnghttp2.so +./lib/libnghttp2.so.14 +./lib/libnghttp2.so.14.18.0 +./lib/libpcre.so +./lib/libpcre.so.1 +./lib/libpcre.so.1.2.12 +./lib/libsecurec.so +./lib/libxml2.so +./lib/libxml2.so.2 +./lib/libxml2.so.2.9.9 +./lib/libparquet.so +./lib/libparquet.so.11 +./lib/libparquet.so.11.1.0 +./lib/OBS.ini +./lib/postgresql/latin2_and_win1250.so +./lib/postgresql/euc2004_sjis2004.so +./lib/libhll.so + + +./include/postgresql/server/postgres_ext.h +./include/postgresql/server/pg_config_os.h +./include/postgresql/server/pgtime.h +./include/postgresql/server/nodes/primnodes.h +./include/postgresql/server/nodes/parsenodes.h +./include/postgresql/server/nodes/bitmapset.h +./include/postgresql/server/nodes/pg_list.h +./include/postgresql/server/nodes/value.h +./include/postgresql/server/nodes/nodes.h +./include/postgresql/server/utils/sortsupport.h +./include/postgresql/server/utils/varbit.h +./include/postgresql/server/utils/spccache.h +./include/postgresql/server/utils/rangetypes.h +./include/postgresql/server/utils/plpgsql.h +./include/postgresql/server/utils/memtrack.h +./include/postgresql/server/utils/pg_locale.h +./include/postgresql/server/utils/tzparser.h +./include/postgresql/server/utils/syscall_lock.h +./include/postgresql/server/utils/partitionmap.h +./include/postgresql/server/utils/array.h +./include/postgresql/server/utils/relmapper.h +./include/postgresql/server/utils/hsearch.h +./include/postgresql/server/utils/xml.h +./include/postgresql/server/utils/bytea.h +./include/postgresql/server/utils/relcache.h +./include/postgresql/server/utils/pg_rusage.h +./include/postgresql/server/utils/numeric.h +./include/postgresql/server/utils/mmpool.h +./include/postgresql/server/utils/nabstime.h +./include/postgresql/server/utils/fmgrtab.h +./include/postgresql/server/utils/snapmgr.h +./include/postgresql/server/utils/syscache.h +./include/postgresql/server/utils/logtape.h +./include/postgresql/server/utils/datum.h +./include/postgresql/server/utils/guc_tables.h +./include/postgresql/server/utils/snapshot.h +./include/postgresql/server/utils/geo_decls.h +./include/postgresql/server/utils/errcodes.h +./include/postgresql/server/utils/inval.h +./include/postgresql/server/utils/help_config.h +./include/postgresql/server/utils/distribute_test.h +./include/postgresql/server/utils/aiomem.h +./include/postgresql/server/utils/tuplestore.h +./include/postgresql/server/utils/rbtree.h +./include/postgresql/server/utils/gs_bitmap.h +./include/postgresql/server/utils/tuplesort.h +./include/postgresql/server/utils/tqual.h +./include/postgresql/server/utils/ps_status.h +./include/postgresql/server/utils/palloc.h +./include/postgresql/server/utils/reltrigger.h +./include/postgresql/server/utils/acl.h +./include/postgresql/server/utils/ascii.h +./include/postgresql/server/utils/selfuncs.h +./include/postgresql/server/utils/json.h +./include/postgresql/server/utils/portal.h +./include/postgresql/server/utils/atomic.h +./include/postgresql/server/utils/elog.h +./include/postgresql/server/utils/date.h +./include/postgresql/server/utils/plancache.h +./include/postgresql/server/utils/int8.h +./include/postgresql/server/utils/timestamp.h +./include/postgresql/server/utils/bloom_filter.h +./include/postgresql/server/utils/fmgroids.h +./include/postgresql/server/utils/pg_crc_tables.h +./include/postgresql/server/utils/probes.h +./include/postgresql/server/utils/datetime.h +./include/postgresql/server/utils/inet.h +./include/postgresql/server/utils/pg_lzcompress.h +./include/postgresql/server/utils/pg_crc.h +./include/postgresql/server/utils/attoptcache.h +./include/postgresql/server/utils/dynahash.h +./include/postgresql/server/utils/rel.h +./include/postgresql/server/utils/partcache.h +./include/postgresql/server/utils/lsyscache.h +./include/postgresql/server/utils/memutils.h +./include/postgresql/server/utils/memprot.h +./include/postgresql/server/utils/uuid.h +./include/postgresql/server/utils/combocid.h +./include/postgresql/server/utils/builtins.h +./include/postgresql/server/utils/guc.h +./include/postgresql/server/utils/dfs_vector.h +./include/postgresql/server/utils/dynamic_loader.h +./include/postgresql/server/utils/resowner.h +./include/postgresql/server/utils/aes.h +./include/postgresql/server/utils/cash.h +./include/postgresql/server/utils/typcache.h +./include/postgresql/server/utils/formatting.h +./include/postgresql/server/utils/partitionkey.h +./include/postgresql/server/utils/aset.h +./include/postgresql/server/utils/catcache.h +./include/postgresql/server/utils/atomic_arm.h +./include/postgresql/server/datatype/timestamp.h +./include/postgresql/server/access/rmgr.h +./include/postgresql/server/access/xlogreader.h +./include/postgresql/server/access/xlog_basic.h +./include/postgresql/server/access/tupdesc.h +./include/postgresql/server/access/rmgrlist.h +./include/postgresql/server/access/htup.h +./include/postgresql/server/access/xlogdefs.h +./include/postgresql/server/access/attnum.h +./include/postgresql/server/access/tupmacs.h +./include/postgresql/server/access/xlogrecord.h +./include/postgresql/server/tcop/dest.h +./include/postgresql/server/catalog/pg_type.h +./include/postgresql/server/catalog/pg_attribute.h +./include/postgresql/server/catalog/genbki.h +./include/postgresql/server/gs_thread.h +./include/postgresql/server/port/pg_bswap.h +./include/postgresql/server/port/pg_crc32c.h +./include/postgresql/server/securec.h +./include/postgresql/server/securectype.h +./include/postgresql/server/storage/off.h +./include/postgresql/server/storage/block.h +./include/postgresql/server/storage/item.h +./include/postgresql/server/storage/relfilenode.h +./include/postgresql/server/storage/bufpage.h +./include/postgresql/server/storage/spin.h +./include/postgresql/server/storage/buf.h +./include/postgresql/server/storage/itemid.h +./include/postgresql/server/storage/pg_sema.h +./include/postgresql/server/storage/itemptr.h +./include/postgresql/server/storage/s_lock.h +./include/postgresql/server/storage/backendid.h +./include/postgresql/server/storage/lock.h +./include/postgresql/server/storage/lwlock.h +./include/postgresql/server/storage/barrier.h +./include/postgresql/server/storage/shmem.h +./include/postgresql/server/pg_config.h +./include/postgresql/server/lib/stringinfo.h +./include/postgresql/server/fmgr.h +./include/postgresql/server/fmgr/fmgr_comp.h +./include/postgresql/server/fmgr/fmgr_core.h +./include/postgresql/server/gs_threadlocal.h +./include/postgresql/server/postgres.h +./include/postgresql/server/executor/tuptable.h +./include/postgresql/server/pg_config_manual.h +./include/postgresql/server/mb/pg_wchar.h +./include/postgresql/server/c.h +./include/postgresql/server/port.h +./include/postgresql/server/utils/be_module.h +./include/postgresql/server/nodes/params.h +./include/postgresql/server/securec_check.h +./include/postgresql/server/nodes/memnodes.h +./include/postgresql/server/access/skey.h +./include/postgresql/server/lib/dllist.h +./include/postgresql/server/lib/ilist.h +./include/postgresql/server/pgxc/locator.h +./include/postgresql/server/gstrace/gstrace_infra.h +./include/postgresql/server/extension_dependency.h +./jre/ASSEMBLY_EXCEPTION +./jre/bin/java +./jre/bin/jjs +./jre/bin/keytool +./jre/bin/orbd +./jre/bin/pack200 +./jre/bin/policytool +./jre/bin/rmid +./jre/bin/rmiregistry +./jre/bin/servertool +./jre/bin/tnameserv +./jre/bin/unpack200 +./jre/lib/amd64/jli/libjli.so +./jre/lib/amd64/jvm.cfg +./jre/lib/amd64/libattach.so +./jre/lib/amd64/libavplugin-ffmpeg-58.so +./jre/lib/amd64/libawt_headless.so +./jre/lib/amd64/libawt.so +./jre/lib/amd64/libawt_xawt.so +./jre/lib/amd64/libdecora_sse.so +./jre/lib/amd64/libdt_socket.so +./jre/lib/amd64/libfontmanager.so +./jre/lib/amd64/libfxplugins.so +./jre/lib/amd64/libglassgtk2.so +./jre/lib/amd64/libglassgtk3.so +./jre/lib/amd64/libglass.so +./jre/lib/amd64/libgstreamer-lite.so +./jre/lib/amd64/libhprof.so +./jre/lib/amd64/libinstrument.so +./jre/lib/amd64/libj2gss.so +./jre/lib/amd64/libj2pcsc.so +./jre/lib/amd64/libj2pkcs11.so +./jre/lib/amd64/libjaas_unix.so +./jre/lib/amd64/libjava_crw_demo.so +./jre/lib/amd64/libjavafx_font_freetype.so +./jre/lib/amd64/libjavafx_font_pango.so +./jre/lib/amd64/libjavafx_font.so +./jre/lib/amd64/libjavafx_iio.so +./jre/lib/amd64/libjava.so +./jre/lib/amd64/libjawt.so +./jre/lib/amd64/libjdwp.so +./jre/lib/amd64/libjfxmedia.so +./jre/lib/amd64/libjfxwebkit.so +./jre/lib/amd64/libjpeg.so +./jre/lib/amd64/libjsdt.so +./jre/lib/amd64/libjsig.so +./jre/lib/amd64/libjsoundalsa.so +./jre/lib/amd64/libjsound.so +./jre/lib/amd64/liblcms.so +./jre/lib/amd64/libmanagement.so +./jre/lib/amd64/libmlib_image.so +./jre/lib/amd64/libnet.so +./jre/lib/amd64/libnio.so +./jre/lib/amd64/libnpt.so +./jre/lib/amd64/libprism_common.so +./jre/lib/amd64/libprism_es2.so +./jre/lib/amd64/libprism_sw.so +./jre/lib/amd64/libsaproc.so +./jre/lib/amd64/libsctp.so +./jre/lib/amd64/libsplashscreen.so +./jre/lib/amd64/libsunec.so +./jre/lib/amd64/libunpack.so +./jre/lib/amd64/libverify.so +./jre/lib/amd64/libzip.so +./jre/lib/amd64/server/libjvm.so +./jre/lib/amd64/server/Xusage.txt +./jre/lib/calendars.properties +./jre/lib/charsets.jar +./jre/lib/classlist +./jre/lib/cmm/CIEXYZ.pf +./jre/lib/cmm/GRAY.pf +./jre/lib/cmm/LINEAR_RGB.pf +./jre/lib/cmm/PYCC.pf +./jre/lib/cmm/sRGB.pf +./jre/lib/content-types.properties +./jre/lib/currency.data +./jre/lib/ext/cldrdata.jar +./jre/lib/ext/dnsns.jar +./jre/lib/ext/jaccess.jar +./jre/lib/ext/jfxrt.jar +./jre/lib/ext/localedata.jar +./jre/lib/ext/meta-index +./jre/lib/ext/nashorn.jar +./jre/lib/ext/sunec.jar +./jre/lib/ext/sunjce_provider.jar +./jre/lib/ext/sunpkcs11.jar +./jre/lib/ext/zipfs.jar +./jre/lib/flavormap.properties +./jre/lib/fontconfig.Euler.properties +./jre/lib/fontconfig.properties +./jre/lib/fontconfig.Ubuntu.properties +./jre/lib/fonts/Roboto-Regular.ttf +./jre/lib/hijrah-config-umalqura.properties +./jre/lib/images/cursors/cursors.properties +./jre/lib/images/cursors/invalid32x32.gif +./jre/lib/images/cursors/motif_CopyDrop32x32.gif +./jre/lib/images/cursors/motif_CopyNoDrop32x32.gif +./jre/lib/images/cursors/motif_LinkDrop32x32.gif +./jre/lib/images/cursors/motif_LinkNoDrop32x32.gif +./jre/lib/images/cursors/motif_MoveDrop32x32.gif +./jre/lib/images/cursors/motif_MoveNoDrop32x32.gif +./jre/lib/javafx.properties +./jre/lib/jce.jar +./jre/lib/jexec +./jre/lib/jfr/default.jfc +./jre/lib/jfr.jar +./jre/lib/jfr/profile.jfc +./jre/lib/jfxswt.jar +./jre/lib/jsse.jar +./jre/lib/jvm.hprof.txt +./jre/lib/logging.properties +./jre/lib/management-agent.jar +./jre/lib/management/jmxremote.access +./jre/lib/management/jmxremote.password.template +./jre/lib/management/management.properties +./jre/lib/management/snmp.acl.template +./jre/lib/meta-index +./jre/lib/net.properties +./jre/lib/psfontj2d.properties +./jre/lib/psfont.properties.ja +./jre/lib/resources.jar +./jre/lib/rt.jar +./jre/lib/security/blacklisted.certs +./jre/lib/security/cacerts +./jre/lib/security/java.policy +./jre/lib/security/java.security +./jre/lib/security/policy/limited/local_policy.jar +./jre/lib/security/policy/limited/US_export_policy.jar +./jre/lib/security/policy/unlimited/local_policy.jar +./jre/lib/security/policy/unlimited/US_export_policy.jar +./jre/lib/sound.properties +./jre/lib/tzdb.dat +./jre/LICENSE +./jre/THIRD_PARTY_README +[client] +./bin/gsql +./bin/gs_dump +./bin/gs_dumpall +./bin/gs_restore +./jdbc/gsjdbc4.jar +./jdbc/gsjdbc200.jar +./lib/postgresql/latin2_and_win1250.so +./lib/postgresql/euc2004_sjis2004.so +./lib/postgresql/euc_kr_and_mic.so +./lib/postgresql/utf8_and_uhc.so +./lib/postgresql/euc_tw_and_big5.so +./lib/postgresql/cyrillic_and_mic.so +./lib/postgresql/utf8_and_johab.so +./lib/postgresql/utf8_and_gb18030.so +./lib/postgresql/pgxs/src/makefiles/pgxs.mk +./lib/postgresql/pgxs/src/Makefile.shlib +./lib/postgresql/pgxs/src/Makefile.port +./lib/postgresql/pgxs/src/nls-global.mk +./lib/postgresql/pgxs/src/Makefile.global +./lib/postgresql/pgxs/config/install-sh +./lib/postgresql/euc_cn_and_mic.so +./lib/postgresql/latin_and_mic.so +./lib/postgresql/utf8_and_sjis2004.so +./lib/postgresql/utf8_and_euc_jp.so +./lib/postgresql/utf8_and_sjis.so +./lib/postgresql/utf8_and_cyrillic.so +./lib/postgresql/utf8_and_euc_kr.so +./lib/postgresql/ascii_and_mic.so +./lib/postgresql/utf8_and_iso8859_1.so +./lib/postgresql/euc_jp_and_sjis.so +./lib/postgresql/dict_snowball.so +./lib/postgresql/utf8_and_ascii.so +./lib/postgresql/utf8_and_euc_tw.so +./lib/postgresql/utf8_and_iso8859.so +./lib/postgresql/utf8_and_win.so +./lib/postgresql/utf8_and_euc_cn.so +./lib/postgresql/utf8_and_gbk.so +./lib/postgresql/utf8_and_euc2004.so +./lib/postgresql/utf8_and_big5.so +./lib/postgresql/java/pljava.jar +./lib/libpljava.so +./lib/libpq.a +./lib/libpq.so +./lib/libpq.so.5 +./lib/libpq.so.5.5 +./lib/libcrypto.so +./lib/libcrypto.so.1.1 +./lib/libssl.so +./lib/libssl.so.1.1 +./lib/libgssapi_krb5_gauss.so +./lib/libgssapi_krb5_gauss.so.2 +./lib/libgssapi_krb5_gauss.so.2.2 +./lib/libgssrpc_gauss.so +./lib/libgssrpc_gauss.so.4 +./lib/libgssrpc_gauss.so.4.2 +./lib/libk5crypto_gauss.so +./lib/libk5crypto_gauss.so.3 +./lib/libk5crypto_gauss.so.3.1 +./lib/libkrb5support_gauss.so +./lib/libkrb5support_gauss.so.0 +./lib/libkrb5support_gauss.so.0.1 +./lib/libkrb5_gauss.so +./lib/libkrb5_gauss.so.3 +./lib/libkrb5_gauss.so.3.3 +./lib/libcom_err_gauss.so +./lib/libcom_err_gauss.so.3 +./lib/libcom_err_gauss.so.3.0 +./odbc/lib/psqlodbcw.la +./odbc/lib/psqlodbcw.so +[libpq] +./lib/libpq.a +./lib/libpq.so +./lib/libpq.so.5 +./lib/libpq.so.5.5 +./lib/libconfig.so +./lib/libconfig.so.4 +./lib/libcrypto.so +./lib/libcrypto.so.1.1 +./lib/libssl.so +./lib/libcmpq.so +./lib/libcmpq.so.1 +./lib/libssl.so.1.1 +./lib/libpgport_tool.so +./lib/libpgport_tool.so.1 +./lib/libgssapi_krb5_gauss.so +./lib/libgssapi_krb5_gauss.so.2 +./lib/libgssapi_krb5_gauss.so.2.2 +./lib/libgssrpc_gauss.so +./lib/libgssrpc_gauss.so.4 +./lib/libgssrpc_gauss.so.4.2 +./lib/libk5crypto_gauss.so +./lib/libk5crypto_gauss.so.3 +./lib/libk5crypto_gauss.so.3.1 +./lib/libkrb5support_gauss.so +./lib/libkrb5support_gauss.so.0 +./lib/libkrb5support_gauss.so.0.1 +./lib/libkrb5_gauss.so +./lib/libkrb5_gauss.so.3 +./lib/libkrb5_gauss.so.3.3 +./lib/libcom_err_gauss.so +./lib/libcom_err_gauss.so.3 +./lib/libcom_err_gauss.so.3.0 +[cmlibrary] +./lib/libconfig.a +./lib/libcmclient.a +./lib/libcmcommon.a +./lib/libcmpq.a +./lib/libpgport.a +[header] +./include/libpq-fe.h +./include/postgres_ext.h +./include/gs_thread.h +./include/gs_threadlocal.h +./include/pg_config.h +./include/pg_config_manual.h +./include/pg_config_os.h +[version] +V500R001C20 +[script] +./script/__init__.py +./script/gs_check +./script/gs_checkos +./script/gs_checkperf +./script/gs_collector +./script/gs_backup +./script/gs_expand +./script/gs_install +./script/gs_om +./script/gs_hotpatch +./script/gs_postuninstall +./script/gs_preinstall +./script/gs_replace +./script/gs_shrink +./script/gs_ssh +./script/gs_sshexkey +./script/gs_uninstall +./script/gs_upgradectl +./script/gs_lcctl +./script/gs_resize +./script/uninstall_force.py +./script/checkRunStatus.py +./script/JsonToDbClustorInfo.py +./script/nodegroup_migrate.sh diff --git a/build/script/package_opengauss.sh b/build/script/package_opengauss.sh index 3bad51310..af59cbb76 100644 --- a/build/script/package_opengauss.sh +++ b/build/script/package_opengauss.sh @@ -110,11 +110,11 @@ else fi SCRIPT_DIR=$(cd $(dirname $SCRIPT_PATH) && pwd) - -package_path=$SCRIPT_DIR +test -d ${SCRIPT_DIR}/../../output || mkdir -p ${SCRIPT_DIR}/../../output +output_path=$(cd ${SCRIPT_DIR}/../../output && pwd) ####################################################################### -##version 1.0.1 +##version 1.1.0 ####################################################################### function read_srv_version() { @@ -124,8 +124,16 @@ function read_srv_version() #auto read the number from kernal globals.cpp, no need to change it here } -read_srv_version +function deploy_pkgs() +{ + for pkg in $@; do + if [ -f $pkg ]; then + mv $pkg $output_path/ + fi + done +} +read_srv_version ######################################################################### ##read command line paramenters @@ -281,6 +289,7 @@ function install_gaussdb() ./separate_debug_information.sh cd $SCRIPT_DIR mv symbols.tar.gz $kernel_symbol_package_name + deploy_pkgs $kernel_symbol_package_name fi #insert the commitid to version.cfg as the upgrade app path specification @@ -388,7 +397,8 @@ function make_package_srv() mkdir -p temp mkdir -p ${BUILD_DIR}/temp/etc target_file_copy "$copydest" ${BUILD_DIR}/temp - mv ${sha256_name} ${kernel_package_name} ${package_path} + + deploy_pkgs ${sha256_name} ${kernel_package_name} echo "make server(all) package success!" } @@ -420,7 +430,8 @@ function make_package_upgrade_sql() chmod 600 ${UPGRADE_SQL_TAR} chmod 600 ${UPGRADE_SQL_SHA256} - mv ${UPGRADE_SQL_TAR} ${UPGRADE_SQL_SHA256} ${package_path} + + deploy_pkgs ${UPGRADE_SQL_TAR} ${UPGRADE_SQL_SHA256} echo "Successfully packaged upgrade_sql files." } @@ -485,8 +496,9 @@ function make_package_libpq() if [ $? -ne 0 ]; then die "$package_command ${libpq_package_name} failed" fi - mv ${libpq_package_name} ${package_path} - echo "install $pkgname tools is ${libpq_package_name} of ${package_path} directory " >> "$LOG_FILE" 2>&1 + + deploy_pkgs ${libpq_package_name} + echo "install $pkgname tools is ${libpq_package_name} of ${output_path} directory " >> "$LOG_FILE" 2>&1 echo "success!" } @@ -541,8 +553,9 @@ function make_package_tools() if [ $? -ne 0 ]; then die "$package_command ${tools_package_name} failed" fi - mv ${tools_package_name} ${package_path} - echo "install $pkgname tools is ${tools_package_name} of ${package_path} directory " >> "$LOG_FILE" 2>&1 + + deploy_pkgs ${tools_package_name} + echo "install $pkgname tools is ${tools_package_name} of ${output_path} directory " >> "$LOG_FILE" 2>&1 echo "success!" } diff --git a/configure b/configure index ec5e3efbe..bc31c372e 100755 --- a/configure +++ b/configure @@ -2650,10 +2650,10 @@ $as_echo "$as_me: error: argument required for --with-gs-version option" >&2;} else product=$(cat build/script/gauss.spec | grep 'PRODUCT' | awk -F "=" '{print $2}') version=$(cat build/script/gauss.spec | grep 'VERSION' | awk -F "=" '{print $2}') - gitversion=$(git log | grep commit | head -1 | awk '{print $2}' | cut -b 1-8) - commits=$(git log | grep "See in merge request" | wc -l) + gitversion=$(git log 2>/dev/null | grep commit | head -1 | awk '{print $2}' | cut -b 1-8) + commits=$(git log 2>/dev/null | grep "See in merge request" | wc -l) debug_str="" - mrid=$(git log | grep "See merge request" | head -1 | awk -F! '{print $2}' | grep -o '[0-9]\+') + mrid=$(git log 2>/dev/null | grep "See merge request" | head -1 | awk -F! '{print $2}' | grep -o '[0-9]\+') if test "$enable_debug" = yes; then debug_str="debug" fi diff --git a/src/Makefile.global.in b/src/Makefile.global.in index c48c9f3a8..8e7df3a46 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -319,7 +319,7 @@ ifeq ($(with_3rd), NONE) LIBNANOMSG_HOME = $(top_builddir)/$(BINARYPATH)/nanomsg/comm HLL_HOME = $(top_builddir)/$(BINARYPATH)/postgresql-hll/$(LIB_SUPPORT_LLT) PLJAVA_HOME = $(top_builddir)/$(BINARYPATH)/pljava/$(LIB_SUPPORT_LLT) - MASSTREE_HOME = $(top_builddir)/dependency/masstree + MASSTREE_HOME = $(top_builddir)/$(BINARYPATH)/masstree/comm MYFDW_HOME = $(top_builddir)/dependency/mysql_fdw ORCFDW_HOME = $(top_builddir)/dependency/oracle_fdw PLDBG_HOME = $(top_builddir)/dependency/pldebugger @@ -371,7 +371,7 @@ else LIBNANOMSG_HOME = $(with_3rd)/$(BINARYPATH)/nanomsg/comm HLL_HOME = $(with_3rd)/$(BINARYPATH)/postgresql-hll/$(LIB_SUPPORT_LLT) PLJAVA_HOME = $(with_3rd)/$(BINARYPATH)/pljava/$(LIB_SUPPORT_LLT) - MASSTREE_HOME = $(with_3rd)/dependency/masstree + MASSTREE_HOME = $(with_3rd)/$(BINARYPATH)/masstree/comm MYFDW_HOME = $(with_3rd)/dependency/mysql_fdw ORCFDW_HOME = $(with_3rd)/dependency/oracle_fdw PLDBG_HOME = $(with_3rd)/dependency/pldebugger @@ -680,6 +680,12 @@ NUMA_LIB_PATH = $(NUMA_HOME)/lib LIBCURL_INCLUDE_PATH = $(LIBCURL_HOME)/include LIBCURL_LIB_PATH = $(LIBCURL_HOME)/lib +############################################################################# +# masstree component +############################################################################# +MASSTREE_INCLUDE_PATH = $(MASSTREE_HOME)/include +MASSTREE_LIB_PATH = $(MASSTREE_HOME)/lib + ############################################################################ # # Programs and flags @@ -733,6 +739,10 @@ ifeq ($(SUPPORT_HOTPATCH), yes) override CPPFLAGS := $(CPPFLAGS) -I$(LIBHOTPATCH_INCLUDE_PATH) endif +ifeq ($(enable_mot), yes) + override CPPFLAGS := $(CPPFLAGS) -I$(MASSTREE_INCLUDE_PATH) +endif + CC = @CC@ GCC = @GCC@ C = gcc @@ -866,6 +876,9 @@ endif LDFLAGS += -L$(GSTRACE_LIB_PATH) LDFLAGS += -L$(NUMA_LIB_PATH) LDFLAGS += -L$(LIBCURL_LIB_PATH) +ifeq ($(enable_mot), yes) + LDFLAGS += -L$(MASSTREE_LIB_PATH) +endif LDFLAGS += @LDFLAGS@ LDFLAGS_EX = @LDFLAGS_EX@ diff --git a/src/bin/pg_probackup/Makefile b/src/bin/pg_probackup/Makefile index 7ded1f672..aa82900de 100644 --- a/src/bin/pg_probackup/Makefile +++ b/src/bin/pg_probackup/Makefile @@ -32,7 +32,7 @@ top_builddir = ../../.. include $(top_builddir)/src/Makefile.global EXTRA_CLEAN += logging.h -override CXXFLAGS := -std=c++11 -D_GLIBCXX_USE_CXX11_ABI=0 -fsigned-char -DHAVE_LIBZ -DSTREAMPLAN -DPGXC -O0 -g -DENABLE_GSTRACE -fpermissive -Wl,-z,relro,-z,now +override CXXFLAGS := -std=c++11 -D_GLIBCXX_USE_CXX11_ABI=0 -fsigned-char -DHAVE_LIBZ -DSTREAMPLAN -DPGXC -O0 -g -DENABLE_GSTRACE -Wl,-z,relro,-z,now LDFLAGS += -L$(LZ4_LIB_PATH) LIBS += -lgssapi_krb5_gauss -lgssrpc_gauss -lkrb5_gauss -lkrb5support_gauss -lk5crypto_gauss -lcom_err_gauss -llz4 PG_CPPFLAGS = -I$(libpq_srcdir) ${PTHREAD_CFLAGS} -Isrc -I$(top_builddir)/$(subdir) -I$(LZ4_INCLUDE_PATH) -I$(ZLIB_INCLUDE_PATH) diff --git a/src/bin/pg_probackup/backup.cpp b/src/bin/pg_probackup/backup.cpp index a3d5a6ec8..d4748d003 100644 --- a/src/bin/pg_probackup/backup.cpp +++ b/src/bin/pg_probackup/backup.cpp @@ -1719,7 +1719,7 @@ void write_table_label_and_tablespace_map(pgBackup *backup, PGresult *res, } -void pg_stop_backup_sent(PGconn *conn, char **stop_backup_query) +void pg_stop_backup_sent(PGconn *conn, const char **stop_backup_query) { if (!pg_stop_backup_is_sent) { bool sent = false; diff --git a/src/bin/pg_probackup/catalog.cpp b/src/bin/pg_probackup/catalog.cpp index d4cd1e47d..76f9596bd 100644 --- a/src/bin/pg_probackup/catalog.cpp +++ b/src/bin/pg_probackup/catalog.cpp @@ -1184,8 +1184,8 @@ walk_files_collect_timelines(InstanceConfig *instance) save_backupinfo_belong_timelines(instance, timelineinfos); if (xlog_files_list) { - parray_walk(xlog_files_list, pgFileFree); - parray_free(xlog_files_list); + parray_walk(xlog_files_list, pfree); + parray_free(xlog_files_list); } return timelineinfos; diff --git a/src/gausskernel/Makefile b/src/gausskernel/Makefile index 121bd10b7..b8701e869 100644 --- a/src/gausskernel/Makefile +++ b/src/gausskernel/Makefile @@ -155,8 +155,8 @@ JARPLJAVA = pljava.jar # MOT component ############################################################################## ifeq ($(enable_mot), yes) - LIBS += -latomic -lmot_engine - LDFLAGS += -L$(top_builddir)/src/gausskernel/storage/mot/core/bin + LIBS += -latomic -lmot_engine -lmasstree + LDFLAGS += -L$(top_builddir)/src/gausskernel/storage/mot/core/bin -L$(MASSTREE_LIB_PATH) CXXFLAGS += -I$(JEMALLOC_INCLUDE_PATH) endif @@ -644,6 +644,9 @@ endif ifneq (, $(findstring __USE_NUMA, $(CFLAGS))) cp $(NUMA_LIB_PATH)/* '$(DESTDIR)$(libdir)/' endif +ifeq ($(enable_mot), yes) + cp -d $(MASSTREE_LIB_PATH)/libmasstree* '$(DESTDIR)$(libdir)/' +endif ifeq ($(with_3rd), NONE) cp $(top_builddir)/$(BUILD_TOOLS_PATH)/gcc$(subst .0,,$(CC_VERSION))/gcc/lib64/libstdc++.so.6 '$(DESTDIR)$(libdir)/' cp $(top_builddir)/$(BUILD_TOOLS_PATH)/gcc$(subst .0,,$(CC_VERSION))/gcc/lib64/libgcc_s.so.1 '$(DESTDIR)$(libdir)/' diff --git a/src/gausskernel/optimizer/commands/explain.cpp b/src/gausskernel/optimizer/commands/explain.cpp index 548aebec1..6b4f86eb5 100755 --- a/src/gausskernel/optimizer/commands/explain.cpp +++ b/src/gausskernel/optimizer/commands/explain.cpp @@ -938,11 +938,7 @@ void ExplainOnePlan( * and than calling ExecutorStart for ExecInitNode in CN. */ /* only stream plan can use u_sess->instr_cxt.global_instr to collect executor info */ -#ifdef ENABLE_MULTIPLE_NODES if (IS_PGXC_COORDINATOR && queryDesc->plannedstmt->is_stream_plan == true && -#else - if (queryDesc->plannedstmt->is_stream_plan == true && -#endif check_stream_support() && instrument_option != 0 && u_sess->instr_cxt.global_instr == NULL && queryDesc->plannedstmt->num_nodes != 0) { int dop = queryDesc->plannedstmt->query_dop; @@ -1129,7 +1125,7 @@ void ExplainOnePlan( /* Check plan was influenced by row level security or not, here need to skip remote dummy node */ if (range_table_walker( - plannedstmt->rtable, (bool (*)())ContainRlsQualInRteWalker, NULL, QTW_EXAMINE_RTES | QTW_IGNORE_DUMMY)) { + plannedstmt->rtable, (bool (*)())ContainRlsQualInRteWalker, NULL, QTW_EXAMINE_RTES | QTW_IGNORE_DUMMY)) { if (t_thrd.explain_cxt.explain_perf_mode != EXPLAIN_NORMAL && es->planinfo != NULL && es->planinfo->m_detailInfo != NULL) { appendStringInfo(es->planinfo->m_detailInfo->info_str, @@ -5436,10 +5432,7 @@ static void show_buffers(ExplainState* es, StringInfo infostr, const Instrumenta appendStringInfoSpaces(es->str, es->indent * 2); show_buffers_info(infostr, has_shared, has_local, has_temp, usage); } else if (is_datanode) { - if (get_execute_mode(es, nodeIdx)) - appendStringInfo(infostr, "(Buffers: 0)\n"); - else - appendStringInfo(infostr, "(Buffers: unknown)\n"); + appendStringInfo(infostr, get_execute_mode(es, nodeIdx) ? "(Buffers: 0)\n" : "(Buffers: unknown)\n"); } /* As above, show only positive counter values. */ diff --git a/src/gausskernel/optimizer/commands/user.cpp b/src/gausskernel/optimizer/commands/user.cpp index efc920b1d..b321b68bc 100755 --- a/src/gausskernel/optimizer/commands/user.cpp +++ b/src/gausskernel/optimizer/commands/user.cpp @@ -5108,6 +5108,11 @@ void TryLockAccount(Oid roleID, int extrafails, bool superlock) bool lockflag = 0; char* rolename = NULL; + /* We could not insert new xlog if recovery in process */ + if (RecoveryInProgress()) { + return; + } + if (!LockAccountParaValid(roleID, extrafails, superlock)) { return; } diff --git a/src/gausskernel/optimizer/prep/prepunion.cpp b/src/gausskernel/optimizer/prep/prepunion.cpp index d4e8694b6..721e3fd1b 100755 --- a/src/gausskernel/optimizer/prep/prepunion.cpp +++ b/src/gausskernel/optimizer/prep/prepunion.cpp @@ -2473,6 +2473,11 @@ void mark_parent_child_pushdown_flag(Query *parent, Query *child) if (IS_STREAM_PLAN && ((parent->can_push && !child->can_push) || (!parent->can_push && child->can_push))) { if (check_base_rel_in_fromlist(parent, (Node *)parent->jointree)) { +#ifndef ENABLE_MULTIPLE_NODES + if (u_sess->opt_cxt.is_stream_support) { + mark_stream_unsupport(); + } +#endif set_stream_off(); } else { parent->can_push = false; diff --git a/src/gausskernel/optimizer/rewrite/rewriteManip.cpp b/src/gausskernel/optimizer/rewrite/rewriteManip.cpp index 0662cb402..ec4ffd181 100755 --- a/src/gausskernel/optimizer/rewrite/rewriteManip.cpp +++ b/src/gausskernel/optimizer/rewrite/rewriteManip.cpp @@ -20,6 +20,7 @@ #include "nodes/nodeFuncs.h" #include "nodes/plannodes.h" #include "optimizer/clauses.h" +#include "optimizer/stream_check.h" #include "parser/parse_coerce.h" #include "parser/parse_relation.h" #include "parser/parsetree.h" @@ -1082,6 +1083,11 @@ Node* replace_rte_variables_mutator(Node* node, replace_rte_variables_context* c expression_tree_mutator(node, (Node* (*)(Node*, void*)) replace_rte_variables_mutator, (void*)context); if (contain_subplans(newnode)) { +#ifndef ENABLE_MULTIPLE_NODES + if (u_sess->opt_cxt.is_stream_support) { + mark_stream_unsupport(); + } +#endif ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg( diff --git a/src/gausskernel/process/threadpool/knl_session.cpp b/src/gausskernel/process/threadpool/knl_session.cpp index 2c828500e..626b69b92 100644 --- a/src/gausskernel/process/threadpool/knl_session.cpp +++ b/src/gausskernel/process/threadpool/knl_session.cpp @@ -1042,7 +1042,11 @@ static void knl_u_syscache_init(knl_u_syscache_context* syscache_cxt) static void knl_u_pgxc_init(knl_u_pgxc_context* pgxc_cxt) { +#ifdef ENABLE_MULTIPLE_NODES pgxc_cxt->NumDataNodes = 0; +#else + pgxc_cxt->NumDataNodes = 1; +#endif /* ENABLE_MULTIPLE_NODES */ pgxc_cxt->NumCoords = 0; pgxc_cxt->NumStandbyDataNodes = 0; pgxc_cxt->datanode_count = 0; diff --git a/src/gausskernel/runtime/executor/execProcnode.cpp b/src/gausskernel/runtime/executor/execProcnode.cpp index 926675e51..f2509639c 100755 --- a/src/gausskernel/runtime/executor/execProcnode.cpp +++ b/src/gausskernel/runtime/executor/execProcnode.cpp @@ -536,8 +536,8 @@ PlanState* ExecInitNode(Plan* node, EState* estate, int e_flags) } #else if (u_sess->instr_cxt.global_instr != NULL && u_sess->instr_cxt.thread_instr && node->plan_node_id > 0 && - u_sess->instr_cxt.global_instr->get_planIdOffsetArray()[node->plan_node_id - 1] == - u_sess->instr_cxt.thread_instr->getSegmentId() - 1) { + (!StreamTopConsumerAmI() || + u_sess->instr_cxt.global_instr->get_planIdOffsetArray()[node->plan_node_id - 1] == 0)) { result->instrument = u_sess->instr_cxt.thread_instr->allocInstrSlot( node->plan_node_id, node->parent_node_id, result->plan, estate); } else { diff --git a/src/gausskernel/storage/mot/core/src/Makefile b/src/gausskernel/storage/mot/core/src/Makefile index 62a12e508..fd7825591 100644 --- a/src/gausskernel/storage/mot/core/src/Makefile +++ b/src/gausskernel/storage/mot/core/src/Makefile @@ -29,66 +29,9 @@ top_builddir ?= ../../../../../../ include $(top_builddir)/src/Makefile.global -MASSTREE_DIR=$(MASSTREE_HOME) -MASSTREE_PACKAGE=masstree-beta-0.9.0 -MOT_MASSTREE_PATCH=masstree-beta-0.9.0_patch -MASSTREE_MEGRED_SOURCES_DIR=$(MASSTREE_DIR)/code - - mot_target: - @$(call create_masstree_sources) @make -f Makefile.local clean: - @rm -rf $(MASSTREE_MEGRED_SOURCES_DIR) @make -f Makefile.local clean -MASSTREE_RELEVANT_SOURCES = \ - btree_leaflink.hh \ - circular_int.hh \ - compiler.cc \ - compiler.hh \ - hashcode.hh \ - kpermuter.hh \ - ksearch.hh \ - masstree_get.hh \ - masstree.hh \ - masstree_insert.hh \ - masstree_key.hh \ - masstree_remove.hh \ - masstree_scan.hh \ - masstree_split.hh \ - masstree_struct.hh \ - masstree_tcursor.hh \ - memdebug.cc \ - memdebug.hh \ - mtcounters.hh \ - kvthread.cc \ - kvthread.hh \ - nodeversion.hh \ - small_vector.hh \ - straccum.cc \ - straccum.hh \ - str.hh \ - stringbag.hh \ - string_base.hh \ - string.cc \ - string.hh \ - string_slice.hh \ - timestamp.hh - -define create_masstree_sources - rm -rf $(MASSTREE_DIR)/tmp; \ - rm -rf $(MASSTREE_MEGRED_SOURCES_DIR); \ - mkdir $(MASSTREE_DIR)/tmp; \ - mkdir $(MASSTREE_MEGRED_SOURCES_DIR); \ - tar xfzv $(MASSTREE_DIR)/$(MASSTREE_PACKAGE).tar.gz -C $(MASSTREE_DIR)/tmp &> /dev/null; \ - for src_file in $(MASSTREE_RELEVANT_SOURCES); \ - do \ - cp $(MASSTREE_DIR)/tmp/$(MASSTREE_PACKAGE)/$$src_file $(MASSTREE_MEGRED_SOURCES_DIR); \ - done - rename ".cc" ".cpp" $(MASSTREE_MEGRED_SOURCES_DIR)/*.cc; \ - rm -rf $(MASSTREE_DIR)/tmp; \ - patch -d $(MASSTREE_MEGRED_SOURCES_DIR) < $(MASSTREE_DIR)/$(MOT_MASSTREE_PATCH).patch &> /dev/null; -endef - diff --git a/src/gausskernel/storage/mot/core/src/Makefile.local b/src/gausskernel/storage/mot/core/src/Makefile.local index 3e06a130d..c9994367d 100644 --- a/src/gausskernel/storage/mot/core/src/Makefile.local +++ b/src/gausskernel/storage/mot/core/src/Makefile.local @@ -32,7 +32,6 @@ CFLAGS ?= subdir=src/gausskernel/storage/mot/core/src top_builddir ?= ../../../../../../ -MASSTREE_MEGRED_SOURCES_DIR=$(MASSTREE_HOME)/code ifeq ($(UNDERPG),yes) include $(top_builddir)/src/Makefile.global @@ -48,7 +47,7 @@ SRC_TARGET_DIRS = \ memory \ storage \ system \ - $(MASSTREE_MEGRED_SOURCES_DIR) \ + $(MASSTREE_HOME)/include \ utils SRC_DIRS = $(shell find $(SRC_TARGET_DIRS) -type d 2> /dev/null) # 2> /dev/null To remove error printout when calling clean @@ -108,6 +107,7 @@ CFLAGS += -faligned-new # turn on some warnings CFLAGS += -Wwrite-strings -Wcast-align -Wreturn-type CFLAGS += -Wpointer-arith -Wlogical-op -Waddress -Wsizeof-pointer-memaccess -Winit-self +CFLAGS += -L$(MASSTREE_HOME)/lib -lmasstree # Enable this warning for gcc version 6.0 or higher #CFLAGS += -Wduplicated-cond diff --git a/src/gausskernel/storage/mot/core/src/concurrency_control/row_header.cpp b/src/gausskernel/storage/mot/core/src/concurrency_control/row_header.cpp index 56346e3f4..88d292a89 100644 --- a/src/gausskernel/storage/mot/core/src/concurrency_control/row_header.cpp +++ b/src/gausskernel/storage/mot/core/src/concurrency_control/row_header.cpp @@ -110,13 +110,7 @@ void RowHeader::WriteChangesToRow(const Access* access, uint64_t csn) #ifdef MOT_DEBUG if (access->m_params.IsPrimarySentinel()) { uint64_t v = m_csnWord; - if (MOTEngine::GetInstance()->IsRecovering()) { - if (!(csn == GetCSN() && (v & LOCK_BIT))) { - MOT_LOG_ERROR( - "csn=%ld, v & LOCK_BIT=%ld, v & (~LOCK_BIT)=%ld\n", csn, (v & LOCK_BIT), (v & (~LOCK_BIT))); - MOT_ASSERT(false); - } - } else { + if (!MOTEngine::GetInstance()->IsRecovering()) { if (!(csn > GetCSN() && (v & LOCK_BIT))) { MOT_LOG_ERROR( "csn=%ld, v & LOCK_BIT=%ld, v & (~LOCK_BIT)=%ld\n", csn, (v & LOCK_BIT), (v & (~LOCK_BIT))); diff --git a/src/gausskernel/storage/mot/core/src/memory/garbage_collector/mm_gc_manager.cpp b/src/gausskernel/storage/mot/core/src/memory/garbage_collector/mm_gc_manager.cpp index d0f0b4909..4bf8df761 100644 --- a/src/gausskernel/storage/mot/core/src/memory/garbage_collector/mm_gc_manager.cpp +++ b/src/gausskernel/storage/mot/core/src/memory/garbage_collector/mm_gc_manager.cpp @@ -247,7 +247,7 @@ void GcManager::CleanIndexItems(uint32_t indexId, bool dropIndex) } m_managerLock.unlock(); if (counter) { - MOT_LOG_INFO("Entity:%s threadId = %d cleaned from index id = %d items = %d\n", + MOT_LOG_INFO("Entity:%s threadId = %d cleaned from index id = %u items = %u\n", enGcTypes[m_purpose], m_tid, indexId, diff --git a/src/gausskernel/storage/mot/core/src/storage/index/masstree/config.h b/src/gausskernel/storage/mot/core/src/storage/index/masstree/config.h deleted file mode 100644 index ecfaf2b76..000000000 --- a/src/gausskernel/storage/mot/core/src/storage/index/masstree/config.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2020 Huawei Technologies Co.,Ltd. - * - * openGauss is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, - * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, - * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - * ------------------------------------------------------------------------- - * - * config.h - * Masstree index configurations template. - * - * IDENTIFICATION - * src/gausskernel/storage/mot/core/src/storage/index/masstree/config.h - * - * ------------------------------------------------------------------------- - */ - -#include "mot_masstree_config.hpp" - -#ifndef MASSTREE_CONFIG_H -#define MASSTREE_CONFIG_H - -#define HAVE_CXX_TEMPLATE_ALIAS MOT_HAVE_CXX_TEMPLATE_ALIAS -#define HAVE_INT64_T_IS_LONG MOT_HAVE_INT64_T_IS_LONG -#define HAVE_SIZE_T_IS_UNSIGNED_LONG MOT_HAVE_SIZE_T_IS_UNSIGNED_LONG -#define HAVE_STD_HASH MOT_HAVE_STD_HASH -#define HAVE_STD_IS_TRIVIALLY_COPYABLE MOT_HAVE_STD_IS_TRIVIALLY_COPYABLE -#define HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE MOT_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE -#define HAVE_SUPERPAGE MOT_HAVE_SUPERPAGE -#define HAVE_TYPE_TRAITS MOT_HAVE_TYPE_TRAITS -#define HAVE_UNALIGNED_ACCESS MOT_HAVE_UNALIGNED_ACCESS -#define HAVE___BUILTIN_CLZ MOT_HAVE___BUILTIN_CLZ -#define HAVE___BUILTIN_CLZL MOT_HAVE___BUILTIN_CLZL -#define HAVE___BUILTIN_CLZLL MOT_HAVE___BUILTIN_CLZLL -#define HAVE___BUILTIN_CTZ MOT_HAVE___BUILTIN_CTZ -#define HAVE___BUILTIN_CTZL MOT_HAVE___BUILTIN_CTZL -#define HAVE___BUILTIN_CTZLL MOT_HAVE___BUILTIN_CTZLL -#define HAVE___HAS_TRIVIAL_COPY MOT_HAVE___HAS_TRIVIAL_COPY -#define HAVE___HAS_TRIVIAL_DESTRUCTOR MOT_HAVE___HAS_TRIVIAL_DESTRUCTOR -#define HAVE___SYNC_BOOL_COMPARE_AND_SWAP MOT_HAVE___SYNC_BOOL_COMPARE_AND_SWAP -#define HAVE___SYNC_BOOL_COMPARE_AND_SWAP_8 MOT_HAVE___SYNC_BOOL_COMPARE_AND_SWAP_8 -#define HAVE___SYNC_FETCH_AND_ADD MOT_HAVE___SYNC_FETCH_AND_ADD -#define HAVE___SYNC_FETCH_AND_ADD_8 MOT_HAVE___SYNC_FETCH_AND_ADD_8 -#define HAVE___SYNC_FETCH_AND_OR MOT_HAVE___SYNC_FETCH_AND_OR -#define HAVE___SYNC_FETCH_AND_OR_8 MOT_HAVE___SYNC_FETCH_AND_OR_8 -#define HAVE___SYNC_VAL_COMPARE_AND_SWAP MOT_HAVE___SYNC_VAL_COMPARE_AND_SWAP -#define HAVE___SYNC_VAL_COMPARE_AND_SWAP_8 MOT_HAVE___SYNC_VAL_COMPARE_AND_SWAP_8 -#define MASSTREE_MAXKEYLEN MOT_MASSTREE_MAXKEYLEN -#define SIZEOF_INT MOT_SIZEOF_INT -#define SIZEOF_LONG MOT_SIZEOF_LONG -#define SIZEOF_LONG_LONG MOT_SIZEOF_LONG_LONG -#define SIZEOF_SHORT MOT_SIZEOF_SHORT -#define WORDS_BIGENDIAN_SET MOT_WORDS_BIGENDIAN_SET - -#endif diff --git a/src/gausskernel/storage/mot/core/src/storage/index/masstree/mot_masstree_config.hpp b/src/gausskernel/storage/mot/core/src/storage/index/masstree/mot_masstree_config.hpp deleted file mode 100644 index 6cdc04156..000000000 --- a/src/gausskernel/storage/mot/core/src/storage/index/masstree/mot_masstree_config.hpp +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2020 Huawei Technologies Co.,Ltd. - * - * openGauss is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, - * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, - * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - * ------------------------------------------------------------------------- - * - * mot_masstree_config.hpp - * MOT configurations for Masstree index. - * - * IDENTIFICATION - * src/gausskernel/storage/mot/core/src/storage/index/masstree/mot_masstree_config.hpp - * - * ------------------------------------------------------------------------- - */ - -#ifndef MOT_MASSTREE_CONFIG_HPP -#define MOT_MASSTREE_CONFIG_HPP - -#define MOT_HAVE_CXX_TEMPLATE_ALIAS 1 -#define MOT_HAVE_INT64_T_IS_LONG 1 -#define MOT_HAVE_SIZE_T_IS_UNSIGNED_LONG 1 -#define MOT_HAVE_STD_HASH 1 -#define MOT_HAVE_STD_IS_TRIVIALLY_COPYABLE 1 -#define MOT_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE 1 -#define MOT_HAVE_SUPERPAGE 1 -#define MOT_HAVE_TYPE_TRAITS 1 -#define MOT_HAVE_UNALIGNED_ACCESS 0 -#define MOT_HAVE___BUILTIN_CLZ 1 -#define MOT_HAVE___BUILTIN_CLZL 1 -#define MOT_HAVE___BUILTIN_CLZLL 1 -#define MOT_HAVE___BUILTIN_CTZ 1 -#define MOT_HAVE___BUILTIN_CTZL 1 -#define MOT_HAVE___BUILTIN_CTZLL 1 -#define MOT_HAVE___HAS_TRIVIAL_COPY 1 -#define MOT_HAVE___HAS_TRIVIAL_DESTRUCTOR 1 -#define MOT_HAVE___SYNC_BOOL_COMPARE_AND_SWAP 1 -#define MOT_HAVE___SYNC_BOOL_COMPARE_AND_SWAP_8 1 -#define MOT_HAVE___SYNC_FETCH_AND_ADD 1 -#define MOT_HAVE___SYNC_FETCH_AND_ADD_8 1 -#define MOT_HAVE___SYNC_FETCH_AND_OR 1 -#define MOT_HAVE___SYNC_FETCH_AND_OR_8 1 -#define MOT_HAVE___SYNC_VAL_COMPARE_AND_SWAP 1 -#define MOT_HAVE___SYNC_VAL_COMPARE_AND_SWAP_8 1 - -/* Maximum key length */ -#define MOT_MASSTREE_MAXKEYLEN MAX_KEY_SIZE -#define MOT_SIZEOF_INT 4 -#define MOT_SIZEOF_LONG 8 -#define MOT_SIZEOF_LONG_LONG 8 -#define MOT_SIZEOF_SHORT 2 -#define MOT_WORDS_BIGENDIAN_SET 1 - -#define masstree_invariant(x, ...) \ - do { \ - } while (0) - -#define masstree_precondition(x, ...) \ - do { \ - } while (0) - -#ifndef invariant -#define invariant masstree_invariant -#endif -#ifndef precondition -#define precondition masstree_precondition -#endif - -#endif // MOT_MASSTREE_CONFIG_HPP diff --git a/src/gausskernel/storage/mot/core/src/storage/index/masstree/mot_masstree_kvthread.cpp b/src/gausskernel/storage/mot/core/src/storage/index/masstree/mot_masstree_kvthread.cpp new file mode 100644 index 000000000..7bb65a603 --- /dev/null +++ b/src/gausskernel/storage/mot/core/src/storage/index/masstree/mot_masstree_kvthread.cpp @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2020 Huawei Technologies Co.,Ltd. + * + * openGauss is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * + * http://license.coscl.org.cn/MulanPSL2 + * + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * ------------------------------------------------------------------------- + * + * mot_masstree_kvthread.hpp + * Replace Masstree's thread info implementations with MOT functionality. + * + * IDENTIFICATION + * src/gausskernel/storage/mot/core/src/storage/index/masstree/mot_masstree_kvthread.cpp + * + * ------------------------------------------------------------------------- + */ + +#include "masstree_index.h" +#include "kvthread.hh" +#include +#include +#include +#include +#include +#if HAVE_SUPERPAGE && !NOSUPERPAGE +#include +#include +#endif + +#include "mm_api.h" +#include "mm_gc_manager.h" + +// This is the thread info which serves the current masstree operation. It is set before the operation starts. +__thread threadinfo* mtSessionThreadInfo = nullptr; + +volatile mrcu_epoch_type globalepoch; + +inline threadinfo::threadinfo(int purpose, int index, int rcu_max_free_count) +{ + errno_t erc = memset_s(this, sizeof(*this), 0, sizeof(*this)); + securec_check(erc, "\0", "\0"); + + purpose_ = purpose; + index_ = index; + rcu_free_count = rcu_max_free_count; + + ts_ = 2; +} + +threadinfo* threadinfo::make(void* obj_mem, int purpose, int index, int rcu_max_free_count) +{ + threadinfo* ti = new(obj_mem) threadinfo(purpose, index, rcu_max_free_count); + + if (use_pool()) { + void *limbo_space = ti->allocate(MAX_MEMTAG_MASSTREE_LIMBO_GROUP_ALLOCATION_SIZE, memtag_limbo); + if (!limbo_space) { + return nullptr; + } + + ti->mark(tc_limbo_slots, mt_limbo_group::capacity); + ti->limbo_head_ = ti->limbo_tail_ = new(limbo_space) mt_limbo_group; + } + + return ti; +} + + +void* threadinfo::allocate(size_t sz, memtag tag, size_t* actual_size) +{ + int size = sz; + void* p = nullptr; + if (likely(!use_pool())) { + p = cur_working_index->AllocateMem(size, tag); + } else { + p = malloc(sz + memdebug_size); + } + + p = memdebug::make(p, sz, tag); + if (p) { + if (actual_size) { + *actual_size = size; + } + mark(threadcounter(tc_alloc + (tag > memtag_value)), sz); + } + return p; +} + +void threadinfo::deallocate(void* p, size_t sz, memtag tag) +{ + MOT_ASSERT(p); + p = memdebug::check_free(p, sz, tag); + if (likely(!use_pool())) { + cur_working_index->DeallocateMem(p, sz, tag); + } else { + free(p); + } + mark(threadcounter(tc_alloc + (tag > memtag_value)), -sz); +} + +void threadinfo::ng_record_rcu(void* p, int sz, memtag tag) +{ + MOT_ASSERT(p); + memdebug::check_rcu(p, sz, tag); + cur_working_index->RecordMemRcu(p, sz, tag); + mark(threadcounter(tc_alloc + (tag > memtag_value)), -sz); +} + +void threadinfo::set_gc_session(MOT::GcManager* gc_session) +{ + gc_session_ = gc_session; +} + +inline MOT::GcManager* threadinfo::get_gc_session() +{ + return gc_session_; +} diff --git a/src/gausskernel/storage/mot/core/src/storage/index/masstree_index.h b/src/gausskernel/storage/mot/core/src/storage/index/masstree_index.h index f0e86bd63..08ddfdcaf 100644 --- a/src/gausskernel/storage/mot/core/src/storage/index/masstree_index.h +++ b/src/gausskernel/storage/mot/core/src/storage/index/masstree_index.h @@ -28,7 +28,7 @@ #include "index.h" #include "index_base.h" #include "utilities.h" -#include "masstree/config.h" +#include "masstree_config.h" #include "masstree/mot_masstree.hpp" #include "masstree/mot_masstree_insert.hpp" #include "masstree/mot_masstree_remove.hpp" diff --git a/src/gausskernel/storage/mot/core/src/system/recovery/checkpoint_recovery.cpp b/src/gausskernel/storage/mot/core/src/system/recovery/checkpoint_recovery.cpp index cdee40ab8..48cfcb583 100644 --- a/src/gausskernel/storage/mot/core/src/system/recovery/checkpoint_recovery.cpp +++ b/src/gausskernel/storage/mot/core/src/system/recovery/checkpoint_recovery.cpp @@ -552,7 +552,7 @@ uint32_t CheckpointRecovery::HaveTasks() bool CheckpointRecovery::IsMemoryLimitReached(uint32_t numThreads, uint32_t neededBytes) { - uint64_t memoryRequiredBytes = numThreads * neededBytes; + uint64_t memoryRequiredBytes = (uint64_t)numThreads * neededBytes; if (MOTEngine::GetInstance()->GetCurrentMemoryConsumptionBytes() + memoryRequiredBytes >= MOTEngine::GetInstance()->GetHardMemoryLimitBytes()) { MOT_LOG_WARN("CheckpointRecovery::IsMemoryLimitReached: memory limit reached " diff --git a/src/gausskernel/storage/mot/core/src/system/transaction/txn_access.cpp b/src/gausskernel/storage/mot/core/src/system/transaction/txn_access.cpp index c1986d2a8..65e1322e2 100644 --- a/src/gausskernel/storage/mot/core/src/system/transaction/txn_access.cpp +++ b/src/gausskernel/storage/mot/core/src/system/transaction/txn_access.cpp @@ -175,24 +175,16 @@ void TxnAccess::ClearSet() { m_lastAcc = nullptr; MOT_ASSERT(m_rowCnt == m_rowsSet->size()); + m_rowsSet->clear(); if (unlikely(m_accessSetSize > DEFAULT_ACCESS_SIZE)) { ShrinkAccessSet(); - } - m_rowsSet->clear(); - m_allocatedAc = 0; - - unsigned int i; - for (i = 0; i < m_accessSetSize; i++) { - Access* ac = GetAccessPtr(i); - if (ac != nullptr) { - DestroyAccess(ac); - } else { - break; + } else { + for (unsigned int i = 0; i < m_rowCnt; i++) { + DestroyAccess(m_accessesSetBuff[i]); } + m_rowCnt = 0; } - m_allocatedAc = i; m_insertManager->ClearSet(); - m_rowCnt = 0; } void TxnAccess::DestroyAccess(Access* access) @@ -241,15 +233,9 @@ void TxnAccess::ShrinkAccessSet() errno_t erc; uint64_t new_array_size = DEFAULT_ACCESS_SIZE; // Clear access set - for (unsigned int i = DEFAULT_ACCESS_SIZE; i < m_accessSetSize; i++) { - Access* ac = GetAccessPtr(i); - if (ac != nullptr) { - DestroyAccess(ac); - delete ac; - ResetAccessPtr(i); - } else { - break; - } + for (unsigned int i = 0; i < m_allocatedAc; i++) { + DestroyAccess(m_accessesSetBuff[i]); + delete m_accessesSetBuff[i]; } if (new_array_size < m_accessSetSize) { @@ -269,11 +255,11 @@ void TxnAccess::ShrinkAccessSet() erc = memset_s(ptr, alloc_size, 0, sizeof(Access*) * new_array_size); securec_check(erc, "\0", "\0"); - erc = memcpy_s(ptr, alloc_size, m_accessesSetBuff, sizeof(Access*) * DEFAULT_ACCESS_SIZE); - securec_check(erc, "\0", "\0"); MemSessionFree(m_accessesSetBuff); SetAccessesSet(reinterpret_cast(ptr)); m_accessSetSize = new_array_size; + m_allocatedAc = 0; + m_rowCnt = 0; } Access* TxnAccess::GetNewRowAccess(const Row* row, AccessType type, RC& rc) diff --git a/src/gausskernel/storage/mot/core/src/system/transaction_logger/redo_log.cpp b/src/gausskernel/storage/mot/core/src/system/transaction_logger/redo_log.cpp index b960bc2da..4edf55100 100644 --- a/src/gausskernel/storage/mot/core/src/system/transaction_logger/redo_log.cpp +++ b/src/gausskernel/storage/mot/core/src/system/transaction_logger/redo_log.cpp @@ -369,8 +369,9 @@ RC RedoLog::SerializeTransactionDDLs(IdxDDLAccessMap& idxDDLMap) RC RedoLog::SerializeTransactionDMLs() { RC status = RC_OK; - for (uint32_t index = 0; index < m_txn->m_accessMgr->m_rowCnt; index++) { - Access* access = m_txn->m_accessMgr->GetAccessPtr(index); + TxnOrderedSet_t& orderedSet = m_txn->m_accessMgr->GetOrderedRowSet(); + for (const auto& raPair : orderedSet) { + Access* access = raPair.second; if (access != nullptr) { switch (access->m_type) { case INS: diff --git a/src/gausskernel/storage/mot/fdw_adapter/src/mot_fdw.cpp b/src/gausskernel/storage/mot/fdw_adapter/src/mot_fdw.cpp index a419accee..41fa20f9b 100644 --- a/src/gausskernel/storage/mot/fdw_adapter/src/mot_fdw.cpp +++ b/src/gausskernel/storage/mot/fdw_adapter/src/mot_fdw.cpp @@ -574,8 +574,9 @@ static void MOTGetForeignPaths(PlannerInfo* root, RelOptInfo* baserel, Oid forei foreach (lc, baserel->baserestrictinfo) { RestrictInfo* ri = (RestrictInfo*)lfirst(lc); - if (!IsMOTExpr(baserel, planstate, &marr, ri->clause, NULL, true)) + if (!IsMOTExpr(baserel, planstate, &marr, ri->clause, nullptr, true)) { planstate->m_localConds = lappend(planstate->m_localConds, ri->clause); + } } // get best index @@ -675,8 +676,8 @@ static void MOTGetForeignPaths(PlannerInfo* root, RelOptInfo* baserel, Oid forei foreach (lc, bestClause) { RestrictInfo* ri = (RestrictInfo*)lfirst(lc); - IsMOTExpr(baserel, planstate, &marr, ri->clause, nullptr, false); - // in case we use index params DO NOT add it to envelope filter + // In case we use index params DO NOT add it to envelope filter. + (void)IsMOTExpr(baserel, planstate, &marr, ri->clause, nullptr, false); } best = MOTAdaptor::GetBestMatchIndex(planstate, &marr, list_length(bestClause), false); @@ -1383,7 +1384,7 @@ static TupleTableSlot* MOTExecForeignInsert( MOTFdwStateSt* fdwState = (MOTFdwStateSt*)resultRelInfo->ri_FdwState; MOT::RC rc = MOT::RC_OK; - if (MOTAdaptor::m_engine->IsSoftMemoryLimitReached()) { + if (MOTAdaptor::m_engine->IsSoftMemoryLimitReached() && fdwState != nullptr) { CleanQueryStatesOnError(fdwState->m_currTxn); } diff --git a/src/gausskernel/storage/mot/fdw_adapter/src/mot_fdw_xlog.cpp b/src/gausskernel/storage/mot/fdw_adapter/src/mot_fdw_xlog.cpp index 2e3912bed..6caa7e909 100644 --- a/src/gausskernel/storage/mot/fdw_adapter/src/mot_fdw_xlog.cpp +++ b/src/gausskernel/storage/mot/fdw_adapter/src/mot_fdw_xlog.cpp @@ -78,9 +78,7 @@ void MOTRedo(XLogReaderState* record) uint64_t XLOGLogger::AddToLog(MOT::RedoLogBuffer** redoLogBufferArray, uint32_t size) { - uint64_t written = MOT::ILogger::AddToLog(redoLogBufferArray, size); - XLogSetAsyncXactLSN(t_thrd.xlog_cxt.XactLastRecEnd); - return written; + return MOT::ILogger::AddToLog(redoLogBufferArray, size); } uint64_t XLOGLogger::AddToLog(uint8_t* data, uint32_t size) diff --git a/src/gausskernel/storage/mot/jit_exec/src/jit_llvm_blocks.cpp b/src/gausskernel/storage/mot/jit_exec/src/jit_llvm_blocks.cpp index 713e83288..639a7f523 100644 --- a/src/gausskernel/storage/mot/jit_exec/src/jit_llvm_blocks.cpp +++ b/src/gausskernel/storage/mot/jit_exec/src/jit_llvm_blocks.cpp @@ -580,7 +580,7 @@ static llvm::Value* ProcessOpExpr( JitLlvmCodeGenContext* ctx, const OpExpr* op_expr, int& result_type, int arg_pos, int depth, int* max_arg) { llvm::Value* result = nullptr; - MOT_LOG_DEBUG("%*s --> Processing OP %d expression", depth, "", (int)op_expr->opfuncid); + MOT_LOG_DEBUG("%*s --> Processing OP %u expression", depth, "", op_expr->opfuncid); if (depth > MOT_JIT_MAX_EXPR_DEPTH) { MOT_LOG_TRACE("Cannot process expression: Expression exceeds depth limit %d", (int)MOT_JIT_MAX_EXPR_DEPTH); return nullptr; @@ -615,11 +615,11 @@ static llvm::Value* ProcessOpExpr( APPLY_OPERATORS() default: - MOT_LOG_TRACE("Unsupported operator function type: %d", op_expr->opfuncid); + MOT_LOG_TRACE("Unsupported operator function type: %u", op_expr->opfuncid); break; } - MOT_LOG_DEBUG("%*s <-- Processing OP %d expression result: %p", depth, "", (int)op_expr->opfuncid, result); + MOT_LOG_DEBUG("%*s <-- Processing OP %u expression result: %p", depth, "", op_expr->opfuncid, result); return result; } diff --git a/src/gausskernel/storage/mot/jit_exec/src/jit_plan_expr.cpp b/src/gausskernel/storage/mot/jit_exec/src/jit_plan_expr.cpp index 980013a7a..ed8bed6ad 100644 --- a/src/gausskernel/storage/mot/jit_exec/src/jit_plan_expr.cpp +++ b/src/gausskernel/storage/mot/jit_exec/src/jit_plan_expr.cpp @@ -1032,7 +1032,7 @@ static TableExprClass clasifyTableExprArgs(Query* query, MOT::Table* table, MOT: static TableExprClass classifyTableOpExpr(Query* query, MOT::Table* table, MOT::Index* index, OpExpr* op_expr) { if (!IsFuncIdSupported(op_expr->opfuncid)) { - MOT_LOG_TRACE("classifyTableOpExpr(): Unsupported function id %d", (int)op_expr->opfuncid); + MOT_LOG_TRACE("classifyTableOpExpr(): Unsupported function id %u", op_expr->opfuncid); return TableExprError; } diff --git a/src/gausskernel/storage/mot/jit_exec/src/jit_tvm_blocks.cpp b/src/gausskernel/storage/mot/jit_exec/src/jit_tvm_blocks.cpp index 7c46b2ea7..282e7339d 100644 --- a/src/gausskernel/storage/mot/jit_exec/src/jit_tvm_blocks.cpp +++ b/src/gausskernel/storage/mot/jit_exec/src/jit_tvm_blocks.cpp @@ -534,7 +534,7 @@ static Expression* ProcessOpExpr( { Expression* result = nullptr; const int op_args_num = 3; - MOT_LOG_DEBUG("%*s --> Processing OP %d expression", depth, "", (int)op_expr->opfuncid); + MOT_LOG_DEBUG("%*s --> Processing OP %u expression", depth, "", op_expr->opfuncid); if (depth > MOT_JIT_MAX_EXPR_DEPTH) { MOT_LOG_TRACE("Cannot process expression: Expression exceeds depth limit %d", (int)MOT_JIT_MAX_EXPR_DEPTH); return nullptr; @@ -567,11 +567,11 @@ static Expression* ProcessOpExpr( APPLY_OPERATORS() default: - MOT_LOG_TRACE("Unsupported operator function type: %d", op_expr->opfuncid); + MOT_LOG_TRACE("Unsupported operator function type: %u", op_expr->opfuncid); break; } - MOT_LOG_DEBUG("%*s <-- Processing OP %d expression result: %p", depth, "", (int)op_expr->opfuncid, result); + MOT_LOG_DEBUG("%*s <-- Processing OP %u expression result: %p", depth, "", op_expr->opfuncid, result); return result; } diff --git a/src/get_PlatForm_str.sh b/src/get_PlatForm_str.sh index a96a20d3f..ee4523c2a 100644 --- a/src/get_PlatForm_str.sh +++ b/src/get_PlatForm_str.sh @@ -20,6 +20,12 @@ kernel="" if [ -f "/etc/euleros-release" ] then kernel=$(cat /etc/euleros-release | awk -F ' ' '{print $1}' | tr A-Z a-z) +elif [ -f "/etc/openEuler-release" ] +then + kernel=$(cat /etc/openEuler-release | awk -F ' ' '{print $1}' | tr A-Z a-z) +elif [ -f "/etc/centos-release" ] +then + kernel=$(cat /etc/centos-release | awk -F ' ' '{print $1}' | tr A-Z a-z) else kernel=$(lsb_release -d | awk -F ' ' '{print $2}'| tr A-Z a-z) fi diff --git a/src/include/catalog/upgrade_sql/open_gauss/rollback_catalog_maindb/rollback-post_catalog_maindb_92_200.sql b/src/include/catalog/upgrade_sql/open_gauss/rollback_catalog_maindb/rollback-post_catalog_maindb_92_200.sql index af912402c..e69de29bb 100644 --- a/src/include/catalog/upgrade_sql/open_gauss/rollback_catalog_maindb/rollback-post_catalog_maindb_92_200.sql +++ b/src/include/catalog/upgrade_sql/open_gauss/rollback_catalog_maindb/rollback-post_catalog_maindb_92_200.sql @@ -1,10674 +0,0 @@ - -DECLARE - user_name text; - query_str text; -BEGIN - SELECT SESSION_USER INTO user_name; - IF EXISTS (SELECT oid FROM pg_catalog.pg_class WHERE relname='statement_history') THEN - query_str := 'REVOKE SELECT on table dbe_perf.statement_history FROM public;'; - EXECUTE IMMEDIATE query_str; - query_str := 'GRANT ALL ON TABLE DBE_PERF.statement_history TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - query_str := 'GRANT ALL ON TABLE pg_catalog.statement_history TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - GRANT SELECT ON TABLE DBE_PERF.statement_history TO PUBLIC; - END IF; -END; -/ - - -DECLARE - user_name text; - query_str text; -BEGIN - SELECT SESSION_USER INTO user_name; - - IF EXISTS (SELECT oid FROM pg_catalog.pg_class WHERE relname='track_memory_context_detail') THEN - query_str := 'REVOKE INSERT,SELECT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON TABLE dbe_perf.track_memory_context_detail FROM ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - REVOKE SELECT ON TABLE dbe_perf.track_memory_context_detail FROM PUBLIC; - END IF; -END; -/ - -DO $DO$ -DECLARE - ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS DBE_PERF.get_global_full_sql_by_timestamp() cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_global_slow_sql_by_timestamp() cascade; - DROP VIEW IF EXISTS DBE_PERF.statement_history cascade; - end if; -END$DO$; - -DROP INDEX IF EXISTS pg_catalog.statement_history_time_idx; -DROP TABLE IF EXISTS pg_catalog.statement_history; - -CREATE unlogged table IF NOT EXISTS pg_catalog.statement_history( - db_name name, - schema_name name, - origin_node integer, - user_name name, - application_name text, - client_addr text, - client_port integer, - unique_query_id bigint, - debug_query_id bigint, - query text, - start_time timestamp with time zone, - finish_time timestamp with time zone, - slow_sql_threshold bigint, - transaction_id bigint, - thread_id bigint, - session_id bigint, - n_soft_parse bigint, - n_hard_parse bigint, - query_plan text, - n_returned_rows bigint, - n_tuples_fetched bigint, - n_tuples_returned bigint, - n_tuples_inserted bigint, - n_tuples_updated bigint, - n_tuples_deleted bigint, - n_blocks_fetched bigint, - n_blocks_hit bigint, - db_time bigint, - cpu_time bigint, - execution_time bigint, - parse_time bigint, - plan_time bigint, - rewrite_time bigint, - pl_execution_time bigint, - pl_compilation_time bigint, - data_io_time bigint, - net_send_info text, - net_recv_info text, - net_stream_send_info text, - net_stream_recv_info text, - lock_count bigint, - lock_time bigint, - lock_wait_count bigint, - lock_wait_time bigint, - lock_max_count bigint, - lwlock_count bigint, - lwlock_wait_count bigint, - lwlock_time bigint, - lwlock_wait_time bigint, - details text -); -REVOKE ALL on table pg_catalog.statement_history FROM public; -create index pg_catalog.statement_history_time_idx on pg_catalog.statement_history USING btree (start_time); - -DO $DO$ -DECLARE - ans boolean; - username text; - querystr text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE VIEW DBE_PERF.statement_history AS - select * from pg_catalog.statement_history; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_full_sql_by_timestamp - (in start_timestamp timestamp with time zone, - in end_timestamp timestamp with time zone, - OUT node_name name, - OUT db_name name, - OUT schema_name name, - OUT origin_node integer, - OUT user_name name, - OUT application_name text, - OUT client_addr text, - OUT client_port integer, - OUT unique_query_id bigint, - OUT debug_query_id bigint, - OUT query text, - OUT start_time timestamp with time zone, - OUT finish_time timestamp with time zone, - OUT slow_sql_threshold bigint, - OUT transaction_id bigint, - OUT thread_id bigint, - OUT session_id bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT query_plan text, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - OUT net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text, - OUT lock_count bigint, - OUT lock_time bigint, - OUT lock_wait_count bigint, - OUT lock_wait_time bigint, - OUT lock_max_count bigint, - OUT lwlock_count bigint, - OUT lwlock_wait_count bigint, - OUT lwlock_time bigint, - OUT lwlock_wait_time bigint, - OUT details text) - RETURNS setof record - AS $$ - DECLARE - row_data pg_catalog.statement_history%rowtype; - query_str text; - -- node name - node_names name[]; - each_node_name name; - BEGIN - -- Get all node names(CN + master DN) - node_names := ARRAY(SELECT pgxc_node.node_name FROM pgxc_node WHERE (node_type = 'C' or node_type = 'D') AND nodeis_active = true); - FOREACH each_node_name IN ARRAY node_names - LOOP - query_str := 'EXECUTE DIRECT ON (' || each_node_name || ') ''SELECT * FROM DBE_PERF.statement_history where start_time >= ''''' ||$1|| ''''' and start_time <= ''''' || $2 || ''''''''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := each_node_name; - db_name := row_data.db_name; - schema_name := row_data.schema_name; - origin_node := row_data.origin_node; - user_name := row_data.user_name; - application_name := row_data.application_name; - client_addr := row_data.client_addr; - client_port := row_data.client_port; - unique_query_id := row_data.unique_query_id; - debug_query_id := row_data.debug_query_id; - query := row_data.query; - start_time := row_data.start_time; - finish_time := row_data.finish_time; - slow_sql_threshold := row_data.slow_sql_threshold; - transaction_id := row_data.transaction_id; - thread_id := row_data.thread_id; - session_id := row_data.session_id; - n_soft_parse := row_data.n_soft_parse; - n_hard_parse := row_data.n_hard_parse; - query_plan := row_data.query_plan; - n_returned_rows := row_data.n_returned_rows; - n_tuples_fetched := row_data.n_tuples_fetched; - n_tuples_returned := row_data.n_tuples_returned; - n_tuples_inserted := row_data.n_tuples_inserted; - n_tuples_updated := row_data.n_tuples_updated; - n_tuples_deleted := row_data.n_tuples_deleted; - n_blocks_fetched := row_data.n_blocks_fetched; - n_blocks_hit := row_data.n_blocks_hit; - db_time := row_data.db_time; - cpu_time := row_data.cpu_time; - execution_time := row_data.execution_time; - parse_time := row_data.parse_time; - plan_time := row_data.plan_time; - rewrite_time := row_data.rewrite_time; - pl_execution_time := row_data.pl_execution_time; - pl_compilation_time := row_data.pl_compilation_time; - data_io_time := row_data.data_io_time; - net_send_info := row_data.net_send_info; - net_recv_info := row_data.net_recv_info; - net_stream_send_info := row_data.net_stream_send_info; - net_stream_recv_info := row_data.net_stream_recv_info; - lock_count := row_data.lock_count; - lock_time := row_data.lock_time; - lock_wait_count := row_data.lock_wait_count; - lock_wait_time := row_data.lock_wait_time; - lock_max_count := row_data.lock_max_count; - lwlock_count := row_data.lwlock_count; - lwlock_wait_count := row_data.lwlock_wait_count; - lwlock_time := row_data.lwlock_time; - lwlock_wait_time := row_data.lwlock_wait_time; - details := row_data.details; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_slow_sql_by_timestamp - (in start_timestamp timestamp with time zone, - in end_timestamp timestamp with time zone, - OUT node_name name, - OUT db_name name, - OUT schema_name name, - OUT origin_node integer, - OUT user_name name, - OUT application_name text, - OUT client_addr text, - OUT client_port integer, - OUT unique_query_id bigint, - OUT debug_query_id bigint, - OUT query text, - OUT start_time timestamp with time zone, - OUT finish_time timestamp with time zone, - OUT slow_sql_threshold bigint, - OUT transaction_id bigint, - OUT thread_id bigint, - OUT session_id bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT query_plan text, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - OUT net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text, - OUT lock_count bigint, - OUT lock_time bigint, - OUT lock_wait_count bigint, - OUT lock_wait_time bigint, - OUT lock_max_count bigint, - OUT lwlock_count bigint, - OUT lwlock_wait_count bigint, - OUT lwlock_time bigint, - OUT lwlock_wait_time bigint, - OUT details text) - RETURNS setof record - AS $$ - DECLARE - row_data pg_catalog.statement_history%rowtype; - row_name record; - query_str text; - -- node name - node_names name[]; - each_node_name name; - BEGIN - -- Get all node names(CN + master DN) - node_names := ARRAY(SELECT pgxc_node.node_name FROM pgxc_node WHERE (node_type = 'C' or node_type = 'D') AND nodeis_active = true); - FOREACH each_node_name IN ARRAY node_names - LOOP - query_str := 'EXECUTE DIRECT ON (' || each_node_name || ') ''SELECT * FROM DBE_PERF.statement_history where start_time >= ''''' ||$1|| ''''' and start_time <= ''''' || $2 || ''''' and (extract(epoch from (finish_time - start_time)) * 1000000) >= slow_sql_threshold '''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := each_node_name; - db_name := row_data.db_name; - schema_name := row_data.schema_name; - origin_node := row_data.origin_node; - user_name := row_data.user_name; - application_name := row_data.application_name; - client_addr := row_data.client_addr; - client_port := row_data.client_port; - unique_query_id := row_data.unique_query_id; - debug_query_id := row_data.debug_query_id; - query := row_data.query; - start_time := row_data.start_time; - finish_time := row_data.finish_time; - slow_sql_threshold := row_data.slow_sql_threshold; - transaction_id := row_data.transaction_id; - thread_id := row_data.thread_id; - session_id := row_data.session_id; - n_soft_parse := row_data.n_soft_parse; - n_hard_parse := row_data.n_hard_parse; - query_plan := row_data.query_plan; - n_returned_rows := row_data.n_returned_rows; - n_tuples_fetched := row_data.n_tuples_fetched; - n_tuples_returned := row_data.n_tuples_returned; - n_tuples_inserted := row_data.n_tuples_inserted; - n_tuples_updated := row_data.n_tuples_updated; - n_tuples_deleted := row_data.n_tuples_deleted; - n_blocks_fetched := row_data.n_blocks_fetched; - n_blocks_hit := row_data.n_blocks_hit; - db_time := row_data.db_time; - cpu_time := row_data.cpu_time; - execution_time := row_data.execution_time; - parse_time := row_data.parse_time; - plan_time := row_data.plan_time; - rewrite_time := row_data.rewrite_time; - pl_execution_time := row_data.pl_execution_time; - pl_compilation_time := row_data.pl_compilation_time; - data_io_time := row_data.data_io_time; - net_send_info := row_data.net_send_info; - net_recv_info := row_data.net_recv_info; - net_stream_send_info := row_data.net_stream_send_info; - net_stream_recv_info := row_data.net_stream_recv_info; - lock_count := row_data.lock_count; - lock_time := row_data.lock_time; - lock_wait_count := row_data.lock_wait_count; - lock_wait_time := row_data.lock_wait_time; - lock_max_count := row_data.lock_max_count; - lwlock_count := row_data.lwlock_count; - lwlock_wait_count := row_data.lwlock_wait_count; - lwlock_time := row_data.lwlock_time; - lwlock_wait_time := row_data.lwlock_wait_time; - details := row_data.details; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - DROP FUNCTION IF EXISTS pg_catalog.statement_detail_decode() CASCADE; - set local inplace_upgrade_next_system_object_oids = IUO_PROC, 5732; - CREATE OR REPLACE FUNCTION pg_catalog.statement_detail_decode - ( IN text, - IN text, - IN boolean) - RETURNS text LANGUAGE INTERNAL NOT FENCED as 'statement_detail_decode'; - - SELECT SESSION_USER INTO username; - querystr := 'GRANT ALL ON TABLE DBE_PERF.statement_history TO ' || quote_ident(username) || ';'; - EXECUTE IMMEDIATE querystr; - querystr := 'GRANT ALL ON TABLE pg_catalog.statement_history TO ' || quote_ident(username) || ';'; - EXECUTE IMMEDIATE querystr; - GRANT SELECT ON TABLE DBE_PERF.statement_history TO PUBLIC; - end if; -END$DO$; - -CREATE OR REPLACE PROCEDURE proc_hotkeyview() -AS - BEGIN - IF EXISTS (SELECT oid FROM pg_catalog.pg_class WHERE relname='global_stat_hotkeys_info') THEN - REVOKE SELECT ON TABLE global_stat_hotkeys_info FROM PUBLIC; - END IF; - END; -/ - -CALL proc_hotkeyview(); -DROP PROCEDURE IF EXISTS proc_hotkeyview; - -CREATE OR REPLACE PROCEDURE proc_matview() -AS - BEGIN - IF EXISTS (SELECT oid FROM pg_catalog.pg_class WHERE relname='gs_matview') THEN - REVOKE SELECT ON TABLE pg_catalog.gs_matview FROM PUBLIC; - END IF; - IF EXISTS (SELECT oid FROM pg_catalog.pg_class WHERE relname='gs_matview_dependency') THEN - REVOKE SELECT ON TABLE pg_catalog.gs_matview_dependency FROM PUBLIC; - END IF; - IF EXISTS (SELECT oid FROM pg_catalog.pg_class WHERE relname='gs_matviews') THEN - REVOKE SELECT ON TABLE pg_catalog.gs_matviews FROM PUBLIC; - END IF; - IF EXISTS (SELECT oid FROM pg_catalog.pg_class WHERE relname='track_memory_context_detail') THEN - REVOKE SELECT ON TABLE dbe_perf.track_memory_context_detail FROM PUBLIC; - END IF; - END; -/ - -CALL proc_matview(); -DROP PROCEDURE IF EXISTS proc_matview; - -create or replace function table_skewness(table_name text, column_name text, - OUT seqNum text, OUT Num text, OUT Ratio text, row_num text default '0') -RETURNS setof record -AS $$ -DECLARE - tolal_num text; - row_data record; - execute_query text; - dist_type text; - num int :=0; - sqltmp text; - BEGIN - sqltmp := 'select count(*) from pg_attribute join pg_class on pg_attribute.attrelid = pg_class.oid where pg_class.relname =' || quote_literal(table_name) ||' and pg_attribute.attname = ' ||quote_literal($2); - EXECUTE immediate sqltmp into num; - if num = 0 then - return; - end if; - -- make sure not to affect the logic for non-range/list distribution tables - EXECUTE immediate 'select a.pclocatortype from (pgxc_class a join pg_class b on a.pcrelid = b.oid join pg_namespace c on c.oid = b.relnamespace) - where b.relname = quote_ident(:1) and c.nspname in (select unnest(current_schemas(false)))' into dist_type using table_name; - if dist_type <> 'G' and dist_type <> 'L' then - dist_type = 'H'; -- dist type used to be hardcoded as 'H' - end if; - - if row_num = 0 then - EXECUTE 'select count(1) from ' || $1 into tolal_num; - execute_query = 'select seqNum, count(1) as num - from (select pg_catalog.table_data_skewness(row(' || $2 ||'), ''' || dist_type || ''') as seqNum from ' || $1 || - ') group by seqNum order by num DESC'; - else - tolal_num = row_num; - execute_query = 'select seqNum, count(1) as num - from (select pg_catalog.table_data_skewness(row(' || $2 ||'), ''' || dist_type || ''') as seqNum from ' || $1 || - ' limit ' || row_num ||') group by seqNum order by num DESC'; - end if; - - if tolal_num = 0 then - seqNum = 0; - Num = 0; - Ratio = ROUND(0, 3) || '%'; - return; - end if; - - for row_data in EXECUTE execute_query loop - seqNum = row_data.seqNum; - Num = row_data.num; - Ratio = ROUND(row_data.num / tolal_num * 100, 3) || '%'; - RETURN next; - end loop; - END; -$$LANGUAGE plpgsql NOT FENCED; -drop function if exists report_application_error(text,integer); - -create or replace function table_skewness(table_name text, column_name text, - OUT seqNum text, OUT Num text, OUT Ratio text, row_num text default '0') -RETURNS setof record -AS $$ -DECLARE - tolal_num text; - row_data record; - execute_query text; - dist_type text; - BEGIN - -- make sure not to affect the logic for non-range/list distribution tables - EXECUTE immediate 'select a.pclocatortype from (pgxc_class a join pg_class b on a.pcrelid = b.oid join pg_namespace c on c.oid = b.relnamespace) - where b.relname = quote_ident(:1) and c.nspname in (select unnest(current_schemas(false)))' into dist_type using table_name; - if dist_type <> 'G' and dist_type <> 'L' then - dist_type = 'H'; -- dist type used to be hardcoded as 'H' - end if; - - if row_num = 0 then - EXECUTE 'select count(1) from ' || $1 into tolal_num; - execute_query = 'select seqNum, count(1) as num - from (select pg_catalog.table_data_skewness(row(' || $2 ||'), ''' || dist_type || ''') as seqNum from ' || $1 || - ') group by seqNum order by num DESC'; - else - tolal_num = row_num; - execute_query = 'select seqNum, count(1) as num - from (select pg_catalog.table_data_skewness(row(' || $2 ||'), ''' || dist_type || ''') as seqNum from ' || $1 || - ' limit ' || row_num ||') group by seqNum order by num DESC'; - end if; - - if tolal_num = 0 then - seqNum = 0; - Num = 0; - Ratio = ROUND(0, 3) || '%'; - return; - end if; - - for row_data in EXECUTE execute_query loop - seqNum = row_data.seqNum; - Num = row_data.num; - Ratio = ROUND(row_data.num / tolal_num * 100, 3) || '%'; - RETURN next; - end loop; - END; -$$LANGUAGE plpgsql NOT FENCED; - - -create or replace function pg_catalog.pgxc_cgroup_map_ng_conf(IN ngname text) -returns bool -AS $$ -declare - query_string text; - flag boolean; -begin - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN ngname, IN special; - IF flag = true THEN - return false; - ELSE - query_string := 'execute direct on ALL ''SELECT * from pg_catalog.gs_cgroup_map_ng_conf(''''' || ngname || ''''')'''; - execute query_string; - END IF; - return true; -end; -$$language plpgsql NOT FENCED; - -DO $$ -DECLARE -ans boolean; -user_name text; -query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from - (select * from pg_class where relname = 'db_users' and relnamespace=11 limit 1) into ans; - if ans = true then - GRANT SELECT on pg_catalog.db_users TO public; - - SELECT SESSION_USER INTO user_name; - query_str := 'REVOKE ALL on pg_catalog.db_users FROM ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - end if; -END $$; - -DO $DO$ -DECLARE - ans boolean; - user_name text; - global_query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_os_runtime - (OUT node_name name, OUT id integer, OUT name text, OUT value numeric, OUT comments text, OUT cumulative boolean) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.os_runtime%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.os_runtime'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - id := row_data.id; - name := row_data.name; - value := row_data.value; - comments := row_data.comments; - cumulative := row_data.cumulative; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_os_threads() - RETURNS setof DBE_PERF.os_threads - AS $$ - DECLARE - row_data DBE_PERF.os_threads%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.os_threads'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_instance_time - (OUT node_name name, OUT stat_id integer, OUT stat_name text, OUT value bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.instance_time%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all CN DN node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.instance_time'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - stat_id := row_data.stat_id; - stat_name := row_data.stat_name; - value := row_data.value; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_stat - (OUT node_name name, OUT sessid text, OUT statid integer, OUT statname text, OUT statunit text, OUT value bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.session_stat%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.session_stat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - sessid := row_data.sessid; - statid := row_data.statid; - statname := row_data.statname; - statunit := row_data.statunit; - value := row_data.value; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_time - (OUT node_name name, OUT sessid text, OUT stat_id integer, OUT stat_name text, OUT value bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.session_time%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.session_time'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - sessid := row_data.sessid; - stat_id := row_data.stat_id; - stat_name := row_data.stat_name; - value := row_data.value; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_memory - (OUT node_name name, OUT sessid text, OUT init_mem integer, OUT used_mem integer, OUT peak_mem integer) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.session_memory%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.session_memory'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - sessid := row_data.sessid; - init_mem := row_data.init_mem; - used_mem := row_data.used_mem; - peak_mem := row_data.peak_mem; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_memory_detail - (OUT node_name name, OUT sessid text, OUT sesstype text, OUT contextname text, OUT level smallint, - OUT parent text, OUT totalsize bigint, OUT freesize bigint, OUT usedsize bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.session_memory_detail%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.session_memory_detail'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - sessid := row_data.sessid; - sesstype := row_data.sesstype; - contextname := row_data.contextname; - level := row_data.level; - parent := row_data.parent; - totalsize := row_data.totalsize; - freesize := row_data.freesize; - usedsize := row_data.usedsize; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_thread_wait_status() - RETURNS setof DBE_PERF.thread_wait_status - AS $$ - DECLARE - row_data DBE_PERF.thread_wait_status%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all cn dn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.thread_wait_status'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_history_table() - RETURNS setof DBE_PERF.operator_history_table - AS $$ - DECLARE - row_data DBE_PERF.operator_history_table%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the CN node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.operator_history_table '''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_history() - RETURNS setof DBE_PERF.operator_history - AS $$ - DECLARE - row_data DBE_PERF.operator_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.operator_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_runtime() - RETURNS setof DBE_PERF.operator_runtime - AS $$ - DECLARE - row_data DBE_PERF.operator_runtime%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.operator_runtime'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_complex_history() - RETURNS setof DBE_PERF.statement_complex_history - AS $$ - DECLARE - row_data DBE_PERF.statement_complex_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement_complex_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_complex_runtime() - RETURNS setof DBE_PERF.statement_complex_runtime - AS $$ - DECLARE - row_data DBE_PERF.statement_complex_runtime%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.statement_complex_runtime'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_shared_memory_detail - (OUT node_name name, OUT contextname text, OUT level smallint, OUT parent text, - OUT totalsize bigint, OUT freesize bigint, OUT usedsize bigint) - RETURNS setof record - AS $$ - DECLARE - row_name record; - row_data DBE_PERF.shared_memory_detail%rowtype; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.shared_memory_detail'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - contextname := row_data.contextname; - level := row_data.level; - parent := row_data.parent; - totalsize := row_data.totalsize; - freesize := row_data.freesize; - usedsize := row_data.usedsize; - RETURN NEXT; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_all_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_all_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_all_indexes - (OUT schemaname name, OUT toastrelschemaname name, OUT toastrelname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_blks_read AS idx_blks_read, - T.idx_blks_hit AS idx_blks_hit - FROM DBE_PERF.statio_all_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_all_sequences - (OUT node_name name, OUT relid oid, OUT schemaname name, - OUT relname name, OUT blks_read bigint, OUT blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_all_sequences'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - blks_read := row_data.blks_read; - blks_hit := row_data.blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint, - OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, - OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_all_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_all_tables - (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT heap_blks_read bigint, - OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, - OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - C.relname AS relname, - C.schemaname AS schemaname, - O.relname AS toastrelname, - N.nspname AS toastrelschemaname, - C.heap_blks_read AS heap_blks_read, - C.heap_blks_hit AS heap_blks_hit, - C.idx_blks_read AS idx_blks_read, - C.idx_blks_hit AS idx_blks_hit, - C.toast_blks_read AS toast_blks_read, - C.toast_blks_hit AS toast_blks_hit, - C.tidx_blks_read AS tidx_blks_read, - C.tidx_blks_hit AS tidx_blks_hit - FROM DBE_PERF.statio_all_tables C - LEFT JOIN pg_class O ON C.relid = O.reltoastrelid - LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_sys_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_sys_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_sys_indexes - (OUT schemaname name, OUT toastrelschemaname name, OUT toastrelname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_blks_read AS idx_blks_read, - T.idx_blks_hit AS idx_blks_hit - FROM DBE_PERF.statio_sys_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_sys_sequences - (OUT node_name name, OUT relid oid, OUT schemaname name, - OUT relname name, OUT blks_read bigint, OUT blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_sys_sequences'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - blks_read := row_data.blks_read; - blks_hit := row_data.blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_sys_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint, - OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, - OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_sys_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_sys_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT heap_blks_read bigint, OUT heap_blks_hit bigint, - OUT idx_blks_read bigint, OUT idx_blks_hit bigint, - OUT toast_blks_read bigint, OUT toast_blks_hit bigint, - OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - C.schemaname AS schemaname, - C.relname AS relname, - O.relname AS toastrelname, - N.nspname AS toastrelschemaname, - C.heap_blks_read AS heap_blks_read, - C.heap_blks_hit AS heap_blks_hit, - C.idx_blks_read AS idx_blks_read, - C.idx_blks_hit AS idx_blks_hit, - C.toast_blks_read AS toast_blks_read, - C.toast_blks_hit AS toast_blks_hit, - C.tidx_blks_read AS tidx_blks_read, - C.tidx_blks_hit AS tidx_blks_hit - FROM DBE_PERF.statio_sys_tables C - LEFT JOIN pg_class O ON C.relid = O.reltoastrelid - LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_user_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_user_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_user_indexes - (OUT schemaname name, OUT toastrelschemaname name, OUT toastrelname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_blks_read AS idx_blks_read, - T.idx_blks_hit AS idx_blks_hit - FROM DBE_PERF.statio_user_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_user_sequences - (OUT node_name name, OUT relid oid, OUT schemaname name, - OUT relname name, OUT blks_read bigint, OUT blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_user_sequences'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - blks_read := row_data.blks_read; - blks_hit := row_data.blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_user_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint, - OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, - OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_user_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_user_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT heap_blks_read bigint, OUT heap_blks_hit bigint, - OUT idx_blks_read bigint, OUT idx_blks_hit bigint, - OUT toast_blks_read bigint, OUT toast_blks_hit bigint, - OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - C.schemaname AS schemaname, - C.relname AS relname, - O.relname AS toastrelname, - N.nspname AS toastrelschemaname, - C.heap_blks_read AS heap_blks_read, - C.heap_blks_hit AS heap_blks_hit, - C.idx_blks_read AS idx_blks_read, - C.idx_blks_hit AS idx_blks_hit, - C.toast_blks_read AS toast_blks_read, - C.toast_blks_hit AS toast_blks_hit, - C.tidx_blks_read AS tidx_blks_read, - C.tidx_blks_hit AS tidx_blks_hit - FROM DBE_PERF.statio_user_tables C - LEFT JOIN pg_class O ON C.relid = O.reltoastrelid - LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_dn_stat_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_all_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_dn_stat_all_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd, - T.n_live_tup AS n_live_tup, - T.n_dead_tup AS n_dead_tup, - T.last_vacuum AS last_vacuum, - T.last_autovacuum AS last_autovacuum, - T.last_analyze AS last_analyze, - T.last_autoanalyze AS last_autoanalyze, - T.vacuum_count AS vacuum_count, - T.autovacuum_count AS autovacuum_count, - T.analyze_count AS analyze_count, - T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_all_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_cn_stat_all_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd, - T.n_live_tup AS n_live_tup, - T.n_dead_tup AS n_dead_tup, - T.last_vacuum AS last_vacuum, - T.last_autovacuum AS last_autovacuum, - T.last_analyze AS last_analyze, - T.last_autoanalyze AS last_autoanalyze, - T.vacuum_count AS vacuum_count, - T.autovacuum_count AS autovacuum_count, - T.analyze_count AS analyze_count, - T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_all_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid - WHERE T.schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_all_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, - OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_all_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_all_indexes - (OUT schemaname name, OUT relname name, OUT indexrelname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_scan AS idx_scan, - T.idx_tup_read AS idx_tup_read, - T.idx_tup_fetch AS idx_tup_fetch - FROM DBE_PERF.stat_all_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_sys_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, - OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_sys_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_sys_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, - OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd, - T.n_live_tup AS n_live_tup, - T.n_dead_tup AS n_dead_tup, - T.last_vacuum AS last_vacuum, - T.last_autovacuum AS last_autovacuum, - T.last_analyze AS last_analyze, - T.last_autoanalyze AS last_autoanalyze, - T.vacuum_count AS vacuum_count, - T.autovacuum_count AS autovacuum_count, - T.analyze_count AS analyze_count, - T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_sys_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_sys_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, - OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_sys_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_sys_indexes - (OUT schemaname name, OUT relname name, OUT indexrelname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_scan AS idx_scan, - T.idx_tup_read AS idx_tup_read, - T.idx_tup_fetch AS idx_tup_fetch - FROM DBE_PERF.stat_sys_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_user_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, - OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''D'')'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_user_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_user_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, - OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''D'')'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd, - T.n_live_tup AS n_live_tup, - T.n_dead_tup AS n_dead_tup, - T.last_vacuum AS last_vacuum, - T.last_autovacuum AS last_autovacuum, - T.last_analyze AS last_analyze, - T.last_autoanalyze AS last_autoanalyze, - T.vacuum_count AS vacuum_count, - T.autovacuum_count AS autovacuum_count, - T.analyze_count AS analyze_count, - T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_user_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_user_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, - OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_user_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_user_indexes - (OUT schemaname name, OUT relname name, OUT indexrelname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_scan AS idx_scan, - T.idx_tup_read AS idx_tup_read, - T.idx_tup_fetch AS idx_tup_fetch - FROM DBE_PERF.stat_user_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_database - (OUT node_name name, OUT datid oid, OUT datname name, OUT numbackends integer, OUT xact_commit bigint, - OUT xact_rollback bigint, OUT blks_read bigint, OUT blks_hit bigint, OUT tup_returned bigint, OUT tup_fetched bigint, - OUT tup_inserted bigint, OUT tup_updated bigint, OUT tup_deleted bigint, OUT conflicts bigint, OUT temp_files bigint, - OUT temp_bytes bigint, OUT deadlocks bigint, OUT blk_read_time double precision, OUT blk_write_time double precision, - OUT stats_reset timestamp with time zone) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.stat_database%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_database'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - datid := row_data.datid; - datname := row_data.datname; - numbackends := row_data.numbackends; - xact_commit := row_data.xact_commit; - xact_rollback := row_data.xact_rollback; - blks_read := row_data.blks_read; - blks_hit := row_data.blks_hit; - tup_returned := row_data.tup_returned; - tup_fetched := row_data.tup_fetched; - tup_inserted := row_data.tup_inserted; - tup_updated := row_data.tup_updated; - tup_deleted := row_data.tup_deleted; - conflicts := row_data.conflicts; - temp_files := row_data.temp_files; - temp_bytes := row_data.temp_bytes; - deadlocks := row_data.deadlocks; - blk_read_time := row_data.blk_read_time; - blk_write_time := row_data.blk_write_time; - stats_reset := row_data.stats_reset; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_database_conflicts - (OUT node_name name, OUT datid oid, OUT datname name, OUT confl_tablespace bigint, - OUT confl_lock bigint, OUT confl_snapshot bigint, OUT confl_bufferpin bigint, OUT confl_deadlock bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.stat_database_conflicts%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_database_conflicts'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - datid := row_data.datid; - datname := row_data.datname; - confl_tablespace := row_data.confl_tablespace; - confl_lock := row_data.confl_lock; - confl_snapshot := row_data.confl_snapshot; - confl_bufferpin := row_data.confl_bufferpin; - confl_deadlock := row_data.confl_deadlock; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_sys_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, - OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.stat_xact_sys_tables%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_xact_sys_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_xact_sys_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, - OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_sys_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_user_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, - OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.stat_xact_user_tables%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''D'')'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_xact_user_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_xact_user_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, - OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''D'')'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_user_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_user_functions - (OUT node_name name, OUT funcid oid, OUT schemaname name, OUT funcname name, OUT calls bigint, - OUT total_time double precision, OUT self_time double precision) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.stat_user_functions%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_user_functions'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - funcid := row_data.funcid; - schemaname := row_data.schemaname; - funcname := row_data.funcname; - calls := row_data.calls; - total_time := row_data.total_time; - self_time := row_data.self_time; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_user_functions - (OUT node_name name, OUT funcid oid, OUT schemaname name, OUT funcname name, OUT calls bigint, - OUT total_time double precision, OUT self_time double precision) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.stat_xact_user_functions%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_xact_user_functions'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - funcid := row_data.funcid; - schemaname := row_data.schemaname; - funcname := row_data.funcname; - calls := row_data.calls; - total_time := row_data.total_time; - self_time := row_data.self_time; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_bad_block - (OUT node_name TEXT, OUT databaseid INT4, OUT tablespaceid INT4, OUT relfilenode INT4, OUT forknum INT4, - OUT error_count INT4, OUT first_time timestamp with time zone, OUT last_time timestamp with time zone) - RETURNS setof record - AS $$ - DECLARE - row_name record; - each_node_out record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_bad_block'''; - FOR each_node_out IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - databaseid := each_node_out.databaseid; - tablespaceid := each_node_out.tablespaceid; - relfilenode := each_node_out.relfilenode; - forknum := each_node_out.forknum; - error_count := each_node_out.error_count; - first_time := each_node_out.first_time; - last_time := each_node_out.last_time; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_file_redo_iostat - (OUT node_name name, OUT phywrts bigint, OUT phyblkwrt bigint, OUT writetim bigint, - OUT avgiotim bigint, OUT lstiotim bigint, OUT miniotim bigint, OUT maxiowtm bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.file_redo_iostat%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.file_redo_iostat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - phywrts := row_data.phywrts; - phyblkwrt := row_data.phyblkwrt; - writetim := row_data.writetim; - avgiotim := row_data.avgiotim; - lstiotim := row_data.lstiotim; - miniotim := row_data.miniotim; - maxiowtm := row_data.maxiowtm; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_rel_iostat - (OUT node_name name, OUT phyrds bigint, - OUT phywrts bigint, OUT phyblkrd bigint, OUT phyblkwrt bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.local_rel_iostat%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.local_rel_iostat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - phyrds := row_data.phyrds; - phywrts := row_data.phywrts; - phyblkrd := row_data.phyblkrd; - phyblkwrt := row_data.phyblkwrt; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_file_iostat - (OUT node_name name, OUT filenum oid, OUT dbid oid, OUT spcid oid, OUT phyrds bigint, - OUT phywrts bigint, OUT phyblkrd bigint, OUT phyblkwrt bigint, OUT readtim bigint, - OUT writetim bigint, OUT avgiotim bigint, OUT lstiotim bigint, OUT miniotim bigint, OUT maxiowtm bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.file_iostat%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.file_iostat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - filenum := row_data.filenum; - dbid := row_data.dbid; - spcid := row_data.spcid; - phyrds := row_data.phyrds; - phywrts := row_data.phywrts; - phyblkrd := row_data.phyblkrd; - phyblkwrt := row_data.phyblkwrt; - readtim := row_data.readtim; - writetim := row_data.writetim; - avgiotim := row_data.avgiotim; - lstiotim := row_data.lstiotim; - miniotim := row_data.miniotim; - maxiowtm := row_data.maxiowtm; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_locks - (OUT node_name name, - OUT locktype text, - OUT database oid, - OUT relation oid, - OUT page integer, - OUT tuple smallint, - OUT virtualxid text, - OUT transactionid xid, - OUT classid oid, - OUT objid oid, - OUT objsubid smallint, - OUT virtualtransaction text, - OUT pid bigint, - OUT mode text, - OUT granted boolean, - OUT fastpath boolean) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.locks%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.locks'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - locktype := row_data.locktype; - database := row_data.database; - relation := row_data.relation; - page := row_data.page; - tuple := row_data.tuple; - virtualxid := row_data.virtualxid; - transactionid := row_data.classid; - objid := row_data.objid; - objsubid := row_data.objsubid; - virtualtransaction := row_data.virtualtransaction; - pid := row_data.pid; - mode := row_data.mode; - granted := row_data.granted; - fastpath := row_data.fastpath; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_replication_slots - (OUT node_name name, - OUT slot_name text, - OUT plugin text, - OUT slot_type text, - OUT datoid oid, - OUT database name, - OUT active boolean, - OUT x_min xid, - OUT catalog_xmin xid, - OUT restart_lsn text, - OUT dummy_standby boolean) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.replication_slots%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.replication_slots'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - slot_name := row_data.slot_name; - plugin := row_data.plugin; - slot_type := row_data.slot_type; - datoid := row_data.datoid; - database := row_data.database; - active := row_data.active; - x_min := row_data.xmin; - catalog_xmin := row_data.catalog_xmin; - restart_lsn := row_data.restart_lsn; - dummy_standby := row_data.dummy_standby; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_bgwriter_stat - (OUT node_name name, - OUT checkpoints_timed bigint, - OUT checkpoints_req bigint, - OUT checkpoint_write_time double precision, - OUT checkpoint_sync_time double precision, - OUT buffers_checkpoint bigint, - OUT buffers_clean bigint, - OUT maxwritten_clean bigint, - OUT buffers_backend bigint, - OUT buffers_backend_fsync bigint, - OUT buffers_alloc bigint, - OUT stats_reset timestamp with time zone) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.bgwriter_stat%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.bgwriter_stat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - checkpoints_timed := row_data.checkpoints_timed; - checkpoints_req := row_data.checkpoints_req; - checkpoint_write_time := row_data.checkpoint_write_time; - checkpoint_sync_time := row_data.checkpoint_sync_time; - buffers_checkpoint := row_data.buffers_checkpoint; - buffers_clean := row_data.buffers_clean; - maxwritten_clean := row_data.maxwritten_clean; - buffers_backend := row_data.buffers_backend; - buffers_backend_fsync := row_data.buffers_backend_fsync; - buffers_alloc := row_data.buffers_alloc; - stats_reset := row_data.stats_reset; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_replication_stat - (OUT node_name name, - OUT pid bigint, - OUT usesysid oid, - OUT usename name, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT backend_start timestamp with time zone, - OUT state text, - OUT sender_sent_location text, - OUT receiver_write_location text, - OUT receiver_flush_location text, - OUT receiver_replay_location text, - OUT sync_priority integer, - OUT sync_state text) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.replication_stat%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.replication_stat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - pid := row_data.pid; - usesysid := row_data.usesysid; - usename := row_data.usename; - client_addr := row_data.client_addr; - client_hostname := row_data.client_hostname; - client_port := row_data.client_port; - state := row_data.state; - sender_sent_location := row_data.sender_sent_location; - receiver_write_location := row_data.receiver_write_location; - receiver_flush_location := row_data.receiver_flush_location; - receiver_replay_location := row_data.receiver_replay_location; - sync_priority := row_data.sync_priority; - sync_state := row_data.sync_state; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_transactions_running_xacts() - RETURNS setof DBE_PERF.transactions_running_xacts - AS $$ - DECLARE - row_data DBE_PERF.transactions_running_xacts%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all cn dn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.transactions_running_xacts'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_transactions_running_xacts() - RETURNS setof DBE_PERF.transactions_running_xacts - AS $$ - DECLARE - row_data DBE_PERF.transactions_running_xacts%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.transactions_running_xacts'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_transactions_prepared_xacts() - RETURNS setof DBE_PERF.transactions_prepared_xacts - AS $$ - DECLARE - row_data DBE_PERF.transactions_prepared_xacts%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all cn dn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.transactions_prepared_xacts'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_transactions_prepared_xacts() - RETURNS setof DBE_PERF.transactions_prepared_xacts - AS $$ - DECLARE - row_data DBE_PERF.transactions_prepared_xacts%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.transactions_prepared_xacts'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statement() - RETURNS setof DBE_PERF.statement - AS $$ - DECLARE - row_data DBE_PERF.statement%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_count() - RETURNS setof DBE_PERF.statement_count - AS $$ - DECLARE - row_data DBE_PERF.statement_count%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement_count'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_config_settings - (out node_name text, - out name text, - out setting text, - out unit text, - out category text, - out short_desc text, - out extra_desc text, - out context text, - out vartype text, - out source text, - out min_val text, - out max_val text, - out enumvals text[], - out boot_val text, - out reset_val text, - out sourcefile text, - out sourceline integer) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.config_settings%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.config_settings'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - name := row_data.name; - setting := row_data.setting; - unit := row_data.unit; - category := row_data.category; - short_desc := row_data.short_desc; - extra_desc := row_data.extra_desc; - context := row_data.context; - vartype := row_data.vartype; - source := row_data.source; - min_val := row_data.min_val; - max_val := row_data.max_val; - enumvals := row_data.enumvals; - boot_val := row_data.boot_val; - reset_val := row_data.reset_val; - sourcefile := row_data.sourcefile; - sourceline := row_data.sourceline; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_wait_events() - RETURNS setof DBE_PERF.wait_events - AS $$ - DECLARE - row_data DBE_PERF.wait_events%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.wait_events'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_user_login() - RETURNS SETOF DBE_PERF.user_login - AS $$ - DECLARE - ROW_DATA DBE_PERF.user_login%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE=''C'' AND nodeis_active = true'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.user_login'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_record_reset_time(OUT node_name text, OUT reset_time timestamp with time zone) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select * from get_node_stat_reset_time()'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - reset_time := row_data.get_node_stat_reset_time; - return next; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.global_threadpool_status() - RETURNS SETOF DBE_PERF.local_threadpool_status - AS $$ - DECLARE - ROW_DATA DBE_PERF.local_threadpool_status%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'') AND nodeis_active=true'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.local_threadpool_status'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - DROP FUNCTION IF EXISTS DBE_PERF.get_global_active_session() CASCADE; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, - OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.stat_xact_all_tables%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_xact_all_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - END LOOP; - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_xact_all_tables where schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_xact_all_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, - OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - N.nspname AS toastrelschemaname, - C.relname AS toastrelname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_all_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - END LOOP; - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_all_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid - WHERE T.schemaname = ''''pg_catalog'''' OR T.schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_stat_activity - (out coorname text, out datid oid, out datname text, out pid bigint, - out usesysid oid, out usename text, out application_name text, out client_addr inet, - out client_hostname text, out client_port integer, out backend_start timestamptz, - out xact_start timestamptz, out query_start timestamptz, out state_change timestamptz, - out waiting boolean, out enqueue text, out state text, out resource_pool name, - out query_id bigint, out query text) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.session_stat_activity%rowtype; - coor_name record; - fet_active text; - fetch_coor text; - BEGIN - --Get all cn node names - fetch_coor := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR coor_name IN EXECUTE(fetch_coor) LOOP - coorname := coor_name.node_name; - fet_active := 'EXECUTE DIRECT ON (' || coor_name.node_name || ') ''SELECT * FROM DBE_PERF.session_stat_activity'''; - FOR row_data IN EXECUTE(fet_active) LOOP - coorname := coorname; - datid :=row_data.datid; - datname := row_data.datname; - pid := row_data.pid; - usesysid :=row_data.usesysid; - usename := row_data.usename; - application_name := row_data.application_name; - client_addr := row_data.client_addr; - client_hostname :=row_data.client_hostname; - client_port :=row_data.client_port; - backend_start := row_data.backend_start; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - state_change := row_data.state_change; - waiting := row_data.waiting; - enqueue := row_data.enqueue; - state := row_data.state; - resource_pool :=row_data.resource_pool; - query_id :=row_data.query_id; - query := row_data.query; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_cn_stat_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT * FROM DBE_PERF.stat_all_tables WHERE schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_stat_db_cu - (OUT node_name1 text, OUT db_name text, - OUT mem_hit bigint, OUT hdd_sync_read bigint, - OUT hdd_asyn_read bigint) - RETURNS setof record - AS $$ - DECLARE - row_name record; - each_node_out record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT D.datname AS datname, - pg_stat_get_db_cu_mem_hit(D.oid) AS mem_hit, - pg_stat_get_db_cu_hdd_sync(D.oid) AS hdd_sync_read, - pg_stat_get_db_cu_hdd_asyn(D.oid) AS hdd_asyn_read - FROM pg_database D;'''; - FOR each_node_out IN EXECUTE(query_str) LOOP - node_name1 := row_name.node_name; - db_name := each_node_out.datname; - mem_hit := each_node_out.mem_hit; - hdd_sync_read := each_node_out.hdd_sync_read; - hdd_asyn_read := each_node_out.hdd_asyn_read; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_cn_stat_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT * FROM DBE_PERF.stat_all_tables WHERE schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_stat_activity - (out coorname text, out datid oid, out datname text, out pid bigint, - out usesysid oid, out usename text, out application_name text, out client_addr inet, - out client_hostname text, out client_port integer, out backend_start timestamptz, - out xact_start timestamptz, out query_start timestamptz, out state_change timestamptz, - out waiting boolean, out enqueue text, out state text, out resource_pool name, - out query_id bigint, out query text) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.session_stat_activity%rowtype; - coor_name record; - fet_active text; - fetch_coor text; - BEGIN - --Get all cn node names - fetch_coor := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR coor_name IN EXECUTE(fetch_coor) LOOP - coorname := coor_name.node_name; - fet_active := 'EXECUTE DIRECT ON (' || coor_name.node_name || ') ''SELECT * FROM DBE_PERF.session_stat_activity'''; - FOR row_data IN EXECUTE(fet_active) LOOP - coorname := coorname; - datid :=row_data.datid; - datname := row_data.datname; - pid := row_data.pid; - usesysid :=row_data.usesysid; - usename := row_data.usename; - application_name := row_data.application_name; - client_addr := row_data.client_addr; - client_hostname :=row_data.client_hostname; - client_port :=row_data.client_port; - backend_start := row_data.backend_start; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - state_change := row_data.state_change; - waiting := row_data.waiting; - enqueue := row_data.enqueue; - state := row_data.state; - resource_pool :=row_data.resource_pool; - query_id :=row_data.query_id; - query := row_data.query; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - end if; -END $DO$; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_statistics() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM gs_wlm_session_statistics'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_history() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM gs_wlm_session_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_info() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM gs_wlm_session_info'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -DROP FUNCTION IF EXISTS pg_catalog.pgxc_get_wlm_session_info_bytime(text, TIMESTAMP, TIMESTAMP, int) CASCADE; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_info_bytime(text, TIMESTAMP, TIMESTAMP, int) -RETURNS setof gs_wlm_session_info -AS $$ -DECLARE - row_data gs_wlm_session_info%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_cn text; - BEGIN - IF $1 IN ('start_time', 'finish_time') THEN - - ELSE - raise WARNING 'Illegal character entered for function, colname must be start_time or finish_time'; - return; - END IF; - - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - query_str_cn := 'SELECT * FROM gs_wlm_session_info where '||$1||'>'''''||$2||''''' and '||$1||'<'''''||$3||''''' limit '||$4; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_cn||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_wlm_rebuild_user_resource_pool() -RETURNS setof gs_wlm_rebuild_user_resource_pool -AS $$ -DECLARE - row_data gs_wlm_rebuild_user_resource_pool%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM gs_wlm_rebuild_user_resource_pool'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_wlm_get_workload_records() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM gs_wlm_workload_records'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_sql_count() -RETURNS setof gs_sql_count -AS $$ -DECLARE - row_data gs_sql_count%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM gs_sql_count'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_os_threads() -RETURNS setof pg_os_threads -AS $$ -DECLARE - row_data pg_os_threads%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_os_threads'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_running_xacts() -RETURNS setof pg_running_xacts -AS $$ -DECLARE - row_data pg_running_xacts%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the coordinator node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM pg_running_xacts'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_variable_info() -RETURNS setof pg_variable_info -AS $$ -DECLARE - row_data pg_variable_info%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM pg_variable_info'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_get_wal_senders_status(OUT nodename text, OUT source_ip text, OUT source_port integer,OUT dest_ip text, OUT dest_port integer,OUT sender_pid int, OUT local_role text, OUT peer_role text, OUT peer_state text, - OUT state text, - OUT sender_sent_location text, OUT sender_write_location text, OUT sender_flush_location text, OUT sender_replay_location text, - OUT receiver_received_location text, OUT receiver_write_location text, OUT receiver_flush_location text, OUT receiver_replay_location text) - - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - source_addr text; - dest_addr text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_stat_get_wal_senders()'''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename = row_name.node_name; - source_addr = substring(row_data.channel from 0 for position('-->' in row_data.channel)); - dest_addr = substring(row_data.channel from position('-->' in row_data.channel) + 3); - source_ip = substring(source_addr from 0 for position(':' in source_addr)); - source_port = cast(substring(source_addr from position(':' in source_addr) + 1) as integer); - dest_ip = substring(dest_addr from 0 for position(':' in dest_addr)); - dest_port = cast(substring(dest_addr from position(':' in dest_addr) + 1) as integer); - sender_pid = row_data.sender_pid; - local_role = row_data.local_role; - peer_role = row_data.peer_role; - peer_state = row_data.peer_state; - state = row_data.state; - sender_sent_location = row_data.sender_sent_location; - sender_write_location = row_data.sender_write_location; - sender_flush_location = row_data.sender_flush_location; - sender_replay_location = row_data.sender_replay_location; - receiver_received_location = row_data.receiver_received_location; - receiver_write_location = row_data.receiver_write_location; - receiver_flush_location = row_data.receiver_flush_location; - receiver_replay_location = row_data.receiver_replay_location; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_get_stat_session_cu(OUT node_name1 text, OUT mem_hit int, OUT hdd_sync_read int, OUT hdd_asyn_read int) -RETURNS setof record -AS $$ -DECLARE - row_name record; - each_node_out record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_stat_session_cu()'''; - FOR each_node_out IN EXECUTE(query_str) LOOP - node_name1 := row_name.node_name; - mem_hit := each_node_out.mem_hit; - hdd_sync_read := each_node_out.hdd_sync_read; - hdd_asyn_read := each_node_out.hdd_asyn_read; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_stat_reset() -RETURNS void -AS $$ -DECLARE - row_name record; - each_node_out record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_stat_reset()'''; - EXECUTE(query_str); - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_operator_statistics() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM gs_wlm_operator_statistics'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_operator_history() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM gs_wlm_operator_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_operator_info() -RETURNS setof gs_wlm_operator_info -AS $$ -DECLARE - row_data gs_wlm_operator_info%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM gs_wlm_operator_info'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_ec_operator_statistics() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM gs_wlm_ec_operator_statistics'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_ec_operator_history() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM gs_wlm_ec_operator_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_ec_operator_info() -RETURNS setof gs_wlm_ec_operator_info -AS $$ -DECLARE - row_data gs_wlm_ec_operator_info%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM gs_wlm_ec_operator_info'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_bad_block(OUT nodename TEXT, OUT databaseid INT4, OUT tablespaceid INT4, OUT relfilenode INT4, OUT forknum INT4, OUT error_count INT4, OUT first_time timestamp with time zone, OUT last_time timestamp with time zone) -RETURNS setof record -AS $$ -DECLARE - row_name record; - each_node_out record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_stat_bad_block()'''; - FOR each_node_out IN EXECUTE(query_str) LOOP - nodename := row_name.node_name; - databaseid := each_node_out.databaseid; - tablespaceid := each_node_out.tablespaceid; - relfilenode := each_node_out.relfilenode; - forknum := each_node_out.forknum; - error_count := each_node_out.error_count; - first_time := each_node_out.first_time; - last_time := each_node_out.last_time; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_bad_block_clear() -RETURNS void -AS $$ -DECLARE - row_name record; - each_node_out record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_stat_bad_block_clear()'''; - EXECUTE(query_str); - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -DROP FUNCTION IF EXISTS pg_catalog.pgxc_query_audit(IN starttime TIMESTAMPTZ, IN endtime TIMESTAMPTZ, OUT "time" TIMESTAMPTZ, OUT "type" text, OUT "result" text, OUT userid text, OUT username text, OUT database text, OUT client_conninfo text, OUT "object_name" text, OUT detail_info text, OUT node_name text, OUT thread_id text, OUT local_port text, OUT remote_port text) - CASCADE; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_query_audit(IN starttime TIMESTAMPTZ, IN endtime TIMESTAMPTZ, OUT "time" TIMESTAMPTZ, OUT "type" text, OUT "result" text, OUT userid text, OUT username text, OUT database text, OUT client_conninfo text, OUT "object_name" text, OUT detail_info text, OUT node_name text, OUT thread_id text, OUT local_port text, OUT remote_port text) -RETURNS setof record -AS $$ -DECLARE - row_name record; - row_data record; - query_str text; - query_str_nodes text; - BEGIN - --Get the node names of all CNs - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_catalog.pg_query_audit(''''' || starttime || ''''',''''' || endtime || ''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - "time" := row_data."time"; - "type" := row_data."type"; - "result" := row_data."result"; - userid := row_data.userid; - username := row_data.username; - database := row_data.database; - client_conninfo := row_data.client_conninfo; - "object_name" := row_data."object_name"; - detail_info := row_data.detail_info; - node_name := row_data.node_name; - thread_id := row_data.thread_id; - local_port := row_data.local_port; - remote_port := row_data.remote_port; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -DROP FUNCTION IF EXISTS pg_catalog.pgxc_stat_all_tables() - CASCADE; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_all_tables() -RETURNS setof pg_stat_all_tables -AS $$ -DECLARE - row_data pg_stat_all_tables%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_stat_all_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_stat_all_tables where schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE VIEW pg_catalog.pgxc_get_stat_all_tables AS - SELECT oid relid, s.relname,s.schemaname,s.n_tup_ins,s.n_tup_upd,s.n_tup_del,s.n_live_tup,s.n_dead_tup,s.dirty_page_rate - FROM pg_class p, - (SELECT relname, schemaname, SUM(n_tup_ins) n_tup_ins, SUM(n_tup_upd) n_tup_upd, SUM(n_tup_del) n_tup_del, SUM(n_live_tup) n_live_tup, SUM(n_dead_tup) n_dead_tup, CAST((SUM(n_dead_tup) / SUM(n_dead_tup + n_live_tup + 0.0001) * 100) - AS NUMERIC(5,2)) dirty_page_rate FROM pgxc_stat_all_tables() GROUP BY (relname,schemaname)) s - WHERE p.relname = s.relname AND p.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = s.schemaname) AND p.relname NOT LIKE '%pg_cudesc%' ORDER BY dirty_page_rate DESC; - - -CREATE OR REPLACE FUNCTION pg_catalog.gs_get_stat_db_cu(OUT node_name1 text, OUT db_name text, OUT mem_hit bigint, OUT hdd_sync_read bigint, OUT hdd_asyn_read bigint) -RETURNS setof record -AS $$ -DECLARE - row_name record; - each_node_out record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT D.datname AS datname, - pg_stat_get_db_cu_mem_hit(D.oid) AS mem_hit, - pg_stat_get_db_cu_hdd_sync(D.oid) AS hdd_sync_read, - pg_stat_get_db_cu_hdd_asyn(D.oid) AS hdd_asyn_read - FROM pg_database D;'''; - FOR each_node_out IN EXECUTE(query_str) LOOP - node_name1 := row_name.node_name; - db_name := each_node_out.datname; - mem_hit := each_node_out.mem_hit; - hdd_sync_read := each_node_out.hdd_sync_read; - hdd_asyn_read := each_node_out.hdd_asyn_read; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_delta_info(IN rel TEXT, OUT node_name TEXT, OUT part_name TEXT, OUT live_tuple INT8, OUT data_size INT8, OUT blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_str_nodes text; - query_str text; - rel_info record; - row_name record; - row_data record; - BEGIN - EXECUTE format('select c.relname,n.nspname from pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) where C.oid = (select %L::regclass::oid)', rel) into rel_info; - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_catalog.pg_get_delta_info('''''||rel_info.relname||''''','''''||rel_info.nspname||''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - live_tuple := row_data.live_tuple; - data_size := row_data.data_size; - blockNum := row_data.blockNum; - part_name := row_data.part_name; - return next; - END LOOP; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_activity_with_conninfo -( -out coorname text, -out datid oid, -out datname text, -out pid bigint, -out sessionid bigint, -out usesysid oid, -out usename text, -out application_name text, -out client_addr inet, -out client_hostname text, -out client_port integer, -out backend_start timestamptz, -out xact_start timestamptz, -out query_start timestamptz, -out state_change timestamptz, -out waiting boolean, -out enqueue text, -out state text, -out resource_pool name, -out query_id bigint, -out query text, -out connection_info text -) -RETURNS setof record -AS $$ -DECLARE - row_data pg_stat_activity%rowtype; - coor_name record; - fet_active text; - fetch_coor text; - BEGIN - --Get all the node names - fetch_coor := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR coor_name IN EXECUTE(fetch_coor) LOOP - coorname := coor_name.node_name; - fet_active := 'EXECUTE DIRECT ON (' || coor_name.node_name || ') ''SELECT * FROM pg_stat_activity '''; - FOR row_data IN EXECUTE(fet_active) LOOP - coorname := coorname; - datid :=row_data.datid; - datname := row_data.datname; - pid := row_data.pid; - sessionid := row_data.sessionid; - usesysid :=row_data.usesysid; - usename := row_data.usename; - application_name := row_data.application_name; - client_addr := row_data.client_addr; - client_hostname :=row_data.client_hostname; - client_port :=row_data.client_port; - backend_start := row_data.backend_start; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - state_change := row_data.state_change; - waiting := row_data.waiting; - enqueue := row_data.enqueue; - state := row_data.state; - resource_pool :=row_data.resource_pool; - query_id :=row_data.query_id; - query := row_data.query; - connection_info := row_data.connection_info; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_activity -( -out coorname text, -out datid oid, -out datname text, -out pid bigint, -out sessionid bigint, -out usesysid oid, -out usename text, -out application_name text, -out client_addr inet, -out client_hostname text, -out client_port integer, -out backend_start timestamptz, -out xact_start timestamptz, -out query_start timestamptz, -out state_change timestamptz, -out waiting boolean, -out enqueue text, -out state text, -out resource_pool name, -out query_id bigint, -out query text -) -RETURNS setof record -AS $$ -DECLARE - row_data pg_stat_activity%rowtype; - coor_name record; - fet_active text; - fetch_coor text; - BEGIN - --Get all the node names - fetch_coor := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR coor_name IN EXECUTE(fetch_coor) LOOP - coorname := coor_name.node_name; - fet_active := 'EXECUTE DIRECT ON (' || coor_name.node_name || ') ''SELECT * FROM pg_stat_activity '''; - FOR row_data IN EXECUTE(fet_active) LOOP - coorname := coorname; - datid :=row_data.datid; - datname := row_data.datname; - pid := row_data.pid; - sessionid := row_data.sessionid; - usesysid :=row_data.usesysid; - usename := row_data.usename; - application_name := row_data.application_name; - client_addr := row_data.client_addr; - client_hostname :=row_data.client_hostname; - client_port :=row_data.client_port; - backend_start := row_data.backend_start; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - state_change := row_data.state_change; - waiting := row_data.waiting; - enqueue := row_data.enqueue; - state := row_data.state; - resource_pool :=row_data.resource_pool; - query_id :=row_data.query_id; - query := row_data.query; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -create or replace function pg_catalog.pgxc_cgroup_map_ng_conf(IN ngname text) -returns bool -AS $$ -declare - host_info record; - query_str text; - query_string text; - flag boolean; - special text := '[^A-z0-9_]'; -begin - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN ngname, IN special; - IF flag = true THEN - return false; - ELSE - query_str = 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - for host_info in execute(query_str) loop - query_string := 'execute direct on (' || host_info.node_name || ') ''SELECT * from pg_catalog.gs_cgroup_map_ng_conf(''''' || ngname || ''''')'''; - execute query_string; - end loop; - END IF; - return true; -end; -$$language plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_xacts_iscommitted(IN xid int8, OUT nodename text, OUT iscommitted bool) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT pgxc_is_committed('|| xid ||'::text::xid) as bcommitted'''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename = row_name.node_name; - iscommitted = row_data.bcommitted; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_senders_catchup_time(OUT nodename text, OUT lwpid int, OUT local_role text, OUT peer_role text, - OUT state text, OUT sender text, - OUT catchup_start TimestampTz, OUT catchup_end TimestampTz) - -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_get_senders_catchup_time where state = ''''Catchup'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename = row_name.node_name; - lwpid = row_data.lwpid; - local_role = row_data.local_role; - peer_role = row_data.peer_role; - state = row_data.state; - sender = row_data."type"; - catchup_start = row_data.catchup_start; - catchup_end = row_data.catchup_end; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_parse_clog(OUT xid int8, OUT nodename text, OUT status text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_parse_clog() '''; - FOR row_data IN EXECUTE(query_str) LOOP - xid = row_data.xid; - nodename = row_name.node_name; - status = row_data.status; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_get_wal_senders(OUT nodename text, OUT sender_pid int, OUT local_role text, OUT peer_role text, OUT peer_state text, - OUT state text, - OUT sender_sent_location text, OUT sender_write_location text, OUT sender_flush_location text, OUT sender_replay_location text, - OUT receiver_received_location text, OUT receiver_write_location text, OUT receiver_flush_location text, OUT receiver_replay_location text) - -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_stat_get_wal_senders() where sender_flush_location != receiver_replay_location '''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename = row_name.node_name; - sender_pid = row_data.sender_pid; - local_role = row_data.local_role; - peer_role = row_data.peer_role; - peer_state = row_data.peer_state; - state = row_data.state; - sender_sent_location = row_data.sender_sent_location; - sender_write_location = row_data.sender_write_location; - sender_flush_location = row_data.sender_flush_location; - sender_replay_location = row_data.sender_replay_location; - receiver_received_location = row_data.receiver_received_location; - receiver_write_location = row_data.receiver_write_location; - receiver_flush_location = row_data.receiver_flush_location; - receiver_replay_location = row_data.receiver_replay_location; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION pg_catalog.reload_active_coordinator() -RETURNS boolean -AS $$ -DECLARE - row_name record; - query_str text; - query_str_nodes text; - query_result boolean = false; - return_result bool = true; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pgxc_pool_reload()'''; - begin - EXECUTE(query_str) into query_result; - if query_result = 'f' then - return_result = false; - return return_result; - end if; - end; - END LOOP; - return return_result; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -GRANT SELECT ON pg_catalog.pgxc_get_stat_all_tables TO public; - -SET search_path TO information_schema; -DROP VIEW IF EXISTS information_schema.column_privileges CASCADE; -CREATE OR REPLACE VIEW column_privileges AS - SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor, - CAST(grantee.rolname AS sql_identifier) AS grantee, - CAST(current_database() AS sql_identifier) AS table_catalog, - CAST(nc.nspname AS sql_identifier) AS table_schema, - CAST(x.relname AS sql_identifier) AS table_name, - CAST(x.attname AS sql_identifier) AS column_name, - CAST(x.prtype AS character_data) AS privilege_type, - CAST( - CASE WHEN - -- object owner always has grant options - pg_has_role(x.grantee, x.relowner, 'USAGE') - OR x.grantable - THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable - - FROM ( - SELECT pr_c.grantor, - pr_c.grantee, - attname, - relname, - relnamespace, - pr_c.prtype, - pr_c.grantable, - pr_c.relowner - FROM (SELECT oid, relname, relnamespace, relowner, (aclexplode(coalesce(relacl, acldefault('r', relowner)))).* - FROM pg_class - WHERE relkind IN ('r', 'v', 'f') - ) pr_c (oid, relname, relnamespace, relowner, grantor, grantee, prtype, grantable), - pg_attribute a - WHERE a.attrelid = pr_c.oid - AND a.attnum > 0 - AND NOT a.attisdropped - UNION - SELECT pr_a.grantor, - pr_a.grantee, - attname, - relname, - relnamespace, - pr_a.prtype, - pr_a.grantable, - c.relowner - FROM (SELECT attrelid, attname, (aclexplode(coalesce(attacl, acldefault('c', relowner)))).* - FROM pg_attribute a JOIN pg_class cc ON (a.attrelid = cc.oid) - WHERE attnum > 0 - AND NOT attisdropped - ) pr_a (attrelid, attname, grantor, grantee, prtype, grantable), - pg_class c - WHERE pr_a.attrelid = c.oid - AND relkind IN ('r', 'v', 'f') - ) x, - pg_namespace nc, - pg_authid u_grantor, - ( - SELECT oid, rolname FROM pg_authid - UNION ALL - SELECT 0::oid, 'PUBLIC' - ) AS grantee (oid, rolname) - - WHERE x.relnamespace = nc.oid - AND x.grantee = grantee.oid - AND x.grantor = u_grantor.oid - AND x.prtype IN ('INSERT', 'SELECT', 'UPDATE', 'REFERENCES') - AND (pg_has_role(u_grantor.oid, 'USAGE') - OR pg_has_role(grantee.oid, 'USAGE') - OR grantee.rolname = 'PUBLIC'); - -CREATE OR REPLACE VIEW role_column_grants AS - SELECT grantor, - grantee, - table_catalog, - table_schema, - table_name, - column_name, - privilege_type, - is_grantable - FROM column_privileges - WHERE grantor IN (SELECT role_name FROM enabled_roles) - OR grantee IN (SELECT role_name FROM enabled_roles); - -DROP VIEW IF EXISTS information_schema.routine_privileges CASCADE; -CREATE OR REPLACE VIEW routine_privileges AS - SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor, - CAST(grantee.rolname AS sql_identifier) AS grantee, - CAST(current_database() AS sql_identifier) AS specific_catalog, - CAST(n.nspname AS sql_identifier) AS specific_schema, - CAST(p.proname || '_' || CAST(p.oid AS text) AS sql_identifier) AS specific_name, - CAST(current_database() AS sql_identifier) AS routine_catalog, - CAST(n.nspname AS sql_identifier) AS routine_schema, - CAST(p.proname AS sql_identifier) AS routine_name, - CAST('EXECUTE' AS character_data) AS privilege_type, - CAST( - CASE WHEN - -- object owner always has grant options - pg_has_role(grantee.oid, p.proowner, 'USAGE') - OR p.grantable - THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable - - FROM ( - SELECT oid, proname, proowner, pronamespace, (aclexplode(coalesce(proacl, acldefault('f', proowner)))).* FROM pg_proc - ) p (oid, proname, proowner, pronamespace, grantor, grantee, prtype, grantable), - pg_namespace n, - pg_authid u_grantor, - ( - SELECT oid, rolname FROM pg_authid - UNION ALL - SELECT 0::oid, 'PUBLIC' - ) AS grantee (oid, rolname) - - WHERE p.pronamespace = n.oid - AND grantee.oid = p.grantee - AND u_grantor.oid = p.grantor - AND p.prtype IN ('EXECUTE') - AND (pg_has_role(u_grantor.oid, 'USAGE') - OR pg_has_role(grantee.oid, 'USAGE') - OR grantee.rolname = 'PUBLIC'); - -CREATE OR REPLACE VIEW role_routine_grants AS - SELECT grantor, - grantee, - specific_catalog, - specific_schema, - specific_name, - routine_catalog, - routine_schema, - routine_name, - privilege_type, - is_grantable - FROM routine_privileges - WHERE grantor IN (SELECT role_name FROM enabled_roles) - OR grantee IN (SELECT role_name FROM enabled_roles); - -DROP VIEW IF EXISTS information_schema.udt_privileges CASCADE; -CREATE OR REPLACE VIEW udt_privileges AS - SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor, - CAST(grantee.rolname AS sql_identifier) AS grantee, - CAST(current_database() AS sql_identifier) AS udt_catalog, - CAST(n.nspname AS sql_identifier) AS udt_schema, - CAST(t.typname AS sql_identifier) AS udt_name, - CAST('TYPE USAGE' AS character_data) AS privilege_type, -- sic - CAST( - CASE WHEN - -- object owner always has grant options - pg_has_role(grantee.oid, t.typowner, 'USAGE') - OR t.grantable - THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable - - FROM ( - SELECT oid, typname, typnamespace, typtype, typowner, (aclexplode(coalesce(typacl, acldefault('T', typowner)))).* FROM pg_type - ) AS t (oid, typname, typnamespace, typtype, typowner, grantor, grantee, prtype, grantable), - pg_namespace n, - pg_authid u_grantor, - ( - SELECT oid, rolname FROM pg_authid - UNION ALL - SELECT 0::oid, 'PUBLIC' - ) AS grantee (oid, rolname) - - WHERE t.typnamespace = n.oid - AND t.typtype = 'c' - AND t.grantee = grantee.oid - AND t.grantor = u_grantor.oid - AND t.prtype IN ('USAGE') - AND (pg_has_role(u_grantor.oid, 'USAGE') - OR pg_has_role(grantee.oid, 'USAGE') - OR grantee.rolname = 'PUBLIC'); - -CREATE OR REPLACE VIEW role_udt_grants AS - SELECT grantor, - grantee, - udt_catalog, - udt_schema, - udt_name, - privilege_type, - is_grantable - FROM udt_privileges - WHERE grantor IN (SELECT role_name FROM enabled_roles) - OR grantee IN (SELECT role_name FROM enabled_roles); - -DROP VIEW IF EXISTS information_schema.table_privileges CASCADE; -CREATE OR REPLACE VIEW table_privileges AS - SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor, - CAST(grantee.rolname AS sql_identifier) AS grantee, - CAST(current_database() AS sql_identifier) AS table_catalog, - CAST(nc.nspname AS sql_identifier) AS table_schema, - CAST(c.relname AS sql_identifier) AS table_name, - CAST(c.prtype AS character_data) AS privilege_type, - CAST( - CASE WHEN - -- object owner always has grant options - pg_has_role(grantee.oid, c.relowner, 'USAGE') - OR c.grantable - THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable, - CAST(CASE WHEN c.prtype = 'SELECT' THEN 'YES' ELSE 'NO' END AS yes_or_no) AS with_hierarchy - - FROM ( - SELECT oid, relname, relnamespace, relkind, relowner, (aclexplode(coalesce(relacl, acldefault('r', relowner)))).* FROM pg_class - ) AS c (oid, relname, relnamespace, relkind, relowner, grantor, grantee, prtype, grantable), - pg_namespace nc, - pg_authid u_grantor, - ( - SELECT oid, rolname FROM pg_authid - UNION ALL - SELECT 0::oid, 'PUBLIC' - ) AS grantee (oid, rolname) - - WHERE c.relnamespace = nc.oid - AND c.relkind IN ('r', 'v') - AND c.grantee = grantee.oid - AND c.grantor = u_grantor.oid - AND c.prtype IN ('INSERT', 'SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'REFERENCES', 'TRIGGER') - AND (pg_has_role(u_grantor.oid, 'USAGE') - OR pg_has_role(grantee.oid, 'USAGE') - OR grantee.rolname = 'PUBLIC'); - -CREATE OR REPLACE VIEW role_table_grants AS - SELECT grantor, - grantee, - table_catalog, - table_schema, - table_name, - privilege_type, - is_grantable, - with_hierarchy - FROM table_privileges - WHERE grantor IN (SELECT role_name FROM enabled_roles) - OR grantee IN (SELECT role_name FROM enabled_roles); - -DECLARE - user_name text; - query_str text; -BEGIN - SELECT SESSION_USER INTO user_name; - - query_str := 'GRANT INSERT,SELECT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON TABLE information_schema.column_privileges TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - query_str := 'GRANT INSERT,SELECT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON TABLE information_schema.role_column_grants TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - query_str := 'GRANT INSERT,SELECT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON TABLE information_schema.routine_privileges TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - query_str := 'GRANT INSERT,SELECT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON TABLE information_schema.role_routine_grants TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - query_str := 'GRANT INSERT,SELECT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON TABLE information_schema.udt_privileges TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - query_str := 'GRANT INSERT,SELECT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON TABLE information_schema.role_udt_grants TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - query_str := 'GRANT INSERT,SELECT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON TABLE information_schema.table_privileges TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - query_str := 'GRANT INSERT,SELECT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON TABLE information_schema.role_table_grants TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; -END; -/ - -GRANT SELECT ON information_schema.column_privileges TO PUBLIC; -GRANT SELECT ON information_schema.role_column_grants TO PUBLIC; -GRANT SELECT ON information_schema.routine_privileges TO PUBLIC; -GRANT SELECT ON information_schema.role_routine_grants TO PUBLIC; -GRANT SELECT ON information_schema.udt_privileges TO PUBLIC; -GRANT SELECT ON information_schema.role_udt_grants TO PUBLIC; -GRANT SELECT ON information_schema.table_privileges TO PUBLIC; -GRANT SELECT ON information_schema.role_table_grants TO PUBLIC; - -RESET search_path; - -DROP FUNCTION IF EXISTS pg_catalog.gs_wlm_get_all_user_resource_info() cascade; -CREATE OR REPLACE FUNCTION pg_catalog.gs_wlm_get_all_user_resource_info(OUT userid Oid, OUT used_memory int, OUT total_memory int, OUT used_cpu float, OUT total_cpu int, OUT used_space bigint, OUT total_space bigint, OUT used_temp_space bigint, OUT total_temp_space bigint, OUT used_spill_space bigint, OUT total_spill_space bigint, OUT read_kbytes bigint, OUT write_kbytes bigint, OUT read_counts bigint, OUT write_counts bigint, OUT read_speed float, OUT write_speed float) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str2 text; - BEGIN - query_str := 'SELECT rolname FROM pg_authid'; - FOR row_name IN EXECUTE(query_str) LOOP - query_str2 := 'SELECT * FROM pg_catalog.gs_wlm_user_resource_info(''' || row_name.rolname || ''')'; - FOR row_data IN EXECUTE(query_str2) LOOP - userid := row_data.userid; - used_memory := row_data.used_memory; - total_memory := row_data.total_memory; - used_cpu := row_data.used_cpu; - total_cpu := row_data.total_cpu; - used_space := row_data.used_space; - total_space := row_data.total_space; - used_temp_space := row_data.used_temp_space; - total_temp_space := row_data.total_temp_space; - used_spill_space := row_data.used_spill_space; - total_spill_space := row_data.total_spill_space; - read_kbytes := row_data.read_kbytes; - write_kbytes := row_data.write_kbytes; - read_counts := row_data.read_counts; - write_counts := row_data.write_counts; - read_speed := row_data.read_speed; - write_speed := row_data.write_speed; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW pg_catalog.pg_total_user_resource_info_oid AS - SELECT * FROM pg_catalog.gs_wlm_get_all_user_resource_info(); - -CREATE OR REPLACE VIEW pg_catalog.pg_total_user_resource_info AS -SELECT - S.usename AS username, - T.used_memory, - T.total_memory, - T.used_cpu, - T.total_cpu, - T.used_space, - T.total_space, - T.used_temp_space, - T.total_temp_space, - T.used_spill_space, - T.total_spill_space, - T.read_kbytes, - T.write_kbytes, - T.read_counts, - T.write_counts, - T.read_speed, - T.write_speed -FROM pg_user AS S, pg_catalog.pg_total_user_resource_info_oid AS T -WHERE S.usesysid = T.userid; - -DROP FUNCTION IF EXISTS pg_catalog.gs_wlm_session_respool() cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5021; -CREATE OR REPLACE FUNCTION pg_catalog.gs_wlm_session_respool(input bigint, OUT datid oid, OUT threadid bigint, OUT sessionid bigint, OUT threadpid integer, OUT usesysid oid, OUT cgroup text, OUT session_respool name) RETURNS SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_session_respool'; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP VIEW IF EXISTS DBE_PERF.summary_statement cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_summary_statement( - OUT node_name name, - OUT node_id integer, - OUT user_name name, - OUT user_id oid, - OUT unique_sql_id bigint, - OUT query text, - OUT n_calls bigint, - OUT min_elapse_time bigint, - OUT max_elapse_time bigint, - OUT total_elapse_time bigint, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - Out net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text, - OUT last_updated timestamp with time zone, - OUT sort_count bigint, - OUT sort_time bigint, - OUT sort_mem_used bigint, - OUT sort_spill_count bigint, - OUT sort_spill_size bigint, - OUT hash_count bigint, - OUT hash_time bigint, - OUT hash_mem_used bigint, - OUT hash_spill_count bigint, - OUT hash_spill_size bigint - ) cascade; - DROP VIEW IF EXISTS DBE_PERF.STATEMENT cascade; - end if; -END$DO$; -DROP FUNCTION IF EXISTS pg_catalog.get_instr_unique_sql() cascade; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5702; -CREATE FUNCTION pg_catalog.get_instr_unique_sql -( - OUT node_name name, - OUT node_id integer, - OUT user_name name, - OUT user_id oid, - OUT unique_sql_id bigint, - OUT query text, - OUT n_calls bigint, - OUT min_elapse_time bigint, - OUT max_elapse_time bigint, - OUT total_elapse_time bigint, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - Out net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text, - OUT last_updated timestamp with time zone -) -RETURNS setof record LANGUAGE INTERNAL VOLATILE NOT FENCED as 'get_instr_unique_sql'; - -DO $DO$ -DECLARE - ans boolean; - user_name text; - query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE VIEW DBE_PERF.statement AS - SELECT * FROM get_instr_unique_sql(); - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statement() - RETURNS setof DBE_PERF.statement - AS $$ - DECLARE - row_data DBE_PERF.statement%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE VIEW DBE_PERF.summary_statement AS - SELECT * FROM DBE_PERF.get_summary_statement(); - - SELECT SESSION_USER INTO user_name; - query_str := 'GRANT ALL ON TABLE DBE_PERF.STATEMENT TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - query_str := 'GRANT ALL ON TABLE DBE_PERF.summary_statement TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - GRANT SELECT ON TABLE DBE_PERF.STATEMENT TO PUBLIC; - GRANT SELECT ON TABLE DBE_PERF.summary_statement TO PUBLIC; - - end if; -END$DO$; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_tables where tablename = 'snap_summary_statement' and schemaname = 'snapshot' limit 1) into ans; - if ans = true then - alter table snapshot.snap_summary_statement - DROP COLUMN IF EXISTS snap_sort_count, - DROP COLUMN IF EXISTS snap_sort_time, - DROP COLUMN IF EXISTS snap_sort_mem_used, - DROP COLUMN IF EXISTS snap_sort_spill_count, - DROP COLUMN IF EXISTS snap_sort_spill_size, - DROP COLUMN IF EXISTS snap_hash_count, - DROP COLUMN IF EXISTS snap_hash_time, - DROP COLUMN IF EXISTS snap_hash_mem_used, - DROP COLUMN IF EXISTS snap_hash_spill_count, - DROP COLUMN IF EXISTS snap_hash_spill_size; - end if; -END$DO$; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS DBE_PERF.get_global_full_sql_by_timestamp() cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_global_slow_sql_by_timestamp() cascade; - DROP VIEW IF EXISTS DBE_PERF.statement_history cascade; - end if; -END$$; -DROP INDEX IF EXISTS pg_catalog.statement_history_time_idx; -DROP TABLE IF EXISTS pg_catalog.statement_history; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP VIEW IF EXISTS DBE_PERF.summary_statement cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_summary_statement( - OUT node_name name, - OUT node_id integer, - OUT user_name name, - OUT user_id oid, - OUT unique_sql_id bigint, - OUT query text, - OUT n_calls bigint, - OUT min_elapse_time bigint, - OUT max_elapse_time bigint, - OUT total_elapse_time bigint, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - Out net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text, - OUT last_updated timestamp with time zone - ) cascade; - DROP VIEW IF EXISTS DBE_PERF.STATEMENT cascade; - end if; -END$DO$; -DROP FUNCTION IF EXISTS pg_catalog.get_instr_unique_sql() cascade; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5702; -CREATE FUNCTION pg_catalog.get_instr_unique_sql -( - OUT node_name name, - OUT node_id integer, - OUT user_name name, - OUT user_id oid, - OUT unique_sql_id bigint, - OUT query text, - OUT n_calls bigint, - OUT min_elapse_time bigint, - OUT max_elapse_time bigint, - OUT total_elapse_time bigint, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - Out net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text -) -RETURNS setof record LANGUAGE INTERNAL VOLATILE NOT FENCED as 'get_instr_unique_sql'; - -DO $DO$ -DECLARE - ans boolean; - user_name text; - query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE VIEW DBE_PERF.statement AS - SELECT * FROM get_instr_unique_sql(); - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statement() - RETURNS setof DBE_PERF.statement - AS $$ - DECLARE - row_data DBE_PERF.statement%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE VIEW DBE_PERF.summary_statement AS - SELECT * FROM DBE_PERF.get_summary_statement(); - - SELECT SESSION_USER INTO user_name; - query_str := 'GRANT ALL ON TABLE DBE_PERF.STATEMENT TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - query_str := 'GRANT ALL ON TABLE DBE_PERF.summary_statement TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - GRANT SELECT ON TABLE DBE_PERF.STATEMENT TO PUBLIC; - GRANT SELECT ON TABLE DBE_PERF.summary_statement TO PUBLIC; - - end if; -END$DO$; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_tables where tablename = 'snap_summary_statement' and schemaname = 'snapshot' limit 1) into ans; - if ans = true then - alter table snapshot.snap_summary_statement - DROP COLUMN IF EXISTS snap_last_updated; - end if; -END$DO$; - --- wait events -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP VIEW IF EXISTS DBE_PERF.global_wait_events cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_global_wait_events() cascade; - DROP VIEW IF EXISTS DBE_PERF.wait_events cascade; - end if; -END$DO$; -DROP FUNCTION IF EXISTS pg_catalog.get_instr_wait_event() cascade; -DROP FUNCTION IF EXISTS pg_catalog.get_instr_wait_event(IN param int4, OUT nodename text, OUT type text, OUT event text, OUT wait bigint, OUT failed_wait bigint, OUT total_wait_time bigint, OUT avg_wait_time bigint, OUT max_wait_time bigint, OUT min_wait_time bigint, OUT last_updated timestamp with time zone) cascade; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5705; -CREATE FUNCTION pg_catalog.get_instr_wait_event -( - IN param int4, - OUT nodename text, - OUT type text, - OUT event text, - OUT wait bigint, - OUT failed_wait bigint, - OUT total_wait_time bigint, - OUT avg_wait_time bigint, - OUT max_wait_time bigint, - OUT min_wait_time bigint -) -RETURNS setof record LANGUAGE INTERNAL VOLATILE NOT FENCED as 'get_instr_wait_event'; - -DO $DO$ -DECLARE - ans boolean; - user_name text; - query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE VIEW DBE_PERF.wait_events AS - SELECT * FROM get_instr_wait_event(NULL); - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_wait_events() - RETURNS setof DBE_PERF.wait_events - AS $$ - DECLARE - row_data DBE_PERF.wait_events%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.wait_events'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE VIEW DBE_PERF.global_wait_events AS - SELECT * FROM DBE_PERF.get_global_wait_events(); - - SELECT SESSION_USER INTO user_name; - query_str := 'GRANT ALL ON TABLE DBE_PERF.wait_events TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - query_str := 'GRANT ALL ON TABLE DBE_PERF.global_wait_events TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - GRANT SELECT ON TABLE DBE_PERF.wait_events TO PUBLIC; - GRANT SELECT ON TABLE DBE_PERF.global_wait_events TO PUBLIC; - - end if; -END$DO$; - -DROP FUNCTION IF EXISTS pg_catalog.statement_detail_decode() CASCADE; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_tables where tablename = 'snap_global_wait_events' and schemaname = 'snapshot' limit 1) into ans; - if ans = true then - alter table snapshot.snap_global_wait_events - DROP COLUMN IF EXISTS snap_last_updated; - end if; -END$DO$; - -DROP VIEW IF EXISTS global_stat_hotkeys_info cascade; - -DROP FUNCTION IF EXISTS pg_catalog.global_stat_clean_hotkeys(); -DROP FUNCTION IF EXISTS pg_catalog.global_stat_get_hotkeys_info(); - -DROP FUNCTION IF EXISTS pg_catalog.gs_stat_clean_hotkeys(); -DROP FUNCTION IF EXISTS pg_catalog.gs_stat_get_hotkeys_info(); - -DROP FUNCTION IF EXISTS pg_catalog.gs_get_global_barrier_status() cascade; -DROP FUNCTION IF EXISTS pg_catalog.gs_get_local_barrier_status() cascade; - -DROP FUNCTION IF EXISTS pg_catalog.hypopg_create_index(text); -DROP FUNCTION IF EXISTS pg_catalog.hypopg_display_index(); -DROP FUNCTION IF EXISTS pg_catalog.hypopg_drop_index(int4); -DROP FUNCTION IF EXISTS pg_catalog.hypopg_estimate_size(int4); -DROP FUNCTION IF EXISTS pg_catalog.hypopg_reset_index(); - -DROP FUNCTION IF EXISTS pg_catalog.plancache_status() CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.prepare_statement_status() CASCADE; - -set local inplace_upgrade_next_system_object_oids = IUO_PROC,3957; -CREATE OR REPLACE FUNCTION pg_catalog.plancache_status( - OUT nodename text, - OUT query text, - OUT refcount int4, - OUT valid bool, - OUT DatabaseID oid, - OUT schema_name text, - OUT params_num int4) -RETURNS SETOF RECORD LANGUAGE INTERNAL AS 'gs_globalplancache_status'; - -set local inplace_upgrade_next_system_object_oids = IUO_PROC,3959; -CREATE OR REPLACE FUNCTION pg_catalog.prepare_statement_status( - OUT nodename text, - OUT cn_sess_id int8, - OUT cn_node_id int4, - OUT cn_time_line int4, - OUT statement_name text, - OUT refcount int4, - OUT is_shared bool) -RETURNS SETOF RECORD LANGUAGE INTERNAL AS 'gs_globalplancache_prepare_status'; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS DBE_PERF.global_plancache_status() CASCADE; - DROP VIEW IF EXISTS DBE_PERF.local_plancache_status CASCADE; - DROP VIEW IF EXISTS DBE_PERF.global_plancache_status CASCADE; - DROP VIEW IF EXISTS DBE_PERF.local_prepare_statement_status CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.global_prepare_statement_status() CASCADE; - DROP VIEW IF EXISTS DBE_PERF.global_prepare_statement_status CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.global_plancache_clean() CASCADE; - DROP VIEW IF EXISTS DBE_PERF.local_plancache_clean CASCADE; - - CREATE VIEW DBE_PERF.local_plancache_status AS - SELECT * FROM pg_catalog.plancache_status(); - - end if; -END $DO$; - - -DROP AGGREGATE IF EXISTS streaming_int2_int4_sum_gather(int8); -DROP AGGREGATE IF EXISTS streaming_int8_sum_gather(numeric); -DROP AGGREGATE IF EXISTS streaming_interval_avg_gather(interval[]); -DROP AGGREGATE IF EXISTS streaming_float8_avg_gather(float8[]); -DROP AGGREGATE IF EXISTS streaming_numeric_avg_gather(numeric[]); -DROP AGGREGATE IF EXISTS streaming_int8_avg_gather(int8[]); -DROP AGGREGATE IF EXISTS gather(anyelement); -DROP FUNCTION IF EXISTS pg_catalog.gather_sfunc_dummy(anyelement, anyelement); - - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 0; -DROP FUNCTION IF EXISTS pg_catalog.check_cont_query_schema_changed(cq_id oid); -DROP FUNCTION IF EXISTS pg_catalog.reset_cont_query_stats(); -DROP FUNCTION IF EXISTS pg_catalog.reset_cont_query_stats(stream_id oid); -DROP FUNCTION IF EXISTS pg_catalog.reset_local_cont_query_stats(cq_id oid); -DROP FUNCTION IF EXISTS pg_catalog.reset_local_cont_query_stat(cq_id oid); -DROP VIEW IF EXISTS pg_catalog.stream_stats; -DROP VIEW IF EXISTS pg_catalog.cont_query_stats; -DROP FUNCTION IF EXISTS pg_catalog.get_cont_query_stats(); -DROP FUNCTION IF EXISTS pg_catalog.get_local_cont_query_stats(); -DROP FUNCTION IF EXISTS pg_catalog.get_local_cont_query_stat(cq_id oid); - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_extension where extname = 'streaming' limit 1) into ans; - if ans = true then - CREATE OR REPLACE FUNCTION pg_catalog.streaming_cont_query_matrelid_index_local_set_unique(flag bool) - RETURNS BOOL - AS '$libdir/streaming', 'streaming_cont_query_matrelid_index_local_set_unique' - LANGUAGE C IMMUTABLE STRICT NOT FENCED; - CREATE OR REPLACE FUNCTION pg_catalog.streaming_cont_query_matrelid_index_set_unique(flag bool) - RETURNS BOOL - AS '$libdir/streaming', 'streaming_cont_query_matrelid_index_set_unique' - LANGUAGE C IMMUTABLE STRICT NOT FENCED; - end if; -END$$; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_extension where extname = 'streaming' limit 1) into ans; - if ans = true then - SELECT pg_catalog.streaming_cont_query_matrelid_index_local_set_unique(true) INTO ans; - SELECT pg_catalog.streaming_cont_query_matrelid_index_set_unique(true) INTO ans; - end if; -END$$; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_extension where extname = 'streaming' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS pg_catalog.streaming_cont_query_matrelid_index_set_unique(flag bool); - DROP FUNCTION IF EXISTS pg_catalog.streaming_cont_query_matrelid_index_local_set_unique(flag bool); - end if; -END$$; - - -DROP FUNCTION IF EXISTS pg_catalog.gs_set_obs_delete_location(text) cascade; - - -do $$DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP VIEW IF EXISTS DBE_PERF.global_single_flush_dw_status CASCADE; - DROP FUNCTION IF EXISTS pg_catalog.local_single_flush_dw_stat(); - DROP FUNCTION IF EXISTS pg_catalog.remote_single_flush_dw_stat(); - end if; -END$$; - - -DROP FUNCTION IF EXISTS pg_catalog.gs_index_advise(cstring); - - -DROP AGGREGATE IF EXISTS pg_catalog.mode(order by anyelement); -DROP FUNCTION IF EXISTS pg_catalog.mode_final(internal) CASCADE; - -drop function if exists pg_catalog.series(name) cascade; -drop function if exists pg_catalog.top_key(name, int8) cascade; -drop function if exists pg_catalog.top_key(name, int) cascade; -drop function if exists pg_catalog.series(anyelement) cascade; -drop function if exists pg_catalog.top_key(anyelement, int8) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 6006; -create or replace function pg_catalog.series(name) returns text LANGUAGE INTERNAL as 'series_internal'; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 6008; -create or replace function pg_catalog.top_key(name, int8) returns text LANGUAGE INTERNAL as 'top_key_internal'; - -DROP FUNCTION IF EXISTS pg_catalog.pg_create_physical_replication_slot_extern(name, boolean, text) cascade; - -DO $$ -BEGIN - IF EXISTS(SELECT c.relname,n.nspname FROM pg_class c JOIN pg_namespace n ON c.relnamespace=n.oid AND c.relname='snapshot' AND n.nspname='snapshot') - THEN - create table IF NOT EXISTS snapshot.snap_global_operator_runtime(snapshot_id bigint, snap_queryid bigint, snap_pid bigint, snap_plan_node_id integer, snap_plan_node_name text, snap_start_time timestamp with time zone, snap_duration bigint, snap_status text, snap_query_dop integer, snap_estimated_rows bigint, snap_tuple_processed bigint, snap_min_peak_memory integer, snap_max_peak_memory integer, snap_average_peak_memory integer, snap_memory_skew_percent integer, snap_min_spill_size integer, snap_max_spill_size integer, snap_average_spill_size integer, snap_spill_skew_percent integer, snap_min_cpu_time bigint, snap_max_cpu_time bigint, snap_total_cpu_time bigint, snap_cpu_skew_percent integer, snap_warning text); - - create table IF NOT EXISTS snapshot.snap_global_operator_history(snapshot_id bigint, snap_queryid bigint, snap_pid bigint, snap_plan_node_id integer, snap_plan_node_name text, snap_start_time timestamp with time zone, snap_duration bigint, snap_query_dop integer, snap_estimated_rows bigint, snap_tuple_processed bigint, snap_min_peak_memory integer, snap_max_peak_memory integer, snap_average_peak_memory integer, snap_memory_skew_percent integer, snap_min_spill_size integer, snap_max_spill_size integer, snap_average_spill_size integer, snap_spill_skew_percent integer, snap_min_cpu_time bigint, snap_max_cpu_time bigint, snap_total_cpu_time bigint, snap_cpu_skew_percent integer, snap_warning text); - - create table IF NOT EXISTS snapshot.snap_global_operator_history_table(snapshot_id bigint, snap_queryid bigint, snap_pid bigint, snap_plan_node_id integer, snap_plan_node_name text, snap_start_time timestamp with time zone, snap_duration bigint, snap_query_dop integer, snap_estimated_rows bigint, snap_tuple_processed bigint, snap_min_peak_memory integer, snap_max_peak_memory integer, snap_average_peak_memory integer, snap_memory_skew_percent integer, snap_min_spill_size integer, snap_max_spill_size integer, snap_average_spill_size integer, snap_spill_skew_percent integer, snap_min_cpu_time bigint, snap_max_cpu_time bigint, snap_total_cpu_time bigint, snap_cpu_skew_percent integer, snap_warning text); - - create table IF NOT EXISTS snapshot.snap_global_operator_ec_runtime(snapshot_id bigint, snap_queryid bigint, snap_plan_node_id integer, snap_start_time timestamp with time zone, snap_ec_status text, snap_ec_execute_datanode text, snap_ec_dsn text, snap_ec_username text, snap_ec_query text, snap_ec_libodbc_type text, snap_ec_fetch_count bigint); - - create table IF NOT EXISTS snapshot.snap_global_operator_ec_history(snapshot_id bigint, snap_queryid bigint, snap_plan_node_id integer, snap_start_time timestamp with time zone, snap_duration bigint,snap_tuple_processed bigint, snap_min_peak_memory integer, snap_max_peak_memory integer, snap_average_peak_memory integer,snap_ec_status text, snap_ec_execute_datanode text, snap_ec_dsn text, snap_ec_username text, snap_ec_query text,snap_ec_libodbc_type text); - - create table IF NOT EXISTS snapshot.snap_global_operator_ec_history_table(snapshot_id bigint, snap_queryid bigint, snap_plan_node_id integer, snap_start_time timestamp with time zone, snap_duration bigint,snap_tuple_processed bigint, snap_min_peak_memory integer, snap_max_peak_memory integer, snap_average_peak_memory integer,snap_ec_status text, snap_ec_execute_datanode text, snap_ec_dsn text, snap_ec_username text, snap_ec_query text,snap_ec_libodbc_type text); - - create table IF NOT EXISTS snapshot.snap_global_statement_complex_runtime(snapshot_id bigint, snap_datid oid, snap_dbname name, snap_schemaname text, snap_nodename text, snap_username name, snap_application_name text, snap_client_addr inet, snap_client_hostname text, snap_client_port integer, snap_query_band text, snap_pid bigint, snap_block_time bigint, snap_start_time timestamp with time zone, snap_duration bigint, snap_estimate_total_time bigint, snap_estimate_left_time bigint, snap_enqueue text, snap_resource_pool name, snap_control_group text, snap_estimate_memory integer, snap_min_peak_memory integer, snap_max_peak_memory integer, snap_average_peak_memory integer, snap_memory_skew_percent integer, snap_spill_info text, snap_min_spill_size integer, snap_max_spill_size integer, snap_average_spill_size integer, snap_spill_skew_percent integer, snap_min_dn_time bigint , snap_max_dn_time bigint, snap_average_dn_time bigint, snap_dntime_skew_percent integer, snap_min_cpu_time bigint, snap_max_cpu_time bigint, snap_total_cpu_time bigint, snap_cpu_skew_percent integer, snap_min_peak_iops integer, snap_max_peak_iops integer, snap_average_peak_iops integer, snap_iops_skew_percent integer, snap_warning text , snap_queryid bigint, snap_query text, snap_query_plan text, snap_node_group text, snap_top_cpu_dn text, snap_top_mem_dn text); - - create table IF NOT EXISTS snapshot.snap_global_statement_complex_history(snapshot_id bigint, snap_datid oid, snap_dbname text, snap_schemaname text, snap_nodename text, snap_username text, snap_application_name text, snap_client_addr inet, snap_client_hostname text, snap_client_port integer, snap_query_band text, snap_block_time bigint, snap_start_time timestamp with time zone, snap_finish_time timestamp with time zone, snap_duration bigint, snap_estimate_total_time bigint, snap_status text, snap_abort_info text, snap_resource_pool name, snap_control_group text, snap_estimate_memory integer, snap_min_peak_memory integer, snap_max_peak_memory integer, snap_average_peak_memory integer, snap_memory_skew_percent integer, snap_spill_info text, snap_min_spill_size integer, snap_max_spill_size integer, snap_average_spill_size integer, snap_spill_skew_percent integer, snap_min_dn_time bigint , snap_max_dn_time bigint, snap_average_dn_time bigint, snap_dntime_skew_percent integer, snap_min_cpu_time bigint, snap_max_cpu_time bigint, snap_total_cpu_time bigint, snap_cpu_skew_percent integer, snap_min_peak_iops integer, snap_max_peak_iops integer, snap_average_peak_iops integer, snap_iops_skew_percent integer, snap_warning text , snap_queryid bigint, snap_query text, snap_query_plan text, snap_node_group text,snap_cpu_top1_node_name text, snap_cpu_top2_node_name text, snap_cpu_top3_node_name text, snap_cpu_top4_node_name text, snap_cpu_top5_node_name text, snap_mem_top1_node_name text, snap_mem_top2_node_name text, snap_mem_top3_node_name text, snap_mem_top4_node_name text, snap_mem_top5_node_name text, snap_cpu_top1_value bigint, snap_cpu_top2_value bigint, snap_cpu_top3_value bigint, snap_cpu_top4_value bigint, snap_cpu_top5_value bigint, snap_mem_top1_value bigint, snap_mem_top2_value bigint, snap_mem_top3_value bigint, snap_mem_top4_value bigint, snap_mem_top5_value bigint, snap_top_mem_dn text, snap_top_cpu_dn text); - - create table IF NOT EXISTS snapshot.snap_global_statement_complex_history_table(snapshot_id bigint, snap_datid oid, snap_dbname text, snap_schemaname text, snap_nodename text, snap_username text, snap_application_name text, snap_client_addr inet, snap_client_hostname text, snap_client_port integer, snap_query_band text, snap_block_time bigint, snap_start_time timestamp with time zone, snap_finish_time timestamp with time zone, snap_duration bigint, snap_estimate_total_time bigint, snap_status text, snap_abort_info text, snap_resource_pool name, snap_control_group text, snap_estimate_memory integer, snap_min_peak_memory integer, snap_max_peak_memory integer, snap_average_peak_memory integer, snap_memory_skew_percent integer, snap_spill_info text, snap_min_spill_size integer, snap_max_spill_size integer, snap_average_spill_size integer, snap_spill_skew_percent integer, snap_min_dn_time bigint , snap_max_dn_time bigint, snap_average_dn_time bigint, snap_dntime_skew_percent integer, snap_min_cpu_time bigint, snap_max_cpu_time bigint, snap_total_cpu_time bigint, snap_cpu_skew_percent integer, snap_min_peak_iops integer, snap_max_peak_iops integer, snap_average_peak_iops integer, snap_iops_skew_percent integer, snap_warning text , snap_queryid bigint, snap_query text, snap_query_plan text, snap_node_group text,snap_cpu_top1_node_name text, snap_cpu_top2_node_name text, snap_cpu_top3_node_name text, snap_cpu_top4_node_name text, snap_cpu_top5_node_name text, snap_mem_top1_node_name text, snap_mem_top2_node_name text, snap_mem_top3_node_name text, snap_mem_top4_node_name text, snap_mem_top5_node_name text, snap_cpu_top1_value bigint, snap_cpu_top2_value bigint, snap_cpu_top3_value bigint, snap_cpu_top4_value bigint, snap_cpu_top5_value bigint, snap_mem_top1_value bigint, snap_mem_top2_value bigint, snap_mem_top3_value bigint, snap_mem_top4_value bigint, snap_mem_top5_value bigint, snap_top_mem_dn text, snap_top_cpu_dn text); - - END IF; -END $$; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE OR REPLACE VIEW DBE_PERF.class_vital_info AS - SELECT - C.oid AS relid, - N.nspname AS schemaname, - C.relname AS relname, - C.relkind AS relkind - FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) - WHERE C.relkind IN ('r', 't', 'i'); - end if; -END $$; - - -CREATE OR REPLACE VIEW pg_catalog.pg_indexes AS - SELECT - N.nspname AS schemaname, - C.relname AS tablename, - I.relname AS indexname, - T.spcname AS tablespace, - pg_get_indexdef(I.oid) AS indexdef - FROM pg_index X JOIN pg_class C ON (C.oid = X.indrelid) - JOIN pg_class I ON (I.oid = X.indexrelid) - LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) - LEFT JOIN pg_tablespace T ON (T.oid = I.reltablespace) - WHERE C.relkind = 'r' AND I.relkind = 'i'; - -DROP FUNCTION IF EXISTS pg_catalog.copy_error_log_create() CASCADE; -CREATE OR REPLACE FUNCTION pg_catalog.copy_error_log_create() -RETURNS bool -AS $$ -DECLARE - query_str_create_table text; - query_str_create_index text; - query_str_do_revoke text; - BEGIN - query_str_create_table := 'CREATE TABLE public.pgxc_copy_error_log - (relname varchar, begintime timestamptz, filename varchar, rownum int8, rawrecord text, detail text) - DISTRIBUTE BY hash(begintime)'; - EXECUTE query_str_create_table; - - query_str_create_index := 'CREATE INDEX copy_error_log_relname_idx ON public.pgxc_copy_error_log(relname)'; - EXECUTE query_str_create_index; - - query_str_do_revoke := 'REVOKE ALL on public.pgxc_copy_error_log FROM public'; - EXECUTE query_str_do_revoke; - - return true; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -REVOKE ALL on FUNCTION pg_catalog.copy_error_log_create() FROM public; - -DROP VIEW IF EXISTS pg_catalog.pg_gtt_relstats cascade; -DROP VIEW IF EXISTS pg_catalog.pg_gtt_attached_pids cascade; -DROP VIEW IF EXISTS pg_catalog.pg_gtt_stats cascade; -DROP FUNCTION IF EXISTS pg_catalog.pg_get_gtt_relstats() cascade; -DROP FUNCTION IF EXISTS pg_catalog.pg_get_gtt_statistics() cascade; -DROP FUNCTION IF EXISTS pg_catalog.pg_gtt_attached_pid() cascade; -DROP FUNCTION IF EXISTS pg_catalog.pg_list_gtt_relfrozenxids() cascade; -DROP FUNCTION IF EXISTS pg_catalog.pg_partition_filepath() cascade; - -drop aggregate if exists pg_catalog.median(float8); -drop aggregate if exists pg_catalog.median(interval); -DROP FUNCTION if exists pg_catalog.median_float8_finalfn(internal) cascade; -DROP FUNCTION if exists pg_catalog.median_interval_finalfn(internal) cascade; -DROP FUNCTION if exists pg_catalog.median_transfn(internal, "any") cascade; - ---clob cast text -DROP CAST IF EXISTS (TEXT AS CLOB) CASCADE; -DROP CAST IF EXISTS (CLOB AS TEXT) CASCADE; - - /* text to clob */ -DROP FUNCTION IF EXISTS pg_catalog.to_clob (TEXT) CASCADE; -CREATE OR REPLACE FUNCTION pg_catalog.to_clob(TEXT) -RETURNS TEXT -AS $$ select $1 $$ -LANGUAGE SQL IMMUTABLE STRICT NOT FENCED; - -/* char to clob */ -DROP FUNCTION IF EXISTS pg_catalog.to_clob (CHAR) CASCADE; -CREATE OR REPLACE FUNCTION pg_catalog.to_clob(CHAR) -RETURNS TEXT -AS $$ select CAST($1 AS TEXT) $$ -LANGUAGE SQL IMMUTABLE STRICT NOT FENCED; - -/* varchar to clob */ -DROP FUNCTION IF EXISTS pg_catalog.to_clob (VARCHAR) CASCADE; -CREATE OR REPLACE FUNCTION pg_catalog.to_clob(VARCHAR) -RETURNS TEXT -AS $$ select CAST($1 AS TEXT) $$ -LANGUAGE SQL IMMUTABLE STRICT NOT FENCED; - -/* nvarchar2 to clob */ -DROP FUNCTION IF EXISTS pg_catalog.to_clob (NVARCHAR2) CASCADE; -CREATE OR REPLACE FUNCTION pg_catalog.to_clob(NVARCHAR2) -RETURNS TEXT -AS $$ select CAST($1 AS TEXT) $$ -LANGUAGE SQL IMMUTABLE STRICT NOT FENCED; - -/* clob to regclass */ -DROP CAST IF EXISTS (clob AS regclass) CASCADE; -/* clob to bpchar */ -DROP CAST IF EXISTS (clob AS bpchar) CASCADE; -/* clob to varchar */ -DROP CAST IF EXISTS (clob AS varchar) CASCADE; -/* clob to nvarchar2 */ -DROP CAST IF EXISTS (clob AS nvarchar2) CASCADE; -/* bpchar to clob */ -DROP CAST IF EXISTS (bpchar AS clob) CASCADE; -/* varchar to clob */ -DROP CAST IF EXISTS (varchar AS clob) CASCADE; -/* nvarchar2 to clob */ -DROP CAST IF EXISTS (nvarchar2 AS clob) CASCADE; -/* char to clob */ -DROP CAST IF EXISTS (char AS clob) CASCADE; -/* name to clob */ -DROP CAST IF EXISTS (name AS clob) CASCADE; -/* clob to char */ -DROP CAST IF EXISTS (clob AS char) CASCADE; -/* clob to name */ -DROP CAST IF EXISTS (clob AS name) CASCADE; -/* pg_node_tree to clob */ -DROP CAST IF EXISTS (pg_node_tree AS clob) CASCADE; -/* clob to timestamp */ -DROP CAST IF EXISTS (clob AS timestamp) CASCADE; -/* cidr to clob*/ -DROP CAST IF EXISTS (cidr AS clob) CASCADE; -/* inet to clob */ -DROP CAST IF EXISTS (inet AS clob) CASCADE; -/* bool to clob */ -DROP CAST IF EXISTS (bool AS clob) CASCADE; -/* xml to clob */ -DROP CAST IF EXISTS (xml AS clob) CASCADE; -/* clob to xml */ -DROP CAST IF EXISTS (clob AS xml) CASCADE; -/* date to clob */ -DROP CAST IF EXISTS (date AS clob) CASCADE; -/* clob to date */ -DROP CAST IF EXISTS (clob AS date) CASCADE; -/* int1 to clob */ -DROP CAST IF EXISTS (int1 AS clob) CASCADE; -/* int2 to clob */ -DROP CAST IF EXISTS (int2 AS clob) CASCADE; -/* int4 to clob */ -DROP CAST IF EXISTS (int4 AS clob) CASCADE; -/* int8 to clob */ -DROP CAST IF EXISTS (int8 AS clob) CASCADE; -/* float4 to clob */ -DROP CAST IF EXISTS (float4 AS clob) CASCADE; -/* float8 to clob */ -DROP CAST IF EXISTS (float8 AS clob) CASCADE; -/* numeric to clob */ -DROP CAST IF EXISTS (numeric AS clob) CASCADE; -/* timestamptz to clob */ -DROP CAST IF EXISTS (timestamptz AS clob) CASCADE; -/* timestamp to clob */ -DROP CAST IF EXISTS (timestamp AS clob) CASCADE; -/* clob to int1 */ -DROP CAST IF EXISTS (clob AS int1) CASCADE; -/* clob to int2*/ -DROP CAST IF EXISTS (clob AS int2) CASCADE; -/* clob to int4*/ -DROP CAST IF EXISTS (clob AS int4) CASCADE; -/* clob to int8*/ -DROP CAST IF EXISTS (clob AS int8) CASCADE; -/* clob to float4*/ -DROP CAST IF EXISTS (clob AS float4) CASCADE; -/* clob to float8*/ -DROP CAST IF EXISTS (clob AS float8) CASCADE; -/* clob to numeric*/ -DROP CAST IF EXISTS (clob AS numeric) CASCADE; - -DO $DO$ -DECLARE - ans boolean; - user_name text; - global_query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP VIEW IF EXISTS DBE_PERF.local_active_session CASCADE; - end if; -END $DO$; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_current_instance_info(text, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name_new text; - node_count int; - BEGIN - - IF $2 is null THEN - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info()'; - ELSE - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info() limit '||$2; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='||quote_literal($1); - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name_new in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - select count(*) from pgxc_node where node_name=quote_literal(node_name_new) into node_count; - IF node_count <> 0 THEN - query_str := 'EXECUTE DIRECT ON ('||node_name_new||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END IF; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_history_instance_info(text, TIMESTAMP, TIMESTAMP, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name_new text; - node_count int; - BEGIN - - IF $4 is null THEN - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'||quote_literal($2)||' and timestamp <'||quote_literal($3); - ELSE - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'||quote_literal($2)||' and timestamp <'||quote_literal($3)||' limit '||quote_literal($4); - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='||quote_literal($1); - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name_new in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - select count(*) from pgxc_node where node_name=quote_literal(node_name_new) into node_count; - IF node_count <> 0 THEN - query_str := 'EXECUTE DIRECT ON ('||node_name_new||') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END IF; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_current_instance_info(text, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name text; - BEGIN - - IF $2 is null THEN - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info()'; - ELSE - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info() limit '||$2; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='||quote_literal($1); - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name in select pg_catalog.regexp_split_to_table(quote_literal($1),',') LOOP - query_str := 'EXECUTE DIRECT ON ('||node_name||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_history_instance_info(text, TIMESTAMP, TIMESTAMP, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name text; - BEGIN - - IF $4 is null THEN - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'||quote_literal($2)||' and timestamp <'||quote_literal($3); - ELSE - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'||quote_literal($2)||' and timestamp <'||quote_literal($3)||' limit '||quote_literal($4); - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='||quote_literal($1); - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name in select pg_catalog.regexp_split_to_table(quote_literal($1),',') LOOP - query_str := 'EXECUTE DIRECT ON ('||node_name||') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -DROP VIEW IF EXISTS pg_catalog.pg_total_user_resource_info CASCADE; - -DROP FUNCTION IF EXISTS pg_catalog.gs_wlm_get_all_user_resource_info(OUT userid Oid, OUT used_memory int, OUT total_memory int, OUT used_cpu float, OUT total_cpu int, OUT used_space bigint, OUT total_space bigint, OUT used_temp_space bigint, OUT total_temp_space bigint, OUT used_spill_space bigint, OUT total_spill_space bigint, OUT read_kbytes bigint, OUT write_kbytes bigint, OUT read_counts bigint, OUT write_counts bigint, OUT read_speed float, OUT write_speed float) cascade; -CREATE OR REPLACE FUNCTION pg_catalog.gs_wlm_get_all_user_resource_info() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str2 text; - BEGIN - query_str := 'SELECT rolname FROM pg_authid'; - FOR row_name IN EXECUTE(query_str) LOOP - query_str2 := 'SELECT * FROM pg_catalog.gs_wlm_user_resource_info(''' || row_name.rolname || ''')'; - FOR row_data IN EXECUTE(query_str2) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW pg_catalog.pg_total_user_resource_info_oid AS -SELECT * FROM pg_catalog.gs_wlm_get_all_user_resource_info() AS -(userid Oid, - used_memory int, - total_memory int, - used_cpu float, - total_cpu int, - used_space bigint, - total_space bigint, - used_temp_space bigint, - total_temp_space bigint, - used_spill_space bigint, - total_spill_space bigint, - read_kbytes bigint, - write_kbytes bigint, - read_counts bigint, - write_counts bigint, - read_speed float, - write_speed float -); - -DROP FUNCTION IF EXISTS pg_catalog.gs_wlm_session_respool() cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5021; -CREATE OR REPLACE FUNCTION pg_catalog.gs_wlm_session_respool(input bigint, OUT datid oid, OUT threadid bigint, OUT sessionid bigint, OUT threadpid integer, OUT usesysid oid, OUT cgroup text, OUT session_respool name) RETURNS SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_session_respool'; - - -DROP FUNCTION IF EXISTS pg_catalog.pg_cbm_rotate_file(in rotate_lsn text) CASCADE; - - -DROP FUNCTION IF EXISTS pg_catalog.distributed_count(text,text); -DROP FUNCTION IF EXISTS pg_catalog.table_skewness_with_schema(text,text); - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_current_instance_info(text, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name text; - flag boolean; - special text := '[ ;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT pg_catalog.regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - IF flag = true THEN - RAISE WARNING 'Illegal character entered for function'; - return; - END IF; - - IF $2 is null THEN - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info()'; - ELSE - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info() limit '||$2; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='''||$1||''''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - query_str := 'EXECUTE DIRECT ON ('||node_name||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_history_instance_info(text, TIMESTAMP, TIMESTAMP, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name text; - flag boolean; - special text := '[ ;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT pg_catalog.regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - IF flag = true THEN - RAISE WARNING 'Illegal character entered for function'; - return; - END IF; - - IF $4 is null THEN - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'''''||$2||''''' and timestamp <'''''||$3||''''' '; - ELSE - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'''''||$2||''''' and timestamp <'''''||$3||''''' limit '||$4; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='''||$1||''''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - query_str := 'EXECUTE DIRECT ON ('||node_name||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.distributed_count(IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - total_num bigint; - flag boolean; - special text := '[;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - RETURN; - END IF; - EXECUTE 'SELECT count(1) FROM ' || $1 - INTO total_num; - - --Get the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node, pgxc_class where node_type IN (''C'', ''D'') AND is_oid_in_group_members(oid, nodeoids) AND - pcrelid=''' || $1 || '''::regclass::oid'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select ''''DN_name'''' as dnname1, count(1) as count1 from ' || $1 || ''''; - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.dnname1 := CASE - WHEN pg_catalog.LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-pg_catalog.length(row_name.node_name)) - ELSE pg_catalog.SUBSTR(row_name.node_name,1,20) - END; - DNName := row_data.dnname1; - Num := row_data.count1; - IF total_num = 0 THEN - Ratio := 0.000 ||'%'; - ELSE - Ratio := ROUND(row_data.count1/total_num*100,3) || '%'; - END IF; - RETURN next; - END LOOP; - END LOOP; - - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.table_skewness(text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -declare -flag boolean; -special text := '[;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - return NEXT; - ELSE - RETURN QUERY EXECUTE 'SELECT * FROM pg_catalog.distributed_count(''' || $1 || ''') ORDER BY num DESC, dnname'; - END IF; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_get_table_distribution( IN table_name TEXT, IN schema_name TEXT) -RETURNS TEXT -AS -$$ -DECLARE -nodename text; -query_str text; -row_data record; -row_data1 record; -nodelist text; -flag boolean; -special text := '[ ;|-]'; -BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN table_name, IN special; - IF flag = true THEN - raise WARNING 'Illegal character entered for function'; - return nodelist; - END IF; - - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN schema_name, IN special; - IF flag = true THEN - raise WARNING 'Illegal character entered for function'; - return nodelist; - END IF; - - query_str := 'SELECT oid,node_name FROM pgxc_node WHERE node_type=''D'' order by node_name'; - - FOR row_data IN EXECUTE(query_str) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_data.node_name || ') ''SELECT count(*) AS num FROM pg_class c LEFT JOIN pg_namespace n ON c.relnamespace = n.oid WHERE relname='''''||table_name||''''' AND n.nspname='''''||schema_name||''''' '''; - FOR row_data1 IN EXECUTE(query_str) LOOP - IF row_data1.num = 1 THEN - nodelist := nodelist || ' '|| row_data.oid; - END IF; - END LOOP; - END LOOP; - - RETURN nodelist; -END; -$$ -LANGUAGE plpgsql; - -CREATE OR REPLACE FUNCTION pg_catalog.get_shard_oids_byname(IN node_name varchar) -RETURNS Oid[] AS $$ -declare - node_oid Oid; - nodes Oid[]; - nodenames_query text; - total_num bigint; - flag boolean; - special text := '[;|-]'; -BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - return '{0}'; - ELSE - nodenames_query := 'SELECT oid FROM pgxc_node WHERE node_name = $1 ORDER BY oid'; - FOR node_oid IN EXECUTE nodenames_query USING node_name LOOP - nodes := array_append(nodes, node_oid); - END LOOP; - RETURN nodes; - END IF; -END; $$ -LANGUAGE plpgsql NOT FENCED; - -DROP FUNCTION IF EXISTS pg_catalog.pg_stat_get_activity(INT8) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 2022; -CREATE FUNCTION pg_catalog.pg_stat_get_activity(INT8, OUT datid OID, OUT pid INT8, OUT sessionid INT8, OUT usesysid OID, OUT application_name TEXT, OUT state TEXT, -OUT query TEXT, OUT waiting BOOL, OUT xact_start timestamptz, OUT query_start timestamptz, OUT backend_start timestamptz, OUT state_change timestamptz, OUT client_addr INET, -OUT client_hostname TEXT, OUT client_port INT4, OUT enqueue TEXT, OUT query_id INT8) RETURNS -SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_activity'; - -DROP FUNCTION IF EXISTS pg_catalog.pg_stat_get_activity_with_conninfo(INT8) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 4212; -CREATE FUNCTION pg_catalog.pg_stat_get_activity_with_conninfo(INT8, OUT datid OID, OUT pid INT8, OUT sessionid INT8, OUT usesysid OID, OUT application_name TEXT, OUT state TEXT, -OUT query TEXT, OUT waiting BOOL, OUT xact_start timestamptz, OUT query_start timestamptz, OUT backend_start timestamptz, OUT state_change timestamptz, OUT client_addr INET, -OUT client_hostname TEXT, OUT client_port INT4, OUT enqueue TEXT, OUT query_id INT8, OUT connection_info TEXT) RETURNS -SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_activity_with_conninfo'; - -DROP FUNCTION IF EXISTS pg_catalog.pg_stat_get_session_wlmstat(INT4) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 3502; -CREATE FUNCTION pg_catalog.pg_stat_get_session_wlmstat(INT4, OUT datid OID, OUT threadid INT8, OUT sessionid INT8, OUT threadpid INT4, OUT usesysid OID, OUT appname TEXT, OUT query TEXT, -OUT priority INT8, OUT block_time INT8, OUT elapsed_time INT8, OUT total_cpu_time INT8, OUT skew_percent INT4, OUT statement_mem INT4, OUT active_points INT4, OUT dop_value INT4, OUT current_cgroup TEXT, -OUT current_status TEXT, OUT enqueue_state TEXT, OUT attribute TEXT, OUT is_plana BOOL, OUT node_group TEXT) RETURNS -SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_session_wlmstat'; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_activity AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.sessionid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query, - S.connection_info - FROM pg_database D, pg_stat_get_activity_with_conninfo(NULL) AS S, pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_activity_ng AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.sessionid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query, - N.node_group - FROM pg_database D, pg_stat_get_activity(NULL) AS S, pg_stat_get_activity_ng(NULL) AS N, pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid AND - S.sessionid = N.sessionid; - -CREATE OR REPLACE VIEW pg_catalog.pg_session_wlmstat AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.threadid, - S.sessionid, - S.threadpid AS processid, - S.usesysid, - S.appname, - U.rolname AS usename, - S.priority, - S.attribute, - S.block_time, - S.elapsed_time, - S.total_cpu_time, - S.skew_percent AS cpu_skew_percent, - S.statement_mem, - S.active_points, - S.dop_value, - S.current_cgroup AS control_group, - S.current_status AS status, - S.enqueue_state AS enqueue, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query, - S.is_plana, - S.node_group - FROM pg_database D, pg_stat_get_session_wlmstat(NULL) AS S, pg_authid AS U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid; - - -DO $DO$ -DECLARE - ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE OR REPLACE VIEW dbe_perf.session_stat_activity AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query - FROM pg_database D, pg_stat_get_activity(NULL) AS S, pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.threadid = S.pid; - - - CREATE OR REPLACE VIEW DBE_PERF.replication_stat AS - SELECT - S.pid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - W.state, - W.sender_sent_location, - W.receiver_write_location, - W.receiver_flush_location, - W.receiver_replay_location, - W.sync_priority, - W.sync_state - FROM pg_stat_get_activity(NULL) AS S, pg_authid U, - pg_stat_get_wal_senders() AS W - WHERE S.usesysid = U.oid AND - S.pid = W.pid; - - CREATE OR REPLACE VIEW DBE_PERF.statement_wlmstat_complex_runtime AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.threadid, - S.threadpid AS processid, - S.usesysid, - S.appname, - U.rolname AS usename, - S.priority, - S.attribute, - S.block_time, - S.elapsed_time, - S.total_cpu_time, - S.skew_percent AS cpu_skew_percent, - S.statement_mem, - S.active_points, - S.dop_value, - S.current_cgroup AS control_group, - S.current_status AS status, - S.enqueue_state AS enqueue, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query, - S.is_plana, - S.node_group - FROM pg_database D, pg_stat_get_session_wlmstat(NULL) AS S, pg_authid AS U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.threadid = S.threadid; - end if; -END $DO$; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_replication AS - SELECT - S.pid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - W.state, - W.sender_sent_location, - W.receiver_write_location, - W.receiver_flush_location, - W.receiver_replay_location, - W.sync_priority, - W.sync_state - FROM pg_catalog.pg_stat_get_activity(NULL) AS S, pg_authid U, - pg_catalog.pg_stat_get_wal_senders() AS W - WHERE S.usesysid = U.oid AND - S.pid = W.pid; - -CREATE OR REPLACE VIEW pg_catalog.DV_SESSIONS AS - SELECT - sa.sessionid AS SID, - 0::integer AS SERIAL#, - sa.usesysid AS USER#, - ad.rolname AS USERNAME - FROM pg_catalog.pg_stat_get_activity(NULL) AS sa - LEFT JOIN pg_authid ad ON(sa.usesysid = ad.oid) - WHERE sa.application_name <> 'JobScheduler'; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_workload_records AS - SELECT - P.node_name, - S.threadid AS thread_id, - S.threadpid AS processid, - P.start_time AS time_stamp, - U.rolname AS username, - P.memory, - P.actpts AS active_points, - P.maxpts AS max_points, - P.priority, - P.resource_pool, - S.current_status AS status, - S.current_cgroup AS control_group, - P.queue_type AS enqueue, - S.query, - P.node_group - FROM pg_catalog.pg_stat_get_session_wlmstat(NULL) AS S, pg_authid U, - pg_catalog.gs_wlm_get_workload_records(0) P - WHERE P.query_pid = S.threadpid AND - S.usesysid = U.oid; - -CREATE OR REPLACE FUNCTION pg_catalog.get_large_table_name(relfile_node text, threshold_size_gb int8) -RETURNS text -AS $$ -DECLARE - query_str text; - relname text; -BEGIN - query_str := 'SELECT - NVL - ( - (SELECT - (case pg_catalog.pg_table_size(c.oid)/1024/1024/1024 > ' || threshold_size_gb || ' - when true then pg_catalog.concat(concat(n.nspname, ''.''), c.relname) - else ''null'' - end - ) relname - FROM - pg_catalog.pg_class c, - pg_catalog.pg_namespace n - WHERE - c.relnamespace = n.oid - AND - c.relfilenode = ' || $1 || ' - ) - , ''null'' - ) relname'; - FOR relname IN EXECUTE(query_str) LOOP - return relname; - END LOOP; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_wlm_get_user_info(input integer, OUT userid oid, OUT sysadmin boolean, OUT rpoid oid, OUT parentid oid, OUT totalspace bigint, OUT spacelimit bigint, OUT childcount integer, OUT childlist text) RETURNS SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_wlm_user_info'; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_wlm_get_resource_pool_info(input integer, OUT respool_oid oid, OUT ref_count integer, OUT active_points integer, OUT running_count integer, OUT waiting_count integer, OUT iops_limits integer, OUT io_priority integer) RETURNS SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_resource_pool_info'; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_wlm_get_workload_records(input integer, OUT node_idx oid, OUT query_pid bigint, OUT start_time bigint, OUT memory integer, OUT actpts integer, OUT maxpts integer, OUT priority integer, OUT resource_pool text, OUT node_name text, OUT queue_type text, OUT node_group text) RETURNS SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_workload_records'; - -DROP FUNCTION IF EXISTS pg_catalog.gs_get_control_group_info(out group_name text, out group_type text, out gid bigint, out classgid bigint, out class text, out group_workload text, out shares bigint, out limits bigint, out wdlevel bigint, out cpucores text, out nodegroup text, out group_kind text) CASCADE; -CREATE OR REPLACE FUNCTION pg_catalog.gs_get_control_group_info() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT group_name,group_kind FROM pgxc_group WHERE group_kind = ''v'' OR group_kind = ''i'' '; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - IF row_name.group_kind = 'i' THEN - query_str := 'SELECT *,CAST(''' || row_name.group_name || ''' AS TEXT) AS nodegroup,CAST(''' || row_name.group_kind || ''' AS TEXT) AS group_kind FROM pg_catalog.gs_all_nodegroup_control_group_info(''installation'')'; - ELSE - query_str := 'SELECT *,CAST(''' || row_name.group_name || ''' AS TEXT) AS nodegroup,CAST(''' || row_name.group_kind || ''' AS TEXT) AS group_kind FROM pg_catalog.gs_all_nodegroup_control_group_info(''' ||row_name. group_name||''')'; - END IF; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - --- the view for function gs_get_control_group_info. -DROP VIEW IF EXISTS pg_catalog.gs_get_control_group_info CASCADE; -CREATE VIEW pg_catalog.gs_get_control_group_info AS - SELECT * from gs_get_control_group_info() AS - ( - name text, - type text, - gid bigint, - classgid bigint, - class text, - workload text, - shares bigint, - limits bigint, - wdlevel bigint, - cpucores text, - nodegroup text, - group_kind text - ); - - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS DBE_PERF.get_wlm_controlgroup_ng_config(out group_name text, out group_type text, out gid bigint, out classgid bigint, out class text, out group_workload text, out shares bigint, out limits bigint, out wdlevel bigint, out cpucores text, out nodegroup text, out group_kind text) CASCADE; - DROP VIEW IF EXISTS DBE_PERF.wlm_controlgroup_ng_config CASCADE; - CREATE OR REPLACE FUNCTION DBE_PERF.get_wlm_controlgroup_ng_config() - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT group_name,group_kind FROM pgxc_group WHERE group_kind = ''v'' OR group_kind = ''i'' '; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - IF row_name.group_kind = 'i' THEN - query_str := 'SELECT *,CAST(''' || row_name.group_name || ''' AS TEXT) AS nodegroup,CAST(''' || row_name.group_kind || ''' AS TEXT) AS group_kind FROM pg_catalog.gs_all_nodegroup_control_group_info(''installation'')'; - ELSE - query_str := 'SELECT *,CAST(''' || row_name.group_name || ''' AS TEXT) AS nodegroup,CAST(''' || row_name.group_kind || ''' AS TEXT) AS group_kind FROM pg_catalog.gs_all_nodegroup_control_group_info(''' ||row_name. group_name||''')'; - END IF; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - -- the view for function gs_get_control_group_info. - CREATE OR REPLACE VIEW DBE_PERF.wlm_controlgroup_ng_config AS - SELECT * FROM DBE_PERF.get_wlm_controlgroup_ng_config() AS - (name text, - type text, - gid bigint, - classgid bigint, - class text, - workload text, - shares bigint, - limits bigint, - wdlevel bigint, - cpucores text, - nodegroup text, - group_kind text); - end if; -END $DO$; - - -DROP FUNCTION IF EXISTS pg_catalog.pg_get_flush_lsn() CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.pg_get_sync_flush_lsn() CASCADE; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS DBE_PERF.get_global_gs_asp() CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.get_datanode_active_session() CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.get_datanode_active_session_hist() CASCADE; - DROP VIEW IF EXISTS DBE_PERF.global_active_session CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.get_global_active_session() CASCADE; - DROP VIEW IF EXISTS DBE_PERF.local_active_session CASCADE; - DROP VIEW IF EXISTS DBE_PERF.global_thread_wait_status CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.get_global_thread_wait_status() CASCADE; - DROP VIEW IF EXISTS DBE_PERF.thread_wait_status CASCADE; - DROP VIEW IF EXISTS DBE_PERF.locks CASCADE; - end if; -END$$; - -DROP FUNCTION IF EXISTS pg_catalog.working_version_num() CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.locktag_decode() CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.get_local_active_session() CASCADE; -DROP VIEW IF EXISTS pg_catalog.pgxc_thread_wait_status CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.pgxc_get_thread_wait_status() CASCADE; -DROP VIEW IF EXISTS pg_catalog.pg_thread_wait_status CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.pg_stat_get_status() CASCADE; -DROP VIEW IF EXISTS pg_catalog.pg_locks CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.pg_lock_status() CASCADE; - -SET LOCAL inplace_upgrade_next_system_object_oids=IUO_PROC, 1371; -CREATE OR REPLACE FUNCTION pg_catalog.pg_lock_status -( - OUT locktype pg_catalog.text, - OUT database pg_catalog.oid, - OUT relation pg_catalog.oid, - OUT page pg_catalog.int4, - OUT tuple pg_catalog.int2, - OUT bucket pg_catalog.int4, - OUT virtualxid pg_catalog.text, - OUT transactionid pg_catalog.xid, - OUT classid pg_catalog.oid, - OUT objid pg_catalog.oid, - OUT objsubid pg_catalog.int2, - OUT virtualtransaction pg_catalog.text, - OUT pid pg_catalog.int8, - OUT sessionid pg_catalog.int8, - OUT mode pg_catalog.text, - OUT granted pg_catalog.bool, - OUT fastpath pg_catalog.bool) -RETURNS SETOF record LANGUAGE INTERNAL ROWS 1000 VOLATILE STRICT as 'pg_lock_status'; -CREATE OR REPLACE VIEW pg_catalog.pg_locks AS - SELECT DISTINCT * from pg_catalog.pg_lock_status(); - -set local inplace_upgrade_next_system_object_oids = IUO_PROC, 3980; -CREATE OR REPLACE FUNCTION pg_catalog.pg_stat_get_status -( - IN tid pg_catalog.int8, - OUT node_name pg_catalog.text, - OUT db_name pg_catalog.text, - OUT thread_name pg_catalog.text, - OUT query_id pg_catalog.int8, - OUT tid pg_catalog.int8, - OUT sessionid pg_catalog.int8, - OUT lwtid pg_catalog.int4, - OUT psessionid pg_catalog.int8, - OUT tlevel pg_catalog.int4, - OUT smpid pg_catalog.int4, - OUT wait_status pg_catalog.text, - OUT wait_event pg_catalog.text) -RETURNS SETOF record LANGUAGE INTERNAL ROWS 1000 VOLATILE STRICT as 'pg_stat_get_status'; -CREATE VIEW pg_catalog.pg_thread_wait_status AS - SELECT * FROM pg_catalog.pg_stat_get_status(NULL); - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 3591; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_thread_wait_status( - OUT node_name pg_catalog.text, - OUT db_name pg_catalog.text, - OUT thread_name pg_catalog.text, - OUT query_id pg_catalog.int8, - OUT tid pg_catalog.int8, - OUT sessionid pg_catalog.int8, - OUT lwtid pg_catalog.int4, - OUT psessionid pg_catalog.int8, - OUT tlevel pg_catalog.int4, - OUT smpid pg_catalog.int4, - OUT wait_status pg_catalog.text, - OUT wait_event pg_catalog.text) -RETURNS SETOF RECORD -LANGUAGE INTERNAL COST 100 ROWS 1000 AS 'pgxc_stat_get_status'; -CREATE OR REPLACE VIEW pg_catalog.pgxc_thread_wait_status AS - SELECT * FROM pg_catalog.pgxc_get_thread_wait_status(); - -set local inplace_upgrade_next_system_object_oids = IUO_PROC, 5721; -CREATE OR REPLACE FUNCTION pg_catalog.get_local_active_session - (OUT sampleid bigint, - OUT sample_time timestamp with time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp with time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) -RETURNS setof record LANGUAGE INTERNAL VOLATILE NOT FENCED as 'get_local_active_session'; - -DO $DO$ -DECLARE - ans boolean; - user_name text; - global_query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE OR REPLACE VIEW dbe_perf.locks AS - SELECT * FROM pg_catalog.pg_lock_status() AS L; - - CREATE OR REPLACE VIEW DBE_PERF.thread_wait_status AS - SELECT * FROM pg_catalog.pg_stat_get_status(NULL); - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_thread_wait_status() - RETURNS setof DBE_PERF.thread_wait_status - AS $$ - DECLARE - row_data DBE_PERF.thread_wait_status%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all cn dn node names - query_str_nodes := 'SELECT node_name FROM pg_catalog.pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.thread_wait_status'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE VIEW DBE_PERF.global_thread_wait_status AS - SELECT * FROM DBE_PERF.get_global_thread_wait_status(); - - CREATE OR REPLACE FUNCTION DBE_PERF.get_datanode_active_session_hist - ( IN datanode text, - IN start_ts timestamp without time zone, - IN end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA pg_catalog.gs_asp%ROWTYPE; - cn_name record; - query_text record; - QUERY_STR text; - query_cn text; - query_str_cn_name text; - node_str text; - BEGIN - node_str := 'SELECT * FROM pg_catalog.gs_asp where sample_time > '''''||$2||''''' and sample_time < '''''||$3||''''; - QUERY_STR := 'EXECUTE DIRECT ON (' || $1 || ') '''|| node_str ||''''';'; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := datanode; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - IF ROW_DATA.cn_id IS NULL THEN - unique_query := ROW_DATA.unique_query; - ELSE - query_str_cn_name := 'SELECT node_name FROM pg_catalog.pgxc_node WHERE node_id='||ROW_DATA.cn_id||' AND nodeis_active = true'; - FOR cn_name IN EXECUTE(query_str_cn_name) LOOP - query_cn := 'EXECUTE DIRECT ON (' || cn_name.node_name || ') ''SELECT unique_query FROM pg_catalog.gs_asp where unique_query_id = '|| ROW_DATA.unique_query_id||' limit 1'''; - FOR query_text IN EXECUTE(query_cn) LOOP - unique_query := query_text.unique_query; - END LOOP; - END LOOP; - END IF; - RETURN NEXT; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_gs_asp - (IN start_ts timestamp without time zone, - IN end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA pg_catalog.gs_asp%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - node_str TEXT; - BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM pg_catalog.PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'')'; - node_str := 'SELECT * FROM pg_catalog.gs_asp where sample_time > '''''||$1||''''' and sample_time < '''''||$2||''''; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') '''|| node_str ||''''';'; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := ROW_NAME.NODE_NAME; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - unique_query := ROW_DATA.unique_query; - RETURN NEXT; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - SELECT SESSION_USER INTO user_name; - global_query_str := 'GRANT ALL ON TABLE DBE_PERF.locks TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE global_query_str; - global_query_str := 'GRANT ALL ON TABLE DBE_PERF.global_thread_wait_status TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE global_query_str; - global_query_str := 'GRANT ALL ON TABLE DBE_PERF.thread_wait_status TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE global_query_str; - - GRANT SELECT ON DBE_PERF.locks TO public; - GRANT SELECT ON DBE_PERF.global_thread_wait_status TO public; - GRANT SELECT ON DBE_PERF.thread_wait_status TO public; - - - end if; -END $DO$; - -GRANT SELECT ON pg_catalog.pg_locks TO public; -GRANT SELECT ON pg_catalog.pg_thread_wait_status TO public; -GRANT SELECT ON pg_catalog.pgxc_thread_wait_status TO public; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_tables where tablename = 'snap_global_thread_wait_status' and schemaname = 'snapshot' limit 1) into ans; - if ans = true then - alter table snapshot.snap_global_thread_wait_status - DROP COLUMN IF EXISTS snap_locktag, - DROP COLUMN IF EXISTS snap_lockmode, - DROP COLUMN IF EXISTS snap_block_sessionid; - end if; -END$DO$; - --- ---------------------------------------------------------------- --- rollback pg_pooler_status --- ---------------------------------------------------------------- -DROP FUNCTION IF EXISTS pg_catalog.pg_stat_get_pooler_status(OUT database_name text, OUT user_name text, OUT tid int8, OUT pgoptions text, OUT node_oid int8, OUT in_use boolean, OUT session_params text, OUT fdsock int8, OUT remote_pid int8, OUT used_count int8) CASCADE; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 3955; -CREATE FUNCTION pg_catalog.pg_stat_get_pooler_status(OUT database_name text, OUT user_name text, OUT tid int8, OUT pgoptions text, OUT node_oid int8, OUT in_use boolean, OUT session_params text, OUT fdsock int8, OUT remote_pid int8) RETURNS SETOF record LANGUAGE INTERNAL STABLE ROWS 100 as 'pg_stat_get_pooler_status'; - -DROP VIEW IF EXISTS pg_catalog.pg_pooler_status; -CREATE VIEW pg_catalog.pg_pooler_status AS - SELECT - S.database_name AS database, - S.user_name AS user_name, - S.tid AS tid, - S.node_oid AS node_oid, - D.node_name AS node_name, - S.in_use AS in_use, - D.node_port AS node_port, - S.fdsock AS fdsock, - S.remote_pid AS remote_pid, - S.session_params AS session_params - FROM pgxc_node D, pg_stat_get_pooler_status() AS S - WHERE D.oid = S.node_oid; - -GRANT SELECT ON pg_catalog.pg_pooler_status TO public; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP VIEW IF EXISTS DBE_PERF.summary_statement cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_summary_statement( - OUT node_name name, - OUT node_id integer, - OUT user_name name, - OUT user_id oid, - OUT unique_sql_id bigint, - OUT query text, - OUT n_calls bigint, - OUT min_elapse_time bigint, - OUT max_elapse_time bigint, - OUT total_elapse_time bigint, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - Out net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text - ) cascade; - DROP VIEW IF EXISTS DBE_PERF.STATEMENT cascade; - end if; -END$DO$; - -DROP FUNCTION IF EXISTS pg_catalog.get_instr_unique_sql() cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5702; -CREATE FUNCTION pg_catalog.get_instr_unique_sql -( - OUT node_name name, - OUT node_id integer, - OUT user_name name, - OUT user_id oid, - OUT unique_sql_id bigint, - OUT query text, - OUT n_calls bigint, - OUT min_elapse_time bigint, - OUT max_elapse_time bigint, - OUT total_elapse_time bigint, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT net_send_time bigint, - OUT data_io_time bigint -) -RETURNS setof record LANGUAGE INTERNAL VOLATILE NOT FENCED as 'get_instr_unique_sql'; - -DO $DO$ -DECLARE - ans boolean; - user_name text; - query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE VIEW DBE_PERF.statement AS - SELECT * FROM get_instr_unique_sql(); - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statement() - RETURNS setof DBE_PERF.statement - AS $$ - DECLARE - row_data DBE_PERF.statement%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE VIEW DBE_PERF.summary_statement AS - SELECT * FROM DBE_PERF.get_summary_statement(); - SELECT SESSION_USER INTO user_name; - query_str := 'GRANT ALL ON TABLE DBE_PERF.STATEMENT TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - query_str := 'GRANT ALL ON TABLE DBE_PERF.summary_statement TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - GRANT SELECT ON TABLE DBE_PERF.STATEMENT TO PUBLIC; - GRANT SELECT ON TABLE DBE_PERF.summary_statement TO PUBLIC; - end if; -END$DO$; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_tables where tablename = 'snap_summary_statement' and schemaname = 'snapshot' limit 1) into ans; - if ans = true then - alter table snapshot.snap_summary_statement - DROP COLUMN IF EXISTS snap_net_send_info, - DROP COLUMN IF EXISTS snap_net_recv_info, - DROP COLUMN IF EXISTS snap_net_stream_send_info, - DROP COLUMN IF EXISTS snap_net_stream_recv_info; - end if; -END$DO$; - -DROP VIEW IF EXISTS pg_catalog.gs_matviews CASCADE; - -do $$DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP VIEW IF EXISTS DBE_PERF.global_get_bgwriter_status CASCADE; - DROP FUNCTION IF EXISTS pg_catalog.local_bgwriter_stat(); - DROP FUNCTION IF EXISTS pg_catalog.remote_bgwriter_stat(); - end if; -END$$; - -grant ALL on table pg_catalog.gs_wlm_session_query_info_all to public; -grant ALL on table pg_catalog.gs_wlm_operator_info to public; -grant ALL on table pg_catalog.gs_wlm_ec_operator_info to public; -grant all on pg_catalog.gs_wlm_session_info to public; -grant all on pg_catalog.gs_wlm_user_session_info to public; -grant all on pg_catalog.gs_wlm_workload_records to public; - -DO $DO$ -DECLARE - ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS dbe_perf.track_memory_context(IN contexts text) cascade; - DROP FUNCTION IF EXISTS dbe_perf.track_memory_context_detail(OUT context_name text, OUT file text, OUT line int, OUT size bigint) cascade; - DROP VIEW IF EXISTS dbe_perf.track_memory_context_detail cascade; - end if; -END$DO$; - -DROP FUNCTION IF EXISTS pg_catalog.pg_stat_get_activity(INT8) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 2022; -CREATE FUNCTION pg_catalog.pg_stat_get_activity(INT8, OUT datid OID, OUT pid INT8, OUT sessionid INT8, OUT usesysid OID, OUT application_name TEXT, OUT state TEXT, -OUT query TEXT, OUT waiting BOOL, OUT xact_start timestamptz, OUT query_start timestamptz, OUT backend_start timestamptz, OUT state_change timestamptz, OUT client_addr INET, -OUT client_hostname TEXT, OUT client_port INT4, OUT enqueue TEXT, OUT query_id INT8) RETURNS -SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_activity'; - -DROP FUNCTION IF EXISTS pg_catalog.pg_stat_get_activity_with_conninfo(INT8) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 4212; -CREATE FUNCTION pg_catalog.pg_stat_get_activity_with_conninfo(INT8, OUT datid OID, OUT pid INT8, OUT sessionid INT8, OUT usesysid OID, OUT application_name TEXT, OUT state TEXT, -OUT query TEXT, OUT waiting BOOL, OUT xact_start timestamptz, OUT query_start timestamptz, OUT backend_start timestamptz, OUT state_change timestamptz, OUT client_addr INET, -OUT client_hostname TEXT, OUT client_port INT4, OUT enqueue TEXT, OUT query_id INT8, OUT connection_info TEXT) RETURNS -SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_activity_with_conninfo'; - -DROP FUNCTION IF EXISTS pg_catalog.pg_stat_get_session_wlmstat(INT4) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 3502; -CREATE FUNCTION pg_catalog.pg_stat_get_session_wlmstat(INT4, OUT datid OID, OUT threadid INT8, OUT sessionid INT8, OUT threadpid INT4, OUT usesysid OID, OUT appname TEXT, OUT query TEXT, -OUT priority INT8, OUT block_time INT8, OUT elapsed_time INT8, OUT total_cpu_time INT8, OUT skew_percent INT4, OUT statement_mem INT4, OUT active_points INT4, OUT dop_value INT4, OUT current_cgroup TEXT, -OUT current_status TEXT, OUT enqueue_state TEXT, OUT attribute TEXT, OUT is_plana BOOL, OUT node_group TEXT) RETURNS -SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_session_wlmstat'; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_activity AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.sessionid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query, - S.connection_info - FROM pg_database D, pg_stat_get_activity_with_conninfo(NULL) AS S, pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_activity_ng AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.sessionid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query, - N.node_group - FROM pg_database D, pg_stat_get_activity(NULL) AS S, pg_stat_get_activity_ng(NULL) AS N, pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid AND - S.sessionid = N.sessionid; - -CREATE OR REPLACE VIEW pg_catalog.pg_session_wlmstat AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.threadid, - S.sessionid, - S.threadpid AS processid, - S.usesysid, - S.appname, - U.rolname AS usename, - S.priority, - S.attribute, - S.block_time, - S.elapsed_time, - S.total_cpu_time, - S.skew_percent AS cpu_skew_percent, - S.statement_mem, - S.active_points, - S.dop_value, - S.current_cgroup AS control_group, - S.current_status AS status, - S.enqueue_state AS enqueue, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query, - S.is_plana, - S.node_group - FROM pg_database D, pg_stat_get_session_wlmstat(NULL) AS S, pg_authid AS U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid; - - -DO $DO$ -DECLARE - ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE OR REPLACE VIEW dbe_perf.session_stat_activity AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query - FROM pg_database D, pg_stat_get_activity(NULL) AS S, pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.threadid = S.pid; - - - CREATE OR REPLACE VIEW DBE_PERF.replication_stat AS - SELECT - S.pid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - W.state, - W.sender_sent_location, - W.receiver_write_location, - W.receiver_flush_location, - W.receiver_replay_location, - W.sync_priority, - W.sync_state - FROM pg_stat_get_activity(NULL) AS S, pg_authid U, - pg_stat_get_wal_senders() AS W - WHERE S.usesysid = U.oid AND - S.pid = W.pid; - - CREATE OR REPLACE VIEW DBE_PERF.statement_wlmstat_complex_runtime AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.threadid, - S.threadpid AS processid, - S.usesysid, - S.appname, - U.rolname AS usename, - S.priority, - S.attribute, - S.block_time, - S.elapsed_time, - S.total_cpu_time, - S.skew_percent AS cpu_skew_percent, - S.statement_mem, - S.active_points, - S.dop_value, - S.current_cgroup AS control_group, - S.current_status AS status, - S.enqueue_state AS enqueue, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query, - S.is_plana, - S.node_group - FROM pg_database D, pg_stat_get_session_wlmstat(NULL) AS S, pg_authid AS U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.threadid = S.threadid; - end if; -END $DO$; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_replication AS - SELECT - S.pid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - W.state, - W.sender_sent_location, - W.receiver_write_location, - W.receiver_flush_location, - W.receiver_replay_location, - W.sync_priority, - W.sync_state - FROM pg_catalog.pg_stat_get_activity(NULL) AS S, pg_authid U, - pg_catalog.pg_stat_get_wal_senders() AS W - WHERE S.usesysid = U.oid AND - S.pid = W.pid; - -CREATE OR REPLACE VIEW pg_catalog.DV_SESSIONS AS - SELECT - sa.sessionid AS SID, - 0::integer AS SERIAL#, - sa.usesysid AS USER#, - ad.rolname AS USERNAME - FROM pg_catalog.pg_stat_get_activity(NULL) AS sa - LEFT JOIN pg_authid ad ON(sa.usesysid = ad.oid) - WHERE sa.application_name <> 'JobScheduler'; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_workload_records AS - SELECT - P.node_name, - S.threadid AS thread_id, - S.threadpid AS processid, - P.start_time AS time_stamp, - U.rolname AS username, - P.memory, - P.actpts AS active_points, - P.maxpts AS max_points, - P.priority, - P.resource_pool, - S.current_status AS status, - S.current_cgroup AS control_group, - P.queue_type AS enqueue, - S.query, - P.node_group - FROM pg_catalog.pg_stat_get_session_wlmstat(NULL) AS S, pg_authid U, - pg_catalog.gs_wlm_get_workload_records(0) P - WHERE P.query_pid = S.threadpid AND - S.usesysid = U.oid; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_stat_dirty_tables(in dirty_percent int4, in n_tuples int4,in schema text, out relid oid, out relname name, out schemaname name, out n_tup_ins int8, out n_tup_upd int8, out n_tup_del int8, out n_live_tup int8, out n_dead_tup int8, out dirty_page_rate numeric(5,2)) -RETURNS setof record -AS $$ -DECLARE - query_str text; - row_data record; - BEGIN - query_str := 'SELECT oid relid, s.relname,s.schemaname,s.n_tup_ins,s.n_tup_upd,s.n_tup_del,s.n_live_tup,s.n_dead_tup,s.dirty_page_rate - FROM pg_class p, - (SELECT relname, schemaname, SUM(n_tup_ins) n_tup_ins, SUM(n_tup_upd) n_tup_upd, SUM(n_tup_del) n_tup_del, SUM(n_live_tup) n_live_tup, SUM(n_dead_tup) n_dead_tup, CAST((SUM(n_dead_tup) / SUM(n_dead_tup + n_live_tup + 0.00001) * 100) - AS NUMERIC(5,2)) dirty_page_rate FROM pg_catalog.pgxc_stat_dirty_tables('||dirty_percent||','||n_tuples||','''||schema||''') GROUP BY (relname,schemaname)) s - WHERE p.relname = s.relname AND p.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = s.schemaname) ORDER BY dirty_page_rate DESC'; - FOR row_data IN EXECUTE(query_str) LOOP - relid = row_data.relid; - relname = row_data.relname; - schemaname = row_data.schemaname; - n_tup_ins = row_data.n_tup_ins; - n_tup_upd = row_data.n_tup_upd; - n_tup_del = row_data.n_tup_del; - n_live_tup = row_data.n_live_tup; - n_dead_tup = row_data.n_dead_tup; - dirty_page_rate = row_data.dirty_page_rate; - return next; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -drop extension if exists gsredistribute cascade; - -DROP VIEW IF EXISTS pg_catalog.pg_stat_replication; - CREATE VIEW pg_catalog.pg_stat_replication AS - SELECT - S.pid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - W.state, - W.sender_sent_location, - W.receiver_write_location, - W.receiver_flush_location, - W.receiver_replay_location, - W.sync_priority, - W.sync_state - FROM pg_stat_get_activity(NULL) AS S, pg_authid U, - pg_stat_get_wal_senders() AS W - WHERE S.usesysid = U.oid AND - S.pid = W.sender_pid; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP VIEW IF EXISTS dbe_perf.replication_stat; - CREATE VIEW dbe_perf.replication_stat AS - SELECT - S.pid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - W.state, - W.sender_sent_location, - W.receiver_write_location, - W.receiver_flush_location, - W.receiver_replay_location, - W.sync_priority, - W.sync_state - FROM pg_stat_get_activity(NULL) AS S, pg_authid U, - pg_stat_get_wal_senders() AS W - WHERE S.usesysid = U.oid AND - S.pid = W.sender_pid; - end if; -END$DO$; - -CREATE or REPLACE FUNCTION pg_catalog.gs_get_table_distribution( IN table_name TEXT, IN schema_name TEXT) -RETURNS TEXT -AS -$$ -DECLARE -nodename text; -query_str text; -row_data record; -row_data1 record; -nodelist text; -flag boolean; -special text := '[;|-]'; -BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN table_name, IN special; - IF flag = true THEN - raise WARNING 'Illegal character entered for function'; - return nodelist; - END IF; - - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN schema_name, IN special; - IF flag = true THEN - raise WARNING 'Illegal character entered for function'; - return nodelist; - END IF; - - query_str := 'SELECT oid,node_name FROM pgxc_node WHERE node_type=''D'' order by node_name'; - - FOR row_data IN EXECUTE(query_str) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_data.node_name || ') ''SELECT count(*) AS num FROM pg_class c LEFT JOIN pg_namespace n ON c.relnamespace = n.oid WHERE relname='''''||table_name||''''' AND n.nspname='''''||schema_name||''''' '''; - FOR row_data1 IN EXECUTE(query_str) LOOP - IF row_data1.num = 1 THEN - nodelist := nodelist || ' '|| row_data.oid; - END IF; - END LOOP; - END LOOP; - - RETURN nodelist; -END; -$$ -LANGUAGE plpgsql; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_current_instance_info(text, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name text; - BEGIN - IF $2 is null THEN - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info()'; - ELSE - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info() limit '||$2; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='''||$1||''''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - query_str := 'EXECUTE DIRECT ON ('||node_name||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_history_instance_info(text, TIMESTAMP, TIMESTAMP, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name text; - BEGIN - IF $4 is null THEN - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'''''||$2||''''' and timestamp <'''''||$3||''''' '; - ELSE - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'''''||$2||''''' and timestamp <'''''||$3||''''' limit '||$4; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='''||$1||''''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - query_str := 'EXECUTE DIRECT ON ('||node_name||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -DROP VIEW IF EXISTS pg_catalog.pg_roles cascade; -CREATE OR REPLACE VIEW pg_catalog.pg_roles AS - SELECT - rolname, - rolsuper, - rolinherit, - rolcreaterole, - rolcreatedb, - rolcatupdate, - rolcanlogin, - rolreplication, - rolauditadmin, - rolsystemadmin, - rolconnlimit, - '********'::text as rolpassword, - rolvalidbegin, - rolvaliduntil, - rolrespool, - rolparentid, - roltabspace, - setconfig as rolconfig, - pg_authid.oid, - roluseft, - rolkind, - pgxc_group.group_name as nodegroup, - roltempspace, - rolspillspace, - rolmonitoradmin, - roloperatoradmin, - rolpolicyadmin - FROM pg_authid LEFT JOIN pg_db_role_setting s - ON (pg_authid.oid = setrole AND setdatabase = 0) - LEFT JOIN pgxc_group - ON (pg_authid.rolnodegroup = pgxc_group.oid); - -DECLARE - user_name text; - query_str text; -BEGIN - SELECT SESSION_USER INTO user_name; - query_str := 'GRANT ALL ON TABLE pg_catalog.pg_roles TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; -END; -/ - -CREATE OR REPLACE VIEW pg_catalog.pg_rlspolicies AS - SELECT - N.nspname AS schemaname, - C.relname AS tablename, - pol.polname AS policyname, - CASE - WHEN pol.polpermissive THEN - 'PERMISSIVE' - ELSE - 'RESTRICTIVE' - END AS policypermissive, - CASE - WHEN pol.polroles = '{0}' THEN - string_to_array('public', ' ') - ELSE - ARRAY - ( - SELECT rolname - FROM pg_catalog.pg_roles - WHERE oid = ANY (pol.polroles) ORDER BY 1 - ) - END AS policyroles, - CASE pol.polcmd - WHEN 'r' THEN 'SELECT' - WHEN 'a' THEN 'INSERT' - WHEN 'w' THEN 'UPDATE' - WHEN 'd' THEN 'DELETE' - WHEN '*' THEN 'ALL' - END AS policycmd, - pg_catalog.pg_get_expr(pol.polqual, pol.polrelid) AS policyqual - FROM pg_catalog.pg_rlspolicy pol - JOIN pg_catalog.pg_class C ON (C.oid = pol.polrelid) - LEFT JOIN pg_catalog.pg_namespace N ON (N.oid = C.relnamespace); - -GRANT SELECT ON TABLE pg_catalog.pg_rlspolicies TO PUBLIC; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_user_info AS -SELECT - T.userid, - S.rolname AS username, - T.sysadmin, - T.rpoid, - R.respool_name AS respool, - T.parentid, - T.totalspace, - T.spacelimit, - T.childcount, - T.childlist -FROM pg_roles AS S, pg_catalog.gs_wlm_get_user_info(NULL) AS T, pg_resource_pool AS R -WHERE S.oid = T.userid AND T.rpoid = R.oid; - -GRANT SELECT ON TABLE pg_catalog.gs_wlm_user_info TO PUBLIC; - -DO $DO$ -DECLARE - ans boolean; - user_name text; - query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE OR REPLACE VIEW dbe_perf.wlm_user_resource_config AS - SELECT - T.userid, - S.rolname AS username, - T.sysadmin, - T.rpoid, - R.respool_name AS respool, - T.parentid, - T.totalspace, - T.spacelimit, - T.childcount, - T.childlist - FROM pg_roles AS S, gs_wlm_get_user_info(NULL) AS T, pg_resource_pool AS R - WHERE S.oid = T.userid AND T.rpoid = R.oid; - - SELECT SESSION_USER INTO user_name; - query_str := 'GRANT ALL ON TABLE dbe_perf.wlm_user_resource_config TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - GRANT SELECT ON TABLE dbe_perf.wlm_user_resource_config TO PUBLIC; - end if; -END $DO$; - -CREATE OR REPLACE FUNCTION pg_catalog.pg_get_delta_info(IN rel TEXT, IN schema_name TEXT, OUT part_name TEXT, OUT live_tuple INT8, OUT data_size INT8, OUT blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_info_str text; - query_str text; - query_part_str text; - query_select_str text; - query_size_str text; - row_info_data record; - row_data record; - row_part_info record; - BEGIN - query_info_str := 'SELECT C.oid,C.reldeltarelid,C.parttype FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE C.relname = '''|| rel ||''' and N.nspname = '''|| schema_name ||''''; - FOR row_info_data IN EXECUTE(query_info_str) LOOP - IF row_info_data.parttype = 'n' THEN - query_str := 'SELECT relname,oid from pg_class where oid= '||row_info_data.reldeltarelid||''; - EXECUTE(query_str) INTO row_data; - query_select_str := 'select count(*) from cstore.' || row_data.relname || ''; - EXECUTE (query_select_str) INTO live_tuple; - query_size_str := 'select * from pg_catalog.pg_relation_size(' || row_data.oid || ')'; - EXECUTE (query_size_str) INTO data_size; - blockNum := data_size/8192; - part_name := 'non partition table'; - return next; - ELSE - query_part_str := 'SELECT relname,reldeltarelid from pg_partition where parentid = '||row_info_data.oid|| 'and relname <> '''||rel||''''; - FOR row_part_info IN EXECUTE(query_part_str) LOOP - query_str := 'SELECT relname,oid from pg_class where oid = '||row_part_info.reldeltarelid||''; - part_name := row_part_info.relname; - FOR row_data IN EXECUTE(query_str) LOOP - query_select_str := 'select count(*) from cstore.' || row_data.relname || ''; - EXECUTE (query_select_str) INTO live_tuple; - query_size_str := 'select * from pg_catalog.pg_relation_size(' || row_data.oid || ')'; - EXECUTE (query_size_str) INTO data_size; - END LOOP; - blockNum := data_size/8192; - return next; - END LOOP; - END IF; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_delta_info(IN rel TEXT, OUT node_name TEXT, OUT part_name TEXT, OUT live_tuple INT8, OUT data_size INT8, OUT blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_str_nodes text; - query_str text; - query_part_str text; - rel_info record; - row_name record; - row_data record; - BEGIN - EXECUTE ('select c.relname,n.nspname from pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) where C.oid = (select '''|| rel ||'''::regclass::oid)') into rel_info; - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_catalog.pg_get_delta_info('''''||rel_info.relname||''''','''''||rel_info.nspname||''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - live_tuple := row_data.live_tuple; - data_size := row_data.data_size; - blockNum := row_data.blockNum; - part_name := row_data.part_name; - return next; - END LOOP; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.get_delta_info(IN rel TEXT, OUT part_name TEXT, OUT total_live_tuple INT8, OUT total_data_size INT8, OUT max_blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_str text; - row_data record; - BEGIN - query_str := 'select part_name, sum(live_tuple) total_live_tuple, sum(data_size) total_data_size, max(blocknum) max_blocknum from (select * from pg_catalog.pgxc_get_delta_info('''||$1||''')) group by part_name order by max_blocknum desc'; - FOR row_data IN EXECUTE(query_str) LOOP - part_name := row_data.part_name; - total_live_tuple := row_data.total_live_tuple; - total_data_size := row_data.total_data_size; - max_blockNum := row_data.max_blocknum; - return next; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -DROP FUNCTION IF EXISTS pg_catalog.pg_terminate_session(bigint, bigint) cascade; - -CREATE OR REPLACE VIEW pg_catalog.gs_session_memory_statistics AS -SELECT - S.datid AS datid, - S.usename, - S.pid, - S.query_start AS start_time, - T.min_peak_memory, - T.max_peak_memory, - T.spill_info, - S.query, - S.node_group, - T.top_mem_dn -FROM pg_stat_activity_ng AS S, pg_catalog.pg_stat_get_wlm_realtime_session_info(NULL) AS T -WHERE S.pid = T.threadid; - -CREATE OR REPLACE VIEW pg_catalog.gs_session_cpu_statistics AS -SELECT - S.datid AS datid, - S.usename, - S.pid, - S.query_start AS start_time, - T.min_cpu_time, - T.max_cpu_time, - T.total_cpu_time, - S.query, - S.node_group, - T.top_cpu_dn -FROM pg_stat_activity_ng AS S, pg_catalog.pg_stat_get_wlm_realtime_session_info(NULL) AS T -WHERE S.pid = T.threadid; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_session_statistics AS -SELECT - S.datid AS datid, - S.datname AS dbname, - T.schemaname, - T.nodename, - S.usename AS username, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - T.query_band, - S.pid, - S.sessionid, - T.block_time, - S.query_start AS start_time, - T.duration, - T.estimate_total_time, - T.estimate_left_time, - S.enqueue, - S.resource_pool, - T.control_group, - T.estimate_memory, - T.min_peak_memory, - T.max_peak_memory, - T.average_peak_memory, - T.memory_skew_percent, - T.spill_info, - T.min_spill_size, - T.max_spill_size, - T.average_spill_size, - T.spill_skew_percent, - T.min_dn_time, - T.max_dn_time, - T.average_dn_time, - T.dntime_skew_percent, - T.min_cpu_time, - T.max_cpu_time, - T.total_cpu_time, - T.cpu_skew_percent, - T.min_peak_iops, - T.max_peak_iops, - T.average_peak_iops, - T.iops_skew_percent, - T.warning, - S.query_id AS queryid, - T.query, - T.query_plan, - S.node_group, - T.top_cpu_dn, - T.top_mem_dn -FROM pg_stat_activity_ng AS S, pg_catalog.pg_stat_get_wlm_realtime_session_info(NULL) AS T -WHERE S.pid = T.threadid; - -CREATE OR REPLACE FUNCTION pg_catalog.pv_session_memory_detail_tp(OUT sessid TEXT, OUT sesstype TEXT, OUT contextname TEXT, OUT level INT2, OUT parent TEXT, OUT totalsize INT8, OUT freesize INT8, OUT usedsize INT8) -RETURNS setof record -AS $$ -DECLARE - enable_threadpool bool; - row_data record; - query_str text; -BEGIN - show enable_thread_pool into enable_threadpool; - - IF enable_threadpool THEN - query_str := 'with SM AS - (SELECT - S.sessid AS sessid, - T.thrdtype AS sesstype, - S.contextname AS contextname, - S.level AS level, - S.parent AS parent, - S.totalsize AS totalsize, - S.freesize AS freesize, - S.usedsize AS usedsize - FROM - pv_session_memory_context S - LEFT JOIN - (SELECT DISTINCT thrdtype, tid - FROM pv_thread_memory_context) T - on S.threadid = T.tid - ), - TM AS - (SELECT - S.sessid AS Ssessid, - T.thrdtype AS sesstype, - T.threadid AS Tsessid, - T.contextname AS contextname, - T.level AS level, - T.parent AS parent, - T.totalsize AS totalsize, - T.freesize AS freesize, - T.usedsize AS usedsize - FROM - pv_thread_memory_context T - LEFT JOIN - (SELECT DISTINCT sessid, threadid - FROM pv_session_memory_context) S - ON T.tid = S.threadid - ) - SELECT * from SM - UNION - SELECT - Ssessid AS sessid, sesstype, contextname, level, parent, totalsize, freesize, usedsize - FROM TM WHERE Ssessid IS NOT NULL - UNION - SELECT - Tsessid AS sessid, sesstype, contextname, level, parent, totalsize, freesize, usedsize - FROM TM WHERE Ssessid IS NULL;'; - FOR row_data IN EXECUTE(query_str) LOOP - sessid = row_data.sessid; - sesstype = row_data.sesstype; - contextname = row_data.contextname; - level = row_data.level; - parent = row_data.parent; - totalsize = row_data.totalsize; - freesize = row_data.freesize; - usedsize = row_data.usedsize; - return next; - END LOOP; - ELSE - query_str := 'SELECT - T.threadid AS sessid, - T.thrdtype AS sesstype, - T.contextname AS contextname, - T.level AS level, - T.parent AS parent, - T.totalsize AS totalsize, - T.freesize AS freesize, - T.usedsize AS usedsize - FROM pg_catalog.pv_thread_memory_detail() T;'; - FOR row_data IN EXECUTE(query_str) LOOP - sessid = row_data.sessid; - sesstype = row_data.sesstype; - contextname = row_data.contextname; - level = row_data.level; - parent = row_data.parent; - totalsize = row_data.totalsize; - freesize = row_data.freesize; - usedsize = row_data.usedsize; - return next; - END LOOP; - END IF; - RETURN; -END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.distributed_count(IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - total_num bigint; - flag boolean; - special text := '[;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN _table_name, IN special; - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - RETURN; - END IF; - EXECUTE 'SELECT count(1) FROM ' || _table_name - INTO total_num; - - --Get the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node, pgxc_class where node_type IN (''C'', ''D'') AND is_oid_in_group_members(oid, nodeoids) AND - pcrelid=''' || _table_name || '''::regclass::oid'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select ''''DN_name'''' as dnname1, count(1) as count1 from ' || $1 || ''''; - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.dnname1 := CASE - WHEN LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-length(row_name.node_name)) - ELSE SUBSTR(row_name.node_name,1,20) - END; - DNName := row_data.dnname1; - Num := row_data.count1; - IF total_num = 0 THEN - Ratio := 0.000 ||'%'; - ELSE - Ratio := ROUND(row_data.count1/total_num*100,3) || '%'; - END IF; - RETURN next; - END LOOP; - END LOOP; - - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.get_delta_info(IN rel TEXT, OUT part_name TEXT, OUT total_live_tuple INT8, OUT total_data_size INT8, OUT max_blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_str text; - row_data record; - BEGIN - query_str := 'select part_name, sum(live_tuple) total_live_tuple, sum(data_size) total_data_size, max(blocknum) max_blocknum from (select * from pg_catalog.pgxc_get_delta_info('''||rel||''')) group by part_name order by max_blocknum desc'; - FOR row_data IN EXECUTE(query_str) LOOP - part_name := row_data.part_name; - total_live_tuple := row_data.total_live_tuple; - total_data_size := row_data.total_data_size; - max_blockNum := row_data.max_blocknum; - return next; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.get_shard_oids_byname(IN node_name varchar) -RETURNS Oid[] AS $$ -declare - node_oid Oid; - nodes Oid[]; - nodenames_query text; - total_num bigint; - flag boolean; - special text := '[;|-]'; -BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN node_name, IN special; - - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - return '{0}'; - ELSE - nodenames_query := 'SELECT oid FROM pgxc_node WHERE node_name = ''' || node_name || ''' ORDER BY oid'; - FOR node_oid IN EXECUTE nodenames_query LOOP - nodes := array_append(nodes, node_oid); - END LOOP; - RETURN nodes; - END IF; -END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.get_large_table_name(relfile_node text, threshold_size_gb int8) -RETURNS text -AS $$ -DECLARE - query_str text; - relname text; -BEGIN - query_str := 'SELECT - NVL - ( - (SELECT - (case pg_catalog.pg_table_size(c.oid)/1024/1024/1024 > ' || threshold_size_gb || ' - when true then pg_catalog.concat(concat(n.nspname, ''.''), c.relname) - else ''null'' - end - ) relname - FROM - pg_catalog.pg_class c, - pg_catalog.pg_namespace n - WHERE - c.relnamespace = n.oid - AND - c.relfilenode = ' || relfile_node || ' - ) - , ''null'' - ) relname'; - FOR relname IN EXECUTE(query_str) LOOP - return relname; - END LOOP; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -create or replace function pg_catalog.table_skewness(table_name text, column_name text, - OUT seqNum text, OUT Num text, OUT Ratio text, row_num text default '0') -RETURNS setof record -AS $$ -DECLARE - tolal_num text; - row_data record; - execute_query text; - BEGIN - if row_num = 0 then - EXECUTE 'select count(1) from ' || table_name into tolal_num; - execute_query = 'select seqNum, count(1) as num - from (select pg_catalog.table_data_skewness(row(' || column_name ||'), ''H'') as seqNum from ' || table_name || - ') group by seqNum order by num DESC'; - else - tolal_num = row_num; - execute_query = 'select seqNum, count(1) as num - from (select pg_catalog.table_data_skewness(row(' || column_name ||'), ''H'') as seqNum from ' || table_name || - ' limit ' || row_num ||') group by seqNum order by num DESC'; - end if; - - if tolal_num = 0 then - seqNum = 0; - Num = 0; - Ratio = ROUND(0, 3) || '%'; - return; - end if; - - for row_data in EXECUTE execute_query loop - seqNum = row_data.seqNum; - Num = row_data.num; - Ratio = ROUND(row_data.num / tolal_num * 100, 3) || '%'; - RETURN next; - end loop; - END; -$$LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_activity AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.sessionid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query, - S.connection_info - FROM pg_database D, pg_stat_get_activity_with_conninfo(NULL) AS S, - pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_activity_ng AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.sessionid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query, - N.node_group - FROM pg_database D, pg_stat_get_activity(NULL) AS S, pg_stat_get_activity_ng(NULL) AS N, - pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid AND - S.sessionid = N.sessionid; - -CREATE OR REPLACE VIEW pg_catalog.pg_session_wlmstat AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.threadid, - S.sessionid, - S.threadpid AS processid, - S.usesysid, - S.appname, - U.rolname AS usename, - S.priority, - S.attribute, - S.block_time, - S.elapsed_time, - S.total_cpu_time, - S.skew_percent AS cpu_skew_percent, - S.statement_mem, - S.active_points, - S.dop_value, - S.current_cgroup AS control_group, - S.current_status AS status, - S.enqueue_state AS enqueue, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query, - S.is_plana, - S.node_group - FROM pg_database D, pg_stat_get_session_wlmstat(NULL) AS S, - pg_authid AS U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid; - -CREATE OR REPLACE VIEW pg_catalog.pg_wlm_statistics AS - SELECT - statement, - block_time, - elapsed_time, - total_cpu_time, - qualification_time, - skew_percent AS cpu_skew_percent, - control_group, - status, - action - FROM pg_stat_get_wlm_statistics(NULL); - -CREATE OR REPLACE VIEW pg_catalog.gs_session_memory_statistics AS -SELECT - S.datid AS datid, - S.usename, - S.pid, - S.query_start AS start_time, - T.min_peak_memory, - T.max_peak_memory, - T.spill_info, - S.query, - S.node_group, - T.top_mem_dn -FROM pg_stat_activity_ng AS S, pg_stat_get_wlm_realtime_session_info(NULL) AS T -WHERE S.pid = T.threadid; - -CREATE OR REPLACE VIEW pg_catalog.pg_session_iostat AS - SELECT - S.query_id, - T.mincurr_iops as mincurriops, - T.maxcurr_iops as maxcurriops, - T.minpeak_iops as minpeakiops, - T.maxpeak_iops as maxpeakiops, - T.iops_limits as io_limits, - CASE WHEN T.io_priority = 0 THEN 'None'::text - WHEN T.io_priority = 10 THEN 'Low'::text - WHEN T.io_priority = 20 THEN 'Medium'::text - WHEN T.io_priority = 50 THEN 'High'::text END AS io_priority, - S.query, - S.node_group -FROM pg_stat_activity_ng AS S, pg_stat_get_wlm_session_iostat_info(0) AS T -WHERE S.pid = T.threadid; - -CREATE OR REPLACE VIEW pg_catalog.gs_cluster_resource_info AS SELECT * FROM pg_stat_get_wlm_node_resource_info(0); - -CREATE OR REPLACE VIEW pg_catalog.gs_session_cpu_statistics AS -SELECT - S.datid AS datid, - S.usename, - S.pid, - S.query_start AS start_time, - T.min_cpu_time, - T.max_cpu_time, - T.total_cpu_time, - S.query, - S.node_group, - T.top_cpu_dn -FROM pg_stat_activity_ng AS S, pg_stat_get_wlm_realtime_session_info(NULL) AS T -WHERE S.pid = T.threadid; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_session_statistics AS -SELECT - S.datid AS datid, - S.datname AS dbname, - T.schemaname, - T.nodename, - S.usename AS username, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - T.query_band, - S.pid, - S.sessionid, - T.block_time, - S.query_start AS start_time, - T.duration, - T.estimate_total_time, - T.estimate_left_time, - S.enqueue, - S.resource_pool, - T.control_group, - T.estimate_memory, - T.min_peak_memory, - T.max_peak_memory, - T.average_peak_memory, - T.memory_skew_percent, - T.spill_info, - T.min_spill_size, - T.max_spill_size, - T.average_spill_size, - T.spill_skew_percent, - T.min_dn_time, - T.max_dn_time, - T.average_dn_time, - T.dntime_skew_percent, - T.min_cpu_time, - T.max_cpu_time, - T.total_cpu_time, - T.cpu_skew_percent, - T.min_peak_iops, - T.max_peak_iops, - T.average_peak_iops, - T.iops_skew_percent, - T.warning, - S.query_id AS queryid, - T.query, - T.query_plan, - S.node_group, - T.top_cpu_dn, - T.top_mem_dn -FROM pg_stat_activity_ng AS S, pg_stat_get_wlm_realtime_session_info(NULL) AS T -WHERE S.pid = T.threadid; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_wlm_get_all_user_resource_info() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str2 text; - BEGIN - query_str := 'SELECT rolname FROM pg_authid'; - FOR row_name IN EXECUTE(query_str) LOOP - query_str2 := 'SELECT * FROM gs_wlm_user_resource_info(''' || row_name.rolname || ''')'; - FOR row_data IN EXECUTE(query_str2) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_session_info_all AS -SELECT * FROM pg_stat_get_wlm_session_info(0); - -CREATE OR REPLACE FUNCTION pg_catalog.create_wlm_session_info(IN flag int) -RETURNS int -AS $$ -DECLARE - query_str text; - record_cnt int; - BEGIN - record_cnt := 0; - - query_str := 'SELECT * FROM pg_stat_get_wlm_session_info(1)'; - - IF flag > 0 THEN - EXECUTE 'INSERT INTO gs_wlm_session_query_info_all ' || query_str; - ELSE - EXECUTE query_str; - END IF; - - RETURN record_cnt; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_cgroup_info AS - SELECT - cgroup_name, - percent AS priority, - usage_percent AS usage_percent, - shares, - usage AS cpuacct, - cpuset, - relpath, - valid, - node_group - FROM pg_stat_get_cgroup_info(NULL); - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_user_info AS -SELECT - T.userid, - S.rolname AS username, - T.sysadmin, - T.rpoid, - R.respool_name AS respool, - T.parentid, - T.totalspace, - T.spacelimit, - T.childcount, - T.childlist -FROM pg_roles AS S, gs_wlm_get_user_info(NULL) AS T, pg_resource_pool AS R -WHERE S.oid = T.userid AND T.rpoid = R.oid; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_resource_pool AS -SELECT - T.respool_oid AS rpoid, - R.respool_name AS respool, - R.control_group AS control_group, - R.parentid AS parentid, - T.ref_count, - T.active_points, - T.running_count, - T.waiting_count, - T.iops_limits as io_limits, - T.io_priority -FROM gs_wlm_get_resource_pool_info(0) AS T, pg_resource_pool AS R -WHERE T.respool_oid = R.oid; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_rebuild_user_resource_pool AS - SELECT * FROM gs_wlm_rebuild_user_resource_pool(0); - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_workload_records AS - SELECT - P.node_name, - S.threadid AS thread_id, - S.threadpid AS processid, - P.start_time AS time_stamp, - U.rolname AS username, - P.memory, - P.actpts AS active_points, - P.maxpts AS max_points, - P.priority, - P.resource_pool, - S.current_status AS status, - S.current_cgroup AS control_group, - P.queue_type AS enqueue, - S.query, - P.node_group - FROM pg_stat_get_session_wlmstat(NULL) AS S, pg_authid U, - gs_wlm_get_workload_records(0) P - WHERE P.query_pid = S.threadpid AND - S.usesysid = U.oid; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_replication AS - SELECT - S.pid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - W.state, - W.sender_sent_location, - W.receiver_write_location, - W.receiver_flush_location, - W.receiver_replay_location, - W.sync_priority, - W.sync_state - FROM pg_stat_get_activity(NULL) AS S, pg_authid U, - pg_stat_get_wal_senders() AS W - WHERE S.usesysid = U.oid AND - S.pid = W.sender_pid; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_database AS - SELECT - D.oid AS datid, - D.datname AS datname, - pg_stat_get_db_numbackends(D.oid) AS numbackends, - pg_stat_get_db_xact_commit(D.oid) AS xact_commit, - pg_stat_get_db_xact_rollback(D.oid) AS xact_rollback, - pg_stat_get_db_blocks_fetched(D.oid) - - pg_stat_get_db_blocks_hit(D.oid) AS blks_read, - pg_stat_get_db_blocks_hit(D.oid) AS blks_hit, - pg_stat_get_db_tuples_returned(D.oid) AS tup_returned, - pg_stat_get_db_tuples_fetched(D.oid) AS tup_fetched, - pg_stat_get_db_tuples_inserted(D.oid) AS tup_inserted, - pg_stat_get_db_tuples_updated(D.oid) AS tup_updated, - pg_stat_get_db_tuples_deleted(D.oid) AS tup_deleted, - pg_stat_get_db_conflict_all(D.oid) AS conflicts, - pg_stat_get_db_temp_files(D.oid) AS temp_files, - pg_stat_get_db_temp_bytes(D.oid) AS temp_bytes, - pg_stat_get_db_deadlocks(D.oid) AS deadlocks, - pg_stat_get_db_blk_read_time(D.oid) AS blk_read_time, - pg_stat_get_db_blk_write_time(D.oid) AS blk_write_time, - pg_stat_get_db_stat_reset_time(D.oid) AS stats_reset - FROM pg_database D; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_database_conflicts AS - SELECT - D.oid AS datid, - D.datname AS datname, - pg_stat_get_db_conflict_tablespace(D.oid) AS confl_tablespace, - pg_stat_get_db_conflict_lock(D.oid) AS confl_lock, - pg_stat_get_db_conflict_snapshot(D.oid) AS confl_snapshot, - pg_stat_get_db_conflict_bufferpin(D.oid) AS confl_bufferpin, - pg_stat_get_db_conflict_startup_deadlock(D.oid) AS confl_deadlock - FROM pg_database D; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_user_functions AS - SELECT - P.oid AS funcid, - N.nspname AS schemaname, - P.proname AS funcname, - pg_stat_get_function_calls(P.oid) AS calls, - pg_stat_get_function_total_time(P.oid) AS total_time, - pg_stat_get_function_self_time(P.oid) AS self_time - FROM pg_proc P LEFT JOIN pg_namespace N ON (N.oid = P.pronamespace) - WHERE P.prolang != 12 -- fast check to eliminate built-in functions - AND pg_stat_get_function_calls(P.oid) IS NOT NULL; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_xact_user_functions AS - SELECT - P.oid AS funcid, - N.nspname AS schemaname, - P.proname AS funcname, - pg_stat_get_xact_function_calls(P.oid) AS calls, - pg_stat_get_xact_function_total_time(P.oid) AS total_time, - pg_stat_get_xact_function_self_time(P.oid) AS self_time - FROM pg_proc P LEFT JOIN pg_namespace N ON (N.oid = P.pronamespace) - WHERE P.prolang != 12 -- fast check to eliminate built-in functions - AND pg_stat_get_xact_function_calls(P.oid) IS NOT NULL; - -CREATE OR REPLACE VIEW pg_catalog.DV_SESSIONS AS - SELECT - sa.sessionid AS SID, - 0::integer AS SERIAL#, - sa.usesysid AS USER#, - ad.rolname AS USERNAME - FROM pg_stat_get_activity(NULL) AS sa - LEFT JOIN pg_authid ad ON(sa.usesysid = ad.oid) - WHERE sa.application_name <> 'JobScheduler'; - -CREATE OR REPLACE FUNCTION pg_catalog.pg_nodes_memmon(OUT InnerNName text, OUT InnerUsedMem int8, OUT InnerTopCtxt int8, OUT NName text, OUT UsedMem text, OUT SharedBufferCache text, OUT TopContext text) -RETURNS setof record -AS $$ -DECLARE - enable_threadpool bool; - row_data record; - row_data1 record; - row_name record; - query_str text; - query_str1 text; - shared_bcache text; - query_str_nodes text; - itr integer; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select ''''N_name'''' as nname1, sum(usedsize) as usedmem1 from pv_session_memory_detail where 1=1 '''; - query_str1 := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select contextname as contextname1, sum(usedsize) as usedsize1 from pv_session_memory_detail group by contextname order by usedsize1 desc limit 3 '''; - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.nname1 := CASE - WHEN LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-length(row_name.node_name)) - ELSE SUBSTR(row_name.node_name,1,20) - END; - - InnerNName := row_data.nname1; - NName := row_data.nname1; - InnerUsedMem := row_data.usedmem1; - UsedMem := pg_size_pretty(row_data.usedmem1); - - EXECUTE 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT pg_size_pretty(count(*) * 8192) || ''''(Utilization: '''' || pg_size_pretty((SELECT setting FROM pg_settings WHERE name =''''shared_buffers'''') * 8192) || ''''/'''' || round(count(*)/(SELECT setting FROM pg_settings WHERE name =''''shared_buffers''''),2)*100 || ''''%)'''' FROM pg_buffercache_pages() WHERE relfilenode IS NOT NULL ''' - INTO shared_bcache; - - SharedBufferCache := shared_bcache; - - itr := 1; - FOR row_data1 IN EXECUTE(query_str1) LOOP - --We should have 3 return rows - TopContext := row_data1.contextname1 || '(' || pg_size_pretty(row_data1.usedsize1) || ')'; - InnerTopCtxt := row_data1.usedsize1; - IF itr = 1 THEN - RETURN next; - ELSE - NName := ''; - UsedMem := ''; - SharedBufferCache := ''; - RETURN next; - END IF; - itr := itr + 1; - END LOOP; - END LOOP; - END LOOP; - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.distributed_count(IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - total_num bigint; - flag boolean; - special text := '[;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN _table_name, IN special; - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - RETURN; - END IF; - EXECUTE 'SELECT count(1) FROM ' || _table_name - INTO total_num; - - --Get the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node, pgxc_class where node_type IN (''C'', ''D'') AND is_oid_in_group_members(oid, nodeoids) AND - pcrelid=''' || _table_name || '''::regclass::oid'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select ''''DN_name'''' as dnname1, count(1) as count1 from ' || $1 || ''''; - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.dnname1 := CASE - WHEN LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-length(row_name.node_name)) - ELSE SUBSTR(row_name.node_name,1,20) - END; - DNName := row_data.dnname1; - Num := row_data.count1; - IF total_num = 0 THEN - Ratio := 0.000 ||'%'; - ELSE - Ratio := ROUND(row_data.count1/total_num*100,3) || '%'; - END IF; - RETURN next; - END LOOP; - END LOOP; - - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.login_audit_messages(in flag boolean) returns table (username text, database text, logintime timestamp with time zone, mytype text, result text, client_conninfo text) AUTHID DEFINER -AS $$ -DECLARE -user_id text; -user_name text; -db_name text; -SQL_STMT VARCHAR2(500); -fail_cursor REFCURSOR; -success_cursor REFCURSOR; -BEGIN - SELECT text(oid) FROM pg_authid WHERE rolname=SESSION_USER INTO user_id; - SELECT SESSION_USER INTO user_name; - SELECT CURRENT_DATABASE() INTO db_name; - IF flag = true THEN - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'') AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';'; - OPEN success_cursor FOR EXECUTE SQL_STMT; - --search bottom up for all the success login info - FETCH LAST FROM success_cursor into username, database, logintime, mytype, result, client_conninfo; - FETCH BACKWARD FROM success_cursor into username, database, logintime, mytype, result, client_conninfo; - IF FOUND THEN - return next; - END IF; - CLOSE success_cursor; - ELSE - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'', ''login_failed'') AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';'; - OPEN fail_cursor FOR EXECUTE SQL_STMT; - --search bottom up - FETCH LAST FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo; - LOOP - FETCH BACKWARD FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo; - EXIT WHEN NOT FOUND; - IF mytype = 'login_failed' THEN - return next; - ELSE - -- must be login_success - EXIT; - END IF; - END LOOP; - CLOSE fail_cursor; - END IF; -END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.login_audit_messages(in flag boolean) returns table (username text, database text, logintime timestamp with time zone, mytype text, result text, client_conninfo text) AUTHID DEFINER -AS $$ -DECLARE -user_id text; -user_name text; -db_name text; -SQL_STMT VARCHAR2(500); -fail_cursor REFCURSOR; -success_cursor REFCURSOR; -BEGIN - SELECT text(oid) FROM pg_authid WHERE rolname=SESSION_USER INTO user_id; - SELECT SESSION_USER INTO user_name; - SELECT CURRENT_DATABASE() INTO db_name; - IF flag = true THEN - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'') AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';'; - OPEN success_cursor FOR EXECUTE SQL_STMT; - --search bottom up for all the success login info - FETCH LAST FROM success_cursor into username, database, logintime, mytype, result, client_conninfo; - FETCH BACKWARD FROM success_cursor into username, database, logintime, mytype, result, client_conninfo; - IF FOUND THEN - return next; - END IF; - CLOSE success_cursor; - ELSE - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'', ''login_failed'') AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';'; - OPEN fail_cursor FOR EXECUTE SQL_STMT; - --search bottom up - FETCH LAST FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo; - LOOP - FETCH BACKWARD FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo; - EXIT WHEN NOT FOUND; - IF mytype = 'login_failed' THEN - return next; - ELSE - -- must be login_success - EXIT; - END IF; - END LOOP; - CLOSE fail_cursor; - END IF; -END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.login_audit_messages_pid(flag boolean) - RETURNS TABLE(username text, database text, logintime timestamp with time zone, mytype text, result text, client_conninfo text, backendid bigint) AUTHID DEFINER -AS $$ -DECLARE -user_id text; -user_name text; -db_name text; -SQL_STMT VARCHAR2(500); -fail_cursor REFCURSOR; -success_cursor REFCURSOR; -mybackendid bigint; -curSessionFound boolean; -BEGIN - SELECT text(oid) FROM pg_authid WHERE rolname=SESSION_USER INTO user_id; - SELECT SESSION_USER INTO user_name; - SELECT CURRENT_DATABASE() INTO db_name; - SELECT pg_backend_pid() INTO mybackendid; - curSessionFound = false; - IF flag = true THEN - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo, split_part(thread_id,''@'',1) backendid FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'') AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';'; - OPEN success_cursor FOR EXECUTE SQL_STMT; - --search bottom up for all the success login info - FETCH LAST FROM success_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - LOOP - IF backendid = mybackendid THEN - --found the login info for the current session - curSessionFound = true; - EXIT; - END IF; - FETCH BACKWARD FROM success_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - EXIT WHEN NOT FOUND; - END LOOP; - IF curSessionFound THEN - FETCH BACKWARD FROM success_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - IF FOUND THEN - return next; - END IF; - END IF; - ELSE - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo, split_part(thread_id,''@'',1) backendid FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'', ''login_failed'') AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';'; - OPEN fail_cursor FOR EXECUTE SQL_STMT; - --search bottom up - FETCH LAST FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - LOOP - IF backendid = mybackendid AND mytype = 'login_success' THEN - --found the login info for the current session - curSessionFound = true; - EXIT; - END IF; - FETCH BACKWARD FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - EXIT WHEN NOT FOUND; - END LOOP; - IF curSessionFound THEN - LOOP - FETCH BACKWARD FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo, backendid ; - EXIT WHEN NOT FOUND; - IF mytype = 'login_failed' THEN - return next; - ELSE - -- must be login_success - EXIT; - END IF; - END LOOP; - END IF; --curSessionFound - CLOSE fail_cursor; - END IF; -END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE VIEW pg_catalog.pg_thread_wait_status AS - SELECT * FROM pg_stat_get_status(NULL); - -create or replace function pg_catalog.pgxc_cgroup_map_ng_conf(IN ngname text) -returns bool -AS $$ -declare - host_info record; - query_str text; - query_string text; - flag boolean; - special text := '[^A-z0-9_]'; -begin - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN ngname, IN special; - IF flag = true THEN - return false; - ELSE - query_str = 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - for host_info in execute(query_str) loop - query_string := 'execute direct on (' || host_info.node_name || ') ''SELECT * from gs_cgroup_map_ng_conf(''''' || ngname || ''''')'''; - execute query_string; - end loop; - END IF; - return true; -end; -$$language plpgsql NOT FENCED; - -create or replace function pg_catalog.table_skewness(table_name text, column_name text, - OUT seqNum text, OUT Num text, OUT Ratio text, row_num text default '0') -RETURNS setof record -AS $$ -DECLARE - tolal_num text; - row_data record; - execute_query text; - BEGIN - if row_num = 0 then - EXECUTE 'select count(1) from ' || table_name into tolal_num; - execute_query = 'select seqNum, count(1) as num - from (select table_data_skewness(row(' || column_name ||'), ''H'') as seqNum from ' || table_name || - ') group by seqNum order by num DESC'; - else - tolal_num = row_num; - execute_query = 'select seqNum, count(1) as num - from (select table_data_skewness(row(' || column_name ||'), ''H'') as seqNum from ' || table_name || - ' limit ' || row_num ||') group by seqNum order by num DESC'; - end if; - - if tolal_num = 0 then - seqNum = 0; - Num = 0; - Ratio = ROUND(0, 3) || '%'; - return; - end if; - - for row_data in EXECUTE execute_query loop - seqNum = row_data.seqNum; - Num = row_data.num; - Ratio = ROUND(row_data.num / tolal_num * 100, 3) || '%'; - RETURN next; - end loop; - END; -$$LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE VIEW pg_catalog.pg_get_invalid_backends AS - SELECT - C.pid, - C.node_name, - S.datname AS dbname, - S.backend_start, - S.query - FROM pg_pool_validate(false, ' ') AS C LEFT JOIN pg_stat_activity AS S - ON (C.pid = S.sessionid); - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_operator_statistics AS -SELECT t.* -FROM pg_stat_activity AS s, pg_stat_get_wlm_realtime_operator_info(NULL) as t -where s.query_id = t.queryid; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_operator_history AS -SELECT * FROM pg_stat_get_wlm_operator_info(0); - -CREATE OR REPLACE FUNCTION pg_catalog.create_wlm_operator_info(IN flag int) -RETURNS int -AS $$ -DECLARE - query_ec_str text; - query_str text; - record_cnt int; - BEGIN - record_cnt := 0; - - query_ec_str := 'SELECT - queryid, - plan_node_id, - start_time, - duration, - tuple_processed, - min_peak_memory, - max_peak_memory, - average_peak_memory, - ec_status, - ec_execute_datanode, - ec_dsn, - ec_username, - ec_query, - ec_libodbc_type - FROM pg_stat_get_wlm_ec_operator_info(0) where ec_operator > 0'; - - query_str := 'SELECT * FROM pg_stat_get_wlm_operator_info(1)'; - - IF flag > 0 THEN - EXECUTE 'INSERT INTO gs_wlm_ec_operator_info ' || query_ec_str; - EXECUTE 'INSERT INTO gs_wlm_operator_info ' || query_str; - ELSE - EXECUTE query_ec_str; - EXECUTE query_str; - END IF; - - RETURN record_cnt; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_get_control_group_info() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT group_name,group_kind FROM pgxc_group WHERE group_kind = ''v'' OR group_kind = ''i'' '; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - IF row_name.group_kind = 'i' THEN - query_str := 'SELECT *,CAST(''' || row_name.group_name || ''' AS TEXT) AS nodegroup,CAST(''' || row_name.group_kind || ''' AS TEXT) AS group_kind FROM gs_all_nodegroup_control_group_info(''installation'')'; - ELSE - query_str := 'SELECT *,CAST(''' || row_name.group_name || ''' AS TEXT) AS nodegroup,CAST(''' || row_name.group_kind || ''' AS TEXT) AS group_kind FROM gs_all_nodegroup_control_group_info(''' ||row_name.group_name||''')'; - END IF; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_ec_operator_statistics AS -SELECT - t.queryid, - t.plan_node_id, - t.start_time, - t.ec_status, - t.ec_execute_datanode, - t.ec_dsn, - t.ec_username, - t.ec_query, - t.ec_libodbc_type, - t.ec_fetch_count -FROM pg_stat_activity AS s, pg_stat_get_wlm_realtime_ec_operator_info(NULL) as t -where s.query_id = t.queryid and t.ec_operator > 0; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_ec_operator_history AS -SELECT - queryid, - plan_node_id, - start_time, - duration, - tuple_processed, - min_peak_memory, - max_peak_memory, - average_peak_memory, - ec_status, - ec_execute_datanode, - ec_dsn, - ec_username, - ec_query, - ec_libodbc_type -FROM pg_stat_get_wlm_ec_operator_info(0) where ec_operator > 0; - -CREATE OR REPLACE FUNCTION pg_catalog.pg_get_delta_info(IN rel TEXT, IN schema_name TEXT, OUT part_name TEXT, OUT live_tuple INT8, OUT data_size INT8, OUT blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_info_str text; - query_str text; - query_part_str text; - query_select_str text; - query_size_str text; - row_info_data record; - row_data record; - row_part_info record; - BEGIN - query_info_str := 'SELECT C.oid,C.reldeltarelid,C.parttype FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE C.relname = '''|| rel ||''' and N.nspname = '''|| schema_name ||''''; - FOR row_info_data IN EXECUTE(query_info_str) LOOP - IF row_info_data.parttype = 'n' THEN - query_str := 'SELECT relname,oid from pg_class where oid= '||row_info_data.reldeltarelid||''; - EXECUTE(query_str) INTO row_data; - query_select_str := 'select count(*) from cstore.' || row_data.relname || ''; - EXECUTE (query_select_str) INTO live_tuple; - query_size_str := 'select * from pg_relation_size(' || row_data.oid || ')'; - EXECUTE (query_size_str) INTO data_size; - blockNum := data_size/8192; - part_name := 'non partition table'; - return next; - ELSE - query_part_str := 'SELECT relname,reldeltarelid from pg_partition where parentid = '||row_info_data.oid|| 'and relname <> '''||rel||''''; - FOR row_part_info IN EXECUTE(query_part_str) LOOP - query_str := 'SELECT relname,oid from pg_class where oid = '||row_part_info.reldeltarelid||''; - part_name := row_part_info.relname; - FOR row_data IN EXECUTE(query_str) LOOP - query_select_str := 'select count(*) from cstore.' || row_data.relname || ''; - EXECUTE (query_select_str) INTO live_tuple; - query_size_str := 'select * from pg_relation_size(' || row_data.oid || ')'; - EXECUTE (query_size_str) INTO data_size; - END LOOP; - blockNum := data_size/8192; - return next; - END LOOP; - END IF; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_delta_info(IN rel TEXT, OUT node_name TEXT, OUT part_name TEXT, OUT live_tuple INT8, OUT data_size INT8, OUT blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_str_nodes text; - query_str text; - query_part_str text; - rel_info record; - row_name record; - row_data record; - BEGIN - EXECUTE ('select c.relname,n.nspname from pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) where C.oid = (select '''|| rel ||'''::regclass::oid)') into rel_info; - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_get_delta_info('''''||rel_info.relname||''''','''''||rel_info.nspname||''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - live_tuple := row_data.live_tuple; - data_size := row_data.data_size; - blockNum := row_data.blockNum; - part_name := row_data.part_name; - return next; - END LOOP; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.get_delta_info(IN rel TEXT, OUT part_name TEXT, OUT total_live_tuple INT8, OUT total_data_size INT8, OUT max_blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_str text; - row_data record; - BEGIN - query_str := 'select part_name, sum(live_tuple) total_live_tuple, sum(data_size) total_data_size, max(blocknum) max_blocknum from (select * from pgxc_get_delta_info('''||rel||''')) group by part_name order by max_blocknum desc'; - FOR row_data IN EXECUTE(query_str) LOOP - part_name := row_data.part_name; - total_live_tuple := row_data.total_live_tuple; - total_data_size := row_data.total_data_size; - max_blockNum := row_data.max_blocknum; - return next; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -DROP FUNCTION pg_catalog.pgxc_query_audit; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_query_audit(IN starttime TIMESTAMPTZ, IN endtime TIMESTAMPTZ, OUT "time" TIMESTAMPTZ, OUT "type" text, OUT "result" text, OUT userid text, OUT username text, OUT database text, OUT client_conninfo text, OUT "object_name" text, OUT detail_info text, OUT node_name text, OUT thread_id text, OUT local_port text, OUT remote_port text) -RETURNS setof record -AS $$ -DECLARE - row_name record; - row_data record; - query_str text; - query_str_nodes text; - BEGIN - --Get the node names of all CNs - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_query_audit(''''' || starttime || ''''',''''' || endtime || ''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - "time" := row_data."time"; - "type" := row_data."type"; - "result" := row_data."result"; - userid := row_data.userid; - username := row_data.username; - database := row_data.database; - client_conninfo := row_data.client_conninfo; - "object_name" := row_data."object_name"; - detail_info := row_data.detail_info; - node_name := row_data.node_name; - thread_id := row_data.thread_id; - local_port := row_data.local_port; - remote_port := row_data.remote_port; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.is_oid_in_group_members(IN node_oid Oid, IN group_members oidvector_extend) -RETURNS BOOLEAN AS $$ -DECLARE -query_str text; -match_count int; -node_list text; -BEGIN - match_count := 0; - select array_to_string($2, ',') into node_list; - - query_str := 'SELECT count(1) FROM pgxc_node n WHERE n.oid = ' || node_oid || ' AND n.node_name IN (SELECT n1.node_name FROM pgxc_node n1 WHERE n1.oid in (' || node_list || '))'; - EXECUTE query_str into match_count; - - IF match_count = 1 THEN - RETURN true; - END IF; - RETURN false; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.lock_cluster_ddl() -RETURNS boolean -AS $$ -DECLARE - databse_name record; - lock_str text; - query_database_oid text; - lock_result boolean = false; - return_result bool = true; - BEGIN - query_database_oid := 'SELECT datname FROM pg_database WHERE datallowconn = true order by datname'; - for databse_name in EXECUTE(query_database_oid) LOOP - lock_str = format('SELECT * FROM pgxc_lock_for_sp_database(''%s'')', databse_name.datname); - begin - EXECUTE(lock_str) into lock_result; - if lock_result = 'f' then - return_result = false; - return return_result; - end if; - end; - end loop; - return return_result; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.unlock_cluster_ddl() -RETURNS bool -AS $$ -DECLARE - databse_name record; - unlock_str text; - query_database_oid text; - unlock_result boolean = false; - return_result bool = true; - BEGIN - query_database_oid := 'SELECT datname FROM pg_database WHERE datallowconn = true order by datname'; - for databse_name in EXECUTE(query_database_oid) LOOP - unlock_str = format('SELECT * FROM pgxc_unlock_for_sp_database(''%s'')', databse_name.datname); - begin - EXECUTE(unlock_str) into unlock_result; - if unlock_result = 'f' then - return_result = false; - return return_result; - end if; - end; - end loop; - return return_result; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_stat_dirty_tables(in dirty_percent int4, in n_tuples int4, out relid oid, out relname name, out schemaname name, out n_tup_ins int8, out n_tup_upd int8, out n_tup_del int8, out n_live_tup int8, out n_dead_tup int8, out dirty_page_rate numeric(5,2)) -RETURNS setof record -AS $$ -DECLARE - query_str text; - row_data record; - BEGIN - query_str := 'SELECT oid relid, s.relname,s.schemaname,s.n_tup_ins,s.n_tup_upd,s.n_tup_del,s.n_live_tup,s.n_dead_tup,s.dirty_page_rate - FROM pg_class p, - (SELECT relname, schemaname, SUM(n_tup_ins) n_tup_ins, SUM(n_tup_upd) n_tup_upd, SUM(n_tup_del) n_tup_del, SUM(n_live_tup) n_live_tup, SUM(n_dead_tup) n_dead_tup, CAST((SUM(n_dead_tup) / SUM(n_dead_tup + n_live_tup + 0.00001) * 100) - AS NUMERIC(5,2)) dirty_page_rate FROM pgxc_stat_dirty_tables('||dirty_percent||','||n_tuples||') GROUP BY (relname,schemaname)) s - WHERE p.relname = s.relname AND p.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = s.schemaname) ORDER BY dirty_page_rate DESC'; - FOR row_data IN EXECUTE(query_str) LOOP - relid = row_data.relid; - relname = row_data.relname; - schemaname = row_data.schemaname; - n_tup_ins = row_data.n_tup_ins; - n_tup_upd = row_data.n_tup_upd; - n_tup_del = row_data.n_tup_del; - n_live_tup = row_data.n_live_tup; - n_dead_tup = row_data.n_dead_tup; - dirty_page_rate = row_data.dirty_page_rate; - return next; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_stat_dirty_tables(in dirty_percent int4, in n_tuples int4,in schema text, out relid oid, out relname name, out schemaname name, out n_tup_ins int8, out n_tup_upd int8, out n_tup_del int8, out n_live_tup int8, out n_dead_tup int8, out dirty_page_rate numeric(5,2)) -RETURNS setof record -AS $$ -DECLARE - query_str text; - row_data record; - BEGIN - query_str := 'SELECT oid relid, s.relname,s.schemaname,s.n_tup_ins,s.n_tup_upd,s.n_tup_del,s.n_live_tup,s.n_dead_tup,s.dirty_page_rate - FROM pg_class p, - (SELECT relname, schemaname, SUM(n_tup_ins) n_tup_ins, SUM(n_tup_upd) n_tup_upd, SUM(n_tup_del) n_tup_del, SUM(n_live_tup) n_live_tup, SUM(n_dead_tup) n_dead_tup, CAST((SUM(n_dead_tup) / SUM(n_dead_tup + n_live_tup + 0.00001) * 100) - AS NUMERIC(5,2)) dirty_page_rate FROM pgxc_stat_dirty_tables('||dirty_percent||','||n_tuples||','''||schema||''') GROUP BY (relname,schemaname)) s - WHERE p.relname = s.relname AND p.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = s.schemaname) ORDER BY dirty_page_rate DESC'; - FOR row_data IN EXECUTE(query_str) LOOP - relid = row_data.relid; - relname = row_data.relname; - schemaname = row_data.schemaname; - n_tup_ins = row_data.n_tup_ins; - n_tup_upd = row_data.n_tup_upd; - n_tup_del = row_data.n_tup_del; - n_live_tup = row_data.n_live_tup; - n_dead_tup = row_data.n_dead_tup; - dirty_page_rate = row_data.dirty_page_rate; - return next; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_activity_ng AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.sessionid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query, - N.node_group - FROM pg_database D, pg_stat_get_activity(NULL) AS S, pg_stat_get_activity_ng(NULL) AS N, pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid AND - S.pid = T.threadid AND - S.sessionid = N.sessionid AND - S.pid = N.pid; - -drop function if exists pg_catalog.login_audit_messages(boolean); -drop function if exists pg_catalog.login_audit_messages_pid(boolean); - -CREATE OR REPLACE FUNCTION pg_catalog.login_audit_messages(in flag boolean) returns table (username text, database text, logintime timestamp with time zone, mytype text, result text, client_conninfo text) AUTHID DEFINER -AS $$ -DECLARE -user_id text; -user_name text; -db_name text; -SQL_STMT VARCHAR2(500); -fail_cursor REFCURSOR; -success_cursor REFCURSOR; -BEGIN - SELECT text(oid) FROM pg_authid WHERE rolname=SESSION_USER INTO user_id; - SELECT SESSION_USER INTO user_name; - SELECT CURRENT_DATABASE() INTO db_name; - IF flag = true THEN - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'') AND client_conninfo not LIKE ''gs_clean_%'' AND client_conninfo not LIKE ''pgxc_%'' AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';'; - OPEN success_cursor FOR EXECUTE SQL_STMT; - --search bottom up for all the success login info - FETCH LAST FROM success_cursor into username, database, logintime, mytype, result, client_conninfo; - FETCH BACKWARD FROM success_cursor into username, database, logintime, mytype, result, client_conninfo; - IF FOUND THEN - return next; - END IF; - CLOSE success_cursor; - ELSE - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'', ''login_failed'') AND client_conninfo not LIKE ''gs_clean_%'' AND client_conninfo not LIKE ''pgxc_%'' AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';'; - OPEN fail_cursor FOR EXECUTE SQL_STMT; - --search bottom up - FETCH LAST FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo; - LOOP - FETCH BACKWARD FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo; - EXIT WHEN NOT FOUND; - IF mytype = 'login_failed' THEN - return next; - ELSE - -- must be login_success - EXIT; - END IF; - END LOOP; - CLOSE fail_cursor; - END IF; -END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.login_audit_messages_pid(flag boolean) - RETURNS TABLE(username text, database text, logintime timestamp with time zone, mytype text, result text, client_conninfo text, backendid bigint) AUTHID DEFINER -AS $$ -DECLARE -user_id text; -user_name text; -db_name text; -SQL_STMT VARCHAR2(500); -fail_cursor REFCURSOR; -success_cursor REFCURSOR; -mybackendid bigint; -curSessionFound boolean; -BEGIN - SELECT text(oid) FROM pg_authid WHERE rolname=SESSION_USER INTO user_id; - SELECT SESSION_USER INTO user_name; - SELECT CURRENT_DATABASE() INTO db_name; - SELECT pg_backend_pid() INTO mybackendid; - curSessionFound = false; - IF flag = true THEN - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo, split_part(thread_id,''@'',1) backendid FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'') AND client_conninfo not LIKE ''gs_clean_%'' AND client_conninfo not LIKE ''pgxc_%'' AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';'; - OPEN success_cursor FOR EXECUTE SQL_STMT; - --search bottom up for all the success login info - FETCH LAST FROM success_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - LOOP - IF backendid = mybackendid THEN - --found the login info for the current session - curSessionFound = true; - EXIT; - END IF; - FETCH BACKWARD FROM success_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - EXIT WHEN NOT FOUND; - END LOOP; - IF curSessionFound THEN - FETCH BACKWARD FROM success_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - IF FOUND THEN - return next; - END IF; - END IF; - ELSE - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo, split_part(thread_id,''@'',1) backendid FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'', ''login_failed'') AND client_conninfo not LIKE ''gs_clean_%'' AND client_conninfo not LIKE ''pgxc_%'' AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';'; - OPEN fail_cursor FOR EXECUTE SQL_STMT; - --search bottom up - FETCH LAST FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - LOOP - IF backendid = mybackendid AND mytype = 'login_success' THEN - --found the login info for the current session - curSessionFound = true; - EXIT; - END IF; - FETCH BACKWARD FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - EXIT WHEN NOT FOUND; - END LOOP; - IF curSessionFound THEN - LOOP - FETCH BACKWARD FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo, backendid ; - EXIT WHEN NOT FOUND; - IF mytype = 'login_failed' THEN - return next; - ELSE - -- must be login_success - EXIT; - END IF; - END LOOP; - END IF; --curSessionFound - CLOSE fail_cursor; - END IF; -END; $$ -LANGUAGE plpgsql NOT FENCED; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS DBE_PERF.get_global_pg_asp - (in start_ts timestamp without time zone, - in end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_datanode_active_session_hist - (in datanode text, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_datanode_active_session_hist - (in datanode text, - in start_ts timestamp without time zone, - in end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) cascade; - CREATE OR REPLACE FUNCTION DBE_PERF.get_datanode_active_session_hist - (in datanode text, - in start_ts timestamp without time zone, - in end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA pg_catalog.gs_asp%ROWTYPE; - cn_name record; - query_text record; - QUERY_STR text; - query_cn text; - query_str_cn_name text; - node_str text; - BEGIN - --Get all the node names - node_str := 'SELECT * FROM pg_catalog.gs_asp where sample_time > '''''||$2||''''' and sample_time < '''''||$3||''''; - QUERY_STR := 'EXECUTE DIRECT ON (' || $1 || ') '''|| node_str ||''''';'; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := datanode; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - IF ROW_DATA.cn_id IS NULL THEN - unique_query := ROW_DATA.unique_query; - ELSE - query_str_cn_name := 'SELECT node_name FROM pgxc_node WHERE node_id='||ROW_DATA.cn_id||' AND nodeis_active = true'; - FOR cn_name IN EXECUTE(query_str_cn_name) LOOP - query_cn := 'EXECUTE DIRECT ON (' || cn_name.node_name || ') ''SELECT unique_query FROM pg_catalog.gs_asp where unique_query_id = '|| ROW_DATA.unique_query_id||' limit 1'''; - FOR query_text IN EXECUTE(query_cn) LOOP - unique_query := query_text.unique_query; - END LOOP; - END LOOP; - END IF; - RETURN NEXT; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - end if; -END$DO$; - -DROP FUNCTION IF EXISTS pg_catalog.gs_stat_activity_timeout() cascade; -DROP FUNCTION IF EXISTS pg_catalog.global_stat_activity_timeout() cascade; - -DO $DO$ -DECLARE - ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS dbe_perf.gs_stat_activity_timeout() cascade; - DROP FUNCTION IF EXISTS dbe_perf.global_stat_activity_timeout() cascade; - end if; -END $DO$; -drop function if exists pg_catalog.login_audit_messages; -drop function if exists pg_catalog.login_audit_messages_pid; -drop function if exists pg_catalog.pg_query_audit(timestamptz, timestamptz) cascade; -drop function if exists pg_catalog.pg_query_audit(timestamptz, timestamptz, text) cascade; -drop function if exists pg_catalog.pgxc_query_audit(timestamptz, timestamptz) cascade; - -SET LOCAL inplace_upgrade_next_system_object_oids=IUO_PROC, 3780; -create function pg_catalog.pg_query_audit(TIMESTAMPTZ, TIMESTAMPTZ, OUT "time" TIMESTAMPTZ, OUT type TEXT, OUT result TEXT, OUT username TEXT, OUT database TEXT, OUT client_conninfo TEXT, OUT object_name TEXT, OUT detail_info TEXT, OUT node_name TEXT, OUT thread_id TEXT, OUT local_port TEXT, OUT remote_port TEXT) RETURNS SETOF RECORD LANGUAGE INTERNAL STABLE ROWS 100 STRICT as 'pg_query_audit'; - -SET LOCAL inplace_upgrade_next_system_object_oids=IUO_PROC, 3782; -create function pg_catalog.pg_query_audit(TIMESTAMPTZ, TIMESTAMPTZ, TEXT, OUT "time" TIMESTAMPTZ, OUT type TEXT, OUT result TEXT, OUT username TEXT, OUT database TEXT, OUT client_conninfo TEXT, OUT object_name TEXT, OUT detail_info TEXT, OUT node_name TEXT, OUT thread_id TEXT, OUT local_port TEXT, OUT remote_port TEXT) RETURNS SETOF RECORD LANGUAGE INTERNAL STABLE ROWS 100 STRICT as 'pg_query_audit'; - -CREATE OR REPLACE FUNCTION pg_catalog.login_audit_messages(in flag boolean) returns table (username text, database text, logintime timestamp with time zone, mytype text, result text, client_conninfo text) AUTHID DEFINER -AS $$ -DECLARE -user_name text; -db_name text; -SQL_STMT VARCHAR2(500); -fail_cursor REFCURSOR; -success_cursor REFCURSOR; -BEGIN - SELECT SESSION_USER INTO user_name; - SELECT CURRENT_DATABASE() INTO db_name; - IF flag = true THEN - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'') AND client_conninfo not LIKE ''gs_clean_%'' AND client_conninfo not LIKE ''pgxc_%'' AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ';'; - OPEN success_cursor FOR EXECUTE SQL_STMT; - --search bottom up for all the success login info - FETCH LAST FROM success_cursor into username, database, logintime, mytype, result, client_conninfo; - FETCH BACKWARD FROM success_cursor into username, database, logintime, mytype, result, client_conninfo; - IF FOUND THEN - return next; - END IF; - CLOSE success_cursor; - ELSE - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'', ''login_failed'') AND client_conninfo not LIKE ''gs_clean_%'' AND client_conninfo not LIKE ''pgxc_%'' AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ';'; - OPEN fail_cursor FOR EXECUTE SQL_STMT; - --search bottom up - FETCH LAST FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo; - LOOP - FETCH BACKWARD FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo; - EXIT WHEN NOT FOUND; - IF mytype = 'login_failed' THEN - return next; - ELSE - -- must be login_success - EXIT; - END IF; - END LOOP; - CLOSE fail_cursor; - END IF; -END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.login_audit_messages_pid(flag boolean) - RETURNS TABLE(username text, database text, logintime timestamp with time zone, mytype text, result text, client_conninfo text, backendid bigint) AUTHID DEFINER -AS $$ -DECLARE -user_name text; -db_name text; -SQL_STMT VARCHAR2(500); -fail_cursor REFCURSOR; -success_cursor REFCURSOR; -mybackendid bigint; -curSessionFound boolean; -BEGIN - SELECT SESSION_USER INTO user_name; - SELECT CURRENT_DATABASE() INTO db_name; - SELECT pg_backend_pid() INTO mybackendid; - curSessionFound = false; - IF flag = true THEN - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo, split_part(thread_id,''@'',1) backendid FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'') AND client_conninfo not LIKE ''gs_clean_%'' AND client_conninfo not LIKE ''pgxc_%'' AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ';'; - OPEN success_cursor FOR EXECUTE SQL_STMT; - --search bottom up for all the success login info - FETCH LAST FROM success_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - LOOP - IF backendid = mybackendid THEN - --found the login info for the current session - curSessionFound = true; - EXIT; - END IF; - FETCH BACKWARD FROM success_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - EXIT WHEN NOT FOUND; - END LOOP; - IF curSessionFound THEN - FETCH BACKWARD FROM success_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - IF FOUND THEN - return next; - END IF; - END IF; - ELSE - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo, split_part(thread_id,''@'',1) backendid FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'', ''login_failed'') AND client_conninfo not LIKE ''gs_clean_%'' AND client_conninfo not LIKE ''pgxc_%'' AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ';'; - OPEN fail_cursor FOR EXECUTE SQL_STMT; - --search bottom up - FETCH LAST FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - LOOP - IF backendid = mybackendid AND mytype = 'login_success' THEN - --found the login info for the current session - curSessionFound = true; - EXIT; - END IF; - FETCH BACKWARD FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - EXIT WHEN NOT FOUND; - END LOOP; - IF curSessionFound THEN - LOOP - FETCH BACKWARD FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo, backendid ; - EXIT WHEN NOT FOUND; - IF mytype = 'login_failed' THEN - return next; - ELSE - -- must be login_success - EXIT; - END IF; - END LOOP; - END IF; --curSessionFound - CLOSE fail_cursor; - END IF; -END; $$ -LANGUAGE plpgsql NOT FENCED; - ---get audit log from all CNs -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_query_audit(IN starttime TIMESTAMPTZ, IN endtime TIMESTAMPTZ, OUT "time" TIMESTAMPTZ, OUT "type" text, OUT "result" text, OUT username text, OUT database text, OUT client_conninfo text, OUT "object_name" text, OUT detail_info text, OUT node_name text, OUT thread_id text, OUT local_port text, OUT remote_port text) -RETURNS setof record -AS $$ -DECLARE - row_name record; - row_data record; - query_str text; - query_str_nodes text; - BEGIN - --Get the node names of all CNs - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_query_audit(''''' || starttime || ''''',''''' || endtime || ''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - "time" := row_data."time"; - "type" := row_data."type"; - "result" := row_data."result"; - username := row_data.username; - database := row_data.database; - client_conninfo := row_data.client_conninfo; - "object_name" := row_data."object_name"; - detail_info := row_data.detail_info; - node_name := row_data.node_name; - thread_id := row_data.thread_id; - local_port := row_data.local_port; - remote_port := row_data.remote_port; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_activity AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.sessionid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query, - S.connection_info - FROM pg_database D, pg_stat_get_activity_with_conninfo(NULL) AS S, pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid AND - S.pid = T.threadid; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_activity_ng AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.sessionid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query, - N.node_group - FROM pg_database D, pg_stat_get_activity(NULL) AS S, pg_stat_get_activity_ng(NULL) AS N, pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid AND - S.pid = T.threadid AND - S.sessionid = N.sessionid AND - S.pid = N.pid; - -CREATE OR REPLACE VIEW pg_catalog.pg_session_wlmstat AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.threadid, - S.sessionid, - S.threadpid AS processid, - S.usesysid, - S.appname, - U.rolname AS usename, - S.priority, - S.attribute, - S.block_time, - S.elapsed_time, - S.total_cpu_time, - S.skew_percent AS cpu_skew_percent, - S.statement_mem, - S.active_points, - S.dop_value, - S.current_cgroup AS control_group, - S.current_status AS status, - S.enqueue_state AS enqueue, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query, - S.is_plana, - S.node_group - FROM pg_database D, pg_stat_get_session_wlmstat(NULL) AS S, pg_authid AS U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid AND - T.threadid = S.threadid; - -DO $DO$ -DECLARE - ans boolean; - user_name text; - query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - drop view if exists dbe_perf.wlm_user_resource_runtime cascade; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_wlm_user_resource_runtime - (OUT userid oid, OUT used_memory integer, OUT total_memory integer, - OUT used_cpu integer, OUT total_cpu integer, OUT used_space bigint, - OUT total_space bigint, OUT used_temp_space bigint, OUT total_temp_space bigint, - OUT used_spill_space bigint, OUT total_spill_space bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str2 text; - BEGIN - query_str := 'SELECT rolname FROM pg_authid'; - FOR row_name IN EXECUTE(query_str) LOOP - query_str2 := 'SELECT * FROM gs_wlm_user_resource_info(''' || row_name.rolname || ''')'; - FOR row_data IN EXECUTE(query_str2) LOOP - userid = row_data.userid; - used_memory = row_data.used_memory; - total_memory = row_data.total_memory; - used_cpu = row_data.used_cpu; - total_cpu = row_data.total_cpu; - used_space = row_data.used_space; - total_space = row_data.total_space; - used_temp_space = row_data.used_temp_space; - total_temp_space = row_data.total_temp_space; - used_spill_space = row_data.used_spill_space; - total_spill_space = row_data.total_spill_space; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE VIEW DBE_PERF.wlm_user_resource_runtime AS - SELECT - S.usename AS username, - T.used_memory, - T.total_memory, - T.used_cpu, - T.total_cpu, - T.used_space, - T.total_space, - T.used_temp_space, - T.total_temp_space, - T.used_spill_space, - T.total_spill_space - FROM pg_user AS S join (select * from DBE_PERF.get_wlm_user_resource_runtime()) AS T - on S.usesysid = T.userid; - - select session_user into user_name; - query_str := 'GRANT ALL ON TABLE DBE_PERF.wlm_user_resource_runtime TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - GRANT SELECT ON DBE_PERF.wlm_user_resource_runtime TO PUBLIC; - end if; -END$DO$; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select relname from pg_class where relname='gs_asp_sample_time_index' limit 1) into ans; - if ans = true then - DROP INDEX IF EXISTS pg_catalog.gs_asp_sample_time_index; - end if; -END$$; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select relname from pg_class where relname='gs_asp' limit 1) into ans; - if ans = true then - SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 0, 0, 0, 2998; - CREATE UNIQUE INDEX gs_asp_sample_time_index ON pg_catalog.gs_asp USING BTREE(sample_time timestamptz_ops); - SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 0, 0, 0, 0; - end if; -END$$; - -CREATE OR REPLACE FUNCTION pg_catalog.remove_create_partition_policy( - IN relationname name, - IN username name = NULL -) -RETURNS integer -AS -$$ -DECLARE - sql text; - check_count int; - job_id int; - current_username name; - is_admin bool = false; - user_logic_flag bool = true; - database name; - namespace name; - table_name name; - pos integer; -BEGIN - /* check tsdb_enable */ - IF check_engine_enable() = false - THEN - RAISE EXCEPTION 'tsdb engine is not exist'; - END IF; - /* check tsdb_enable end */ - - /* check parameter */ - IF relationname is null THEN - RAISE EXCEPTION 'parameter ''relationname'' cannot be null'; - END IF; - pos = is_contain_namespace(relationname); - IF pos != 0 THEN - namespace = substring(relationname from 1 for pos -1); - table_name = substring(relationname from pos+1 for char_length(relationname) - pos); - END IF; - /* check parameter end */ - - /* check user or admin */ - sql := 'select current_user'; - EXECUTE(sql) into current_username; - is_admin = is_super_user_or_sysadm(current_username); - - IF is_admin is false AND username is not null AND lower(current_username) != lower(username) THEN - RAISE EXCEPTION 'user is not allowed to set the second parameter ''username'' unless their owned name'; - END IF; - - IF is_admin is true AND username is not null THEN - user_logic_flag = false; - sql := 'select count(*) from pg_user where usename = lower(''' || username || ''');'; - EXECUTE sql into check_count; - IF check_count = 0 THEN - RAISE EXCEPTION 'please input the correct username!'; - END IF; - END IF; - /* check user or admin end */ - - /* check table exist */ - IF user_logic_flag is true THEN - IF pos = 0 THEN - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname =''' || relationname || ''' - AND pg_catalog.pg_table_is_visible(c.oid);'; - ELSE - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname =''' || table_name || ''' - AND n.nspname = ''' || namespace || ''';'; - END IF; - ELSE - IF pos = 0 THEN - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname =''' || relationname || ''' - AND pg_catalog.pg_get_userbyid(c.relowner) = ''' || username || ''';'; - ELSE - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname =''' || table_name || ''' - AND n.nspname = ''' || namespace || ''' AND pg_catalog.pg_get_userbyid(c.relowner) = ''' || username || ''';'; - END IF; - END IF; - EXECUTE sql into check_count; - IF check_count = 0 THEN - RAISE EXCEPTION 'please input the correct relation name!'; - END IF; - /* check table exist end */ - - /* check table owner privilege */ - IF user_logic_flag is true THEN - IF pos = 0 THEN - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = - ''' || relationname || ''' AND pg_catalog.pg_table_is_visible(c.oid) and pg_catalog.pg_get_userbyid(c.relowner) = ''' || current_username || ''';'; - ELSE - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = - ''' || table_name || ''' AND n.nspname = ''' || namespace || ''' and pg_catalog.pg_get_userbyid(c.relowner) = ''' || current_username || ''';'; - END IF; - EXECUTE sql into check_count; - IF check_count = 0 THEN - RAISE EXCEPTION 'permission denied for relation %', relationname - USING HINT = 'please assure you have the privilege'; - END IF; - END IF; - /* check table owner privilege end */ - - /* check add partition policy exists */ - sql = 'select current_database();'; - EXECUTE sql INTO database; - IF user_logic_flag is true THEN - sql := 'select count(*) from pg_job a, pg_job_proc b where b.what like ''%proc_add_partition(''''' || relationname || '''''%'' - and a.job_id = b.job_id and a.priv_user='''|| current_username ||''' and dbname = ''' || database || ''';'; - ELSE - sql = 'select count(*) from pg_job a, pg_job_proc b where b.what like ''%proc_add_partition(''''' || relationname || '''''%'' - and a.job_id = b.job_id and a.priv_user='''|| username ||''' and dbname = ''' || database || ''';'; - END IF; - - EXECUTE sql into check_count; - IF check_count = 0 THEN - RAISE EXCEPTION ' % does not have create policy!',relationname; - END IF; - /* check add partition policy exists end */ - - IF user_logic_flag is true THEN - sql := 'select a.job_id from pg_job a, pg_job_proc b where b.what like ''%proc_add_partition(''''' || relationname || '''''%'' - and a.job_id = b.job_id and a.priv_user='''|| current_username ||''' and dbname = ''' || database || ''';'; - ELSE - sql = 'select a.job_id from pg_job a, pg_job_proc b where b.what like ''%proc_add_partition(''''' || relationname || '''''%'' - and a.job_id = b.job_id and a.priv_user='''|| username ||''' and dbname = ''' || database || ''';'; - END IF; - EXECUTE sql into job_id; - sql := 'SELECT remove_job_class_depend(' || job_id || ')'; - EXECUTE sql; - sql := 'SELECT DBE_TASK.cancel('||job_id||')'; - EXECUTE(sql); - - RETURN job_id; -END; -$$ -LANGUAGE plpgsql; - -CREATE OR REPLACE FUNCTION is_super_user_or_sysadm( - IN i_user name -) -RETURNS bool -AS -$$ -BEGIN - IF ( - select count(*) from pg_roles where rolname = i_user and (rolsystemadmin=true or rolsuper=true) - ) < 1 - THEN - RETURN FALSE; - ELSE - RETURN TRUE; - END IF; -END; -$$ -LANGUAGE plpgsql; - -CREATE OR REPLACE FUNCTION pg_catalog.remove_drop_partition_policy( - IN relationname name, - IN username name=null -) -RETURNS integer -AS -$$ -DECLARE - sql text; - check_count int; - job_id int; - table_oid int; - current_username name; - is_admin bool = false; - user_logic_flag bool = true; - database name; - namespace name; - table_name name; - pos integer; -BEGIN - /* check tsdb_enable */ - IF check_engine_enable() = false - THEN - RAISE EXCEPTION 'tsdb engine is not exist'; - END IF; - /* check tsdb_enable end */ - - /* check parameter */ - IF relationname is null THEN - RAISE EXCEPTION 'parameter ''relationname'' cannot be null'; - END IF; - pos = is_contain_namespace(relationname); - IF pos != 0 THEN - namespace = substring(relationname from 1 for pos -1); - table_name = substring(relationname from pos+1 for char_length(relationname) - pos); - END IF; - /* check parameter end */ - - /* check user or admin */ - sql := 'select current_user'; - EXECUTE(sql) into current_username; - is_admin = is_super_user_or_sysadm(current_username); - - IF is_admin is false AND username is not null AND lower(current_username) != lower(username) THEN - RAISE EXCEPTION 'user is not allowed to set the second parameter ''username'' unless their owned name'; - END IF; - - IF is_admin is true AND username is not null THEN - user_logic_flag = false; - sql := 'select count(*) from pg_user where usename = lower(''' || username || ''');'; - EXECUTE sql into check_count; - IF check_count = 0 THEN - RAISE EXCEPTION 'please input the correct username!'; - END IF; - END IF; - /* check user or admin end */ - - /* check table exist */ - IF user_logic_flag is true THEN - IF pos = 0 THEN - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname =''' || relationname || ''' - AND pg_catalog.pg_table_is_visible(c.oid);'; - ELSE - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname =''' || table_name || ''' - AND n.nspname = ''' || namespace || ''';'; - END IF; - ELSE - IF pos = 0 THEN - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname =''' || relationname || ''' - AND pg_catalog.pg_get_userbyid(c.relowner) = ''' || username || ''';'; - ELSE - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname =''' || table_name || ''' - AND n.nspname = ''' || namespace || ''' AND pg_catalog.pg_get_userbyid(c.relowner) = ''' || username || ''';'; - - END IF; - END IF; - EXECUTE sql into check_count; - IF check_count = 0 THEN - RAISE EXCEPTION 'please input the correct relation name!'; - END IF; - /* check table exist end */ - - /* check table owner privilege */ - IF user_logic_flag is true THEN - IF pos = 0 THEN - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = - ''' || relationname || ''' AND pg_catalog.pg_table_is_visible(c.oid) and pg_catalog.pg_get_userbyid(c.relowner) = ''' || current_username || ''';'; - ELSE - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = - ''' || table_name || ''' AND n.nspname = ''' || namespace || ''' and pg_catalog.pg_get_userbyid(c.relowner) = ''' || current_username || ''';'; - END IF; - EXECUTE sql into check_count; - IF check_count = 0 THEN - RAISE EXCEPTION 'permission denied for relation %', relationname - USING HINT = 'please assure you have the privilege'; - END IF; - END IF; - /* check table owner privilege end */ - - sql = 'select current_database();'; - EXECUTE sql INTO database; - IF user_logic_flag is true THEN - sql := 'select count(*) from pg_job a, pg_job_proc b where b.what like ''%proc_drop_partition(''''' || relationname || '''''%'' - and a.job_id = b.job_id and a.priv_user='''|| current_username ||''' and dbname = ''' || database || ''';'; - ELSE - sql = 'select count(*) from pg_job a, pg_job_proc b where b.what like ''%proc_drop_partition(''''' || relationname || '''''%'' - and a.job_id = b.job_id and a.priv_user='''|| username ||''' and dbname = ''' || database || ''';'; - END IF; - - EXECUTE sql into check_count; - IF check_count = 0 THEN - RAISE EXCEPTION ' % does not have drop policy!',relationname; - END IF; - - IF user_logic_flag is true THEN - sql = 'select a.job_id from pg_job a, pg_job_proc b where b.what like ''%proc_drop_partition(''''' || relationname || '''''%'' - and a.job_id = b.job_id and a.priv_user='''|| current_username ||''' and dbname = ''' || database || ''';'; - ELSE - sql = 'select a.job_id from pg_job a, pg_job_proc b where b.what like ''%proc_drop_partition(''''' || relationname || '''''%'' - and a.job_id = b.job_id and a.priv_user='''|| username ||''' and dbname = ''' || database || ''';'; - END IF; - EXECUTE sql into job_id; - sql := 'SELECT remove_job_class_depend(' || job_id || ')'; - EXECUTE sql; - sql := 'SELECT DBE_TASK.cancel('||job_id||')'; - EXECUTE(sql); - - RETURN job_id ; -END; -$$ -LANGUAGE plpgsql; - -DO $$ -DECLARE - ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS dbe_perf.gs_stat_activity_timeout() cascade; - DROP FUNCTION IF EXISTS dbe_perf.global_stat_activity_timeout() cascade; - end if; -END$$; - -DROP EXTENSION IF EXISTS security_plugin CASCADE; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select relname from pg_class where relname='pg_asp' limit 1) into ans; - if ans = true then - DROP INDEX IF EXISTS pg_catalog.pg_asp_oid_index; - DROP TYPE IF EXISTS pg_catalog.pg_asp; - DROP TABLE IF EXISTS pg_catalog.pg_asp; - end if; -END$$; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 9027, 84, 0, 0; -CREATE TABLE IF NOT EXISTS pg_catalog.pg_asp - (sampleid bigint nocompress not null, - sample_time timestamp with time zone nocompress not null, - need_flush_sample boolean nocompress not null, - databaseid oid nocompress not null, - thread_id bigint nocompress not null, - sessionid bigint nocompress not null, - start_time timestamp with time zone nocompress not null, - event text nocompress, - lwtid integer nocompress, - psessionid bigint nocompress, - tlevel integer nocompress, - smpid integer nocompress, - userid oid nocompress, - application_name text nocompress, - client_addr inet nocompress, - client_hostname text nocompress, - client_port integer nocompress, - query_id bigint nocompress, - unique_query_id bigint nocompress, - user_id oid nocompress, - cn_id integer nocompress, - unique_query text nocompress -) WITH oids TABLESPACE pg_default; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 0, 0, 0, 2997; -CREATE UNIQUE INDEX pg_asp_oid_index ON pg_catalog.pg_asp USING BTREE(oid oid_ops); -GRANT SELECT ON pg_catalog.pg_asp TO PUBLIC; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 0, 0, 0, 0; -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_pg_asp - (in start_ts timestamp without time zone, - in end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA pg_catalog.pg_asp%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - node_str TEXT; - BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'')'; - node_str := 'SELECT * FROM pg_catalog.pg_asp where sample_time > '''''||$1||''''' and sample_time < '''''||$2||''''; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') '''|| node_str ||''''';'; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := ROW_NAME.NODE_NAME; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - unique_query := ROW_DATA.unique_query; - RETURN NEXT; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - end if; -END$DO$; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP VIEW IF EXISTS DBE_PERF.global_pg_asp cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_global_pg_asp() cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_datanode_active_session_hist() cascade; - CREATE OR REPLACE FUNCTION DBE_PERF.get_datanode_active_session_hist - ( in datanode text, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA pg_catalog.pg_asp%ROWTYPE; - cn_name record; - query_text record; - QUERY_STR text; - query_cn text; - query_str_cn_name text; - BEGIN - --Get all the node names - QUERY_STR := 'EXECUTE DIRECT ON (' || $1 || ') ''SELECT * FROM pg_catalog.pg_asp'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := datanode; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - IF ROW_DATA.cn_id IS NULL THEN - unique_query := ROW_DATA.unique_query; - ELSE - query_str_cn_name := 'SELECT node_name FROM pgxc_node WHERE node_id='||ROW_DATA.cn_id||' AND nodeis_active = true'; - FOR cn_name IN EXECUTE(query_str_cn_name) LOOP - query_cn := 'EXECUTE DIRECT ON (' || cn_name.node_name || ') ''SELECT unique_query FROM pg_catalog.pg_asp where unique_query_id = '|| ROW_DATA.unique_query_id||' limit 1'''; - FOR query_text IN EXECUTE(query_cn) LOOP - unique_query := query_text.unique_query; - END LOOP; - END LOOP; - END IF; - RETURN NEXT; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_pg_asp - (OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA pg_catalog.pg_asp%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'')'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM pg_asp'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := ROW_NAME.NODE_NAME; - sampleid := ROW_DATA.sample_id; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - unique_query := ROW_DATA.unique_query; - RETURN NEXT; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - CREATE VIEW DBE_PERF.global_pg_asp AS - SELECT * FROM DBE_PERF.get_global_pg_asp(); - DECLARE - user_name text; - query_str text; - BEGIN - SELECT SESSION_USER INTO user_name; - query_str := 'GRANT ALL ON TABLE DBE_PERF.global_pg_asp TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - END; - GRANT SELECT ON TABLE DBE_PERF.global_pg_asp TO PUBLIC; - end if; -END$DO$; - -DROP FUNCTION IF EXISTS pg_catalog.sys_context(text, text) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 731; -CREATE OR REPLACE FUNCTION pg_catalog.sys_context(text, text) RETURNS text LANGUAGE INTERNAL NOT FENCED STRICT as 'sys_context'; - -do $$DECLARE ans boolean; -BEGIN - for ans in select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='pkg_service' limit 1) - LOOP - if ans = true then - DROP FUNCTION IF EXISTS pkg_service.job_cancel(bigint) cascade; - DROP FUNCTION IF EXISTS pkg_service.job_finish(bigint, boolean, timestamp) cascade; - DROP FUNCTION IF EXISTS pkg_service.job_submit(bigint, text, timestamp, text) cascade; - DROP FUNCTION IF EXISTS pkg_service.job_update(bigint, timestamp, text, text) cascade; - DROP FUNCTION IF EXISTS pkg_service.isubmit_on_nodes(bigint, name, name, text, timestamp without time zone, text) cascade; - DROP FUNCTION IF EXISTS pkg_service.submit_on_nodes(name, name, text, timestamp without time zone, text, OUT integer) cascade; - DROP FUNCTION IF EXISTS pkg_service.isubmit_on_nodes_internal(bigint, name, name, text, timestamp without time zone, text) cascade; - end if; - exit; - END LOOP; -END$$; -DROP SCHEMA IF EXISTS pkg_service cascade; - -CREATE OR REPLACE VIEW pg_catalog.ALL_OBJECTS AS - SELECT - pg_get_userbyid(cs.relowner) AS OWNER, - cs.relname AS OBJECT_NAME, - cs.oid AS OBJECT_ID, - (CASE - WHEN cs.relkind IN ('r', 'f') - THEN 'table'::NAME - WHEN cs.relkind='i' - THEN 'index'::NAME - WHEN cs.relkind='S' - THEN 'sequence'::NAME - WHEN cs.relkind='v' - THEN 'view'::NAME - END) AS OBJECT_TYPE, - cs.relnamespace AS NAMESPACE, - po.ctime AS CREATED, - po.mtime AS LAST_DDL_TIME - FROM pg_class cs left join pg_object po - on (po.object_oid = cs.oid and po.object_type in('r', 'f', 'i', 's', 'v')) - where cs.relkind in('r', 'f', 'i', 'S', 'v') - UNION - SELECT - pg_get_userbyid(pc.proowner) AS OWNER, - pc.proname AS OBJECT_NAME, - pc.oid AS OBJECT_ID, - 'procedure'::NAME AS OBJECT_TYPE, - pc.pronamespace AS NAMESPACE, - po.ctime AS CREATED, - po.mtime AS LAST_DDL_TIME - FROM pg_proc pc left join pg_object po - on (po.object_oid = pc.oid and po.object_type = 'P') - UNION - SELECT - pg_get_userbyid(cs.relowner) AS OWNER, - re.rulename AS OBJECT_NAME, - re.oid AS OBJECT_ID, - 'rule'::NAME AS OBJECT_TYPE, - cs.relnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_rewrite re - LEFT JOIN pg_class cs ON (cs.oid = re.ev_class) - UNION - SELECT - pg_get_userbyid(cs.relowner) AS OWNER, - tr.tgname AS OBJECT_NAME, - tr.oid AS OBJECT_ID, - 'trigger'::NAME AS OBJECT_TYPE, - cs.relnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_trigger tr - LEFT JOIN pg_class cs ON (cs.oid = tr.tgrelid) - UNION - SELECT - pg_get_userbyid(te.typowner) AS OWNER, - te.typname AS OBJECT_NAME, - te.oid AS OBJECT_ID, - 'type'::NAME AS OBJECT_TYPE, - te.typnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_type te - UNION - SELECT - pg_get_userbyid(op.oprowner) AS OWNER, - op.oprname AS OBJECT_NAME, - op.oid AS OBJECT_ID, - 'operator'::NAME AS OBJECT_TYPE, - op.oprnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_operator op - UNION ALL - SELECT - pg_get_userbyid(syn.synowner) AS OWNER, - syn.synname AS OBJECT_NAME, - syn.oid AS OBJECT_ID, - 'synonym'::NAME AS OBJECT_TYPE, - syn.synnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_synonym syn; - - - -CREATE OR REPLACE VIEW pg_catalog.USER_OBJECTS AS - SELECT - cs.relname AS OBJECT_NAME, - cs.oid AS OBJECT_ID, - CASE - WHEN cs.relkind IN ('r', 'f') - THEN 'table'::NAME - WHEN cs.relkind='i' - THEN 'index'::NAME - WHEN cs.relkind='S' - THEN 'sequence'::NAME - WHEN cs.relkind='v' - THEN 'view'::NAME - END AS OBJECT_TYPE, - cs.relnamespace AS NAMESPACE, - po.ctime AS CREATED, - po.mtime AS LAST_DDL_TIME - FROM pg_class cs left join pg_object po - on (po.object_oid = cs.oid and po.object_type in('r', 'f', 'i', 's', 'v')) - WHERE cs.relkind in('r', 'f', 'i', 'S', 'v') - AND pg_get_userbyid(cs.relowner)=SYS_CONTEXT('USERENV','CURRENT_USER') - UNION - SELECT - pc.proname AS OBJECT_NAME, - pc.oid AS OBJECT_ID, - 'procedure'::NAME AS OBJECT_TYPE, - pc.pronamespace AS NAMESPACE, - po.ctime AS CREATED, - po.mtime AS LAST_DDL_TIME - FROM pg_proc pc left join pg_object po - on (po.object_oid = pc.oid and po.object_type = 'P') - WHERE pg_get_userbyid(pc.proowner)=SYS_CONTEXT('USERENV','CURRENT_USER') - UNION - SELECT - re.rulename AS OBJECT_NAME, - re.oid AS OBJECT_ID, - 'rule'::NAME AS OBJECT_TYPE, - cs.relnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_rewrite re - LEFT JOIN pg_class cs ON (cs.oid = re.ev_class) - WHERE pg_get_userbyid(cs.relowner)=SYS_CONTEXT('USERENV','CURRENT_USER') - UNION - SELECT - tr.tgname AS OBJECT_NAME, - tr.oid AS OBJECT_ID, - 'trigger'::NAME AS OBJECT_TYPE, - cs.relnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_trigger tr - LEFT JOIN pg_class cs ON (cs.oid = tr.tgrelid) - WHERE pg_get_userbyid(cs.relowner)=SYS_CONTEXT('USERENV','CURRENT_USER') - UNION - SELECT - te.typname AS OBJECT_NAME, - te.oid AS OBJECT_ID, - 'type'::NAME AS OBJECT_TYPE, - te.typnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_type te - WHERE pg_get_userbyid(te.typowner)=SYS_CONTEXT('USERENV','CURRENT_USER') - UNION - SELECT - op.oprname AS OBJECT_NAME, - op.oid AS OBJECT_ID, - 'operator'::NAME AS OBJECT_TYPE, - op.oprnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_operator op - WHERE pg_get_userbyid(op.oprowner)=SYS_CONTEXT('USERENV','CURRENT_USER') - UNION ALL - SELECT - syn.synname AS OBJECT_NAME, - syn.oid AS OBJECT_ID, - 'synonym'::NAME AS OBJECT_TYPE, - syn.synnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_synonym syn - WHERE pg_get_userbyid(syn.synowner) = SYS_CONTEXT('USERENV','CURRENT_USER'); - -CREATE OR REPLACE VIEW pg_catalog.DBA_OBJECTS AS - SELECT - pg_get_userbyid(cs.relowner) AS OWNER, - cs.relname AS OBJECT_NAME, - cs.oid AS OBJECT_ID, - (CASE - WHEN cs.relkind IN ('r', 'f') - THEN 'TABLE'::NAME - WHEN cs.relkind='i' - THEN 'INDEX'::NAME - WHEN cs.relkind='S' - THEN 'SEQUENCE'::NAME - WHEN cs.relkind='v' - THEN 'VIEW'::NAME - END) AS OBJECT_TYPE, - cs.relnamespace AS NAMESPACE, - po.ctime AS CREATED, - po.mtime AS LAST_DDL_TIME - FROM pg_class cs left join pg_object po - on (po.object_oid = cs.oid and po.object_type in('r', 'f', 'i', 's', 'v')) - where cs.relkind in('r', 'f', 'i', 'S', 'v') - UNION - SELECT - pg_get_userbyid(pc.proowner) AS OWNER, - pc.proname AS OBJECT_NAME, - pc.oid AS OBJECT_ID, - 'PROCEDURE'::NAME AS OBJECT_TYPE, - pc.pronamespace AS NAMESPACE, - po.ctime AS CREATED, - po.mtime AS LAST_DDL_TIME - FROM pg_proc pc left join pg_object po - on (po.object_oid = pc.oid and po.object_type = 'P') - UNION - SELECT - pg_get_userbyid(cs.relowner) AS OWNER, - re.rulename AS OBJECT_NAME, - re.oid AS OBJECT_ID, - 'RULE'::NAME AS OBJECT_TYPE, - cs.relnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_rewrite re - LEFT JOIN pg_class cs ON (cs.oid = re.ev_class) - UNION - SELECT - pg_get_userbyid(cs.relowner) AS OWNER, - tr.tgname AS OBJECT_NAME, - tr.oid AS OBJECT_ID, - 'TRIGGER'::NAME AS OBJECT_TYPE, - cs.relnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_trigger tr - LEFT JOIN pg_class cs ON (cs.oid = tr.tgrelid) - UNION - SELECT - pg_get_userbyid(te.typowner) AS OWNER, - te.typname AS OBJECT_NAME, - te.oid AS OBJECT_ID, - 'TYPE'::NAME AS OBJECT_TYPE, - te.typnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_type te - UNION - SELECT - pg_get_userbyid(op.oprowner) AS OWNER, - op.oprname AS OBJECT_NAME, - op.oid AS OBJECT_ID, - 'OPERATOR'::NAME AS OBJECT_TYPE, - op.oprnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_operator op - UNION ALL - SELECT - pg_get_userbyid(syn.synowner) AS OWNER, - syn.synname AS OBJECT_NAME, - syn.oid AS OBJECT_ID, - 'synonym'::NAME AS OBJECT_TYPE, - syn.synnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_synonym syn; \ No newline at end of file diff --git a/src/include/catalog/upgrade_sql/open_gauss/rollback_catalog_maindb/rollback_catalog_maindb_92_200.sql b/src/include/catalog/upgrade_sql/open_gauss/rollback_catalog_maindb/rollback_catalog_maindb_92_200.sql index 9d05e91a3..e69de29bb 100644 --- a/src/include/catalog/upgrade_sql/open_gauss/rollback_catalog_maindb/rollback_catalog_maindb_92_200.sql +++ b/src/include/catalog/upgrade_sql/open_gauss/rollback_catalog_maindb/rollback_catalog_maindb_92_200.sql @@ -1,2129 +0,0 @@ -DECLARE -sql text; -BEGIN - if exists(select extname from pg_extension where extname = 'packages') then - sql := 'DROP EXTENSION IF EXISTS packages CASCADE;'; - execute sql; - sql := 'CREATE EXTENSION packages;'; - execute sql; - end if; -END -/ - -do $$DECLARE ans boolean; -BEGIN - for ans in select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='pkg_service' limit 1) - LOOP - if ans = true then - DROP FUNCTION IF EXISTS pkg_service.job_cancel(bigint) cascade; - DROP FUNCTION IF EXISTS pkg_service.job_finish(bigint, boolean, timestamp) cascade; - DROP FUNCTION IF EXISTS pkg_service.job_submit(bigint, text, timestamp, text) cascade; - DROP FUNCTION IF EXISTS pkg_service.job_update(bigint, timestamp, text, text) cascade; - end if; - exit; - END LOOP; -END$$; - -DECLARE -sql text; -BEGIN - if exists(select extname from pg_extension where extname = 'gsredistribute') then - sql := 'DROP EXTENSION IF EXISTS gsredistribute CASCADE;'; - execute sql; - sql := 'CREATE EXTENSION gsredistribute;'; - execute sql; - end if; -END -/ - -DROP FUNCTION IF EXISTS pg_catalog.pg_control_checkpoint() CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.pg_control_system() CASCADE; - -DROP FUNCTION IF EXISTS pg_catalog.track_model_train_opt(text, text); - -DROP FUNCTION IF EXISTS pg_catalog.gs_stat_get_wlm_plan_operator_info(oid); - -DROP FUNCTION IF EXISTS pg_catalog.model_train_opt(text, text); - -DROP FUNCTION IF EXISTS pg_catalog.encode_plan_node(text, text, text, text, int8, text, text); - -DROP FUNCTION IF EXISTS pg_catalog.check_engine_status(text, text); - - -DROP VIEW IF EXISTS pg_catalog.pgxc_get_table_skewness CASCADE; - --- view for get the skew of the data distribution in all datanodes -CREATE OR REPLACE VIEW pg_catalog.pgxc_get_table_skewness AS -WITH skew AS -( - SELECT - schemaname, - tablename, - sum(dnsize) AS totalsize, - avg(dnsize) AS avgsize, - max(dnsize) AS maxsize, - min(dnsize) AS minsize, - (max(dnsize) - min(dnsize)) AS skewsize, - stddev(dnsize) AS skewstddev - FROM pg_catalog.pg_class c - INNER JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace - INNER JOIN pg_catalog.table_distribution() s ON s.schemaname = n.nspname AND s.tablename = c.relname - INNER JOIN pg_catalog.pgxc_class x ON c.oid = x.pcrelid AND x.pclocatortype = 'H' - GROUP BY schemaname,tablename -) -SELECT - schemaname, - tablename, - totalsize, - avgsize::numeric(1000), - (maxsize/totalsize)::numeric(4,3) AS maxratio, - (minsize/totalsize)::numeric(4,3) AS minratio, - skewsize, - (skewsize/totalsize)::numeric(4,3) AS skewratio, - skewstddev::numeric(1000) -FROM skew -WHERE totalsize > 0; - -GRANT SELECT ON TABLE pg_catalog.pgxc_get_table_skewness TO PUBLIC; - -create or replace function table_skewness(table_name text, column_name text, - OUT seqNum text, OUT Num text, OUT Ratio text, row_num text default '0') -RETURNS setof record -AS $$ -DECLARE - tolal_num text; - row_data record; - execute_query text; - BEGIN - if row_num = 0 then - EXECUTE 'select count(1) from ' || $1 into tolal_num; - execute_query = 'select seqNum, count(1) as num - from (select pg_catalog.table_data_skewness(row(' || $2 ||'), ''H'') as seqNum from ' || $1 || - ') group by seqNum order by num DESC'; - else - tolal_num = row_num; - execute_query = 'select seqNum, count(1) as num - from (select pg_catalog.table_data_skewness(row(' || $2 ||'), ''H'') as seqNum from ' || $1 || - ' limit ' || row_num ||') group by seqNum order by num DESC'; - end if; - - if tolal_num = 0 then - seqNum = 0; - Num = 0; - Ratio = ROUND(0, 3) || '%'; - return; - end if; - - for row_data in EXECUTE execute_query loop - seqNum = row_data.seqNum; - Num = row_data.num; - Ratio = ROUND(row_data.num / tolal_num * 100, 3) || '%'; - RETURN next; - end loop; - END; -$$LANGUAGE plpgsql NOT FENCED; - -DROP FUNCTION IF EXISTS pg_catalog.gs_roach_stop_backup(text); - -DROP FUNCTION IF EXISTS pg_catalog.gs_roach_enable_delay_ddl_recycle(name); - -DROP FUNCTION IF EXISTS pg_catalog.gs_roach_disable_delay_ddl_recycle(name); - -DROP FUNCTION IF EXISTS pg_catalog.gs_roach_switch_xlog(bool); - -DROP FUNCTION IF EXISTS pg_catalog.pg_resume_bkp_flag(name); -DROP FUNCTION IF EXISTS pg_catalog.pg_resume_bkp_flag(); -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 4445; -CREATE OR REPLACE FUNCTION pg_catalog.pg_resume_bkp_flag -(out start_backup_flag bool, -out to_delay bool, -out ddl_delay_recycle_ptr text, -out rewind_time text) -RETURNS record LANGUAGE INTERNAL STRICT as 'pg_resume_bkp_flag'; - -DROP INDEX IF EXISTS pg_catalog.pgxc_slice_relid_index; -DROP INDEX IF EXISTS pg_catalog.pgxc_slice_order_index; -DROP TYPE IF EXISTS pg_catalog.pgxc_slice; -DROP TABLE IF EXISTS pg_catalog.pgxc_slice; - -DROP INDEX IF EXISTS pg_catalog.streaming_gather_agg_index; -DROP INDEX IF EXISTS pg_catalog.streaming_reaper_status_id_index; -DROP INDEX IF EXISTS pg_catalog.streaming_reaper_status_oid_index; -DROP TYPE IF EXISTS pg_catalog.streaming_reaper_status; -DROP TABLE IF EXISTS pg_catalog.streaming_reaper_status; - -DROP INDEX IF EXISTS pg_catalog.streaming_cont_query_schema_change_index; -UPDATE pg_index SET indisunique = true WHERE indexrelid = 3234; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_type where typname = 'byteawithoutorderwithequalcol' limit 1) into ans; - if ans = true then - DROP OPERATOR FAMILY IF EXISTS byteawithoutorderwithequalcol_ops USING BTREE; - DROP OPERATOR FAMILY IF EXISTS byteawithoutorderwithequalcol_ops USING HASH; - DROP OPERATOR CLASS IF EXISTS byteawithoutorderwithequalcol_ops USING BTREE; - DROP OPERATOR CLASS IF EXISTS byteawithoutorderwithequalcol_ops USING HASH; - - DROP OPERATOR IF EXISTS pg_catalog.= (byteawithoutorderwithequalcol, byteawithoutorderwithequalcol) cascade; - DROP OPERATOR IF EXISTS pg_catalog.= (byteawithoutorderwithequalcol, bytea) cascade; - DROP OPERATOR IF EXISTS pg_catalog.= (bytea, byteawithoutorderwithequalcol) cascade; - DROP OPERATOR IF EXISTS pg_catalog.<> (byteawithoutorderwithequalcol, byteawithoutorderwithequalcol) cascade; - DROP OPERATOR IF EXISTS pg_catalog.<> (byteawithoutorderwithequalcol, bytea) cascade; - DROP OPERATOR IF EXISTS pg_catalog.<> (bytea, byteawithoutorderwithequalcol) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcolcmp(byteawithoutorderwithequalcol, byteawithoutorderwithequalcol) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcolcmpbytear(byteawithoutorderwithequalcol, bytea) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcolcmpbyteal(bytea, byteawithoutorderwithequalcol) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcoleq(byteawithoutorderwithequalcol, byteawithoutorderwithequalcol) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcoleqbyteal(bytea, byteawithoutorderwithequalcol) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcoleqbytear(byteawithoutorderwithequalcol, bytea) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcolne(byteawithoutorderwithequalcol, byteawithoutorderwithequalcol) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcolnebyteal(bytea, byteawithoutorderwithequalcol) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcolnebytear(byteawithoutorderwithequalcol, bytea) cascade; - DROP FUNCTION IF EXISTS pg_catalog.hll_hash_byteawithoutorderwithequalcol(byteawithoutorderwithequalcol) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcolout(byteawithoutorderwithequalcol) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcolsend(byteawithoutorderwithequalcol) cascade; - end if; -END$$; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_type where typname = 'byteawithoutordercol' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutordercolout(byteawithoutordercol) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutordercolsend(byteawithoutordercol) cascade; - end if; -END$$; -DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcolin(cstring) cascade; -DROP FUNCTION IF EXISTS pg_catalog.byteawithoutordercolin(cstring) cascade; -DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcolrecv(internal) cascade; -DROP FUNCTION IF EXISTS pg_catalog.byteawithoutordercolrecv(internal) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcoltypmodin(_cstring) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcoltypmodout(int4) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cek_privilege(name, text, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cek_privilege(name, oid, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cek_privilege(oid, text, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cek_privilege(oid, oid, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cek_privilege(text, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cek_privilege(oid, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cmk_privilege(name, text, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cmk_privilege(name, oid, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cmk_privilege(oid, text, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cmk_privilege(oid, oid, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cmk_privilege(text, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cmk_privilege(oid, text) cascade; - -DROP TYPE IF EXISTS pg_catalog.byteawithoutorderwithequalcol; -DROP TYPE IF EXISTS pg_catalog.byteawithoutordercol; - -DROP INDEX IF EXISTS pg_catalog.gs_column_keys_args_oid_index; -DROP TYPE IF EXISTS pg_catalog.gs_column_keys_args; -DROP TABLE IF EXISTS pg_catalog.gs_column_keys_args; - -DROP INDEX IF EXISTS pg_catalog.gs_client_global_keys_args_oid_index; -DROP TYPE IF EXISTS pg_catalog.gs_client_global_keys_args; -DROP TABLE IF EXISTS pg_catalog.gs_client_global_keys_args; - -DROP INDEX IF EXISTS pg_catalog.gs_column_keys_distributed_id_index; -DROP INDEX IF EXISTS pg_catalog.gs_column_keys_name_index; -DROP INDEX IF EXISTS pg_catalog.gs_column_keys_oid_index; -DROP TYPE IF EXISTS pg_catalog.gs_column_keys; -DROP TABLE IF EXISTS pg_catalog.gs_column_keys; - -DROP INDEX IF EXISTS pg_catalog.gs_client_global_keys_name_index; -DROP INDEX IF EXISTS pg_catalog.gs_client_global_keys_oid_index; -DROP TYPE IF EXISTS pg_catalog.gs_client_global_keys; -DROP TABLE IF EXISTS pg_catalog.gs_client_global_keys; - -DROP INDEX IF EXISTS pg_catalog.gs_encrypted_columns_rel_id_column_name_index; -DROP INDEX IF EXISTS pg_catalog.gs_encrypted_columns_oid_index; -DROP TYPE IF EXISTS pg_catalog.gs_encrypted_columns; -DROP TABLE IF EXISTS pg_catalog.gs_encrypted_columns; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_extension where extname = 'packages' limit 1) into ans; - if ans = true then - DROP EXTENSION IF EXISTS packages CASCADE; - CREATE EXTENSION IF NOT EXISTS packages; - ALTER EXTENSION packages UPDATE TO '1.1'; - end if; -END$$; - -DECLARE -sql text; -BEGIN - if exists(select extname from pg_extension where extname = 'gsredistribute') then - sql := 'DROP EXTENSION IF EXISTS gsredistribute CASCADE;'; - execute sql; - sql := 'CREATE EXTENSION gsredistribute;'; - execute sql; - end if; -END -/ - -DROP FUNCTION IF EXISTS pg_catalog.delta(NUMERIC) CASCADE; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_extension where extname = 'security_plugin' limit 1) into ans; - if ans = true then - drop extension if exists security_plugin cascade; - create extension security_plugin; - end if; -END$$; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_extension where extname = 'streaming' limit 1) into ans; - if ans = true then - CREATE OR REPLACE FUNCTION pg_catalog.hash_group(VARIADIC "any") - RETURNS integer - AS '$libdir/streaming', 'hash_group' - LANGUAGE C IMMUTABLE NOT FENCED; - - CREATE OR REPLACE FUNCTION pg_catalog.ls_hash_group(VARIADIC "any") - RETURNS bigint - AS '$libdir/streaming', 'ls_hash_group' - LANGUAGE C IMMUTABLE NOT FENCED; - - CREATE OR REPLACE FUNCTION pg_catalog.time_floor(timestamp with time zone, interval) - RETURNS timestamp with time zone - AS '$libdir/streaming', 'timestamp_floor' - LANGUAGE C IMMUTABLE STRICT NOT FENCED; - end if; -END$$; - -DECLARE -sql text; -BEGIN - if exists(select extname from pg_extension where extname = 'gsredistribute') then - sql := 'DROP EXTENSION IF EXISTS gsredistribute CASCADE;'; - execute sql; - sql := 'CREATE EXTENSION gsredistribute;;'; - execute sql; - end if; -END -/ - --- 1. drop system relations and indexes --- gs_matview --- gs_matview_dependency - -DROP INDEX IF EXISTS pg_catalog.gs_matview_oid_index; -DROP INDEX IF EXISTS pg_catalog.gs_matview_matviewid_index; -DROP TYPE IF EXISTS pg_catalog.gs_matview; -DROP TABLE IF EXISTS pg_catalog.gs_matview; - -DROP INDEX IF EXISTS pg_catalog.gs_matviewdep_oid_index; -DROP INDEX IF EXISTS pg_catalog.gs_matview_dependency_matviewid_index; -DROP INDEX IF EXISTS pg_catalog.gs_matview_dependency_relid_index; -DROP INDEX IF EXISTS pg_catalog.gs_matview_dependency_mlogid_index; -DROP INDEX IF EXISTS pg_catalog.gs_matview_dependency_bothid_index; -DROP TYPE IF EXISTS pg_catalog.gs_matview_dependency; -DROP TABLE IF EXISTS pg_catalog.gs_matview_dependency; - -DROP FUNCTION IF EXISTS pg_catalog.top_key(name, int8) cascade; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_extension where extname = 'streaming' limit 1) into ans; - if ans = true then - CREATE OR REPLACE FUNCTION pg_catalog.hash_group(VARIADIC "any") - RETURNS integer - AS '$libdir/streaming', 'hash_group' - LANGUAGE C IMMUTABLE NOT FENCED; - - CREATE OR REPLACE FUNCTION pg_catalog.ls_hash_group(VARIADIC "any") - RETURNS bigint - AS '$libdir/streaming', 'ls_hash_group' - LANGUAGE C IMMUTABLE NOT FENCED; - end if; -END$$; - -drop function if exists pg_catalog.report_fatal() cascade; -drop function if exists pg_catalog.signal_backend(bigint, int) cascade; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 2537; -create function pg_catalog.report_fatal() - RETURNS boolean - LANGUAGE internal - STRICT NOT FENCED NOT SHIPPABLE -AS 'report_fatal'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 2539; -create function pg_catalog.signal_backend(bigint, integer) - RETURNS boolean - LANGUAGE internal - STRICT NOT FENCED NOT SHIPPABLE -AS 'signal_backend'; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select relname from pg_class where relname='gs_asp_sampletime_index' limit 1) into ans; - if ans = true then - DROP INDEX IF EXISTS pg_catalog.gs_asp_sampletime_index; - end if; -END$$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_auditing_policy') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_auditing_policy TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_auditing_policy_access') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_auditing_policy_access TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_auditing_policy_filters') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_auditing_policy_filters TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_auditing_policy_privileges') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_auditing_policy_privileges TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_policy_label') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_policy_label TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_masking_policy') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_masking_policy TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_masking_policy_actions') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_masking_policy_actions TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_masking_policy_filters') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_masking_policy_filters TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_labels') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_labels TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_masking') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_masking TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_auditing') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_auditing TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_auditing_access') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_auditing_access TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_auditing_privilege') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_auditing_privilege TO public; - end if; -END$DO$; - -DO $DO$ -DECLARE - user_name text; - query_str text; - ans boolean; -BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_labels') into ans; - if ans = true then - SELECT SESSION_USER INTO user_name; - query_str := 'REVOKE ALL ON TABLE pg_catalog.gs_labels FROM ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - end if; -END$DO$; - -DO $DO$ -DECLARE - user_name text; - query_str text; - ans boolean; -BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_masking') into ans; - if ans = true then - SELECT SESSION_USER INTO user_name; - query_str := 'REVOKE ALL ON TABLE pg_catalog.gs_masking FROM ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - end if; -END$DO$; - -DO $DO$ -DECLARE - user_name text; - query_str text; - ans boolean; -BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_auditing') into ans; - if ans = true then - SELECT SESSION_USER INTO user_name; - query_str := 'REVOKE ALL ON TABLE pg_catalog.gs_auditing FROM ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - end if; -END$DO$; - -DO $DO$ -DECLARE - user_name text; - query_str text; - ans boolean; -BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_auditing_access') into ans; - if ans = true then - SELECT SESSION_USER INTO user_name; - query_str := 'REVOKE ALL ON TABLE pg_catalog.gs_auditing_access FROM ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - end if; -END$DO$; - -DO $DO$ -DECLARE - user_name text; - query_str text; - ans boolean; -BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_auditing_privilege') into ans; - if ans = true then - SELECT SESSION_USER INTO user_name; - query_str := 'REVOKE ALL ON TABLE pg_catalog.gs_auditing_privilege FROM ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - end if; -END$DO$; - -drop function if exists pg_catalog.get_large_table_name; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS DBE_PERF.get_global_gs_asp() cascade; - end if; -END$$; -DROP INDEX IF EXISTS pg_catalog.gs_asp_sample_time_index; -DROP TYPE IF EXISTS pg_catalog.gs_asp; -DROP TABLE IF EXISTS pg_catalog.gs_asp; - -CREATE OR REPLACE FUNCTION pg_catalog.proc_add_partition( - IN relationname name, - IN boundaries_interval INTERVAL -) -RETURNS void -AS -$$ -DECLARE - pgclass_rec pg_class%rowtype; - row_name record; - sql text; - part_relname text; - check_count int; - rel_oid int; - job_id int; - time_interval int; - part_boundarie timestamptz; - partition_tmp timestamptz; - username name; - database name; - now_timestamp timestamptz; - namespace name; - table_name name; - pos integer; -BEGIN - /* check tsdb_enable */ - IF check_engine_enable() = false - THEN - RAISE EXCEPTION 'tsdb engine is not exist'; - END IF; - /* check tsdb_enable end */ - - /* skip for cluster unstable */ - IF (SELECT count(*) FROM pg_settings WHERE name='enable_prevent_job_task_startup' AND setting='on') > 0 - THEN - RAISE WARNING 'skip proc_add_partition() when enable_prevent_job_task_startup = on'; - RETURN; - END IF; - IF (SELECT count(*) FROM pg_settings WHERE name='enable_online_ddl_waitlock' AND setting='on') > 0 - THEN - RAISE WARNING 'skip proc_add_partition() when enable_online_ddl_waitlock = on'; - RETURN; - END IF; - /* skip for cluster unstable */ - - /* check parameter */ - IF relationname is null THEN - RAISE EXCEPTION 'parameter ''relationname'' cannot be null'; - END IF; - IF boundaries_interval is null THEN - RAISE EXCEPTION 'parameter ''boundaries_interval'' cannot be null'; - END IF; - IF boundaries_interval < interval '0' THEN - RAISE EXCEPTION 'boundaries_interval must be greater than 0'; - END IF; - pos = is_contain_namespace(relationname); - IF pos != 0 THEN - namespace = substring(relationname from 1 for pos -1); - table_name = substring(relationname from pos+1 for char_length(relationname) - pos); - END IF; - /* check parameter end */ - sql = 'select current_database();'; - EXECUTE sql INTO database; - /* check table exist */ - sql := 'select current_user'; - EXECUTE(sql) into username; - IF pos = 0 THEN - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = ''' || relationname || ''' - AND pg_catalog.pg_table_is_visible(c.oid) ;'; - ELSE - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = ''' || table_name || ''' - AND n.nspname = ''' || namespace || ''';'; - END IF; - EXECUTE sql INTO check_count; - IF check_count = 0 THEN - RAISE EXCEPTION 'please input the correct relation name!'; - END IF; - /* check table exist end */ - - /* check table owner privilege */ - IF pos = 0 THEN - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = ''' || relationname || ''' - AND pg_catalog.pg_table_is_visible(c.oid) and pg_catalog.pg_get_userbyid(c.relowner) = ''' || username || ''';'; - ELSE - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = ''' || table_name || ''' - AND n.nspname = ''' || namespace || ''' and pg_catalog.pg_get_userbyid(c.relowner) = ''' || username || ''';'; - END IF; - EXECUTE sql INTO check_count; - IF check_count = 0 THEN - RAISE EXCEPTION 'permission denied for relation %', relationname - USING HINT = 'please assure you have the privilege'; - END IF; - /* check table owner privilege end */ - - /* check partition table */ - IF pos = 0 THEN - sql := 'SELECT c.oid FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = ''' || relationname || ''' - AND pg_catalog.pg_table_is_visible(c.oid) and pg_catalog.pg_get_userbyid(c.relowner) = ''' || username || ''';'; - ELSE - sql := 'SELECT c.oid FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = ''' || table_name || ''' - AND n.nspname = ''' || namespace || ''' and pg_catalog.pg_get_userbyid(c.relowner) = ''' || username || ''';'; - END IF; - EXECUTE sql into rel_oid; - sql := 'SELECT relkind,parttype FROM pg_class WHERE oid = ''' || rel_oid ||''''; - EXECUTE sql into pgclass_rec.relkind, pgclass_rec.parttype; - IF pgclass_rec.relkind != 'r' THEN - RAISE EXCEPTION ' % is not a table !',relationname; - END IF; - IF pgclass_rec.parttype != 'p' THEN - RAISE EXCEPTION ' % does not have partition !',relationname; - END IF; - /* check partition table end */ - - /* iteratively checking time range for every partition*/ - sql := 'SELECT boundaries[1] FROM pg_partition WHERE parentid = ' || rel_oid ||' AND boundaries IS NOT NULL ORDER BY - EXTRACT(epoch FROM CAST(boundaries[1] as timestamptz)) DESC LIMIT 1'; - EXECUTE sql INTO part_boundarie; - - /* reinforce the job failed to throw error when inserting data */ - sql := 'select current_timestamp(0)'; - EXECUTE(sql) into now_timestamp; - WHILE part_boundarie - 20 * boundaries_interval < now_timestamp LOOP - part_boundarie = part_boundarie + boundaries_interval; - sql = 'select proc_add_partition_by_boundary(''' || relationname || ''', ' || '''' || part_boundarie || ''');'; - EXECUTE(sql); - END LOOP; - - part_boundarie := part_boundarie + boundaries_interval; - partition_tmp = date_trunc('second', part_boundarie); - sql :='ALTER TABLE '||relationname||' ADD PARTITION p'||EXTRACT(epoch FROM CAST(partition_tmp AS TIMESTAMPTZ))||' values less than ('''||part_boundarie||''');'; - EXECUTE (sql); - - /* Add regarding dependencies into pg_depend */ - sql := 'SELECT node_name,node_host,node_port FROM pgxc_node where node_type = ''C'' and nodeis_active = ''t'' '; - FOR row_name IN EXECUTE(sql) LOOP - sql := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select c.oid FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace - WHERE c.relname = ''''' || relationname || ''''' AND pg_catalog.pg_table_is_visible(c.oid) and pg_catalog.pg_get_userbyid(c.relowner) = ''''' || username || '''''; '''; - EXECUTE sql INTO rel_oid; - sql := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' SELECT a.job_id from pg_job a , pg_job_proc b where - b.what like ''''%proc_add_partition('''''''''|| relationname ||'''''''''%'''' and a.job_id = b.job_id - and a.priv_user='''''|| username ||''''' and a.dbname='''''|| database ||''''' '''; - EXECUTE sql INTO job_id; - sql := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' SELECT count(*) from pg_depend where classid = 9022 and objid =' || job_id || ''''; - EXECUTE sql INTO check_count; - /* Add regarding dependencies of proc_add_partition job */ - IF check_count = 0 THEN - sql := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' SELECT pg_catalog.add_job_class_depend(' || job_id || ',' || rel_oid || ')'''; - EXECUTE sql INTO job_id; - END IF; - sql := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' SELECT count(*) from pg_job a , pg_job_proc b where - b.what like ''''%proc_drop_partition('''''''''|| relationname ||'''''''''%'''' and a.job_id = b.job_id and a.dbname='''''|| database ||''''' '''; - /* Add regarding dependencies of proc_drop_partition job */ - EXECUTE sql INTO check_count; - IF check_count = 1 THEN - sql := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' SELECT a.job_id from pg_job a , pg_job_proc b where - b.what like ''''%proc_drop_partition('''''''''|| relationname ||'''''''''%'''' and a.job_id = b.job_id and a.dbname='''''|| database ||''''' '''; - EXECUTE sql INTO job_id; - sql := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' SELECT count(*) from pg_depend where classid = 9022 and objid =' || job_id || ''''; - RAISE NOTICE '%',sql; - EXECUTE sql INTO check_count; - IF check_count = 0 THEN - sql := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' SELECT pg_catalog.add_job_class_depend(' || job_id || ',' || rel_oid || ')'''; - EXECUTE sql INTO job_id; - END IF; - END IF; - - RAISE NOTICE 'succeess'; - END LOOP; -END; -$$ -LANGUAGE plpgsql; - -drop function if exists pg_catalog.report_application_error(text, integer) cascade; -CREATE OR REPLACE FUNCTION pg_catalog.raise_application_error(errcode integer, - errmsg text, - flag boolean DEFAULT false) -RETURNS integer -as '$libdir/plpgsql','raise_application_error' -LANGUAGE C STRICT VOLATILE NOT FENCED; - -do $$DECLARE ans boolean; -BEGIN - for ans in select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbms_job' limit 1) - LOOP - if ans = true then - DROP FUNCTION IF EXISTS dbms_job.remove(bigint) cascade; - DROP FUNCTION IF EXISTS dbms_job.change(bigint, text, timestamp, text) cascade; - DROP FUNCTION IF EXISTS dbms_job.what(bigint, text) cascade; - DROP FUNCTION IF EXISTS dbms_job.next_date(bigint, timestamp) cascade; - DROP FUNCTION IF EXISTS dbms_job.interval(bigint, text) cascade; - DROP FUNCTION IF EXISTS dbms_job.broken(bigint, boolean, timestamp) cascade; - DROP FUNCTION IF EXISTS dbms_job.isubmit(bigint, text, timestamp, text) cascade; - DROP FUNCTION IF EXISTS dbms_job.submit(text, timestamp, text, out integer) cascade; - DROP FUNCTION IF EXISTS dbms_job.isubmit_on_nodes(bigint, name, name, text, timestamp without time zone, text) cascade; - DROP FUNCTION IF EXISTS dbms_job.submit_on_nodes(name, name, text, timestamp without time zone, text, OUT integer) cascade; - DROP FUNCTION IF EXISTS dbms_job.isubmit_on_nodes_internal(bigint, name, name, text, timestamp without time zone, text) cascade; - end if; - exit; - END LOOP; -END$$; - -do $$DECLARE ans boolean; -BEGIN - for ans in select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='pkg_service' limit 1) - LOOP - if ans = true then - DROP FUNCTION IF EXISTS pkg_service.job_cancel(bigint) cascade; - DROP FUNCTION IF EXISTS pkg_service.job_finish(bigint, boolean, timestamp) cascade; - DROP FUNCTION IF EXISTS pkg_service.job_submit(bigint, text, timestamp, text) cascade; - DROP FUNCTION IF EXISTS pkg_service.job_update(bigint, timestamp, text, text) cascade; - DROP FUNCTION IF EXISTS pkg_service.isubmit_on_nodes(bigint, name, name, text, timestamp without time zone, text) cascade; - DROP FUNCTION IF EXISTS pkg_service.submit_on_nodes(name, name, text, timestamp without time zone, text, OUT integer) cascade; - DROP FUNCTION IF EXISTS pkg_service.isubmit_on_nodes_internal(bigint, name, name, text, timestamp without time zone, text) cascade; - end if; - exit; - END LOOP; -END$$; -DROP SCHEMA IF EXISTS pkg_service cascade; -DROP SCHEMA IF EXISTS dbms_job cascade; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_NAMESPACE, 3988; -CREATE SCHEMA dbms_job; -COMMENT ON schema dbms_job IS 'dbms_job schema'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 3990; -CREATE OR REPLACE FUNCTION dbms_job.isubmit( - in job bigint, - in what text, - in next_date timestamp without time zone default sysdate, - in interval_time text default 'null' -)RETURNS void LANGUAGE INTERNAL -IMMUTABLE NOT SHIPPABLE -as 'isubmit_job'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5717; -CREATE FUNCTION dbms_job.submit_on_nodes(node_name name, database name, what text, next_date timestamp without time zone, job_interval text, OUT job integer) - RETURNS integer - LANGUAGE internal - NOT FENCED NOT SHIPPABLE -AS 'submit_job_on_nodes'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5718; -CREATE FUNCTION dbms_job.isubmit_on_nodes(job bigint, node_name name, database name, what text, next_date timestamp without time zone, job_interval text) - RETURNS integer - LANGUAGE internal - NOT FENCED NOT SHIPPABLE -AS 'isubmit_job_on_nodes'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 6007; -CREATE FUNCTION dbms_job.isubmit_on_nodes_internal(job bigint, node_name name, database name, what text, next_date timestamp without time zone, job_interval text) - RETURNS integer - LANGUAGE internal - NOT FENCED NOT SHIPPABLE -AS 'isubmit_job_on_nodes_internal'; - -CREATE OR REPLACE VIEW PG_CATALOG.DUAL AS (SELECT 'X'::TEXT AS DUMMY); -GRANT SELECT ON TABLE DUAL TO PUBLIC; - -CREATE OR REPLACE VIEW pg_catalog.user_jobs AS - SELECT - j.job_id AS job, - j.log_user AS log_user, - j.priv_user AS priv_user, - j.dbname AS dbname, - j.start_date AS start_date, - substr(to_char(j.start_date,'HH24:MI:SS'),1,8) AS start_suc, - j.last_suc_date AS last_date, - substr(to_char(j.last_suc_date,'HH24:MI:SS'),1,8) AS last_suc, - j.this_run_date AS this_date, - substr(to_char(j.this_run_date,'HH24:MI:SS'),1,8) AS this_suc, - j.next_run_date AS next_date, - substr(to_char(j.next_run_date,'HH24:MI:SS'),1,8) AS next_suc, - CASE - WHEN j.job_status = 's' OR j.job_status = 'r' OR j.job_status = 'f' THEN 'n' - WHEN j.job_status = 'd' THEN 'y' - ELSE '?' - END AS broken, - j.job_status AS status, - j.interval AS interval, - j.failure_count AS failures, - p.what AS what - FROM pg_authid a JOIN pg_job j ON (a.rolname = j.log_user) - LEFT JOIN pg_job_proc p ON (j.job_id = p.job_id) - WHERE a.rolname = current_user; - -GRANT SELECT ON pg_catalog.user_jobs TO public; - -CREATE OR REPLACE VIEW pg_catalog.DBA_PART_TABLES AS - - SELECT - CAST(a.rolname AS VARCHAR2(64)) AS TABLE_OWNER, - ---------------------------------------------------------------------- - CAST(n.nspname AS VARCHAR2(64)) AS SCHEMA, - ---------------------------------------------------------------------- - CAST(c.relname AS varchar2(64)) AS TABLE_NAME , - - ---------------------------------------------------------------------- - CASE - when p.partstrategy = 'r' THEN 'RANGE'::TEXT - WHEN p.partstrategy = 'i' THEN 'INTERVAL'::TEXT - ELSE p.partstrategy - END AS PARTITIONING_TYPE, - ---------------------------------------------------------------------- - - (SELECT count(*) FROM pg_partition ps WHERE ps.parentid = c.oid AND ps.parttype = 'p') AS PARTITION_COUNT, - - ---------------------------------------------------------------------- - CASE - WHEN c.reltablespace = 0 THEN ('DEFAULT TABLESPACE'::TEXT)::NAME - ELSE - (SELECT spc.spcname FROM pg_tablespace spc WHERE c.reltablespace = spc.oid) - END - AS DEF_TABLESPACE_NAME, - - ---------------------------------------------------------------------- - array_length(p.partkey,1)as PARTITIONING_KEY_COUNT - FROM - PG_CLASS c , PG_PARTITION p , pg_authid a , pg_namespace n - WHERE - c.parttype = 'p' AND -- it is a partitioned table in pg_class - c.relkind = 'r' AND -- normal table ,it can be ignore, all partitioned table is normal table - c.oid = p.parentid AND -- join condition - p.parttype = 'r' AND -- it is a partitioned table in pg_partition - c.relowner = a.oid AND -- the owner of table - c.relnamespace = n.oid -- namespace - ORDER BY TABLE_OWNER,SCHEMA,PARTITIONING_TYPE, PARTITION_COUNT,DEF_TABLESPACE_NAME , PARTITIONING_KEY_COUNT; - -CREATE OR REPLACE VIEW pg_catalog.USER_PART_TABLES AS - SELECT - * - FROM DBA_PART_TABLES - WHERE TABLE_OWNER = CURRENT_USER; - -CREATE OR REPLACE VIEW pg_catalog.DBA_TAB_PARTITIONS AS - SELECT - CAST(a.rolname AS VARCHAR2(64)) AS TABLE_OWNER, - ---------------------------------------------------------------------- - CAST(n.nspname AS VARCHAR2(64)) AS SCHEMA, - ---------------------------------------------------------------------- - CAST(c.relname AS varchar2(64)) AS TABLE_NAME, - ---------------------------------------------------------------------- - CAST(p.relname AS varchar2(64)) AS PARTITION_NAME, - ---------------------------------------------------------------------- - array_to_string(p.BOUNDARIES, ',' , 'MAXVALUE') AS HIGH_VALUE, - ---------------------------------------------------------------------- - CASE - WHEN p.reltablespace = 0 THEN ('DEFAULT TABLESPACE'::TEXT)::NAME - ELSE (SELECT spc.spcname FROM pg_tablespace spc WHERE p.reltablespace = spc.oid) - END - AS TABLESPACE_NAME - ---------------------------------------------------------------------- - FROM - pg_class c , pg_partition p , pg_authid a, pg_namespace n - ---------------------------------------------------------------------- - WHERE - p.parentid = c.oid AND - ---------------------------------------------------------------------- - p.parttype = 'p' AND - c.relowner = a.oid AND - c.relnamespace = n.oid - - ---------------------------------------------------------------------- - ORDER BY TABLE_OWNER,SCHEMA,TABLE_NAME, PARTITION_NAME, HIGH_VALUE, TABLESPACE_NAME; - -CREATE OR REPLACE VIEW pg_catalog.USER_TAB_PARTITIONS AS - SELECT - * - FROM DBA_TAB_PARTITIONS - WHERE TABLE_OWNER = CURRENT_USER; - -CREATE OR REPLACE VIEW pg_catalog.DBA_PART_INDEXES AS - SELECT - CAST(a.rolname AS VARCHAR2(64)) AS INDEX_OWNER, - ---------------------------------------------------------------------- - CAST(n.nspname AS VARCHAR2(64)) AS SCHEMA, - ---------------------------------------------------------------------- - CAST(ci.relname AS varchar2(64)) AS INDEX_NAME , - ---------------------------------------------------------------------- - CAST(ct.relname AS varchar2(64)) AS TABLE_NAME , - ---------------------------------------------------------------------- - CASE - WHEN p.partstrategy = 'r' THEN 'RANGE'::TEXT - WHEN p.partstrategy = 'i' THEN 'INTERVAL'::TEXT - ELSE p.partstrategy - END AS PARTITIONING_TYPE , - ---------------------------------------------------------------------- - (SELECT count(*) FROM pg_partition ps WHERE ps.parentid = ct.oid AND ps.parttype = 'p') - AS PARTITION_COUNT , - ---------------------------------------------------------------------- - CASE - WHEN ci.reltablespace = 0 THEN ('DEFAULT TABLESPACE'::TEXT)::NAME - ELSE - (SELECT spc.spcname FROM pg_tablespace spc WHERE ci.reltablespace = spc.oid) - END - AS DEF_TABLESPACE_NAME, - ---------------------------------------------------------------------- - array_length(p.partkey,1)as PARTITIONING_KEY_COUNT - FROM - pg_class ct , --table - pg_class ci, --index - pg_index i, -- i.INDEXRELID is index i.INDRELID is table - pg_partition p, -- partition attribute of table - pg_authid a, - pg_namespace n - WHERE - ci.parttype = 'p' AND - ci.relkind = 'i' AND --find all the local partitioned index - - ci.oid = i.INDEXRELID AND --find table be indexed - ct.oid = i.INDRELID AND - - ct.oid = p.parentid AND -- find the attribute of partitioned table - p.parttype = 'r' AND - - ci.relowner = a.oid AND - ci.relnamespace = n.oid - ORDER BY TABLE_NAME ,SCHEMA, INDEX_NAME, DEF_TABLESPACE_NAME,INDEX_OWNER; - -CREATE OR REPLACE VIEW pg_catalog.USER_PART_INDEXES AS - SELECT - * - FROM DBA_PART_INDEXES - WHERE INDEX_OWNER = CURRENT_USER; - -CREATE OR REPLACE VIEW pg_catalog.DBA_IND_PARTITIONS AS - SELECT - CAST(a.rolname AS VARCHAR2(64)) AS INDEX_OWNER, - ---------------------------------------------------------------------- - CAST(n.nspname AS VARCHAR2(64)) AS SCHEMA, - ---------------------------------------------------------------------- - CAST(ci.relname AS varchar2(64)) AS INDEX_NAME, - ---------------------------------------------------------------------- - CAST(pi.relname AS varchar2(64)) AS PARTITION_NAME, - ---------------------------------------------------------------------- - pi.indisusable AS INDEX_PARTITION_USABLE, - ---------------------------------------------------------------------- - array_to_string(pt.BOUNDARIES, ',' , 'MAXVALUE') AS HIGH_VALUE, - ---------------------------------------------------------------------- - CASE - WHEN pi.reltablespace = 0 THEN ('DEFAULT TABLESPACE'::TEXT)::NAME - ELSE - (SELECT spc.spcname FROM pg_tablespace spc WHERE pi.reltablespace = spc.oid) - END - AS DEF_TABLESPACE_NAME - ---------------------------------------------------------------------- - FROM - pg_class ci , --the local partitioned index - pg_partition pi,-- the partition index - pg_partition pt,-- the partition indexed by partition index - pg_authid a, - pg_namespace n - - WHERE - ci.parttype = 'p' AND -- the partitioned relation - ci.relkind = 'i' AND -- choose index of partitioned relation - ci.oid = pi.parentid AND --the index partitons - pi.indextblid = pt.oid AND-- partition indexed by partition index - ci.relowner = a.oid AND - ci.relnamespace = n.oid - ORDER BY INDEX_OWNER,SCHEMA,INDEX_NAME, PARTITION_NAME, HIGH_VALUE, DEF_TABLESPACE_NAME; - -CREATE OR REPLACE VIEW pg_catalog.USER_IND_PARTITIONS AS - SELECT - * - FROM DBA_IND_PARTITIONS - WHERE INDEX_OWNER = CURRENT_USER; - - -DROP VIEW IF EXISTS PG_CATALOG.SYS_DUMMY CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_PART_TABLES CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_PART_TABLES CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_TAB_PARTITIONS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_TAB_PARTITIONS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_PART_INDEXES CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_PART_INDEXES CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_IND_PARTITIONS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_IND_PARTITIONS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_JOBS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_OBJECTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_OBJECTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_PROCEDURES CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_TABLES CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_TABLES CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_TABLES CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_TAB_COLUMNS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_TAB_COLUMNS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_VIEWS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_VIEWS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_VIEWS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_TRIGGERS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_TRIGGERS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_TAB_COLUMNS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_SOURCE CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_SOURCE CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_DEPENDENCIES CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_SOURCE CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_SEQUENCES CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_SEQUENCES CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_SEQUENCES CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_PROCEDURES CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_INDEXES CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_INDEXES CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_USERS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_USERS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_DATA_FILES CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_TABLESPACES CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_OBJECTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_IND_COLUMNS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_IND_COLUMNS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_IND_COLUMNS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_IND_EXPRESSIONS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_IND_EXPRESSIONS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_IND_EXPRESSIONS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_CONSTRAINTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_CONSTRAINTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_CONSTRAINTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_CONS_COLUMNS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_CONS_COLUMNS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_CONS_COLUMNS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_TAB_COMMENTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_TAB_COMMENTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_TAB_COMMENTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DV_SESSIONS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DV_SESSION_LONGOPS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_COL_COMMENTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_COL_COMMENTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_COL_COMMENTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_SYNONYMS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_SYNONYMS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_SYNONYMS CASCADE; - - ---because tsdb functions use job views and job system function, so we should reload the extension -DROP FUNCTION IF EXISTS pg_catalog.proc_add_depend(int, name, name,text) cascade; -DROP FUNCTION IF EXISTS pg_catalog.proc_add_depend(name, name, text) cascade; -DROP FUNCTION IF EXISTS pg_catalog.proc_add_depend(name, name) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.pg_lock_status() CASCADE; -SET LOCAL inplace_upgrade_next_system_object_oids=IUO_PROC, 1371; -CREATE FUNCTION pg_catalog.pg_lock_status -( -OUT locktype pg_catalog.text, -OUT database pg_catalog.oid, -OUT relation pg_catalog.oid, -OUT page pg_catalog.int4, -OUT tuple pg_catalog.int2, -OUT virtualxid pg_catalog.text, -OUT transactionid pg_catalog.xid, -OUT classid pg_catalog.oid, -OUT objid pg_catalog.oid, -OUT objsubid pg_catalog.int2, -OUT virtualtransaction pg_catalog.text, -OUT pid pg_catalog.int8, -OUT sessionid pg_catalog.int8, -OUT mode pg_catalog.text, -OUT granted pg_catalog.bool, -OUT fastpath pg_catalog.bool) -RETURNS SETOF record LANGUAGE INTERNAL ROWS 1000 VOLATILE STRICT as 'pg_lock_status'; - -DROP VIEW IF EXISTS pg_catalog.pg_locks CASCADE; -CREATE OR REPLACE VIEW pg_catalog.pg_locks AS - SELECT DISTINCT * from pg_lock_status(); - - -DROP FUNCTION IF EXISTS dbms_job.isubmit_on_nodes_interval(bigint, name, name, text, timestamp without time zone, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.proc_add_depend(name, name); - --- 1. drop streaming_stream and its indexes -DROP INDEX IF EXISTS pg_catalog.streaming_stream_oid_index; -DROP INDEX IF EXISTS pg_catalog.streaming_stream_relid_index; -DROP TYPE IF EXISTS pg_catalog.streaming_stream; -DROP TABLE IF EXISTS pg_catalog.streaming_stream; - --- 2. drop streaming_cont_query and its indexes -DROP INDEX IF EXISTS pg_catalog.streaming_cont_query_relid_index; -DROP INDEX IF EXISTS pg_catalog.streaming_cont_query_defrelid_index; -DROP INDEX IF EXISTS pg_catalog.streaming_cont_query_id_index; -DROP INDEX IF EXISTS pg_catalog.streaming_cont_query_oid_index; -DROP INDEX IF EXISTS pg_catalog.streaming_cont_query_matrelid_index; -DROP INDEX IF EXISTS pg_catalog.streaming_cont_query_lookupidxid_index; -DROP TYPE IF EXISTS pg_catalog.streaming_cont_query; -DROP TABLE IF EXISTS pg_catalog.streaming_cont_query; - ---93 -DROP VIEW IF EXISTS pg_catalog.gs_masking; - -DROP INDEX IF EXISTS pg_catalog.gs_masking_policy_filters_row_index; -DROP INDEX IF EXISTS pg_catalog.gs_masking_policy_filters_oid_index; - -DROP INDEX IF EXISTS pg_catalog.gs_masking_policy_actions_policy_oid_index; -DROP INDEX IF EXISTS pg_catalog.gs_masking_policy_actions_row_index; -DROP INDEX IF EXISTS pg_catalog.gs_masking_policy_actions_oid_index; - -DROP INDEX IF EXISTS pg_catalog.gs_masking_policy_name_index; -DROP INDEX IF EXISTS pg_catalog.gs_masking_policy_oid_index; - -DROP TYPE IF EXISTS pg_catalog.gs_masking_policy_filters; -DROP TABLE IF EXISTS pg_catalog.gs_masking_policy_filters; - -DROP TYPE IF EXISTS pg_catalog.gs_masking_policy_actions; -DROP TABLE IF EXISTS pg_catalog.gs_masking_policy_actions; - -DROP TYPE IF EXISTS pg_catalog.gs_masking_policy; -DROP TABLE IF EXISTS pg_catalog.gs_masking_policy; - -DROP FUNCTION IF EXISTS dbms_job.isubmit_on_nodes(bigint, name, name, text, timestamp without time zone, text) cascade; -DROP FUNCTION IF EXISTS dbms_job.submit_on_nodes(name, name, text, timestamp without time zone, text, OUT integer) cascade; -DROP FUNCTION IF EXISTS pg_catalog.capture_view_to_json(text, integer) cascade; - --- 1. drop new system view gs_auditing(_xxx) -DROP VIEW IF EXISTS pg_catalog.gs_auditing_access CASCADE; -DROP VIEW IF EXISTS pg_catalog.gs_auditing_privilege CASCADE; -DROP VIEW IF EXISTS pg_catalog.gs_auditing CASCADE; - --- 2. drop system table and its index. -DROP INDEX IF EXISTS pg_catalog.gs_auditing_policy_name_index; -DROP INDEX IF EXISTS pg_catalog.gs_auditing_policy_oid_index; -DROP TYPE IF EXISTS pg_catalog.gs_auditing_policy; -DROP TABLE IF EXISTS pg_catalog.gs_auditing_policy; -DROP INDEX IF EXISTS pg_catalog.gs_auditing_policy_access_oid_index; -DROP INDEX IF EXISTS pg_catalog.gs_auditing_policy_access_row_index; -DROP TYPE IF EXISTS pg_catalog.gs_auditing_policy_access; -DROP TABLE IF EXISTS pg_catalog.gs_auditing_policy_access; -DROP INDEX IF EXISTS pg_catalog.gs_auditing_policy_filters_oid_index; -DROP INDEX IF EXISTS pg_catalog.gs_auditing_policy_filters_row_index; -DROP TYPE IF EXISTS pg_catalog.gs_auditing_policy_filters; -DROP TABLE IF EXISTS pg_catalog.gs_auditing_policy_filters; -DROP INDEX IF EXISTS pg_catalog.gs_auditing_policy_privileges_oid_index; -DROP INDEX IF EXISTS pg_catalog.gs_auditing_policy_privileges_row_index; -DROP TYPE IF EXISTS pg_catalog.gs_auditing_policy_privileges; -DROP TABLE IF EXISTS pg_catalog.gs_auditing_policy_privileges; - -DROP FUNCTION IF EXISTS pg_catalog.get_local_active_session() cascade; - - -DROP INDEX IF EXISTS pg_catalog.pg_asp_oid_index; -DROP TYPE IF EXISTS pg_catalog.pg_asp; -DROP TABLE IF EXISTS pg_catalog.pg_asp; - -DROP FUNCTION IF EXISTS pg_catalog.get_wait_event_info() cascade; - -DROP VIEW IF EXISTS pg_catalog.pgxc_wlm_session_history CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.pgxc_get_wlm_session_history() CASCADE; -DROP VIEW IF EXISTS pg_catalog.gs_wlm_session_history CASCADE; - -DROP VIEW IF EXISTS pg_catalog.pgxc_wlm_session_info CASCADE; -DROP VIEW IF EXISTS pg_catalog.gs_wlm_session_info_all CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.pgxc_get_wlm_session_info() CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.pgxc_get_wlm_session_info_bytime(text, timestamp without time zone, timestamp without time zone, integer) CASCADE; - - -DROP TABLE IF EXISTS pg_catalog.gs_wlm_session_query_info_all CASCADE; - -DO $$ -BEGIN - IF EXISTS( - SELECT tablename FROM pg_tables where tablename='gs_wlm_session_info') - THEN - DROP TABLE IF EXISTS pg_catalog.gs_wlm_session_info CASCADE; - END IF; -END $$; - -DO $$ -BEGIN - IF EXISTS( - SELECT viewname FROM pg_views where viewname='gs_wlm_session_info') - THEN - DROP VIEW IF EXISTS pg_catalog.gs_wlm_session_info CASCADE; - END IF; -END $$; - -DROP FUNCTION IF EXISTS pg_catalog.create_wlm_session_info(IN flag int) CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.pg_stat_get_wlm_session_info(OID) cascade; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5002; -CREATE OR REPLACE FUNCTION pg_catalog.pg_stat_get_wlm_session_info -(OID, - OUT datid oid, - OUT dbname text, - OUT schemaname text, - OUT nodename text, - OUT username text, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_band text, - OUT block_time bigint, - OUT start_time timestamp with time zone, - OUT finish_time timestamp with time zone, - OUT duration bigint, - OUT estimate_total_time bigint, - OUT status text, - OUT abort_info text, - OUT resource_pool text, - OUT control_group text, - OUT estimate_memory integer, - OUT min_peak_memory integer, - OUT max_peak_memory integer, - OUT average_peak_memory integer, - OUT memory_skew_percent integer, - OUT spill_info text, - OUT min_spill_size integer, - OUT max_spill_size integer, - OUT average_spill_size integer, - OUT spill_skew_percent integer, - OUT min_dn_time bigint, - OUT max_dn_time bigint, - OUT average_dn_time bigint, - OUT dntime_skew_percent integer, - OUT min_cpu_time bigint, - OUT max_cpu_time bigint, - OUT total_cpu_time bigint, - OUT cpu_skew_percent integer, - OUT min_peak_iops integer, - OUT max_peak_iops integer, - OUT average_peak_iops integer, - OUT iops_skew_percent integer, - OUT warning text, - OUT queryid bigint, - OUT query text, - OUT query_plan text, - OUT node_group text, - OUT cpu_top1_node_name text, - OUT cpu_top2_node_name text, - OUT cpu_top3_node_name text, - OUT cpu_top4_node_name text, - OUT cpu_top5_node_name text, - OUT mem_top1_node_name text, - OUT mem_top2_node_name text, - OUT mem_top3_node_name text, - OUT mem_top4_node_name text, - OUT mem_top5_node_name text, - OUT cpu_top1_value bigint, - OUT cpu_top2_value bigint, - OUT cpu_top3_value bigint, - OUT cpu_top4_value bigint, - OUT cpu_top5_value bigint, - OUT mem_top1_value bigint, - OUT mem_top2_value bigint, - OUT mem_top3_value bigint, - OUT mem_top4_value bigint, - OUT mem_top5_value bigint, - OUT top_mem_dn text, - OUT top_cpu_dn text) RETURNS setof record LANGUAGE INTERNAL VOLATILE NOT FENCED as 'pg_stat_get_wlm_session_info'; - - create table pg_catalog.gs_wlm_session_info -( - datid Oid, - dbname text, - schemaname text, - nodename text, - username text, - application_name text, - client_addr inet, - client_hostname text, - client_port int, - query_band text, - block_time bigint, - start_time timestamp with time zone, - finish_time timestamp with time zone, - duration bigint, - estimate_total_time bigint, - status text, - abort_info text, - resource_pool text, - control_group text, - estimate_memory int, - min_peak_memory int, - max_peak_memory int, - average_peak_memory int, - memory_skew_percent int, - spill_info text, - min_spill_size int, - max_spill_size int, - average_spill_size int, - spill_skew_percent int, - min_dn_time bigint, - max_dn_time bigint, - average_dn_time bigint, - dntime_skew_percent int, - min_cpu_time bigint, - max_cpu_time bigint, - total_cpu_time bigint, - cpu_skew_percent int, - min_peak_iops int, - max_peak_iops int, - average_peak_iops int, - iops_skew_percent int, - warning text, - queryid bigint NOT NULL, - query text, - query_plan text, - node_group text, - cpu_top1_node_name text, - cpu_top2_node_name text, - cpu_top3_node_name text, - cpu_top4_node_name text, - cpu_top5_node_name text, - mem_top1_node_name text, - mem_top2_node_name text, - mem_top3_node_name text, - mem_top4_node_name text, - mem_top5_node_name text, - cpu_top1_value bigint, - cpu_top2_value bigint, - cpu_top3_value bigint, - cpu_top4_value bigint, - cpu_top5_value bigint, - mem_top1_value bigint, - mem_top2_value bigint, - mem_top3_value bigint, - mem_top4_value bigint, - mem_top5_value bigint, - top_mem_dn text, - top_cpu_dn text -); - -CREATE VIEW pg_catalog.gs_wlm_session_info_all AS -SELECT * FROM pg_catalog.pg_stat_get_wlm_session_info(0); - -CREATE VIEW pg_catalog.gs_wlm_session_history AS -SELECT - S.datid, - S.dbname, - S.schemaname, - S.nodename, - S.username, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.query_band, - S.block_time, - S.start_time, - S.finish_time, - S.duration, - S.estimate_total_time, - S.status, - S.abort_info, - S.resource_pool, - S.control_group, - S.estimate_memory, - S.min_peak_memory, - S.max_peak_memory, - S.average_peak_memory, - S.memory_skew_percent, - S.spill_info, - S.min_spill_size, - S.max_spill_size, - S.average_spill_size, - S.spill_skew_percent, - S.min_dn_time, - S.max_dn_time, - S.average_dn_time, - S.dntime_skew_percent, - S.min_cpu_time, - S.max_cpu_time, - S.total_cpu_time, - S.cpu_skew_percent, - S.min_peak_iops, - S.max_peak_iops, - S.average_peak_iops, - S.iops_skew_percent, - S.warning, - S.queryid, - S.query, - S.query_plan, - S.node_group, - S.cpu_top1_node_name, - S.cpu_top2_node_name, - S.cpu_top3_node_name, - S.cpu_top4_node_name, - S.cpu_top5_node_name, - S.mem_top1_node_name, - S.mem_top2_node_name, - S.mem_top3_node_name, - S.mem_top4_node_name, - S.mem_top5_node_name, - S.cpu_top1_value, - S.cpu_top2_value, - S.cpu_top3_value, - S.cpu_top4_value, - S.cpu_top5_value, - S.mem_top1_value, - S.mem_top2_value, - S.mem_top3_value, - S.mem_top4_value, - S.mem_top5_value, - S.top_mem_dn, - S.top_cpu_dn -FROM pg_catalog.gs_wlm_session_info_all S; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_history() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_catalog.gs_wlm_session_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_info() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_catalog.gs_wlm_session_info'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_info_bytime(text, TIMESTAMP, TIMESTAMP, int) -RETURNS setof pg_catalog.gs_wlm_session_info -AS $$ -DECLARE - row_data gs_wlm_session_info%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_cn text; - BEGIN - IF $1 IN ('start_time', 'finish_time') THEN - - ELSE - raise WARNING 'Illegal character entered for function, colname must be start_time or finish_time'; - return; - END IF; - - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - query_str_cn := 'SELECT * FROM pg_catalog.gs_wlm_session_info where '||$1||'>'''''||$2||''''' and '||$1||'<'''''||$3||''''' limit '||$4; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_cn||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE VIEW pg_catalog.pgxc_wlm_session_history AS -SELECT * FROM pg_catalog.pgxc_get_wlm_session_history() AS -( -datid Oid, -dbname text, -schemaname text, -nodename text, -username text, -application_name text, -client_addr inet, -client_hostname text, -client_port int, -query_band text, -block_time bigint, -start_time timestamp with time zone, -finish_time timestamp with time zone, -duration bigint, -estimate_total_time bigint, -status text, -abort_info text, -resource_pool text, -control_group text, -estimate_memory int, -min_peak_memory int, -max_peak_memory int, -average_peak_memory int, -memory_skew_percent int, -spill_info text, -min_spill_size int, -max_spill_size int, -average_spill_size int, -spill_skew_percent int, -min_dn_time bigint, -max_dn_time bigint, -average_dn_time bigint, -dntime_skew_percent int, -min_cpu_time bigint, -max_cpu_time bigint, -total_cpu_time bigint, -cpu_skew_percent int, -min_peak_iops int, -max_peak_iops int, -average_peak_iops int, -iops_skew_percent int, -warning text, -queryid bigint, -query text, -query_plan text, -node_group text, -cpu_top1_node_name text, -cpu_top2_node_name text, -cpu_top3_node_name text, -cpu_top4_node_name text, -cpu_top5_node_name text, -mem_top1_node_name text, -mem_top2_node_name text, -mem_top3_node_name text, -mem_top4_node_name text, -mem_top5_node_name text, -cpu_top1_value bigint, -cpu_top2_value bigint, -cpu_top3_value bigint, -cpu_top4_value bigint, -cpu_top5_value bigint, -mem_top1_value bigint, -mem_top2_value bigint, -mem_top3_value bigint, -mem_top4_value bigint, -mem_top5_value bigint, -top_mem_dn text, -top_cpu_dn text -); - -CREATE VIEW pg_catalog.pgxc_wlm_session_info AS -SELECT * FROM pg_catalog.pgxc_get_wlm_session_info() AS -( - datid Oid, - dbname text, - schemaname text, - nodename text, - username text, - application_name text, - client_addr inet, - client_hostname text, - client_port int, - query_band text, - block_time bigint, - start_time timestamp with time zone, - finish_time timestamp with time zone, - duration bigint, - estimate_total_time bigint, - status text, - abort_info text, - resource_pool text, - control_group text, - estimate_memory int, - min_peak_memory int, - max_peak_memory int, - average_peak_memory int, - memory_skew_percent int, - spill_info text, - min_spill_size int, - max_spill_size int, - average_spill_size int, - spill_skew_percent int, - min_dn_time bigint, - max_dn_time bigint, - average_dn_time bigint, - dntime_skew_percent int, - min_cpu_time bigint, - max_cpu_time bigint, - total_cpu_time bigint, - cpu_skew_percent int, - min_peak_iops int, - max_peak_iops int, - average_peak_iops int, - iops_skew_percent int, - warning text, - queryid bigint, - query text, - query_plan text, - node_group text, - cpu_top1_node_name text, - cpu_top2_node_name text, - cpu_top3_node_name text, - cpu_top4_node_name text, - cpu_top5_node_name text, - mem_top1_node_name text, - mem_top2_node_name text, - mem_top3_node_name text, - mem_top4_node_name text, - mem_top5_node_name text, - cpu_top1_value bigint, - cpu_top2_value bigint, - cpu_top3_value bigint, - cpu_top4_value bigint, - cpu_top5_value bigint, - mem_top1_value bigint, - mem_top2_value bigint, - mem_top3_value bigint, - mem_top4_value bigint, - mem_top5_value bigint, - top_mem_dn text, - top_cpu_dn text -); - - -CREATE OR REPLACE FUNCTION pg_catalog.create_wlm_session_info(IN flag int) -RETURNS int -AS $$ -DECLARE - query_str text; - record_cnt int; - BEGIN - record_cnt := 0; - - query_str := 'SELECT * FROM pg_catalog.pg_stat_get_wlm_session_info(1)'; - - IF flag > 0 THEN - EXECUTE 'INSERT INTO pg_catalog.gs_wlm_session_info ' || query_str; - ELSE - EXECUTE query_str; - END IF; - - RETURN record_cnt; - END; $$ -LANGUAGE plpgsql NOT FENCED; - - -GRANT SELECT ON TABLE pg_catalog.gs_wlm_session_history TO PUBLIC; -GRANT SELECT ON TABLE pg_catalog.gs_wlm_session_info TO PUBLIC; -GRANT SELECT ON TABLE pg_catalog.gs_wlm_session_info_all TO PUBLIC; -GRANT SELECT ON TABLE pg_catalog.pgxc_wlm_session_history TO PUBLIC; -GRANT SELECT ON TABLE pg_catalog.pgxc_wlm_session_info TO PUBLIC; - -DROP FUNCTION IF EXISTS pg_catalog.gs_stat_activity_timeout(IN timeout_threshold int4, OUT datid oid, OUT pid INT8, OUT sessionid INT8, OUT usesysid oid, OUT application_name text, OUT query text, OUT xact_start timestamptz, OUT query_start timestamptz, OUT query_id INT8) CASCADE; - -DROP FUNCTION IF EXISTS pg_catalog.global_stat_activity_timeout(in execute_time int4, out nodename text, out datid oid, out pid int8, out sessionid int8, out usesysid oid, out application_name text, out query text, out xact_start timestamptz, out query_start timestamptz, out query_id int8) CASCADE; - -DROP FUNCTION IF EXISTS pg_catalog.series(name); - -DROP FUNCTION IF EXISTS pg_catalog.labels(name); - -DROP FUNCTION IF EXISTS pg_catalog.labels_count(name); - -drop aggregate if exists pg_catalog.spread(real); - -drop function if exists pg_catalog.spread_collect(real[], real[]); - -drop function if exists pg_catalog.spread_final(real[]); - -drop function if exists pg_catalog.spread_internal(real[], real); - -drop aggregate if exists pg_catalog.delta(anyelement); - -drop function if exists pg_catalog.delta_final(anyarray); - -drop function if exists pg_catalog.delta_internal(anyarray, anyelement); - -DROP VIEW IF EXISTS pg_catalog.pg_roles_v1 cascade; - -DROP VIEW IF EXISTS pg_catalog.pg_roles cascade; -CREATE OR REPLACE VIEW pg_catalog.pg_roles AS - SELECT - rolname, - rolsuper, - rolinherit, - rolcreaterole, - rolcreatedb, - rolcatupdate, - rolcanlogin, - rolreplication, - rolauditadmin, - rolsystemadmin, - rolconnlimit, - '********'::text as rolpassword, - rolvalidbegin, - rolvaliduntil, - rolrespool, - rolparentid, - roltabspace, - setconfig as rolconfig, - pg_authid.oid, - roluseft, - rolkind, - pgxc_group.group_name as nodegroup, - roltempspace, - rolspillspace - FROM pg_authid LEFT JOIN pg_db_role_setting s - ON (pg_authid.oid = setrole AND setdatabase = 0) - LEFT JOIN pgxc_group - ON (pg_authid.rolnodegroup = pgxc_group.oid); - -GRANT SELECT ON TABLE pg_catalog.pg_roles TO PUBLIC; - -DROP VIEW IF EXISTS pg_catalog.pg_user_v1 cascade; - -DROP VIEW IF EXISTS pg_catalog.pg_user cascade; -CREATE OR REPLACE VIEW pg_catalog.pg_user AS - SELECT - rolname AS usename, - pg_authid.oid AS usesysid, - rolcreatedb AS usecreatedb, - rolsuper AS usesuper, - rolcatupdate AS usecatupd, - rolreplication AS userepl, - '********'::text AS passwd, - rolvalidbegin AS valbegin, - rolvaliduntil AS valuntil, - rolrespool AS respool, - rolparentid AS parent, - roltabspace AS spacelimit, - setconfig AS useconfig, - pgxc_group.group_name AS nodegroup, - roltempspace AS tempspacelimit, - rolspillspace AS spillspacelimit - FROM pg_authid LEFT JOIN pg_db_role_setting s - ON (pg_authid.oid = setrole AND setdatabase = 0) - LEFT JOIN pgxc_group - ON (pg_authid.rolnodegroup = pgxc_group.oid) - WHERE rolcanlogin; - -GRANT SELECT ON TABLE pg_catalog.pg_user TO PUBLIC; - -DROP VIEW IF EXISTS pg_catalog.pg_shadow_v1 cascade; - -DROP VIEW IF EXISTS pg_catalog.pg_shadow cascade; -CREATE OR REPLACE VIEW pg_catalog.pg_shadow AS - SELECT - rolname AS usename, - pg_authid.oid AS usesysid, - rolcreatedb AS usecreatedb, - rolsuper AS usesuper, - rolcatupdate AS usecatupd, - rolreplication AS userepl, - rolpassword AS passwd, - rolvalidbegin AS valbegin, - rolvaliduntil AS valuntil, - rolrespool AS respool, - rolparentid AS parent, - roltabspace AS spacelimit, - setconfig AS useconfig, - roltempspace AS tempspacelimit, - rolspillspace AS spillspacelimit - FROM pg_authid LEFT JOIN pg_db_role_setting s - ON (pg_authid.oid = setrole AND setdatabase = 0) - WHERE rolcanlogin; - -DECLARE - user_name text; - query_str text; -BEGIN - SELECT SESSION_USER INTO user_name; - query_str := 'GRANT ALL ON TABLE pg_catalog.pg_shadow TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; -END; -/ - -DROP VIEW IF EXISTS pg_catalog.pg_rlspolicies_v1 cascade; - -DROP VIEW IF EXISTS pg_catalog.pg_rlspolicies cascade; -CREATE OR REPLACE VIEW pg_catalog.pg_rlspolicies AS - SELECT - N.nspname AS schemaname, - C.relname AS tablename, - pol.polname AS policyname, - CASE - WHEN pol.polpermissive THEN - 'PERMISSIVE' - ELSE - 'RESTRICTIVE' - END AS policypermissive, - CASE - WHEN pol.polroles = '{0}' THEN - string_to_array('public', ' ') - ELSE - ARRAY - ( - SELECT rolname - FROM pg_catalog.pg_roles - WHERE oid = ANY (pol.polroles) ORDER BY 1 - ) - END AS policyroles, - CASE pol.polcmd - WHEN 'r' THEN 'SELECT' - WHEN 'a' THEN 'INSERT' - WHEN 'w' THEN 'UPDATE' - WHEN 'd' THEN 'DELETE' - WHEN '*' THEN 'ALL' - END AS policycmd, - pg_catalog.pg_get_expr(pol.polqual, pol.polrelid) AS policyqual - FROM pg_catalog.pg_rlspolicy pol - JOIN pg_catalog.pg_class C ON (C.oid = pol.polrelid) - LEFT JOIN pg_catalog.pg_namespace N ON (N.oid = C.relnamespace); - -GRANT SELECT ON TABLE pg_catalog.pg_rlspolicies TO PUBLIC; - -DROP VIEW IF EXISTS pg_catalog.gs_wlm_user_info cascade; -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_user_info AS -SELECT - T.userid, - S.rolname AS username, - T.sysadmin, - T.rpoid, - R.respool_name AS respool, - T.parentid, - T.totalspace, - T.spacelimit, - T.childcount, - T.childlist -FROM pg_roles AS S, gs_wlm_get_user_info(NULL) AS T, pg_resource_pool AS R -WHERE S.oid = T.userid AND T.rpoid = R.oid; - -GRANT SELECT ON TABLE pg_catalog.gs_wlm_user_info TO PUBLIC; - -DROP FUNCTION IF EXISTS pg_catalog.gs_wlm_user_resource_info(CSTRING); -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC,5012; -CREATE FUNCTION pg_catalog.gs_wlm_user_resource_info(cstring, OUT userid oid, OUT used_memory int4, OUT total_memory int4, OUT used_cpu float, OUT total_cpu int4, OUT used_space int8, OUT total_space int8, OUT used_temp_space int8, OUT total_temp_space int8, OUT used_spill_space int8, OUT total_spill_space int8, OUT read_kbytes int8, OUT write_kbytes int8, OUT read_counts int8, OUT write_counts int8, OUT read_speed float, OUT write_speed float) returns setof record language internal stable rows 100 as 'gs_wlm_user_resource_info'; - -DROP VIEW IF EXISTS pg_catalog.pg_total_user_resource_info_oid CASCADE; -CREATE OR REPLACE VIEW pg_catalog.pg_total_user_resource_info_oid AS -SELECT * FROM gs_wlm_get_all_user_resource_info() AS -(userid Oid, - used_memory int, - total_memory int, - used_cpu float, - total_cpu int, - used_space bigint, - total_space bigint, - used_temp_space bigint, - total_temp_space bigint, - used_spill_space bigint, - total_spill_space bigint, - read_kbytes bigint, - write_kbytes bigint, - read_counts bigint, - write_counts bigint, - read_speed float, - write_speed float -); - -GRANT SELECT ON pg_catalog.pg_total_user_resource_info_oid TO public; - -DROP VIEW IF EXISTS pg_catalog.pg_total_user_resource_info cascade; -CREATE OR REPLACE VIEW pg_catalog.pg_total_user_resource_info AS -SELECT - S.usename AS username, - T.used_memory, - T.total_memory, - T.used_cpu, - T.total_cpu, - T.used_space, - T.total_space, - T.used_temp_space, - T.total_temp_space, - T.used_spill_space, - T.total_spill_space, - T.read_kbytes, - T.write_kbytes, - T.read_counts, - T.write_counts, - T.read_speed, - T.write_speed -FROM pg_user AS S, pg_total_user_resource_info_oid AS T -WHERE S.usesysid = T.userid; - -GRANT SELECT ON TABLE pg_catalog.pg_total_user_resource_info TO PUBLIC; - -DROP FUNCTION IF EXISTS pg_catalog.get_instr_workload_info(int4) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5000; -CREATE FUNCTION pg_catalog.get_instr_workload_info -( -int4, -OUT resourcepool_oid bigint, -OUT commit_counter integer, -OUT rollback_counter integer, -OUT resp_min bigint, -OUT resp_max bigint, -OUT resp_avg bigint, -OUT resp_total bigint, -OUT bg_commit_counter integer, -OUT bg_rollback_counter integer, -OUT bg_resp_min bigint, -OUT bg_resp_max bigint, -OUT bg_resp_avg bigint, -OUT bg_resp_total bigint -) -RETURNS setof record LANGUAGE INTERNAL VOLATILE NOT FENCED as 'get_instr_workload_info'; - - -DROP FUNCTION IF EXISTS pg_catalog.get_instr_workload_info(int4) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5000; -CREATE FUNCTION pg_catalog.get_instr_workload_info -( -int4, -OUT user_oid bigint, -OUT commit_counter bigint, -OUT rollback_counter bigint, -OUT resp_min bigint, -OUT resp_max bigint, -OUT resp_avg bigint, -OUT resp_total bigint, -OUT bg_commit_counter bigint, -OUT bg_rollback_counter bigint, -OUT bg_resp_min bigint, -OUT bg_resp_max bigint, -OUT bg_resp_avg bigint, -OUT bg_resp_total bigint -) -RETURNS setof record LANGUAGE INTERNAL VOLATILE NOT FENCED as 'get_instr_workload_info'; - --- roll back 3956 -DROP FUNCTION IF EXISTS pg_catalog.threadpool_status; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC,3956; -CREATE OR REPLACE FUNCTION pg_catalog.threadpool_status( - OUT node_name TEXT, - OUT group_id INT, - OUT bind_numa_id INT, - OUT bind_cpu_number INT, - OUT listener INT, - OUT worker_info TEXT, - OUT session_info TEXT) -RETURNS RECORD LANGUAGE INTERNAL as 'gs_threadpool_status'; - - -DROP FUNCTION IF EXISTS pg_catalog.table_skewness(text, OUT DNName text, OUT Num text, OUT Ratio text); -DROP FUNCTION IF EXISTS pg_catalog.distributed_count(IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text); - -CREATE OR REPLACE FUNCTION pg_catalog.distributed_count(IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - total_num bigint; - flag boolean; - special text := '[;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN _table_name, IN special; - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - RETURN; - END IF; - EXECUTE 'SELECT count(1) FROM ' || _table_name - INTO total_num; - - --Get the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true AND oid::text in ' || - '(SELECT regexp_split_to_table(nodeoids::text, '' '') FROM pgxc_class WHERE pcrelid=''' || _table_name || '''::regclass::oid)'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select ''''DN_name'''' as dnname1, count(1) as count1 from ' || $1 || ''''; - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.dnname1 := CASE - WHEN LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-length(row_name.node_name)) - ELSE SUBSTR(row_name.node_name,1,20) - END; - DNName := row_data.dnname1; - Num := row_data.count1; - IF total_num = 0 THEN - Ratio := 0.000 ||'%'; - ELSE - Ratio := ROUND(row_data.count1/total_num*100,3) || '%'; - END IF; - RETURN next; - END LOOP; - END LOOP; - - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.table_skewness(text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -declare -flag boolean; -special text := '[;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - return NEXT; - ELSE - RETURN QUERY EXECUTE 'SELECT * FROM distributed_count(''' || $1 || ''') ORDER BY num DESC, dnname'; - END IF; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -DROP FUNCTION if exists pg_catalog.pgxc_lock_for_transfer(OUT pgxc_lock_for_transfer bool, IN schemaName Name) cascade; -DROP FUNCTION if exists pg_catalog.pgxc_unlock_for_transfer(OUT pgxc_lock_for_transfer bool, IN schemaName Name) cascade; - -DROP VIEW IF EXISTS pg_catalog.gs_labels; - -DROP INDEX IF EXISTS pg_catalog.gs_policy_label_name_index; -DROP INDEX IF EXISTS pg_catalog.gs_policy_label_oid_index; - -DROP TYPE IF EXISTS pg_catalog.gs_policy_label; -DROP TABLE IF EXISTS pg_catalog.gs_policy_label; - -drop type if exists pg_catalog.gs_global_config cascade; -DROP TABLE IF EXISTS pg_catalog.gs_global_config cascade; - --- ---------------------------------------------------------------- --- rollback comm_check_connection_status --- ---------------------------------------------------------------- - -DROP FUNCTION IF EXISTS pg_catalog.comm_check_connection_status(OUT node_name text, OUT remote_name text, OUT remote_host text, OUT remote_port int4, OUT is_connected bool) CASCADE; diff --git a/src/include/catalog/upgrade_sql/open_gauss/rollback_catalog_otherdb/rollback-post_catalog_otherdb_92_200.sql b/src/include/catalog/upgrade_sql/open_gauss/rollback_catalog_otherdb/rollback-post_catalog_otherdb_92_200.sql index af912402c..e69de29bb 100644 --- a/src/include/catalog/upgrade_sql/open_gauss/rollback_catalog_otherdb/rollback-post_catalog_otherdb_92_200.sql +++ b/src/include/catalog/upgrade_sql/open_gauss/rollback_catalog_otherdb/rollback-post_catalog_otherdb_92_200.sql @@ -1,10674 +0,0 @@ - -DECLARE - user_name text; - query_str text; -BEGIN - SELECT SESSION_USER INTO user_name; - IF EXISTS (SELECT oid FROM pg_catalog.pg_class WHERE relname='statement_history') THEN - query_str := 'REVOKE SELECT on table dbe_perf.statement_history FROM public;'; - EXECUTE IMMEDIATE query_str; - query_str := 'GRANT ALL ON TABLE DBE_PERF.statement_history TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - query_str := 'GRANT ALL ON TABLE pg_catalog.statement_history TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - GRANT SELECT ON TABLE DBE_PERF.statement_history TO PUBLIC; - END IF; -END; -/ - - -DECLARE - user_name text; - query_str text; -BEGIN - SELECT SESSION_USER INTO user_name; - - IF EXISTS (SELECT oid FROM pg_catalog.pg_class WHERE relname='track_memory_context_detail') THEN - query_str := 'REVOKE INSERT,SELECT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON TABLE dbe_perf.track_memory_context_detail FROM ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - REVOKE SELECT ON TABLE dbe_perf.track_memory_context_detail FROM PUBLIC; - END IF; -END; -/ - -DO $DO$ -DECLARE - ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS DBE_PERF.get_global_full_sql_by_timestamp() cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_global_slow_sql_by_timestamp() cascade; - DROP VIEW IF EXISTS DBE_PERF.statement_history cascade; - end if; -END$DO$; - -DROP INDEX IF EXISTS pg_catalog.statement_history_time_idx; -DROP TABLE IF EXISTS pg_catalog.statement_history; - -CREATE unlogged table IF NOT EXISTS pg_catalog.statement_history( - db_name name, - schema_name name, - origin_node integer, - user_name name, - application_name text, - client_addr text, - client_port integer, - unique_query_id bigint, - debug_query_id bigint, - query text, - start_time timestamp with time zone, - finish_time timestamp with time zone, - slow_sql_threshold bigint, - transaction_id bigint, - thread_id bigint, - session_id bigint, - n_soft_parse bigint, - n_hard_parse bigint, - query_plan text, - n_returned_rows bigint, - n_tuples_fetched bigint, - n_tuples_returned bigint, - n_tuples_inserted bigint, - n_tuples_updated bigint, - n_tuples_deleted bigint, - n_blocks_fetched bigint, - n_blocks_hit bigint, - db_time bigint, - cpu_time bigint, - execution_time bigint, - parse_time bigint, - plan_time bigint, - rewrite_time bigint, - pl_execution_time bigint, - pl_compilation_time bigint, - data_io_time bigint, - net_send_info text, - net_recv_info text, - net_stream_send_info text, - net_stream_recv_info text, - lock_count bigint, - lock_time bigint, - lock_wait_count bigint, - lock_wait_time bigint, - lock_max_count bigint, - lwlock_count bigint, - lwlock_wait_count bigint, - lwlock_time bigint, - lwlock_wait_time bigint, - details text -); -REVOKE ALL on table pg_catalog.statement_history FROM public; -create index pg_catalog.statement_history_time_idx on pg_catalog.statement_history USING btree (start_time); - -DO $DO$ -DECLARE - ans boolean; - username text; - querystr text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE VIEW DBE_PERF.statement_history AS - select * from pg_catalog.statement_history; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_full_sql_by_timestamp - (in start_timestamp timestamp with time zone, - in end_timestamp timestamp with time zone, - OUT node_name name, - OUT db_name name, - OUT schema_name name, - OUT origin_node integer, - OUT user_name name, - OUT application_name text, - OUT client_addr text, - OUT client_port integer, - OUT unique_query_id bigint, - OUT debug_query_id bigint, - OUT query text, - OUT start_time timestamp with time zone, - OUT finish_time timestamp with time zone, - OUT slow_sql_threshold bigint, - OUT transaction_id bigint, - OUT thread_id bigint, - OUT session_id bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT query_plan text, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - OUT net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text, - OUT lock_count bigint, - OUT lock_time bigint, - OUT lock_wait_count bigint, - OUT lock_wait_time bigint, - OUT lock_max_count bigint, - OUT lwlock_count bigint, - OUT lwlock_wait_count bigint, - OUT lwlock_time bigint, - OUT lwlock_wait_time bigint, - OUT details text) - RETURNS setof record - AS $$ - DECLARE - row_data pg_catalog.statement_history%rowtype; - query_str text; - -- node name - node_names name[]; - each_node_name name; - BEGIN - -- Get all node names(CN + master DN) - node_names := ARRAY(SELECT pgxc_node.node_name FROM pgxc_node WHERE (node_type = 'C' or node_type = 'D') AND nodeis_active = true); - FOREACH each_node_name IN ARRAY node_names - LOOP - query_str := 'EXECUTE DIRECT ON (' || each_node_name || ') ''SELECT * FROM DBE_PERF.statement_history where start_time >= ''''' ||$1|| ''''' and start_time <= ''''' || $2 || ''''''''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := each_node_name; - db_name := row_data.db_name; - schema_name := row_data.schema_name; - origin_node := row_data.origin_node; - user_name := row_data.user_name; - application_name := row_data.application_name; - client_addr := row_data.client_addr; - client_port := row_data.client_port; - unique_query_id := row_data.unique_query_id; - debug_query_id := row_data.debug_query_id; - query := row_data.query; - start_time := row_data.start_time; - finish_time := row_data.finish_time; - slow_sql_threshold := row_data.slow_sql_threshold; - transaction_id := row_data.transaction_id; - thread_id := row_data.thread_id; - session_id := row_data.session_id; - n_soft_parse := row_data.n_soft_parse; - n_hard_parse := row_data.n_hard_parse; - query_plan := row_data.query_plan; - n_returned_rows := row_data.n_returned_rows; - n_tuples_fetched := row_data.n_tuples_fetched; - n_tuples_returned := row_data.n_tuples_returned; - n_tuples_inserted := row_data.n_tuples_inserted; - n_tuples_updated := row_data.n_tuples_updated; - n_tuples_deleted := row_data.n_tuples_deleted; - n_blocks_fetched := row_data.n_blocks_fetched; - n_blocks_hit := row_data.n_blocks_hit; - db_time := row_data.db_time; - cpu_time := row_data.cpu_time; - execution_time := row_data.execution_time; - parse_time := row_data.parse_time; - plan_time := row_data.plan_time; - rewrite_time := row_data.rewrite_time; - pl_execution_time := row_data.pl_execution_time; - pl_compilation_time := row_data.pl_compilation_time; - data_io_time := row_data.data_io_time; - net_send_info := row_data.net_send_info; - net_recv_info := row_data.net_recv_info; - net_stream_send_info := row_data.net_stream_send_info; - net_stream_recv_info := row_data.net_stream_recv_info; - lock_count := row_data.lock_count; - lock_time := row_data.lock_time; - lock_wait_count := row_data.lock_wait_count; - lock_wait_time := row_data.lock_wait_time; - lock_max_count := row_data.lock_max_count; - lwlock_count := row_data.lwlock_count; - lwlock_wait_count := row_data.lwlock_wait_count; - lwlock_time := row_data.lwlock_time; - lwlock_wait_time := row_data.lwlock_wait_time; - details := row_data.details; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_slow_sql_by_timestamp - (in start_timestamp timestamp with time zone, - in end_timestamp timestamp with time zone, - OUT node_name name, - OUT db_name name, - OUT schema_name name, - OUT origin_node integer, - OUT user_name name, - OUT application_name text, - OUT client_addr text, - OUT client_port integer, - OUT unique_query_id bigint, - OUT debug_query_id bigint, - OUT query text, - OUT start_time timestamp with time zone, - OUT finish_time timestamp with time zone, - OUT slow_sql_threshold bigint, - OUT transaction_id bigint, - OUT thread_id bigint, - OUT session_id bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT query_plan text, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - OUT net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text, - OUT lock_count bigint, - OUT lock_time bigint, - OUT lock_wait_count bigint, - OUT lock_wait_time bigint, - OUT lock_max_count bigint, - OUT lwlock_count bigint, - OUT lwlock_wait_count bigint, - OUT lwlock_time bigint, - OUT lwlock_wait_time bigint, - OUT details text) - RETURNS setof record - AS $$ - DECLARE - row_data pg_catalog.statement_history%rowtype; - row_name record; - query_str text; - -- node name - node_names name[]; - each_node_name name; - BEGIN - -- Get all node names(CN + master DN) - node_names := ARRAY(SELECT pgxc_node.node_name FROM pgxc_node WHERE (node_type = 'C' or node_type = 'D') AND nodeis_active = true); - FOREACH each_node_name IN ARRAY node_names - LOOP - query_str := 'EXECUTE DIRECT ON (' || each_node_name || ') ''SELECT * FROM DBE_PERF.statement_history where start_time >= ''''' ||$1|| ''''' and start_time <= ''''' || $2 || ''''' and (extract(epoch from (finish_time - start_time)) * 1000000) >= slow_sql_threshold '''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := each_node_name; - db_name := row_data.db_name; - schema_name := row_data.schema_name; - origin_node := row_data.origin_node; - user_name := row_data.user_name; - application_name := row_data.application_name; - client_addr := row_data.client_addr; - client_port := row_data.client_port; - unique_query_id := row_data.unique_query_id; - debug_query_id := row_data.debug_query_id; - query := row_data.query; - start_time := row_data.start_time; - finish_time := row_data.finish_time; - slow_sql_threshold := row_data.slow_sql_threshold; - transaction_id := row_data.transaction_id; - thread_id := row_data.thread_id; - session_id := row_data.session_id; - n_soft_parse := row_data.n_soft_parse; - n_hard_parse := row_data.n_hard_parse; - query_plan := row_data.query_plan; - n_returned_rows := row_data.n_returned_rows; - n_tuples_fetched := row_data.n_tuples_fetched; - n_tuples_returned := row_data.n_tuples_returned; - n_tuples_inserted := row_data.n_tuples_inserted; - n_tuples_updated := row_data.n_tuples_updated; - n_tuples_deleted := row_data.n_tuples_deleted; - n_blocks_fetched := row_data.n_blocks_fetched; - n_blocks_hit := row_data.n_blocks_hit; - db_time := row_data.db_time; - cpu_time := row_data.cpu_time; - execution_time := row_data.execution_time; - parse_time := row_data.parse_time; - plan_time := row_data.plan_time; - rewrite_time := row_data.rewrite_time; - pl_execution_time := row_data.pl_execution_time; - pl_compilation_time := row_data.pl_compilation_time; - data_io_time := row_data.data_io_time; - net_send_info := row_data.net_send_info; - net_recv_info := row_data.net_recv_info; - net_stream_send_info := row_data.net_stream_send_info; - net_stream_recv_info := row_data.net_stream_recv_info; - lock_count := row_data.lock_count; - lock_time := row_data.lock_time; - lock_wait_count := row_data.lock_wait_count; - lock_wait_time := row_data.lock_wait_time; - lock_max_count := row_data.lock_max_count; - lwlock_count := row_data.lwlock_count; - lwlock_wait_count := row_data.lwlock_wait_count; - lwlock_time := row_data.lwlock_time; - lwlock_wait_time := row_data.lwlock_wait_time; - details := row_data.details; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - DROP FUNCTION IF EXISTS pg_catalog.statement_detail_decode() CASCADE; - set local inplace_upgrade_next_system_object_oids = IUO_PROC, 5732; - CREATE OR REPLACE FUNCTION pg_catalog.statement_detail_decode - ( IN text, - IN text, - IN boolean) - RETURNS text LANGUAGE INTERNAL NOT FENCED as 'statement_detail_decode'; - - SELECT SESSION_USER INTO username; - querystr := 'GRANT ALL ON TABLE DBE_PERF.statement_history TO ' || quote_ident(username) || ';'; - EXECUTE IMMEDIATE querystr; - querystr := 'GRANT ALL ON TABLE pg_catalog.statement_history TO ' || quote_ident(username) || ';'; - EXECUTE IMMEDIATE querystr; - GRANT SELECT ON TABLE DBE_PERF.statement_history TO PUBLIC; - end if; -END$DO$; - -CREATE OR REPLACE PROCEDURE proc_hotkeyview() -AS - BEGIN - IF EXISTS (SELECT oid FROM pg_catalog.pg_class WHERE relname='global_stat_hotkeys_info') THEN - REVOKE SELECT ON TABLE global_stat_hotkeys_info FROM PUBLIC; - END IF; - END; -/ - -CALL proc_hotkeyview(); -DROP PROCEDURE IF EXISTS proc_hotkeyview; - -CREATE OR REPLACE PROCEDURE proc_matview() -AS - BEGIN - IF EXISTS (SELECT oid FROM pg_catalog.pg_class WHERE relname='gs_matview') THEN - REVOKE SELECT ON TABLE pg_catalog.gs_matview FROM PUBLIC; - END IF; - IF EXISTS (SELECT oid FROM pg_catalog.pg_class WHERE relname='gs_matview_dependency') THEN - REVOKE SELECT ON TABLE pg_catalog.gs_matview_dependency FROM PUBLIC; - END IF; - IF EXISTS (SELECT oid FROM pg_catalog.pg_class WHERE relname='gs_matviews') THEN - REVOKE SELECT ON TABLE pg_catalog.gs_matviews FROM PUBLIC; - END IF; - IF EXISTS (SELECT oid FROM pg_catalog.pg_class WHERE relname='track_memory_context_detail') THEN - REVOKE SELECT ON TABLE dbe_perf.track_memory_context_detail FROM PUBLIC; - END IF; - END; -/ - -CALL proc_matview(); -DROP PROCEDURE IF EXISTS proc_matview; - -create or replace function table_skewness(table_name text, column_name text, - OUT seqNum text, OUT Num text, OUT Ratio text, row_num text default '0') -RETURNS setof record -AS $$ -DECLARE - tolal_num text; - row_data record; - execute_query text; - dist_type text; - num int :=0; - sqltmp text; - BEGIN - sqltmp := 'select count(*) from pg_attribute join pg_class on pg_attribute.attrelid = pg_class.oid where pg_class.relname =' || quote_literal(table_name) ||' and pg_attribute.attname = ' ||quote_literal($2); - EXECUTE immediate sqltmp into num; - if num = 0 then - return; - end if; - -- make sure not to affect the logic for non-range/list distribution tables - EXECUTE immediate 'select a.pclocatortype from (pgxc_class a join pg_class b on a.pcrelid = b.oid join pg_namespace c on c.oid = b.relnamespace) - where b.relname = quote_ident(:1) and c.nspname in (select unnest(current_schemas(false)))' into dist_type using table_name; - if dist_type <> 'G' and dist_type <> 'L' then - dist_type = 'H'; -- dist type used to be hardcoded as 'H' - end if; - - if row_num = 0 then - EXECUTE 'select count(1) from ' || $1 into tolal_num; - execute_query = 'select seqNum, count(1) as num - from (select pg_catalog.table_data_skewness(row(' || $2 ||'), ''' || dist_type || ''') as seqNum from ' || $1 || - ') group by seqNum order by num DESC'; - else - tolal_num = row_num; - execute_query = 'select seqNum, count(1) as num - from (select pg_catalog.table_data_skewness(row(' || $2 ||'), ''' || dist_type || ''') as seqNum from ' || $1 || - ' limit ' || row_num ||') group by seqNum order by num DESC'; - end if; - - if tolal_num = 0 then - seqNum = 0; - Num = 0; - Ratio = ROUND(0, 3) || '%'; - return; - end if; - - for row_data in EXECUTE execute_query loop - seqNum = row_data.seqNum; - Num = row_data.num; - Ratio = ROUND(row_data.num / tolal_num * 100, 3) || '%'; - RETURN next; - end loop; - END; -$$LANGUAGE plpgsql NOT FENCED; -drop function if exists report_application_error(text,integer); - -create or replace function table_skewness(table_name text, column_name text, - OUT seqNum text, OUT Num text, OUT Ratio text, row_num text default '0') -RETURNS setof record -AS $$ -DECLARE - tolal_num text; - row_data record; - execute_query text; - dist_type text; - BEGIN - -- make sure not to affect the logic for non-range/list distribution tables - EXECUTE immediate 'select a.pclocatortype from (pgxc_class a join pg_class b on a.pcrelid = b.oid join pg_namespace c on c.oid = b.relnamespace) - where b.relname = quote_ident(:1) and c.nspname in (select unnest(current_schemas(false)))' into dist_type using table_name; - if dist_type <> 'G' and dist_type <> 'L' then - dist_type = 'H'; -- dist type used to be hardcoded as 'H' - end if; - - if row_num = 0 then - EXECUTE 'select count(1) from ' || $1 into tolal_num; - execute_query = 'select seqNum, count(1) as num - from (select pg_catalog.table_data_skewness(row(' || $2 ||'), ''' || dist_type || ''') as seqNum from ' || $1 || - ') group by seqNum order by num DESC'; - else - tolal_num = row_num; - execute_query = 'select seqNum, count(1) as num - from (select pg_catalog.table_data_skewness(row(' || $2 ||'), ''' || dist_type || ''') as seqNum from ' || $1 || - ' limit ' || row_num ||') group by seqNum order by num DESC'; - end if; - - if tolal_num = 0 then - seqNum = 0; - Num = 0; - Ratio = ROUND(0, 3) || '%'; - return; - end if; - - for row_data in EXECUTE execute_query loop - seqNum = row_data.seqNum; - Num = row_data.num; - Ratio = ROUND(row_data.num / tolal_num * 100, 3) || '%'; - RETURN next; - end loop; - END; -$$LANGUAGE plpgsql NOT FENCED; - - -create or replace function pg_catalog.pgxc_cgroup_map_ng_conf(IN ngname text) -returns bool -AS $$ -declare - query_string text; - flag boolean; -begin - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN ngname, IN special; - IF flag = true THEN - return false; - ELSE - query_string := 'execute direct on ALL ''SELECT * from pg_catalog.gs_cgroup_map_ng_conf(''''' || ngname || ''''')'''; - execute query_string; - END IF; - return true; -end; -$$language plpgsql NOT FENCED; - -DO $$ -DECLARE -ans boolean; -user_name text; -query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from - (select * from pg_class where relname = 'db_users' and relnamespace=11 limit 1) into ans; - if ans = true then - GRANT SELECT on pg_catalog.db_users TO public; - - SELECT SESSION_USER INTO user_name; - query_str := 'REVOKE ALL on pg_catalog.db_users FROM ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - end if; -END $$; - -DO $DO$ -DECLARE - ans boolean; - user_name text; - global_query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_os_runtime - (OUT node_name name, OUT id integer, OUT name text, OUT value numeric, OUT comments text, OUT cumulative boolean) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.os_runtime%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.os_runtime'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - id := row_data.id; - name := row_data.name; - value := row_data.value; - comments := row_data.comments; - cumulative := row_data.cumulative; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_os_threads() - RETURNS setof DBE_PERF.os_threads - AS $$ - DECLARE - row_data DBE_PERF.os_threads%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.os_threads'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_instance_time - (OUT node_name name, OUT stat_id integer, OUT stat_name text, OUT value bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.instance_time%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all CN DN node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.instance_time'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - stat_id := row_data.stat_id; - stat_name := row_data.stat_name; - value := row_data.value; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_stat - (OUT node_name name, OUT sessid text, OUT statid integer, OUT statname text, OUT statunit text, OUT value bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.session_stat%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.session_stat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - sessid := row_data.sessid; - statid := row_data.statid; - statname := row_data.statname; - statunit := row_data.statunit; - value := row_data.value; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_time - (OUT node_name name, OUT sessid text, OUT stat_id integer, OUT stat_name text, OUT value bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.session_time%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.session_time'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - sessid := row_data.sessid; - stat_id := row_data.stat_id; - stat_name := row_data.stat_name; - value := row_data.value; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_memory - (OUT node_name name, OUT sessid text, OUT init_mem integer, OUT used_mem integer, OUT peak_mem integer) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.session_memory%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.session_memory'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - sessid := row_data.sessid; - init_mem := row_data.init_mem; - used_mem := row_data.used_mem; - peak_mem := row_data.peak_mem; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_memory_detail - (OUT node_name name, OUT sessid text, OUT sesstype text, OUT contextname text, OUT level smallint, - OUT parent text, OUT totalsize bigint, OUT freesize bigint, OUT usedsize bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.session_memory_detail%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.session_memory_detail'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - sessid := row_data.sessid; - sesstype := row_data.sesstype; - contextname := row_data.contextname; - level := row_data.level; - parent := row_data.parent; - totalsize := row_data.totalsize; - freesize := row_data.freesize; - usedsize := row_data.usedsize; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_thread_wait_status() - RETURNS setof DBE_PERF.thread_wait_status - AS $$ - DECLARE - row_data DBE_PERF.thread_wait_status%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all cn dn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.thread_wait_status'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_history_table() - RETURNS setof DBE_PERF.operator_history_table - AS $$ - DECLARE - row_data DBE_PERF.operator_history_table%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the CN node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.operator_history_table '''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_history() - RETURNS setof DBE_PERF.operator_history - AS $$ - DECLARE - row_data DBE_PERF.operator_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.operator_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_runtime() - RETURNS setof DBE_PERF.operator_runtime - AS $$ - DECLARE - row_data DBE_PERF.operator_runtime%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.operator_runtime'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_complex_history() - RETURNS setof DBE_PERF.statement_complex_history - AS $$ - DECLARE - row_data DBE_PERF.statement_complex_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement_complex_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_complex_runtime() - RETURNS setof DBE_PERF.statement_complex_runtime - AS $$ - DECLARE - row_data DBE_PERF.statement_complex_runtime%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.statement_complex_runtime'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_shared_memory_detail - (OUT node_name name, OUT contextname text, OUT level smallint, OUT parent text, - OUT totalsize bigint, OUT freesize bigint, OUT usedsize bigint) - RETURNS setof record - AS $$ - DECLARE - row_name record; - row_data DBE_PERF.shared_memory_detail%rowtype; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.shared_memory_detail'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - contextname := row_data.contextname; - level := row_data.level; - parent := row_data.parent; - totalsize := row_data.totalsize; - freesize := row_data.freesize; - usedsize := row_data.usedsize; - RETURN NEXT; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_all_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_all_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_all_indexes - (OUT schemaname name, OUT toastrelschemaname name, OUT toastrelname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_blks_read AS idx_blks_read, - T.idx_blks_hit AS idx_blks_hit - FROM DBE_PERF.statio_all_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_all_sequences - (OUT node_name name, OUT relid oid, OUT schemaname name, - OUT relname name, OUT blks_read bigint, OUT blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_all_sequences'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - blks_read := row_data.blks_read; - blks_hit := row_data.blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint, - OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, - OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_all_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_all_tables - (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT heap_blks_read bigint, - OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, - OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - C.relname AS relname, - C.schemaname AS schemaname, - O.relname AS toastrelname, - N.nspname AS toastrelschemaname, - C.heap_blks_read AS heap_blks_read, - C.heap_blks_hit AS heap_blks_hit, - C.idx_blks_read AS idx_blks_read, - C.idx_blks_hit AS idx_blks_hit, - C.toast_blks_read AS toast_blks_read, - C.toast_blks_hit AS toast_blks_hit, - C.tidx_blks_read AS tidx_blks_read, - C.tidx_blks_hit AS tidx_blks_hit - FROM DBE_PERF.statio_all_tables C - LEFT JOIN pg_class O ON C.relid = O.reltoastrelid - LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_sys_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_sys_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_sys_indexes - (OUT schemaname name, OUT toastrelschemaname name, OUT toastrelname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_blks_read AS idx_blks_read, - T.idx_blks_hit AS idx_blks_hit - FROM DBE_PERF.statio_sys_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_sys_sequences - (OUT node_name name, OUT relid oid, OUT schemaname name, - OUT relname name, OUT blks_read bigint, OUT blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_sys_sequences'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - blks_read := row_data.blks_read; - blks_hit := row_data.blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_sys_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint, - OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, - OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_sys_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_sys_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT heap_blks_read bigint, OUT heap_blks_hit bigint, - OUT idx_blks_read bigint, OUT idx_blks_hit bigint, - OUT toast_blks_read bigint, OUT toast_blks_hit bigint, - OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - C.schemaname AS schemaname, - C.relname AS relname, - O.relname AS toastrelname, - N.nspname AS toastrelschemaname, - C.heap_blks_read AS heap_blks_read, - C.heap_blks_hit AS heap_blks_hit, - C.idx_blks_read AS idx_blks_read, - C.idx_blks_hit AS idx_blks_hit, - C.toast_blks_read AS toast_blks_read, - C.toast_blks_hit AS toast_blks_hit, - C.tidx_blks_read AS tidx_blks_read, - C.tidx_blks_hit AS tidx_blks_hit - FROM DBE_PERF.statio_sys_tables C - LEFT JOIN pg_class O ON C.relid = O.reltoastrelid - LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_user_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_user_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_user_indexes - (OUT schemaname name, OUT toastrelschemaname name, OUT toastrelname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_blks_read AS idx_blks_read, - T.idx_blks_hit AS idx_blks_hit - FROM DBE_PERF.statio_user_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_user_sequences - (OUT node_name name, OUT relid oid, OUT schemaname name, - OUT relname name, OUT blks_read bigint, OUT blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_user_sequences'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - blks_read := row_data.blks_read; - blks_hit := row_data.blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_user_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint, - OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, - OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_user_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_user_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT heap_blks_read bigint, OUT heap_blks_hit bigint, - OUT idx_blks_read bigint, OUT idx_blks_hit bigint, - OUT toast_blks_read bigint, OUT toast_blks_hit bigint, - OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - C.schemaname AS schemaname, - C.relname AS relname, - O.relname AS toastrelname, - N.nspname AS toastrelschemaname, - C.heap_blks_read AS heap_blks_read, - C.heap_blks_hit AS heap_blks_hit, - C.idx_blks_read AS idx_blks_read, - C.idx_blks_hit AS idx_blks_hit, - C.toast_blks_read AS toast_blks_read, - C.toast_blks_hit AS toast_blks_hit, - C.tidx_blks_read AS tidx_blks_read, - C.tidx_blks_hit AS tidx_blks_hit - FROM DBE_PERF.statio_user_tables C - LEFT JOIN pg_class O ON C.relid = O.reltoastrelid - LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_dn_stat_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_all_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_dn_stat_all_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd, - T.n_live_tup AS n_live_tup, - T.n_dead_tup AS n_dead_tup, - T.last_vacuum AS last_vacuum, - T.last_autovacuum AS last_autovacuum, - T.last_analyze AS last_analyze, - T.last_autoanalyze AS last_autoanalyze, - T.vacuum_count AS vacuum_count, - T.autovacuum_count AS autovacuum_count, - T.analyze_count AS analyze_count, - T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_all_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_cn_stat_all_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd, - T.n_live_tup AS n_live_tup, - T.n_dead_tup AS n_dead_tup, - T.last_vacuum AS last_vacuum, - T.last_autovacuum AS last_autovacuum, - T.last_analyze AS last_analyze, - T.last_autoanalyze AS last_autoanalyze, - T.vacuum_count AS vacuum_count, - T.autovacuum_count AS autovacuum_count, - T.analyze_count AS analyze_count, - T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_all_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid - WHERE T.schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_all_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, - OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_all_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_all_indexes - (OUT schemaname name, OUT relname name, OUT indexrelname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_scan AS idx_scan, - T.idx_tup_read AS idx_tup_read, - T.idx_tup_fetch AS idx_tup_fetch - FROM DBE_PERF.stat_all_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_sys_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, - OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_sys_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_sys_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, - OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd, - T.n_live_tup AS n_live_tup, - T.n_dead_tup AS n_dead_tup, - T.last_vacuum AS last_vacuum, - T.last_autovacuum AS last_autovacuum, - T.last_analyze AS last_analyze, - T.last_autoanalyze AS last_autoanalyze, - T.vacuum_count AS vacuum_count, - T.autovacuum_count AS autovacuum_count, - T.analyze_count AS analyze_count, - T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_sys_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_sys_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, - OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_sys_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_sys_indexes - (OUT schemaname name, OUT relname name, OUT indexrelname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_scan AS idx_scan, - T.idx_tup_read AS idx_tup_read, - T.idx_tup_fetch AS idx_tup_fetch - FROM DBE_PERF.stat_sys_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_user_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, - OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''D'')'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_user_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_user_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, - OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''D'')'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd, - T.n_live_tup AS n_live_tup, - T.n_dead_tup AS n_dead_tup, - T.last_vacuum AS last_vacuum, - T.last_autovacuum AS last_autovacuum, - T.last_analyze AS last_analyze, - T.last_autoanalyze AS last_autoanalyze, - T.vacuum_count AS vacuum_count, - T.autovacuum_count AS autovacuum_count, - T.analyze_count AS analyze_count, - T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_user_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_user_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, - OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_user_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_user_indexes - (OUT schemaname name, OUT relname name, OUT indexrelname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_scan AS idx_scan, - T.idx_tup_read AS idx_tup_read, - T.idx_tup_fetch AS idx_tup_fetch - FROM DBE_PERF.stat_user_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_database - (OUT node_name name, OUT datid oid, OUT datname name, OUT numbackends integer, OUT xact_commit bigint, - OUT xact_rollback bigint, OUT blks_read bigint, OUT blks_hit bigint, OUT tup_returned bigint, OUT tup_fetched bigint, - OUT tup_inserted bigint, OUT tup_updated bigint, OUT tup_deleted bigint, OUT conflicts bigint, OUT temp_files bigint, - OUT temp_bytes bigint, OUT deadlocks bigint, OUT blk_read_time double precision, OUT blk_write_time double precision, - OUT stats_reset timestamp with time zone) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.stat_database%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_database'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - datid := row_data.datid; - datname := row_data.datname; - numbackends := row_data.numbackends; - xact_commit := row_data.xact_commit; - xact_rollback := row_data.xact_rollback; - blks_read := row_data.blks_read; - blks_hit := row_data.blks_hit; - tup_returned := row_data.tup_returned; - tup_fetched := row_data.tup_fetched; - tup_inserted := row_data.tup_inserted; - tup_updated := row_data.tup_updated; - tup_deleted := row_data.tup_deleted; - conflicts := row_data.conflicts; - temp_files := row_data.temp_files; - temp_bytes := row_data.temp_bytes; - deadlocks := row_data.deadlocks; - blk_read_time := row_data.blk_read_time; - blk_write_time := row_data.blk_write_time; - stats_reset := row_data.stats_reset; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_database_conflicts - (OUT node_name name, OUT datid oid, OUT datname name, OUT confl_tablespace bigint, - OUT confl_lock bigint, OUT confl_snapshot bigint, OUT confl_bufferpin bigint, OUT confl_deadlock bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.stat_database_conflicts%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_database_conflicts'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - datid := row_data.datid; - datname := row_data.datname; - confl_tablespace := row_data.confl_tablespace; - confl_lock := row_data.confl_lock; - confl_snapshot := row_data.confl_snapshot; - confl_bufferpin := row_data.confl_bufferpin; - confl_deadlock := row_data.confl_deadlock; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_sys_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, - OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.stat_xact_sys_tables%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_xact_sys_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_xact_sys_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, - OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_sys_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_user_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, - OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.stat_xact_user_tables%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''D'')'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_xact_user_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_xact_user_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, - OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''D'')'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_user_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_user_functions - (OUT node_name name, OUT funcid oid, OUT schemaname name, OUT funcname name, OUT calls bigint, - OUT total_time double precision, OUT self_time double precision) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.stat_user_functions%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_user_functions'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - funcid := row_data.funcid; - schemaname := row_data.schemaname; - funcname := row_data.funcname; - calls := row_data.calls; - total_time := row_data.total_time; - self_time := row_data.self_time; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_user_functions - (OUT node_name name, OUT funcid oid, OUT schemaname name, OUT funcname name, OUT calls bigint, - OUT total_time double precision, OUT self_time double precision) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.stat_xact_user_functions%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_xact_user_functions'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - funcid := row_data.funcid; - schemaname := row_data.schemaname; - funcname := row_data.funcname; - calls := row_data.calls; - total_time := row_data.total_time; - self_time := row_data.self_time; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_bad_block - (OUT node_name TEXT, OUT databaseid INT4, OUT tablespaceid INT4, OUT relfilenode INT4, OUT forknum INT4, - OUT error_count INT4, OUT first_time timestamp with time zone, OUT last_time timestamp with time zone) - RETURNS setof record - AS $$ - DECLARE - row_name record; - each_node_out record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_bad_block'''; - FOR each_node_out IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - databaseid := each_node_out.databaseid; - tablespaceid := each_node_out.tablespaceid; - relfilenode := each_node_out.relfilenode; - forknum := each_node_out.forknum; - error_count := each_node_out.error_count; - first_time := each_node_out.first_time; - last_time := each_node_out.last_time; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_file_redo_iostat - (OUT node_name name, OUT phywrts bigint, OUT phyblkwrt bigint, OUT writetim bigint, - OUT avgiotim bigint, OUT lstiotim bigint, OUT miniotim bigint, OUT maxiowtm bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.file_redo_iostat%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.file_redo_iostat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - phywrts := row_data.phywrts; - phyblkwrt := row_data.phyblkwrt; - writetim := row_data.writetim; - avgiotim := row_data.avgiotim; - lstiotim := row_data.lstiotim; - miniotim := row_data.miniotim; - maxiowtm := row_data.maxiowtm; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_rel_iostat - (OUT node_name name, OUT phyrds bigint, - OUT phywrts bigint, OUT phyblkrd bigint, OUT phyblkwrt bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.local_rel_iostat%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.local_rel_iostat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - phyrds := row_data.phyrds; - phywrts := row_data.phywrts; - phyblkrd := row_data.phyblkrd; - phyblkwrt := row_data.phyblkwrt; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_file_iostat - (OUT node_name name, OUT filenum oid, OUT dbid oid, OUT spcid oid, OUT phyrds bigint, - OUT phywrts bigint, OUT phyblkrd bigint, OUT phyblkwrt bigint, OUT readtim bigint, - OUT writetim bigint, OUT avgiotim bigint, OUT lstiotim bigint, OUT miniotim bigint, OUT maxiowtm bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.file_iostat%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.file_iostat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - filenum := row_data.filenum; - dbid := row_data.dbid; - spcid := row_data.spcid; - phyrds := row_data.phyrds; - phywrts := row_data.phywrts; - phyblkrd := row_data.phyblkrd; - phyblkwrt := row_data.phyblkwrt; - readtim := row_data.readtim; - writetim := row_data.writetim; - avgiotim := row_data.avgiotim; - lstiotim := row_data.lstiotim; - miniotim := row_data.miniotim; - maxiowtm := row_data.maxiowtm; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_locks - (OUT node_name name, - OUT locktype text, - OUT database oid, - OUT relation oid, - OUT page integer, - OUT tuple smallint, - OUT virtualxid text, - OUT transactionid xid, - OUT classid oid, - OUT objid oid, - OUT objsubid smallint, - OUT virtualtransaction text, - OUT pid bigint, - OUT mode text, - OUT granted boolean, - OUT fastpath boolean) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.locks%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.locks'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - locktype := row_data.locktype; - database := row_data.database; - relation := row_data.relation; - page := row_data.page; - tuple := row_data.tuple; - virtualxid := row_data.virtualxid; - transactionid := row_data.classid; - objid := row_data.objid; - objsubid := row_data.objsubid; - virtualtransaction := row_data.virtualtransaction; - pid := row_data.pid; - mode := row_data.mode; - granted := row_data.granted; - fastpath := row_data.fastpath; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_replication_slots - (OUT node_name name, - OUT slot_name text, - OUT plugin text, - OUT slot_type text, - OUT datoid oid, - OUT database name, - OUT active boolean, - OUT x_min xid, - OUT catalog_xmin xid, - OUT restart_lsn text, - OUT dummy_standby boolean) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.replication_slots%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.replication_slots'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - slot_name := row_data.slot_name; - plugin := row_data.plugin; - slot_type := row_data.slot_type; - datoid := row_data.datoid; - database := row_data.database; - active := row_data.active; - x_min := row_data.xmin; - catalog_xmin := row_data.catalog_xmin; - restart_lsn := row_data.restart_lsn; - dummy_standby := row_data.dummy_standby; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_bgwriter_stat - (OUT node_name name, - OUT checkpoints_timed bigint, - OUT checkpoints_req bigint, - OUT checkpoint_write_time double precision, - OUT checkpoint_sync_time double precision, - OUT buffers_checkpoint bigint, - OUT buffers_clean bigint, - OUT maxwritten_clean bigint, - OUT buffers_backend bigint, - OUT buffers_backend_fsync bigint, - OUT buffers_alloc bigint, - OUT stats_reset timestamp with time zone) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.bgwriter_stat%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.bgwriter_stat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - checkpoints_timed := row_data.checkpoints_timed; - checkpoints_req := row_data.checkpoints_req; - checkpoint_write_time := row_data.checkpoint_write_time; - checkpoint_sync_time := row_data.checkpoint_sync_time; - buffers_checkpoint := row_data.buffers_checkpoint; - buffers_clean := row_data.buffers_clean; - maxwritten_clean := row_data.maxwritten_clean; - buffers_backend := row_data.buffers_backend; - buffers_backend_fsync := row_data.buffers_backend_fsync; - buffers_alloc := row_data.buffers_alloc; - stats_reset := row_data.stats_reset; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_replication_stat - (OUT node_name name, - OUT pid bigint, - OUT usesysid oid, - OUT usename name, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT backend_start timestamp with time zone, - OUT state text, - OUT sender_sent_location text, - OUT receiver_write_location text, - OUT receiver_flush_location text, - OUT receiver_replay_location text, - OUT sync_priority integer, - OUT sync_state text) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.replication_stat%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.replication_stat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - pid := row_data.pid; - usesysid := row_data.usesysid; - usename := row_data.usename; - client_addr := row_data.client_addr; - client_hostname := row_data.client_hostname; - client_port := row_data.client_port; - state := row_data.state; - sender_sent_location := row_data.sender_sent_location; - receiver_write_location := row_data.receiver_write_location; - receiver_flush_location := row_data.receiver_flush_location; - receiver_replay_location := row_data.receiver_replay_location; - sync_priority := row_data.sync_priority; - sync_state := row_data.sync_state; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_transactions_running_xacts() - RETURNS setof DBE_PERF.transactions_running_xacts - AS $$ - DECLARE - row_data DBE_PERF.transactions_running_xacts%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all cn dn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.transactions_running_xacts'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_transactions_running_xacts() - RETURNS setof DBE_PERF.transactions_running_xacts - AS $$ - DECLARE - row_data DBE_PERF.transactions_running_xacts%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.transactions_running_xacts'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_transactions_prepared_xacts() - RETURNS setof DBE_PERF.transactions_prepared_xacts - AS $$ - DECLARE - row_data DBE_PERF.transactions_prepared_xacts%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all cn dn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.transactions_prepared_xacts'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_transactions_prepared_xacts() - RETURNS setof DBE_PERF.transactions_prepared_xacts - AS $$ - DECLARE - row_data DBE_PERF.transactions_prepared_xacts%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.transactions_prepared_xacts'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statement() - RETURNS setof DBE_PERF.statement - AS $$ - DECLARE - row_data DBE_PERF.statement%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_count() - RETURNS setof DBE_PERF.statement_count - AS $$ - DECLARE - row_data DBE_PERF.statement_count%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement_count'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_config_settings - (out node_name text, - out name text, - out setting text, - out unit text, - out category text, - out short_desc text, - out extra_desc text, - out context text, - out vartype text, - out source text, - out min_val text, - out max_val text, - out enumvals text[], - out boot_val text, - out reset_val text, - out sourcefile text, - out sourceline integer) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.config_settings%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.config_settings'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - name := row_data.name; - setting := row_data.setting; - unit := row_data.unit; - category := row_data.category; - short_desc := row_data.short_desc; - extra_desc := row_data.extra_desc; - context := row_data.context; - vartype := row_data.vartype; - source := row_data.source; - min_val := row_data.min_val; - max_val := row_data.max_val; - enumvals := row_data.enumvals; - boot_val := row_data.boot_val; - reset_val := row_data.reset_val; - sourcefile := row_data.sourcefile; - sourceline := row_data.sourceline; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_wait_events() - RETURNS setof DBE_PERF.wait_events - AS $$ - DECLARE - row_data DBE_PERF.wait_events%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.wait_events'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_user_login() - RETURNS SETOF DBE_PERF.user_login - AS $$ - DECLARE - ROW_DATA DBE_PERF.user_login%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE=''C'' AND nodeis_active = true'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.user_login'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_record_reset_time(OUT node_name text, OUT reset_time timestamp with time zone) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select * from get_node_stat_reset_time()'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - reset_time := row_data.get_node_stat_reset_time; - return next; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.global_threadpool_status() - RETURNS SETOF DBE_PERF.local_threadpool_status - AS $$ - DECLARE - ROW_DATA DBE_PERF.local_threadpool_status%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'') AND nodeis_active=true'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.local_threadpool_status'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - DROP FUNCTION IF EXISTS DBE_PERF.get_global_active_session() CASCADE; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, - OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.stat_xact_all_tables%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_xact_all_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - END LOOP; - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_xact_all_tables where schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_xact_all_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, - OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - N.nspname AS toastrelschemaname, - C.relname AS toastrelname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_all_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - END LOOP; - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_all_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid - WHERE T.schemaname = ''''pg_catalog'''' OR T.schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_stat_activity - (out coorname text, out datid oid, out datname text, out pid bigint, - out usesysid oid, out usename text, out application_name text, out client_addr inet, - out client_hostname text, out client_port integer, out backend_start timestamptz, - out xact_start timestamptz, out query_start timestamptz, out state_change timestamptz, - out waiting boolean, out enqueue text, out state text, out resource_pool name, - out query_id bigint, out query text) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.session_stat_activity%rowtype; - coor_name record; - fet_active text; - fetch_coor text; - BEGIN - --Get all cn node names - fetch_coor := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR coor_name IN EXECUTE(fetch_coor) LOOP - coorname := coor_name.node_name; - fet_active := 'EXECUTE DIRECT ON (' || coor_name.node_name || ') ''SELECT * FROM DBE_PERF.session_stat_activity'''; - FOR row_data IN EXECUTE(fet_active) LOOP - coorname := coorname; - datid :=row_data.datid; - datname := row_data.datname; - pid := row_data.pid; - usesysid :=row_data.usesysid; - usename := row_data.usename; - application_name := row_data.application_name; - client_addr := row_data.client_addr; - client_hostname :=row_data.client_hostname; - client_port :=row_data.client_port; - backend_start := row_data.backend_start; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - state_change := row_data.state_change; - waiting := row_data.waiting; - enqueue := row_data.enqueue; - state := row_data.state; - resource_pool :=row_data.resource_pool; - query_id :=row_data.query_id; - query := row_data.query; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_cn_stat_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT * FROM DBE_PERF.stat_all_tables WHERE schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_stat_db_cu - (OUT node_name1 text, OUT db_name text, - OUT mem_hit bigint, OUT hdd_sync_read bigint, - OUT hdd_asyn_read bigint) - RETURNS setof record - AS $$ - DECLARE - row_name record; - each_node_out record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT D.datname AS datname, - pg_stat_get_db_cu_mem_hit(D.oid) AS mem_hit, - pg_stat_get_db_cu_hdd_sync(D.oid) AS hdd_sync_read, - pg_stat_get_db_cu_hdd_asyn(D.oid) AS hdd_asyn_read - FROM pg_database D;'''; - FOR each_node_out IN EXECUTE(query_str) LOOP - node_name1 := row_name.node_name; - db_name := each_node_out.datname; - mem_hit := each_node_out.mem_hit; - hdd_sync_read := each_node_out.hdd_sync_read; - hdd_asyn_read := each_node_out.hdd_asyn_read; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_cn_stat_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT * FROM DBE_PERF.stat_all_tables WHERE schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_stat_activity - (out coorname text, out datid oid, out datname text, out pid bigint, - out usesysid oid, out usename text, out application_name text, out client_addr inet, - out client_hostname text, out client_port integer, out backend_start timestamptz, - out xact_start timestamptz, out query_start timestamptz, out state_change timestamptz, - out waiting boolean, out enqueue text, out state text, out resource_pool name, - out query_id bigint, out query text) - RETURNS setof record - AS $$ - DECLARE - row_data DBE_PERF.session_stat_activity%rowtype; - coor_name record; - fet_active text; - fetch_coor text; - BEGIN - --Get all cn node names - fetch_coor := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR coor_name IN EXECUTE(fetch_coor) LOOP - coorname := coor_name.node_name; - fet_active := 'EXECUTE DIRECT ON (' || coor_name.node_name || ') ''SELECT * FROM DBE_PERF.session_stat_activity'''; - FOR row_data IN EXECUTE(fet_active) LOOP - coorname := coorname; - datid :=row_data.datid; - datname := row_data.datname; - pid := row_data.pid; - usesysid :=row_data.usesysid; - usename := row_data.usename; - application_name := row_data.application_name; - client_addr := row_data.client_addr; - client_hostname :=row_data.client_hostname; - client_port :=row_data.client_port; - backend_start := row_data.backend_start; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - state_change := row_data.state_change; - waiting := row_data.waiting; - enqueue := row_data.enqueue; - state := row_data.state; - resource_pool :=row_data.resource_pool; - query_id :=row_data.query_id; - query := row_data.query; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - end if; -END $DO$; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_statistics() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM gs_wlm_session_statistics'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_history() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM gs_wlm_session_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_info() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM gs_wlm_session_info'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -DROP FUNCTION IF EXISTS pg_catalog.pgxc_get_wlm_session_info_bytime(text, TIMESTAMP, TIMESTAMP, int) CASCADE; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_info_bytime(text, TIMESTAMP, TIMESTAMP, int) -RETURNS setof gs_wlm_session_info -AS $$ -DECLARE - row_data gs_wlm_session_info%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_cn text; - BEGIN - IF $1 IN ('start_time', 'finish_time') THEN - - ELSE - raise WARNING 'Illegal character entered for function, colname must be start_time or finish_time'; - return; - END IF; - - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - query_str_cn := 'SELECT * FROM gs_wlm_session_info where '||$1||'>'''''||$2||''''' and '||$1||'<'''''||$3||''''' limit '||$4; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_cn||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_wlm_rebuild_user_resource_pool() -RETURNS setof gs_wlm_rebuild_user_resource_pool -AS $$ -DECLARE - row_data gs_wlm_rebuild_user_resource_pool%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM gs_wlm_rebuild_user_resource_pool'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_wlm_get_workload_records() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM gs_wlm_workload_records'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_sql_count() -RETURNS setof gs_sql_count -AS $$ -DECLARE - row_data gs_sql_count%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM gs_sql_count'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_os_threads() -RETURNS setof pg_os_threads -AS $$ -DECLARE - row_data pg_os_threads%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_os_threads'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_running_xacts() -RETURNS setof pg_running_xacts -AS $$ -DECLARE - row_data pg_running_xacts%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the coordinator node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM pg_running_xacts'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_variable_info() -RETURNS setof pg_variable_info -AS $$ -DECLARE - row_data pg_variable_info%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM pg_variable_info'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_get_wal_senders_status(OUT nodename text, OUT source_ip text, OUT source_port integer,OUT dest_ip text, OUT dest_port integer,OUT sender_pid int, OUT local_role text, OUT peer_role text, OUT peer_state text, - OUT state text, - OUT sender_sent_location text, OUT sender_write_location text, OUT sender_flush_location text, OUT sender_replay_location text, - OUT receiver_received_location text, OUT receiver_write_location text, OUT receiver_flush_location text, OUT receiver_replay_location text) - - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - source_addr text; - dest_addr text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_stat_get_wal_senders()'''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename = row_name.node_name; - source_addr = substring(row_data.channel from 0 for position('-->' in row_data.channel)); - dest_addr = substring(row_data.channel from position('-->' in row_data.channel) + 3); - source_ip = substring(source_addr from 0 for position(':' in source_addr)); - source_port = cast(substring(source_addr from position(':' in source_addr) + 1) as integer); - dest_ip = substring(dest_addr from 0 for position(':' in dest_addr)); - dest_port = cast(substring(dest_addr from position(':' in dest_addr) + 1) as integer); - sender_pid = row_data.sender_pid; - local_role = row_data.local_role; - peer_role = row_data.peer_role; - peer_state = row_data.peer_state; - state = row_data.state; - sender_sent_location = row_data.sender_sent_location; - sender_write_location = row_data.sender_write_location; - sender_flush_location = row_data.sender_flush_location; - sender_replay_location = row_data.sender_replay_location; - receiver_received_location = row_data.receiver_received_location; - receiver_write_location = row_data.receiver_write_location; - receiver_flush_location = row_data.receiver_flush_location; - receiver_replay_location = row_data.receiver_replay_location; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_get_stat_session_cu(OUT node_name1 text, OUT mem_hit int, OUT hdd_sync_read int, OUT hdd_asyn_read int) -RETURNS setof record -AS $$ -DECLARE - row_name record; - each_node_out record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_stat_session_cu()'''; - FOR each_node_out IN EXECUTE(query_str) LOOP - node_name1 := row_name.node_name; - mem_hit := each_node_out.mem_hit; - hdd_sync_read := each_node_out.hdd_sync_read; - hdd_asyn_read := each_node_out.hdd_asyn_read; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_stat_reset() -RETURNS void -AS $$ -DECLARE - row_name record; - each_node_out record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_stat_reset()'''; - EXECUTE(query_str); - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_operator_statistics() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM gs_wlm_operator_statistics'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_operator_history() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM gs_wlm_operator_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_operator_info() -RETURNS setof gs_wlm_operator_info -AS $$ -DECLARE - row_data gs_wlm_operator_info%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM gs_wlm_operator_info'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_ec_operator_statistics() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM gs_wlm_ec_operator_statistics'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_ec_operator_history() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM gs_wlm_ec_operator_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_ec_operator_info() -RETURNS setof gs_wlm_ec_operator_info -AS $$ -DECLARE - row_data gs_wlm_ec_operator_info%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM gs_wlm_ec_operator_info'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_bad_block(OUT nodename TEXT, OUT databaseid INT4, OUT tablespaceid INT4, OUT relfilenode INT4, OUT forknum INT4, OUT error_count INT4, OUT first_time timestamp with time zone, OUT last_time timestamp with time zone) -RETURNS setof record -AS $$ -DECLARE - row_name record; - each_node_out record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_stat_bad_block()'''; - FOR each_node_out IN EXECUTE(query_str) LOOP - nodename := row_name.node_name; - databaseid := each_node_out.databaseid; - tablespaceid := each_node_out.tablespaceid; - relfilenode := each_node_out.relfilenode; - forknum := each_node_out.forknum; - error_count := each_node_out.error_count; - first_time := each_node_out.first_time; - last_time := each_node_out.last_time; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_bad_block_clear() -RETURNS void -AS $$ -DECLARE - row_name record; - each_node_out record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_stat_bad_block_clear()'''; - EXECUTE(query_str); - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -DROP FUNCTION IF EXISTS pg_catalog.pgxc_query_audit(IN starttime TIMESTAMPTZ, IN endtime TIMESTAMPTZ, OUT "time" TIMESTAMPTZ, OUT "type" text, OUT "result" text, OUT userid text, OUT username text, OUT database text, OUT client_conninfo text, OUT "object_name" text, OUT detail_info text, OUT node_name text, OUT thread_id text, OUT local_port text, OUT remote_port text) - CASCADE; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_query_audit(IN starttime TIMESTAMPTZ, IN endtime TIMESTAMPTZ, OUT "time" TIMESTAMPTZ, OUT "type" text, OUT "result" text, OUT userid text, OUT username text, OUT database text, OUT client_conninfo text, OUT "object_name" text, OUT detail_info text, OUT node_name text, OUT thread_id text, OUT local_port text, OUT remote_port text) -RETURNS setof record -AS $$ -DECLARE - row_name record; - row_data record; - query_str text; - query_str_nodes text; - BEGIN - --Get the node names of all CNs - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_catalog.pg_query_audit(''''' || starttime || ''''',''''' || endtime || ''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - "time" := row_data."time"; - "type" := row_data."type"; - "result" := row_data."result"; - userid := row_data.userid; - username := row_data.username; - database := row_data.database; - client_conninfo := row_data.client_conninfo; - "object_name" := row_data."object_name"; - detail_info := row_data.detail_info; - node_name := row_data.node_name; - thread_id := row_data.thread_id; - local_port := row_data.local_port; - remote_port := row_data.remote_port; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -DROP FUNCTION IF EXISTS pg_catalog.pgxc_stat_all_tables() - CASCADE; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_all_tables() -RETURNS setof pg_stat_all_tables -AS $$ -DECLARE - row_data pg_stat_all_tables%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_stat_all_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_stat_all_tables where schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE VIEW pg_catalog.pgxc_get_stat_all_tables AS - SELECT oid relid, s.relname,s.schemaname,s.n_tup_ins,s.n_tup_upd,s.n_tup_del,s.n_live_tup,s.n_dead_tup,s.dirty_page_rate - FROM pg_class p, - (SELECT relname, schemaname, SUM(n_tup_ins) n_tup_ins, SUM(n_tup_upd) n_tup_upd, SUM(n_tup_del) n_tup_del, SUM(n_live_tup) n_live_tup, SUM(n_dead_tup) n_dead_tup, CAST((SUM(n_dead_tup) / SUM(n_dead_tup + n_live_tup + 0.0001) * 100) - AS NUMERIC(5,2)) dirty_page_rate FROM pgxc_stat_all_tables() GROUP BY (relname,schemaname)) s - WHERE p.relname = s.relname AND p.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = s.schemaname) AND p.relname NOT LIKE '%pg_cudesc%' ORDER BY dirty_page_rate DESC; - - -CREATE OR REPLACE FUNCTION pg_catalog.gs_get_stat_db_cu(OUT node_name1 text, OUT db_name text, OUT mem_hit bigint, OUT hdd_sync_read bigint, OUT hdd_asyn_read bigint) -RETURNS setof record -AS $$ -DECLARE - row_name record; - each_node_out record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT D.datname AS datname, - pg_stat_get_db_cu_mem_hit(D.oid) AS mem_hit, - pg_stat_get_db_cu_hdd_sync(D.oid) AS hdd_sync_read, - pg_stat_get_db_cu_hdd_asyn(D.oid) AS hdd_asyn_read - FROM pg_database D;'''; - FOR each_node_out IN EXECUTE(query_str) LOOP - node_name1 := row_name.node_name; - db_name := each_node_out.datname; - mem_hit := each_node_out.mem_hit; - hdd_sync_read := each_node_out.hdd_sync_read; - hdd_asyn_read := each_node_out.hdd_asyn_read; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_delta_info(IN rel TEXT, OUT node_name TEXT, OUT part_name TEXT, OUT live_tuple INT8, OUT data_size INT8, OUT blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_str_nodes text; - query_str text; - rel_info record; - row_name record; - row_data record; - BEGIN - EXECUTE format('select c.relname,n.nspname from pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) where C.oid = (select %L::regclass::oid)', rel) into rel_info; - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_catalog.pg_get_delta_info('''''||rel_info.relname||''''','''''||rel_info.nspname||''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - live_tuple := row_data.live_tuple; - data_size := row_data.data_size; - blockNum := row_data.blockNum; - part_name := row_data.part_name; - return next; - END LOOP; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_activity_with_conninfo -( -out coorname text, -out datid oid, -out datname text, -out pid bigint, -out sessionid bigint, -out usesysid oid, -out usename text, -out application_name text, -out client_addr inet, -out client_hostname text, -out client_port integer, -out backend_start timestamptz, -out xact_start timestamptz, -out query_start timestamptz, -out state_change timestamptz, -out waiting boolean, -out enqueue text, -out state text, -out resource_pool name, -out query_id bigint, -out query text, -out connection_info text -) -RETURNS setof record -AS $$ -DECLARE - row_data pg_stat_activity%rowtype; - coor_name record; - fet_active text; - fetch_coor text; - BEGIN - --Get all the node names - fetch_coor := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR coor_name IN EXECUTE(fetch_coor) LOOP - coorname := coor_name.node_name; - fet_active := 'EXECUTE DIRECT ON (' || coor_name.node_name || ') ''SELECT * FROM pg_stat_activity '''; - FOR row_data IN EXECUTE(fet_active) LOOP - coorname := coorname; - datid :=row_data.datid; - datname := row_data.datname; - pid := row_data.pid; - sessionid := row_data.sessionid; - usesysid :=row_data.usesysid; - usename := row_data.usename; - application_name := row_data.application_name; - client_addr := row_data.client_addr; - client_hostname :=row_data.client_hostname; - client_port :=row_data.client_port; - backend_start := row_data.backend_start; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - state_change := row_data.state_change; - waiting := row_data.waiting; - enqueue := row_data.enqueue; - state := row_data.state; - resource_pool :=row_data.resource_pool; - query_id :=row_data.query_id; - query := row_data.query; - connection_info := row_data.connection_info; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_activity -( -out coorname text, -out datid oid, -out datname text, -out pid bigint, -out sessionid bigint, -out usesysid oid, -out usename text, -out application_name text, -out client_addr inet, -out client_hostname text, -out client_port integer, -out backend_start timestamptz, -out xact_start timestamptz, -out query_start timestamptz, -out state_change timestamptz, -out waiting boolean, -out enqueue text, -out state text, -out resource_pool name, -out query_id bigint, -out query text -) -RETURNS setof record -AS $$ -DECLARE - row_data pg_stat_activity%rowtype; - coor_name record; - fet_active text; - fetch_coor text; - BEGIN - --Get all the node names - fetch_coor := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR coor_name IN EXECUTE(fetch_coor) LOOP - coorname := coor_name.node_name; - fet_active := 'EXECUTE DIRECT ON (' || coor_name.node_name || ') ''SELECT * FROM pg_stat_activity '''; - FOR row_data IN EXECUTE(fet_active) LOOP - coorname := coorname; - datid :=row_data.datid; - datname := row_data.datname; - pid := row_data.pid; - sessionid := row_data.sessionid; - usesysid :=row_data.usesysid; - usename := row_data.usename; - application_name := row_data.application_name; - client_addr := row_data.client_addr; - client_hostname :=row_data.client_hostname; - client_port :=row_data.client_port; - backend_start := row_data.backend_start; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - state_change := row_data.state_change; - waiting := row_data.waiting; - enqueue := row_data.enqueue; - state := row_data.state; - resource_pool :=row_data.resource_pool; - query_id :=row_data.query_id; - query := row_data.query; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -create or replace function pg_catalog.pgxc_cgroup_map_ng_conf(IN ngname text) -returns bool -AS $$ -declare - host_info record; - query_str text; - query_string text; - flag boolean; - special text := '[^A-z0-9_]'; -begin - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN ngname, IN special; - IF flag = true THEN - return false; - ELSE - query_str = 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - for host_info in execute(query_str) loop - query_string := 'execute direct on (' || host_info.node_name || ') ''SELECT * from pg_catalog.gs_cgroup_map_ng_conf(''''' || ngname || ''''')'''; - execute query_string; - end loop; - END IF; - return true; -end; -$$language plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_xacts_iscommitted(IN xid int8, OUT nodename text, OUT iscommitted bool) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT pgxc_is_committed('|| xid ||'::text::xid) as bcommitted'''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename = row_name.node_name; - iscommitted = row_data.bcommitted; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_senders_catchup_time(OUT nodename text, OUT lwpid int, OUT local_role text, OUT peer_role text, - OUT state text, OUT sender text, - OUT catchup_start TimestampTz, OUT catchup_end TimestampTz) - -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_get_senders_catchup_time where state = ''''Catchup'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename = row_name.node_name; - lwpid = row_data.lwpid; - local_role = row_data.local_role; - peer_role = row_data.peer_role; - state = row_data.state; - sender = row_data."type"; - catchup_start = row_data.catchup_start; - catchup_end = row_data.catchup_end; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_parse_clog(OUT xid int8, OUT nodename text, OUT status text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_parse_clog() '''; - FOR row_data IN EXECUTE(query_str) LOOP - xid = row_data.xid; - nodename = row_name.node_name; - status = row_data.status; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_get_wal_senders(OUT nodename text, OUT sender_pid int, OUT local_role text, OUT peer_role text, OUT peer_state text, - OUT state text, - OUT sender_sent_location text, OUT sender_write_location text, OUT sender_flush_location text, OUT sender_replay_location text, - OUT receiver_received_location text, OUT receiver_write_location text, OUT receiver_flush_location text, OUT receiver_replay_location text) - -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_stat_get_wal_senders() where sender_flush_location != receiver_replay_location '''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename = row_name.node_name; - sender_pid = row_data.sender_pid; - local_role = row_data.local_role; - peer_role = row_data.peer_role; - peer_state = row_data.peer_state; - state = row_data.state; - sender_sent_location = row_data.sender_sent_location; - sender_write_location = row_data.sender_write_location; - sender_flush_location = row_data.sender_flush_location; - sender_replay_location = row_data.sender_replay_location; - receiver_received_location = row_data.receiver_received_location; - receiver_write_location = row_data.receiver_write_location; - receiver_flush_location = row_data.receiver_flush_location; - receiver_replay_location = row_data.receiver_replay_location; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION pg_catalog.reload_active_coordinator() -RETURNS boolean -AS $$ -DECLARE - row_name record; - query_str text; - query_str_nodes text; - query_result boolean = false; - return_result bool = true; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pgxc_pool_reload()'''; - begin - EXECUTE(query_str) into query_result; - if query_result = 'f' then - return_result = false; - return return_result; - end if; - end; - END LOOP; - return return_result; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -GRANT SELECT ON pg_catalog.pgxc_get_stat_all_tables TO public; - -SET search_path TO information_schema; -DROP VIEW IF EXISTS information_schema.column_privileges CASCADE; -CREATE OR REPLACE VIEW column_privileges AS - SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor, - CAST(grantee.rolname AS sql_identifier) AS grantee, - CAST(current_database() AS sql_identifier) AS table_catalog, - CAST(nc.nspname AS sql_identifier) AS table_schema, - CAST(x.relname AS sql_identifier) AS table_name, - CAST(x.attname AS sql_identifier) AS column_name, - CAST(x.prtype AS character_data) AS privilege_type, - CAST( - CASE WHEN - -- object owner always has grant options - pg_has_role(x.grantee, x.relowner, 'USAGE') - OR x.grantable - THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable - - FROM ( - SELECT pr_c.grantor, - pr_c.grantee, - attname, - relname, - relnamespace, - pr_c.prtype, - pr_c.grantable, - pr_c.relowner - FROM (SELECT oid, relname, relnamespace, relowner, (aclexplode(coalesce(relacl, acldefault('r', relowner)))).* - FROM pg_class - WHERE relkind IN ('r', 'v', 'f') - ) pr_c (oid, relname, relnamespace, relowner, grantor, grantee, prtype, grantable), - pg_attribute a - WHERE a.attrelid = pr_c.oid - AND a.attnum > 0 - AND NOT a.attisdropped - UNION - SELECT pr_a.grantor, - pr_a.grantee, - attname, - relname, - relnamespace, - pr_a.prtype, - pr_a.grantable, - c.relowner - FROM (SELECT attrelid, attname, (aclexplode(coalesce(attacl, acldefault('c', relowner)))).* - FROM pg_attribute a JOIN pg_class cc ON (a.attrelid = cc.oid) - WHERE attnum > 0 - AND NOT attisdropped - ) pr_a (attrelid, attname, grantor, grantee, prtype, grantable), - pg_class c - WHERE pr_a.attrelid = c.oid - AND relkind IN ('r', 'v', 'f') - ) x, - pg_namespace nc, - pg_authid u_grantor, - ( - SELECT oid, rolname FROM pg_authid - UNION ALL - SELECT 0::oid, 'PUBLIC' - ) AS grantee (oid, rolname) - - WHERE x.relnamespace = nc.oid - AND x.grantee = grantee.oid - AND x.grantor = u_grantor.oid - AND x.prtype IN ('INSERT', 'SELECT', 'UPDATE', 'REFERENCES') - AND (pg_has_role(u_grantor.oid, 'USAGE') - OR pg_has_role(grantee.oid, 'USAGE') - OR grantee.rolname = 'PUBLIC'); - -CREATE OR REPLACE VIEW role_column_grants AS - SELECT grantor, - grantee, - table_catalog, - table_schema, - table_name, - column_name, - privilege_type, - is_grantable - FROM column_privileges - WHERE grantor IN (SELECT role_name FROM enabled_roles) - OR grantee IN (SELECT role_name FROM enabled_roles); - -DROP VIEW IF EXISTS information_schema.routine_privileges CASCADE; -CREATE OR REPLACE VIEW routine_privileges AS - SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor, - CAST(grantee.rolname AS sql_identifier) AS grantee, - CAST(current_database() AS sql_identifier) AS specific_catalog, - CAST(n.nspname AS sql_identifier) AS specific_schema, - CAST(p.proname || '_' || CAST(p.oid AS text) AS sql_identifier) AS specific_name, - CAST(current_database() AS sql_identifier) AS routine_catalog, - CAST(n.nspname AS sql_identifier) AS routine_schema, - CAST(p.proname AS sql_identifier) AS routine_name, - CAST('EXECUTE' AS character_data) AS privilege_type, - CAST( - CASE WHEN - -- object owner always has grant options - pg_has_role(grantee.oid, p.proowner, 'USAGE') - OR p.grantable - THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable - - FROM ( - SELECT oid, proname, proowner, pronamespace, (aclexplode(coalesce(proacl, acldefault('f', proowner)))).* FROM pg_proc - ) p (oid, proname, proowner, pronamespace, grantor, grantee, prtype, grantable), - pg_namespace n, - pg_authid u_grantor, - ( - SELECT oid, rolname FROM pg_authid - UNION ALL - SELECT 0::oid, 'PUBLIC' - ) AS grantee (oid, rolname) - - WHERE p.pronamespace = n.oid - AND grantee.oid = p.grantee - AND u_grantor.oid = p.grantor - AND p.prtype IN ('EXECUTE') - AND (pg_has_role(u_grantor.oid, 'USAGE') - OR pg_has_role(grantee.oid, 'USAGE') - OR grantee.rolname = 'PUBLIC'); - -CREATE OR REPLACE VIEW role_routine_grants AS - SELECT grantor, - grantee, - specific_catalog, - specific_schema, - specific_name, - routine_catalog, - routine_schema, - routine_name, - privilege_type, - is_grantable - FROM routine_privileges - WHERE grantor IN (SELECT role_name FROM enabled_roles) - OR grantee IN (SELECT role_name FROM enabled_roles); - -DROP VIEW IF EXISTS information_schema.udt_privileges CASCADE; -CREATE OR REPLACE VIEW udt_privileges AS - SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor, - CAST(grantee.rolname AS sql_identifier) AS grantee, - CAST(current_database() AS sql_identifier) AS udt_catalog, - CAST(n.nspname AS sql_identifier) AS udt_schema, - CAST(t.typname AS sql_identifier) AS udt_name, - CAST('TYPE USAGE' AS character_data) AS privilege_type, -- sic - CAST( - CASE WHEN - -- object owner always has grant options - pg_has_role(grantee.oid, t.typowner, 'USAGE') - OR t.grantable - THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable - - FROM ( - SELECT oid, typname, typnamespace, typtype, typowner, (aclexplode(coalesce(typacl, acldefault('T', typowner)))).* FROM pg_type - ) AS t (oid, typname, typnamespace, typtype, typowner, grantor, grantee, prtype, grantable), - pg_namespace n, - pg_authid u_grantor, - ( - SELECT oid, rolname FROM pg_authid - UNION ALL - SELECT 0::oid, 'PUBLIC' - ) AS grantee (oid, rolname) - - WHERE t.typnamespace = n.oid - AND t.typtype = 'c' - AND t.grantee = grantee.oid - AND t.grantor = u_grantor.oid - AND t.prtype IN ('USAGE') - AND (pg_has_role(u_grantor.oid, 'USAGE') - OR pg_has_role(grantee.oid, 'USAGE') - OR grantee.rolname = 'PUBLIC'); - -CREATE OR REPLACE VIEW role_udt_grants AS - SELECT grantor, - grantee, - udt_catalog, - udt_schema, - udt_name, - privilege_type, - is_grantable - FROM udt_privileges - WHERE grantor IN (SELECT role_name FROM enabled_roles) - OR grantee IN (SELECT role_name FROM enabled_roles); - -DROP VIEW IF EXISTS information_schema.table_privileges CASCADE; -CREATE OR REPLACE VIEW table_privileges AS - SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor, - CAST(grantee.rolname AS sql_identifier) AS grantee, - CAST(current_database() AS sql_identifier) AS table_catalog, - CAST(nc.nspname AS sql_identifier) AS table_schema, - CAST(c.relname AS sql_identifier) AS table_name, - CAST(c.prtype AS character_data) AS privilege_type, - CAST( - CASE WHEN - -- object owner always has grant options - pg_has_role(grantee.oid, c.relowner, 'USAGE') - OR c.grantable - THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable, - CAST(CASE WHEN c.prtype = 'SELECT' THEN 'YES' ELSE 'NO' END AS yes_or_no) AS with_hierarchy - - FROM ( - SELECT oid, relname, relnamespace, relkind, relowner, (aclexplode(coalesce(relacl, acldefault('r', relowner)))).* FROM pg_class - ) AS c (oid, relname, relnamespace, relkind, relowner, grantor, grantee, prtype, grantable), - pg_namespace nc, - pg_authid u_grantor, - ( - SELECT oid, rolname FROM pg_authid - UNION ALL - SELECT 0::oid, 'PUBLIC' - ) AS grantee (oid, rolname) - - WHERE c.relnamespace = nc.oid - AND c.relkind IN ('r', 'v') - AND c.grantee = grantee.oid - AND c.grantor = u_grantor.oid - AND c.prtype IN ('INSERT', 'SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'REFERENCES', 'TRIGGER') - AND (pg_has_role(u_grantor.oid, 'USAGE') - OR pg_has_role(grantee.oid, 'USAGE') - OR grantee.rolname = 'PUBLIC'); - -CREATE OR REPLACE VIEW role_table_grants AS - SELECT grantor, - grantee, - table_catalog, - table_schema, - table_name, - privilege_type, - is_grantable, - with_hierarchy - FROM table_privileges - WHERE grantor IN (SELECT role_name FROM enabled_roles) - OR grantee IN (SELECT role_name FROM enabled_roles); - -DECLARE - user_name text; - query_str text; -BEGIN - SELECT SESSION_USER INTO user_name; - - query_str := 'GRANT INSERT,SELECT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON TABLE information_schema.column_privileges TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - query_str := 'GRANT INSERT,SELECT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON TABLE information_schema.role_column_grants TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - query_str := 'GRANT INSERT,SELECT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON TABLE information_schema.routine_privileges TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - query_str := 'GRANT INSERT,SELECT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON TABLE information_schema.role_routine_grants TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - query_str := 'GRANT INSERT,SELECT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON TABLE information_schema.udt_privileges TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - query_str := 'GRANT INSERT,SELECT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON TABLE information_schema.role_udt_grants TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - query_str := 'GRANT INSERT,SELECT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON TABLE information_schema.table_privileges TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - query_str := 'GRANT INSERT,SELECT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON TABLE information_schema.role_table_grants TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; -END; -/ - -GRANT SELECT ON information_schema.column_privileges TO PUBLIC; -GRANT SELECT ON information_schema.role_column_grants TO PUBLIC; -GRANT SELECT ON information_schema.routine_privileges TO PUBLIC; -GRANT SELECT ON information_schema.role_routine_grants TO PUBLIC; -GRANT SELECT ON information_schema.udt_privileges TO PUBLIC; -GRANT SELECT ON information_schema.role_udt_grants TO PUBLIC; -GRANT SELECT ON information_schema.table_privileges TO PUBLIC; -GRANT SELECT ON information_schema.role_table_grants TO PUBLIC; - -RESET search_path; - -DROP FUNCTION IF EXISTS pg_catalog.gs_wlm_get_all_user_resource_info() cascade; -CREATE OR REPLACE FUNCTION pg_catalog.gs_wlm_get_all_user_resource_info(OUT userid Oid, OUT used_memory int, OUT total_memory int, OUT used_cpu float, OUT total_cpu int, OUT used_space bigint, OUT total_space bigint, OUT used_temp_space bigint, OUT total_temp_space bigint, OUT used_spill_space bigint, OUT total_spill_space bigint, OUT read_kbytes bigint, OUT write_kbytes bigint, OUT read_counts bigint, OUT write_counts bigint, OUT read_speed float, OUT write_speed float) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str2 text; - BEGIN - query_str := 'SELECT rolname FROM pg_authid'; - FOR row_name IN EXECUTE(query_str) LOOP - query_str2 := 'SELECT * FROM pg_catalog.gs_wlm_user_resource_info(''' || row_name.rolname || ''')'; - FOR row_data IN EXECUTE(query_str2) LOOP - userid := row_data.userid; - used_memory := row_data.used_memory; - total_memory := row_data.total_memory; - used_cpu := row_data.used_cpu; - total_cpu := row_data.total_cpu; - used_space := row_data.used_space; - total_space := row_data.total_space; - used_temp_space := row_data.used_temp_space; - total_temp_space := row_data.total_temp_space; - used_spill_space := row_data.used_spill_space; - total_spill_space := row_data.total_spill_space; - read_kbytes := row_data.read_kbytes; - write_kbytes := row_data.write_kbytes; - read_counts := row_data.read_counts; - write_counts := row_data.write_counts; - read_speed := row_data.read_speed; - write_speed := row_data.write_speed; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW pg_catalog.pg_total_user_resource_info_oid AS - SELECT * FROM pg_catalog.gs_wlm_get_all_user_resource_info(); - -CREATE OR REPLACE VIEW pg_catalog.pg_total_user_resource_info AS -SELECT - S.usename AS username, - T.used_memory, - T.total_memory, - T.used_cpu, - T.total_cpu, - T.used_space, - T.total_space, - T.used_temp_space, - T.total_temp_space, - T.used_spill_space, - T.total_spill_space, - T.read_kbytes, - T.write_kbytes, - T.read_counts, - T.write_counts, - T.read_speed, - T.write_speed -FROM pg_user AS S, pg_catalog.pg_total_user_resource_info_oid AS T -WHERE S.usesysid = T.userid; - -DROP FUNCTION IF EXISTS pg_catalog.gs_wlm_session_respool() cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5021; -CREATE OR REPLACE FUNCTION pg_catalog.gs_wlm_session_respool(input bigint, OUT datid oid, OUT threadid bigint, OUT sessionid bigint, OUT threadpid integer, OUT usesysid oid, OUT cgroup text, OUT session_respool name) RETURNS SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_session_respool'; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP VIEW IF EXISTS DBE_PERF.summary_statement cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_summary_statement( - OUT node_name name, - OUT node_id integer, - OUT user_name name, - OUT user_id oid, - OUT unique_sql_id bigint, - OUT query text, - OUT n_calls bigint, - OUT min_elapse_time bigint, - OUT max_elapse_time bigint, - OUT total_elapse_time bigint, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - Out net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text, - OUT last_updated timestamp with time zone, - OUT sort_count bigint, - OUT sort_time bigint, - OUT sort_mem_used bigint, - OUT sort_spill_count bigint, - OUT sort_spill_size bigint, - OUT hash_count bigint, - OUT hash_time bigint, - OUT hash_mem_used bigint, - OUT hash_spill_count bigint, - OUT hash_spill_size bigint - ) cascade; - DROP VIEW IF EXISTS DBE_PERF.STATEMENT cascade; - end if; -END$DO$; -DROP FUNCTION IF EXISTS pg_catalog.get_instr_unique_sql() cascade; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5702; -CREATE FUNCTION pg_catalog.get_instr_unique_sql -( - OUT node_name name, - OUT node_id integer, - OUT user_name name, - OUT user_id oid, - OUT unique_sql_id bigint, - OUT query text, - OUT n_calls bigint, - OUT min_elapse_time bigint, - OUT max_elapse_time bigint, - OUT total_elapse_time bigint, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - Out net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text, - OUT last_updated timestamp with time zone -) -RETURNS setof record LANGUAGE INTERNAL VOLATILE NOT FENCED as 'get_instr_unique_sql'; - -DO $DO$ -DECLARE - ans boolean; - user_name text; - query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE VIEW DBE_PERF.statement AS - SELECT * FROM get_instr_unique_sql(); - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statement() - RETURNS setof DBE_PERF.statement - AS $$ - DECLARE - row_data DBE_PERF.statement%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE VIEW DBE_PERF.summary_statement AS - SELECT * FROM DBE_PERF.get_summary_statement(); - - SELECT SESSION_USER INTO user_name; - query_str := 'GRANT ALL ON TABLE DBE_PERF.STATEMENT TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - query_str := 'GRANT ALL ON TABLE DBE_PERF.summary_statement TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - GRANT SELECT ON TABLE DBE_PERF.STATEMENT TO PUBLIC; - GRANT SELECT ON TABLE DBE_PERF.summary_statement TO PUBLIC; - - end if; -END$DO$; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_tables where tablename = 'snap_summary_statement' and schemaname = 'snapshot' limit 1) into ans; - if ans = true then - alter table snapshot.snap_summary_statement - DROP COLUMN IF EXISTS snap_sort_count, - DROP COLUMN IF EXISTS snap_sort_time, - DROP COLUMN IF EXISTS snap_sort_mem_used, - DROP COLUMN IF EXISTS snap_sort_spill_count, - DROP COLUMN IF EXISTS snap_sort_spill_size, - DROP COLUMN IF EXISTS snap_hash_count, - DROP COLUMN IF EXISTS snap_hash_time, - DROP COLUMN IF EXISTS snap_hash_mem_used, - DROP COLUMN IF EXISTS snap_hash_spill_count, - DROP COLUMN IF EXISTS snap_hash_spill_size; - end if; -END$DO$; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS DBE_PERF.get_global_full_sql_by_timestamp() cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_global_slow_sql_by_timestamp() cascade; - DROP VIEW IF EXISTS DBE_PERF.statement_history cascade; - end if; -END$$; -DROP INDEX IF EXISTS pg_catalog.statement_history_time_idx; -DROP TABLE IF EXISTS pg_catalog.statement_history; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP VIEW IF EXISTS DBE_PERF.summary_statement cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_summary_statement( - OUT node_name name, - OUT node_id integer, - OUT user_name name, - OUT user_id oid, - OUT unique_sql_id bigint, - OUT query text, - OUT n_calls bigint, - OUT min_elapse_time bigint, - OUT max_elapse_time bigint, - OUT total_elapse_time bigint, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - Out net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text, - OUT last_updated timestamp with time zone - ) cascade; - DROP VIEW IF EXISTS DBE_PERF.STATEMENT cascade; - end if; -END$DO$; -DROP FUNCTION IF EXISTS pg_catalog.get_instr_unique_sql() cascade; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5702; -CREATE FUNCTION pg_catalog.get_instr_unique_sql -( - OUT node_name name, - OUT node_id integer, - OUT user_name name, - OUT user_id oid, - OUT unique_sql_id bigint, - OUT query text, - OUT n_calls bigint, - OUT min_elapse_time bigint, - OUT max_elapse_time bigint, - OUT total_elapse_time bigint, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - Out net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text -) -RETURNS setof record LANGUAGE INTERNAL VOLATILE NOT FENCED as 'get_instr_unique_sql'; - -DO $DO$ -DECLARE - ans boolean; - user_name text; - query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE VIEW DBE_PERF.statement AS - SELECT * FROM get_instr_unique_sql(); - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statement() - RETURNS setof DBE_PERF.statement - AS $$ - DECLARE - row_data DBE_PERF.statement%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE VIEW DBE_PERF.summary_statement AS - SELECT * FROM DBE_PERF.get_summary_statement(); - - SELECT SESSION_USER INTO user_name; - query_str := 'GRANT ALL ON TABLE DBE_PERF.STATEMENT TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - query_str := 'GRANT ALL ON TABLE DBE_PERF.summary_statement TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - GRANT SELECT ON TABLE DBE_PERF.STATEMENT TO PUBLIC; - GRANT SELECT ON TABLE DBE_PERF.summary_statement TO PUBLIC; - - end if; -END$DO$; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_tables where tablename = 'snap_summary_statement' and schemaname = 'snapshot' limit 1) into ans; - if ans = true then - alter table snapshot.snap_summary_statement - DROP COLUMN IF EXISTS snap_last_updated; - end if; -END$DO$; - --- wait events -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP VIEW IF EXISTS DBE_PERF.global_wait_events cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_global_wait_events() cascade; - DROP VIEW IF EXISTS DBE_PERF.wait_events cascade; - end if; -END$DO$; -DROP FUNCTION IF EXISTS pg_catalog.get_instr_wait_event() cascade; -DROP FUNCTION IF EXISTS pg_catalog.get_instr_wait_event(IN param int4, OUT nodename text, OUT type text, OUT event text, OUT wait bigint, OUT failed_wait bigint, OUT total_wait_time bigint, OUT avg_wait_time bigint, OUT max_wait_time bigint, OUT min_wait_time bigint, OUT last_updated timestamp with time zone) cascade; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5705; -CREATE FUNCTION pg_catalog.get_instr_wait_event -( - IN param int4, - OUT nodename text, - OUT type text, - OUT event text, - OUT wait bigint, - OUT failed_wait bigint, - OUT total_wait_time bigint, - OUT avg_wait_time bigint, - OUT max_wait_time bigint, - OUT min_wait_time bigint -) -RETURNS setof record LANGUAGE INTERNAL VOLATILE NOT FENCED as 'get_instr_wait_event'; - -DO $DO$ -DECLARE - ans boolean; - user_name text; - query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE VIEW DBE_PERF.wait_events AS - SELECT * FROM get_instr_wait_event(NULL); - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_wait_events() - RETURNS setof DBE_PERF.wait_events - AS $$ - DECLARE - row_data DBE_PERF.wait_events%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.wait_events'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE VIEW DBE_PERF.global_wait_events AS - SELECT * FROM DBE_PERF.get_global_wait_events(); - - SELECT SESSION_USER INTO user_name; - query_str := 'GRANT ALL ON TABLE DBE_PERF.wait_events TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - query_str := 'GRANT ALL ON TABLE DBE_PERF.global_wait_events TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - GRANT SELECT ON TABLE DBE_PERF.wait_events TO PUBLIC; - GRANT SELECT ON TABLE DBE_PERF.global_wait_events TO PUBLIC; - - end if; -END$DO$; - -DROP FUNCTION IF EXISTS pg_catalog.statement_detail_decode() CASCADE; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_tables where tablename = 'snap_global_wait_events' and schemaname = 'snapshot' limit 1) into ans; - if ans = true then - alter table snapshot.snap_global_wait_events - DROP COLUMN IF EXISTS snap_last_updated; - end if; -END$DO$; - -DROP VIEW IF EXISTS global_stat_hotkeys_info cascade; - -DROP FUNCTION IF EXISTS pg_catalog.global_stat_clean_hotkeys(); -DROP FUNCTION IF EXISTS pg_catalog.global_stat_get_hotkeys_info(); - -DROP FUNCTION IF EXISTS pg_catalog.gs_stat_clean_hotkeys(); -DROP FUNCTION IF EXISTS pg_catalog.gs_stat_get_hotkeys_info(); - -DROP FUNCTION IF EXISTS pg_catalog.gs_get_global_barrier_status() cascade; -DROP FUNCTION IF EXISTS pg_catalog.gs_get_local_barrier_status() cascade; - -DROP FUNCTION IF EXISTS pg_catalog.hypopg_create_index(text); -DROP FUNCTION IF EXISTS pg_catalog.hypopg_display_index(); -DROP FUNCTION IF EXISTS pg_catalog.hypopg_drop_index(int4); -DROP FUNCTION IF EXISTS pg_catalog.hypopg_estimate_size(int4); -DROP FUNCTION IF EXISTS pg_catalog.hypopg_reset_index(); - -DROP FUNCTION IF EXISTS pg_catalog.plancache_status() CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.prepare_statement_status() CASCADE; - -set local inplace_upgrade_next_system_object_oids = IUO_PROC,3957; -CREATE OR REPLACE FUNCTION pg_catalog.plancache_status( - OUT nodename text, - OUT query text, - OUT refcount int4, - OUT valid bool, - OUT DatabaseID oid, - OUT schema_name text, - OUT params_num int4) -RETURNS SETOF RECORD LANGUAGE INTERNAL AS 'gs_globalplancache_status'; - -set local inplace_upgrade_next_system_object_oids = IUO_PROC,3959; -CREATE OR REPLACE FUNCTION pg_catalog.prepare_statement_status( - OUT nodename text, - OUT cn_sess_id int8, - OUT cn_node_id int4, - OUT cn_time_line int4, - OUT statement_name text, - OUT refcount int4, - OUT is_shared bool) -RETURNS SETOF RECORD LANGUAGE INTERNAL AS 'gs_globalplancache_prepare_status'; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS DBE_PERF.global_plancache_status() CASCADE; - DROP VIEW IF EXISTS DBE_PERF.local_plancache_status CASCADE; - DROP VIEW IF EXISTS DBE_PERF.global_plancache_status CASCADE; - DROP VIEW IF EXISTS DBE_PERF.local_prepare_statement_status CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.global_prepare_statement_status() CASCADE; - DROP VIEW IF EXISTS DBE_PERF.global_prepare_statement_status CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.global_plancache_clean() CASCADE; - DROP VIEW IF EXISTS DBE_PERF.local_plancache_clean CASCADE; - - CREATE VIEW DBE_PERF.local_plancache_status AS - SELECT * FROM pg_catalog.plancache_status(); - - end if; -END $DO$; - - -DROP AGGREGATE IF EXISTS streaming_int2_int4_sum_gather(int8); -DROP AGGREGATE IF EXISTS streaming_int8_sum_gather(numeric); -DROP AGGREGATE IF EXISTS streaming_interval_avg_gather(interval[]); -DROP AGGREGATE IF EXISTS streaming_float8_avg_gather(float8[]); -DROP AGGREGATE IF EXISTS streaming_numeric_avg_gather(numeric[]); -DROP AGGREGATE IF EXISTS streaming_int8_avg_gather(int8[]); -DROP AGGREGATE IF EXISTS gather(anyelement); -DROP FUNCTION IF EXISTS pg_catalog.gather_sfunc_dummy(anyelement, anyelement); - - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 0; -DROP FUNCTION IF EXISTS pg_catalog.check_cont_query_schema_changed(cq_id oid); -DROP FUNCTION IF EXISTS pg_catalog.reset_cont_query_stats(); -DROP FUNCTION IF EXISTS pg_catalog.reset_cont_query_stats(stream_id oid); -DROP FUNCTION IF EXISTS pg_catalog.reset_local_cont_query_stats(cq_id oid); -DROP FUNCTION IF EXISTS pg_catalog.reset_local_cont_query_stat(cq_id oid); -DROP VIEW IF EXISTS pg_catalog.stream_stats; -DROP VIEW IF EXISTS pg_catalog.cont_query_stats; -DROP FUNCTION IF EXISTS pg_catalog.get_cont_query_stats(); -DROP FUNCTION IF EXISTS pg_catalog.get_local_cont_query_stats(); -DROP FUNCTION IF EXISTS pg_catalog.get_local_cont_query_stat(cq_id oid); - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_extension where extname = 'streaming' limit 1) into ans; - if ans = true then - CREATE OR REPLACE FUNCTION pg_catalog.streaming_cont_query_matrelid_index_local_set_unique(flag bool) - RETURNS BOOL - AS '$libdir/streaming', 'streaming_cont_query_matrelid_index_local_set_unique' - LANGUAGE C IMMUTABLE STRICT NOT FENCED; - CREATE OR REPLACE FUNCTION pg_catalog.streaming_cont_query_matrelid_index_set_unique(flag bool) - RETURNS BOOL - AS '$libdir/streaming', 'streaming_cont_query_matrelid_index_set_unique' - LANGUAGE C IMMUTABLE STRICT NOT FENCED; - end if; -END$$; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_extension where extname = 'streaming' limit 1) into ans; - if ans = true then - SELECT pg_catalog.streaming_cont_query_matrelid_index_local_set_unique(true) INTO ans; - SELECT pg_catalog.streaming_cont_query_matrelid_index_set_unique(true) INTO ans; - end if; -END$$; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_extension where extname = 'streaming' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS pg_catalog.streaming_cont_query_matrelid_index_set_unique(flag bool); - DROP FUNCTION IF EXISTS pg_catalog.streaming_cont_query_matrelid_index_local_set_unique(flag bool); - end if; -END$$; - - -DROP FUNCTION IF EXISTS pg_catalog.gs_set_obs_delete_location(text) cascade; - - -do $$DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP VIEW IF EXISTS DBE_PERF.global_single_flush_dw_status CASCADE; - DROP FUNCTION IF EXISTS pg_catalog.local_single_flush_dw_stat(); - DROP FUNCTION IF EXISTS pg_catalog.remote_single_flush_dw_stat(); - end if; -END$$; - - -DROP FUNCTION IF EXISTS pg_catalog.gs_index_advise(cstring); - - -DROP AGGREGATE IF EXISTS pg_catalog.mode(order by anyelement); -DROP FUNCTION IF EXISTS pg_catalog.mode_final(internal) CASCADE; - -drop function if exists pg_catalog.series(name) cascade; -drop function if exists pg_catalog.top_key(name, int8) cascade; -drop function if exists pg_catalog.top_key(name, int) cascade; -drop function if exists pg_catalog.series(anyelement) cascade; -drop function if exists pg_catalog.top_key(anyelement, int8) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 6006; -create or replace function pg_catalog.series(name) returns text LANGUAGE INTERNAL as 'series_internal'; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 6008; -create or replace function pg_catalog.top_key(name, int8) returns text LANGUAGE INTERNAL as 'top_key_internal'; - -DROP FUNCTION IF EXISTS pg_catalog.pg_create_physical_replication_slot_extern(name, boolean, text) cascade; - -DO $$ -BEGIN - IF EXISTS(SELECT c.relname,n.nspname FROM pg_class c JOIN pg_namespace n ON c.relnamespace=n.oid AND c.relname='snapshot' AND n.nspname='snapshot') - THEN - create table IF NOT EXISTS snapshot.snap_global_operator_runtime(snapshot_id bigint, snap_queryid bigint, snap_pid bigint, snap_plan_node_id integer, snap_plan_node_name text, snap_start_time timestamp with time zone, snap_duration bigint, snap_status text, snap_query_dop integer, snap_estimated_rows bigint, snap_tuple_processed bigint, snap_min_peak_memory integer, snap_max_peak_memory integer, snap_average_peak_memory integer, snap_memory_skew_percent integer, snap_min_spill_size integer, snap_max_spill_size integer, snap_average_spill_size integer, snap_spill_skew_percent integer, snap_min_cpu_time bigint, snap_max_cpu_time bigint, snap_total_cpu_time bigint, snap_cpu_skew_percent integer, snap_warning text); - - create table IF NOT EXISTS snapshot.snap_global_operator_history(snapshot_id bigint, snap_queryid bigint, snap_pid bigint, snap_plan_node_id integer, snap_plan_node_name text, snap_start_time timestamp with time zone, snap_duration bigint, snap_query_dop integer, snap_estimated_rows bigint, snap_tuple_processed bigint, snap_min_peak_memory integer, snap_max_peak_memory integer, snap_average_peak_memory integer, snap_memory_skew_percent integer, snap_min_spill_size integer, snap_max_spill_size integer, snap_average_spill_size integer, snap_spill_skew_percent integer, snap_min_cpu_time bigint, snap_max_cpu_time bigint, snap_total_cpu_time bigint, snap_cpu_skew_percent integer, snap_warning text); - - create table IF NOT EXISTS snapshot.snap_global_operator_history_table(snapshot_id bigint, snap_queryid bigint, snap_pid bigint, snap_plan_node_id integer, snap_plan_node_name text, snap_start_time timestamp with time zone, snap_duration bigint, snap_query_dop integer, snap_estimated_rows bigint, snap_tuple_processed bigint, snap_min_peak_memory integer, snap_max_peak_memory integer, snap_average_peak_memory integer, snap_memory_skew_percent integer, snap_min_spill_size integer, snap_max_spill_size integer, snap_average_spill_size integer, snap_spill_skew_percent integer, snap_min_cpu_time bigint, snap_max_cpu_time bigint, snap_total_cpu_time bigint, snap_cpu_skew_percent integer, snap_warning text); - - create table IF NOT EXISTS snapshot.snap_global_operator_ec_runtime(snapshot_id bigint, snap_queryid bigint, snap_plan_node_id integer, snap_start_time timestamp with time zone, snap_ec_status text, snap_ec_execute_datanode text, snap_ec_dsn text, snap_ec_username text, snap_ec_query text, snap_ec_libodbc_type text, snap_ec_fetch_count bigint); - - create table IF NOT EXISTS snapshot.snap_global_operator_ec_history(snapshot_id bigint, snap_queryid bigint, snap_plan_node_id integer, snap_start_time timestamp with time zone, snap_duration bigint,snap_tuple_processed bigint, snap_min_peak_memory integer, snap_max_peak_memory integer, snap_average_peak_memory integer,snap_ec_status text, snap_ec_execute_datanode text, snap_ec_dsn text, snap_ec_username text, snap_ec_query text,snap_ec_libodbc_type text); - - create table IF NOT EXISTS snapshot.snap_global_operator_ec_history_table(snapshot_id bigint, snap_queryid bigint, snap_plan_node_id integer, snap_start_time timestamp with time zone, snap_duration bigint,snap_tuple_processed bigint, snap_min_peak_memory integer, snap_max_peak_memory integer, snap_average_peak_memory integer,snap_ec_status text, snap_ec_execute_datanode text, snap_ec_dsn text, snap_ec_username text, snap_ec_query text,snap_ec_libodbc_type text); - - create table IF NOT EXISTS snapshot.snap_global_statement_complex_runtime(snapshot_id bigint, snap_datid oid, snap_dbname name, snap_schemaname text, snap_nodename text, snap_username name, snap_application_name text, snap_client_addr inet, snap_client_hostname text, snap_client_port integer, snap_query_band text, snap_pid bigint, snap_block_time bigint, snap_start_time timestamp with time zone, snap_duration bigint, snap_estimate_total_time bigint, snap_estimate_left_time bigint, snap_enqueue text, snap_resource_pool name, snap_control_group text, snap_estimate_memory integer, snap_min_peak_memory integer, snap_max_peak_memory integer, snap_average_peak_memory integer, snap_memory_skew_percent integer, snap_spill_info text, snap_min_spill_size integer, snap_max_spill_size integer, snap_average_spill_size integer, snap_spill_skew_percent integer, snap_min_dn_time bigint , snap_max_dn_time bigint, snap_average_dn_time bigint, snap_dntime_skew_percent integer, snap_min_cpu_time bigint, snap_max_cpu_time bigint, snap_total_cpu_time bigint, snap_cpu_skew_percent integer, snap_min_peak_iops integer, snap_max_peak_iops integer, snap_average_peak_iops integer, snap_iops_skew_percent integer, snap_warning text , snap_queryid bigint, snap_query text, snap_query_plan text, snap_node_group text, snap_top_cpu_dn text, snap_top_mem_dn text); - - create table IF NOT EXISTS snapshot.snap_global_statement_complex_history(snapshot_id bigint, snap_datid oid, snap_dbname text, snap_schemaname text, snap_nodename text, snap_username text, snap_application_name text, snap_client_addr inet, snap_client_hostname text, snap_client_port integer, snap_query_band text, snap_block_time bigint, snap_start_time timestamp with time zone, snap_finish_time timestamp with time zone, snap_duration bigint, snap_estimate_total_time bigint, snap_status text, snap_abort_info text, snap_resource_pool name, snap_control_group text, snap_estimate_memory integer, snap_min_peak_memory integer, snap_max_peak_memory integer, snap_average_peak_memory integer, snap_memory_skew_percent integer, snap_spill_info text, snap_min_spill_size integer, snap_max_spill_size integer, snap_average_spill_size integer, snap_spill_skew_percent integer, snap_min_dn_time bigint , snap_max_dn_time bigint, snap_average_dn_time bigint, snap_dntime_skew_percent integer, snap_min_cpu_time bigint, snap_max_cpu_time bigint, snap_total_cpu_time bigint, snap_cpu_skew_percent integer, snap_min_peak_iops integer, snap_max_peak_iops integer, snap_average_peak_iops integer, snap_iops_skew_percent integer, snap_warning text , snap_queryid bigint, snap_query text, snap_query_plan text, snap_node_group text,snap_cpu_top1_node_name text, snap_cpu_top2_node_name text, snap_cpu_top3_node_name text, snap_cpu_top4_node_name text, snap_cpu_top5_node_name text, snap_mem_top1_node_name text, snap_mem_top2_node_name text, snap_mem_top3_node_name text, snap_mem_top4_node_name text, snap_mem_top5_node_name text, snap_cpu_top1_value bigint, snap_cpu_top2_value bigint, snap_cpu_top3_value bigint, snap_cpu_top4_value bigint, snap_cpu_top5_value bigint, snap_mem_top1_value bigint, snap_mem_top2_value bigint, snap_mem_top3_value bigint, snap_mem_top4_value bigint, snap_mem_top5_value bigint, snap_top_mem_dn text, snap_top_cpu_dn text); - - create table IF NOT EXISTS snapshot.snap_global_statement_complex_history_table(snapshot_id bigint, snap_datid oid, snap_dbname text, snap_schemaname text, snap_nodename text, snap_username text, snap_application_name text, snap_client_addr inet, snap_client_hostname text, snap_client_port integer, snap_query_band text, snap_block_time bigint, snap_start_time timestamp with time zone, snap_finish_time timestamp with time zone, snap_duration bigint, snap_estimate_total_time bigint, snap_status text, snap_abort_info text, snap_resource_pool name, snap_control_group text, snap_estimate_memory integer, snap_min_peak_memory integer, snap_max_peak_memory integer, snap_average_peak_memory integer, snap_memory_skew_percent integer, snap_spill_info text, snap_min_spill_size integer, snap_max_spill_size integer, snap_average_spill_size integer, snap_spill_skew_percent integer, snap_min_dn_time bigint , snap_max_dn_time bigint, snap_average_dn_time bigint, snap_dntime_skew_percent integer, snap_min_cpu_time bigint, snap_max_cpu_time bigint, snap_total_cpu_time bigint, snap_cpu_skew_percent integer, snap_min_peak_iops integer, snap_max_peak_iops integer, snap_average_peak_iops integer, snap_iops_skew_percent integer, snap_warning text , snap_queryid bigint, snap_query text, snap_query_plan text, snap_node_group text,snap_cpu_top1_node_name text, snap_cpu_top2_node_name text, snap_cpu_top3_node_name text, snap_cpu_top4_node_name text, snap_cpu_top5_node_name text, snap_mem_top1_node_name text, snap_mem_top2_node_name text, snap_mem_top3_node_name text, snap_mem_top4_node_name text, snap_mem_top5_node_name text, snap_cpu_top1_value bigint, snap_cpu_top2_value bigint, snap_cpu_top3_value bigint, snap_cpu_top4_value bigint, snap_cpu_top5_value bigint, snap_mem_top1_value bigint, snap_mem_top2_value bigint, snap_mem_top3_value bigint, snap_mem_top4_value bigint, snap_mem_top5_value bigint, snap_top_mem_dn text, snap_top_cpu_dn text); - - END IF; -END $$; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE OR REPLACE VIEW DBE_PERF.class_vital_info AS - SELECT - C.oid AS relid, - N.nspname AS schemaname, - C.relname AS relname, - C.relkind AS relkind - FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) - WHERE C.relkind IN ('r', 't', 'i'); - end if; -END $$; - - -CREATE OR REPLACE VIEW pg_catalog.pg_indexes AS - SELECT - N.nspname AS schemaname, - C.relname AS tablename, - I.relname AS indexname, - T.spcname AS tablespace, - pg_get_indexdef(I.oid) AS indexdef - FROM pg_index X JOIN pg_class C ON (C.oid = X.indrelid) - JOIN pg_class I ON (I.oid = X.indexrelid) - LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) - LEFT JOIN pg_tablespace T ON (T.oid = I.reltablespace) - WHERE C.relkind = 'r' AND I.relkind = 'i'; - -DROP FUNCTION IF EXISTS pg_catalog.copy_error_log_create() CASCADE; -CREATE OR REPLACE FUNCTION pg_catalog.copy_error_log_create() -RETURNS bool -AS $$ -DECLARE - query_str_create_table text; - query_str_create_index text; - query_str_do_revoke text; - BEGIN - query_str_create_table := 'CREATE TABLE public.pgxc_copy_error_log - (relname varchar, begintime timestamptz, filename varchar, rownum int8, rawrecord text, detail text) - DISTRIBUTE BY hash(begintime)'; - EXECUTE query_str_create_table; - - query_str_create_index := 'CREATE INDEX copy_error_log_relname_idx ON public.pgxc_copy_error_log(relname)'; - EXECUTE query_str_create_index; - - query_str_do_revoke := 'REVOKE ALL on public.pgxc_copy_error_log FROM public'; - EXECUTE query_str_do_revoke; - - return true; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -REVOKE ALL on FUNCTION pg_catalog.copy_error_log_create() FROM public; - -DROP VIEW IF EXISTS pg_catalog.pg_gtt_relstats cascade; -DROP VIEW IF EXISTS pg_catalog.pg_gtt_attached_pids cascade; -DROP VIEW IF EXISTS pg_catalog.pg_gtt_stats cascade; -DROP FUNCTION IF EXISTS pg_catalog.pg_get_gtt_relstats() cascade; -DROP FUNCTION IF EXISTS pg_catalog.pg_get_gtt_statistics() cascade; -DROP FUNCTION IF EXISTS pg_catalog.pg_gtt_attached_pid() cascade; -DROP FUNCTION IF EXISTS pg_catalog.pg_list_gtt_relfrozenxids() cascade; -DROP FUNCTION IF EXISTS pg_catalog.pg_partition_filepath() cascade; - -drop aggregate if exists pg_catalog.median(float8); -drop aggregate if exists pg_catalog.median(interval); -DROP FUNCTION if exists pg_catalog.median_float8_finalfn(internal) cascade; -DROP FUNCTION if exists pg_catalog.median_interval_finalfn(internal) cascade; -DROP FUNCTION if exists pg_catalog.median_transfn(internal, "any") cascade; - ---clob cast text -DROP CAST IF EXISTS (TEXT AS CLOB) CASCADE; -DROP CAST IF EXISTS (CLOB AS TEXT) CASCADE; - - /* text to clob */ -DROP FUNCTION IF EXISTS pg_catalog.to_clob (TEXT) CASCADE; -CREATE OR REPLACE FUNCTION pg_catalog.to_clob(TEXT) -RETURNS TEXT -AS $$ select $1 $$ -LANGUAGE SQL IMMUTABLE STRICT NOT FENCED; - -/* char to clob */ -DROP FUNCTION IF EXISTS pg_catalog.to_clob (CHAR) CASCADE; -CREATE OR REPLACE FUNCTION pg_catalog.to_clob(CHAR) -RETURNS TEXT -AS $$ select CAST($1 AS TEXT) $$ -LANGUAGE SQL IMMUTABLE STRICT NOT FENCED; - -/* varchar to clob */ -DROP FUNCTION IF EXISTS pg_catalog.to_clob (VARCHAR) CASCADE; -CREATE OR REPLACE FUNCTION pg_catalog.to_clob(VARCHAR) -RETURNS TEXT -AS $$ select CAST($1 AS TEXT) $$ -LANGUAGE SQL IMMUTABLE STRICT NOT FENCED; - -/* nvarchar2 to clob */ -DROP FUNCTION IF EXISTS pg_catalog.to_clob (NVARCHAR2) CASCADE; -CREATE OR REPLACE FUNCTION pg_catalog.to_clob(NVARCHAR2) -RETURNS TEXT -AS $$ select CAST($1 AS TEXT) $$ -LANGUAGE SQL IMMUTABLE STRICT NOT FENCED; - -/* clob to regclass */ -DROP CAST IF EXISTS (clob AS regclass) CASCADE; -/* clob to bpchar */ -DROP CAST IF EXISTS (clob AS bpchar) CASCADE; -/* clob to varchar */ -DROP CAST IF EXISTS (clob AS varchar) CASCADE; -/* clob to nvarchar2 */ -DROP CAST IF EXISTS (clob AS nvarchar2) CASCADE; -/* bpchar to clob */ -DROP CAST IF EXISTS (bpchar AS clob) CASCADE; -/* varchar to clob */ -DROP CAST IF EXISTS (varchar AS clob) CASCADE; -/* nvarchar2 to clob */ -DROP CAST IF EXISTS (nvarchar2 AS clob) CASCADE; -/* char to clob */ -DROP CAST IF EXISTS (char AS clob) CASCADE; -/* name to clob */ -DROP CAST IF EXISTS (name AS clob) CASCADE; -/* clob to char */ -DROP CAST IF EXISTS (clob AS char) CASCADE; -/* clob to name */ -DROP CAST IF EXISTS (clob AS name) CASCADE; -/* pg_node_tree to clob */ -DROP CAST IF EXISTS (pg_node_tree AS clob) CASCADE; -/* clob to timestamp */ -DROP CAST IF EXISTS (clob AS timestamp) CASCADE; -/* cidr to clob*/ -DROP CAST IF EXISTS (cidr AS clob) CASCADE; -/* inet to clob */ -DROP CAST IF EXISTS (inet AS clob) CASCADE; -/* bool to clob */ -DROP CAST IF EXISTS (bool AS clob) CASCADE; -/* xml to clob */ -DROP CAST IF EXISTS (xml AS clob) CASCADE; -/* clob to xml */ -DROP CAST IF EXISTS (clob AS xml) CASCADE; -/* date to clob */ -DROP CAST IF EXISTS (date AS clob) CASCADE; -/* clob to date */ -DROP CAST IF EXISTS (clob AS date) CASCADE; -/* int1 to clob */ -DROP CAST IF EXISTS (int1 AS clob) CASCADE; -/* int2 to clob */ -DROP CAST IF EXISTS (int2 AS clob) CASCADE; -/* int4 to clob */ -DROP CAST IF EXISTS (int4 AS clob) CASCADE; -/* int8 to clob */ -DROP CAST IF EXISTS (int8 AS clob) CASCADE; -/* float4 to clob */ -DROP CAST IF EXISTS (float4 AS clob) CASCADE; -/* float8 to clob */ -DROP CAST IF EXISTS (float8 AS clob) CASCADE; -/* numeric to clob */ -DROP CAST IF EXISTS (numeric AS clob) CASCADE; -/* timestamptz to clob */ -DROP CAST IF EXISTS (timestamptz AS clob) CASCADE; -/* timestamp to clob */ -DROP CAST IF EXISTS (timestamp AS clob) CASCADE; -/* clob to int1 */ -DROP CAST IF EXISTS (clob AS int1) CASCADE; -/* clob to int2*/ -DROP CAST IF EXISTS (clob AS int2) CASCADE; -/* clob to int4*/ -DROP CAST IF EXISTS (clob AS int4) CASCADE; -/* clob to int8*/ -DROP CAST IF EXISTS (clob AS int8) CASCADE; -/* clob to float4*/ -DROP CAST IF EXISTS (clob AS float4) CASCADE; -/* clob to float8*/ -DROP CAST IF EXISTS (clob AS float8) CASCADE; -/* clob to numeric*/ -DROP CAST IF EXISTS (clob AS numeric) CASCADE; - -DO $DO$ -DECLARE - ans boolean; - user_name text; - global_query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP VIEW IF EXISTS DBE_PERF.local_active_session CASCADE; - end if; -END $DO$; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_current_instance_info(text, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name_new text; - node_count int; - BEGIN - - IF $2 is null THEN - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info()'; - ELSE - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info() limit '||$2; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='||quote_literal($1); - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name_new in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - select count(*) from pgxc_node where node_name=quote_literal(node_name_new) into node_count; - IF node_count <> 0 THEN - query_str := 'EXECUTE DIRECT ON ('||node_name_new||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END IF; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_history_instance_info(text, TIMESTAMP, TIMESTAMP, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name_new text; - node_count int; - BEGIN - - IF $4 is null THEN - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'||quote_literal($2)||' and timestamp <'||quote_literal($3); - ELSE - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'||quote_literal($2)||' and timestamp <'||quote_literal($3)||' limit '||quote_literal($4); - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='||quote_literal($1); - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name_new in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - select count(*) from pgxc_node where node_name=quote_literal(node_name_new) into node_count; - IF node_count <> 0 THEN - query_str := 'EXECUTE DIRECT ON ('||node_name_new||') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END IF; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_current_instance_info(text, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name text; - BEGIN - - IF $2 is null THEN - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info()'; - ELSE - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info() limit '||$2; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='||quote_literal($1); - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name in select pg_catalog.regexp_split_to_table(quote_literal($1),',') LOOP - query_str := 'EXECUTE DIRECT ON ('||node_name||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_history_instance_info(text, TIMESTAMP, TIMESTAMP, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name text; - BEGIN - - IF $4 is null THEN - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'||quote_literal($2)||' and timestamp <'||quote_literal($3); - ELSE - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'||quote_literal($2)||' and timestamp <'||quote_literal($3)||' limit '||quote_literal($4); - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='||quote_literal($1); - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name in select pg_catalog.regexp_split_to_table(quote_literal($1),',') LOOP - query_str := 'EXECUTE DIRECT ON ('||node_name||') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -DROP VIEW IF EXISTS pg_catalog.pg_total_user_resource_info CASCADE; - -DROP FUNCTION IF EXISTS pg_catalog.gs_wlm_get_all_user_resource_info(OUT userid Oid, OUT used_memory int, OUT total_memory int, OUT used_cpu float, OUT total_cpu int, OUT used_space bigint, OUT total_space bigint, OUT used_temp_space bigint, OUT total_temp_space bigint, OUT used_spill_space bigint, OUT total_spill_space bigint, OUT read_kbytes bigint, OUT write_kbytes bigint, OUT read_counts bigint, OUT write_counts bigint, OUT read_speed float, OUT write_speed float) cascade; -CREATE OR REPLACE FUNCTION pg_catalog.gs_wlm_get_all_user_resource_info() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str2 text; - BEGIN - query_str := 'SELECT rolname FROM pg_authid'; - FOR row_name IN EXECUTE(query_str) LOOP - query_str2 := 'SELECT * FROM pg_catalog.gs_wlm_user_resource_info(''' || row_name.rolname || ''')'; - FOR row_data IN EXECUTE(query_str2) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW pg_catalog.pg_total_user_resource_info_oid AS -SELECT * FROM pg_catalog.gs_wlm_get_all_user_resource_info() AS -(userid Oid, - used_memory int, - total_memory int, - used_cpu float, - total_cpu int, - used_space bigint, - total_space bigint, - used_temp_space bigint, - total_temp_space bigint, - used_spill_space bigint, - total_spill_space bigint, - read_kbytes bigint, - write_kbytes bigint, - read_counts bigint, - write_counts bigint, - read_speed float, - write_speed float -); - -DROP FUNCTION IF EXISTS pg_catalog.gs_wlm_session_respool() cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5021; -CREATE OR REPLACE FUNCTION pg_catalog.gs_wlm_session_respool(input bigint, OUT datid oid, OUT threadid bigint, OUT sessionid bigint, OUT threadpid integer, OUT usesysid oid, OUT cgroup text, OUT session_respool name) RETURNS SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_session_respool'; - - -DROP FUNCTION IF EXISTS pg_catalog.pg_cbm_rotate_file(in rotate_lsn text) CASCADE; - - -DROP FUNCTION IF EXISTS pg_catalog.distributed_count(text,text); -DROP FUNCTION IF EXISTS pg_catalog.table_skewness_with_schema(text,text); - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_current_instance_info(text, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name text; - flag boolean; - special text := '[ ;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT pg_catalog.regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - IF flag = true THEN - RAISE WARNING 'Illegal character entered for function'; - return; - END IF; - - IF $2 is null THEN - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info()'; - ELSE - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info() limit '||$2; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='''||$1||''''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - query_str := 'EXECUTE DIRECT ON ('||node_name||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_history_instance_info(text, TIMESTAMP, TIMESTAMP, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name text; - flag boolean; - special text := '[ ;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT pg_catalog.regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - IF flag = true THEN - RAISE WARNING 'Illegal character entered for function'; - return; - END IF; - - IF $4 is null THEN - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'''''||$2||''''' and timestamp <'''''||$3||''''' '; - ELSE - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'''''||$2||''''' and timestamp <'''''||$3||''''' limit '||$4; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='''||$1||''''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - query_str := 'EXECUTE DIRECT ON ('||node_name||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.distributed_count(IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - total_num bigint; - flag boolean; - special text := '[;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - RETURN; - END IF; - EXECUTE 'SELECT count(1) FROM ' || $1 - INTO total_num; - - --Get the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node, pgxc_class where node_type IN (''C'', ''D'') AND is_oid_in_group_members(oid, nodeoids) AND - pcrelid=''' || $1 || '''::regclass::oid'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select ''''DN_name'''' as dnname1, count(1) as count1 from ' || $1 || ''''; - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.dnname1 := CASE - WHEN pg_catalog.LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-pg_catalog.length(row_name.node_name)) - ELSE pg_catalog.SUBSTR(row_name.node_name,1,20) - END; - DNName := row_data.dnname1; - Num := row_data.count1; - IF total_num = 0 THEN - Ratio := 0.000 ||'%'; - ELSE - Ratio := ROUND(row_data.count1/total_num*100,3) || '%'; - END IF; - RETURN next; - END LOOP; - END LOOP; - - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.table_skewness(text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -declare -flag boolean; -special text := '[;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - return NEXT; - ELSE - RETURN QUERY EXECUTE 'SELECT * FROM pg_catalog.distributed_count(''' || $1 || ''') ORDER BY num DESC, dnname'; - END IF; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_get_table_distribution( IN table_name TEXT, IN schema_name TEXT) -RETURNS TEXT -AS -$$ -DECLARE -nodename text; -query_str text; -row_data record; -row_data1 record; -nodelist text; -flag boolean; -special text := '[ ;|-]'; -BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN table_name, IN special; - IF flag = true THEN - raise WARNING 'Illegal character entered for function'; - return nodelist; - END IF; - - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN schema_name, IN special; - IF flag = true THEN - raise WARNING 'Illegal character entered for function'; - return nodelist; - END IF; - - query_str := 'SELECT oid,node_name FROM pgxc_node WHERE node_type=''D'' order by node_name'; - - FOR row_data IN EXECUTE(query_str) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_data.node_name || ') ''SELECT count(*) AS num FROM pg_class c LEFT JOIN pg_namespace n ON c.relnamespace = n.oid WHERE relname='''''||table_name||''''' AND n.nspname='''''||schema_name||''''' '''; - FOR row_data1 IN EXECUTE(query_str) LOOP - IF row_data1.num = 1 THEN - nodelist := nodelist || ' '|| row_data.oid; - END IF; - END LOOP; - END LOOP; - - RETURN nodelist; -END; -$$ -LANGUAGE plpgsql; - -CREATE OR REPLACE FUNCTION pg_catalog.get_shard_oids_byname(IN node_name varchar) -RETURNS Oid[] AS $$ -declare - node_oid Oid; - nodes Oid[]; - nodenames_query text; - total_num bigint; - flag boolean; - special text := '[;|-]'; -BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - return '{0}'; - ELSE - nodenames_query := 'SELECT oid FROM pgxc_node WHERE node_name = $1 ORDER BY oid'; - FOR node_oid IN EXECUTE nodenames_query USING node_name LOOP - nodes := array_append(nodes, node_oid); - END LOOP; - RETURN nodes; - END IF; -END; $$ -LANGUAGE plpgsql NOT FENCED; - -DROP FUNCTION IF EXISTS pg_catalog.pg_stat_get_activity(INT8) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 2022; -CREATE FUNCTION pg_catalog.pg_stat_get_activity(INT8, OUT datid OID, OUT pid INT8, OUT sessionid INT8, OUT usesysid OID, OUT application_name TEXT, OUT state TEXT, -OUT query TEXT, OUT waiting BOOL, OUT xact_start timestamptz, OUT query_start timestamptz, OUT backend_start timestamptz, OUT state_change timestamptz, OUT client_addr INET, -OUT client_hostname TEXT, OUT client_port INT4, OUT enqueue TEXT, OUT query_id INT8) RETURNS -SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_activity'; - -DROP FUNCTION IF EXISTS pg_catalog.pg_stat_get_activity_with_conninfo(INT8) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 4212; -CREATE FUNCTION pg_catalog.pg_stat_get_activity_with_conninfo(INT8, OUT datid OID, OUT pid INT8, OUT sessionid INT8, OUT usesysid OID, OUT application_name TEXT, OUT state TEXT, -OUT query TEXT, OUT waiting BOOL, OUT xact_start timestamptz, OUT query_start timestamptz, OUT backend_start timestamptz, OUT state_change timestamptz, OUT client_addr INET, -OUT client_hostname TEXT, OUT client_port INT4, OUT enqueue TEXT, OUT query_id INT8, OUT connection_info TEXT) RETURNS -SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_activity_with_conninfo'; - -DROP FUNCTION IF EXISTS pg_catalog.pg_stat_get_session_wlmstat(INT4) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 3502; -CREATE FUNCTION pg_catalog.pg_stat_get_session_wlmstat(INT4, OUT datid OID, OUT threadid INT8, OUT sessionid INT8, OUT threadpid INT4, OUT usesysid OID, OUT appname TEXT, OUT query TEXT, -OUT priority INT8, OUT block_time INT8, OUT elapsed_time INT8, OUT total_cpu_time INT8, OUT skew_percent INT4, OUT statement_mem INT4, OUT active_points INT4, OUT dop_value INT4, OUT current_cgroup TEXT, -OUT current_status TEXT, OUT enqueue_state TEXT, OUT attribute TEXT, OUT is_plana BOOL, OUT node_group TEXT) RETURNS -SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_session_wlmstat'; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_activity AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.sessionid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query, - S.connection_info - FROM pg_database D, pg_stat_get_activity_with_conninfo(NULL) AS S, pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_activity_ng AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.sessionid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query, - N.node_group - FROM pg_database D, pg_stat_get_activity(NULL) AS S, pg_stat_get_activity_ng(NULL) AS N, pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid AND - S.sessionid = N.sessionid; - -CREATE OR REPLACE VIEW pg_catalog.pg_session_wlmstat AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.threadid, - S.sessionid, - S.threadpid AS processid, - S.usesysid, - S.appname, - U.rolname AS usename, - S.priority, - S.attribute, - S.block_time, - S.elapsed_time, - S.total_cpu_time, - S.skew_percent AS cpu_skew_percent, - S.statement_mem, - S.active_points, - S.dop_value, - S.current_cgroup AS control_group, - S.current_status AS status, - S.enqueue_state AS enqueue, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query, - S.is_plana, - S.node_group - FROM pg_database D, pg_stat_get_session_wlmstat(NULL) AS S, pg_authid AS U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid; - - -DO $DO$ -DECLARE - ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE OR REPLACE VIEW dbe_perf.session_stat_activity AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query - FROM pg_database D, pg_stat_get_activity(NULL) AS S, pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.threadid = S.pid; - - - CREATE OR REPLACE VIEW DBE_PERF.replication_stat AS - SELECT - S.pid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - W.state, - W.sender_sent_location, - W.receiver_write_location, - W.receiver_flush_location, - W.receiver_replay_location, - W.sync_priority, - W.sync_state - FROM pg_stat_get_activity(NULL) AS S, pg_authid U, - pg_stat_get_wal_senders() AS W - WHERE S.usesysid = U.oid AND - S.pid = W.pid; - - CREATE OR REPLACE VIEW DBE_PERF.statement_wlmstat_complex_runtime AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.threadid, - S.threadpid AS processid, - S.usesysid, - S.appname, - U.rolname AS usename, - S.priority, - S.attribute, - S.block_time, - S.elapsed_time, - S.total_cpu_time, - S.skew_percent AS cpu_skew_percent, - S.statement_mem, - S.active_points, - S.dop_value, - S.current_cgroup AS control_group, - S.current_status AS status, - S.enqueue_state AS enqueue, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query, - S.is_plana, - S.node_group - FROM pg_database D, pg_stat_get_session_wlmstat(NULL) AS S, pg_authid AS U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.threadid = S.threadid; - end if; -END $DO$; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_replication AS - SELECT - S.pid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - W.state, - W.sender_sent_location, - W.receiver_write_location, - W.receiver_flush_location, - W.receiver_replay_location, - W.sync_priority, - W.sync_state - FROM pg_catalog.pg_stat_get_activity(NULL) AS S, pg_authid U, - pg_catalog.pg_stat_get_wal_senders() AS W - WHERE S.usesysid = U.oid AND - S.pid = W.pid; - -CREATE OR REPLACE VIEW pg_catalog.DV_SESSIONS AS - SELECT - sa.sessionid AS SID, - 0::integer AS SERIAL#, - sa.usesysid AS USER#, - ad.rolname AS USERNAME - FROM pg_catalog.pg_stat_get_activity(NULL) AS sa - LEFT JOIN pg_authid ad ON(sa.usesysid = ad.oid) - WHERE sa.application_name <> 'JobScheduler'; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_workload_records AS - SELECT - P.node_name, - S.threadid AS thread_id, - S.threadpid AS processid, - P.start_time AS time_stamp, - U.rolname AS username, - P.memory, - P.actpts AS active_points, - P.maxpts AS max_points, - P.priority, - P.resource_pool, - S.current_status AS status, - S.current_cgroup AS control_group, - P.queue_type AS enqueue, - S.query, - P.node_group - FROM pg_catalog.pg_stat_get_session_wlmstat(NULL) AS S, pg_authid U, - pg_catalog.gs_wlm_get_workload_records(0) P - WHERE P.query_pid = S.threadpid AND - S.usesysid = U.oid; - -CREATE OR REPLACE FUNCTION pg_catalog.get_large_table_name(relfile_node text, threshold_size_gb int8) -RETURNS text -AS $$ -DECLARE - query_str text; - relname text; -BEGIN - query_str := 'SELECT - NVL - ( - (SELECT - (case pg_catalog.pg_table_size(c.oid)/1024/1024/1024 > ' || threshold_size_gb || ' - when true then pg_catalog.concat(concat(n.nspname, ''.''), c.relname) - else ''null'' - end - ) relname - FROM - pg_catalog.pg_class c, - pg_catalog.pg_namespace n - WHERE - c.relnamespace = n.oid - AND - c.relfilenode = ' || $1 || ' - ) - , ''null'' - ) relname'; - FOR relname IN EXECUTE(query_str) LOOP - return relname; - END LOOP; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_wlm_get_user_info(input integer, OUT userid oid, OUT sysadmin boolean, OUT rpoid oid, OUT parentid oid, OUT totalspace bigint, OUT spacelimit bigint, OUT childcount integer, OUT childlist text) RETURNS SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_wlm_user_info'; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_wlm_get_resource_pool_info(input integer, OUT respool_oid oid, OUT ref_count integer, OUT active_points integer, OUT running_count integer, OUT waiting_count integer, OUT iops_limits integer, OUT io_priority integer) RETURNS SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_resource_pool_info'; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_wlm_get_workload_records(input integer, OUT node_idx oid, OUT query_pid bigint, OUT start_time bigint, OUT memory integer, OUT actpts integer, OUT maxpts integer, OUT priority integer, OUT resource_pool text, OUT node_name text, OUT queue_type text, OUT node_group text) RETURNS SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_workload_records'; - -DROP FUNCTION IF EXISTS pg_catalog.gs_get_control_group_info(out group_name text, out group_type text, out gid bigint, out classgid bigint, out class text, out group_workload text, out shares bigint, out limits bigint, out wdlevel bigint, out cpucores text, out nodegroup text, out group_kind text) CASCADE; -CREATE OR REPLACE FUNCTION pg_catalog.gs_get_control_group_info() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT group_name,group_kind FROM pgxc_group WHERE group_kind = ''v'' OR group_kind = ''i'' '; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - IF row_name.group_kind = 'i' THEN - query_str := 'SELECT *,CAST(''' || row_name.group_name || ''' AS TEXT) AS nodegroup,CAST(''' || row_name.group_kind || ''' AS TEXT) AS group_kind FROM pg_catalog.gs_all_nodegroup_control_group_info(''installation'')'; - ELSE - query_str := 'SELECT *,CAST(''' || row_name.group_name || ''' AS TEXT) AS nodegroup,CAST(''' || row_name.group_kind || ''' AS TEXT) AS group_kind FROM pg_catalog.gs_all_nodegroup_control_group_info(''' ||row_name. group_name||''')'; - END IF; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - --- the view for function gs_get_control_group_info. -DROP VIEW IF EXISTS pg_catalog.gs_get_control_group_info CASCADE; -CREATE VIEW pg_catalog.gs_get_control_group_info AS - SELECT * from gs_get_control_group_info() AS - ( - name text, - type text, - gid bigint, - classgid bigint, - class text, - workload text, - shares bigint, - limits bigint, - wdlevel bigint, - cpucores text, - nodegroup text, - group_kind text - ); - - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS DBE_PERF.get_wlm_controlgroup_ng_config(out group_name text, out group_type text, out gid bigint, out classgid bigint, out class text, out group_workload text, out shares bigint, out limits bigint, out wdlevel bigint, out cpucores text, out nodegroup text, out group_kind text) CASCADE; - DROP VIEW IF EXISTS DBE_PERF.wlm_controlgroup_ng_config CASCADE; - CREATE OR REPLACE FUNCTION DBE_PERF.get_wlm_controlgroup_ng_config() - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT group_name,group_kind FROM pgxc_group WHERE group_kind = ''v'' OR group_kind = ''i'' '; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - IF row_name.group_kind = 'i' THEN - query_str := 'SELECT *,CAST(''' || row_name.group_name || ''' AS TEXT) AS nodegroup,CAST(''' || row_name.group_kind || ''' AS TEXT) AS group_kind FROM pg_catalog.gs_all_nodegroup_control_group_info(''installation'')'; - ELSE - query_str := 'SELECT *,CAST(''' || row_name.group_name || ''' AS TEXT) AS nodegroup,CAST(''' || row_name.group_kind || ''' AS TEXT) AS group_kind FROM pg_catalog.gs_all_nodegroup_control_group_info(''' ||row_name. group_name||''')'; - END IF; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - -- the view for function gs_get_control_group_info. - CREATE OR REPLACE VIEW DBE_PERF.wlm_controlgroup_ng_config AS - SELECT * FROM DBE_PERF.get_wlm_controlgroup_ng_config() AS - (name text, - type text, - gid bigint, - classgid bigint, - class text, - workload text, - shares bigint, - limits bigint, - wdlevel bigint, - cpucores text, - nodegroup text, - group_kind text); - end if; -END $DO$; - - -DROP FUNCTION IF EXISTS pg_catalog.pg_get_flush_lsn() CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.pg_get_sync_flush_lsn() CASCADE; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS DBE_PERF.get_global_gs_asp() CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.get_datanode_active_session() CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.get_datanode_active_session_hist() CASCADE; - DROP VIEW IF EXISTS DBE_PERF.global_active_session CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.get_global_active_session() CASCADE; - DROP VIEW IF EXISTS DBE_PERF.local_active_session CASCADE; - DROP VIEW IF EXISTS DBE_PERF.global_thread_wait_status CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.get_global_thread_wait_status() CASCADE; - DROP VIEW IF EXISTS DBE_PERF.thread_wait_status CASCADE; - DROP VIEW IF EXISTS DBE_PERF.locks CASCADE; - end if; -END$$; - -DROP FUNCTION IF EXISTS pg_catalog.working_version_num() CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.locktag_decode() CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.get_local_active_session() CASCADE; -DROP VIEW IF EXISTS pg_catalog.pgxc_thread_wait_status CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.pgxc_get_thread_wait_status() CASCADE; -DROP VIEW IF EXISTS pg_catalog.pg_thread_wait_status CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.pg_stat_get_status() CASCADE; -DROP VIEW IF EXISTS pg_catalog.pg_locks CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.pg_lock_status() CASCADE; - -SET LOCAL inplace_upgrade_next_system_object_oids=IUO_PROC, 1371; -CREATE OR REPLACE FUNCTION pg_catalog.pg_lock_status -( - OUT locktype pg_catalog.text, - OUT database pg_catalog.oid, - OUT relation pg_catalog.oid, - OUT page pg_catalog.int4, - OUT tuple pg_catalog.int2, - OUT bucket pg_catalog.int4, - OUT virtualxid pg_catalog.text, - OUT transactionid pg_catalog.xid, - OUT classid pg_catalog.oid, - OUT objid pg_catalog.oid, - OUT objsubid pg_catalog.int2, - OUT virtualtransaction pg_catalog.text, - OUT pid pg_catalog.int8, - OUT sessionid pg_catalog.int8, - OUT mode pg_catalog.text, - OUT granted pg_catalog.bool, - OUT fastpath pg_catalog.bool) -RETURNS SETOF record LANGUAGE INTERNAL ROWS 1000 VOLATILE STRICT as 'pg_lock_status'; -CREATE OR REPLACE VIEW pg_catalog.pg_locks AS - SELECT DISTINCT * from pg_catalog.pg_lock_status(); - -set local inplace_upgrade_next_system_object_oids = IUO_PROC, 3980; -CREATE OR REPLACE FUNCTION pg_catalog.pg_stat_get_status -( - IN tid pg_catalog.int8, - OUT node_name pg_catalog.text, - OUT db_name pg_catalog.text, - OUT thread_name pg_catalog.text, - OUT query_id pg_catalog.int8, - OUT tid pg_catalog.int8, - OUT sessionid pg_catalog.int8, - OUT lwtid pg_catalog.int4, - OUT psessionid pg_catalog.int8, - OUT tlevel pg_catalog.int4, - OUT smpid pg_catalog.int4, - OUT wait_status pg_catalog.text, - OUT wait_event pg_catalog.text) -RETURNS SETOF record LANGUAGE INTERNAL ROWS 1000 VOLATILE STRICT as 'pg_stat_get_status'; -CREATE VIEW pg_catalog.pg_thread_wait_status AS - SELECT * FROM pg_catalog.pg_stat_get_status(NULL); - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 3591; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_thread_wait_status( - OUT node_name pg_catalog.text, - OUT db_name pg_catalog.text, - OUT thread_name pg_catalog.text, - OUT query_id pg_catalog.int8, - OUT tid pg_catalog.int8, - OUT sessionid pg_catalog.int8, - OUT lwtid pg_catalog.int4, - OUT psessionid pg_catalog.int8, - OUT tlevel pg_catalog.int4, - OUT smpid pg_catalog.int4, - OUT wait_status pg_catalog.text, - OUT wait_event pg_catalog.text) -RETURNS SETOF RECORD -LANGUAGE INTERNAL COST 100 ROWS 1000 AS 'pgxc_stat_get_status'; -CREATE OR REPLACE VIEW pg_catalog.pgxc_thread_wait_status AS - SELECT * FROM pg_catalog.pgxc_get_thread_wait_status(); - -set local inplace_upgrade_next_system_object_oids = IUO_PROC, 5721; -CREATE OR REPLACE FUNCTION pg_catalog.get_local_active_session - (OUT sampleid bigint, - OUT sample_time timestamp with time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp with time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) -RETURNS setof record LANGUAGE INTERNAL VOLATILE NOT FENCED as 'get_local_active_session'; - -DO $DO$ -DECLARE - ans boolean; - user_name text; - global_query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE OR REPLACE VIEW dbe_perf.locks AS - SELECT * FROM pg_catalog.pg_lock_status() AS L; - - CREATE OR REPLACE VIEW DBE_PERF.thread_wait_status AS - SELECT * FROM pg_catalog.pg_stat_get_status(NULL); - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_thread_wait_status() - RETURNS setof DBE_PERF.thread_wait_status - AS $$ - DECLARE - row_data DBE_PERF.thread_wait_status%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all cn dn node names - query_str_nodes := 'SELECT node_name FROM pg_catalog.pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.thread_wait_status'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE VIEW DBE_PERF.global_thread_wait_status AS - SELECT * FROM DBE_PERF.get_global_thread_wait_status(); - - CREATE OR REPLACE FUNCTION DBE_PERF.get_datanode_active_session_hist - ( IN datanode text, - IN start_ts timestamp without time zone, - IN end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA pg_catalog.gs_asp%ROWTYPE; - cn_name record; - query_text record; - QUERY_STR text; - query_cn text; - query_str_cn_name text; - node_str text; - BEGIN - node_str := 'SELECT * FROM pg_catalog.gs_asp where sample_time > '''''||$2||''''' and sample_time < '''''||$3||''''; - QUERY_STR := 'EXECUTE DIRECT ON (' || $1 || ') '''|| node_str ||''''';'; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := datanode; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - IF ROW_DATA.cn_id IS NULL THEN - unique_query := ROW_DATA.unique_query; - ELSE - query_str_cn_name := 'SELECT node_name FROM pg_catalog.pgxc_node WHERE node_id='||ROW_DATA.cn_id||' AND nodeis_active = true'; - FOR cn_name IN EXECUTE(query_str_cn_name) LOOP - query_cn := 'EXECUTE DIRECT ON (' || cn_name.node_name || ') ''SELECT unique_query FROM pg_catalog.gs_asp where unique_query_id = '|| ROW_DATA.unique_query_id||' limit 1'''; - FOR query_text IN EXECUTE(query_cn) LOOP - unique_query := query_text.unique_query; - END LOOP; - END LOOP; - END IF; - RETURN NEXT; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_gs_asp - (IN start_ts timestamp without time zone, - IN end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA pg_catalog.gs_asp%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - node_str TEXT; - BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM pg_catalog.PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'')'; - node_str := 'SELECT * FROM pg_catalog.gs_asp where sample_time > '''''||$1||''''' and sample_time < '''''||$2||''''; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') '''|| node_str ||''''';'; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := ROW_NAME.NODE_NAME; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - unique_query := ROW_DATA.unique_query; - RETURN NEXT; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - SELECT SESSION_USER INTO user_name; - global_query_str := 'GRANT ALL ON TABLE DBE_PERF.locks TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE global_query_str; - global_query_str := 'GRANT ALL ON TABLE DBE_PERF.global_thread_wait_status TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE global_query_str; - global_query_str := 'GRANT ALL ON TABLE DBE_PERF.thread_wait_status TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE global_query_str; - - GRANT SELECT ON DBE_PERF.locks TO public; - GRANT SELECT ON DBE_PERF.global_thread_wait_status TO public; - GRANT SELECT ON DBE_PERF.thread_wait_status TO public; - - - end if; -END $DO$; - -GRANT SELECT ON pg_catalog.pg_locks TO public; -GRANT SELECT ON pg_catalog.pg_thread_wait_status TO public; -GRANT SELECT ON pg_catalog.pgxc_thread_wait_status TO public; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_tables where tablename = 'snap_global_thread_wait_status' and schemaname = 'snapshot' limit 1) into ans; - if ans = true then - alter table snapshot.snap_global_thread_wait_status - DROP COLUMN IF EXISTS snap_locktag, - DROP COLUMN IF EXISTS snap_lockmode, - DROP COLUMN IF EXISTS snap_block_sessionid; - end if; -END$DO$; - --- ---------------------------------------------------------------- --- rollback pg_pooler_status --- ---------------------------------------------------------------- -DROP FUNCTION IF EXISTS pg_catalog.pg_stat_get_pooler_status(OUT database_name text, OUT user_name text, OUT tid int8, OUT pgoptions text, OUT node_oid int8, OUT in_use boolean, OUT session_params text, OUT fdsock int8, OUT remote_pid int8, OUT used_count int8) CASCADE; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 3955; -CREATE FUNCTION pg_catalog.pg_stat_get_pooler_status(OUT database_name text, OUT user_name text, OUT tid int8, OUT pgoptions text, OUT node_oid int8, OUT in_use boolean, OUT session_params text, OUT fdsock int8, OUT remote_pid int8) RETURNS SETOF record LANGUAGE INTERNAL STABLE ROWS 100 as 'pg_stat_get_pooler_status'; - -DROP VIEW IF EXISTS pg_catalog.pg_pooler_status; -CREATE VIEW pg_catalog.pg_pooler_status AS - SELECT - S.database_name AS database, - S.user_name AS user_name, - S.tid AS tid, - S.node_oid AS node_oid, - D.node_name AS node_name, - S.in_use AS in_use, - D.node_port AS node_port, - S.fdsock AS fdsock, - S.remote_pid AS remote_pid, - S.session_params AS session_params - FROM pgxc_node D, pg_stat_get_pooler_status() AS S - WHERE D.oid = S.node_oid; - -GRANT SELECT ON pg_catalog.pg_pooler_status TO public; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP VIEW IF EXISTS DBE_PERF.summary_statement cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_summary_statement( - OUT node_name name, - OUT node_id integer, - OUT user_name name, - OUT user_id oid, - OUT unique_sql_id bigint, - OUT query text, - OUT n_calls bigint, - OUT min_elapse_time bigint, - OUT max_elapse_time bigint, - OUT total_elapse_time bigint, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - Out net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text - ) cascade; - DROP VIEW IF EXISTS DBE_PERF.STATEMENT cascade; - end if; -END$DO$; - -DROP FUNCTION IF EXISTS pg_catalog.get_instr_unique_sql() cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5702; -CREATE FUNCTION pg_catalog.get_instr_unique_sql -( - OUT node_name name, - OUT node_id integer, - OUT user_name name, - OUT user_id oid, - OUT unique_sql_id bigint, - OUT query text, - OUT n_calls bigint, - OUT min_elapse_time bigint, - OUT max_elapse_time bigint, - OUT total_elapse_time bigint, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT net_send_time bigint, - OUT data_io_time bigint -) -RETURNS setof record LANGUAGE INTERNAL VOLATILE NOT FENCED as 'get_instr_unique_sql'; - -DO $DO$ -DECLARE - ans boolean; - user_name text; - query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE VIEW DBE_PERF.statement AS - SELECT * FROM get_instr_unique_sql(); - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statement() - RETURNS setof DBE_PERF.statement - AS $$ - DECLARE - row_data DBE_PERF.statement%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE VIEW DBE_PERF.summary_statement AS - SELECT * FROM DBE_PERF.get_summary_statement(); - SELECT SESSION_USER INTO user_name; - query_str := 'GRANT ALL ON TABLE DBE_PERF.STATEMENT TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - query_str := 'GRANT ALL ON TABLE DBE_PERF.summary_statement TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - GRANT SELECT ON TABLE DBE_PERF.STATEMENT TO PUBLIC; - GRANT SELECT ON TABLE DBE_PERF.summary_statement TO PUBLIC; - end if; -END$DO$; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_tables where tablename = 'snap_summary_statement' and schemaname = 'snapshot' limit 1) into ans; - if ans = true then - alter table snapshot.snap_summary_statement - DROP COLUMN IF EXISTS snap_net_send_info, - DROP COLUMN IF EXISTS snap_net_recv_info, - DROP COLUMN IF EXISTS snap_net_stream_send_info, - DROP COLUMN IF EXISTS snap_net_stream_recv_info; - end if; -END$DO$; - -DROP VIEW IF EXISTS pg_catalog.gs_matviews CASCADE; - -do $$DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP VIEW IF EXISTS DBE_PERF.global_get_bgwriter_status CASCADE; - DROP FUNCTION IF EXISTS pg_catalog.local_bgwriter_stat(); - DROP FUNCTION IF EXISTS pg_catalog.remote_bgwriter_stat(); - end if; -END$$; - -grant ALL on table pg_catalog.gs_wlm_session_query_info_all to public; -grant ALL on table pg_catalog.gs_wlm_operator_info to public; -grant ALL on table pg_catalog.gs_wlm_ec_operator_info to public; -grant all on pg_catalog.gs_wlm_session_info to public; -grant all on pg_catalog.gs_wlm_user_session_info to public; -grant all on pg_catalog.gs_wlm_workload_records to public; - -DO $DO$ -DECLARE - ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS dbe_perf.track_memory_context(IN contexts text) cascade; - DROP FUNCTION IF EXISTS dbe_perf.track_memory_context_detail(OUT context_name text, OUT file text, OUT line int, OUT size bigint) cascade; - DROP VIEW IF EXISTS dbe_perf.track_memory_context_detail cascade; - end if; -END$DO$; - -DROP FUNCTION IF EXISTS pg_catalog.pg_stat_get_activity(INT8) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 2022; -CREATE FUNCTION pg_catalog.pg_stat_get_activity(INT8, OUT datid OID, OUT pid INT8, OUT sessionid INT8, OUT usesysid OID, OUT application_name TEXT, OUT state TEXT, -OUT query TEXT, OUT waiting BOOL, OUT xact_start timestamptz, OUT query_start timestamptz, OUT backend_start timestamptz, OUT state_change timestamptz, OUT client_addr INET, -OUT client_hostname TEXT, OUT client_port INT4, OUT enqueue TEXT, OUT query_id INT8) RETURNS -SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_activity'; - -DROP FUNCTION IF EXISTS pg_catalog.pg_stat_get_activity_with_conninfo(INT8) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 4212; -CREATE FUNCTION pg_catalog.pg_stat_get_activity_with_conninfo(INT8, OUT datid OID, OUT pid INT8, OUT sessionid INT8, OUT usesysid OID, OUT application_name TEXT, OUT state TEXT, -OUT query TEXT, OUT waiting BOOL, OUT xact_start timestamptz, OUT query_start timestamptz, OUT backend_start timestamptz, OUT state_change timestamptz, OUT client_addr INET, -OUT client_hostname TEXT, OUT client_port INT4, OUT enqueue TEXT, OUT query_id INT8, OUT connection_info TEXT) RETURNS -SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_activity_with_conninfo'; - -DROP FUNCTION IF EXISTS pg_catalog.pg_stat_get_session_wlmstat(INT4) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 3502; -CREATE FUNCTION pg_catalog.pg_stat_get_session_wlmstat(INT4, OUT datid OID, OUT threadid INT8, OUT sessionid INT8, OUT threadpid INT4, OUT usesysid OID, OUT appname TEXT, OUT query TEXT, -OUT priority INT8, OUT block_time INT8, OUT elapsed_time INT8, OUT total_cpu_time INT8, OUT skew_percent INT4, OUT statement_mem INT4, OUT active_points INT4, OUT dop_value INT4, OUT current_cgroup TEXT, -OUT current_status TEXT, OUT enqueue_state TEXT, OUT attribute TEXT, OUT is_plana BOOL, OUT node_group TEXT) RETURNS -SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_session_wlmstat'; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_activity AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.sessionid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query, - S.connection_info - FROM pg_database D, pg_stat_get_activity_with_conninfo(NULL) AS S, pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_activity_ng AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.sessionid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query, - N.node_group - FROM pg_database D, pg_stat_get_activity(NULL) AS S, pg_stat_get_activity_ng(NULL) AS N, pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid AND - S.sessionid = N.sessionid; - -CREATE OR REPLACE VIEW pg_catalog.pg_session_wlmstat AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.threadid, - S.sessionid, - S.threadpid AS processid, - S.usesysid, - S.appname, - U.rolname AS usename, - S.priority, - S.attribute, - S.block_time, - S.elapsed_time, - S.total_cpu_time, - S.skew_percent AS cpu_skew_percent, - S.statement_mem, - S.active_points, - S.dop_value, - S.current_cgroup AS control_group, - S.current_status AS status, - S.enqueue_state AS enqueue, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query, - S.is_plana, - S.node_group - FROM pg_database D, pg_stat_get_session_wlmstat(NULL) AS S, pg_authid AS U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid; - - -DO $DO$ -DECLARE - ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE OR REPLACE VIEW dbe_perf.session_stat_activity AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query - FROM pg_database D, pg_stat_get_activity(NULL) AS S, pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.threadid = S.pid; - - - CREATE OR REPLACE VIEW DBE_PERF.replication_stat AS - SELECT - S.pid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - W.state, - W.sender_sent_location, - W.receiver_write_location, - W.receiver_flush_location, - W.receiver_replay_location, - W.sync_priority, - W.sync_state - FROM pg_stat_get_activity(NULL) AS S, pg_authid U, - pg_stat_get_wal_senders() AS W - WHERE S.usesysid = U.oid AND - S.pid = W.pid; - - CREATE OR REPLACE VIEW DBE_PERF.statement_wlmstat_complex_runtime AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.threadid, - S.threadpid AS processid, - S.usesysid, - S.appname, - U.rolname AS usename, - S.priority, - S.attribute, - S.block_time, - S.elapsed_time, - S.total_cpu_time, - S.skew_percent AS cpu_skew_percent, - S.statement_mem, - S.active_points, - S.dop_value, - S.current_cgroup AS control_group, - S.current_status AS status, - S.enqueue_state AS enqueue, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query, - S.is_plana, - S.node_group - FROM pg_database D, pg_stat_get_session_wlmstat(NULL) AS S, pg_authid AS U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.threadid = S.threadid; - end if; -END $DO$; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_replication AS - SELECT - S.pid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - W.state, - W.sender_sent_location, - W.receiver_write_location, - W.receiver_flush_location, - W.receiver_replay_location, - W.sync_priority, - W.sync_state - FROM pg_catalog.pg_stat_get_activity(NULL) AS S, pg_authid U, - pg_catalog.pg_stat_get_wal_senders() AS W - WHERE S.usesysid = U.oid AND - S.pid = W.pid; - -CREATE OR REPLACE VIEW pg_catalog.DV_SESSIONS AS - SELECT - sa.sessionid AS SID, - 0::integer AS SERIAL#, - sa.usesysid AS USER#, - ad.rolname AS USERNAME - FROM pg_catalog.pg_stat_get_activity(NULL) AS sa - LEFT JOIN pg_authid ad ON(sa.usesysid = ad.oid) - WHERE sa.application_name <> 'JobScheduler'; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_workload_records AS - SELECT - P.node_name, - S.threadid AS thread_id, - S.threadpid AS processid, - P.start_time AS time_stamp, - U.rolname AS username, - P.memory, - P.actpts AS active_points, - P.maxpts AS max_points, - P.priority, - P.resource_pool, - S.current_status AS status, - S.current_cgroup AS control_group, - P.queue_type AS enqueue, - S.query, - P.node_group - FROM pg_catalog.pg_stat_get_session_wlmstat(NULL) AS S, pg_authid U, - pg_catalog.gs_wlm_get_workload_records(0) P - WHERE P.query_pid = S.threadpid AND - S.usesysid = U.oid; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_stat_dirty_tables(in dirty_percent int4, in n_tuples int4,in schema text, out relid oid, out relname name, out schemaname name, out n_tup_ins int8, out n_tup_upd int8, out n_tup_del int8, out n_live_tup int8, out n_dead_tup int8, out dirty_page_rate numeric(5,2)) -RETURNS setof record -AS $$ -DECLARE - query_str text; - row_data record; - BEGIN - query_str := 'SELECT oid relid, s.relname,s.schemaname,s.n_tup_ins,s.n_tup_upd,s.n_tup_del,s.n_live_tup,s.n_dead_tup,s.dirty_page_rate - FROM pg_class p, - (SELECT relname, schemaname, SUM(n_tup_ins) n_tup_ins, SUM(n_tup_upd) n_tup_upd, SUM(n_tup_del) n_tup_del, SUM(n_live_tup) n_live_tup, SUM(n_dead_tup) n_dead_tup, CAST((SUM(n_dead_tup) / SUM(n_dead_tup + n_live_tup + 0.00001) * 100) - AS NUMERIC(5,2)) dirty_page_rate FROM pg_catalog.pgxc_stat_dirty_tables('||dirty_percent||','||n_tuples||','''||schema||''') GROUP BY (relname,schemaname)) s - WHERE p.relname = s.relname AND p.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = s.schemaname) ORDER BY dirty_page_rate DESC'; - FOR row_data IN EXECUTE(query_str) LOOP - relid = row_data.relid; - relname = row_data.relname; - schemaname = row_data.schemaname; - n_tup_ins = row_data.n_tup_ins; - n_tup_upd = row_data.n_tup_upd; - n_tup_del = row_data.n_tup_del; - n_live_tup = row_data.n_live_tup; - n_dead_tup = row_data.n_dead_tup; - dirty_page_rate = row_data.dirty_page_rate; - return next; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -drop extension if exists gsredistribute cascade; - -DROP VIEW IF EXISTS pg_catalog.pg_stat_replication; - CREATE VIEW pg_catalog.pg_stat_replication AS - SELECT - S.pid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - W.state, - W.sender_sent_location, - W.receiver_write_location, - W.receiver_flush_location, - W.receiver_replay_location, - W.sync_priority, - W.sync_state - FROM pg_stat_get_activity(NULL) AS S, pg_authid U, - pg_stat_get_wal_senders() AS W - WHERE S.usesysid = U.oid AND - S.pid = W.sender_pid; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP VIEW IF EXISTS dbe_perf.replication_stat; - CREATE VIEW dbe_perf.replication_stat AS - SELECT - S.pid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - W.state, - W.sender_sent_location, - W.receiver_write_location, - W.receiver_flush_location, - W.receiver_replay_location, - W.sync_priority, - W.sync_state - FROM pg_stat_get_activity(NULL) AS S, pg_authid U, - pg_stat_get_wal_senders() AS W - WHERE S.usesysid = U.oid AND - S.pid = W.sender_pid; - end if; -END$DO$; - -CREATE or REPLACE FUNCTION pg_catalog.gs_get_table_distribution( IN table_name TEXT, IN schema_name TEXT) -RETURNS TEXT -AS -$$ -DECLARE -nodename text; -query_str text; -row_data record; -row_data1 record; -nodelist text; -flag boolean; -special text := '[;|-]'; -BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN table_name, IN special; - IF flag = true THEN - raise WARNING 'Illegal character entered for function'; - return nodelist; - END IF; - - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN schema_name, IN special; - IF flag = true THEN - raise WARNING 'Illegal character entered for function'; - return nodelist; - END IF; - - query_str := 'SELECT oid,node_name FROM pgxc_node WHERE node_type=''D'' order by node_name'; - - FOR row_data IN EXECUTE(query_str) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_data.node_name || ') ''SELECT count(*) AS num FROM pg_class c LEFT JOIN pg_namespace n ON c.relnamespace = n.oid WHERE relname='''''||table_name||''''' AND n.nspname='''''||schema_name||''''' '''; - FOR row_data1 IN EXECUTE(query_str) LOOP - IF row_data1.num = 1 THEN - nodelist := nodelist || ' '|| row_data.oid; - END IF; - END LOOP; - END LOOP; - - RETURN nodelist; -END; -$$ -LANGUAGE plpgsql; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_current_instance_info(text, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name text; - BEGIN - IF $2 is null THEN - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info()'; - ELSE - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info() limit '||$2; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='''||$1||''''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - query_str := 'EXECUTE DIRECT ON ('||node_name||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_history_instance_info(text, TIMESTAMP, TIMESTAMP, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name text; - BEGIN - IF $4 is null THEN - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'''''||$2||''''' and timestamp <'''''||$3||''''' '; - ELSE - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'''''||$2||''''' and timestamp <'''''||$3||''''' limit '||$4; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='''||$1||''''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - query_str := 'EXECUTE DIRECT ON ('||node_name||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -DROP VIEW IF EXISTS pg_catalog.pg_roles cascade; -CREATE OR REPLACE VIEW pg_catalog.pg_roles AS - SELECT - rolname, - rolsuper, - rolinherit, - rolcreaterole, - rolcreatedb, - rolcatupdate, - rolcanlogin, - rolreplication, - rolauditadmin, - rolsystemadmin, - rolconnlimit, - '********'::text as rolpassword, - rolvalidbegin, - rolvaliduntil, - rolrespool, - rolparentid, - roltabspace, - setconfig as rolconfig, - pg_authid.oid, - roluseft, - rolkind, - pgxc_group.group_name as nodegroup, - roltempspace, - rolspillspace, - rolmonitoradmin, - roloperatoradmin, - rolpolicyadmin - FROM pg_authid LEFT JOIN pg_db_role_setting s - ON (pg_authid.oid = setrole AND setdatabase = 0) - LEFT JOIN pgxc_group - ON (pg_authid.rolnodegroup = pgxc_group.oid); - -DECLARE - user_name text; - query_str text; -BEGIN - SELECT SESSION_USER INTO user_name; - query_str := 'GRANT ALL ON TABLE pg_catalog.pg_roles TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; -END; -/ - -CREATE OR REPLACE VIEW pg_catalog.pg_rlspolicies AS - SELECT - N.nspname AS schemaname, - C.relname AS tablename, - pol.polname AS policyname, - CASE - WHEN pol.polpermissive THEN - 'PERMISSIVE' - ELSE - 'RESTRICTIVE' - END AS policypermissive, - CASE - WHEN pol.polroles = '{0}' THEN - string_to_array('public', ' ') - ELSE - ARRAY - ( - SELECT rolname - FROM pg_catalog.pg_roles - WHERE oid = ANY (pol.polroles) ORDER BY 1 - ) - END AS policyroles, - CASE pol.polcmd - WHEN 'r' THEN 'SELECT' - WHEN 'a' THEN 'INSERT' - WHEN 'w' THEN 'UPDATE' - WHEN 'd' THEN 'DELETE' - WHEN '*' THEN 'ALL' - END AS policycmd, - pg_catalog.pg_get_expr(pol.polqual, pol.polrelid) AS policyqual - FROM pg_catalog.pg_rlspolicy pol - JOIN pg_catalog.pg_class C ON (C.oid = pol.polrelid) - LEFT JOIN pg_catalog.pg_namespace N ON (N.oid = C.relnamespace); - -GRANT SELECT ON TABLE pg_catalog.pg_rlspolicies TO PUBLIC; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_user_info AS -SELECT - T.userid, - S.rolname AS username, - T.sysadmin, - T.rpoid, - R.respool_name AS respool, - T.parentid, - T.totalspace, - T.spacelimit, - T.childcount, - T.childlist -FROM pg_roles AS S, pg_catalog.gs_wlm_get_user_info(NULL) AS T, pg_resource_pool AS R -WHERE S.oid = T.userid AND T.rpoid = R.oid; - -GRANT SELECT ON TABLE pg_catalog.gs_wlm_user_info TO PUBLIC; - -DO $DO$ -DECLARE - ans boolean; - user_name text; - query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE OR REPLACE VIEW dbe_perf.wlm_user_resource_config AS - SELECT - T.userid, - S.rolname AS username, - T.sysadmin, - T.rpoid, - R.respool_name AS respool, - T.parentid, - T.totalspace, - T.spacelimit, - T.childcount, - T.childlist - FROM pg_roles AS S, gs_wlm_get_user_info(NULL) AS T, pg_resource_pool AS R - WHERE S.oid = T.userid AND T.rpoid = R.oid; - - SELECT SESSION_USER INTO user_name; - query_str := 'GRANT ALL ON TABLE dbe_perf.wlm_user_resource_config TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - - GRANT SELECT ON TABLE dbe_perf.wlm_user_resource_config TO PUBLIC; - end if; -END $DO$; - -CREATE OR REPLACE FUNCTION pg_catalog.pg_get_delta_info(IN rel TEXT, IN schema_name TEXT, OUT part_name TEXT, OUT live_tuple INT8, OUT data_size INT8, OUT blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_info_str text; - query_str text; - query_part_str text; - query_select_str text; - query_size_str text; - row_info_data record; - row_data record; - row_part_info record; - BEGIN - query_info_str := 'SELECT C.oid,C.reldeltarelid,C.parttype FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE C.relname = '''|| rel ||''' and N.nspname = '''|| schema_name ||''''; - FOR row_info_data IN EXECUTE(query_info_str) LOOP - IF row_info_data.parttype = 'n' THEN - query_str := 'SELECT relname,oid from pg_class where oid= '||row_info_data.reldeltarelid||''; - EXECUTE(query_str) INTO row_data; - query_select_str := 'select count(*) from cstore.' || row_data.relname || ''; - EXECUTE (query_select_str) INTO live_tuple; - query_size_str := 'select * from pg_catalog.pg_relation_size(' || row_data.oid || ')'; - EXECUTE (query_size_str) INTO data_size; - blockNum := data_size/8192; - part_name := 'non partition table'; - return next; - ELSE - query_part_str := 'SELECT relname,reldeltarelid from pg_partition where parentid = '||row_info_data.oid|| 'and relname <> '''||rel||''''; - FOR row_part_info IN EXECUTE(query_part_str) LOOP - query_str := 'SELECT relname,oid from pg_class where oid = '||row_part_info.reldeltarelid||''; - part_name := row_part_info.relname; - FOR row_data IN EXECUTE(query_str) LOOP - query_select_str := 'select count(*) from cstore.' || row_data.relname || ''; - EXECUTE (query_select_str) INTO live_tuple; - query_size_str := 'select * from pg_catalog.pg_relation_size(' || row_data.oid || ')'; - EXECUTE (query_size_str) INTO data_size; - END LOOP; - blockNum := data_size/8192; - return next; - END LOOP; - END IF; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_delta_info(IN rel TEXT, OUT node_name TEXT, OUT part_name TEXT, OUT live_tuple INT8, OUT data_size INT8, OUT blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_str_nodes text; - query_str text; - query_part_str text; - rel_info record; - row_name record; - row_data record; - BEGIN - EXECUTE ('select c.relname,n.nspname from pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) where C.oid = (select '''|| rel ||'''::regclass::oid)') into rel_info; - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_catalog.pg_get_delta_info('''''||rel_info.relname||''''','''''||rel_info.nspname||''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - live_tuple := row_data.live_tuple; - data_size := row_data.data_size; - blockNum := row_data.blockNum; - part_name := row_data.part_name; - return next; - END LOOP; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.get_delta_info(IN rel TEXT, OUT part_name TEXT, OUT total_live_tuple INT8, OUT total_data_size INT8, OUT max_blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_str text; - row_data record; - BEGIN - query_str := 'select part_name, sum(live_tuple) total_live_tuple, sum(data_size) total_data_size, max(blocknum) max_blocknum from (select * from pg_catalog.pgxc_get_delta_info('''||$1||''')) group by part_name order by max_blocknum desc'; - FOR row_data IN EXECUTE(query_str) LOOP - part_name := row_data.part_name; - total_live_tuple := row_data.total_live_tuple; - total_data_size := row_data.total_data_size; - max_blockNum := row_data.max_blocknum; - return next; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -DROP FUNCTION IF EXISTS pg_catalog.pg_terminate_session(bigint, bigint) cascade; - -CREATE OR REPLACE VIEW pg_catalog.gs_session_memory_statistics AS -SELECT - S.datid AS datid, - S.usename, - S.pid, - S.query_start AS start_time, - T.min_peak_memory, - T.max_peak_memory, - T.spill_info, - S.query, - S.node_group, - T.top_mem_dn -FROM pg_stat_activity_ng AS S, pg_catalog.pg_stat_get_wlm_realtime_session_info(NULL) AS T -WHERE S.pid = T.threadid; - -CREATE OR REPLACE VIEW pg_catalog.gs_session_cpu_statistics AS -SELECT - S.datid AS datid, - S.usename, - S.pid, - S.query_start AS start_time, - T.min_cpu_time, - T.max_cpu_time, - T.total_cpu_time, - S.query, - S.node_group, - T.top_cpu_dn -FROM pg_stat_activity_ng AS S, pg_catalog.pg_stat_get_wlm_realtime_session_info(NULL) AS T -WHERE S.pid = T.threadid; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_session_statistics AS -SELECT - S.datid AS datid, - S.datname AS dbname, - T.schemaname, - T.nodename, - S.usename AS username, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - T.query_band, - S.pid, - S.sessionid, - T.block_time, - S.query_start AS start_time, - T.duration, - T.estimate_total_time, - T.estimate_left_time, - S.enqueue, - S.resource_pool, - T.control_group, - T.estimate_memory, - T.min_peak_memory, - T.max_peak_memory, - T.average_peak_memory, - T.memory_skew_percent, - T.spill_info, - T.min_spill_size, - T.max_spill_size, - T.average_spill_size, - T.spill_skew_percent, - T.min_dn_time, - T.max_dn_time, - T.average_dn_time, - T.dntime_skew_percent, - T.min_cpu_time, - T.max_cpu_time, - T.total_cpu_time, - T.cpu_skew_percent, - T.min_peak_iops, - T.max_peak_iops, - T.average_peak_iops, - T.iops_skew_percent, - T.warning, - S.query_id AS queryid, - T.query, - T.query_plan, - S.node_group, - T.top_cpu_dn, - T.top_mem_dn -FROM pg_stat_activity_ng AS S, pg_catalog.pg_stat_get_wlm_realtime_session_info(NULL) AS T -WHERE S.pid = T.threadid; - -CREATE OR REPLACE FUNCTION pg_catalog.pv_session_memory_detail_tp(OUT sessid TEXT, OUT sesstype TEXT, OUT contextname TEXT, OUT level INT2, OUT parent TEXT, OUT totalsize INT8, OUT freesize INT8, OUT usedsize INT8) -RETURNS setof record -AS $$ -DECLARE - enable_threadpool bool; - row_data record; - query_str text; -BEGIN - show enable_thread_pool into enable_threadpool; - - IF enable_threadpool THEN - query_str := 'with SM AS - (SELECT - S.sessid AS sessid, - T.thrdtype AS sesstype, - S.contextname AS contextname, - S.level AS level, - S.parent AS parent, - S.totalsize AS totalsize, - S.freesize AS freesize, - S.usedsize AS usedsize - FROM - pv_session_memory_context S - LEFT JOIN - (SELECT DISTINCT thrdtype, tid - FROM pv_thread_memory_context) T - on S.threadid = T.tid - ), - TM AS - (SELECT - S.sessid AS Ssessid, - T.thrdtype AS sesstype, - T.threadid AS Tsessid, - T.contextname AS contextname, - T.level AS level, - T.parent AS parent, - T.totalsize AS totalsize, - T.freesize AS freesize, - T.usedsize AS usedsize - FROM - pv_thread_memory_context T - LEFT JOIN - (SELECT DISTINCT sessid, threadid - FROM pv_session_memory_context) S - ON T.tid = S.threadid - ) - SELECT * from SM - UNION - SELECT - Ssessid AS sessid, sesstype, contextname, level, parent, totalsize, freesize, usedsize - FROM TM WHERE Ssessid IS NOT NULL - UNION - SELECT - Tsessid AS sessid, sesstype, contextname, level, parent, totalsize, freesize, usedsize - FROM TM WHERE Ssessid IS NULL;'; - FOR row_data IN EXECUTE(query_str) LOOP - sessid = row_data.sessid; - sesstype = row_data.sesstype; - contextname = row_data.contextname; - level = row_data.level; - parent = row_data.parent; - totalsize = row_data.totalsize; - freesize = row_data.freesize; - usedsize = row_data.usedsize; - return next; - END LOOP; - ELSE - query_str := 'SELECT - T.threadid AS sessid, - T.thrdtype AS sesstype, - T.contextname AS contextname, - T.level AS level, - T.parent AS parent, - T.totalsize AS totalsize, - T.freesize AS freesize, - T.usedsize AS usedsize - FROM pg_catalog.pv_thread_memory_detail() T;'; - FOR row_data IN EXECUTE(query_str) LOOP - sessid = row_data.sessid; - sesstype = row_data.sesstype; - contextname = row_data.contextname; - level = row_data.level; - parent = row_data.parent; - totalsize = row_data.totalsize; - freesize = row_data.freesize; - usedsize = row_data.usedsize; - return next; - END LOOP; - END IF; - RETURN; -END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.distributed_count(IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - total_num bigint; - flag boolean; - special text := '[;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN _table_name, IN special; - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - RETURN; - END IF; - EXECUTE 'SELECT count(1) FROM ' || _table_name - INTO total_num; - - --Get the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node, pgxc_class where node_type IN (''C'', ''D'') AND is_oid_in_group_members(oid, nodeoids) AND - pcrelid=''' || _table_name || '''::regclass::oid'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select ''''DN_name'''' as dnname1, count(1) as count1 from ' || $1 || ''''; - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.dnname1 := CASE - WHEN LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-length(row_name.node_name)) - ELSE SUBSTR(row_name.node_name,1,20) - END; - DNName := row_data.dnname1; - Num := row_data.count1; - IF total_num = 0 THEN - Ratio := 0.000 ||'%'; - ELSE - Ratio := ROUND(row_data.count1/total_num*100,3) || '%'; - END IF; - RETURN next; - END LOOP; - END LOOP; - - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.get_delta_info(IN rel TEXT, OUT part_name TEXT, OUT total_live_tuple INT8, OUT total_data_size INT8, OUT max_blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_str text; - row_data record; - BEGIN - query_str := 'select part_name, sum(live_tuple) total_live_tuple, sum(data_size) total_data_size, max(blocknum) max_blocknum from (select * from pg_catalog.pgxc_get_delta_info('''||rel||''')) group by part_name order by max_blocknum desc'; - FOR row_data IN EXECUTE(query_str) LOOP - part_name := row_data.part_name; - total_live_tuple := row_data.total_live_tuple; - total_data_size := row_data.total_data_size; - max_blockNum := row_data.max_blocknum; - return next; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.get_shard_oids_byname(IN node_name varchar) -RETURNS Oid[] AS $$ -declare - node_oid Oid; - nodes Oid[]; - nodenames_query text; - total_num bigint; - flag boolean; - special text := '[;|-]'; -BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN node_name, IN special; - - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - return '{0}'; - ELSE - nodenames_query := 'SELECT oid FROM pgxc_node WHERE node_name = ''' || node_name || ''' ORDER BY oid'; - FOR node_oid IN EXECUTE nodenames_query LOOP - nodes := array_append(nodes, node_oid); - END LOOP; - RETURN nodes; - END IF; -END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.get_large_table_name(relfile_node text, threshold_size_gb int8) -RETURNS text -AS $$ -DECLARE - query_str text; - relname text; -BEGIN - query_str := 'SELECT - NVL - ( - (SELECT - (case pg_catalog.pg_table_size(c.oid)/1024/1024/1024 > ' || threshold_size_gb || ' - when true then pg_catalog.concat(concat(n.nspname, ''.''), c.relname) - else ''null'' - end - ) relname - FROM - pg_catalog.pg_class c, - pg_catalog.pg_namespace n - WHERE - c.relnamespace = n.oid - AND - c.relfilenode = ' || relfile_node || ' - ) - , ''null'' - ) relname'; - FOR relname IN EXECUTE(query_str) LOOP - return relname; - END LOOP; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -create or replace function pg_catalog.table_skewness(table_name text, column_name text, - OUT seqNum text, OUT Num text, OUT Ratio text, row_num text default '0') -RETURNS setof record -AS $$ -DECLARE - tolal_num text; - row_data record; - execute_query text; - BEGIN - if row_num = 0 then - EXECUTE 'select count(1) from ' || table_name into tolal_num; - execute_query = 'select seqNum, count(1) as num - from (select pg_catalog.table_data_skewness(row(' || column_name ||'), ''H'') as seqNum from ' || table_name || - ') group by seqNum order by num DESC'; - else - tolal_num = row_num; - execute_query = 'select seqNum, count(1) as num - from (select pg_catalog.table_data_skewness(row(' || column_name ||'), ''H'') as seqNum from ' || table_name || - ' limit ' || row_num ||') group by seqNum order by num DESC'; - end if; - - if tolal_num = 0 then - seqNum = 0; - Num = 0; - Ratio = ROUND(0, 3) || '%'; - return; - end if; - - for row_data in EXECUTE execute_query loop - seqNum = row_data.seqNum; - Num = row_data.num; - Ratio = ROUND(row_data.num / tolal_num * 100, 3) || '%'; - RETURN next; - end loop; - END; -$$LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_activity AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.sessionid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query, - S.connection_info - FROM pg_database D, pg_stat_get_activity_with_conninfo(NULL) AS S, - pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_activity_ng AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.sessionid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query, - N.node_group - FROM pg_database D, pg_stat_get_activity(NULL) AS S, pg_stat_get_activity_ng(NULL) AS N, - pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid AND - S.sessionid = N.sessionid; - -CREATE OR REPLACE VIEW pg_catalog.pg_session_wlmstat AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.threadid, - S.sessionid, - S.threadpid AS processid, - S.usesysid, - S.appname, - U.rolname AS usename, - S.priority, - S.attribute, - S.block_time, - S.elapsed_time, - S.total_cpu_time, - S.skew_percent AS cpu_skew_percent, - S.statement_mem, - S.active_points, - S.dop_value, - S.current_cgroup AS control_group, - S.current_status AS status, - S.enqueue_state AS enqueue, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query, - S.is_plana, - S.node_group - FROM pg_database D, pg_stat_get_session_wlmstat(NULL) AS S, - pg_authid AS U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid; - -CREATE OR REPLACE VIEW pg_catalog.pg_wlm_statistics AS - SELECT - statement, - block_time, - elapsed_time, - total_cpu_time, - qualification_time, - skew_percent AS cpu_skew_percent, - control_group, - status, - action - FROM pg_stat_get_wlm_statistics(NULL); - -CREATE OR REPLACE VIEW pg_catalog.gs_session_memory_statistics AS -SELECT - S.datid AS datid, - S.usename, - S.pid, - S.query_start AS start_time, - T.min_peak_memory, - T.max_peak_memory, - T.spill_info, - S.query, - S.node_group, - T.top_mem_dn -FROM pg_stat_activity_ng AS S, pg_stat_get_wlm_realtime_session_info(NULL) AS T -WHERE S.pid = T.threadid; - -CREATE OR REPLACE VIEW pg_catalog.pg_session_iostat AS - SELECT - S.query_id, - T.mincurr_iops as mincurriops, - T.maxcurr_iops as maxcurriops, - T.minpeak_iops as minpeakiops, - T.maxpeak_iops as maxpeakiops, - T.iops_limits as io_limits, - CASE WHEN T.io_priority = 0 THEN 'None'::text - WHEN T.io_priority = 10 THEN 'Low'::text - WHEN T.io_priority = 20 THEN 'Medium'::text - WHEN T.io_priority = 50 THEN 'High'::text END AS io_priority, - S.query, - S.node_group -FROM pg_stat_activity_ng AS S, pg_stat_get_wlm_session_iostat_info(0) AS T -WHERE S.pid = T.threadid; - -CREATE OR REPLACE VIEW pg_catalog.gs_cluster_resource_info AS SELECT * FROM pg_stat_get_wlm_node_resource_info(0); - -CREATE OR REPLACE VIEW pg_catalog.gs_session_cpu_statistics AS -SELECT - S.datid AS datid, - S.usename, - S.pid, - S.query_start AS start_time, - T.min_cpu_time, - T.max_cpu_time, - T.total_cpu_time, - S.query, - S.node_group, - T.top_cpu_dn -FROM pg_stat_activity_ng AS S, pg_stat_get_wlm_realtime_session_info(NULL) AS T -WHERE S.pid = T.threadid; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_session_statistics AS -SELECT - S.datid AS datid, - S.datname AS dbname, - T.schemaname, - T.nodename, - S.usename AS username, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - T.query_band, - S.pid, - S.sessionid, - T.block_time, - S.query_start AS start_time, - T.duration, - T.estimate_total_time, - T.estimate_left_time, - S.enqueue, - S.resource_pool, - T.control_group, - T.estimate_memory, - T.min_peak_memory, - T.max_peak_memory, - T.average_peak_memory, - T.memory_skew_percent, - T.spill_info, - T.min_spill_size, - T.max_spill_size, - T.average_spill_size, - T.spill_skew_percent, - T.min_dn_time, - T.max_dn_time, - T.average_dn_time, - T.dntime_skew_percent, - T.min_cpu_time, - T.max_cpu_time, - T.total_cpu_time, - T.cpu_skew_percent, - T.min_peak_iops, - T.max_peak_iops, - T.average_peak_iops, - T.iops_skew_percent, - T.warning, - S.query_id AS queryid, - T.query, - T.query_plan, - S.node_group, - T.top_cpu_dn, - T.top_mem_dn -FROM pg_stat_activity_ng AS S, pg_stat_get_wlm_realtime_session_info(NULL) AS T -WHERE S.pid = T.threadid; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_wlm_get_all_user_resource_info() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str2 text; - BEGIN - query_str := 'SELECT rolname FROM pg_authid'; - FOR row_name IN EXECUTE(query_str) LOOP - query_str2 := 'SELECT * FROM gs_wlm_user_resource_info(''' || row_name.rolname || ''')'; - FOR row_data IN EXECUTE(query_str2) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_session_info_all AS -SELECT * FROM pg_stat_get_wlm_session_info(0); - -CREATE OR REPLACE FUNCTION pg_catalog.create_wlm_session_info(IN flag int) -RETURNS int -AS $$ -DECLARE - query_str text; - record_cnt int; - BEGIN - record_cnt := 0; - - query_str := 'SELECT * FROM pg_stat_get_wlm_session_info(1)'; - - IF flag > 0 THEN - EXECUTE 'INSERT INTO gs_wlm_session_query_info_all ' || query_str; - ELSE - EXECUTE query_str; - END IF; - - RETURN record_cnt; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_cgroup_info AS - SELECT - cgroup_name, - percent AS priority, - usage_percent AS usage_percent, - shares, - usage AS cpuacct, - cpuset, - relpath, - valid, - node_group - FROM pg_stat_get_cgroup_info(NULL); - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_user_info AS -SELECT - T.userid, - S.rolname AS username, - T.sysadmin, - T.rpoid, - R.respool_name AS respool, - T.parentid, - T.totalspace, - T.spacelimit, - T.childcount, - T.childlist -FROM pg_roles AS S, gs_wlm_get_user_info(NULL) AS T, pg_resource_pool AS R -WHERE S.oid = T.userid AND T.rpoid = R.oid; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_resource_pool AS -SELECT - T.respool_oid AS rpoid, - R.respool_name AS respool, - R.control_group AS control_group, - R.parentid AS parentid, - T.ref_count, - T.active_points, - T.running_count, - T.waiting_count, - T.iops_limits as io_limits, - T.io_priority -FROM gs_wlm_get_resource_pool_info(0) AS T, pg_resource_pool AS R -WHERE T.respool_oid = R.oid; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_rebuild_user_resource_pool AS - SELECT * FROM gs_wlm_rebuild_user_resource_pool(0); - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_workload_records AS - SELECT - P.node_name, - S.threadid AS thread_id, - S.threadpid AS processid, - P.start_time AS time_stamp, - U.rolname AS username, - P.memory, - P.actpts AS active_points, - P.maxpts AS max_points, - P.priority, - P.resource_pool, - S.current_status AS status, - S.current_cgroup AS control_group, - P.queue_type AS enqueue, - S.query, - P.node_group - FROM pg_stat_get_session_wlmstat(NULL) AS S, pg_authid U, - gs_wlm_get_workload_records(0) P - WHERE P.query_pid = S.threadpid AND - S.usesysid = U.oid; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_replication AS - SELECT - S.pid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - W.state, - W.sender_sent_location, - W.receiver_write_location, - W.receiver_flush_location, - W.receiver_replay_location, - W.sync_priority, - W.sync_state - FROM pg_stat_get_activity(NULL) AS S, pg_authid U, - pg_stat_get_wal_senders() AS W - WHERE S.usesysid = U.oid AND - S.pid = W.sender_pid; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_database AS - SELECT - D.oid AS datid, - D.datname AS datname, - pg_stat_get_db_numbackends(D.oid) AS numbackends, - pg_stat_get_db_xact_commit(D.oid) AS xact_commit, - pg_stat_get_db_xact_rollback(D.oid) AS xact_rollback, - pg_stat_get_db_blocks_fetched(D.oid) - - pg_stat_get_db_blocks_hit(D.oid) AS blks_read, - pg_stat_get_db_blocks_hit(D.oid) AS blks_hit, - pg_stat_get_db_tuples_returned(D.oid) AS tup_returned, - pg_stat_get_db_tuples_fetched(D.oid) AS tup_fetched, - pg_stat_get_db_tuples_inserted(D.oid) AS tup_inserted, - pg_stat_get_db_tuples_updated(D.oid) AS tup_updated, - pg_stat_get_db_tuples_deleted(D.oid) AS tup_deleted, - pg_stat_get_db_conflict_all(D.oid) AS conflicts, - pg_stat_get_db_temp_files(D.oid) AS temp_files, - pg_stat_get_db_temp_bytes(D.oid) AS temp_bytes, - pg_stat_get_db_deadlocks(D.oid) AS deadlocks, - pg_stat_get_db_blk_read_time(D.oid) AS blk_read_time, - pg_stat_get_db_blk_write_time(D.oid) AS blk_write_time, - pg_stat_get_db_stat_reset_time(D.oid) AS stats_reset - FROM pg_database D; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_database_conflicts AS - SELECT - D.oid AS datid, - D.datname AS datname, - pg_stat_get_db_conflict_tablespace(D.oid) AS confl_tablespace, - pg_stat_get_db_conflict_lock(D.oid) AS confl_lock, - pg_stat_get_db_conflict_snapshot(D.oid) AS confl_snapshot, - pg_stat_get_db_conflict_bufferpin(D.oid) AS confl_bufferpin, - pg_stat_get_db_conflict_startup_deadlock(D.oid) AS confl_deadlock - FROM pg_database D; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_user_functions AS - SELECT - P.oid AS funcid, - N.nspname AS schemaname, - P.proname AS funcname, - pg_stat_get_function_calls(P.oid) AS calls, - pg_stat_get_function_total_time(P.oid) AS total_time, - pg_stat_get_function_self_time(P.oid) AS self_time - FROM pg_proc P LEFT JOIN pg_namespace N ON (N.oid = P.pronamespace) - WHERE P.prolang != 12 -- fast check to eliminate built-in functions - AND pg_stat_get_function_calls(P.oid) IS NOT NULL; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_xact_user_functions AS - SELECT - P.oid AS funcid, - N.nspname AS schemaname, - P.proname AS funcname, - pg_stat_get_xact_function_calls(P.oid) AS calls, - pg_stat_get_xact_function_total_time(P.oid) AS total_time, - pg_stat_get_xact_function_self_time(P.oid) AS self_time - FROM pg_proc P LEFT JOIN pg_namespace N ON (N.oid = P.pronamespace) - WHERE P.prolang != 12 -- fast check to eliminate built-in functions - AND pg_stat_get_xact_function_calls(P.oid) IS NOT NULL; - -CREATE OR REPLACE VIEW pg_catalog.DV_SESSIONS AS - SELECT - sa.sessionid AS SID, - 0::integer AS SERIAL#, - sa.usesysid AS USER#, - ad.rolname AS USERNAME - FROM pg_stat_get_activity(NULL) AS sa - LEFT JOIN pg_authid ad ON(sa.usesysid = ad.oid) - WHERE sa.application_name <> 'JobScheduler'; - -CREATE OR REPLACE FUNCTION pg_catalog.pg_nodes_memmon(OUT InnerNName text, OUT InnerUsedMem int8, OUT InnerTopCtxt int8, OUT NName text, OUT UsedMem text, OUT SharedBufferCache text, OUT TopContext text) -RETURNS setof record -AS $$ -DECLARE - enable_threadpool bool; - row_data record; - row_data1 record; - row_name record; - query_str text; - query_str1 text; - shared_bcache text; - query_str_nodes text; - itr integer; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select ''''N_name'''' as nname1, sum(usedsize) as usedmem1 from pv_session_memory_detail where 1=1 '''; - query_str1 := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select contextname as contextname1, sum(usedsize) as usedsize1 from pv_session_memory_detail group by contextname order by usedsize1 desc limit 3 '''; - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.nname1 := CASE - WHEN LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-length(row_name.node_name)) - ELSE SUBSTR(row_name.node_name,1,20) - END; - - InnerNName := row_data.nname1; - NName := row_data.nname1; - InnerUsedMem := row_data.usedmem1; - UsedMem := pg_size_pretty(row_data.usedmem1); - - EXECUTE 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT pg_size_pretty(count(*) * 8192) || ''''(Utilization: '''' || pg_size_pretty((SELECT setting FROM pg_settings WHERE name =''''shared_buffers'''') * 8192) || ''''/'''' || round(count(*)/(SELECT setting FROM pg_settings WHERE name =''''shared_buffers''''),2)*100 || ''''%)'''' FROM pg_buffercache_pages() WHERE relfilenode IS NOT NULL ''' - INTO shared_bcache; - - SharedBufferCache := shared_bcache; - - itr := 1; - FOR row_data1 IN EXECUTE(query_str1) LOOP - --We should have 3 return rows - TopContext := row_data1.contextname1 || '(' || pg_size_pretty(row_data1.usedsize1) || ')'; - InnerTopCtxt := row_data1.usedsize1; - IF itr = 1 THEN - RETURN next; - ELSE - NName := ''; - UsedMem := ''; - SharedBufferCache := ''; - RETURN next; - END IF; - itr := itr + 1; - END LOOP; - END LOOP; - END LOOP; - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.distributed_count(IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - total_num bigint; - flag boolean; - special text := '[;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN _table_name, IN special; - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - RETURN; - END IF; - EXECUTE 'SELECT count(1) FROM ' || _table_name - INTO total_num; - - --Get the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node, pgxc_class where node_type IN (''C'', ''D'') AND is_oid_in_group_members(oid, nodeoids) AND - pcrelid=''' || _table_name || '''::regclass::oid'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select ''''DN_name'''' as dnname1, count(1) as count1 from ' || $1 || ''''; - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.dnname1 := CASE - WHEN LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-length(row_name.node_name)) - ELSE SUBSTR(row_name.node_name,1,20) - END; - DNName := row_data.dnname1; - Num := row_data.count1; - IF total_num = 0 THEN - Ratio := 0.000 ||'%'; - ELSE - Ratio := ROUND(row_data.count1/total_num*100,3) || '%'; - END IF; - RETURN next; - END LOOP; - END LOOP; - - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.login_audit_messages(in flag boolean) returns table (username text, database text, logintime timestamp with time zone, mytype text, result text, client_conninfo text) AUTHID DEFINER -AS $$ -DECLARE -user_id text; -user_name text; -db_name text; -SQL_STMT VARCHAR2(500); -fail_cursor REFCURSOR; -success_cursor REFCURSOR; -BEGIN - SELECT text(oid) FROM pg_authid WHERE rolname=SESSION_USER INTO user_id; - SELECT SESSION_USER INTO user_name; - SELECT CURRENT_DATABASE() INTO db_name; - IF flag = true THEN - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'') AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';'; - OPEN success_cursor FOR EXECUTE SQL_STMT; - --search bottom up for all the success login info - FETCH LAST FROM success_cursor into username, database, logintime, mytype, result, client_conninfo; - FETCH BACKWARD FROM success_cursor into username, database, logintime, mytype, result, client_conninfo; - IF FOUND THEN - return next; - END IF; - CLOSE success_cursor; - ELSE - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'', ''login_failed'') AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';'; - OPEN fail_cursor FOR EXECUTE SQL_STMT; - --search bottom up - FETCH LAST FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo; - LOOP - FETCH BACKWARD FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo; - EXIT WHEN NOT FOUND; - IF mytype = 'login_failed' THEN - return next; - ELSE - -- must be login_success - EXIT; - END IF; - END LOOP; - CLOSE fail_cursor; - END IF; -END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.login_audit_messages(in flag boolean) returns table (username text, database text, logintime timestamp with time zone, mytype text, result text, client_conninfo text) AUTHID DEFINER -AS $$ -DECLARE -user_id text; -user_name text; -db_name text; -SQL_STMT VARCHAR2(500); -fail_cursor REFCURSOR; -success_cursor REFCURSOR; -BEGIN - SELECT text(oid) FROM pg_authid WHERE rolname=SESSION_USER INTO user_id; - SELECT SESSION_USER INTO user_name; - SELECT CURRENT_DATABASE() INTO db_name; - IF flag = true THEN - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'') AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';'; - OPEN success_cursor FOR EXECUTE SQL_STMT; - --search bottom up for all the success login info - FETCH LAST FROM success_cursor into username, database, logintime, mytype, result, client_conninfo; - FETCH BACKWARD FROM success_cursor into username, database, logintime, mytype, result, client_conninfo; - IF FOUND THEN - return next; - END IF; - CLOSE success_cursor; - ELSE - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'', ''login_failed'') AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';'; - OPEN fail_cursor FOR EXECUTE SQL_STMT; - --search bottom up - FETCH LAST FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo; - LOOP - FETCH BACKWARD FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo; - EXIT WHEN NOT FOUND; - IF mytype = 'login_failed' THEN - return next; - ELSE - -- must be login_success - EXIT; - END IF; - END LOOP; - CLOSE fail_cursor; - END IF; -END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.login_audit_messages_pid(flag boolean) - RETURNS TABLE(username text, database text, logintime timestamp with time zone, mytype text, result text, client_conninfo text, backendid bigint) AUTHID DEFINER -AS $$ -DECLARE -user_id text; -user_name text; -db_name text; -SQL_STMT VARCHAR2(500); -fail_cursor REFCURSOR; -success_cursor REFCURSOR; -mybackendid bigint; -curSessionFound boolean; -BEGIN - SELECT text(oid) FROM pg_authid WHERE rolname=SESSION_USER INTO user_id; - SELECT SESSION_USER INTO user_name; - SELECT CURRENT_DATABASE() INTO db_name; - SELECT pg_backend_pid() INTO mybackendid; - curSessionFound = false; - IF flag = true THEN - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo, split_part(thread_id,''@'',1) backendid FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'') AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';'; - OPEN success_cursor FOR EXECUTE SQL_STMT; - --search bottom up for all the success login info - FETCH LAST FROM success_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - LOOP - IF backendid = mybackendid THEN - --found the login info for the current session - curSessionFound = true; - EXIT; - END IF; - FETCH BACKWARD FROM success_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - EXIT WHEN NOT FOUND; - END LOOP; - IF curSessionFound THEN - FETCH BACKWARD FROM success_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - IF FOUND THEN - return next; - END IF; - END IF; - ELSE - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo, split_part(thread_id,''@'',1) backendid FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'', ''login_failed'') AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';'; - OPEN fail_cursor FOR EXECUTE SQL_STMT; - --search bottom up - FETCH LAST FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - LOOP - IF backendid = mybackendid AND mytype = 'login_success' THEN - --found the login info for the current session - curSessionFound = true; - EXIT; - END IF; - FETCH BACKWARD FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - EXIT WHEN NOT FOUND; - END LOOP; - IF curSessionFound THEN - LOOP - FETCH BACKWARD FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo, backendid ; - EXIT WHEN NOT FOUND; - IF mytype = 'login_failed' THEN - return next; - ELSE - -- must be login_success - EXIT; - END IF; - END LOOP; - END IF; --curSessionFound - CLOSE fail_cursor; - END IF; -END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE VIEW pg_catalog.pg_thread_wait_status AS - SELECT * FROM pg_stat_get_status(NULL); - -create or replace function pg_catalog.pgxc_cgroup_map_ng_conf(IN ngname text) -returns bool -AS $$ -declare - host_info record; - query_str text; - query_string text; - flag boolean; - special text := '[^A-z0-9_]'; -begin - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN ngname, IN special; - IF flag = true THEN - return false; - ELSE - query_str = 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - for host_info in execute(query_str) loop - query_string := 'execute direct on (' || host_info.node_name || ') ''SELECT * from gs_cgroup_map_ng_conf(''''' || ngname || ''''')'''; - execute query_string; - end loop; - END IF; - return true; -end; -$$language plpgsql NOT FENCED; - -create or replace function pg_catalog.table_skewness(table_name text, column_name text, - OUT seqNum text, OUT Num text, OUT Ratio text, row_num text default '0') -RETURNS setof record -AS $$ -DECLARE - tolal_num text; - row_data record; - execute_query text; - BEGIN - if row_num = 0 then - EXECUTE 'select count(1) from ' || table_name into tolal_num; - execute_query = 'select seqNum, count(1) as num - from (select table_data_skewness(row(' || column_name ||'), ''H'') as seqNum from ' || table_name || - ') group by seqNum order by num DESC'; - else - tolal_num = row_num; - execute_query = 'select seqNum, count(1) as num - from (select table_data_skewness(row(' || column_name ||'), ''H'') as seqNum from ' || table_name || - ' limit ' || row_num ||') group by seqNum order by num DESC'; - end if; - - if tolal_num = 0 then - seqNum = 0; - Num = 0; - Ratio = ROUND(0, 3) || '%'; - return; - end if; - - for row_data in EXECUTE execute_query loop - seqNum = row_data.seqNum; - Num = row_data.num; - Ratio = ROUND(row_data.num / tolal_num * 100, 3) || '%'; - RETURN next; - end loop; - END; -$$LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE VIEW pg_catalog.pg_get_invalid_backends AS - SELECT - C.pid, - C.node_name, - S.datname AS dbname, - S.backend_start, - S.query - FROM pg_pool_validate(false, ' ') AS C LEFT JOIN pg_stat_activity AS S - ON (C.pid = S.sessionid); - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_operator_statistics AS -SELECT t.* -FROM pg_stat_activity AS s, pg_stat_get_wlm_realtime_operator_info(NULL) as t -where s.query_id = t.queryid; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_operator_history AS -SELECT * FROM pg_stat_get_wlm_operator_info(0); - -CREATE OR REPLACE FUNCTION pg_catalog.create_wlm_operator_info(IN flag int) -RETURNS int -AS $$ -DECLARE - query_ec_str text; - query_str text; - record_cnt int; - BEGIN - record_cnt := 0; - - query_ec_str := 'SELECT - queryid, - plan_node_id, - start_time, - duration, - tuple_processed, - min_peak_memory, - max_peak_memory, - average_peak_memory, - ec_status, - ec_execute_datanode, - ec_dsn, - ec_username, - ec_query, - ec_libodbc_type - FROM pg_stat_get_wlm_ec_operator_info(0) where ec_operator > 0'; - - query_str := 'SELECT * FROM pg_stat_get_wlm_operator_info(1)'; - - IF flag > 0 THEN - EXECUTE 'INSERT INTO gs_wlm_ec_operator_info ' || query_ec_str; - EXECUTE 'INSERT INTO gs_wlm_operator_info ' || query_str; - ELSE - EXECUTE query_ec_str; - EXECUTE query_str; - END IF; - - RETURN record_cnt; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_get_control_group_info() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT group_name,group_kind FROM pgxc_group WHERE group_kind = ''v'' OR group_kind = ''i'' '; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - IF row_name.group_kind = 'i' THEN - query_str := 'SELECT *,CAST(''' || row_name.group_name || ''' AS TEXT) AS nodegroup,CAST(''' || row_name.group_kind || ''' AS TEXT) AS group_kind FROM gs_all_nodegroup_control_group_info(''installation'')'; - ELSE - query_str := 'SELECT *,CAST(''' || row_name.group_name || ''' AS TEXT) AS nodegroup,CAST(''' || row_name.group_kind || ''' AS TEXT) AS group_kind FROM gs_all_nodegroup_control_group_info(''' ||row_name.group_name||''')'; - END IF; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_ec_operator_statistics AS -SELECT - t.queryid, - t.plan_node_id, - t.start_time, - t.ec_status, - t.ec_execute_datanode, - t.ec_dsn, - t.ec_username, - t.ec_query, - t.ec_libodbc_type, - t.ec_fetch_count -FROM pg_stat_activity AS s, pg_stat_get_wlm_realtime_ec_operator_info(NULL) as t -where s.query_id = t.queryid and t.ec_operator > 0; - -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_ec_operator_history AS -SELECT - queryid, - plan_node_id, - start_time, - duration, - tuple_processed, - min_peak_memory, - max_peak_memory, - average_peak_memory, - ec_status, - ec_execute_datanode, - ec_dsn, - ec_username, - ec_query, - ec_libodbc_type -FROM pg_stat_get_wlm_ec_operator_info(0) where ec_operator > 0; - -CREATE OR REPLACE FUNCTION pg_catalog.pg_get_delta_info(IN rel TEXT, IN schema_name TEXT, OUT part_name TEXT, OUT live_tuple INT8, OUT data_size INT8, OUT blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_info_str text; - query_str text; - query_part_str text; - query_select_str text; - query_size_str text; - row_info_data record; - row_data record; - row_part_info record; - BEGIN - query_info_str := 'SELECT C.oid,C.reldeltarelid,C.parttype FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE C.relname = '''|| rel ||''' and N.nspname = '''|| schema_name ||''''; - FOR row_info_data IN EXECUTE(query_info_str) LOOP - IF row_info_data.parttype = 'n' THEN - query_str := 'SELECT relname,oid from pg_class where oid= '||row_info_data.reldeltarelid||''; - EXECUTE(query_str) INTO row_data; - query_select_str := 'select count(*) from cstore.' || row_data.relname || ''; - EXECUTE (query_select_str) INTO live_tuple; - query_size_str := 'select * from pg_relation_size(' || row_data.oid || ')'; - EXECUTE (query_size_str) INTO data_size; - blockNum := data_size/8192; - part_name := 'non partition table'; - return next; - ELSE - query_part_str := 'SELECT relname,reldeltarelid from pg_partition where parentid = '||row_info_data.oid|| 'and relname <> '''||rel||''''; - FOR row_part_info IN EXECUTE(query_part_str) LOOP - query_str := 'SELECT relname,oid from pg_class where oid = '||row_part_info.reldeltarelid||''; - part_name := row_part_info.relname; - FOR row_data IN EXECUTE(query_str) LOOP - query_select_str := 'select count(*) from cstore.' || row_data.relname || ''; - EXECUTE (query_select_str) INTO live_tuple; - query_size_str := 'select * from pg_relation_size(' || row_data.oid || ')'; - EXECUTE (query_size_str) INTO data_size; - END LOOP; - blockNum := data_size/8192; - return next; - END LOOP; - END IF; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_delta_info(IN rel TEXT, OUT node_name TEXT, OUT part_name TEXT, OUT live_tuple INT8, OUT data_size INT8, OUT blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_str_nodes text; - query_str text; - query_part_str text; - rel_info record; - row_name record; - row_data record; - BEGIN - EXECUTE ('select c.relname,n.nspname from pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) where C.oid = (select '''|| rel ||'''::regclass::oid)') into rel_info; - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_get_delta_info('''''||rel_info.relname||''''','''''||rel_info.nspname||''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - live_tuple := row_data.live_tuple; - data_size := row_data.data_size; - blockNum := row_data.blockNum; - part_name := row_data.part_name; - return next; - END LOOP; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.get_delta_info(IN rel TEXT, OUT part_name TEXT, OUT total_live_tuple INT8, OUT total_data_size INT8, OUT max_blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_str text; - row_data record; - BEGIN - query_str := 'select part_name, sum(live_tuple) total_live_tuple, sum(data_size) total_data_size, max(blocknum) max_blocknum from (select * from pgxc_get_delta_info('''||rel||''')) group by part_name order by max_blocknum desc'; - FOR row_data IN EXECUTE(query_str) LOOP - part_name := row_data.part_name; - total_live_tuple := row_data.total_live_tuple; - total_data_size := row_data.total_data_size; - max_blockNum := row_data.max_blocknum; - return next; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -DROP FUNCTION pg_catalog.pgxc_query_audit; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_query_audit(IN starttime TIMESTAMPTZ, IN endtime TIMESTAMPTZ, OUT "time" TIMESTAMPTZ, OUT "type" text, OUT "result" text, OUT userid text, OUT username text, OUT database text, OUT client_conninfo text, OUT "object_name" text, OUT detail_info text, OUT node_name text, OUT thread_id text, OUT local_port text, OUT remote_port text) -RETURNS setof record -AS $$ -DECLARE - row_name record; - row_data record; - query_str text; - query_str_nodes text; - BEGIN - --Get the node names of all CNs - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_query_audit(''''' || starttime || ''''',''''' || endtime || ''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - "time" := row_data."time"; - "type" := row_data."type"; - "result" := row_data."result"; - userid := row_data.userid; - username := row_data.username; - database := row_data.database; - client_conninfo := row_data.client_conninfo; - "object_name" := row_data."object_name"; - detail_info := row_data.detail_info; - node_name := row_data.node_name; - thread_id := row_data.thread_id; - local_port := row_data.local_port; - remote_port := row_data.remote_port; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.is_oid_in_group_members(IN node_oid Oid, IN group_members oidvector_extend) -RETURNS BOOLEAN AS $$ -DECLARE -query_str text; -match_count int; -node_list text; -BEGIN - match_count := 0; - select array_to_string($2, ',') into node_list; - - query_str := 'SELECT count(1) FROM pgxc_node n WHERE n.oid = ' || node_oid || ' AND n.node_name IN (SELECT n1.node_name FROM pgxc_node n1 WHERE n1.oid in (' || node_list || '))'; - EXECUTE query_str into match_count; - - IF match_count = 1 THEN - RETURN true; - END IF; - RETURN false; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.lock_cluster_ddl() -RETURNS boolean -AS $$ -DECLARE - databse_name record; - lock_str text; - query_database_oid text; - lock_result boolean = false; - return_result bool = true; - BEGIN - query_database_oid := 'SELECT datname FROM pg_database WHERE datallowconn = true order by datname'; - for databse_name in EXECUTE(query_database_oid) LOOP - lock_str = format('SELECT * FROM pgxc_lock_for_sp_database(''%s'')', databse_name.datname); - begin - EXECUTE(lock_str) into lock_result; - if lock_result = 'f' then - return_result = false; - return return_result; - end if; - end; - end loop; - return return_result; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.unlock_cluster_ddl() -RETURNS bool -AS $$ -DECLARE - databse_name record; - unlock_str text; - query_database_oid text; - unlock_result boolean = false; - return_result bool = true; - BEGIN - query_database_oid := 'SELECT datname FROM pg_database WHERE datallowconn = true order by datname'; - for databse_name in EXECUTE(query_database_oid) LOOP - unlock_str = format('SELECT * FROM pgxc_unlock_for_sp_database(''%s'')', databse_name.datname); - begin - EXECUTE(unlock_str) into unlock_result; - if unlock_result = 'f' then - return_result = false; - return return_result; - end if; - end; - end loop; - return return_result; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_stat_dirty_tables(in dirty_percent int4, in n_tuples int4, out relid oid, out relname name, out schemaname name, out n_tup_ins int8, out n_tup_upd int8, out n_tup_del int8, out n_live_tup int8, out n_dead_tup int8, out dirty_page_rate numeric(5,2)) -RETURNS setof record -AS $$ -DECLARE - query_str text; - row_data record; - BEGIN - query_str := 'SELECT oid relid, s.relname,s.schemaname,s.n_tup_ins,s.n_tup_upd,s.n_tup_del,s.n_live_tup,s.n_dead_tup,s.dirty_page_rate - FROM pg_class p, - (SELECT relname, schemaname, SUM(n_tup_ins) n_tup_ins, SUM(n_tup_upd) n_tup_upd, SUM(n_tup_del) n_tup_del, SUM(n_live_tup) n_live_tup, SUM(n_dead_tup) n_dead_tup, CAST((SUM(n_dead_tup) / SUM(n_dead_tup + n_live_tup + 0.00001) * 100) - AS NUMERIC(5,2)) dirty_page_rate FROM pgxc_stat_dirty_tables('||dirty_percent||','||n_tuples||') GROUP BY (relname,schemaname)) s - WHERE p.relname = s.relname AND p.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = s.schemaname) ORDER BY dirty_page_rate DESC'; - FOR row_data IN EXECUTE(query_str) LOOP - relid = row_data.relid; - relname = row_data.relname; - schemaname = row_data.schemaname; - n_tup_ins = row_data.n_tup_ins; - n_tup_upd = row_data.n_tup_upd; - n_tup_del = row_data.n_tup_del; - n_live_tup = row_data.n_live_tup; - n_dead_tup = row_data.n_dead_tup; - dirty_page_rate = row_data.dirty_page_rate; - return next; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_stat_dirty_tables(in dirty_percent int4, in n_tuples int4,in schema text, out relid oid, out relname name, out schemaname name, out n_tup_ins int8, out n_tup_upd int8, out n_tup_del int8, out n_live_tup int8, out n_dead_tup int8, out dirty_page_rate numeric(5,2)) -RETURNS setof record -AS $$ -DECLARE - query_str text; - row_data record; - BEGIN - query_str := 'SELECT oid relid, s.relname,s.schemaname,s.n_tup_ins,s.n_tup_upd,s.n_tup_del,s.n_live_tup,s.n_dead_tup,s.dirty_page_rate - FROM pg_class p, - (SELECT relname, schemaname, SUM(n_tup_ins) n_tup_ins, SUM(n_tup_upd) n_tup_upd, SUM(n_tup_del) n_tup_del, SUM(n_live_tup) n_live_tup, SUM(n_dead_tup) n_dead_tup, CAST((SUM(n_dead_tup) / SUM(n_dead_tup + n_live_tup + 0.00001) * 100) - AS NUMERIC(5,2)) dirty_page_rate FROM pgxc_stat_dirty_tables('||dirty_percent||','||n_tuples||','''||schema||''') GROUP BY (relname,schemaname)) s - WHERE p.relname = s.relname AND p.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = s.schemaname) ORDER BY dirty_page_rate DESC'; - FOR row_data IN EXECUTE(query_str) LOOP - relid = row_data.relid; - relname = row_data.relname; - schemaname = row_data.schemaname; - n_tup_ins = row_data.n_tup_ins; - n_tup_upd = row_data.n_tup_upd; - n_tup_del = row_data.n_tup_del; - n_live_tup = row_data.n_live_tup; - n_dead_tup = row_data.n_dead_tup; - dirty_page_rate = row_data.dirty_page_rate; - return next; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_activity_ng AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.sessionid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query, - N.node_group - FROM pg_database D, pg_stat_get_activity(NULL) AS S, pg_stat_get_activity_ng(NULL) AS N, pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid AND - S.pid = T.threadid AND - S.sessionid = N.sessionid AND - S.pid = N.pid; - -drop function if exists pg_catalog.login_audit_messages(boolean); -drop function if exists pg_catalog.login_audit_messages_pid(boolean); - -CREATE OR REPLACE FUNCTION pg_catalog.login_audit_messages(in flag boolean) returns table (username text, database text, logintime timestamp with time zone, mytype text, result text, client_conninfo text) AUTHID DEFINER -AS $$ -DECLARE -user_id text; -user_name text; -db_name text; -SQL_STMT VARCHAR2(500); -fail_cursor REFCURSOR; -success_cursor REFCURSOR; -BEGIN - SELECT text(oid) FROM pg_authid WHERE rolname=SESSION_USER INTO user_id; - SELECT SESSION_USER INTO user_name; - SELECT CURRENT_DATABASE() INTO db_name; - IF flag = true THEN - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'') AND client_conninfo not LIKE ''gs_clean_%'' AND client_conninfo not LIKE ''pgxc_%'' AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';'; - OPEN success_cursor FOR EXECUTE SQL_STMT; - --search bottom up for all the success login info - FETCH LAST FROM success_cursor into username, database, logintime, mytype, result, client_conninfo; - FETCH BACKWARD FROM success_cursor into username, database, logintime, mytype, result, client_conninfo; - IF FOUND THEN - return next; - END IF; - CLOSE success_cursor; - ELSE - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'', ''login_failed'') AND client_conninfo not LIKE ''gs_clean_%'' AND client_conninfo not LIKE ''pgxc_%'' AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';'; - OPEN fail_cursor FOR EXECUTE SQL_STMT; - --search bottom up - FETCH LAST FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo; - LOOP - FETCH BACKWARD FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo; - EXIT WHEN NOT FOUND; - IF mytype = 'login_failed' THEN - return next; - ELSE - -- must be login_success - EXIT; - END IF; - END LOOP; - CLOSE fail_cursor; - END IF; -END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.login_audit_messages_pid(flag boolean) - RETURNS TABLE(username text, database text, logintime timestamp with time zone, mytype text, result text, client_conninfo text, backendid bigint) AUTHID DEFINER -AS $$ -DECLARE -user_id text; -user_name text; -db_name text; -SQL_STMT VARCHAR2(500); -fail_cursor REFCURSOR; -success_cursor REFCURSOR; -mybackendid bigint; -curSessionFound boolean; -BEGIN - SELECT text(oid) FROM pg_authid WHERE rolname=SESSION_USER INTO user_id; - SELECT SESSION_USER INTO user_name; - SELECT CURRENT_DATABASE() INTO db_name; - SELECT pg_backend_pid() INTO mybackendid; - curSessionFound = false; - IF flag = true THEN - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo, split_part(thread_id,''@'',1) backendid FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'') AND client_conninfo not LIKE ''gs_clean_%'' AND client_conninfo not LIKE ''pgxc_%'' AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';'; - OPEN success_cursor FOR EXECUTE SQL_STMT; - --search bottom up for all the success login info - FETCH LAST FROM success_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - LOOP - IF backendid = mybackendid THEN - --found the login info for the current session - curSessionFound = true; - EXIT; - END IF; - FETCH BACKWARD FROM success_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - EXIT WHEN NOT FOUND; - END LOOP; - IF curSessionFound THEN - FETCH BACKWARD FROM success_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - IF FOUND THEN - return next; - END IF; - END IF; - ELSE - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo, split_part(thread_id,''@'',1) backendid FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'', ''login_failed'') AND client_conninfo not LIKE ''gs_clean_%'' AND client_conninfo not LIKE ''pgxc_%'' AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';'; - OPEN fail_cursor FOR EXECUTE SQL_STMT; - --search bottom up - FETCH LAST FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - LOOP - IF backendid = mybackendid AND mytype = 'login_success' THEN - --found the login info for the current session - curSessionFound = true; - EXIT; - END IF; - FETCH BACKWARD FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - EXIT WHEN NOT FOUND; - END LOOP; - IF curSessionFound THEN - LOOP - FETCH BACKWARD FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo, backendid ; - EXIT WHEN NOT FOUND; - IF mytype = 'login_failed' THEN - return next; - ELSE - -- must be login_success - EXIT; - END IF; - END LOOP; - END IF; --curSessionFound - CLOSE fail_cursor; - END IF; -END; $$ -LANGUAGE plpgsql NOT FENCED; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS DBE_PERF.get_global_pg_asp - (in start_ts timestamp without time zone, - in end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_datanode_active_session_hist - (in datanode text, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_datanode_active_session_hist - (in datanode text, - in start_ts timestamp without time zone, - in end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) cascade; - CREATE OR REPLACE FUNCTION DBE_PERF.get_datanode_active_session_hist - (in datanode text, - in start_ts timestamp without time zone, - in end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA pg_catalog.gs_asp%ROWTYPE; - cn_name record; - query_text record; - QUERY_STR text; - query_cn text; - query_str_cn_name text; - node_str text; - BEGIN - --Get all the node names - node_str := 'SELECT * FROM pg_catalog.gs_asp where sample_time > '''''||$2||''''' and sample_time < '''''||$3||''''; - QUERY_STR := 'EXECUTE DIRECT ON (' || $1 || ') '''|| node_str ||''''';'; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := datanode; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - IF ROW_DATA.cn_id IS NULL THEN - unique_query := ROW_DATA.unique_query; - ELSE - query_str_cn_name := 'SELECT node_name FROM pgxc_node WHERE node_id='||ROW_DATA.cn_id||' AND nodeis_active = true'; - FOR cn_name IN EXECUTE(query_str_cn_name) LOOP - query_cn := 'EXECUTE DIRECT ON (' || cn_name.node_name || ') ''SELECT unique_query FROM pg_catalog.gs_asp where unique_query_id = '|| ROW_DATA.unique_query_id||' limit 1'''; - FOR query_text IN EXECUTE(query_cn) LOOP - unique_query := query_text.unique_query; - END LOOP; - END LOOP; - END IF; - RETURN NEXT; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - end if; -END$DO$; - -DROP FUNCTION IF EXISTS pg_catalog.gs_stat_activity_timeout() cascade; -DROP FUNCTION IF EXISTS pg_catalog.global_stat_activity_timeout() cascade; - -DO $DO$ -DECLARE - ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS dbe_perf.gs_stat_activity_timeout() cascade; - DROP FUNCTION IF EXISTS dbe_perf.global_stat_activity_timeout() cascade; - end if; -END $DO$; -drop function if exists pg_catalog.login_audit_messages; -drop function if exists pg_catalog.login_audit_messages_pid; -drop function if exists pg_catalog.pg_query_audit(timestamptz, timestamptz) cascade; -drop function if exists pg_catalog.pg_query_audit(timestamptz, timestamptz, text) cascade; -drop function if exists pg_catalog.pgxc_query_audit(timestamptz, timestamptz) cascade; - -SET LOCAL inplace_upgrade_next_system_object_oids=IUO_PROC, 3780; -create function pg_catalog.pg_query_audit(TIMESTAMPTZ, TIMESTAMPTZ, OUT "time" TIMESTAMPTZ, OUT type TEXT, OUT result TEXT, OUT username TEXT, OUT database TEXT, OUT client_conninfo TEXT, OUT object_name TEXT, OUT detail_info TEXT, OUT node_name TEXT, OUT thread_id TEXT, OUT local_port TEXT, OUT remote_port TEXT) RETURNS SETOF RECORD LANGUAGE INTERNAL STABLE ROWS 100 STRICT as 'pg_query_audit'; - -SET LOCAL inplace_upgrade_next_system_object_oids=IUO_PROC, 3782; -create function pg_catalog.pg_query_audit(TIMESTAMPTZ, TIMESTAMPTZ, TEXT, OUT "time" TIMESTAMPTZ, OUT type TEXT, OUT result TEXT, OUT username TEXT, OUT database TEXT, OUT client_conninfo TEXT, OUT object_name TEXT, OUT detail_info TEXT, OUT node_name TEXT, OUT thread_id TEXT, OUT local_port TEXT, OUT remote_port TEXT) RETURNS SETOF RECORD LANGUAGE INTERNAL STABLE ROWS 100 STRICT as 'pg_query_audit'; - -CREATE OR REPLACE FUNCTION pg_catalog.login_audit_messages(in flag boolean) returns table (username text, database text, logintime timestamp with time zone, mytype text, result text, client_conninfo text) AUTHID DEFINER -AS $$ -DECLARE -user_name text; -db_name text; -SQL_STMT VARCHAR2(500); -fail_cursor REFCURSOR; -success_cursor REFCURSOR; -BEGIN - SELECT SESSION_USER INTO user_name; - SELECT CURRENT_DATABASE() INTO db_name; - IF flag = true THEN - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'') AND client_conninfo not LIKE ''gs_clean_%'' AND client_conninfo not LIKE ''pgxc_%'' AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ';'; - OPEN success_cursor FOR EXECUTE SQL_STMT; - --search bottom up for all the success login info - FETCH LAST FROM success_cursor into username, database, logintime, mytype, result, client_conninfo; - FETCH BACKWARD FROM success_cursor into username, database, logintime, mytype, result, client_conninfo; - IF FOUND THEN - return next; - END IF; - CLOSE success_cursor; - ELSE - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'', ''login_failed'') AND client_conninfo not LIKE ''gs_clean_%'' AND client_conninfo not LIKE ''pgxc_%'' AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ';'; - OPEN fail_cursor FOR EXECUTE SQL_STMT; - --search bottom up - FETCH LAST FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo; - LOOP - FETCH BACKWARD FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo; - EXIT WHEN NOT FOUND; - IF mytype = 'login_failed' THEN - return next; - ELSE - -- must be login_success - EXIT; - END IF; - END LOOP; - CLOSE fail_cursor; - END IF; -END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.login_audit_messages_pid(flag boolean) - RETURNS TABLE(username text, database text, logintime timestamp with time zone, mytype text, result text, client_conninfo text, backendid bigint) AUTHID DEFINER -AS $$ -DECLARE -user_name text; -db_name text; -SQL_STMT VARCHAR2(500); -fail_cursor REFCURSOR; -success_cursor REFCURSOR; -mybackendid bigint; -curSessionFound boolean; -BEGIN - SELECT SESSION_USER INTO user_name; - SELECT CURRENT_DATABASE() INTO db_name; - SELECT pg_backend_pid() INTO mybackendid; - curSessionFound = false; - IF flag = true THEN - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo, split_part(thread_id,''@'',1) backendid FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'') AND client_conninfo not LIKE ''gs_clean_%'' AND client_conninfo not LIKE ''pgxc_%'' AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ';'; - OPEN success_cursor FOR EXECUTE SQL_STMT; - --search bottom up for all the success login info - FETCH LAST FROM success_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - LOOP - IF backendid = mybackendid THEN - --found the login info for the current session - curSessionFound = true; - EXIT; - END IF; - FETCH BACKWARD FROM success_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - EXIT WHEN NOT FOUND; - END LOOP; - IF curSessionFound THEN - FETCH BACKWARD FROM success_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - IF FOUND THEN - return next; - END IF; - END IF; - ELSE - SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo, split_part(thread_id,''@'',1) backendid FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE - type IN (''login_success'', ''login_failed'') AND client_conninfo not LIKE ''gs_clean_%'' AND client_conninfo not LIKE ''pgxc_%'' AND username =' || quote_literal(user_name) || - ' AND database =' || quote_literal(db_name) || ';'; - OPEN fail_cursor FOR EXECUTE SQL_STMT; - --search bottom up - FETCH LAST FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - LOOP - IF backendid = mybackendid AND mytype = 'login_success' THEN - --found the login info for the current session - curSessionFound = true; - EXIT; - END IF; - FETCH BACKWARD FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo, backendid; - EXIT WHEN NOT FOUND; - END LOOP; - IF curSessionFound THEN - LOOP - FETCH BACKWARD FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo, backendid ; - EXIT WHEN NOT FOUND; - IF mytype = 'login_failed' THEN - return next; - ELSE - -- must be login_success - EXIT; - END IF; - END LOOP; - END IF; --curSessionFound - CLOSE fail_cursor; - END IF; -END; $$ -LANGUAGE plpgsql NOT FENCED; - ---get audit log from all CNs -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_query_audit(IN starttime TIMESTAMPTZ, IN endtime TIMESTAMPTZ, OUT "time" TIMESTAMPTZ, OUT "type" text, OUT "result" text, OUT username text, OUT database text, OUT client_conninfo text, OUT "object_name" text, OUT detail_info text, OUT node_name text, OUT thread_id text, OUT local_port text, OUT remote_port text) -RETURNS setof record -AS $$ -DECLARE - row_name record; - row_data record; - query_str text; - query_str_nodes text; - BEGIN - --Get the node names of all CNs - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_query_audit(''''' || starttime || ''''',''''' || endtime || ''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - "time" := row_data."time"; - "type" := row_data."type"; - "result" := row_data."result"; - username := row_data.username; - database := row_data.database; - client_conninfo := row_data.client_conninfo; - "object_name" := row_data."object_name"; - detail_info := row_data.detail_info; - node_name := row_data.node_name; - thread_id := row_data.thread_id; - local_port := row_data.local_port; - remote_port := row_data.remote_port; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_activity AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.sessionid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query, - S.connection_info - FROM pg_database D, pg_stat_get_activity_with_conninfo(NULL) AS S, pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid AND - S.pid = T.threadid; - -CREATE OR REPLACE VIEW pg_catalog.pg_stat_activity_ng AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.pid, - S.sessionid, - S.usesysid, - U.rolname AS usename, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.backend_start, - S.xact_start, - S.query_start, - S.state_change, - S.waiting, - S.enqueue, - S.state, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query_id, - S.query, - N.node_group - FROM pg_database D, pg_stat_get_activity(NULL) AS S, pg_stat_get_activity_ng(NULL) AS N, pg_authid U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid AND - S.pid = T.threadid AND - S.sessionid = N.sessionid AND - S.pid = N.pid; - -CREATE OR REPLACE VIEW pg_catalog.pg_session_wlmstat AS - SELECT - S.datid AS datid, - D.datname AS datname, - S.threadid, - S.sessionid, - S.threadpid AS processid, - S.usesysid, - S.appname, - U.rolname AS usename, - S.priority, - S.attribute, - S.block_time, - S.elapsed_time, - S.total_cpu_time, - S.skew_percent AS cpu_skew_percent, - S.statement_mem, - S.active_points, - S.dop_value, - S.current_cgroup AS control_group, - S.current_status AS status, - S.enqueue_state AS enqueue, - CASE - WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name - ELSE T.session_respool - END AS resource_pool, - S.query, - S.is_plana, - S.node_group - FROM pg_database D, pg_stat_get_session_wlmstat(NULL) AS S, pg_authid AS U, gs_wlm_session_respool(0) AS T - WHERE S.datid = D.oid AND - S.usesysid = U.oid AND - T.sessionid = S.sessionid AND - T.threadid = S.threadid; - -DO $DO$ -DECLARE - ans boolean; - user_name text; - query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - drop view if exists dbe_perf.wlm_user_resource_runtime cascade; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_wlm_user_resource_runtime - (OUT userid oid, OUT used_memory integer, OUT total_memory integer, - OUT used_cpu integer, OUT total_cpu integer, OUT used_space bigint, - OUT total_space bigint, OUT used_temp_space bigint, OUT total_temp_space bigint, - OUT used_spill_space bigint, OUT total_spill_space bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - query_str2 text; - BEGIN - query_str := 'SELECT rolname FROM pg_authid'; - FOR row_name IN EXECUTE(query_str) LOOP - query_str2 := 'SELECT * FROM gs_wlm_user_resource_info(''' || row_name.rolname || ''')'; - FOR row_data IN EXECUTE(query_str2) LOOP - userid = row_data.userid; - used_memory = row_data.used_memory; - total_memory = row_data.total_memory; - used_cpu = row_data.used_cpu; - total_cpu = row_data.total_cpu; - used_space = row_data.used_space; - total_space = row_data.total_space; - used_temp_space = row_data.used_temp_space; - total_temp_space = row_data.total_temp_space; - used_spill_space = row_data.used_spill_space; - total_spill_space = row_data.total_spill_space; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE VIEW DBE_PERF.wlm_user_resource_runtime AS - SELECT - S.usename AS username, - T.used_memory, - T.total_memory, - T.used_cpu, - T.total_cpu, - T.used_space, - T.total_space, - T.used_temp_space, - T.total_temp_space, - T.used_spill_space, - T.total_spill_space - FROM pg_user AS S join (select * from DBE_PERF.get_wlm_user_resource_runtime()) AS T - on S.usesysid = T.userid; - - select session_user into user_name; - query_str := 'GRANT ALL ON TABLE DBE_PERF.wlm_user_resource_runtime TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - GRANT SELECT ON DBE_PERF.wlm_user_resource_runtime TO PUBLIC; - end if; -END$DO$; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select relname from pg_class where relname='gs_asp_sample_time_index' limit 1) into ans; - if ans = true then - DROP INDEX IF EXISTS pg_catalog.gs_asp_sample_time_index; - end if; -END$$; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select relname from pg_class where relname='gs_asp' limit 1) into ans; - if ans = true then - SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 0, 0, 0, 2998; - CREATE UNIQUE INDEX gs_asp_sample_time_index ON pg_catalog.gs_asp USING BTREE(sample_time timestamptz_ops); - SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 0, 0, 0, 0; - end if; -END$$; - -CREATE OR REPLACE FUNCTION pg_catalog.remove_create_partition_policy( - IN relationname name, - IN username name = NULL -) -RETURNS integer -AS -$$ -DECLARE - sql text; - check_count int; - job_id int; - current_username name; - is_admin bool = false; - user_logic_flag bool = true; - database name; - namespace name; - table_name name; - pos integer; -BEGIN - /* check tsdb_enable */ - IF check_engine_enable() = false - THEN - RAISE EXCEPTION 'tsdb engine is not exist'; - END IF; - /* check tsdb_enable end */ - - /* check parameter */ - IF relationname is null THEN - RAISE EXCEPTION 'parameter ''relationname'' cannot be null'; - END IF; - pos = is_contain_namespace(relationname); - IF pos != 0 THEN - namespace = substring(relationname from 1 for pos -1); - table_name = substring(relationname from pos+1 for char_length(relationname) - pos); - END IF; - /* check parameter end */ - - /* check user or admin */ - sql := 'select current_user'; - EXECUTE(sql) into current_username; - is_admin = is_super_user_or_sysadm(current_username); - - IF is_admin is false AND username is not null AND lower(current_username) != lower(username) THEN - RAISE EXCEPTION 'user is not allowed to set the second parameter ''username'' unless their owned name'; - END IF; - - IF is_admin is true AND username is not null THEN - user_logic_flag = false; - sql := 'select count(*) from pg_user where usename = lower(''' || username || ''');'; - EXECUTE sql into check_count; - IF check_count = 0 THEN - RAISE EXCEPTION 'please input the correct username!'; - END IF; - END IF; - /* check user or admin end */ - - /* check table exist */ - IF user_logic_flag is true THEN - IF pos = 0 THEN - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname =''' || relationname || ''' - AND pg_catalog.pg_table_is_visible(c.oid);'; - ELSE - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname =''' || table_name || ''' - AND n.nspname = ''' || namespace || ''';'; - END IF; - ELSE - IF pos = 0 THEN - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname =''' || relationname || ''' - AND pg_catalog.pg_get_userbyid(c.relowner) = ''' || username || ''';'; - ELSE - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname =''' || table_name || ''' - AND n.nspname = ''' || namespace || ''' AND pg_catalog.pg_get_userbyid(c.relowner) = ''' || username || ''';'; - END IF; - END IF; - EXECUTE sql into check_count; - IF check_count = 0 THEN - RAISE EXCEPTION 'please input the correct relation name!'; - END IF; - /* check table exist end */ - - /* check table owner privilege */ - IF user_logic_flag is true THEN - IF pos = 0 THEN - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = - ''' || relationname || ''' AND pg_catalog.pg_table_is_visible(c.oid) and pg_catalog.pg_get_userbyid(c.relowner) = ''' || current_username || ''';'; - ELSE - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = - ''' || table_name || ''' AND n.nspname = ''' || namespace || ''' and pg_catalog.pg_get_userbyid(c.relowner) = ''' || current_username || ''';'; - END IF; - EXECUTE sql into check_count; - IF check_count = 0 THEN - RAISE EXCEPTION 'permission denied for relation %', relationname - USING HINT = 'please assure you have the privilege'; - END IF; - END IF; - /* check table owner privilege end */ - - /* check add partition policy exists */ - sql = 'select current_database();'; - EXECUTE sql INTO database; - IF user_logic_flag is true THEN - sql := 'select count(*) from pg_job a, pg_job_proc b where b.what like ''%proc_add_partition(''''' || relationname || '''''%'' - and a.job_id = b.job_id and a.priv_user='''|| current_username ||''' and dbname = ''' || database || ''';'; - ELSE - sql = 'select count(*) from pg_job a, pg_job_proc b where b.what like ''%proc_add_partition(''''' || relationname || '''''%'' - and a.job_id = b.job_id and a.priv_user='''|| username ||''' and dbname = ''' || database || ''';'; - END IF; - - EXECUTE sql into check_count; - IF check_count = 0 THEN - RAISE EXCEPTION ' % does not have create policy!',relationname; - END IF; - /* check add partition policy exists end */ - - IF user_logic_flag is true THEN - sql := 'select a.job_id from pg_job a, pg_job_proc b where b.what like ''%proc_add_partition(''''' || relationname || '''''%'' - and a.job_id = b.job_id and a.priv_user='''|| current_username ||''' and dbname = ''' || database || ''';'; - ELSE - sql = 'select a.job_id from pg_job a, pg_job_proc b where b.what like ''%proc_add_partition(''''' || relationname || '''''%'' - and a.job_id = b.job_id and a.priv_user='''|| username ||''' and dbname = ''' || database || ''';'; - END IF; - EXECUTE sql into job_id; - sql := 'SELECT remove_job_class_depend(' || job_id || ')'; - EXECUTE sql; - sql := 'SELECT DBE_TASK.cancel('||job_id||')'; - EXECUTE(sql); - - RETURN job_id; -END; -$$ -LANGUAGE plpgsql; - -CREATE OR REPLACE FUNCTION is_super_user_or_sysadm( - IN i_user name -) -RETURNS bool -AS -$$ -BEGIN - IF ( - select count(*) from pg_roles where rolname = i_user and (rolsystemadmin=true or rolsuper=true) - ) < 1 - THEN - RETURN FALSE; - ELSE - RETURN TRUE; - END IF; -END; -$$ -LANGUAGE plpgsql; - -CREATE OR REPLACE FUNCTION pg_catalog.remove_drop_partition_policy( - IN relationname name, - IN username name=null -) -RETURNS integer -AS -$$ -DECLARE - sql text; - check_count int; - job_id int; - table_oid int; - current_username name; - is_admin bool = false; - user_logic_flag bool = true; - database name; - namespace name; - table_name name; - pos integer; -BEGIN - /* check tsdb_enable */ - IF check_engine_enable() = false - THEN - RAISE EXCEPTION 'tsdb engine is not exist'; - END IF; - /* check tsdb_enable end */ - - /* check parameter */ - IF relationname is null THEN - RAISE EXCEPTION 'parameter ''relationname'' cannot be null'; - END IF; - pos = is_contain_namespace(relationname); - IF pos != 0 THEN - namespace = substring(relationname from 1 for pos -1); - table_name = substring(relationname from pos+1 for char_length(relationname) - pos); - END IF; - /* check parameter end */ - - /* check user or admin */ - sql := 'select current_user'; - EXECUTE(sql) into current_username; - is_admin = is_super_user_or_sysadm(current_username); - - IF is_admin is false AND username is not null AND lower(current_username) != lower(username) THEN - RAISE EXCEPTION 'user is not allowed to set the second parameter ''username'' unless their owned name'; - END IF; - - IF is_admin is true AND username is not null THEN - user_logic_flag = false; - sql := 'select count(*) from pg_user where usename = lower(''' || username || ''');'; - EXECUTE sql into check_count; - IF check_count = 0 THEN - RAISE EXCEPTION 'please input the correct username!'; - END IF; - END IF; - /* check user or admin end */ - - /* check table exist */ - IF user_logic_flag is true THEN - IF pos = 0 THEN - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname =''' || relationname || ''' - AND pg_catalog.pg_table_is_visible(c.oid);'; - ELSE - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname =''' || table_name || ''' - AND n.nspname = ''' || namespace || ''';'; - END IF; - ELSE - IF pos = 0 THEN - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname =''' || relationname || ''' - AND pg_catalog.pg_get_userbyid(c.relowner) = ''' || username || ''';'; - ELSE - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname =''' || table_name || ''' - AND n.nspname = ''' || namespace || ''' AND pg_catalog.pg_get_userbyid(c.relowner) = ''' || username || ''';'; - - END IF; - END IF; - EXECUTE sql into check_count; - IF check_count = 0 THEN - RAISE EXCEPTION 'please input the correct relation name!'; - END IF; - /* check table exist end */ - - /* check table owner privilege */ - IF user_logic_flag is true THEN - IF pos = 0 THEN - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = - ''' || relationname || ''' AND pg_catalog.pg_table_is_visible(c.oid) and pg_catalog.pg_get_userbyid(c.relowner) = ''' || current_username || ''';'; - ELSE - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = - ''' || table_name || ''' AND n.nspname = ''' || namespace || ''' and pg_catalog.pg_get_userbyid(c.relowner) = ''' || current_username || ''';'; - END IF; - EXECUTE sql into check_count; - IF check_count = 0 THEN - RAISE EXCEPTION 'permission denied for relation %', relationname - USING HINT = 'please assure you have the privilege'; - END IF; - END IF; - /* check table owner privilege end */ - - sql = 'select current_database();'; - EXECUTE sql INTO database; - IF user_logic_flag is true THEN - sql := 'select count(*) from pg_job a, pg_job_proc b where b.what like ''%proc_drop_partition(''''' || relationname || '''''%'' - and a.job_id = b.job_id and a.priv_user='''|| current_username ||''' and dbname = ''' || database || ''';'; - ELSE - sql = 'select count(*) from pg_job a, pg_job_proc b where b.what like ''%proc_drop_partition(''''' || relationname || '''''%'' - and a.job_id = b.job_id and a.priv_user='''|| username ||''' and dbname = ''' || database || ''';'; - END IF; - - EXECUTE sql into check_count; - IF check_count = 0 THEN - RAISE EXCEPTION ' % does not have drop policy!',relationname; - END IF; - - IF user_logic_flag is true THEN - sql = 'select a.job_id from pg_job a, pg_job_proc b where b.what like ''%proc_drop_partition(''''' || relationname || '''''%'' - and a.job_id = b.job_id and a.priv_user='''|| current_username ||''' and dbname = ''' || database || ''';'; - ELSE - sql = 'select a.job_id from pg_job a, pg_job_proc b where b.what like ''%proc_drop_partition(''''' || relationname || '''''%'' - and a.job_id = b.job_id and a.priv_user='''|| username ||''' and dbname = ''' || database || ''';'; - END IF; - EXECUTE sql into job_id; - sql := 'SELECT remove_job_class_depend(' || job_id || ')'; - EXECUTE sql; - sql := 'SELECT DBE_TASK.cancel('||job_id||')'; - EXECUTE(sql); - - RETURN job_id ; -END; -$$ -LANGUAGE plpgsql; - -DO $$ -DECLARE - ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS dbe_perf.gs_stat_activity_timeout() cascade; - DROP FUNCTION IF EXISTS dbe_perf.global_stat_activity_timeout() cascade; - end if; -END$$; - -DROP EXTENSION IF EXISTS security_plugin CASCADE; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select relname from pg_class where relname='pg_asp' limit 1) into ans; - if ans = true then - DROP INDEX IF EXISTS pg_catalog.pg_asp_oid_index; - DROP TYPE IF EXISTS pg_catalog.pg_asp; - DROP TABLE IF EXISTS pg_catalog.pg_asp; - end if; -END$$; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 9027, 84, 0, 0; -CREATE TABLE IF NOT EXISTS pg_catalog.pg_asp - (sampleid bigint nocompress not null, - sample_time timestamp with time zone nocompress not null, - need_flush_sample boolean nocompress not null, - databaseid oid nocompress not null, - thread_id bigint nocompress not null, - sessionid bigint nocompress not null, - start_time timestamp with time zone nocompress not null, - event text nocompress, - lwtid integer nocompress, - psessionid bigint nocompress, - tlevel integer nocompress, - smpid integer nocompress, - userid oid nocompress, - application_name text nocompress, - client_addr inet nocompress, - client_hostname text nocompress, - client_port integer nocompress, - query_id bigint nocompress, - unique_query_id bigint nocompress, - user_id oid nocompress, - cn_id integer nocompress, - unique_query text nocompress -) WITH oids TABLESPACE pg_default; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 0, 0, 0, 2997; -CREATE UNIQUE INDEX pg_asp_oid_index ON pg_catalog.pg_asp USING BTREE(oid oid_ops); -GRANT SELECT ON pg_catalog.pg_asp TO PUBLIC; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 0, 0, 0, 0; -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_pg_asp - (in start_ts timestamp without time zone, - in end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA pg_catalog.pg_asp%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - node_str TEXT; - BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'')'; - node_str := 'SELECT * FROM pg_catalog.pg_asp where sample_time > '''''||$1||''''' and sample_time < '''''||$2||''''; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') '''|| node_str ||''''';'; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := ROW_NAME.NODE_NAME; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - unique_query := ROW_DATA.unique_query; - RETURN NEXT; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - end if; -END$DO$; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP VIEW IF EXISTS DBE_PERF.global_pg_asp cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_global_pg_asp() cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_datanode_active_session_hist() cascade; - CREATE OR REPLACE FUNCTION DBE_PERF.get_datanode_active_session_hist - ( in datanode text, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA pg_catalog.pg_asp%ROWTYPE; - cn_name record; - query_text record; - QUERY_STR text; - query_cn text; - query_str_cn_name text; - BEGIN - --Get all the node names - QUERY_STR := 'EXECUTE DIRECT ON (' || $1 || ') ''SELECT * FROM pg_catalog.pg_asp'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := datanode; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - IF ROW_DATA.cn_id IS NULL THEN - unique_query := ROW_DATA.unique_query; - ELSE - query_str_cn_name := 'SELECT node_name FROM pgxc_node WHERE node_id='||ROW_DATA.cn_id||' AND nodeis_active = true'; - FOR cn_name IN EXECUTE(query_str_cn_name) LOOP - query_cn := 'EXECUTE DIRECT ON (' || cn_name.node_name || ') ''SELECT unique_query FROM pg_catalog.pg_asp where unique_query_id = '|| ROW_DATA.unique_query_id||' limit 1'''; - FOR query_text IN EXECUTE(query_cn) LOOP - unique_query := query_text.unique_query; - END LOOP; - END LOOP; - END IF; - RETURN NEXT; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_pg_asp - (OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA pg_catalog.pg_asp%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'')'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM pg_asp'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := ROW_NAME.NODE_NAME; - sampleid := ROW_DATA.sample_id; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - unique_query := ROW_DATA.unique_query; - RETURN NEXT; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - CREATE VIEW DBE_PERF.global_pg_asp AS - SELECT * FROM DBE_PERF.get_global_pg_asp(); - DECLARE - user_name text; - query_str text; - BEGIN - SELECT SESSION_USER INTO user_name; - query_str := 'GRANT ALL ON TABLE DBE_PERF.global_pg_asp TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - END; - GRANT SELECT ON TABLE DBE_PERF.global_pg_asp TO PUBLIC; - end if; -END$DO$; - -DROP FUNCTION IF EXISTS pg_catalog.sys_context(text, text) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 731; -CREATE OR REPLACE FUNCTION pg_catalog.sys_context(text, text) RETURNS text LANGUAGE INTERNAL NOT FENCED STRICT as 'sys_context'; - -do $$DECLARE ans boolean; -BEGIN - for ans in select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='pkg_service' limit 1) - LOOP - if ans = true then - DROP FUNCTION IF EXISTS pkg_service.job_cancel(bigint) cascade; - DROP FUNCTION IF EXISTS pkg_service.job_finish(bigint, boolean, timestamp) cascade; - DROP FUNCTION IF EXISTS pkg_service.job_submit(bigint, text, timestamp, text) cascade; - DROP FUNCTION IF EXISTS pkg_service.job_update(bigint, timestamp, text, text) cascade; - DROP FUNCTION IF EXISTS pkg_service.isubmit_on_nodes(bigint, name, name, text, timestamp without time zone, text) cascade; - DROP FUNCTION IF EXISTS pkg_service.submit_on_nodes(name, name, text, timestamp without time zone, text, OUT integer) cascade; - DROP FUNCTION IF EXISTS pkg_service.isubmit_on_nodes_internal(bigint, name, name, text, timestamp without time zone, text) cascade; - end if; - exit; - END LOOP; -END$$; -DROP SCHEMA IF EXISTS pkg_service cascade; - -CREATE OR REPLACE VIEW pg_catalog.ALL_OBJECTS AS - SELECT - pg_get_userbyid(cs.relowner) AS OWNER, - cs.relname AS OBJECT_NAME, - cs.oid AS OBJECT_ID, - (CASE - WHEN cs.relkind IN ('r', 'f') - THEN 'table'::NAME - WHEN cs.relkind='i' - THEN 'index'::NAME - WHEN cs.relkind='S' - THEN 'sequence'::NAME - WHEN cs.relkind='v' - THEN 'view'::NAME - END) AS OBJECT_TYPE, - cs.relnamespace AS NAMESPACE, - po.ctime AS CREATED, - po.mtime AS LAST_DDL_TIME - FROM pg_class cs left join pg_object po - on (po.object_oid = cs.oid and po.object_type in('r', 'f', 'i', 's', 'v')) - where cs.relkind in('r', 'f', 'i', 'S', 'v') - UNION - SELECT - pg_get_userbyid(pc.proowner) AS OWNER, - pc.proname AS OBJECT_NAME, - pc.oid AS OBJECT_ID, - 'procedure'::NAME AS OBJECT_TYPE, - pc.pronamespace AS NAMESPACE, - po.ctime AS CREATED, - po.mtime AS LAST_DDL_TIME - FROM pg_proc pc left join pg_object po - on (po.object_oid = pc.oid and po.object_type = 'P') - UNION - SELECT - pg_get_userbyid(cs.relowner) AS OWNER, - re.rulename AS OBJECT_NAME, - re.oid AS OBJECT_ID, - 'rule'::NAME AS OBJECT_TYPE, - cs.relnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_rewrite re - LEFT JOIN pg_class cs ON (cs.oid = re.ev_class) - UNION - SELECT - pg_get_userbyid(cs.relowner) AS OWNER, - tr.tgname AS OBJECT_NAME, - tr.oid AS OBJECT_ID, - 'trigger'::NAME AS OBJECT_TYPE, - cs.relnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_trigger tr - LEFT JOIN pg_class cs ON (cs.oid = tr.tgrelid) - UNION - SELECT - pg_get_userbyid(te.typowner) AS OWNER, - te.typname AS OBJECT_NAME, - te.oid AS OBJECT_ID, - 'type'::NAME AS OBJECT_TYPE, - te.typnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_type te - UNION - SELECT - pg_get_userbyid(op.oprowner) AS OWNER, - op.oprname AS OBJECT_NAME, - op.oid AS OBJECT_ID, - 'operator'::NAME AS OBJECT_TYPE, - op.oprnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_operator op - UNION ALL - SELECT - pg_get_userbyid(syn.synowner) AS OWNER, - syn.synname AS OBJECT_NAME, - syn.oid AS OBJECT_ID, - 'synonym'::NAME AS OBJECT_TYPE, - syn.synnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_synonym syn; - - - -CREATE OR REPLACE VIEW pg_catalog.USER_OBJECTS AS - SELECT - cs.relname AS OBJECT_NAME, - cs.oid AS OBJECT_ID, - CASE - WHEN cs.relkind IN ('r', 'f') - THEN 'table'::NAME - WHEN cs.relkind='i' - THEN 'index'::NAME - WHEN cs.relkind='S' - THEN 'sequence'::NAME - WHEN cs.relkind='v' - THEN 'view'::NAME - END AS OBJECT_TYPE, - cs.relnamespace AS NAMESPACE, - po.ctime AS CREATED, - po.mtime AS LAST_DDL_TIME - FROM pg_class cs left join pg_object po - on (po.object_oid = cs.oid and po.object_type in('r', 'f', 'i', 's', 'v')) - WHERE cs.relkind in('r', 'f', 'i', 'S', 'v') - AND pg_get_userbyid(cs.relowner)=SYS_CONTEXT('USERENV','CURRENT_USER') - UNION - SELECT - pc.proname AS OBJECT_NAME, - pc.oid AS OBJECT_ID, - 'procedure'::NAME AS OBJECT_TYPE, - pc.pronamespace AS NAMESPACE, - po.ctime AS CREATED, - po.mtime AS LAST_DDL_TIME - FROM pg_proc pc left join pg_object po - on (po.object_oid = pc.oid and po.object_type = 'P') - WHERE pg_get_userbyid(pc.proowner)=SYS_CONTEXT('USERENV','CURRENT_USER') - UNION - SELECT - re.rulename AS OBJECT_NAME, - re.oid AS OBJECT_ID, - 'rule'::NAME AS OBJECT_TYPE, - cs.relnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_rewrite re - LEFT JOIN pg_class cs ON (cs.oid = re.ev_class) - WHERE pg_get_userbyid(cs.relowner)=SYS_CONTEXT('USERENV','CURRENT_USER') - UNION - SELECT - tr.tgname AS OBJECT_NAME, - tr.oid AS OBJECT_ID, - 'trigger'::NAME AS OBJECT_TYPE, - cs.relnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_trigger tr - LEFT JOIN pg_class cs ON (cs.oid = tr.tgrelid) - WHERE pg_get_userbyid(cs.relowner)=SYS_CONTEXT('USERENV','CURRENT_USER') - UNION - SELECT - te.typname AS OBJECT_NAME, - te.oid AS OBJECT_ID, - 'type'::NAME AS OBJECT_TYPE, - te.typnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_type te - WHERE pg_get_userbyid(te.typowner)=SYS_CONTEXT('USERENV','CURRENT_USER') - UNION - SELECT - op.oprname AS OBJECT_NAME, - op.oid AS OBJECT_ID, - 'operator'::NAME AS OBJECT_TYPE, - op.oprnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_operator op - WHERE pg_get_userbyid(op.oprowner)=SYS_CONTEXT('USERENV','CURRENT_USER') - UNION ALL - SELECT - syn.synname AS OBJECT_NAME, - syn.oid AS OBJECT_ID, - 'synonym'::NAME AS OBJECT_TYPE, - syn.synnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_synonym syn - WHERE pg_get_userbyid(syn.synowner) = SYS_CONTEXT('USERENV','CURRENT_USER'); - -CREATE OR REPLACE VIEW pg_catalog.DBA_OBJECTS AS - SELECT - pg_get_userbyid(cs.relowner) AS OWNER, - cs.relname AS OBJECT_NAME, - cs.oid AS OBJECT_ID, - (CASE - WHEN cs.relkind IN ('r', 'f') - THEN 'TABLE'::NAME - WHEN cs.relkind='i' - THEN 'INDEX'::NAME - WHEN cs.relkind='S' - THEN 'SEQUENCE'::NAME - WHEN cs.relkind='v' - THEN 'VIEW'::NAME - END) AS OBJECT_TYPE, - cs.relnamespace AS NAMESPACE, - po.ctime AS CREATED, - po.mtime AS LAST_DDL_TIME - FROM pg_class cs left join pg_object po - on (po.object_oid = cs.oid and po.object_type in('r', 'f', 'i', 's', 'v')) - where cs.relkind in('r', 'f', 'i', 'S', 'v') - UNION - SELECT - pg_get_userbyid(pc.proowner) AS OWNER, - pc.proname AS OBJECT_NAME, - pc.oid AS OBJECT_ID, - 'PROCEDURE'::NAME AS OBJECT_TYPE, - pc.pronamespace AS NAMESPACE, - po.ctime AS CREATED, - po.mtime AS LAST_DDL_TIME - FROM pg_proc pc left join pg_object po - on (po.object_oid = pc.oid and po.object_type = 'P') - UNION - SELECT - pg_get_userbyid(cs.relowner) AS OWNER, - re.rulename AS OBJECT_NAME, - re.oid AS OBJECT_ID, - 'RULE'::NAME AS OBJECT_TYPE, - cs.relnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_rewrite re - LEFT JOIN pg_class cs ON (cs.oid = re.ev_class) - UNION - SELECT - pg_get_userbyid(cs.relowner) AS OWNER, - tr.tgname AS OBJECT_NAME, - tr.oid AS OBJECT_ID, - 'TRIGGER'::NAME AS OBJECT_TYPE, - cs.relnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_trigger tr - LEFT JOIN pg_class cs ON (cs.oid = tr.tgrelid) - UNION - SELECT - pg_get_userbyid(te.typowner) AS OWNER, - te.typname AS OBJECT_NAME, - te.oid AS OBJECT_ID, - 'TYPE'::NAME AS OBJECT_TYPE, - te.typnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_type te - UNION - SELECT - pg_get_userbyid(op.oprowner) AS OWNER, - op.oprname AS OBJECT_NAME, - op.oid AS OBJECT_ID, - 'OPERATOR'::NAME AS OBJECT_TYPE, - op.oprnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_operator op - UNION ALL - SELECT - pg_get_userbyid(syn.synowner) AS OWNER, - syn.synname AS OBJECT_NAME, - syn.oid AS OBJECT_ID, - 'synonym'::NAME AS OBJECT_TYPE, - syn.synnamespace AS NAMESPACE, - NULL::timestamptz AS CREATED, - NULL::timestamptz AS LAST_DDL_TIME - FROM pg_synonym syn; \ No newline at end of file diff --git a/src/include/catalog/upgrade_sql/open_gauss/rollback_catalog_otherdb/rollback_catalog_otherdb_92_200.sql b/src/include/catalog/upgrade_sql/open_gauss/rollback_catalog_otherdb/rollback_catalog_otherdb_92_200.sql index 7d3fe1686..e69de29bb 100644 --- a/src/include/catalog/upgrade_sql/open_gauss/rollback_catalog_otherdb/rollback_catalog_otherdb_92_200.sql +++ b/src/include/catalog/upgrade_sql/open_gauss/rollback_catalog_otherdb/rollback_catalog_otherdb_92_200.sql @@ -1,2151 +0,0 @@ ---296 -DECLARE -sql text; -BEGIN - if exists(select extname from pg_extension where extname = 'packages') then - sql := 'DROP EXTENSION IF EXISTS packages CASCADE;'; - execute sql; - sql := 'CREATE EXTENSION packages;'; - execute sql; - end if; -END -/ - -do $$DECLARE ans boolean; -BEGIN - for ans in select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='pkg_service' limit 1) - LOOP - if ans = true then - DROP FUNCTION IF EXISTS pkg_service.job_cancel(bigint) cascade; - DROP FUNCTION IF EXISTS pkg_service.job_finish(bigint, boolean, timestamp) cascade; - DROP FUNCTION IF EXISTS pkg_service.job_submit(bigint, text, timestamp, text) cascade; - DROP FUNCTION IF EXISTS pkg_service.job_update(bigint, timestamp, text, text) cascade; - end if; - exit; - END LOOP; -END$$; - ---287 -DECLARE -sql text; -BEGIN - if exists(select extname from pg_extension where extname = 'gsredistribute') then - sql := 'DROP EXTENSION IF EXISTS gsredistribute CASCADE;'; - execute sql; - sql := 'CREATE EXTENSION gsredistribute;'; - execute sql; - end if; -END -/ - ---286 -DROP FUNCTION IF EXISTS pg_catalog.pg_control_checkpoint() CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.pg_control_system() CASCADE; - - ---284 -DROP FUNCTION IF EXISTS pg_catalog.track_model_train_opt(text, text); - -DROP FUNCTION IF EXISTS pg_catalog.gs_stat_get_wlm_plan_operator_info(oid); - -DROP FUNCTION IF EXISTS pg_catalog.model_train_opt(text, text); - -DROP FUNCTION IF EXISTS pg_catalog.encode_plan_node(text, text, text, text, int8, text, text); - -DROP FUNCTION IF EXISTS pg_catalog.check_engine_status(text, text); - - ---283 -DROP VIEW IF EXISTS pg_catalog.pgxc_get_table_skewness CASCADE; - --- view for get the skew of the data distribution in all datanodes -CREATE OR REPLACE VIEW pg_catalog.pgxc_get_table_skewness AS -WITH skew AS -( - SELECT - schemaname, - tablename, - sum(dnsize) AS totalsize, - avg(dnsize) AS avgsize, - max(dnsize) AS maxsize, - min(dnsize) AS minsize, - (max(dnsize) - min(dnsize)) AS skewsize, - stddev(dnsize) AS skewstddev - FROM pg_catalog.pg_class c - INNER JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace - INNER JOIN pg_catalog.table_distribution() s ON s.schemaname = n.nspname AND s.tablename = c.relname - INNER JOIN pg_catalog.pgxc_class x ON c.oid = x.pcrelid AND x.pclocatortype = 'H' - GROUP BY schemaname,tablename -) -SELECT - schemaname, - tablename, - totalsize, - avgsize::numeric(1000), - (maxsize/totalsize)::numeric(4,3) AS maxratio, - (minsize/totalsize)::numeric(4,3) AS minratio, - skewsize, - (skewsize/totalsize)::numeric(4,3) AS skewratio, - skewstddev::numeric(1000) -FROM skew -WHERE totalsize > 0; - -GRANT SELECT ON TABLE pg_catalog.pgxc_get_table_skewness TO PUBLIC; - -create or replace function table_skewness(table_name text, column_name text, - OUT seqNum text, OUT Num text, OUT Ratio text, row_num text default '0') -RETURNS setof record -AS $$ -DECLARE - tolal_num text; - row_data record; - execute_query text; - BEGIN - if row_num = 0 then - EXECUTE 'select count(1) from ' || $1 into tolal_num; - execute_query = 'select seqNum, count(1) as num - from (select pg_catalog.table_data_skewness(row(' || $2 ||'), ''H'') as seqNum from ' || $1 || - ') group by seqNum order by num DESC'; - else - tolal_num = row_num; - execute_query = 'select seqNum, count(1) as num - from (select pg_catalog.table_data_skewness(row(' || $2 ||'), ''H'') as seqNum from ' || $1 || - ' limit ' || row_num ||') group by seqNum order by num DESC'; - end if; - - if tolal_num = 0 then - seqNum = 0; - Num = 0; - Ratio = ROUND(0, 3) || '%'; - return; - end if; - - for row_data in EXECUTE execute_query loop - seqNum = row_data.seqNum; - Num = row_data.num; - Ratio = ROUND(row_data.num / tolal_num * 100, 3) || '%'; - RETURN next; - end loop; - END; -$$LANGUAGE plpgsql NOT FENCED; - ---282 -DROP FUNCTION IF EXISTS pg_catalog.gs_roach_stop_backup(text); - -DROP FUNCTION IF EXISTS pg_catalog.gs_roach_enable_delay_ddl_recycle(name); - -DROP FUNCTION IF EXISTS pg_catalog.gs_roach_disable_delay_ddl_recycle(name); - -DROP FUNCTION IF EXISTS pg_catalog.gs_roach_switch_xlog(bool); - -DROP FUNCTION IF EXISTS pg_catalog.pg_resume_bkp_flag(name); -DROP FUNCTION IF EXISTS pg_catalog.pg_resume_bkp_flag(); -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 4445; -CREATE OR REPLACE FUNCTION pg_catalog.pg_resume_bkp_flag -(out start_backup_flag bool, -out to_delay bool, -out ddl_delay_recycle_ptr text, -out rewind_time text) -RETURNS record LANGUAGE INTERNAL STRICT as 'pg_resume_bkp_flag'; - - ---272 -DROP INDEX IF EXISTS pg_catalog.pgxc_slice_relid_index; -DROP INDEX IF EXISTS pg_catalog.pgxc_slice_order_index; -DROP TYPE IF EXISTS pg_catalog.pgxc_slice; -DROP TABLE IF EXISTS pg_catalog.pgxc_slice; ---271 -DROP INDEX IF EXISTS pg_catalog.streaming_gather_agg_index; -DROP INDEX IF EXISTS pg_catalog.streaming_reaper_status_id_index; -DROP INDEX IF EXISTS pg_catalog.streaming_reaper_status_oid_index; -DROP TYPE IF EXISTS pg_catalog.streaming_reaper_status; -DROP TABLE IF EXISTS pg_catalog.streaming_reaper_status; - ---270 -DROP INDEX IF EXISTS pg_catalog.streaming_cont_query_schema_change_index; -UPDATE pg_index SET indisunique = true WHERE indexrelid = 3234; - - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_type where typname = 'byteawithoutorderwithequalcol' limit 1) into ans; - if ans = true then - DROP OPERATOR FAMILY IF EXISTS byteawithoutorderwithequalcol_ops USING BTREE; - DROP OPERATOR FAMILY IF EXISTS byteawithoutorderwithequalcol_ops USING HASH; - DROP OPERATOR CLASS IF EXISTS byteawithoutorderwithequalcol_ops USING BTREE; - DROP OPERATOR CLASS IF EXISTS byteawithoutorderwithequalcol_ops USING HASH; - - DROP OPERATOR IF EXISTS pg_catalog.= (byteawithoutorderwithequalcol, byteawithoutorderwithequalcol) cascade; - DROP OPERATOR IF EXISTS pg_catalog.= (byteawithoutorderwithequalcol, bytea) cascade; - DROP OPERATOR IF EXISTS pg_catalog.= (bytea, byteawithoutorderwithequalcol) cascade; - DROP OPERATOR IF EXISTS pg_catalog.<> (byteawithoutorderwithequalcol, byteawithoutorderwithequalcol) cascade; - DROP OPERATOR IF EXISTS pg_catalog.<> (byteawithoutorderwithequalcol, bytea) cascade; - DROP OPERATOR IF EXISTS pg_catalog.<> (bytea, byteawithoutorderwithequalcol) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcolcmp(byteawithoutorderwithequalcol, byteawithoutorderwithequalcol) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcolcmpbytear(byteawithoutorderwithequalcol, bytea) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcolcmpbyteal(bytea, byteawithoutorderwithequalcol) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcoleq(byteawithoutorderwithequalcol, byteawithoutorderwithequalcol) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcoleqbyteal(bytea, byteawithoutorderwithequalcol) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcoleqbytear(byteawithoutorderwithequalcol, bytea) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcolne(byteawithoutorderwithequalcol, byteawithoutorderwithequalcol) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcolnebyteal(bytea, byteawithoutorderwithequalcol) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcolnebytear(byteawithoutorderwithequalcol, bytea) cascade; - DROP FUNCTION IF EXISTS pg_catalog.hll_hash_byteawithoutorderwithequalcol(byteawithoutorderwithequalcol) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcolout(byteawithoutorderwithequalcol) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcolsend(byteawithoutorderwithequalcol) cascade; - end if; -END$$; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_type where typname = 'byteawithoutordercol' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutordercolout(byteawithoutordercol) cascade; - DROP FUNCTION IF EXISTS pg_catalog.byteawithoutordercolsend(byteawithoutordercol) cascade; - end if; -END$$; -DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcolin(cstring) cascade; -DROP FUNCTION IF EXISTS pg_catalog.byteawithoutordercolin(cstring) cascade; -DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcolrecv(internal) cascade; -DROP FUNCTION IF EXISTS pg_catalog.byteawithoutordercolrecv(internal) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcoltypmodin(_cstring) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.byteawithoutorderwithequalcoltypmodout(int4) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cek_privilege(name, text, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cek_privilege(name, oid, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cek_privilege(oid, text, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cek_privilege(oid, oid, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cek_privilege(text, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cek_privilege(oid, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cmk_privilege(name, text, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cmk_privilege(name, oid, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cmk_privilege(oid, text, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cmk_privilege(oid, oid, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cmk_privilege(text, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.has_cmk_privilege(oid, text) cascade; - -DROP TYPE IF EXISTS pg_catalog.byteawithoutorderwithequalcol; -DROP TYPE IF EXISTS pg_catalog.byteawithoutordercol; - -DROP INDEX IF EXISTS pg_catalog.gs_column_keys_args_oid_index; -DROP TYPE IF EXISTS pg_catalog.gs_column_keys_args; -DROP TABLE IF EXISTS pg_catalog.gs_column_keys_args; - -DROP INDEX IF EXISTS pg_catalog.gs_client_global_keys_args_oid_index; -DROP TYPE IF EXISTS pg_catalog.gs_client_global_keys_args; -DROP TABLE IF EXISTS pg_catalog.gs_client_global_keys_args; - -DROP INDEX IF EXISTS pg_catalog.gs_column_keys_distributed_id_index; -DROP INDEX IF EXISTS pg_catalog.gs_column_keys_name_index; -DROP INDEX IF EXISTS pg_catalog.gs_column_keys_oid_index; -DROP TYPE IF EXISTS pg_catalog.gs_column_keys; -DROP TABLE IF EXISTS pg_catalog.gs_column_keys; - -DROP INDEX IF EXISTS pg_catalog.gs_client_global_keys_name_index; -DROP INDEX IF EXISTS pg_catalog.gs_client_global_keys_oid_index; -DROP TYPE IF EXISTS pg_catalog.gs_client_global_keys; -DROP TABLE IF EXISTS pg_catalog.gs_client_global_keys; - -DROP INDEX IF EXISTS pg_catalog.gs_encrypted_columns_rel_id_column_name_index; -DROP INDEX IF EXISTS pg_catalog.gs_encrypted_columns_oid_index; -DROP TYPE IF EXISTS pg_catalog.gs_encrypted_columns; -DROP TABLE IF EXISTS pg_catalog.gs_encrypted_columns; - - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_extension where extname = 'packages' limit 1) into ans; - if ans = true then - DROP EXTENSION IF EXISTS packages CASCADE; - CREATE EXTENSION IF NOT EXISTS packages; - ALTER EXTENSION packages UPDATE TO '1.1'; - end if; -END$$; - - -DECLARE -sql text; -BEGIN - if exists(select extname from pg_extension where extname = 'gsredistribute') then - sql := 'DROP EXTENSION IF EXISTS gsredistribute CASCADE;'; - execute sql; - sql := 'CREATE EXTENSION gsredistribute;'; - execute sql; - end if; -END -/ - - -DROP FUNCTION IF EXISTS pg_catalog.delta(NUMERIC) CASCADE; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_extension where extname = 'security_plugin' limit 1) into ans; - if ans = true then - drop extension if exists security_plugin cascade; - create extension security_plugin; - end if; -END$$; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_extension where extname = 'streaming' limit 1) into ans; - if ans = true then - CREATE OR REPLACE FUNCTION pg_catalog.hash_group(VARIADIC "any") - RETURNS integer - AS '$libdir/streaming', 'hash_group' - LANGUAGE C IMMUTABLE NOT FENCED; - - CREATE OR REPLACE FUNCTION pg_catalog.ls_hash_group(VARIADIC "any") - RETURNS bigint - AS '$libdir/streaming', 'ls_hash_group' - LANGUAGE C IMMUTABLE NOT FENCED; - - CREATE OR REPLACE FUNCTION pg_catalog.time_floor(timestamp with time zone, interval) - RETURNS timestamp with time zone - AS '$libdir/streaming', 'timestamp_floor' - LANGUAGE C IMMUTABLE STRICT NOT FENCED; - end if; -END$$; - - -DECLARE -sql text; -BEGIN - if exists(select extname from pg_extension where extname = 'gsredistribute') then - sql := 'DROP EXTENSION IF EXISTS gsredistribute CASCADE;'; - execute sql; - sql := 'CREATE EXTENSION gsredistribute;;'; - execute sql; - end if; -END -/ - --- 1. drop system relations and indexes --- gs_matview --- gs_matview_dependency - -DROP INDEX IF EXISTS pg_catalog.gs_matview_oid_index; -DROP INDEX IF EXISTS pg_catalog.gs_matview_matviewid_index; -DROP TYPE IF EXISTS pg_catalog.gs_matview; -DROP TABLE IF EXISTS pg_catalog.gs_matview; - -DROP INDEX IF EXISTS pg_catalog.gs_matviewdep_oid_index; -DROP INDEX IF EXISTS pg_catalog.gs_matview_dependency_matviewid_index; -DROP INDEX IF EXISTS pg_catalog.gs_matview_dependency_relid_index; -DROP INDEX IF EXISTS pg_catalog.gs_matview_dependency_mlogid_index; -DROP INDEX IF EXISTS pg_catalog.gs_matview_dependency_bothid_index; -DROP TYPE IF EXISTS pg_catalog.gs_matview_dependency; -DROP TABLE IF EXISTS pg_catalog.gs_matview_dependency; - - -DROP FUNCTION IF EXISTS pg_catalog.top_key(name, int8) cascade; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_extension where extname = 'streaming' limit 1) into ans; - if ans = true then - CREATE OR REPLACE FUNCTION pg_catalog.hash_group(VARIADIC "any") - RETURNS integer - AS '$libdir/streaming', 'hash_group' - LANGUAGE C IMMUTABLE NOT FENCED; - - CREATE OR REPLACE FUNCTION pg_catalog.ls_hash_group(VARIADIC "any") - RETURNS bigint - AS '$libdir/streaming', 'ls_hash_group' - LANGUAGE C IMMUTABLE NOT FENCED; - end if; -END$$; - -drop function if exists pg_catalog.report_fatal() cascade; -drop function if exists pg_catalog.signal_backend(bigint, int) cascade; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 2537; -create function pg_catalog.report_fatal() - RETURNS boolean - LANGUAGE internal - STRICT NOT FENCED NOT SHIPPABLE -AS 'report_fatal'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 2539; -create function pg_catalog.signal_backend(bigint, integer) - RETURNS boolean - LANGUAGE internal - STRICT NOT FENCED NOT SHIPPABLE -AS 'signal_backend'; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select relname from pg_class where relname='gs_asp_sampletime_index' limit 1) into ans; - if ans = true then - DROP INDEX IF EXISTS pg_catalog.gs_asp_sampletime_index; - end if; -END$$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_auditing_policy') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_auditing_policy TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_auditing_policy_access') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_auditing_policy_access TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_auditing_policy_filters') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_auditing_policy_filters TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_auditing_policy_privileges') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_auditing_policy_privileges TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_policy_label') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_policy_label TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_masking_policy') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_masking_policy TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_masking_policy_actions') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_masking_policy_actions TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_masking_policy_filters') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_masking_policy_filters TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_labels') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_labels TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_masking') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_masking TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_auditing') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_auditing TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_auditing_access') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_auditing_access TO public; - end if; -END$DO$; - -DO $DO$ - DECLARE - ans boolean; - BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_auditing_privilege') into ans; - if ans = true then - GRANT SELECT ON TABLE pg_catalog.gs_auditing_privilege TO public; - end if; -END$DO$; - -DO $DO$ -DECLARE - user_name text; - query_str text; - ans boolean; -BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_labels') into ans; - if ans = true then - SELECT SESSION_USER INTO user_name; - query_str := 'REVOKE ALL ON TABLE pg_catalog.gs_labels FROM ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - end if; -END$DO$; - -DO $DO$ -DECLARE - user_name text; - query_str text; - ans boolean; -BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_masking') into ans; - if ans = true then - SELECT SESSION_USER INTO user_name; - query_str := 'REVOKE ALL ON TABLE pg_catalog.gs_masking FROM ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - end if; -END$DO$; - -DO $DO$ -DECLARE - user_name text; - query_str text; - ans boolean; -BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_auditing') into ans; - if ans = true then - SELECT SESSION_USER INTO user_name; - query_str := 'REVOKE ALL ON TABLE pg_catalog.gs_auditing FROM ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - end if; -END$DO$; - -DO $DO$ -DECLARE - user_name text; - query_str text; - ans boolean; -BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_auditing_access') into ans; - if ans = true then - SELECT SESSION_USER INTO user_name; - query_str := 'REVOKE ALL ON TABLE pg_catalog.gs_auditing_access FROM ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - end if; -END$DO$; - -DO $DO$ -DECLARE - user_name text; - query_str text; - ans boolean; -BEGIN - select case when count(*)>0 then true else false end as ans from (select relname from pg_class where relname='gs_auditing_privilege') into ans; - if ans = true then - SELECT SESSION_USER INTO user_name; - query_str := 'REVOKE ALL ON TABLE pg_catalog.gs_auditing_privilege FROM ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - end if; -END$DO$; - -drop function if exists pg_catalog.get_large_table_name; - - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS DBE_PERF.get_global_gs_asp() cascade; - end if; -END$$; -DROP INDEX IF EXISTS pg_catalog.gs_asp_sample_time_index; -DROP TYPE IF EXISTS pg_catalog.gs_asp; -DROP TABLE IF EXISTS pg_catalog.gs_asp; - - -CREATE OR REPLACE FUNCTION pg_catalog.proc_add_partition( - IN relationname name, - IN boundaries_interval INTERVAL -) -RETURNS void -AS -$$ -DECLARE - pgclass_rec pg_class%rowtype; - row_name record; - sql text; - part_relname text; - check_count int; - rel_oid int; - job_id int; - time_interval int; - part_boundarie timestamptz; - partition_tmp timestamptz; - username name; - database name; - now_timestamp timestamptz; - namespace name; - table_name name; - pos integer; -BEGIN - /* check tsdb_enable */ - IF check_engine_enable() = false - THEN - RAISE EXCEPTION 'tsdb engine is not exist'; - END IF; - /* check tsdb_enable end */ - - /* skip for cluster unstable */ - IF (SELECT count(*) FROM pg_settings WHERE name='enable_prevent_job_task_startup' AND setting='on') > 0 - THEN - RAISE WARNING 'skip proc_add_partition() when enable_prevent_job_task_startup = on'; - RETURN; - END IF; - IF (SELECT count(*) FROM pg_settings WHERE name='enable_online_ddl_waitlock' AND setting='on') > 0 - THEN - RAISE WARNING 'skip proc_add_partition() when enable_online_ddl_waitlock = on'; - RETURN; - END IF; - /* skip for cluster unstable */ - - /* check parameter */ - IF relationname is null THEN - RAISE EXCEPTION 'parameter ''relationname'' cannot be null'; - END IF; - IF boundaries_interval is null THEN - RAISE EXCEPTION 'parameter ''boundaries_interval'' cannot be null'; - END IF; - IF boundaries_interval < interval '0' THEN - RAISE EXCEPTION 'boundaries_interval must be greater than 0'; - END IF; - pos = is_contain_namespace(relationname); - IF pos != 0 THEN - namespace = substring(relationname from 1 for pos -1); - table_name = substring(relationname from pos+1 for char_length(relationname) - pos); - END IF; - /* check parameter end */ - sql = 'select current_database();'; - EXECUTE sql INTO database; - /* check table exist */ - sql := 'select current_user'; - EXECUTE(sql) into username; - IF pos = 0 THEN - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = ''' || relationname || ''' - AND pg_catalog.pg_table_is_visible(c.oid) ;'; - ELSE - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = ''' || table_name || ''' - AND n.nspname = ''' || namespace || ''';'; - END IF; - EXECUTE sql INTO check_count; - IF check_count = 0 THEN - RAISE EXCEPTION 'please input the correct relation name!'; - END IF; - /* check table exist end */ - - /* check table owner privilege */ - IF pos = 0 THEN - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = ''' || relationname || ''' - AND pg_catalog.pg_table_is_visible(c.oid) and pg_catalog.pg_get_userbyid(c.relowner) = ''' || username || ''';'; - ELSE - sql := 'SELECT count(*) FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = ''' || table_name || ''' - AND n.nspname = ''' || namespace || ''' and pg_catalog.pg_get_userbyid(c.relowner) = ''' || username || ''';'; - END IF; - EXECUTE sql INTO check_count; - IF check_count = 0 THEN - RAISE EXCEPTION 'permission denied for relation %', relationname - USING HINT = 'please assure you have the privilege'; - END IF; - /* check table owner privilege end */ - - /* check partition table */ - IF pos = 0 THEN - sql := 'SELECT c.oid FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = ''' || relationname || ''' - AND pg_catalog.pg_table_is_visible(c.oid) and pg_catalog.pg_get_userbyid(c.relowner) = ''' || username || ''';'; - ELSE - sql := 'SELECT c.oid FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = ''' || table_name || ''' - AND n.nspname = ''' || namespace || ''' and pg_catalog.pg_get_userbyid(c.relowner) = ''' || username || ''';'; - END IF; - EXECUTE sql into rel_oid; - sql := 'SELECT relkind,parttype FROM pg_class WHERE oid = ''' || rel_oid ||''''; - EXECUTE sql into pgclass_rec.relkind, pgclass_rec.parttype; - IF pgclass_rec.relkind != 'r' THEN - RAISE EXCEPTION ' % is not a table !',relationname; - END IF; - IF pgclass_rec.parttype != 'p' THEN - RAISE EXCEPTION ' % does not have partition !',relationname; - END IF; - /* check partition table end */ - - /* iteratively checking time range for every partition*/ - sql := 'SELECT boundaries[1] FROM pg_partition WHERE parentid = ' || rel_oid ||' AND boundaries IS NOT NULL ORDER BY - EXTRACT(epoch FROM CAST(boundaries[1] as timestamptz)) DESC LIMIT 1'; - EXECUTE sql INTO part_boundarie; - - /* reinforce the job failed to throw error when inserting data */ - sql := 'select current_timestamp(0)'; - EXECUTE(sql) into now_timestamp; - WHILE part_boundarie - 20 * boundaries_interval < now_timestamp LOOP - part_boundarie = part_boundarie + boundaries_interval; - sql = 'select proc_add_partition_by_boundary(''' || relationname || ''', ' || '''' || part_boundarie || ''');'; - EXECUTE(sql); - END LOOP; - - part_boundarie := part_boundarie + boundaries_interval; - partition_tmp = date_trunc('second', part_boundarie); - sql :='ALTER TABLE '||relationname||' ADD PARTITION p'||EXTRACT(epoch FROM CAST(partition_tmp AS TIMESTAMPTZ))||' values less than ('''||part_boundarie||''');'; - EXECUTE (sql); - - /* Add regarding dependencies into pg_depend */ - sql := 'SELECT node_name,node_host,node_port FROM pgxc_node where node_type = ''C'' and nodeis_active = ''t'' '; - FOR row_name IN EXECUTE(sql) LOOP - sql := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select c.oid FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace - WHERE c.relname = ''''' || relationname || ''''' AND pg_catalog.pg_table_is_visible(c.oid) and pg_catalog.pg_get_userbyid(c.relowner) = ''''' || username || '''''; '''; - EXECUTE sql INTO rel_oid; - sql := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' SELECT a.job_id from pg_job a , pg_job_proc b where - b.what like ''''%proc_add_partition('''''''''|| relationname ||'''''''''%'''' and a.job_id = b.job_id - and a.priv_user='''''|| username ||''''' and a.dbname='''''|| database ||''''' '''; - EXECUTE sql INTO job_id; - sql := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' SELECT count(*) from pg_depend where classid = 9022 and objid =' || job_id || ''''; - EXECUTE sql INTO check_count; - /* Add regarding dependencies of proc_add_partition job */ - IF check_count = 0 THEN - sql := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' SELECT pg_catalog.add_job_class_depend(' || job_id || ',' || rel_oid || ')'''; - EXECUTE sql INTO job_id; - END IF; - sql := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' SELECT count(*) from pg_job a , pg_job_proc b where - b.what like ''''%proc_drop_partition('''''''''|| relationname ||'''''''''%'''' and a.job_id = b.job_id and a.dbname='''''|| database ||''''' '''; - /* Add regarding dependencies of proc_drop_partition job */ - EXECUTE sql INTO check_count; - IF check_count = 1 THEN - sql := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' SELECT a.job_id from pg_job a , pg_job_proc b where - b.what like ''''%proc_drop_partition('''''''''|| relationname ||'''''''''%'''' and a.job_id = b.job_id and a.dbname='''''|| database ||''''' '''; - EXECUTE sql INTO job_id; - sql := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' SELECT count(*) from pg_depend where classid = 9022 and objid =' || job_id || ''''; - RAISE NOTICE '%',sql; - EXECUTE sql INTO check_count; - IF check_count = 0 THEN - sql := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' SELECT pg_catalog.add_job_class_depend(' || job_id || ',' || rel_oid || ')'''; - EXECUTE sql INTO job_id; - END IF; - END IF; - - RAISE NOTICE 'succeess'; - END LOOP; -END; -$$ -LANGUAGE plpgsql; - -drop function if exists pg_catalog.report_application_error(text, integer) cascade; -CREATE OR REPLACE FUNCTION pg_catalog.raise_application_error(errcode integer, - errmsg text, - flag boolean DEFAULT false) -RETURNS integer -as '$libdir/plpgsql','raise_application_error' -LANGUAGE C STRICT VOLATILE NOT FENCED; - -do $$DECLARE ans boolean; -BEGIN - for ans in select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbms_job' limit 1) - LOOP - if ans = true then - DROP FUNCTION IF EXISTS dbms_job.remove(bigint) cascade; - DROP FUNCTION IF EXISTS dbms_job.change(bigint, text, timestamp, text) cascade; - DROP FUNCTION IF EXISTS dbms_job.what(bigint, text) cascade; - DROP FUNCTION IF EXISTS dbms_job.next_date(bigint, timestamp) cascade; - DROP FUNCTION IF EXISTS dbms_job.interval(bigint, text) cascade; - DROP FUNCTION IF EXISTS dbms_job.broken(bigint, boolean, timestamp) cascade; - DROP FUNCTION IF EXISTS dbms_job.isubmit(bigint, text, timestamp, text) cascade; - DROP FUNCTION IF EXISTS dbms_job.submit(text, timestamp, text, out integer) cascade; - DROP FUNCTION IF EXISTS dbms_job.isubmit_on_nodes(bigint, name, name, text, timestamp without time zone, text) cascade; - DROP FUNCTION IF EXISTS dbms_job.submit_on_nodes(name, name, text, timestamp without time zone, text, OUT integer) cascade; - DROP FUNCTION IF EXISTS dbms_job.isubmit_on_nodes_internal(bigint, name, name, text, timestamp without time zone, text) cascade; - end if; - exit; - END LOOP; -END$$; - -do $$DECLARE ans boolean; -BEGIN - for ans in select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='pkg_service' limit 1) - LOOP - if ans = true then - DROP FUNCTION IF EXISTS pkg_service.job_cancel(bigint) cascade; - DROP FUNCTION IF EXISTS pkg_service.job_finish(bigint, boolean, timestamp) cascade; - DROP FUNCTION IF EXISTS pkg_service.job_submit(bigint, text, timestamp, text) cascade; - DROP FUNCTION IF EXISTS pkg_service.job_update(bigint, timestamp, text, text) cascade; - DROP FUNCTION IF EXISTS pkg_service.isubmit_on_nodes(bigint, name, name, text, timestamp without time zone, text) cascade; - DROP FUNCTION IF EXISTS pkg_service.submit_on_nodes(name, name, text, timestamp without time zone, text, OUT integer) cascade; - DROP FUNCTION IF EXISTS pkg_service.isubmit_on_nodes_internal(bigint, name, name, text, timestamp without time zone, text) cascade; - end if; - exit; - END LOOP; -END$$; -DROP SCHEMA IF EXISTS pkg_service cascade; -DROP SCHEMA IF EXISTS dbms_job cascade; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_NAMESPACE, 3988; -CREATE SCHEMA dbms_job; -COMMENT ON schema dbms_job IS 'dbms_job schema'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 3990; -CREATE OR REPLACE FUNCTION dbms_job.isubmit( - in job bigint, - in what text, - in next_date timestamp without time zone default sysdate, - in interval_time text default 'null' -)RETURNS void LANGUAGE INTERNAL -IMMUTABLE NOT SHIPPABLE -as 'isubmit_job'; - - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5717; -CREATE FUNCTION dbms_job.submit_on_nodes(node_name name, database name, what text, next_date timestamp without time zone, job_interval text, OUT job integer) - RETURNS integer - LANGUAGE internal - NOT FENCED NOT SHIPPABLE -AS 'submit_job_on_nodes'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5718; -CREATE FUNCTION dbms_job.isubmit_on_nodes(job bigint, node_name name, database name, what text, next_date timestamp without time zone, job_interval text) - RETURNS integer - LANGUAGE internal - NOT FENCED NOT SHIPPABLE -AS 'isubmit_job_on_nodes'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 6007; -CREATE FUNCTION dbms_job.isubmit_on_nodes_internal(job bigint, node_name name, database name, what text, next_date timestamp without time zone, job_interval text) - RETURNS integer - LANGUAGE internal - NOT FENCED NOT SHIPPABLE -AS 'isubmit_job_on_nodes_internal'; - - -CREATE OR REPLACE VIEW PG_CATALOG.DUAL AS (SELECT 'X'::TEXT AS DUMMY); -GRANT SELECT ON TABLE DUAL TO PUBLIC; - - -CREATE OR REPLACE VIEW pg_catalog.user_jobs AS - SELECT - j.job_id AS job, - j.log_user AS log_user, - j.priv_user AS priv_user, - j.dbname AS dbname, - j.start_date AS start_date, - substr(to_char(j.start_date,'HH24:MI:SS'),1,8) AS start_suc, - j.last_suc_date AS last_date, - substr(to_char(j.last_suc_date,'HH24:MI:SS'),1,8) AS last_suc, - j.this_run_date AS this_date, - substr(to_char(j.this_run_date,'HH24:MI:SS'),1,8) AS this_suc, - j.next_run_date AS next_date, - substr(to_char(j.next_run_date,'HH24:MI:SS'),1,8) AS next_suc, - CASE - WHEN j.job_status = 's' OR j.job_status = 'r' OR j.job_status = 'f' THEN 'n' - WHEN j.job_status = 'd' THEN 'y' - ELSE '?' - END AS broken, - j.job_status AS status, - j.interval AS interval, - j.failure_count AS failures, - p.what AS what - FROM pg_authid a JOIN pg_job j ON (a.rolname = j.log_user) - LEFT JOIN pg_job_proc p ON (j.job_id = p.job_id) - WHERE a.rolname = current_user; - -GRANT SELECT ON pg_catalog.user_jobs TO public; - -CREATE OR REPLACE VIEW pg_catalog.DBA_PART_TABLES AS - - SELECT - CAST(a.rolname AS VARCHAR2(64)) AS TABLE_OWNER, - ---------------------------------------------------------------------- - CAST(n.nspname AS VARCHAR2(64)) AS SCHEMA, - ---------------------------------------------------------------------- - CAST(c.relname AS varchar2(64)) AS TABLE_NAME , - - ---------------------------------------------------------------------- - CASE - when p.partstrategy = 'r' THEN 'RANGE'::TEXT - WHEN p.partstrategy = 'i' THEN 'INTERVAL'::TEXT - ELSE p.partstrategy - END AS PARTITIONING_TYPE, - ---------------------------------------------------------------------- - - (SELECT count(*) FROM pg_partition ps WHERE ps.parentid = c.oid AND ps.parttype = 'p') AS PARTITION_COUNT, - - ---------------------------------------------------------------------- - CASE - WHEN c.reltablespace = 0 THEN ('DEFAULT TABLESPACE'::TEXT)::NAME - ELSE - (SELECT spc.spcname FROM pg_tablespace spc WHERE c.reltablespace = spc.oid) - END - AS DEF_TABLESPACE_NAME, - - ---------------------------------------------------------------------- - array_length(p.partkey,1)as PARTITIONING_KEY_COUNT - FROM - PG_CLASS c , PG_PARTITION p , pg_authid a , pg_namespace n - WHERE - c.parttype = 'p' AND -- it is a partitioned table in pg_class - c.relkind = 'r' AND -- normal table ,it can be ignore, all partitioned table is normal table - c.oid = p.parentid AND -- join condition - p.parttype = 'r' AND -- it is a partitioned table in pg_partition - c.relowner = a.oid AND -- the owner of table - c.relnamespace = n.oid -- namespace - ORDER BY TABLE_OWNER,SCHEMA,PARTITIONING_TYPE, PARTITION_COUNT,DEF_TABLESPACE_NAME , PARTITIONING_KEY_COUNT; - -CREATE OR REPLACE VIEW pg_catalog.USER_PART_TABLES AS - SELECT - * - FROM DBA_PART_TABLES - WHERE TABLE_OWNER = CURRENT_USER; - -CREATE OR REPLACE VIEW pg_catalog.DBA_TAB_PARTITIONS AS - SELECT - CAST(a.rolname AS VARCHAR2(64)) AS TABLE_OWNER, - ---------------------------------------------------------------------- - CAST(n.nspname AS VARCHAR2(64)) AS SCHEMA, - ---------------------------------------------------------------------- - CAST(c.relname AS varchar2(64)) AS TABLE_NAME, - ---------------------------------------------------------------------- - CAST(p.relname AS varchar2(64)) AS PARTITION_NAME, - ---------------------------------------------------------------------- - array_to_string(p.BOUNDARIES, ',' , 'MAXVALUE') AS HIGH_VALUE, - ---------------------------------------------------------------------- - CASE - WHEN p.reltablespace = 0 THEN ('DEFAULT TABLESPACE'::TEXT)::NAME - ELSE (SELECT spc.spcname FROM pg_tablespace spc WHERE p.reltablespace = spc.oid) - END - AS TABLESPACE_NAME - ---------------------------------------------------------------------- - FROM - pg_class c , pg_partition p , pg_authid a, pg_namespace n - ---------------------------------------------------------------------- - WHERE - p.parentid = c.oid AND - ---------------------------------------------------------------------- - p.parttype = 'p' AND - c.relowner = a.oid AND - c.relnamespace = n.oid - - ---------------------------------------------------------------------- - ORDER BY TABLE_OWNER,SCHEMA,TABLE_NAME, PARTITION_NAME, HIGH_VALUE, TABLESPACE_NAME; - -CREATE OR REPLACE VIEW pg_catalog.USER_TAB_PARTITIONS AS - SELECT - * - FROM DBA_TAB_PARTITIONS - WHERE TABLE_OWNER = CURRENT_USER; - -CREATE OR REPLACE VIEW pg_catalog.DBA_PART_INDEXES AS - SELECT - CAST(a.rolname AS VARCHAR2(64)) AS INDEX_OWNER, - ---------------------------------------------------------------------- - CAST(n.nspname AS VARCHAR2(64)) AS SCHEMA, - ---------------------------------------------------------------------- - CAST(ci.relname AS varchar2(64)) AS INDEX_NAME , - ---------------------------------------------------------------------- - CAST(ct.relname AS varchar2(64)) AS TABLE_NAME , - ---------------------------------------------------------------------- - CASE - WHEN p.partstrategy = 'r' THEN 'RANGE'::TEXT - WHEN p.partstrategy = 'i' THEN 'INTERVAL'::TEXT - ELSE p.partstrategy - END AS PARTITIONING_TYPE , - ---------------------------------------------------------------------- - (SELECT count(*) FROM pg_partition ps WHERE ps.parentid = ct.oid AND ps.parttype = 'p') - AS PARTITION_COUNT , - ---------------------------------------------------------------------- - CASE - WHEN ci.reltablespace = 0 THEN ('DEFAULT TABLESPACE'::TEXT)::NAME - ELSE - (SELECT spc.spcname FROM pg_tablespace spc WHERE ci.reltablespace = spc.oid) - END - AS DEF_TABLESPACE_NAME, - ---------------------------------------------------------------------- - array_length(p.partkey,1)as PARTITIONING_KEY_COUNT - FROM - pg_class ct , --table - pg_class ci, --index - pg_index i, -- i.INDEXRELID is index i.INDRELID is table - pg_partition p, -- partition attribute of table - pg_authid a, - pg_namespace n - WHERE - ci.parttype = 'p' AND - ci.relkind = 'i' AND --find all the local partitioned index - - ci.oid = i.INDEXRELID AND --find table be indexed - ct.oid = i.INDRELID AND - - ct.oid = p.parentid AND -- find the attribute of partitioned table - p.parttype = 'r' AND - - ci.relowner = a.oid AND - ci.relnamespace = n.oid - ORDER BY TABLE_NAME ,SCHEMA, INDEX_NAME, DEF_TABLESPACE_NAME,INDEX_OWNER; - -CREATE OR REPLACE VIEW pg_catalog.USER_PART_INDEXES AS - SELECT - * - FROM DBA_PART_INDEXES - WHERE INDEX_OWNER = CURRENT_USER; - -CREATE OR REPLACE VIEW pg_catalog.DBA_IND_PARTITIONS AS - SELECT - CAST(a.rolname AS VARCHAR2(64)) AS INDEX_OWNER, - ---------------------------------------------------------------------- - CAST(n.nspname AS VARCHAR2(64)) AS SCHEMA, - ---------------------------------------------------------------------- - CAST(ci.relname AS varchar2(64)) AS INDEX_NAME, - ---------------------------------------------------------------------- - CAST(pi.relname AS varchar2(64)) AS PARTITION_NAME, - ---------------------------------------------------------------------- - pi.indisusable AS INDEX_PARTITION_USABLE, - ---------------------------------------------------------------------- - array_to_string(pt.BOUNDARIES, ',' , 'MAXVALUE') AS HIGH_VALUE, - ---------------------------------------------------------------------- - CASE - WHEN pi.reltablespace = 0 THEN ('DEFAULT TABLESPACE'::TEXT)::NAME - ELSE - (SELECT spc.spcname FROM pg_tablespace spc WHERE pi.reltablespace = spc.oid) - END - AS DEF_TABLESPACE_NAME - ---------------------------------------------------------------------- - FROM - pg_class ci , --the local partitioned index - pg_partition pi,-- the partition index - pg_partition pt,-- the partition indexed by partition index - pg_authid a, - pg_namespace n - - WHERE - ci.parttype = 'p' AND -- the partitioned relation - ci.relkind = 'i' AND -- choose index of partitioned relation - ci.oid = pi.parentid AND --the index partitons - pi.indextblid = pt.oid AND-- partition indexed by partition index - ci.relowner = a.oid AND - ci.relnamespace = n.oid - ORDER BY INDEX_OWNER,SCHEMA,INDEX_NAME, PARTITION_NAME, HIGH_VALUE, DEF_TABLESPACE_NAME; - -CREATE OR REPLACE VIEW pg_catalog.USER_IND_PARTITIONS AS - SELECT - * - FROM DBA_IND_PARTITIONS - WHERE INDEX_OWNER = CURRENT_USER; - -DROP VIEW IF EXISTS PG_CATALOG.SYS_DUMMY CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_PART_TABLES CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_PART_TABLES CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_TAB_PARTITIONS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_TAB_PARTITIONS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_PART_INDEXES CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_PART_INDEXES CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_IND_PARTITIONS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_IND_PARTITIONS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_JOBS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_OBJECTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_OBJECTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_PROCEDURES CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_TABLES CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_TABLES CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_TABLES CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_TAB_COLUMNS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_TAB_COLUMNS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_VIEWS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_VIEWS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_VIEWS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_TRIGGERS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_TRIGGERS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_TAB_COLUMNS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_SOURCE CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_SOURCE CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_DEPENDENCIES CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_SOURCE CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_SEQUENCES CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_SEQUENCES CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_SEQUENCES CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_PROCEDURES CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_INDEXES CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_INDEXES CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_USERS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_USERS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_DATA_FILES CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_TABLESPACES CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_OBJECTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_IND_COLUMNS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_IND_COLUMNS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_IND_COLUMNS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_IND_EXPRESSIONS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_IND_EXPRESSIONS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_IND_EXPRESSIONS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_CONSTRAINTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_CONSTRAINTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_CONSTRAINTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_CONS_COLUMNS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_CONS_COLUMNS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_CONS_COLUMNS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_TAB_COMMENTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_TAB_COMMENTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_TAB_COMMENTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DV_SESSIONS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DV_SESSION_LONGOPS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_COL_COMMENTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_COL_COMMENTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_COL_COMMENTS CASCADE; -DROP VIEW IF EXISTS pg_catalog.ADM_SYNONYMS CASCADE; -DROP VIEW IF EXISTS pg_catalog.MY_SYNONYMS CASCADE; -DROP VIEW IF EXISTS pg_catalog.DB_SYNONYMS CASCADE; - ---because tsdb functions use job views and job system function, so we should reload the extension -DROP FUNCTION IF EXISTS pg_catalog.proc_add_depend(int, name, name,text) cascade; -DROP FUNCTION IF EXISTS pg_catalog.proc_add_depend(name, name, text) cascade; -DROP FUNCTION IF EXISTS pg_catalog.proc_add_depend(name, name) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.pg_lock_status() CASCADE; -SET LOCAL inplace_upgrade_next_system_object_oids=IUO_PROC, 1371; -CREATE FUNCTION pg_catalog.pg_lock_status -( -OUT locktype pg_catalog.text, -OUT database pg_catalog.oid, -OUT relation pg_catalog.oid, -OUT page pg_catalog.int4, -OUT tuple pg_catalog.int2, -OUT virtualxid pg_catalog.text, -OUT transactionid pg_catalog.xid, -OUT classid pg_catalog.oid, -OUT objid pg_catalog.oid, -OUT objsubid pg_catalog.int2, -OUT virtualtransaction pg_catalog.text, -OUT pid pg_catalog.int8, -OUT sessionid pg_catalog.int8, -OUT mode pg_catalog.text, -OUT granted pg_catalog.bool, -OUT fastpath pg_catalog.bool) -RETURNS SETOF record LANGUAGE INTERNAL ROWS 1000 VOLATILE STRICT as 'pg_lock_status'; - -DROP VIEW IF EXISTS pg_catalog.pg_locks CASCADE; -CREATE OR REPLACE VIEW pg_catalog.pg_locks AS - SELECT DISTINCT * from pg_lock_status(); - -DROP FUNCTION IF EXISTS dbms_job.isubmit_on_nodes_interval(bigint, name, name, text, timestamp without time zone, text) cascade; - -DROP FUNCTION IF EXISTS pg_catalog.proc_add_depend(name, name); - - --- 1. drop streaming_stream and its indexes -DROP INDEX IF EXISTS pg_catalog.streaming_stream_oid_index; -DROP INDEX IF EXISTS pg_catalog.streaming_stream_relid_index; -DROP TYPE IF EXISTS pg_catalog.streaming_stream; -DROP TABLE IF EXISTS pg_catalog.streaming_stream; - --- 2. drop streaming_cont_query and its indexes -DROP INDEX IF EXISTS pg_catalog.streaming_cont_query_relid_index; -DROP INDEX IF EXISTS pg_catalog.streaming_cont_query_defrelid_index; -DROP INDEX IF EXISTS pg_catalog.streaming_cont_query_id_index; -DROP INDEX IF EXISTS pg_catalog.streaming_cont_query_oid_index; -DROP INDEX IF EXISTS pg_catalog.streaming_cont_query_matrelid_index; -DROP INDEX IF EXISTS pg_catalog.streaming_cont_query_lookupidxid_index; -DROP TYPE IF EXISTS pg_catalog.streaming_cont_query; -DROP TABLE IF EXISTS pg_catalog.streaming_cont_query; - -DROP VIEW IF EXISTS pg_catalog.gs_masking; - -DROP INDEX IF EXISTS pg_catalog.gs_masking_policy_filters_row_index; -DROP INDEX IF EXISTS pg_catalog.gs_masking_policy_filters_oid_index; - -DROP INDEX IF EXISTS pg_catalog.gs_masking_policy_actions_policy_oid_index; -DROP INDEX IF EXISTS pg_catalog.gs_masking_policy_actions_row_index; -DROP INDEX IF EXISTS pg_catalog.gs_masking_policy_actions_oid_index; - -DROP INDEX IF EXISTS pg_catalog.gs_masking_policy_name_index; -DROP INDEX IF EXISTS pg_catalog.gs_masking_policy_oid_index; - -DROP TYPE IF EXISTS pg_catalog.gs_masking_policy_filters; -DROP TABLE IF EXISTS pg_catalog.gs_masking_policy_filters; - -DROP TYPE IF EXISTS pg_catalog.gs_masking_policy_actions; -DROP TABLE IF EXISTS pg_catalog.gs_masking_policy_actions; - -DROP TYPE IF EXISTS pg_catalog.gs_masking_policy; -DROP TABLE IF EXISTS pg_catalog.gs_masking_policy; -DROP FUNCTION IF EXISTS dbms_job.isubmit_on_nodes(bigint, name, name, text, timestamp without time zone, text) cascade; -DROP FUNCTION IF EXISTS dbms_job.submit_on_nodes(name, name, text, timestamp without time zone, text, OUT integer) cascade; -DROP FUNCTION IF EXISTS pg_catalog.capture_view_to_json(text, integer) cascade; - --- 1. drop new system view gs_auditing(_xxx) -DROP VIEW IF EXISTS pg_catalog.gs_auditing_access CASCADE; -DROP VIEW IF EXISTS pg_catalog.gs_auditing_privilege CASCADE; -DROP VIEW IF EXISTS pg_catalog.gs_auditing CASCADE; - --- 2. drop system table and its index. -DROP INDEX IF EXISTS pg_catalog.gs_auditing_policy_name_index; -DROP INDEX IF EXISTS pg_catalog.gs_auditing_policy_oid_index; -DROP TYPE IF EXISTS pg_catalog.gs_auditing_policy; -DROP TABLE IF EXISTS pg_catalog.gs_auditing_policy; -DROP INDEX IF EXISTS pg_catalog.gs_auditing_policy_access_oid_index; -DROP INDEX IF EXISTS pg_catalog.gs_auditing_policy_access_row_index; -DROP TYPE IF EXISTS pg_catalog.gs_auditing_policy_access; -DROP TABLE IF EXISTS pg_catalog.gs_auditing_policy_access; -DROP INDEX IF EXISTS pg_catalog.gs_auditing_policy_filters_oid_index; -DROP INDEX IF EXISTS pg_catalog.gs_auditing_policy_filters_row_index; -DROP TYPE IF EXISTS pg_catalog.gs_auditing_policy_filters; -DROP TABLE IF EXISTS pg_catalog.gs_auditing_policy_filters; -DROP INDEX IF EXISTS pg_catalog.gs_auditing_policy_privileges_oid_index; -DROP INDEX IF EXISTS pg_catalog.gs_auditing_policy_privileges_row_index; -DROP TYPE IF EXISTS pg_catalog.gs_auditing_policy_privileges; -DROP TABLE IF EXISTS pg_catalog.gs_auditing_policy_privileges; - -DROP FUNCTION IF EXISTS pg_catalog.get_local_active_session() cascade; - -DROP INDEX IF EXISTS pg_catalog.pg_asp_oid_index; -DROP TYPE IF EXISTS pg_catalog.pg_asp; -DROP TABLE IF EXISTS pg_catalog.pg_asp; - -DROP FUNCTION IF EXISTS pg_catalog.get_wait_event_info() cascade; - -DROP VIEW IF EXISTS pg_catalog.pgxc_wlm_session_history CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.pgxc_get_wlm_session_history() CASCADE; -DROP VIEW IF EXISTS pg_catalog.gs_wlm_session_history CASCADE; - -DROP VIEW IF EXISTS pg_catalog.pgxc_wlm_session_info CASCADE; -DROP VIEW IF EXISTS pg_catalog.gs_wlm_session_info_all CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.pgxc_get_wlm_session_info() CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.pgxc_get_wlm_session_info_bytime(text, timestamp without time zone, timestamp without time zone, integer) CASCADE; - -DROP TABLE IF EXISTS pg_catalog.gs_wlm_session_query_info_all CASCADE; - -DO $$ -BEGIN - IF EXISTS( - SELECT tablename FROM pg_tables where tablename='gs_wlm_session_info') - THEN - DROP TABLE IF EXISTS pg_catalog.gs_wlm_session_info CASCADE; - END IF; -END $$; - -DO $$ -BEGIN - IF EXISTS( - SELECT viewname FROM pg_views where viewname='gs_wlm_session_info') - THEN - DROP VIEW IF EXISTS pg_catalog.gs_wlm_session_info CASCADE; - END IF; -END $$; - -DROP FUNCTION IF EXISTS pg_catalog.create_wlm_session_info(IN flag int) CASCADE; -DROP FUNCTION IF EXISTS pg_catalog.pg_stat_get_wlm_session_info(OID) cascade; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5002; -CREATE OR REPLACE FUNCTION pg_catalog.pg_stat_get_wlm_session_info -(OID, - OUT datid oid, - OUT dbname text, - OUT schemaname text, - OUT nodename text, - OUT username text, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_band text, - OUT block_time bigint, - OUT start_time timestamp with time zone, - OUT finish_time timestamp with time zone, - OUT duration bigint, - OUT estimate_total_time bigint, - OUT status text, - OUT abort_info text, - OUT resource_pool text, - OUT control_group text, - OUT estimate_memory integer, - OUT min_peak_memory integer, - OUT max_peak_memory integer, - OUT average_peak_memory integer, - OUT memory_skew_percent integer, - OUT spill_info text, - OUT min_spill_size integer, - OUT max_spill_size integer, - OUT average_spill_size integer, - OUT spill_skew_percent integer, - OUT min_dn_time bigint, - OUT max_dn_time bigint, - OUT average_dn_time bigint, - OUT dntime_skew_percent integer, - OUT min_cpu_time bigint, - OUT max_cpu_time bigint, - OUT total_cpu_time bigint, - OUT cpu_skew_percent integer, - OUT min_peak_iops integer, - OUT max_peak_iops integer, - OUT average_peak_iops integer, - OUT iops_skew_percent integer, - OUT warning text, - OUT queryid bigint, - OUT query text, - OUT query_plan text, - OUT node_group text, - OUT cpu_top1_node_name text, - OUT cpu_top2_node_name text, - OUT cpu_top3_node_name text, - OUT cpu_top4_node_name text, - OUT cpu_top5_node_name text, - OUT mem_top1_node_name text, - OUT mem_top2_node_name text, - OUT mem_top3_node_name text, - OUT mem_top4_node_name text, - OUT mem_top5_node_name text, - OUT cpu_top1_value bigint, - OUT cpu_top2_value bigint, - OUT cpu_top3_value bigint, - OUT cpu_top4_value bigint, - OUT cpu_top5_value bigint, - OUT mem_top1_value bigint, - OUT mem_top2_value bigint, - OUT mem_top3_value bigint, - OUT mem_top4_value bigint, - OUT mem_top5_value bigint, - OUT top_mem_dn text, - OUT top_cpu_dn text) RETURNS setof record LANGUAGE INTERNAL VOLATILE NOT FENCED as 'pg_stat_get_wlm_session_info'; - - create table pg_catalog.gs_wlm_session_info -( - datid Oid, - dbname text, - schemaname text, - nodename text, - username text, - application_name text, - client_addr inet, - client_hostname text, - client_port int, - query_band text, - block_time bigint, - start_time timestamp with time zone, - finish_time timestamp with time zone, - duration bigint, - estimate_total_time bigint, - status text, - abort_info text, - resource_pool text, - control_group text, - estimate_memory int, - min_peak_memory int, - max_peak_memory int, - average_peak_memory int, - memory_skew_percent int, - spill_info text, - min_spill_size int, - max_spill_size int, - average_spill_size int, - spill_skew_percent int, - min_dn_time bigint, - max_dn_time bigint, - average_dn_time bigint, - dntime_skew_percent int, - min_cpu_time bigint, - max_cpu_time bigint, - total_cpu_time bigint, - cpu_skew_percent int, - min_peak_iops int, - max_peak_iops int, - average_peak_iops int, - iops_skew_percent int, - warning text, - queryid bigint NOT NULL, - query text, - query_plan text, - node_group text, - cpu_top1_node_name text, - cpu_top2_node_name text, - cpu_top3_node_name text, - cpu_top4_node_name text, - cpu_top5_node_name text, - mem_top1_node_name text, - mem_top2_node_name text, - mem_top3_node_name text, - mem_top4_node_name text, - mem_top5_node_name text, - cpu_top1_value bigint, - cpu_top2_value bigint, - cpu_top3_value bigint, - cpu_top4_value bigint, - cpu_top5_value bigint, - mem_top1_value bigint, - mem_top2_value bigint, - mem_top3_value bigint, - mem_top4_value bigint, - mem_top5_value bigint, - top_mem_dn text, - top_cpu_dn text -); - -CREATE VIEW pg_catalog.gs_wlm_session_info_all AS -SELECT * FROM pg_catalog.pg_stat_get_wlm_session_info(0); - -CREATE VIEW pg_catalog.gs_wlm_session_history AS -SELECT - S.datid, - S.dbname, - S.schemaname, - S.nodename, - S.username, - S.application_name, - S.client_addr, - S.client_hostname, - S.client_port, - S.query_band, - S.block_time, - S.start_time, - S.finish_time, - S.duration, - S.estimate_total_time, - S.status, - S.abort_info, - S.resource_pool, - S.control_group, - S.estimate_memory, - S.min_peak_memory, - S.max_peak_memory, - S.average_peak_memory, - S.memory_skew_percent, - S.spill_info, - S.min_spill_size, - S.max_spill_size, - S.average_spill_size, - S.spill_skew_percent, - S.min_dn_time, - S.max_dn_time, - S.average_dn_time, - S.dntime_skew_percent, - S.min_cpu_time, - S.max_cpu_time, - S.total_cpu_time, - S.cpu_skew_percent, - S.min_peak_iops, - S.max_peak_iops, - S.average_peak_iops, - S.iops_skew_percent, - S.warning, - S.queryid, - S.query, - S.query_plan, - S.node_group, - S.cpu_top1_node_name, - S.cpu_top2_node_name, - S.cpu_top3_node_name, - S.cpu_top4_node_name, - S.cpu_top5_node_name, - S.mem_top1_node_name, - S.mem_top2_node_name, - S.mem_top3_node_name, - S.mem_top4_node_name, - S.mem_top5_node_name, - S.cpu_top1_value, - S.cpu_top2_value, - S.cpu_top3_value, - S.cpu_top4_value, - S.cpu_top5_value, - S.mem_top1_value, - S.mem_top2_value, - S.mem_top3_value, - S.mem_top4_value, - S.mem_top5_value, - S.top_mem_dn, - S.top_cpu_dn -FROM pg_catalog.gs_wlm_session_info_all S; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_history() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_catalog.gs_wlm_session_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_info() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_catalog.gs_wlm_session_info'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_info_bytime(text, TIMESTAMP, TIMESTAMP, int) -RETURNS setof pg_catalog.gs_wlm_session_info -AS $$ -DECLARE - row_data gs_wlm_session_info%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_cn text; - BEGIN - IF $1 IN ('start_time', 'finish_time') THEN - - ELSE - raise WARNING 'Illegal character entered for function, colname must be start_time or finish_time'; - return; - END IF; - - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - query_str_cn := 'SELECT * FROM pg_catalog.gs_wlm_session_info where '||$1||'>'''''||$2||''''' and '||$1||'<'''''||$3||''''' limit '||$4; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_cn||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE VIEW pg_catalog.pgxc_wlm_session_history AS -SELECT * FROM pg_catalog.pgxc_get_wlm_session_history() AS -( -datid Oid, -dbname text, -schemaname text, -nodename text, -username text, -application_name text, -client_addr inet, -client_hostname text, -client_port int, -query_band text, -block_time bigint, -start_time timestamp with time zone, -finish_time timestamp with time zone, -duration bigint, -estimate_total_time bigint, -status text, -abort_info text, -resource_pool text, -control_group text, -estimate_memory int, -min_peak_memory int, -max_peak_memory int, -average_peak_memory int, -memory_skew_percent int, -spill_info text, -min_spill_size int, -max_spill_size int, -average_spill_size int, -spill_skew_percent int, -min_dn_time bigint, -max_dn_time bigint, -average_dn_time bigint, -dntime_skew_percent int, -min_cpu_time bigint, -max_cpu_time bigint, -total_cpu_time bigint, -cpu_skew_percent int, -min_peak_iops int, -max_peak_iops int, -average_peak_iops int, -iops_skew_percent int, -warning text, -queryid bigint, -query text, -query_plan text, -node_group text, -cpu_top1_node_name text, -cpu_top2_node_name text, -cpu_top3_node_name text, -cpu_top4_node_name text, -cpu_top5_node_name text, -mem_top1_node_name text, -mem_top2_node_name text, -mem_top3_node_name text, -mem_top4_node_name text, -mem_top5_node_name text, -cpu_top1_value bigint, -cpu_top2_value bigint, -cpu_top3_value bigint, -cpu_top4_value bigint, -cpu_top5_value bigint, -mem_top1_value bigint, -mem_top2_value bigint, -mem_top3_value bigint, -mem_top4_value bigint, -mem_top5_value bigint, -top_mem_dn text, -top_cpu_dn text -); - -CREATE VIEW pg_catalog.pgxc_wlm_session_info AS -SELECT * FROM pg_catalog.pgxc_get_wlm_session_info() AS -( - datid Oid, - dbname text, - schemaname text, - nodename text, - username text, - application_name text, - client_addr inet, - client_hostname text, - client_port int, - query_band text, - block_time bigint, - start_time timestamp with time zone, - finish_time timestamp with time zone, - duration bigint, - estimate_total_time bigint, - status text, - abort_info text, - resource_pool text, - control_group text, - estimate_memory int, - min_peak_memory int, - max_peak_memory int, - average_peak_memory int, - memory_skew_percent int, - spill_info text, - min_spill_size int, - max_spill_size int, - average_spill_size int, - spill_skew_percent int, - min_dn_time bigint, - max_dn_time bigint, - average_dn_time bigint, - dntime_skew_percent int, - min_cpu_time bigint, - max_cpu_time bigint, - total_cpu_time bigint, - cpu_skew_percent int, - min_peak_iops int, - max_peak_iops int, - average_peak_iops int, - iops_skew_percent int, - warning text, - queryid bigint, - query text, - query_plan text, - node_group text, - cpu_top1_node_name text, - cpu_top2_node_name text, - cpu_top3_node_name text, - cpu_top4_node_name text, - cpu_top5_node_name text, - mem_top1_node_name text, - mem_top2_node_name text, - mem_top3_node_name text, - mem_top4_node_name text, - mem_top5_node_name text, - cpu_top1_value bigint, - cpu_top2_value bigint, - cpu_top3_value bigint, - cpu_top4_value bigint, - cpu_top5_value bigint, - mem_top1_value bigint, - mem_top2_value bigint, - mem_top3_value bigint, - mem_top4_value bigint, - mem_top5_value bigint, - top_mem_dn text, - top_cpu_dn text -); - - -CREATE OR REPLACE FUNCTION pg_catalog.create_wlm_session_info(IN flag int) -RETURNS int -AS $$ -DECLARE - query_str text; - record_cnt int; - BEGIN - record_cnt := 0; - - query_str := 'SELECT * FROM pg_catalog.pg_stat_get_wlm_session_info(1)'; - - IF flag > 0 THEN - EXECUTE 'INSERT INTO pg_catalog.gs_wlm_session_info ' || query_str; - ELSE - EXECUTE query_str; - END IF; - - RETURN record_cnt; - END; $$ -LANGUAGE plpgsql NOT FENCED; - - -GRANT SELECT ON TABLE pg_catalog.gs_wlm_session_history TO PUBLIC; -GRANT SELECT ON TABLE pg_catalog.gs_wlm_session_info TO PUBLIC; -GRANT SELECT ON TABLE pg_catalog.gs_wlm_session_info_all TO PUBLIC; -GRANT SELECT ON TABLE pg_catalog.pgxc_wlm_session_history TO PUBLIC; -GRANT SELECT ON TABLE pg_catalog.pgxc_wlm_session_info TO PUBLIC; - -DROP FUNCTION IF EXISTS pg_catalog.gs_stat_activity_timeout(IN timeout_threshold int4, OUT datid oid, OUT pid INT8, OUT sessionid INT8, OUT usesysid oid, OUT application_name text, OUT query text, OUT xact_start timestamptz, OUT query_start timestamptz, OUT query_id INT8) CASCADE; - -DROP FUNCTION IF EXISTS pg_catalog.global_stat_activity_timeout(in execute_time int4, out nodename text, out datid oid, out pid int8, out sessionid int8, out usesysid oid, out application_name text, out query text, out xact_start timestamptz, out query_start timestamptz, out query_id int8) CASCADE; - -DROP FUNCTION IF EXISTS pg_catalog.series(name); - -DROP FUNCTION IF EXISTS pg_catalog.labels(name); - -DROP FUNCTION IF EXISTS pg_catalog.labels_count(name); - - -drop aggregate if exists pg_catalog.spread(real); - -drop function if exists pg_catalog.spread_collect(real[], real[]); - -drop function if exists pg_catalog.spread_final(real[]); - -drop function if exists pg_catalog.spread_internal(real[], real); - -drop aggregate if exists pg_catalog.delta(anyelement); - -drop function if exists pg_catalog.delta_final(anyarray); - -drop function if exists pg_catalog.delta_internal(anyarray, anyelement); - - -DROP VIEW IF EXISTS pg_catalog.pg_roles_v1 cascade; - -DROP VIEW IF EXISTS pg_catalog.pg_roles cascade; -CREATE OR REPLACE VIEW pg_catalog.pg_roles AS - SELECT - rolname, - rolsuper, - rolinherit, - rolcreaterole, - rolcreatedb, - rolcatupdate, - rolcanlogin, - rolreplication, - rolauditadmin, - rolsystemadmin, - rolconnlimit, - '********'::text as rolpassword, - rolvalidbegin, - rolvaliduntil, - rolrespool, - rolparentid, - roltabspace, - setconfig as rolconfig, - pg_authid.oid, - roluseft, - rolkind, - pgxc_group.group_name as nodegroup, - roltempspace, - rolspillspace - FROM pg_authid LEFT JOIN pg_db_role_setting s - ON (pg_authid.oid = setrole AND setdatabase = 0) - LEFT JOIN pgxc_group - ON (pg_authid.rolnodegroup = pgxc_group.oid); - -GRANT SELECT ON TABLE pg_catalog.pg_roles TO PUBLIC; - -DROP VIEW IF EXISTS pg_catalog.pg_user_v1 cascade; - -DROP VIEW IF EXISTS pg_catalog.pg_user cascade; -CREATE OR REPLACE VIEW pg_catalog.pg_user AS - SELECT - rolname AS usename, - pg_authid.oid AS usesysid, - rolcreatedb AS usecreatedb, - rolsuper AS usesuper, - rolcatupdate AS usecatupd, - rolreplication AS userepl, - '********'::text AS passwd, - rolvalidbegin AS valbegin, - rolvaliduntil AS valuntil, - rolrespool AS respool, - rolparentid AS parent, - roltabspace AS spacelimit, - setconfig AS useconfig, - pgxc_group.group_name AS nodegroup, - roltempspace AS tempspacelimit, - rolspillspace AS spillspacelimit - FROM pg_authid LEFT JOIN pg_db_role_setting s - ON (pg_authid.oid = setrole AND setdatabase = 0) - LEFT JOIN pgxc_group - ON (pg_authid.rolnodegroup = pgxc_group.oid) - WHERE rolcanlogin; - -GRANT SELECT ON TABLE pg_catalog.pg_user TO PUBLIC; - -DROP VIEW IF EXISTS pg_catalog.pg_shadow_v1 cascade; - -DROP VIEW IF EXISTS pg_catalog.pg_shadow cascade; -CREATE OR REPLACE VIEW pg_catalog.pg_shadow AS - SELECT - rolname AS usename, - pg_authid.oid AS usesysid, - rolcreatedb AS usecreatedb, - rolsuper AS usesuper, - rolcatupdate AS usecatupd, - rolreplication AS userepl, - rolpassword AS passwd, - rolvalidbegin AS valbegin, - rolvaliduntil AS valuntil, - rolrespool AS respool, - rolparentid AS parent, - roltabspace AS spacelimit, - setconfig AS useconfig, - roltempspace AS tempspacelimit, - rolspillspace AS spillspacelimit - FROM pg_authid LEFT JOIN pg_db_role_setting s - ON (pg_authid.oid = setrole AND setdatabase = 0) - WHERE rolcanlogin; - -DECLARE - user_name text; - query_str text; -BEGIN - SELECT SESSION_USER INTO user_name; - query_str := 'GRANT ALL ON TABLE pg_catalog.pg_shadow TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; -END; -/ - -DROP VIEW IF EXISTS pg_catalog.pg_rlspolicies_v1 cascade; - -DROP VIEW IF EXISTS pg_catalog.pg_rlspolicies cascade; -CREATE OR REPLACE VIEW pg_catalog.pg_rlspolicies AS - SELECT - N.nspname AS schemaname, - C.relname AS tablename, - pol.polname AS policyname, - CASE - WHEN pol.polpermissive THEN - 'PERMISSIVE' - ELSE - 'RESTRICTIVE' - END AS policypermissive, - CASE - WHEN pol.polroles = '{0}' THEN - string_to_array('public', ' ') - ELSE - ARRAY - ( - SELECT rolname - FROM pg_catalog.pg_roles - WHERE oid = ANY (pol.polroles) ORDER BY 1 - ) - END AS policyroles, - CASE pol.polcmd - WHEN 'r' THEN 'SELECT' - WHEN 'a' THEN 'INSERT' - WHEN 'w' THEN 'UPDATE' - WHEN 'd' THEN 'DELETE' - WHEN '*' THEN 'ALL' - END AS policycmd, - pg_catalog.pg_get_expr(pol.polqual, pol.polrelid) AS policyqual - FROM pg_catalog.pg_rlspolicy pol - JOIN pg_catalog.pg_class C ON (C.oid = pol.polrelid) - LEFT JOIN pg_catalog.pg_namespace N ON (N.oid = C.relnamespace); - -GRANT SELECT ON TABLE pg_catalog.pg_rlspolicies TO PUBLIC; - -DROP VIEW IF EXISTS pg_catalog.gs_wlm_user_info cascade; -CREATE OR REPLACE VIEW pg_catalog.gs_wlm_user_info AS -SELECT - T.userid, - S.rolname AS username, - T.sysadmin, - T.rpoid, - R.respool_name AS respool, - T.parentid, - T.totalspace, - T.spacelimit, - T.childcount, - T.childlist -FROM pg_roles AS S, gs_wlm_get_user_info(NULL) AS T, pg_resource_pool AS R -WHERE S.oid = T.userid AND T.rpoid = R.oid; - -GRANT SELECT ON TABLE pg_catalog.gs_wlm_user_info TO PUBLIC; - -DROP FUNCTION IF EXISTS pg_catalog.gs_wlm_user_resource_info(CSTRING); -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC,5012; -CREATE FUNCTION pg_catalog.gs_wlm_user_resource_info(cstring, OUT userid oid, OUT used_memory int4, OUT total_memory int4, OUT used_cpu float, OUT total_cpu int4, OUT used_space int8, OUT total_space int8, OUT used_temp_space int8, OUT total_temp_space int8, OUT used_spill_space int8, OUT total_spill_space int8, OUT read_kbytes int8, OUT write_kbytes int8, OUT read_counts int8, OUT write_counts int8, OUT read_speed float, OUT write_speed float) returns setof record language internal stable rows 100 as 'gs_wlm_user_resource_info'; - -DROP VIEW IF EXISTS pg_catalog.pg_total_user_resource_info_oid CASCADE; -CREATE OR REPLACE VIEW pg_catalog.pg_total_user_resource_info_oid AS -SELECT * FROM gs_wlm_get_all_user_resource_info() AS -(userid Oid, - used_memory int, - total_memory int, - used_cpu float, - total_cpu int, - used_space bigint, - total_space bigint, - used_temp_space bigint, - total_temp_space bigint, - used_spill_space bigint, - total_spill_space bigint, - read_kbytes bigint, - write_kbytes bigint, - read_counts bigint, - write_counts bigint, - read_speed float, - write_speed float -); - -GRANT SELECT ON pg_catalog.pg_total_user_resource_info_oid TO public; - -DROP VIEW IF EXISTS pg_catalog.pg_total_user_resource_info cascade; -CREATE OR REPLACE VIEW pg_catalog.pg_total_user_resource_info AS -SELECT - S.usename AS username, - T.used_memory, - T.total_memory, - T.used_cpu, - T.total_cpu, - T.used_space, - T.total_space, - T.used_temp_space, - T.total_temp_space, - T.used_spill_space, - T.total_spill_space, - T.read_kbytes, - T.write_kbytes, - T.read_counts, - T.write_counts, - T.read_speed, - T.write_speed -FROM pg_user AS S, pg_total_user_resource_info_oid AS T -WHERE S.usesysid = T.userid; - -GRANT SELECT ON TABLE pg_catalog.pg_total_user_resource_info TO PUBLIC; - -DROP FUNCTION IF EXISTS pg_catalog.get_instr_workload_info(int4) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5000; -CREATE FUNCTION pg_catalog.get_instr_workload_info -( -int4, -OUT resourcepool_oid bigint, -OUT commit_counter integer, -OUT rollback_counter integer, -OUT resp_min bigint, -OUT resp_max bigint, -OUT resp_avg bigint, -OUT resp_total bigint, -OUT bg_commit_counter integer, -OUT bg_rollback_counter integer, -OUT bg_resp_min bigint, -OUT bg_resp_max bigint, -OUT bg_resp_avg bigint, -OUT bg_resp_total bigint -) -RETURNS setof record LANGUAGE INTERNAL VOLATILE NOT FENCED as 'get_instr_workload_info'; - - -DROP FUNCTION IF EXISTS pg_catalog.get_instr_workload_info(int4) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5000; -CREATE FUNCTION pg_catalog.get_instr_workload_info -( -int4, -OUT user_oid bigint, -OUT commit_counter bigint, -OUT rollback_counter bigint, -OUT resp_min bigint, -OUT resp_max bigint, -OUT resp_avg bigint, -OUT resp_total bigint, -OUT bg_commit_counter bigint, -OUT bg_rollback_counter bigint, -OUT bg_resp_min bigint, -OUT bg_resp_max bigint, -OUT bg_resp_avg bigint, -OUT bg_resp_total bigint -) -RETURNS setof record LANGUAGE INTERNAL VOLATILE NOT FENCED as 'get_instr_workload_info'; - --- roll back 3956 -DROP FUNCTION IF EXISTS pg_catalog.threadpool_status; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC,3956; -CREATE OR REPLACE FUNCTION pg_catalog.threadpool_status( - OUT node_name TEXT, - OUT group_id INT, - OUT bind_numa_id INT, - OUT bind_cpu_number INT, - OUT listener INT, - OUT worker_info TEXT, - OUT session_info TEXT) -RETURNS RECORD LANGUAGE INTERNAL as 'gs_threadpool_status'; - -DROP FUNCTION IF EXISTS pg_catalog.table_skewness(text, OUT DNName text, OUT Num text, OUT Ratio text); -DROP FUNCTION IF EXISTS pg_catalog.distributed_count(IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text); - -CREATE OR REPLACE FUNCTION pg_catalog.distributed_count(IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - total_num bigint; - flag boolean; - special text := '[;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN _table_name, IN special; - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - RETURN; - END IF; - EXECUTE 'SELECT count(1) FROM ' || _table_name - INTO total_num; - - --Get the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true AND oid::text in ' || - '(SELECT regexp_split_to_table(nodeoids::text, '' '') FROM pgxc_class WHERE pcrelid=''' || _table_name || '''::regclass::oid)'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select ''''DN_name'''' as dnname1, count(1) as count1 from ' || $1 || ''''; - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.dnname1 := CASE - WHEN LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-length(row_name.node_name)) - ELSE SUBSTR(row_name.node_name,1,20) - END; - DNName := row_data.dnname1; - Num := row_data.count1; - IF total_num = 0 THEN - Ratio := 0.000 ||'%'; - ELSE - Ratio := ROUND(row_data.count1/total_num*100,3) || '%'; - END IF; - RETURN next; - END LOOP; - END LOOP; - - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.table_skewness(text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -declare -flag boolean; -special text := '[;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - return NEXT; - ELSE - RETURN QUERY EXECUTE 'SELECT * FROM distributed_count(''' || $1 || ''') ORDER BY num DESC, dnname'; - END IF; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -DROP FUNCTION if exists pg_catalog.pgxc_lock_for_transfer(OUT pgxc_lock_for_transfer bool, IN schemaName Name) cascade; -DROP FUNCTION if exists pg_catalog.pgxc_unlock_for_transfer(OUT pgxc_lock_for_transfer bool, IN schemaName Name) cascade; - - -DROP FUNCTION IF EXISTS prepare_statement_status() CASCADE; -DROP FUNCTION IF EXISTS plancache_status() CASCADE; -DROP FUNCTION IF EXISTS plancache_clean() CASCADE; - -DROP VIEW IF EXISTS pg_catalog.gs_labels; - -DROP INDEX IF EXISTS pg_catalog.gs_policy_label_name_index; -DROP INDEX IF EXISTS pg_catalog.gs_policy_label_oid_index; - -DROP TYPE IF EXISTS pg_catalog.gs_policy_label; -DROP TABLE IF EXISTS pg_catalog.gs_policy_label; - -drop type if exists pg_catalog.gs_global_config cascade; -DROP TABLE IF EXISTS pg_catalog.gs_global_config cascade; - - --- ---------------------------------------------------------------- --- rollback comm_check_connection_status --- ---------------------------------------------------------------- - -DROP FUNCTION IF EXISTS pg_catalog.comm_check_connection_status(OUT node_name text, OUT remote_name text, OUT remote_host text, OUT remote_port int4, OUT is_connected bool) CASCADE; diff --git a/src/include/catalog/upgrade_sql/open_gauss/upgrade_catalog_maindb/upgrade-post_catalog_maindb_92_200.sql b/src/include/catalog/upgrade_sql/open_gauss/upgrade_catalog_maindb/upgrade-post_catalog_maindb_92_200.sql index d5b82af26..3ae865996 100644 --- a/src/include/catalog/upgrade_sql/open_gauss/upgrade_catalog_maindb/upgrade-post_catalog_maindb_92_200.sql +++ b/src/include/catalog/upgrade_sql/open_gauss/upgrade_catalog_maindb/upgrade-post_catalog_maindb_92_200.sql @@ -546,20 +546,20 @@ DROP FUNCTION IF EXISTS pg_catalog.proc_add_depend(name, name) cascade; CREATE OR REPLACE VIEW DBE_PERF.os_runtime AS SELECT * FROM pv_os_run_info(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_os_runtime +CREATE OR REPLACE FUNCTION dbe_perf.get_global_os_runtime (OUT node_name name, OUT id integer, OUT name text, OUT value numeric, OUT comments text, OUT cumulative boolean) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.os_runtime%rowtype; + row_data dbe_perf.os_runtime%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.os_runtime'''; + query_str := 'SELECT * FROM dbe_perf.os_runtime'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; id := row_data.id; @@ -586,19 +586,19 @@ CREATE OR REPLACE VIEW DBE_PERF.os_threads AS S.creation_time FROM pg_stat_get_thread() AS S; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_os_threads() -RETURNS setof DBE_PERF.os_threads +CREATE OR REPLACE FUNCTION dbe_perf.get_global_os_threads() +RETURNS setof dbe_perf.os_threads AS $$ DECLARE - row_data DBE_PERF.os_threads%rowtype; + row_data dbe_perf.os_threads%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.os_threads'''; + query_str := 'SELECT * FROM dbe_perf.os_threads'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -614,20 +614,20 @@ CREATE OR REPLACE VIEW DBE_PERF.global_os_threads AS CREATE OR REPLACE VIEW DBE_PERF.instance_time AS SELECT * FROM pv_instance_time(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_instance_time +CREATE OR REPLACE FUNCTION dbe_perf.get_global_instance_time (OUT node_name name, OUT stat_id integer, OUT stat_name text, OUT value bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.instance_time%rowtype; + row_data dbe_perf.instance_time%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all CN DN node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.instance_time'''; + query_str := 'SELECT * FROM dbe_perf.instance_time'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; stat_id := row_data.stat_id; @@ -681,22 +681,22 @@ CREATE OR REPLACE VIEW DBE_PERF.workload_sql_elapse_time AS pg_user left join pg_stat_get_sql_count() AS S on pg_user.usename = S.user_name GROUP by pg_user.respool; -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_workload_sql_count +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_workload_sql_count (OUT node_name name, OUT workload name, OUT select_count bigint, OUT update_count bigint, OUT insert_count bigint, OUT delete_count bigint, OUT ddl_count bigint, OUT dml_count bigint, OUT dcl_count bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.workload_sql_count%rowtype; + row_data dbe_perf.workload_sql_count%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.workload_sql_count'''; + query_str := 'SELECT * FROM dbe_perf.workload_sql_count'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; workload := row_data.workload; @@ -717,7 +717,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.summary_workload_sql_count AS SELECT * FROM DBE_PERF.get_summary_workload_sql_count(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_workload_sql_elapse_time +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_workload_sql_elapse_time (OUT node_name name, OUT workload name, OUT total_select_elapse bigint, OUT max_select_elapse bigint, OUT min_select_elapse bigint, OUT avg_select_elapse bigint, OUT total_update_elapse bigint, OUT max_update_elapse bigint, OUT min_update_elapse bigint, OUT avg_update_elapse bigint, @@ -726,15 +726,15 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_workload_sql_elapse_time RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.workload_sql_elapse_time%rowtype; + row_data dbe_perf.workload_sql_elapse_time%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.workload_sql_elapse_time'''; + query_str := 'SELECT * FROM dbe_perf.workload_sql_elapse_time'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; workload := row_data.workload; @@ -783,7 +783,7 @@ SELECT FROM pg_user left join get_instr_workload_info(0) AS giwi on pg_user.usesysid = giwi.user_oid; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_user_transaction +CREATE OR REPLACE FUNCTION dbe_perf.get_global_user_transaction (OUT node_name name, OUT usename name, OUT commit_counter bigint, OUT rollback_counter bigint, OUT resp_min bigint, OUT resp_max bigint, OUT resp_avg bigint, OUT resp_total bigint, OUT bg_commit_counter bigint, @@ -792,15 +792,15 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_user_transaction RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.user_transaction%rowtype; + row_data dbe_perf.user_transaction%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.user_transaction'''; + query_str := 'SELECT * FROM dbe_perf.user_transaction'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; usename := row_data.usename; @@ -856,15 +856,15 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_workload_transaction RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.workload_transaction%rowtype; + row_data dbe_perf.workload_transaction%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.workload_transaction'''; + query_str := 'SELECT * FROM dbe_perf.workload_transaction'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; workload := row_data.workload; @@ -912,20 +912,20 @@ CREATE OR REPLACE VIEW DBE_PERF.summary_workload_transaction AS CREATE OR REPLACE VIEW DBE_PERF.session_stat AS SELECT * FROM pv_session_stat(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_stat +CREATE OR REPLACE FUNCTION dbe_perf.get_global_session_stat (OUT node_name name, OUT sessid text, OUT statid integer, OUT statname text, OUT statunit text, OUT value bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.session_stat%rowtype; + row_data dbe_perf.session_stat%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.session_stat'''; + query_str := 'SELECT * FROM dbe_perf.session_stat'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; sessid := row_data.sessid; @@ -946,20 +946,20 @@ CREATE OR REPLACE VIEW DBE_PERF.global_session_stat AS CREATE OR REPLACE VIEW DBE_PERF.session_time AS SELECT * FROM pv_session_time(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_time +CREATE OR REPLACE FUNCTION dbe_perf.get_global_session_time (OUT node_name name, OUT sessid text, OUT stat_id integer, OUT stat_name text, OUT value bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.session_time%rowtype; + row_data dbe_perf.session_time%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.session_time'''; + query_str := 'SELECT * FROM dbe_perf.session_time'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; sessid := row_data.sessid; @@ -979,20 +979,20 @@ CREATE OR REPLACE VIEW DBE_PERF.global_session_time AS CREATE OR REPLACE VIEW DBE_PERF.session_memory AS SELECT * FROM pv_session_memory(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_memory +CREATE OR REPLACE FUNCTION dbe_perf.get_global_session_memory (OUT node_name name, OUT sessid text, OUT init_mem integer, OUT used_mem integer, OUT peak_mem integer) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.session_memory%rowtype; + row_data dbe_perf.session_memory%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.session_memory'''; + query_str := 'SELECT * FROM dbe_perf.session_memory'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; sessid := row_data.sessid; @@ -1009,24 +1009,118 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_session_memory AS SELECT DISTINCT * FROM DBE_PERF.get_global_session_memory(); + +CREATE OR REPLACE FUNCTION pg_catalog.pv_session_memory_detail_tp(OUT sessid TEXT, OUT sesstype TEXT, OUT contextname TEXT, OUT level INT2, OUT parent TEXT, OUT totalsize INT8, OUT freesize INT8, OUT usedsize INT8) +RETURNS setof record +AS $$ +DECLARE + enable_threadpool bool; + row_data record; + query_str text; +BEGIN + show enable_thread_pool into enable_threadpool; + + IF enable_threadpool THEN + query_str := 'with SM AS + (SELECT + S.sessid AS sessid, + T.thrdtype AS sesstype, + S.contextname AS contextname, + S.level AS level, + S.parent AS parent, + S.totalsize AS totalsize, + S.freesize AS freesize, + S.usedsize AS usedsize + FROM + pv_session_memory_context S + LEFT JOIN + (SELECT DISTINCT thrdtype, tid + FROM pv_thread_memory_context) T + on S.threadid = T.tid + ), + TM AS + (SELECT + S.sessid AS Ssessid, + T.thrdtype AS sesstype, + T.threadid AS Tsessid, + T.contextname AS contextname, + T.level AS level, + T.parent AS parent, + T.totalsize AS totalsize, + T.freesize AS freesize, + T.usedsize AS usedsize + FROM + pv_thread_memory_context T + LEFT JOIN + (SELECT DISTINCT sessid, threadid + FROM pv_session_memory_context) S + ON T.tid = S.threadid + ) + SELECT * from SM + UNION ALL + SELECT + Ssessid AS sessid, sesstype, contextname, level, parent, totalsize, freesize, usedsize + FROM TM WHERE Ssessid IS NOT NULL + UNION ALL + SELECT + Tsessid AS sessid, sesstype, contextname, level, parent, totalsize, freesize, usedsize + FROM TM WHERE Ssessid IS NULL;'; + FOR row_data IN EXECUTE(query_str) LOOP + sessid = row_data.sessid; + sesstype = row_data.sesstype; + contextname = row_data.contextname; + level = row_data.level; + parent = row_data.parent; + totalsize = row_data.totalsize; + freesize = row_data.freesize; + usedsize = row_data.usedsize; + return next; + END LOOP; + ELSE + query_str := 'SELECT + T.threadid AS sessid, + T.thrdtype AS sesstype, + T.contextname AS contextname, + T.level AS level, + T.parent AS parent, + T.totalsize AS totalsize, + T.freesize AS freesize, + T.usedsize AS usedsize + FROM pg_catalog.pv_thread_memory_detail() T;'; + FOR row_data IN EXECUTE(query_str) LOOP + sessid = row_data.sessid; + sesstype = row_data.sesstype; + contextname = row_data.contextname; + level = row_data.level; + parent = row_data.parent; + totalsize = row_data.totalsize; + freesize = row_data.freesize; + usedsize = row_data.usedsize; + return next; + END LOOP; + END IF; + RETURN; +END; $$ +LANGUAGE plpgsql NOT FENCED; + CREATE OR REPLACE VIEW DBE_PERF.session_memory_detail AS SELECT * FROM pv_session_memory_detail_tp(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_memory_detail +CREATE OR REPLACE FUNCTION dbe_perf.get_global_session_memory_detail (OUT node_name name, OUT sessid text, OUT sesstype text, OUT contextname text, OUT level smallint, OUT parent text, OUT totalsize bigint, OUT freesize bigint, OUT usedsize bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.session_memory_detail%rowtype; + row_data dbe_perf.session_memory_detail%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.session_memory_detail'''; + query_str := 'SELECT * FROM dbe_perf.session_memory_detail'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; sessid := row_data.sessid; @@ -1106,7 +1200,7 @@ CREATE OR REPLACE VIEW DBE_PERF.session_stat_activity AS S.usesysid = U.oid AND T.threadid = S.pid; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_stat_activity +CREATE OR REPLACE FUNCTION dbe_perf.get_global_session_stat_activity (out coorname text, out datid oid, out datname text, out pid bigint, out usesysid oid, out usename text, out application_name text, out client_addr inet, out client_hostname text, out client_port integer, out backend_start timestamptz, @@ -1116,16 +1210,16 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_stat_activity RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.session_stat_activity%rowtype; + row_data dbe_perf.session_stat_activity%rowtype; coor_name record; fet_active text; fetch_coor text; BEGIN --Get all cn node names - fetch_coor := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + fetch_coor := 'select * from dbe_perf.node_name'; FOR coor_name IN EXECUTE(fetch_coor) LOOP coorname := coor_name.node_name; - fet_active := 'EXECUTE DIRECT ON (' || coor_name.node_name || ') ''SELECT * FROM DBE_PERF.session_stat_activity'''; + fet_active := 'SELECT * FROM dbe_perf.session_stat_activity'; FOR row_data IN EXECUTE(fet_active) LOOP coorname := coorname; datid :=row_data.datid; @@ -1160,19 +1254,19 @@ CREATE OR REPLACE VIEW DBE_PERF.global_session_stat_activity AS CREATE OR REPLACE VIEW DBE_PERF.thread_wait_status AS SELECT * FROM pg_stat_get_status(NULL); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_thread_wait_status() -RETURNS setof DBE_PERF.thread_wait_status +CREATE OR REPLACE FUNCTION dbe_perf.get_global_thread_wait_status() +RETURNS setof dbe_perf.thread_wait_status AS $$ DECLARE - row_data DBE_PERF.thread_wait_status%rowtype; + row_data dbe_perf.thread_wait_status%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn dn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.thread_wait_status'''; + query_str := 'SELECT * FROM dbe_perf.thread_wait_status'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -1346,30 +1440,6 @@ CREATE OR REPLACE VIEW DBE_PERF.wlm_workload_runtime AS WHERE P.query_pid = S.threadpid AND S.usesysid = U.oid; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_wlm_workload_runtime() -RETURNS setof DBE_PERF.wlm_workload_runtime -AS $$ -DECLARE - row_data DBE_PERF.wlm_workload_runtime%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all coordinator node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.wlm_workload_runtime'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW DBE_PERF.global_wlm_workload_runtime AS - SELECT * from DBE_PERF.get_global_wlm_workload_runtime(); - CREATE OR REPLACE VIEW DBE_PERF.wlm_workload_history_info AS SELECT statement, @@ -1403,57 +1473,9 @@ CREATE OR REPLACE VIEW DBE_PERF.operator_ec_history AS ec_libodbc_type FROM pg_stat_get_wlm_ec_operator_info(0) where ec_operator > 0; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_ec_history() -RETURNS setof DBE_PERF.operator_ec_history -AS $$ -DECLARE - row_data DBE_PERF.operator_ec_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.operator_ec_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql'; - -CREATE OR REPLACE VIEW DBE_PERF.global_operator_ec_history AS - SELECT * FROM DBE_PERF.get_global_operator_ec_history(); - CREATE OR REPLACE VIEW DBE_PERF.operator_ec_history_table AS SELECT * FROM gs_wlm_ec_operator_info; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_ec_history_table() -RETURNS setof DBE_PERF.operator_ec_history_table -AS $$ -DECLARE - row_data DBE_PERF.operator_ec_history_table%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the CN node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.operator_ec_history_table'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW DBE_PERF.global_operator_ec_history_table AS - SELECT * FROM DBE_PERF.get_global_operator_ec_history_table(); - --real time ec operator-level view in single CN CREATE OR REPLACE VIEW DBE_PERF.operator_ec_runtime AS SELECT @@ -1470,47 +1492,23 @@ CREATE OR REPLACE VIEW DBE_PERF.operator_ec_runtime AS FROM DBE_PERF.session_stat_activity AS s, pg_stat_get_wlm_realtime_ec_operator_info(NULL) as t where s.query_id = t.queryid and t.ec_operator > 0; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_ec_runtime() -RETURNS setof DBE_PERF.operator_ec_runtime -AS $$ -DECLARE - row_data DBE_PERF.operator_ec_runtime%rowtype; - coor_name record; - fet_active text; - fetch_coor text; - BEGIN - --Get all the CN node names - fetch_coor := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR coor_name IN EXECUTE(fetch_coor) LOOP - fet_active := 'EXECUTE DIRECT ON (' || coor_name.node_name || ') ''SELECT * FROM DBE_PERF.operator_ec_runtime'''; - FOR row_data IN EXECUTE(fet_active) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW DBE_PERF.global_operator_ec_runtime AS - SELECT * FROM DBE_PERF.get_global_operator_ec_runtime(); - CREATE OR REPLACE VIEW DBE_PERF.operator_history_table AS SELECT * FROM gs_wlm_operator_info; --createing history operator-level view for test in multi-CN from single CN -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_history_table() -RETURNS setof DBE_PERF.operator_history_table +CREATE OR REPLACE FUNCTION dbe_perf.get_global_operator_history_table() +RETURNS setof dbe_perf.operator_history_table AS $$ DECLARE - row_data DBE_PERF.operator_history_table%rowtype; + row_data dbe_perf.operator_history_table%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the CN node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.operator_history_table '''; + query_str := 'SELECT * FROM dbe_perf.operator_history_table'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -1526,19 +1524,19 @@ CREATE OR REPLACE VIEW DBE_PERF.global_operator_history_table AS CREATE OR REPLACE VIEW DBE_PERF.operator_history AS SELECT * FROM pg_stat_get_wlm_operator_info(0); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_history() -RETURNS setof DBE_PERF.operator_history +CREATE OR REPLACE FUNCTION dbe_perf.get_global_operator_history() +RETURNS setof dbe_perf.operator_history AS $$ DECLARE - row_data DBE_PERF.operator_history%rowtype; + row_data dbe_perf.operator_history%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.operator_history'''; + query_str := 'SELECT * FROM dbe_perf.operator_history'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -1556,18 +1554,18 @@ CREATE OR REPLACE VIEW DBE_PERF.operator_runtime AS FROM DBE_PERF.session_stat_activity AS s, pg_stat_get_wlm_realtime_operator_info(NULL) as t WHERE s.query_id = t.queryid; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_runtime() -RETURNS setof DBE_PERF.operator_runtime +CREATE OR REPLACE FUNCTION dbe_perf.get_global_operator_runtime() +RETURNS setof dbe_perf.operator_runtime AS $$ DECLARE - row_data DBE_PERF.operator_runtime%rowtype; + row_data dbe_perf.operator_runtime%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.operator_runtime'''; + query_str := 'SELECT * FROM dbe_perf.operator_runtime'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -1653,19 +1651,19 @@ SELECT FROM pg_stat_get_wlm_session_info(0) S; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_complex_history() -RETURNS setof DBE_PERF.statement_complex_history +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statement_complex_history() +RETURNS setof dbe_perf.statement_complex_history AS $$ DECLARE - row_data DBE_PERF.statement_complex_history%rowtype; + row_data dbe_perf.statement_complex_history%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement_complex_history'''; + query_str := 'SELECT * FROM dbe_perf.statement_complex_history'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -1680,19 +1678,19 @@ CREATE OR REPLACE VIEW DBE_PERF.global_statement_complex_history AS CREATE OR REPLACE VIEW DBE_PERF.statement_complex_history_table AS SELECT * FROM gs_wlm_session_info; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_complex_history_table() -RETURNS setof DBE_PERF.statement_complex_history_table +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statement_complex_history_table() +RETURNS setof dbe_perf.statement_complex_history_table AS $$ DECLARE - row_data DBE_PERF.statement_complex_history_table%rowtype; + row_data dbe_perf.statement_complex_history_table%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement_complex_history_table'''; + query_str := 'SELECT * FROM dbe_perf.statement_complex_history_table'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -1761,18 +1759,18 @@ CREATE OR REPLACE VIEW DBE_PERF.statement_complex_runtime AS FROM pg_stat_activity_ng AS S, pg_stat_get_wlm_realtime_session_info(NULL) AS T WHERE S.pid = T.threadid; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_complex_runtime() -RETURNS setof DBE_PERF.statement_complex_runtime +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statement_complex_runtime() +RETURNS setof dbe_perf.statement_complex_runtime AS $$ DECLARE - row_data DBE_PERF.statement_complex_runtime%rowtype; + row_data dbe_perf.statement_complex_runtime%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.statement_complex_runtime'''; + query_str := 'SELECT * FROM dbe_perf.statement_complex_runtime'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -1838,19 +1836,19 @@ CREATE OR REPLACE VIEW DBE_PERF.statement_wlmstat_complex_runtime AS CREATE OR REPLACE VIEW DBE_PERF.memory_node_detail AS SELECT * FROM pv_total_memory_detail(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_memory_node_detail() -RETURNS setof DBE_PERF.memory_node_detail +CREATE OR REPLACE FUNCTION dbe_perf.get_global_memory_node_detail() +RETURNS setof dbe_perf.memory_node_detail AS $$ DECLARE row_name record; - row_data DBE_PERF.memory_node_detail%rowtype; + row_data dbe_perf.memory_node_detail%rowtype; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.memory_node_detail'''; + query_str := 'SELECT * FROM dbe_perf.memory_node_detail'; FOR row_data IN EXECUTE(query_str) LOOP RETURN NEXT row_data; END LOOP; @@ -1868,21 +1866,21 @@ CREATE OR REPLACE VIEW DBE_PERF.memory_node_ng_detail AS CREATE OR REPLACE VIEW DBE_PERF.shared_memory_detail AS SELECT * FROM pg_shared_memory_detail(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_shared_memory_detail +CREATE OR REPLACE FUNCTION dbe_perf.get_global_shared_memory_detail (OUT node_name name, OUT contextname text, OUT level smallint, OUT parent text, OUT totalsize bigint, OUT freesize bigint, OUT usedsize bigint) RETURNS setof record AS $$ DECLARE row_name record; - row_data DBE_PERF.shared_memory_detail%rowtype; + row_data dbe_perf.shared_memory_detail%rowtype; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.shared_memory_detail'''; + query_str := 'SELECT * FROM dbe_perf.shared_memory_detail'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; contextname := row_data.contextname; @@ -1905,29 +1903,6 @@ CREATE OR REPLACE VIEW DBE_PERF.global_shared_memory_detail AS CREATE OR REPLACE VIEW DBE_PERF.comm_delay AS SELECT DISTINCT * FROM pg_comm_delay(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_comm_delay() -RETURNS setof DBE_PERF.comm_delay -AS $$ -DECLARE - row_name record; - row_data DBE_PERF.comm_delay%rowtype; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.comm_delay'''; - FOR row_data IN EXECUTE(query_str) LOOP - RETURN NEXT row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW DBE_PERF.global_comm_delay AS - SELECT DISTINCT * FROM DBE_PERF.get_global_comm_delay(); - CREATE OR REPLACE VIEW DBE_PERF.comm_recv_stream AS SELECT S.node_name, @@ -2071,9 +2046,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_all_indexes'''; + query_str := 'SELECT * FROM dbe_perf.statio_all_indexes'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -2126,9 +2101,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.relname AS relname, T.schemaname AS schemaname, @@ -2139,7 +2114,7 @@ DECLARE T.idx_blks_hit AS idx_blks_hit FROM DBE_PERF.statio_all_indexes T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -2181,7 +2156,7 @@ CREATE OR REPLACE VIEW DBE_PERF.statio_all_sequences AS LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE C.relkind = 'S'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_all_sequences +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_all_sequences (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT blks_read bigint, OUT blks_hit bigint) RETURNS setof record @@ -2193,9 +2168,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_all_sequences'''; + query_str := 'SELECT * FROM dbe_perf.statio_all_sequences'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -2244,7 +2219,7 @@ CREATE OR REPLACE VIEW DBE_PERF.statio_all_tables AS WHERE C.relkind IN ('r', 't') GROUP BY C.oid, N.nspname, C.relname, T.oid, X.oid; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_all_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_all_tables (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint, OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) @@ -2257,9 +2232,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_all_tables'''; + query_str := 'SELECT * FROM dbe_perf.statio_all_tables'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -2283,7 +2258,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_statio_all_tables AS SELECT * FROM DBE_PERF.get_global_statio_all_tables(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_all_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statio_all_tables (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT heap_blks_read bigint, OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) @@ -2296,9 +2271,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT C.relname AS relname, C.schemaname AS schemaname, @@ -2312,9 +2287,9 @@ DECLARE C.toast_blks_hit AS toast_blks_hit, C.tidx_blks_read AS tidx_blks_read, C.tidx_blks_hit AS tidx_blks_hit - FROM DBE_PERF.statio_all_tables C + FROM dbe_perf.statio_all_tables C LEFT JOIN pg_class O ON C.relid = O.reltoastrelid - LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -2371,7 +2346,7 @@ CREATE OR REPLACE VIEW DBE_PERF.statio_sys_indexes AS WHERE schemaname IN ('pg_catalog', 'information_schema', 'snapshot') OR schemaname ~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_sys_indexes +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_sys_indexes (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) RETURNS setof record @@ -2383,9 +2358,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_sys_indexes'''; + query_str := 'SELECT * FROM dbe_perf.statio_sys_indexes'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -2405,7 +2380,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_statio_sys_indexes AS SELECT * FROM DBE_PERF.get_global_statio_sys_indexes(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_sys_indexes +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statio_sys_indexes (OUT schemaname name, OUT toastrelschemaname name, OUT toastrelname name, OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) RETURNS setof record @@ -2417,9 +2392,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.relname AS relname, T.schemaname AS schemaname, @@ -2428,9 +2403,9 @@ DECLARE T.indexrelname AS indexrelname, T.idx_blks_read AS idx_blks_read, T.idx_blks_hit AS idx_blks_hit - FROM DBE_PERF.statio_sys_indexes T + FROM dbe_perf.statio_sys_indexes T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -2465,7 +2440,7 @@ CREATE OR REPLACE VIEW DBE_PERF.statio_sys_sequences AS WHERE schemaname IN ('pg_catalog', 'information_schema') OR schemaname ~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_sys_sequences +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_sys_sequences (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT blks_read bigint, OUT blks_hit bigint) RETURNS setof record @@ -2477,9 +2452,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_sys_sequences'''; + query_str := 'SELECT * FROM dbe_perf.statio_sys_sequences'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -2508,7 +2483,7 @@ CREATE OR REPLACE VIEW DBE_PERF.statio_sys_tables AS WHERE schemaname IN ('pg_catalog', 'information_schema', 'snapshot') OR schemaname ~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_sys_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_sys_tables (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint, OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) @@ -2521,9 +2496,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_sys_tables'''; + query_str := 'SELECT * FROM dbe_perf.statio_sys_tables'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -2547,7 +2522,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_statio_sys_tables AS SELECT * FROM DBE_PERF.get_global_statio_sys_tables(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_sys_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statio_sys_tables (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT heap_blks_read bigint, OUT heap_blks_hit bigint, @@ -2563,9 +2538,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT C.schemaname AS schemaname, C.relname AS relname, @@ -2579,9 +2554,9 @@ DECLARE C.toast_blks_hit AS toast_blks_hit, C.tidx_blks_read AS tidx_blks_read, C.tidx_blks_hit AS tidx_blks_hit - FROM DBE_PERF.statio_sys_tables C + FROM dbe_perf.statio_sys_tables C LEFT JOIN pg_class O ON C.relid = O.reltoastrelid - LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -2623,7 +2598,7 @@ CREATE OR REPLACE VIEW DBE_PERF.statio_user_indexes AS WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'snapshot') AND schemaname !~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_user_indexes +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_user_indexes (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) RETURNS setof record @@ -2635,9 +2610,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_user_indexes'''; + query_str := 'SELECT * FROM dbe_perf.statio_user_indexes'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -2657,7 +2632,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_statio_user_indexes AS SELECT * FROM DBE_PERF.get_global_statio_user_indexes(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_user_indexes +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statio_user_indexes (OUT schemaname name, OUT toastrelschemaname name, OUT toastrelname name, OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) RETURNS setof record @@ -2669,9 +2644,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.relname AS relname, T.schemaname AS schemaname, @@ -2680,9 +2655,9 @@ DECLARE T.indexrelname AS indexrelname, T.idx_blks_read AS idx_blks_read, T.idx_blks_hit AS idx_blks_hit - FROM DBE_PERF.statio_user_indexes T + FROM dbe_perf.statio_user_indexes T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -2718,7 +2693,7 @@ CREATE OR REPLACE VIEW DBE_PERF.statio_user_sequences AS WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND schemaname !~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_user_sequences +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_user_sequences (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT blks_read bigint, OUT blks_hit bigint) RETURNS setof record @@ -2730,9 +2705,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_user_sequences'''; + query_str := 'SELECT * FROM dbe_perf.statio_user_sequences'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -2761,7 +2736,7 @@ CREATE OR REPLACE VIEW DBE_PERF.statio_user_tables AS WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'snapshot') AND schemaname !~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_user_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_user_tables (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint, OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) @@ -2774,9 +2749,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_user_tables'''; + query_str := 'SELECT * FROM dbe_perf.statio_user_tables'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -2800,7 +2775,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_statio_user_tables AS SELECT * FROM DBE_PERF.get_global_statio_user_tables(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_user_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statio_user_tables (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT heap_blks_read bigint, OUT heap_blks_hit bigint, @@ -2816,9 +2791,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT C.schemaname AS schemaname, C.relname AS relname, @@ -2832,9 +2807,9 @@ DECLARE C.toast_blks_hit AS toast_blks_hit, C.tidx_blks_read AS tidx_blks_read, C.tidx_blks_hit AS tidx_blks_hit - FROM DBE_PERF.statio_user_tables C + FROM dbe_perf.statio_user_tables C LEFT JOIN pg_class O ON C.relid = O.reltoastrelid - LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -2869,7 +2844,7 @@ CREATE OR REPLACE VIEW DBE_PERF.summary_statio_user_tables AS ON Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname GROUP BY (1, 2); -CREATE OR REPLACE FUNCTION DBE_PERF.get_stat_db_cu +CREATE OR REPLACE FUNCTION dbe_perf.get_stat_db_cu (OUT node_name1 text, OUT db_name text, OUT mem_hit bigint, OUT hdd_sync_read bigint, OUT hdd_asyn_read bigint) @@ -2881,13 +2856,13 @@ DECLARE query_str text; query_str_nodes text; BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT D.datname AS datname, + query_str := 'SELECT D.datname AS datname, pg_stat_get_db_cu_mem_hit(D.oid) AS mem_hit, pg_stat_get_db_cu_hdd_sync(D.oid) AS hdd_sync_read, pg_stat_get_db_cu_hdd_asyn(D.oid) AS hdd_asyn_read - FROM pg_database D;'''; + FROM pg_database D;'; FOR each_node_out IN EXECUTE(query_str) LOOP node_name1 := row_name.node_name; db_name := each_node_out.datname; @@ -2935,110 +2910,7 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_all_tables AS WHERE C.relkind IN ('r', 't') GROUP BY C.oid, N.nspname, C.relname; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_dn_stat_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_all_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_cn_stat_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT * FROM DBE_PERF.stat_all_tables WHERE schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW DBE_PERF.global_stat_all_tables AS - SELECT * FROM DBE_PERF.get_global_cn_stat_all_tables() - UNION ALL SELECT * FROM DBE_PERF.get_global_dn_stat_all_tables(); - -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_dn_stat_all_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_all_tables (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, @@ -3055,9 +2927,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''D'''; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.schemaname AS schemaname, T.relname AS relname, @@ -3081,9 +2953,9 @@ DECLARE T.autovacuum_count AS autovacuum_count, T.analyze_count AS analyze_count, T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_all_tables T + FROM dbe_perf.stat_all_tables T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -3118,104 +2990,6 @@ DECLARE END; $$ LANGUAGE 'plpgsql' NOT FENCED; -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_cn_stat_all_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd, - T.n_live_tup AS n_live_tup, - T.n_dead_tup AS n_dead_tup, - T.last_vacuum AS last_vacuum, - T.last_autovacuum AS last_autovacuum, - T.last_analyze AS last_analyze, - T.last_autoanalyze AS last_autoanalyze, - T.vacuum_count AS vacuum_count, - T.autovacuum_count AS autovacuum_count, - T.analyze_count AS analyze_count, - T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_all_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid - WHERE T.schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW DBE_PERF.summary_stat_all_tables AS - SELECT Ti.schemaname, COALESCE(Ti.relname, Tn.toastname, NULL) as relname, - SUM(Ti.seq_scan) seq_scan, SUM(Ti.seq_tup_read) seq_tup_read, - SUM(Ti.idx_scan) idx_scan, SUM(Ti.idx_tup_fetch) idx_tup_fetch, - SUM(Ti.n_tup_ins) n_tup_ins, SUM(Ti.n_tup_upd) n_tup_upd, - SUM(Ti.n_tup_del) n_tup_del, SUM(Ti.n_tup_hot_upd) n_tup_hot_upd, - SUM(Ti.n_live_tup) n_live_tup, SUM(Ti.n_dead_tup) n_dead_tup, - MAX(Ti.last_vacuum) last_vacuum, MAX(Ti.last_autovacuum) last_autovacuum, - MAX(Ti.last_analyze) last_analyze, MAX(Ti.last_autoanalyze) last_autoanalyze, - SUM(Ti.vacuum_count) vacuum_count, SUM(Ti.autovacuum_count) autovacuum_count, - SUM(Ti.analyze_count) analyze_count, SUM(Ti.autoanalyze_count) autoanalyze_count - FROM (SELECT * FROM DBE_PERF.get_summary_cn_stat_all_tables() - UNION ALL SELECT * FROM DBE_PERF.get_summary_dn_stat_all_tables()) AS Ti - LEFT JOIN DBE_PERF.get_local_toast_relation() Tn - ON Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname - GROUP BY (1, 2); - CREATE OR REPLACE VIEW DBE_PERF.stat_all_indexes AS SELECT C.oid AS relid, @@ -3232,7 +3006,7 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_all_indexes AS LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE C.relkind IN ('r', 't'); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_all_indexes +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_all_indexes (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) RETURNS setof record @@ -3244,9 +3018,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_all_indexes'''; + query_str := 'SELECT * FROM dbe_perf.stat_all_indexes'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -3267,7 +3041,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_stat_all_indexes AS SELECT * FROM DBE_PERF.get_global_stat_all_indexes(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_all_indexes +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_all_indexes (OUT schemaname name, OUT relname name, OUT indexrelname name, OUT toastrelschemaname name, OUT toastrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) @@ -3280,9 +3054,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.relname AS relname, T.schemaname AS schemaname, @@ -3292,9 +3066,9 @@ DECLARE T.idx_scan AS idx_scan, T.idx_tup_read AS idx_tup_read, T.idx_tup_fetch AS idx_tup_fetch - FROM DBE_PERF.stat_all_indexes T + FROM dbe_perf.stat_all_indexes T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -3330,7 +3104,7 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_sys_tables AS WHERE schemaname IN ('pg_catalog', 'information_schema') OR schemaname ~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_sys_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_sys_tables (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, @@ -3346,9 +3120,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_sys_tables'''; + query_str := 'SELECT * FROM dbe_perf.stat_sys_tables'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -3382,7 +3156,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_stat_sys_tables AS SELECT * FROM DBE_PERF.get_global_stat_sys_tables(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_sys_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_sys_tables (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT seq_scan bigint, OUT seq_tup_read bigint, @@ -3400,9 +3174,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.schemaname AS schemaname, T.relname AS relname, @@ -3426,9 +3200,9 @@ DECLARE T.autovacuum_count AS autovacuum_count, T.analyze_count AS analyze_count, T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_sys_tables T + FROM dbe_perf.stat_sys_tables T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -3483,7 +3257,7 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_sys_indexes AS WHERE schemaname IN ('pg_catalog', 'information_schema') OR schemaname ~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_sys_indexes +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_sys_indexes (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) RETURNS setof record @@ -3495,9 +3269,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_sys_indexes'''; + query_str := 'SELECT * FROM dbe_perf.stat_sys_indexes'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -3518,7 +3292,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_stat_sys_indexes AS SELECT * FROM DBE_PERF.get_global_stat_sys_indexes(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_sys_indexes +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_sys_indexes (OUT schemaname name, OUT relname name, OUT indexrelname name, OUT toastrelschemaname name, OUT toastrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) @@ -3531,9 +3305,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.relname AS relname, T.schemaname AS schemaname, @@ -3543,9 +3317,9 @@ DECLARE T.idx_scan AS idx_scan, T.idx_tup_read AS idx_tup_read, T.idx_tup_fetch AS idx_tup_fetch - FROM DBE_PERF.stat_sys_indexes T + FROM dbe_perf.stat_sys_indexes T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -3581,7 +3355,7 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_user_tables AS WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND schemaname !~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_user_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_user_tables (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, @@ -3597,9 +3371,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''D'')'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_user_tables'''; + query_str := 'SELECT * FROM dbe_perf.stat_user_tables'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -3633,7 +3407,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_stat_user_tables AS SELECT * FROM DBE_PERF.get_global_stat_user_tables(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_user_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_user_tables (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT seq_scan bigint, OUT seq_tup_read bigint, @@ -3651,9 +3425,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''D'')'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.schemaname AS schemaname, T.relname AS relname, @@ -3677,9 +3451,9 @@ DECLARE T.autovacuum_count AS autovacuum_count, T.analyze_count AS analyze_count, T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_user_tables T + FROM dbe_perf.stat_user_tables T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -3734,7 +3508,7 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_user_indexes AS WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND schemaname !~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_user_indexes +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_user_indexes (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) RETURNS setof record @@ -3746,9 +3520,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_user_indexes'''; + query_str := 'SELECT * FROM dbe_perf.stat_user_indexes'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -3769,7 +3543,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_stat_user_indexes AS SELECT * FROM DBE_PERF.get_global_stat_user_indexes(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_user_indexes +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_user_indexes (OUT schemaname name, OUT relname name, OUT indexrelname name, OUT toastrelschemaname name, OUT toastrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) @@ -3782,9 +3556,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.relname AS relname, T.schemaname AS schemaname, @@ -3794,9 +3568,9 @@ DECLARE T.idx_scan AS idx_scan, T.idx_tup_read AS idx_tup_read, T.idx_tup_fetch AS idx_tup_fetch - FROM DBE_PERF.stat_user_indexes T + FROM dbe_perf.stat_user_indexes T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -3851,7 +3625,7 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_database AS pg_stat_get_db_stat_reset_time(D.oid) AS stats_reset FROM pg_database D; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_database +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_database (OUT node_name name, OUT datid oid, OUT datname name, OUT numbackends integer, OUT xact_commit bigint, OUT xact_rollback bigint, OUT blks_read bigint, OUT blks_hit bigint, OUT tup_returned bigint, OUT tup_fetched bigint, OUT tup_inserted bigint, OUT tup_updated bigint, OUT tup_deleted bigint, OUT conflicts bigint, OUT temp_files bigint, @@ -3860,15 +3634,15 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_database RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.stat_database%rowtype; + row_data dbe_perf.stat_database%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_database'''; + query_str := 'SELECT * FROM dbe_perf.stat_database'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; datid := row_data.datid; @@ -3929,21 +3703,21 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_database_conflicts AS pg_stat_get_db_conflict_startup_deadlock(D.oid) AS confl_deadlock FROM pg_database D; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_database_conflicts +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_database_conflicts (OUT node_name name, OUT datid oid, OUT datname name, OUT confl_tablespace bigint, OUT confl_lock bigint, OUT confl_snapshot bigint, OUT confl_bufferpin bigint, OUT confl_deadlock bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.stat_database_conflicts%rowtype; + row_data dbe_perf.stat_database_conflicts%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_database_conflicts'''; + query_str := 'SELECT * FROM dbe_perf.stat_database_conflicts'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; datid := row_data.datid; @@ -3960,6 +3734,7 @@ DECLARE END; $$ LANGUAGE 'plpgsql' NOT FENCED; + CREATE OR REPLACE VIEW DBE_PERF.global_stat_database_conflicts AS SELECT * FROM DBE_PERF.get_global_stat_database_conflicts(); @@ -3993,22 +3768,22 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_xact_all_tables AS WHERE C.relkind IN ('r', 't') GROUP BY C.oid, N.nspname, C.relname; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_all_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_xact_all_tables (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.stat_xact_all_tables%rowtype; + row_data dbe_perf.stat_xact_all_tables%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''D'''; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_xact_all_tables'''; + query_str := 'SELECT * FROM dbe_perf.stat_xact_all_tables'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -4025,9 +3800,9 @@ DECLARE return next; END LOOP; END LOOP; - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type = ''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_xact_all_tables where schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; + query_str := 'SELECT * FROM dbe_perf.stat_xact_all_tables where schemaname = ''pg_catalog'' or schemaname =''pg_toast'' '; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -4051,7 +3826,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_stat_xact_all_tables AS SELECT * FROM DBE_PERF.get_global_stat_xact_all_tables(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_xact_all_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_xact_all_tables (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT seq_scan bigint, OUT seq_tup_read bigint, @@ -4066,9 +3841,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''D'''; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.schemaname AS schemaname, T.relname AS relname, @@ -4082,9 +3857,9 @@ DECLARE T.n_tup_upd AS n_tup_upd, T.n_tup_del AS n_tup_del, T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_all_tables T + FROM dbe_perf.stat_xact_all_tables T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -4105,47 +3880,7 @@ DECLARE return next; END LOOP; END LOOP; - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_all_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid - WHERE T.schemaname = ''''pg_catalog'''' OR T.schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - END LOOP; - return; + return; END; $$ LANGUAGE 'plpgsql' NOT FENCED; @@ -4163,22 +3898,22 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_xact_sys_tables AS WHERE schemaname IN ('pg_catalog', 'information_schema') OR schemaname ~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_sys_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_xact_sys_tables (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.stat_xact_sys_tables%rowtype; + row_data dbe_perf.stat_xact_sys_tables%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_xact_sys_tables'''; + query_str := 'SELECT * FROM dbe_perf.stat_xact_sys_tables'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -4202,7 +3937,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_stat_xact_sys_tables AS SELECT * FROM DBE_PERF.get_global_stat_xact_sys_tables(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_xact_sys_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_xact_sys_tables (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT seq_scan bigint, OUT seq_tup_read bigint, @@ -4217,9 +3952,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.relname AS relname, T.schemaname AS schemaname, @@ -4233,9 +3968,9 @@ DECLARE T.n_tup_upd AS n_tup_upd, T.n_tup_del AS n_tup_del, T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_sys_tables T + FROM dbe_perf.stat_xact_sys_tables T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -4274,22 +4009,22 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_xact_user_tables AS WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND schemaname !~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_user_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_xact_user_tables (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.stat_xact_user_tables%rowtype; + row_data dbe_perf.stat_xact_user_tables%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''D'')'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_xact_user_tables'''; + query_str := 'SELECT * FROM dbe_perf.stat_xact_user_tables'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -4313,7 +4048,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_stat_xact_user_tables AS SELECT * FROM DBE_PERF.get_global_stat_xact_user_tables(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_xact_user_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_xact_user_tables (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT seq_scan bigint, OUT seq_tup_read bigint, @@ -4328,9 +4063,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''D'')'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.relname AS relname, T.schemaname AS schemaname, @@ -4344,9 +4079,9 @@ DECLARE T.n_tup_upd AS n_tup_upd, T.n_tup_del AS n_tup_del, T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_user_tables T + FROM dbe_perf.stat_xact_user_tables T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -4392,21 +4127,21 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_user_functions AS WHERE P.prolang != 12 -- fast check to eliminate built-in functions AND pg_stat_get_function_calls(P.oid) IS NOT NULL; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_user_functions +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_user_functions (OUT node_name name, OUT funcid oid, OUT schemaname name, OUT funcname name, OUT calls bigint, OUT total_time double precision, OUT self_time double precision) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.stat_user_functions%rowtype; + row_data dbe_perf.stat_user_functions%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_user_functions'''; + query_str := 'SELECT * FROM dbe_perf.stat_user_functions'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; funcid := row_data.funcid; @@ -4443,21 +4178,21 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_xact_user_functions AS WHERE P.prolang != 12 -- fast check to eliminate built-in functions AND pg_stat_get_xact_function_calls(P.oid) IS NOT NULL; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_user_functions +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_xact_user_functions (OUT node_name name, OUT funcid oid, OUT schemaname name, OUT funcname name, OUT calls bigint, OUT total_time double precision, OUT self_time double precision) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.stat_xact_user_functions%rowtype; + row_data dbe_perf.stat_xact_user_functions%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_xact_user_functions'''; + query_str := 'SELECT * FROM dbe_perf.stat_xact_user_functions'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; funcid := row_data.funcid; @@ -4485,7 +4220,7 @@ CREATE OR REPLACE VIEW DBE_PERF.summary_stat_xact_user_functions AS CREATE OR REPLACE VIEW DBE_PERF.stat_bad_block AS SELECT DISTINCT * from pg_stat_bad_block(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_bad_block +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_bad_block (OUT node_name TEXT, OUT databaseid INT4, OUT tablespaceid INT4, OUT relfilenode INT4, OUT forknum INT4, OUT error_count INT4, OUT first_time timestamp with time zone, OUT last_time timestamp with time zone) RETURNS setof record @@ -4496,9 +4231,9 @@ DECLARE query_str text; query_str_nodes text; BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_bad_block'''; + query_str := 'SELECT * FROM dbe_perf.stat_bad_block'; FOR each_node_out IN EXECUTE(query_str) LOOP node_name := row_name.node_name; databaseid := each_node_out.databaseid; @@ -4529,21 +4264,21 @@ CREATE OR REPLACE VIEW DBE_PERF.summary_stat_bad_block AS CREATE OR REPLACE VIEW DBE_PERF.file_redo_iostat AS SELECT * FROM pg_stat_get_redo_stat(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_file_redo_iostat +CREATE OR REPLACE FUNCTION dbe_perf.get_global_file_redo_iostat (OUT node_name name, OUT phywrts bigint, OUT phyblkwrt bigint, OUT writetim bigint, OUT avgiotim bigint, OUT lstiotim bigint, OUT miniotim bigint, OUT maxiowtm bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.file_redo_iostat%rowtype; + row_data dbe_perf.file_redo_iostat%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.file_redo_iostat'''; + query_str := 'SELECT * FROM dbe_perf.file_redo_iostat'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; phywrts := row_data.phywrts; @@ -4577,21 +4312,21 @@ CREATE OR REPLACE VIEW DBE_PERF.summary_file_redo_iostat AS CREATE OR REPLACE VIEW DBE_PERF.local_rel_iostat AS SELECT * FROM get_local_rel_iostat(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_rel_iostat +CREATE OR REPLACE FUNCTION dbe_perf.get_global_rel_iostat (OUT node_name name, OUT phyrds bigint, OUT phywrts bigint, OUT phyblkrd bigint, OUT phyblkwrt bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.local_rel_iostat%rowtype; + row_data dbe_perf.local_rel_iostat%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.local_rel_iostat'''; + query_str := 'SELECT * FROM dbe_perf.local_rel_iostat'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; phyrds := row_data.phyrds; @@ -4618,22 +4353,22 @@ CREATE OR REPLACE VIEW DBE_PERF.summary_rel_iostat AS CREATE OR REPLACE VIEW DBE_PERF.file_iostat AS SELECT * FROM pg_stat_get_file_stat(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_file_iostat +CREATE OR REPLACE FUNCTION dbe_perf.get_global_file_iostat (OUT node_name name, OUT filenum oid, OUT dbid oid, OUT spcid oid, OUT phyrds bigint, OUT phywrts bigint, OUT phyblkrd bigint, OUT phyblkwrt bigint, OUT readtim bigint, OUT writetim bigint, OUT avgiotim bigint, OUT lstiotim bigint, OUT miniotim bigint, OUT maxiowtm bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.file_iostat%rowtype; + row_data dbe_perf.file_iostat%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.file_iostat'''; + query_str := 'SELECT * FROM dbe_perf.file_iostat'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; filenum := row_data.filenum; @@ -4674,7 +4409,7 @@ CREATE OR REPLACE VIEW DBE_PERF.summary_file_iostat AS CREATE OR REPLACE VIEW DBE_PERF.locks AS SELECT * FROM pg_lock_status() AS L; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_locks +CREATE OR REPLACE FUNCTION dbe_perf.get_global_locks (OUT node_name name, OUT locktype text, OUT database oid, @@ -4694,15 +4429,15 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_locks RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.locks%rowtype; + row_data dbe_perf.locks%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.locks'''; + query_str := 'SELECT * FROM dbe_perf.locks'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; locktype := row_data.locktype; @@ -4711,7 +4446,7 @@ DECLARE page := row_data.page; tuple := row_data.tuple; virtualxid := row_data.virtualxid; - transactionid := row_data.classid; + transactionid := row_data.transactionid; objid := row_data.objid; objsubid := row_data.objsubid; virtualtransaction := row_data.virtualtransaction; @@ -4745,7 +4480,7 @@ CREATE OR REPLACE VIEW DBE_PERF.replication_slots AS FROM pg_get_replication_slots() AS L LEFT JOIN pg_database D ON (L.datoid = D.oid); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_replication_slots +CREATE OR REPLACE FUNCTION dbe_perf.get_global_replication_slots (OUT node_name name, OUT slot_name text, OUT plugin text, @@ -4760,15 +4495,15 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_replication_slots RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.replication_slots%rowtype; + row_data dbe_perf.replication_slots%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.replication_slots'''; + query_str := 'SELECT * FROM dbe_perf.replication_slots'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; slot_name := row_data.slot_name; @@ -4805,7 +4540,7 @@ CREATE OR REPLACE VIEW DBE_PERF.bgwriter_stat AS pg_stat_get_buf_alloc() AS buffers_alloc, pg_stat_get_bgwriter_stat_reset_time() AS stats_reset; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_bgwriter_stat +CREATE OR REPLACE FUNCTION dbe_perf.get_global_bgwriter_stat (OUT node_name name, OUT checkpoints_timed bigint, OUT checkpoints_req bigint, @@ -4821,15 +4556,15 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_bgwriter_stat RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.bgwriter_stat%rowtype; + row_data dbe_perf.bgwriter_stat%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.bgwriter_stat'''; + query_str := 'SELECT * FROM dbe_perf.bgwriter_stat'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; checkpoints_timed := row_data.checkpoints_timed; @@ -4875,7 +4610,7 @@ CREATE OR REPLACE VIEW DBE_PERF.replication_stat AS WHERE S.usesysid = U.oid AND S.pid = W.sender_pid; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_replication_stat +CREATE OR REPLACE FUNCTION dbe_perf.get_global_replication_stat (OUT node_name name, OUT pid bigint, OUT usesysid oid, @@ -4895,15 +4630,15 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_replication_stat RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.replication_stat%rowtype; + row_data dbe_perf.replication_stat%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.replication_stat'''; + query_str := 'SELECT * FROM dbe_perf.replication_stat'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; pid := row_data.pid; @@ -4929,82 +4664,23 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_replication_stat AS SELECT * FROM DBE_PERF.get_global_replication_stat(); -CREATE OR REPLACE VIEW DBE_PERF.pooler_status AS - SELECT - S.database_name AS database, - S.user_name AS user_name, - S.tid AS tid, - S.node_oid AS node_oid, - D.node_name AS node_name, - S.in_use AS in_use, - D.node_port AS node_port, - S.fdsock AS fdsock, - S.remote_pid AS remote_pid, - S.session_params AS session_params - FROM pgxc_node D, pg_stat_get_pooler_status() AS S - WHERE D.oid = S.node_oid; - -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_pooler_status - (OUT source_node_name name, - OUT database text, - OUT user_name text, - OUT tid bigint, - OUT node_oid bigint, - OUT node_name name, - OUT in_use boolean, - OUT fdsock bigint, - OUT remote_pid bigint, - OUT session_params text) -RETURNS setof record -AS $$ -DECLARE - row_data DBE_PERF.pooler_status%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.pooler_status'''; - FOR row_data IN EXECUTE(query_str) LOOP - source_node_name := row_name.node_name; - database := row_data.database; - user_name := row_data.user_name; - tid := row_data.tid; - node_oid := row_data.node_oid; - node_name := row_data.node_name; - in_use := row_data.in_use; - fdsock := row_data.fdsock; - remote_pid := row_data.remote_pid; - session_params := row_data.session_params; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW DBE_PERF.global_pooler_status AS - SELECT * FROM DBE_PERF.get_global_pooler_status(); - /* transaction */ CREATE OR REPLACE VIEW DBE_PERF.transactions_running_xacts AS SELECT * FROM pg_get_running_xacts(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_transactions_running_xacts() -RETURNS setof DBE_PERF.transactions_running_xacts +CREATE OR REPLACE FUNCTION dbe_perf.get_global_transactions_running_xacts() +RETURNS setof dbe_perf.transactions_running_xacts AS $$ DECLARE - row_data DBE_PERF.transactions_running_xacts%rowtype; + row_data dbe_perf.transactions_running_xacts%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn dn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.transactions_running_xacts'''; + query_str := 'SELECT * FROM dbe_perf.transactions_running_xacts'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -5016,19 +4692,19 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_transactions_running_xacts AS SELECT DISTINCT * from DBE_PERF.get_global_transactions_running_xacts(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_transactions_running_xacts() -RETURNS setof DBE_PERF.transactions_running_xacts +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_transactions_running_xacts() +RETURNS setof dbe_perf.transactions_running_xacts AS $$ DECLARE - row_data DBE_PERF.transactions_running_xacts%rowtype; + row_data dbe_perf.transactions_running_xacts%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.transactions_running_xacts'''; + query_str := 'SELECT * FROM dbe_perf.transactions_running_xacts'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -5047,19 +4723,19 @@ CREATE OR REPLACE VIEW DBE_PERF.transactions_prepared_xacts AS LEFT JOIN pg_authid U ON P.ownerid = U.oid LEFT JOIN pg_database D ON P.dbid = D.oid; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_transactions_prepared_xacts() -RETURNS setof DBE_PERF.transactions_prepared_xacts +CREATE OR REPLACE FUNCTION dbe_perf.get_global_transactions_prepared_xacts() +RETURNS setof dbe_perf.transactions_prepared_xacts AS $$ DECLARE - row_data DBE_PERF.transactions_prepared_xacts%rowtype; + row_data dbe_perf.transactions_prepared_xacts%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn dn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.transactions_prepared_xacts'''; + query_str := 'SELECT * FROM dbe_perf.transactions_prepared_xacts'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -5071,19 +4747,19 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_transactions_prepared_xacts AS SELECT DISTINCT * FROM DBE_PERF.get_global_transactions_prepared_xacts(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_transactions_prepared_xacts() -RETURNS setof DBE_PERF.transactions_prepared_xacts +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_transactions_prepared_xacts() +RETURNS setof dbe_perf.transactions_prepared_xacts AS $$ DECLARE - row_data DBE_PERF.transactions_prepared_xacts%rowtype; + row_data dbe_perf.transactions_prepared_xacts%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.transactions_prepared_xacts'''; + query_str := 'SELECT * FROM dbe_perf.transactions_prepared_xacts'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -5099,19 +4775,19 @@ CREATE OR REPLACE VIEW DBE_PERF.summary_transactions_prepared_xacts AS CREATE OR REPLACE VIEW DBE_PERF.statement AS SELECT * FROM get_instr_unique_sql(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statement() -RETURNS setof DBE_PERF.statement +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statement() +RETURNS setof dbe_perf.statement AS $$ DECLARE - row_data DBE_PERF.statement%rowtype; + row_data dbe_perf.statement%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement'''; + query_str := 'SELECT * FROM dbe_perf.statement'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -5153,19 +4829,19 @@ CREATE OR REPLACE VIEW DBE_PERF.statement_count AS min_delete_elapse FROM pg_stat_get_sql_count(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_count() -RETURNS setof DBE_PERF.statement_count +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statement_count() +RETURNS setof dbe_perf.statement_count AS $$ DECLARE - row_data DBE_PERF.statement_count%rowtype; + row_data dbe_perf.statement_count%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement_count'''; + query_str := 'SELECT * FROM dbe_perf.statement_count'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -5202,7 +4878,7 @@ CREATE OR REPLACE VIEW DBE_PERF.summary_statement_count AS CREATE OR REPLACE VIEW DBE_PERF.config_settings AS SELECT * FROM pg_show_all_settings(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_config_settings +CREATE OR REPLACE FUNCTION dbe_perf.get_global_config_settings (out node_name text, out name text, out setting text, @@ -5223,14 +4899,14 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_config_settings RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.config_settings%rowtype; + row_data dbe_perf.config_settings%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.config_settings'''; + query_str := 'SELECT * FROM dbe_perf.config_settings'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; name := row_data.name; @@ -5263,19 +4939,19 @@ CREATE OR REPLACE VIEW DBE_PERF.global_config_settings AS CREATE OR REPLACE VIEW DBE_PERF.wait_events AS SELECT * FROM get_instr_wait_event(NULL); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_wait_events() -RETURNS setof DBE_PERF.wait_events +CREATE OR REPLACE FUNCTION dbe_perf.get_global_wait_events() +RETURNS setof dbe_perf.wait_events AS $$ DECLARE - row_data DBE_PERF.wait_events%rowtype; + row_data dbe_perf.wait_events%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.wait_events'''; + query_str := 'SELECT * FROM dbe_perf.wait_events'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -5287,7 +4963,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_wait_events AS SELECT * FROM DBE_PERF.get_global_wait_events(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_statement_responsetime_percentile(OUT p80 bigint, OUT p95 bigint) +CREATE OR REPLACE FUNCTION dbe_perf.get_statement_responsetime_percentile(OUT p80 bigint, OUT p95 bigint) RETURNS SETOF RECORD AS $$ DECLARE @@ -5296,9 +4972,9 @@ DECLARE QUERY_STR TEXT; QUERY_STR_NODES TEXT; BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'') and nodeis_central = true and nodeis_active = true'; + QUERY_STR_NODES := 'select * from dbe_perf.node_name'; FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM get_instr_rt_percentile(0)'''; + QUERY_STR := 'SELECT * FROM get_instr_rt_percentile(0)'; FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP p80 = ROW_DATA."P80"; p95 = ROW_DATA."P95"; @@ -5316,18 +4992,18 @@ CREATE OR REPLACE VIEW DBE_PERF.statement_responsetime_percentile AS CREATE OR REPLACE VIEW DBE_PERF.user_login AS SELECT * FROM get_instr_user_login(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_user_login() -RETURNS SETOF DBE_PERF.user_login +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_user_login() +RETURNS SETOF dbe_perf.user_login AS $$ DECLARE - ROW_DATA DBE_PERF.user_login%ROWTYPE; + ROW_DATA dbe_perf.user_login%ROWTYPE; ROW_NAME RECORD; QUERY_STR TEXT; QUERY_STR_NODES TEXT; BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE=''C'' AND nodeis_active = true'; + QUERY_STR_NODES := 'select * from dbe_perf.node_name'; FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.user_login'''; + QUERY_STR := 'SELECT * FROM dbe_perf.user_login'; FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP RETURN NEXT ROW_DATA; END LOOP; @@ -5348,7 +5024,7 @@ CREATE OR REPLACE VIEW DBE_PERF.class_vital_info AS FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE C.relkind IN ('r', 't', 'i'); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_record_reset_time(OUT node_name text, OUT reset_time timestamp with time zone) +CREATE OR REPLACE FUNCTION dbe_perf.get_global_record_reset_time(OUT node_name text, OUT reset_time timestamp with time zone) RETURNS setof record AS $$ DECLARE @@ -5357,9 +5033,9 @@ DECLARE query_str text; query_str_nodes text; BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select * from get_node_stat_reset_time()'''; + query_str := 'select * from get_node_stat_reset_time()'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; reset_time := row_data.get_node_stat_reset_time; @@ -5370,42 +5046,24 @@ DECLARE END; $$ LANGUAGE 'plpgsql'; -CREATE OR REPLACE VIEW DBE_PERF.global_ckpt_status AS - SELECT node_name,ckpt_redo_point,ckpt_clog_flush_num,ckpt_csnlog_flush_num,ckpt_multixact_flush_num,ckpt_predicate_flush_num,ckpt_twophase_flush_num - FROM pg_catalog.remote_ckpt_stat() - UNION ALL +CREATE OR REPLACE VIEW dbe_perf.global_ckpt_status AS SELECT node_name,ckpt_redo_point,ckpt_clog_flush_num,ckpt_csnlog_flush_num,ckpt_multixact_flush_num,ckpt_predicate_flush_num,ckpt_twophase_flush_num FROM pg_catalog.local_ckpt_stat(); -CREATE OR REPLACE VIEW DBE_PERF.global_double_write_status AS - SELECT node_name, curr_dwn, curr_start_page, file_trunc_num, file_reset_num, - total_writes, low_threshold_writes, high_threshold_writes, - total_pages, low_threshold_pages, high_threshold_pages - FROM pg_catalog.remote_double_write_stat() - UNION ALL +CREATE OR REPLACE VIEW dbe_perf.global_double_write_status AS SELECT node_name, curr_dwn, curr_start_page, file_trunc_num, file_reset_num, total_writes, low_threshold_writes, high_threshold_writes, total_pages, low_threshold_pages, high_threshold_pages FROM pg_catalog.local_double_write_stat(); -CREATE OR REPLACE VIEW DBE_PERF.global_pagewriter_status AS - SELECT node_name,pgwr_actual_flush_total_num,pgwr_last_flush_num,remain_dirty_page_num,queue_head_page_rec_lsn,queue_rec_lsn,current_xlog_insert_lsn,ckpt_redo_point FROM pg_catalog.remote_pagewriter_stat() - UNION ALL +CREATE OR REPLACE VIEW dbe_perf.global_pagewriter_status AS SELECT node_name,pgwr_actual_flush_total_num,pgwr_last_flush_num,remain_dirty_page_num,queue_head_page_rec_lsn,queue_rec_lsn,current_xlog_insert_lsn,ckpt_redo_point FROM pg_catalog.local_pagewriter_stat(); CREATE OR REPLACE VIEW DBE_PERF.global_record_reset_time AS SELECT * FROM DBE_PERF.get_global_record_reset_time(); -CREATE OR REPLACE VIEW DBE_PERF.global_redo_status AS - SELECT node_name, redo_start_ptr, redo_start_time, redo_done_time, curr_time, - min_recovery_point, read_ptr, last_replayed_read_ptr, recovery_done_ptr, - read_xlog_io_counter, read_xlog_io_total_dur, read_data_io_counter, read_data_io_total_dur, - write_data_io_counter, write_data_io_total_dur, process_pending_counter, process_pending_total_dur, - apply_counter, apply_total_dur, - speed, local_max_ptr, primary_flush_ptr, worker_info - FROM pg_catalog.remote_redo_stat() - UNION ALL +CREATE OR REPLACE VIEW dbe_perf.global_redo_status AS SELECT node_name, redo_start_ptr, redo_start_time, redo_done_time, curr_time, min_recovery_point, read_ptr, last_replayed_read_ptr, recovery_done_ptr, read_xlog_io_counter, read_xlog_io_total_dur, read_data_io_counter, read_data_io_total_dur, @@ -5414,35 +5072,29 @@ CREATE OR REPLACE VIEW DBE_PERF.global_redo_status AS speed, local_max_ptr, primary_flush_ptr, worker_info FROM pg_catalog.local_redo_stat(); -CREATE OR REPLACE VIEW DBE_PERF.global_rto_status AS -SELECT node_name, rto_info - FROM pg_catalog.remote_rto_stat() - UNION ALL +CREATE OR REPLACE VIEW dbe_perf.global_rto_status AS SELECT node_name, rto_info FROM pg_catalog.local_rto_stat(); -CREATE OR REPLACE VIEW DBE_PERF.global_recovery_status AS -SELECT node_name, standby_node_name, source_ip, source_port, dest_ip, dest_port, current_rto, target_rto, current_sleep_time - FROM pg_catalog.remote_recovery_status() - UNION ALL +CREATE OR REPLACE VIEW dbe_perf.global_recovery_status AS SELECT node_name, standby_node_name, source_ip, source_port, dest_ip, dest_port, current_rto, target_rto, current_sleep_time FROM pg_catalog.local_recovery_status(); CREATE OR REPLACE VIEW DBE_PERF.local_threadpool_status AS SELECT * FROM threadpool_status(); -CREATE OR REPLACE FUNCTION DBE_PERF.global_threadpool_status() -RETURNS SETOF DBE_PERF.local_threadpool_status +CREATE OR REPLACE FUNCTION dbe_perf.global_threadpool_status() +RETURNS SETOF dbe_perf.local_threadpool_status AS $$ DECLARE - ROW_DATA DBE_PERF.local_threadpool_status%ROWTYPE; + ROW_DATA dbe_perf.local_threadpool_status%ROWTYPE; ROW_NAME RECORD; QUERY_STR TEXT; QUERY_STR_NODES TEXT; BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'') AND nodeis_active=true'; + QUERY_STR_NODES := 'select * from dbe_perf.node_name'; FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.local_threadpool_status'''; + QUERY_STR := 'SELECT * FROM dbe_perf.local_threadpool_status'; FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP RETURN NEXT ROW_DATA; END LOOP; @@ -5457,77 +5109,15 @@ CREATE OR REPLACE VIEW DBE_PERF.global_threadpool_status AS CREATE OR REPLACE VIEW DBE_PERF.local_plancache_status AS SELECT * FROM plancache_status(); -CREATE OR REPLACE FUNCTION DBE_PERF.global_plancache_status() -RETURNS SETOF DBE_PERF.local_plancache_status -AS $$ -DECLARE - ROW_DATA DBE_PERF.local_plancache_status%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; -BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'') and nodeis_active=true'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.local_plancache_status'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - END LOOP; - RETURN; -END; $$ -LANGUAGE 'plpgsql'; - -CREATE OR REPLACE VIEW DBE_PERF.global_plancache_status AS - SELECT * FROM DBE_PERF.global_plancache_status(); +CREATE VIEW DBE_PERF.global_plancache_status AS + SELECT * FROM pg_catalog.plancache_status(); CREATE OR REPLACE VIEW DBE_PERF.local_prepare_statement_status AS SELECT * FROM prepare_statement_status(); -CREATE OR REPLACE FUNCTION DBE_PERF.global_prepare_statement_status() -RETURNS SETOF DBE_PERF.local_prepare_statement_status -AS $$ -DECLARE - ROW_DATA DBE_PERF.local_prepare_statement_status%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; -BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'') and nodeis_active=true'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.local_prepare_statement_status'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - END LOOP; - RETURN; -END; $$ -LANGUAGE 'plpgsql'; - -CREATE OR REPLACE VIEW DBE_PERF.global_prepare_statement_status AS - SELECT * FROM DBE_PERF.global_prepare_statement_status(); - CREATE OR REPLACE VIEW DBE_PERF.local_plancache_clean AS SELECT * FROM plancache_clean(); -CREATE OR REPLACE FUNCTION DBE_PERF.global_plancache_clean() -RETURNS BOOLEAN -AS $$ -DECLARE - ROW_DATA record; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; -BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''D'') and nodeis_active=true'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * from DBE_PERF.local_plancache_clean'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - END LOOP; - END LOOP; - RETURN TRUE; -END; $$ -LANGUAGE 'plpgsql'; - CREATE OR REPLACE VIEW DBE_PERF.gs_slow_query_info AS SELECT S.dbname, @@ -5592,11 +5182,11 @@ SELECT S.data_io_time FROM pg_stat_get_wlm_session_info(0) S where S.is_slow_query = 1; -CREATE OR REPLACE FUNCTION DBE_PERF.global_slow_query_history -RETURNS setof DBE_PERF.gs_slow_query_history +CREATE OR REPLACE FUNCTION dbe_perf.global_slow_query_history +RETURNS setof dbe_perf.gs_slow_query_history AS $$ DECLARE - row_data DBE_PERF.gs_slow_query_history%rowtype; + row_data dbe_perf.gs_slow_query_history%rowtype; row_name record; query_str text; query_str_nodes text; @@ -5604,7 +5194,7 @@ DECLARE --Get all the node names query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.gs_slow_query_history'''; + query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM dbe_perf.gs_slow_query_history'''; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -5670,299 +5260,10 @@ SELECT * FROM DBE_PERF.global_slow_query_info(); CREATE OR REPLACE VIEW DBE_PERF.local_active_session AS SELECT * FROM pg_catalog.get_local_active_session(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_active_session - (OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) -RETURNS SETOF record -AS $$ -DECLARE - ROW_DATA DBE_PERF.local_active_session%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; -BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'')'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.local_active_session'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := ROW_NAME.NODE_NAME; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - unique_query := ROW_DATA.unique_query; - RETURN NEXT; - END LOOP; - END LOOP; - RETURN; -END; $$ -LANGUAGE 'plpgsql'; - -CREATE OR REPLACE VIEW DBE_PERF.global_active_session AS - SELECT * FROM DBE_PERF.get_global_active_session(); - -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_pg_asp - (OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) -RETURNS SETOF record -AS $$ -DECLARE - ROW_DATA pg_catalog.pg_asp%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; -BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'')'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM pg_asp'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := ROW_NAME.NODE_NAME; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - unique_query := ROW_DATA.unique_query; - RETURN NEXT; - END LOOP; - END LOOP; - RETURN; -END; $$ -LANGUAGE 'plpgsql'; - -CREATE OR REPLACE VIEW DBE_PERF.global_pg_asp AS - SELECT * FROM DBE_PERF.get_global_pg_asp(); CREATE OR REPLACE VIEW DBE_PERF.wait_event_info AS SELECT * FROM get_wait_event_info(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_datanode_active_session -( in datanode text, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) -RETURNS SETOF record -AS $$ -DECLARE - row_data DBE_PERF.local_active_session%rowtype; - cn_name record; - query_text record; - QUERY_STR text; - query_cn text; - query_str_cn_name text; -BEGIN - --Get all the node names - QUERY_STR := 'EXECUTE DIRECT ON (' || $1 || ') ''SELECT * FROM DBE_PERF.local_active_session'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - IF ROW_DATA.cn_id IS NULL THEN - unique_query := ROW_DATA.unique_query; - ELSE - query_str_cn_name := 'SELECT node_name FROM pgxc_node WHERE node_id='||ROW_DATA.cn_id||' AND nodeis_active = true'; - FOR cn_name IN EXECUTE(query_str_cn_name) LOOP - query_cn := 'EXECUTE DIRECT ON (' || cn_name.node_name || ') ''SELECT unique_query FROM DBE_PERF.local_active_session where unique_query_id = '|| ROW_DATA.unique_query_id||' limit 1'''; - FOR query_text IN EXECUTE(query_cn) LOOP - unique_query := query_text.unique_query; - END LOOP; - END LOOP; - END IF; - RETURN NEXT; - END LOOP; - RETURN; -END; $$ -LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION DBE_PERF.get_datanode_active_session_hist -( in datanode text, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) -RETURNS SETOF record -AS $$ -DECLARE - ROW_DATA pg_catalog.pg_asp%ROWTYPE; - cn_name record; - query_text record; - QUERY_STR text; - query_cn text; - query_str_cn_name text; -BEGIN - --Get all the node names - QUERY_STR := 'EXECUTE DIRECT ON (' || $1 || ') ''SELECT * FROM pg_catalog.pg_asp'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - IF ROW_DATA.cn_id IS NULL THEN - unique_query := ROW_DATA.unique_query; - ELSE - query_str_cn_name := 'SELECT node_name FROM pgxc_node WHERE node_id='||ROW_DATA.cn_id||' AND nodeis_active = true'; - FOR cn_name IN EXECUTE(query_str_cn_name) LOOP - query_cn := 'EXECUTE DIRECT ON (' || cn_name.node_name || ') ''SELECT unique_query FROM pg_catalog.pg_asp where unique_query_id = '|| ROW_DATA.unique_query_id||' limit 1'''; - FOR query_text IN EXECUTE(query_cn) LOOP - unique_query := query_text.unique_query; - END LOOP; - END LOOP; - END IF; - RETURN NEXT; - END LOOP; - RETURN; -END; $$ -LANGUAGE 'plpgsql'; - grant select on all tables in schema DBE_PERF to public; DROP INDEX IF EXISTS pg_catalog.pg_asp_oid_index; @@ -5974,49 +5275,6 @@ CREATE EXTENSION security_plugin; DROP FUNCTION IF EXISTS pg_catalog.gs_stat_activity_timeout() cascade; DROP FUNCTION IF EXISTS pg_catalog.global_stat_activity_timeout() cascade; -DO $DO$ -DECLARE - ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 4520; - CREATE OR REPLACE FUNCTION dbe_perf.gs_stat_activity_timeout(IN timeout_threshold int4, OUT datid oid, OUT pid INT8, OUT sessionid INT8, OUT usesysid oid, OUT application_name text, OUT query text, OUT xact_start timestamptz, OUT query_start timestamptz, OUT query_id INT8) - RETURNS SETOF RECORD LANGUAGE INTERNAL as 'gs_stat_activity_timeout'; - - SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 0; - CREATE OR REPLACE FUNCTION dbe_perf.global_stat_activity_timeout(in execute_time int4, out nodename text, out datid oid, out pid int8, out sessionid int8, out usesysid oid, out application_name text, out query text, out xact_start timestamptz, out query_start timestamptz, out query_id int8) - RETURNS setof record - AS $$ - DECLARE - query_str text; - node_data record; - row_data record; - BEGIN - --Get the node names of all CNs - query_str := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR node_data IN EXECUTE(query_str) LOOP - query_str := 'EXECUTE DIRECT ON (' || node_data.node_name || ') ''SELECT * FROM dbe_perf.gs_stat_activity_timeout(' || execute_time || ')'''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename := node_data.node_name; - datid := row_data.datid; - pid := row_data.pid; - sessionid := row_data.sessionid; - usesysid := row_data.usesysid; - application_name := row_data.application_name; - query := row_data.query; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - query_id := row_data.query_id; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - end if; -END$DO$; - DROP FUNCTION IF EXISTS remove_create_partition_policy(name, name); DROP FUNCTION IF EXISTS remove_drop_partition_policy(name, name); DROP FUNCTION IF EXISTS is_super_user_or_sysadm(name); @@ -6287,40 +5545,6 @@ END; $$ LANGUAGE plpgsql NOT FENCED; --get audit log from all CNs -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_query_audit(IN starttime TIMESTAMPTZ, IN endtime TIMESTAMPTZ, OUT "time" TIMESTAMPTZ, OUT "type" text, OUT "result" text, OUT userid text, OUT username text, OUT database text, OUT client_conninfo text, OUT "object_name" text, OUT detail_info text, OUT node_name text, OUT thread_id text, OUT local_port text, OUT remote_port text) -RETURNS setof record -AS $$ -DECLARE - row_name record; - row_data record; - query_str text; - query_str_nodes text; - BEGIN - --Get the node names of all CNs - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_query_audit(''''' || starttime || ''''',''''' || endtime || ''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - "time" := row_data."time"; - "type" := row_data."type"; - "result" := row_data."result"; - userid := row_data.userid; - username := row_data.username; - database := row_data.database; - client_conninfo := row_data.client_conninfo; - "object_name" := row_data."object_name"; - detail_info := row_data.detail_info; - node_name := row_data.node_name; - thread_id := row_data.thread_id; - local_port := row_data.local_port; - remote_port := row_data.remote_port; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - DO $DO$ DECLARE ans boolean; @@ -6334,37 +5558,6 @@ BEGIN SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 4520; CREATE OR REPLACE FUNCTION dbe_perf.gs_stat_activity_timeout(IN timeout_threshold int4, OUT database name, OUT pid INT8, OUT sessionid INT8, OUT usesysid oid, OUT application_name text, OUT query text, OUT xact_start timestamptz, OUT query_start timestamptz, OUT query_id INT8) RETURNS SETOF RECORD LANGUAGE INTERNAL as 'gs_stat_activity_timeout'; - - SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 0; - CREATE OR REPLACE FUNCTION dbe_perf.global_stat_activity_timeout(in execute_time int4, out nodename text, out database name, out pid int8, out sessionid int8, out usesysid oid, out application_name text, out query text, out xact_start timestamptz, out query_start timestamptz, out query_id int8) - RETURNS setof record - AS $$ - DECLARE - query_str text; - node_data record; - row_data record; - BEGIN - --Get the node names of all CNs - query_str := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR node_data IN EXECUTE(query_str) LOOP - query_str := 'EXECUTE DIRECT ON (' || node_data.node_name || ') ''SELECT * FROM dbe_perf.gs_stat_activity_timeout(' || execute_time || ')'''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename := node_data.node_name; - database := row_data.database; - pid := row_data.pid; - sessionid := row_data.sessionid; - usesysid := row_data.usesysid; - application_name := row_data.application_name; - query := row_data.query; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - query_id := row_data.query_id; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; end if; END$DO$; @@ -6380,8 +5573,6 @@ CREATE OR REPLACE FUNCTION pkg_service.job_submit( IMMUTABLE NOT SHIPPABLE as 'job_submit'; - DROP VIEW IF EXISTS DBE_PERF.global_prepare_statement_status CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.global_prepare_statement_status() CASCADE; DROP VIEW IF EXISTS DBE_PERF.local_prepare_statement_status CASCADE; DROP FUNCTION IF EXISTS pg_catalog.prepare_statement_status() CASCADE; set local inplace_upgrade_next_system_object_oids = IUO_PROC,3959; @@ -6389,28 +5580,6 @@ as 'job_submit'; CREATE VIEW DBE_PERF.local_prepare_statement_status AS SELECT * FROM prepare_statement_status(); - CREATE OR REPLACE FUNCTION DBE_PERF.global_prepare_statement_status() - RETURNS SETOF DBE_PERF.local_prepare_statement_status - AS $$ - DECLARE - ROW_DATA DBE_PERF.local_prepare_statement_status%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'') and nodeis_active=true'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.local_prepare_statement_status'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE VIEW DBE_PERF.global_prepare_statement_status AS - SELECT * FROM DBE_PERF.global_prepare_statement_status(); DECLARE user_name text; @@ -6421,181 +5590,10 @@ as 'job_submit'; query_str := 'GRANT ALL ON TABLE DBE_PERF.local_prepare_statement_status TO ' || quote_ident(user_name) || ';'; EXECUTE IMMEDIATE query_str; - query_str := 'GRANT ALL ON TABLE DBE_PERF.global_prepare_statement_status TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - END; / GRANT SELECT ON TABLE DBE_PERF.local_prepare_statement_status TO PUBLIC; - GRANT SELECT ON TABLE DBE_PERF.global_prepare_statement_status TO PUBLIC; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS DBE_PERF.get_global_pg_asp - (in start_ts timestamp without time zone, - in end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_datanode_active_session_hist - (in datanode text, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_datanode_active_session_hist - (in datanode text, - in start_ts timestamp without time zone, - in end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) cascade; - CREATE OR REPLACE FUNCTION DBE_PERF.get_datanode_active_session_hist - (in datanode text, - in start_ts timestamp without time zone, - in end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA pg_catalog.gs_asp%ROWTYPE; - cn_name record; - query_text record; - QUERY_STR text; - query_cn text; - query_str_cn_name text; - node_str text; - BEGIN - --Get all the node names - node_str := 'SELECT * FROM pg_catalog.gs_asp where sample_time > '''''||$2||''''' and sample_time < '''''||$3||''''; - QUERY_STR := 'EXECUTE DIRECT ON (' || $1 || ') '''|| node_str ||''''';'; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := datanode; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - IF ROW_DATA.cn_id IS NULL THEN - unique_query := ROW_DATA.unique_query; - ELSE - query_str_cn_name := 'SELECT node_name FROM pgxc_node WHERE node_id='||ROW_DATA.cn_id||' AND nodeis_active = true'; - FOR cn_name IN EXECUTE(query_str_cn_name) LOOP - query_cn := 'EXECUTE DIRECT ON (' || cn_name.node_name || ') ''SELECT unique_query FROM pg_catalog.gs_asp where unique_query_id = '|| ROW_DATA.unique_query_id||' limit 1'''; - FOR query_text IN EXECUTE(query_cn) LOOP - unique_query := query_text.unique_query; - END LOOP; - END LOOP; - END IF; - RETURN NEXT; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - end if; -END$DO$; drop function if exists pg_catalog.login_audit_messages(boolean); drop function if exists pg_catalog.login_audit_messages_pid(boolean); @@ -7171,113 +6169,6 @@ CREATE OR REPLACE VIEW pg_catalog.DV_SESSIONS AS LEFT JOIN pg_authid ad ON(sa.usesysid = ad.oid) WHERE sa.application_name <> 'JobScheduler'; -CREATE OR REPLACE FUNCTION pg_catalog.pg_nodes_memmon(OUT InnerNName text, OUT InnerUsedMem int8, OUT InnerTopCtxt int8, OUT NName text, OUT UsedMem text, OUT SharedBufferCache text, OUT TopContext text) -RETURNS setof record -AS $$ -DECLARE - enable_threadpool bool; - row_data record; - row_data1 record; - row_name record; - query_str text; - query_str1 text; - shared_bcache text; - query_str_nodes text; - itr integer; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select ''''N_name'''' as nname1, sum(usedsize) as usedmem1 from pv_session_memory_detail where 1=1 '''; - query_str1 := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select contextname as contextname1, sum(usedsize) as usedsize1 from pv_session_memory_detail group by contextname order by usedsize1 desc limit 3 '''; - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.nname1 := CASE - WHEN pg_catalog.LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-pg_catalog.length(row_name.node_name)) - ELSE pg_catalog.SUBSTR(row_name.node_name,1,20) - END; - - InnerNName := row_data.nname1; - NName := row_data.nname1; - InnerUsedMem := row_data.usedmem1; - UsedMem := pg_size_pretty(row_data.usedmem1); - - EXECUTE 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT pg_size_pretty(count(*) * 8192) || ''''(Utilization: '''' || pg_size_pretty((SELECT setting FROM pg_settings WHERE name =''''shared_buffers'''') * 8192) || ''''/'''' || round(count(*)/(SELECT setting FROM pg_settings WHERE name =''''shared_buffers''''),2)*100 || ''''%)'''' FROM pg_buffercache_pages() WHERE relfilenode IS NOT NULL ''' - INTO shared_bcache; - - SharedBufferCache := shared_bcache; - - itr := 1; - FOR row_data1 IN EXECUTE(query_str1) LOOP - --We should have 3 return rows - TopContext := row_data1.contextname1 || '(' || pg_size_pretty(row_data1.usedsize1) || ')'; - InnerTopCtxt := row_data1.usedsize1; - IF itr = 1 THEN - RETURN next; - ELSE - NName := ''; - UsedMem := ''; - SharedBufferCache := ''; - RETURN next; - END IF; - itr := itr + 1; - END LOOP; - END LOOP; - END LOOP; - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.distributed_count(IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - total_num bigint; - flag boolean; - special text := '[;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN _table_name, IN special; - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - RETURN; - END IF; - EXECUTE 'SELECT count(1) FROM ' || _table_name - INTO total_num; - - --Get the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node, pgxc_class where node_type IN (''C'', ''D'') AND is_oid_in_group_members(oid, nodeoids) AND - pcrelid=''' || _table_name || '''::regclass::oid'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select ''''DN_name'''' as dnname1, count(1) as count1 from ' || $1 || ''''; - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.dnname1 := CASE - WHEN pg_catalog.LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-pg_catalog.length(row_name.node_name)) - ELSE pg_catalog.SUBSTR(row_name.node_name,1,20) - END; - DNName := row_data.dnname1; - Num := row_data.count1; - IF total_num = 0 THEN - Ratio := 0.000 ||'%'; - ELSE - Ratio := ROUND(row_data.count1/total_num*100,3) || '%'; - END IF; - RETURN next; - END LOOP; - END LOOP; - - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - CREATE OR REPLACE FUNCTION pg_catalog.login_audit_messages(in flag boolean) returns table (username text, database text, logintime timestamp with time zone, mytype text, result text, client_conninfo text) AUTHID DEFINER AS $$ DECLARE @@ -7448,30 +6339,6 @@ LANGUAGE plpgsql NOT FENCED; CREATE OR REPLACE VIEW pg_catalog.pg_thread_wait_status AS SELECT * FROM pg_catalog.pg_stat_get_status(NULL); -create or replace function pg_catalog.pgxc_cgroup_map_ng_conf(IN ngname text) -returns bool -AS $$ -declare - host_info record; - query_str text; - query_string text; - flag boolean; - special text := '[^A-z0-9_]'; -begin - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN ngname, IN special; - IF flag = true THEN - return false; - ELSE - query_str = 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - for host_info in execute(query_str) loop - query_string := 'execute direct on (' || host_info.node_name || ') ''SELECT * from pg_catalog.gs_cgroup_map_ng_conf(''''' || ngname || ''''')'''; - execute query_string; - end loop; - END IF; - return true; -end; -$$language plpgsql NOT FENCED; - create or replace function pg_catalog.table_skewness(table_name text, column_name text, OUT seqNum text, OUT Num text, OUT Ratio text, row_num text default '0') RETURNS setof record @@ -7669,33 +6536,6 @@ DECLARE END; $$ LANGUAGE 'plpgsql' NOT FENCED; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_delta_info(IN rel TEXT, OUT node_name TEXT, OUT part_name TEXT, OUT live_tuple INT8, OUT data_size INT8, OUT blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_str_nodes text; - query_str text; - query_part_str text; - rel_info record; - row_name record; - row_data record; - BEGIN - EXECUTE ('select c.relname,n.nspname from pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) where C.oid = (select '''|| rel ||'''::regclass::oid)') into rel_info; - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_catalog.pg_get_delta_info('''''||rel_info.relname||''''','''''||rel_info.nspname||''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - live_tuple := row_data.live_tuple; - data_size := row_data.data_size; - blockNum := row_data.blockNum; - part_name := row_data.part_name; - return next; - END LOOP; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - CREATE OR REPLACE FUNCTION pg_catalog.get_delta_info(IN rel TEXT, OUT part_name TEXT, OUT total_live_tuple INT8, OUT total_data_size INT8, OUT max_blockNum INT8) RETURNS setof record AS $$ @@ -7714,60 +6554,6 @@ DECLARE END; $$ LANGUAGE 'plpgsql' NOT FENCED; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_query_audit(IN starttime TIMESTAMPTZ, IN endtime TIMESTAMPTZ, OUT "time" TIMESTAMPTZ, OUT "type" text, OUT "result" text, OUT userid text, OUT username text, OUT database text, OUT client_conninfo text, OUT "object_name" text, OUT detail_info text, OUT node_name text, OUT thread_id text, OUT local_port text, OUT remote_port text) -RETURNS setof record -AS $$ -DECLARE - row_name record; - row_data record; - query_str text; - query_str_nodes text; - BEGIN - --Get the node names of all CNs - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_catalog.pg_query_audit(''''' || starttime || ''''',''''' || endtime || ''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - "time" := row_data."time"; - "type" := row_data."type"; - "result" := row_data."result"; - userid := row_data.userid; - username := row_data.username; - database := row_data.database; - client_conninfo := row_data.client_conninfo; - "object_name" := row_data."object_name"; - detail_info := row_data.detail_info; - node_name := row_data.node_name; - thread_id := row_data.thread_id; - local_port := row_data.local_port; - remote_port := row_data.remote_port; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.is_oid_in_group_members(IN node_oid Oid, IN group_members oidvector_extend) -RETURNS BOOLEAN AS $$ -DECLARE -query_str text; -match_count int; -node_list text; -BEGIN - match_count := 0; - select pg_catalog.array_to_string($2, ',') into node_list; - - query_str := 'SELECT count(1) FROM pgxc_node n WHERE n.oid = ' || node_oid || ' AND n.node_name IN (SELECT n1.node_name FROM pgxc_node n1 WHERE n1.oid in (' || node_list || '))'; - EXECUTE query_str into match_count; - - IF match_count = 1 THEN - RETURN true; - END IF; - RETURN false; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - CREATE OR REPLACE FUNCTION pg_catalog.lock_cluster_ddl() RETURNS boolean AS $$ @@ -7872,54 +6658,6 @@ DECLARE END; $$ LANGUAGE 'plpgsql' NOT FENCED; -CREATE OR REPLACE FUNCTION pg_catalog.distributed_count(IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - total_num bigint; - flag boolean; - special text := '[;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - RETURN; - END IF; - EXECUTE 'SELECT count(1) FROM ' || $1 - INTO total_num; - - --Get the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node, pgxc_class where node_type IN (''C'', ''D'') AND is_oid_in_group_members(oid, nodeoids) AND - pcrelid=''' || $1 || '''::regclass::oid'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select ''''DN_name'''' as dnname1, count(1) as count1 from ' || $1 || ''''; - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.dnname1 := CASE - WHEN LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-length(row_name.node_name)) - ELSE SUBSTR(row_name.node_name,1,20) - END; - DNName := row_data.dnname1; - Num := row_data.count1; - IF total_num = 0 THEN - Ratio := 0.000 ||'%'; - ELSE - Ratio := ROUND(row_data.count1/total_num*100,3) || '%'; - END IF; - RETURN next; - END LOOP; - END LOOP; - - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - CREATE OR REPLACE FUNCTION pg_catalog.get_delta_info(IN rel TEXT, OUT part_name TEXT, OUT total_live_tuple INT8, OUT total_data_size INT8, OUT max_blockNum INT8) RETURNS setof record AS $$ @@ -7938,31 +6676,6 @@ DECLARE END; $$ LANGUAGE 'plpgsql' NOT FENCED; -CREATE OR REPLACE FUNCTION pg_catalog.get_shard_oids_byname(IN node_name varchar) -RETURNS Oid[] AS $$ -declare - node_oid Oid; - nodes Oid[]; - nodenames_query text; - total_num bigint; - flag boolean; - special text := '[;|-]'; -BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - return '{0}'; - ELSE - nodenames_query := 'SELECT oid FROM pgxc_node WHERE node_name = $1 ORDER BY oid'; - FOR node_oid IN EXECUTE nodenames_query USING node_name LOOP - nodes := array_append(nodes, node_oid); - END LOOP; - RETURN nodes; - END IF; -END; $$ -LANGUAGE plpgsql NOT FENCED; - CREATE OR REPLACE FUNCTION pg_catalog.get_large_table_name(relfile_node text, threshold_size_gb int8) RETURNS text AS $$ @@ -8032,99 +6745,6 @@ DECLARE END; $$LANGUAGE plpgsql NOT FENCED; -CREATE OR REPLACE FUNCTION pg_catalog.pv_session_memory_detail_tp(OUT sessid TEXT, OUT sesstype TEXT, OUT contextname TEXT, OUT level INT2, OUT parent TEXT, OUT totalsize INT8, OUT freesize INT8, OUT usedsize INT8) -RETURNS setof record -AS $$ -DECLARE - enable_threadpool bool; - row_data record; - query_str text; -BEGIN - show enable_thread_pool into enable_threadpool; - - IF enable_threadpool THEN - query_str := 'with SM AS - (SELECT - S.sessid AS sessid, - T.thrdtype AS sesstype, - S.contextname AS contextname, - S.level AS level, - S.parent AS parent, - S.totalsize AS totalsize, - S.freesize AS freesize, - S.usedsize AS usedsize - FROM - pv_session_memory_context S - LEFT JOIN - (SELECT DISTINCT thrdtype, tid - FROM pv_thread_memory_context) T - on S.threadid = T.tid - ), - TM AS - (SELECT - S.sessid AS Ssessid, - T.thrdtype AS sesstype, - T.threadid AS Tsessid, - T.contextname AS contextname, - T.level AS level, - T.parent AS parent, - T.totalsize AS totalsize, - T.freesize AS freesize, - T.usedsize AS usedsize - FROM - pv_thread_memory_context T - LEFT JOIN - (SELECT DISTINCT sessid, threadid - FROM pv_session_memory_context) S - ON T.tid = S.threadid - ) - SELECT * from SM - UNION ALL - SELECT - Ssessid AS sessid, sesstype, contextname, level, parent, totalsize, freesize, usedsize - FROM TM WHERE Ssessid IS NOT NULL - UNION ALL - SELECT - Tsessid AS sessid, sesstype, contextname, level, parent, totalsize, freesize, usedsize - FROM TM WHERE Ssessid IS NULL;'; - FOR row_data IN EXECUTE(query_str) LOOP - sessid = row_data.sessid; - sesstype = row_data.sesstype; - contextname = row_data.contextname; - level = row_data.level; - parent = row_data.parent; - totalsize = row_data.totalsize; - freesize = row_data.freesize; - usedsize = row_data.usedsize; - return next; - END LOOP; - ELSE - query_str := 'SELECT - T.threadid AS sessid, - T.thrdtype AS sesstype, - T.contextname AS contextname, - T.level AS level, - T.parent AS parent, - T.totalsize AS totalsize, - T.freesize AS freesize, - T.usedsize AS usedsize - FROM pg_catalog.pv_thread_memory_detail() T;'; - FOR row_data IN EXECUTE(query_str) LOOP - sessid = row_data.sessid; - sesstype = row_data.sesstype; - contextname = row_data.contextname; - level = row_data.level; - parent = row_data.parent; - totalsize = row_data.totalsize; - freesize = row_data.freesize; - usedsize = row_data.usedsize; - return next; - END LOOP; - END IF; - RETURN; -END; $$ -LANGUAGE plpgsql NOT FENCED; - CREATE OR REPLACE VIEW pg_catalog.gs_session_memory_statistics AS SELECT S.datid AS datid, @@ -8209,12 +6829,6 @@ SELECT FROM pg_stat_activity_ng AS S, pg_catalog.pg_stat_get_wlm_realtime_session_info(NULL) AS T WHERE S.sessionid = T.threadid; -set local inplace_upgrade_next_system_object_oids = IUO_PROC, 2099; -CREATE OR REPLACE FUNCTION pg_catalog.pg_terminate_session - (IN threadid BIGINT, - IN sessionid BIGINT) -RETURNS bool LANGUAGE INTERNAL NOT FENCED as 'pg_terminate_session'; - CREATE OR REPLACE FUNCTION pg_catalog.pg_get_delta_info(IN rel TEXT, IN schema_name TEXT, OUT part_name TEXT, OUT live_tuple INT8, OUT data_size INT8, OUT blockNum INT8) RETURNS setof record AS $$ @@ -8259,33 +6873,6 @@ DECLARE END; $$ LANGUAGE 'plpgsql' NOT FENCED; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_delta_info(IN rel TEXT, OUT node_name TEXT, OUT part_name TEXT, OUT live_tuple INT8, OUT data_size INT8, OUT blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_str_nodes text; - query_str text; - query_part_str text; - rel_info record; - row_name record; - row_data record; - BEGIN - EXECUTE format('select c.relname,n.nspname from pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) where C.oid = (select %L::regclass::oid)', rel) into rel_info; - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_catalog.pg_get_delta_info('''''||rel_info.relname||''''','''''||rel_info.nspname||''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - live_tuple := row_data.live_tuple; - data_size := row_data.data_size; - blockNum := row_data.blockNum; - part_name := row_data.part_name; - return next; - END LOOP; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - CREATE OR REPLACE FUNCTION pg_catalog.get_delta_info(IN rel TEXT, OUT part_name TEXT, OUT total_live_tuple INT8, OUT total_data_size INT8, OUT max_blockNum INT8) RETURNS setof record AS $$ @@ -8434,153 +7021,6 @@ BEGIN end if; END $DO$; -CREATE or REPLACE FUNCTION pg_catalog.gs_get_table_distribution( IN table_name TEXT, IN schema_name TEXT) -RETURNS TEXT -AS -$$ -DECLARE -nodename text; -query_str text; -row_data record; -row_data1 record; -nodelist text; -flag boolean; -special text := '[ ;|-]'; -BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN table_name, IN special; - IF flag = true THEN - raise WARNING 'Illegal character entered for function'; - return nodelist; - END IF; - - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN schema_name, IN special; - IF flag = true THEN - raise WARNING 'Illegal character entered for function'; - return nodelist; - END IF; - - query_str := 'SELECT oid,node_name FROM pgxc_node WHERE node_type=''D'' order by node_name'; - - FOR row_data IN EXECUTE(query_str) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_data.node_name || ') ''SELECT count(*) AS num FROM pg_class c LEFT JOIN pg_namespace n ON c.relnamespace = n.oid WHERE relname='''''||table_name||''''' AND n.nspname='''''||schema_name||''''' '''; - FOR row_data1 IN EXECUTE(query_str) LOOP - IF row_data1.num = 1 THEN - nodelist := nodelist || ' '|| row_data.oid; - END IF; - END LOOP; - END LOOP; - - RETURN nodelist; -END; -$$ -LANGUAGE plpgsql; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_current_instance_info(text, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name text; - flag boolean; - special text := '[ ;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT pg_catalog.regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - IF flag = true THEN - RAISE WARNING 'Illegal character entered for function'; - return; - END IF; - - IF $2 is null THEN - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info()'; - ELSE - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info() limit '||$2; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='''||$1||''''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - query_str := 'EXECUTE DIRECT ON ('||node_name||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_history_instance_info(text, TIMESTAMP, TIMESTAMP, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name text; - flag boolean; - special text := '[ ;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT pg_catalog.regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - IF flag = true THEN - RAISE WARNING 'Illegal character entered for function'; - return; - END IF; - - IF $4 is null THEN - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'''''||$2||''''' and timestamp <'''''||$3||''''' '; - ELSE - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'''''||$2||''''' and timestamp <'''''||$3||''''' limit '||$4; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='''||$1||''''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - query_str := 'EXECUTE DIRECT ON ('||node_name||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - DROP VIEW IF EXISTS pg_catalog.pg_stat_replication; CREATE VIEW pg_catalog.pg_stat_replication AS SELECT @@ -9138,19 +7578,19 @@ BEGIN CREATE VIEW DBE_PERF.statement AS SELECT * FROM get_instr_unique_sql(); - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statement() - RETURNS setof DBE_PERF.statement + CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statement() + RETURNS setof dbe_perf.statement AS $$ DECLARE - row_data DBE_PERF.statement%rowtype; + row_data dbe_perf.statement%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement'''; + query_str := 'SELECT * FROM dbe_perf.statement'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -9195,62 +7635,6 @@ DROP FUNCTION IF EXISTS pg_catalog.pg_stat_get_pooler_status(OUT database_name t SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 3955; CREATE FUNCTION pg_catalog.pg_stat_get_pooler_status(OUT database_name text, OUT user_name text, OUT tid int8, OUT pgoptions text, OUT node_oid int8, OUT in_use boolean, OUT session_params text, OUT fdsock int8, OUT remote_pid int8, OUT used_count int8) RETURNS SETOF record LANGUAGE INTERNAL STABLE ROWS 100 as 'pg_stat_get_pooler_status'; -DROP VIEW IF EXISTS pg_catalog.pg_pooler_status; -CREATE VIEW pg_catalog.pg_pooler_status AS - SELECT - S.database_name AS database, - S.user_name AS user_name, - S.tid AS tid, - S.node_oid AS node_oid, - D.node_name AS node_name, - S.in_use AS in_use, - D.node_port AS node_port, - S.fdsock AS fdsock, - S.remote_pid AS remote_pid, - S.session_params AS session_params, - S.used_count AS used_count - FROM pgxc_node D, pg_stat_get_pooler_status() AS S - WHERE D.oid = S.node_oid; - -GRANT SELECT ON pg_catalog.pg_pooler_status TO public; - - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP VIEW IF EXISTS DBE_PERF.pooler_status; - CREATE VIEW DBE_PERF.pooler_status AS - SELECT - S.database_name AS database, - S.user_name AS user_name, - S.tid AS tid, - S.node_oid AS node_oid, - D.node_name AS node_name, - S.in_use AS in_use, - D.node_port AS node_port, - S.fdsock AS fdsock, - S.remote_pid AS remote_pid, - S.session_params AS session_params, - S.used_count AS used_count - FROM pgxc_node D, pg_stat_get_pooler_status() AS S - WHERE D.oid = S.node_oid; - - DECLARE - user_name text; - query_str text; - BEGIN - SELECT SESSION_USER INTO user_name; - - query_str := 'GRANT ALL ON TABLE DBE_PERF.pooler_status TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - END; - GRANT SELECT ON TABLE DBE_PERF.pooler_status TO PUBLIC; - end if; -END$DO$; - DO $$ DECLARE ans boolean; @@ -9258,10 +7642,7 @@ BEGIN select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; if ans = true then DROP FUNCTION IF EXISTS DBE_PERF.get_global_gs_asp() CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.get_datanode_active_session() CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.get_datanode_active_session_hist() CASCADE; DROP VIEW IF EXISTS DBE_PERF.global_active_session CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.get_global_active_session() CASCADE; DROP VIEW IF EXISTS DBE_PERF.local_active_session CASCADE; DROP VIEW IF EXISTS DBE_PERF.global_thread_wait_status CASCADE; DROP FUNCTION IF EXISTS DBE_PERF.get_global_thread_wait_status() CASCADE; @@ -9398,19 +7779,19 @@ BEGIN CREATE OR REPLACE VIEW DBE_PERF.thread_wait_status AS SELECT * FROM pg_catalog.pg_stat_get_status(NULL); - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_thread_wait_status() - RETURNS setof DBE_PERF.thread_wait_status + CREATE OR REPLACE FUNCTION dbe_perf.get_global_thread_wait_status() + RETURNS setof dbe_perf.thread_wait_status AS $$ DECLARE - row_data DBE_PERF.thread_wait_status%rowtype; + row_data dbe_perf.thread_wait_status%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn dn node names - query_str_nodes := 'SELECT node_name FROM pg_catalog.pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.thread_wait_status'''; + query_str := 'SELECT * FROM dbe_perf.thread_wait_status'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -9434,343 +7815,6 @@ BEGIN SELECT sampleid, sample_time, need_flush_sample, databaseid, thread_id, sessionid, start_time, event, lwtid, psessionid, tlevel, smpid, userid, application_name, client_addr, client_hostname, client_port, query_id, unique_query_id, user_id, cn_id, unique_query, locktag, lockmode, block_sessionid, final_block_sessionid, wait_status FROM tt WHERE level = (SELECT MAX(level) FROM tt t1 WHERE t1.sessionid = tt.sessionid); - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_active_session - (OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text, - OUT locktag text, - OUT lockmode text, - OUT block_sessionid bigint, - OUT final_block_sessionid bigint, - OUT wait_status text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA DBE_PERF.local_active_session%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM pg_catalog.PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'')'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.local_active_session'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := ROW_NAME.NODE_NAME; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - unique_query := ROW_DATA.unique_query; - locktag := ROW_DATA.locktag; - lockmode := ROW_DATA.lockmode; - block_sessionid := ROW_DATA.block_sessionid; - final_block_sessionid := ROW_DATA.final_block_sessionid; - wait_status := ROW_DATA.wait_status; - RETURN NEXT; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE VIEW DBE_PERF.global_active_session AS - SELECT * FROM DBE_PERF.get_global_active_session(); - - CREATE OR REPLACE FUNCTION DBE_PERF.get_datanode_active_session_hist - ( IN datanode text, - IN start_ts timestamp without time zone, - IN end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text, - OUT locktag text, - OUT lockmode text, - OUT block_sessionid bigint, - OUT wait_status text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA pg_catalog.gs_asp%ROWTYPE; - cn_name record; - query_text record; - QUERY_STR text; - query_cn text; - query_str_cn_name text; - node_str text; - BEGIN - if (select working_version_num() < 92217) then - raise exception 'function get_datanode_active_session_hist should not be call during upgrade.'; - end if; - node_str := 'SELECT * FROM pg_catalog.gs_asp where sample_time > '''''||$2||''''' and sample_time < '''''||$3||''''; - QUERY_STR := 'EXECUTE DIRECT ON (' || $1 || ') '''|| node_str ||''''';'; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := datanode; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - IF ROW_DATA.cn_id IS NULL THEN - unique_query := ROW_DATA.unique_query; - ELSE - query_str_cn_name := 'SELECT node_name FROM pg_catalog.pgxc_node WHERE node_id='||ROW_DATA.cn_id||' AND nodeis_active = true'; - FOR cn_name IN EXECUTE(query_str_cn_name) LOOP - query_cn := 'EXECUTE DIRECT ON (' || cn_name.node_name || ') ''SELECT unique_query FROM pg_catalog.gs_asp where unique_query_id = '|| ROW_DATA.unique_query_id||' limit 1'''; - FOR query_text IN EXECUTE(query_cn) LOOP - unique_query := query_text.unique_query; - END LOOP; - END LOOP; - END IF; - locktag := ROW_DATA.locktag; - lockmode := ROW_DATA.lockmode; - block_sessionid := ROW_DATA.block_sessionid; - wait_status := ROW_DATA.wait_status; - RETURN NEXT; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_datanode_active_session - ( in datanode text, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text, - OUT locktag text, - OUT lockmode text, - OUT block_sessionid bigint, - OUT final_block_sessionid bigint, - OUT wait_status text) - RETURNS SETOF record - AS $$ - DECLARE - row_data DBE_PERF.local_active_session%rowtype; - cn_name record; - query_text record; - QUERY_STR text; - query_cn text; - query_str_cn_name text; - BEGIN - QUERY_STR := 'EXECUTE DIRECT ON (' || $1 || ') ''SELECT * FROM DBE_PERF.local_active_session'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := datanode; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - IF ROW_DATA.cn_id IS NULL THEN - unique_query := ROW_DATA.unique_query; - ELSE - query_str_cn_name := 'SELECT node_name FROM pg_catalog.pgxc_node WHERE node_id='||ROW_DATA.cn_id||' AND nodeis_active = true'; - FOR cn_name IN EXECUTE(query_str_cn_name) LOOP - query_cn := 'EXECUTE DIRECT ON (' || cn_name.node_name || ') ''SELECT unique_query FROM DBE_PERF.local_active_session where unique_query_id = '|| ROW_DATA.unique_query_id||' limit 1'''; - FOR query_text IN EXECUTE(query_cn) LOOP - unique_query := query_text.unique_query; - END LOOP; - END LOOP; - END IF; - locktag := ROW_DATA.locktag; - lockmode := ROW_DATA.lockmode; - block_sessionid := ROW_DATA.block_sessionid; - final_block_sessionid := ROW_DATA.final_block_sessionid; - wait_status := ROW_DATA.wait_status; - RETURN NEXT; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_gs_asp - (IN start_ts timestamp without time zone, - IN end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text, - OUT locktag text, - OUT lockmode text, - OUT block_sessionid bigint, - OUT wait_status text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA pg_catalog.gs_asp%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - node_str TEXT; - BEGIN - if (select working_version_num() < 92217) then - raise exception 'function get_global_gs_asp should not be call during upgrade.'; - end if; - QUERY_STR_NODES := 'SELECT NODE_NAME FROM pg_catalog.PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'')'; - node_str := 'SELECT * FROM pg_catalog.gs_asp where sample_time > '''''||$1||''''' and sample_time < '''''||$2||''''; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') '''|| node_str ||''''';'; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := ROW_NAME.NODE_NAME; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - unique_query := ROW_DATA.unique_query; - locktag := ROW_DATA.locktag; - lockmode := ROW_DATA.lockmode; - block_sessionid := ROW_DATA.block_sessionid; - wait_status := ROW_DATA.wait_status; - RETURN NEXT; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - SELECT SESSION_USER INTO user_name; global_query_str := 'GRANT ALL ON TABLE DBE_PERF.locks TO ' || quote_ident(user_name) || ';'; EXECUTE IMMEDIATE global_query_str; @@ -9780,14 +7824,11 @@ BEGIN EXECUTE IMMEDIATE global_query_str; global_query_str := 'GRANT ALL ON TABLE DBE_PERF.local_active_session TO ' || quote_ident(user_name) || ';'; EXECUTE IMMEDIATE global_query_str; - global_query_str := 'GRANT ALL ON TABLE DBE_PERF.global_active_session TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE global_query_str; GRANT SELECT ON DBE_PERF.locks TO public; GRANT SELECT ON DBE_PERF.global_thread_wait_status TO public; GRANT SELECT ON DBE_PERF.thread_wait_status TO public; GRANT SELECT ON DBE_PERF.local_active_session TO public; - GRANT SELECT ON DBE_PERF.global_active_session TO public; end if; END $DO$; @@ -10290,245 +8331,6 @@ CREATE OR REPLACE VIEW pg_catalog.gs_wlm_workload_records AS WHERE P.query_pid = S.threadpid AND S.usesysid = U.oid; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_current_instance_info(text, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name text; - BEGIN - - IF $2 is null THEN - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info()'; - ELSE - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info() limit '||$2; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='||quote_literal($1); - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name in select pg_catalog.regexp_split_to_table(quote_literal($1),',') LOOP - query_str := 'EXECUTE DIRECT ON ('||node_name||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_history_instance_info(text, TIMESTAMP, TIMESTAMP, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name text; - BEGIN - - IF $4 is null THEN - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'||quote_literal($2)||' and timestamp <'||quote_literal($3); - ELSE - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'||quote_literal($2)||' and timestamp <'||quote_literal($3)||' limit '||quote_literal($4); - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='||quote_literal($1); - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name in select pg_catalog.regexp_split_to_table(quote_literal($1),',') LOOP - query_str := 'EXECUTE DIRECT ON ('||node_name||') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.distributed_count(IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - total_num bigint; - flag boolean; - BEGIN - - query_str_nodes := 'SELECT count(1) FROM "' || $1 || '";'; - EXECUTE query_str_nodes INTO total_num; - - --Get the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node, pgxc_class where node_type IN (''C'', ''D'') AND is_oid_in_group_members(oid, nodeoids) AND - pcrelid=' || quote_literal('"'||$1||'"') || '::regclass::oid'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select ''''DN_name'''' as dnname1, count(1) as count1 from "' || $1 || '"'''; - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.dnname1 := CASE - WHEN pg_catalog.LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-pg_catalog.length(row_name.node_name)) - ELSE pg_catalog.SUBSTR(row_name.node_name,1,20) - END; - DNName := row_data.dnname1; - Num := row_data.count1; - IF total_num = 0 THEN - Ratio := 0.000 ||'%'; - ELSE - Ratio := ROUND(row_data.count1/total_num*100,3) || '%'; - END IF; - RETURN next; - END LOOP; - END LOOP; - - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.distributed_count(IN _schema_name text, IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - total_num bigint; - flag boolean; - BEGIN - - query_str_nodes := 'SELECT count(1) FROM "' || $1 || '"."' || $2 || '";'; - EXECUTE query_str_nodes INTO total_num; - - --Get the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node, pgxc_class where node_type IN (''C'', ''D'') AND is_oid_in_group_members(oid, nodeoids) AND - pcrelid=' || quote_literal('"'||$1||'"."' || $2 || '"') || '::regclass::oid'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal('select ''DN_name'' as dnname1, count(1) as count1 from "' || $1 || '"."' || $2 || '"'); - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.dnname1 := CASE - WHEN pg_catalog.LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-pg_catalog.length(row_name.node_name)) - ELSE pg_catalog.SUBSTR(row_name.node_name,1,20) - END; - DNName := row_data.dnname1; - Num := row_data.count1; - IF total_num = 0 THEN - Ratio := 0.000 ||'%'; - ELSE - Ratio := ROUND(row_data.count1/total_num*100,3) || '%'; - END IF; - RETURN next; - END LOOP; - END LOOP; - - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.table_skewness(text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ - BEGIN - RETURN QUERY EXECUTE 'SELECT * FROM pg_catalog.distributed_count(' || quote_literal($1) || ') ORDER BY num DESC, dnname'; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.table_skewness_with_schema(IN _schema_name text,text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ - BEGIN - RETURN QUERY EXECUTE 'SELECT * FROM pg_catalog.distributed_count(' || quote_literal($1) || ',' || quote_literal($2) || ') ORDER BY num DESC, dnname'; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_get_table_distribution( IN table_name TEXT, IN schema_name TEXT) -RETURNS TEXT -AS -$$ -DECLARE -nodename text; -query_str text; -row_data record; -row_data1 record; -nodelist text; -BEGIN - - query_str := 'SELECT oid,node_name FROM pgxc_node WHERE node_type=''D'' order by node_name'; - - FOR row_data IN EXECUTE(query_str) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_data.node_name || ') ' || quote_literal('SELECT count(*) AS num FROM pg_class c LEFT JOIN pg_namespace n ON c.relnamespace = n.oid WHERE relname='||quote_literal(table_name)||' AND n.nspname='||quote_literal(schema_name)); - FOR row_data1 IN EXECUTE(query_str) LOOP - IF row_data1.num = 1 THEN - nodelist := nodelist || ' '|| row_data.oid; - END IF; - END LOOP; - END LOOP; - - RETURN nodelist; -END; -$$ -LANGUAGE plpgsql; - -CREATE OR REPLACE FUNCTION pg_catalog.get_shard_oids_byname(IN node_name varchar) -RETURNS Oid[] AS $$ -declare - node_oid Oid; - nodes Oid[]; - nodenames_query text; - total_num bigint; -BEGIN - nodenames_query := 'SELECT oid FROM pgxc_node WHERE node_name = '||quote_literal($1)||' ORDER BY oid'; - FOR node_oid IN EXECUTE nodenames_query USING node_name LOOP - nodes := array_append(nodes, node_oid); - END LOOP; - RETURN nodes; - -END; $$ -LANGUAGE plpgsql NOT FENCED; - DROP FUNCTION IF EXISTS pg_catalog.pg_cbm_rotate_file(in rotate_lsn text); SET LOCAL inplace_upgrade_next_system_object_oids=IUO_PROC, 4660; CREATE FUNCTION pg_catalog.pg_cbm_rotate_file @@ -10609,214 +8411,6 @@ SELECT FROM pg_user AS S, pg_catalog.pg_total_user_resource_info_oid AS T WHERE S.usesysid = T.userid; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_current_instance_info(text, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name_new text; - node_count int; - BEGIN - - IF $2 is null THEN - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info()'; - ELSE - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info() limit '||$2; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='||quote_literal($1); - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name_new in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - select count(*) from pgxc_node where node_name=quote_literal(node_name_new) into node_count; - IF node_count <> 0 THEN - query_str := 'EXECUTE DIRECT ON ('||node_name_new||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END IF; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_history_instance_info(text, TIMESTAMP, TIMESTAMP, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name_new text; - node_count int; - BEGIN - - IF $4 is null THEN - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'||quote_literal($2)||' and timestamp <'||quote_literal($3); - ELSE - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'||quote_literal($2)||' and timestamp <'||quote_literal($3)||' limit '||quote_literal($4); - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='||quote_literal($1); - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name_new in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - select count(*) from pgxc_node where node_name=quote_literal(node_name_new) into node_count; - IF node_count <> 0 THEN - query_str := 'EXECUTE DIRECT ON ('||node_name_new||') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END IF; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_current_instance_info(text, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name_new text; - node_count int; - node_str text; - query_text text; - BEGIN - - IF $2 is null THEN - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info()'; - ELSE - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info() limit '||$2; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='||quote_literal($1); - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name_new in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - node_str := quote_literal(trim(node_name_new)); - query_text := 'select count(*) from pgxc_node where node_name = ' || node_str; - EXECUTE(query_text) into node_count; - IF node_count <> 0 THEN - query_str := 'EXECUTE DIRECT ON ('||node_name_new||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END IF; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_history_instance_info(text, TIMESTAMP, TIMESTAMP, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name_new text; - node_count int; - node_str text; - query_text text; - BEGIN - - IF $4 is null THEN - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'||quote_literal($2)||' and timestamp <'||quote_literal($3); - ELSE - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'||quote_literal($2)||' and timestamp <'||quote_literal($3)||' limit '||quote_literal($4); - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='||quote_literal($1); - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name_new in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - node_str := quote_literal(trim(node_name_new)); - query_text := 'select count(*) from pgxc_node where node_name = ' || node_str; - EXECUTE(query_text) into node_count; - IF node_count <> 0 THEN - query_str := 'EXECUTE DIRECT ON ('||node_name_new||') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END IF; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - DO $DO$ DECLARE ans boolean; @@ -11230,7 +8824,7 @@ CREATE OR REPLACE VIEW pg_catalog.pg_indexes AS JOIN pg_class I ON (I.oid = X.indexrelid) LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) LEFT JOIN pg_tablespace T ON (T.oid = I.reltablespace) - WHERE C.relkind = 'r' AND I.relkind IN ('i','I'); + WHERE C.relkind IN ('r','m') AND I.relkind IN ('i','I'); DROP TABLE IF EXISTS snapshot.snap_global_operator_runtime; DROP TABLE IF EXISTS snapshot.snap_global_operator_history; @@ -11411,177 +9005,6 @@ END$$; SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 0; -CREATE OR REPLACE FUNCTION pg_catalog.get_local_cont_query_stats() -RETURNS TABLE ( - cq oid, - w_in_rows int8, - w_in_bytes int8, - w_out_rows int8, - w_out_bytes int8, - w_pendings int8, - w_errors int8, - r_in_rows int8, - r_in_bytes int8, - r_out_rows int8, - r_out_bytes int8, - r_errors int8, - c_in_rows int8, - c_in_bytes int8, - c_out_rows int8, - c_out_bytes int8, - c_pendings int8, - c_errors int8 -) -AS $$ -DECLARE - query_cq_ids text; - cq_ids record; - query_stats text; - stats record; -BEGIN - query_cq_ids := 'SELECT id FROM streaming_cont_query'; - FOR cq_ids IN EXECUTE(query_cq_ids) LOOP - query_stats := 'SELECT * FROM pg_catalog.get_local_cont_query_stat(' || cq_ids.id || ')'; - FOR stats IN EXECUTE(query_stats) LOOP - cq = stats.cq; - w_in_rows = stats.w_in_rows; - w_in_bytes = stats.w_in_bytes; - w_out_rows = stats.w_out_rows; - w_out_bytes = stats.w_out_bytes; - w_pendings = stats.w_pendings; - w_errors = stats.w_errors; - r_in_rows = stats.r_in_rows; - r_in_bytes = stats.r_in_bytes; - r_out_rows = stats.r_out_rows; - r_out_bytes = stats.r_out_bytes; - r_errors = stats.r_errors; - c_in_rows = stats.c_in_rows; - c_in_bytes = stats.c_in_bytes; - c_out_rows = stats.c_out_rows; - c_out_bytes = stats.c_out_bytes; - c_pendings = stats.c_pendings; - c_errors = stats.c_errors; - return NEXT; - END LOOP; - END LOOP; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.get_cont_query_stats() -RETURNS TABLE ( - node name, - cq oid, - w_in_rows int8, - w_in_bytes int8, - w_out_rows int8, - w_out_bytes int8, - w_pendings int8, - w_errors int8, - r_in_rows int8, - r_in_bytes int8, - r_out_rows int8, - r_out_bytes int8, - r_errors int8, - c_in_rows int8, - c_in_bytes int8, - c_out_rows int8, - c_out_bytes int8, - c_pendings int8, - c_errors int8 -) -AS $$ -DECLARE - query_nodes text; - nodes record; - query_stats text; - stats record; -BEGIN - query_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR nodes IN EXECUTE(query_nodes) LOOP - query_stats := 'EXECUTE DIRECT ON (' || nodes.node_name || ') ''SELECT * FROM pg_catalog.get_local_cont_query_stats()'''; - FOR stats IN EXECUTE(query_stats) LOOP - node = nodes.node_name; - cq = stats.cq; - w_in_rows = stats.w_in_rows; - w_in_bytes = stats.w_in_bytes; - w_out_rows = stats.w_out_rows; - w_out_bytes = stats.w_out_bytes; - w_pendings = stats.w_pendings; - w_errors = stats.w_errors; - r_in_rows = stats.r_in_rows; - r_in_bytes = stats.r_in_bytes; - r_out_rows = stats.r_out_rows; - r_out_bytes = stats.r_out_bytes; - r_errors = stats.r_errors; - c_in_rows = stats.c_in_rows; - c_in_bytes = stats.c_in_bytes; - c_out_rows = stats.c_out_rows; - c_out_bytes = stats.c_out_bytes; - c_pendings = stats.c_pendings; - c_errors = stats.c_errors; - return NEXT; - END LOOP; - END LOOP; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_extension where extname = 'streaming' limit 1) into ans; - if ans = true then - CREATE OR REPLACE VIEW pg_catalog.cont_query_stats - AS - SELECT cq, - SUM(w_in_rows) AS w_in_rows, - SUM(w_in_bytes) AS w_in_bytes, - SUM(w_out_rows) AS w_out_rows, - SUM(w_out_bytes) AS w_out_bytes, - SUM(w_pendings) AS w_pendings, - SUM(w_errors) AS w_errors, - SUM(r_in_rows) AS r_in_rows, - SUM(r_in_bytes) AS r_in_bytes, - SUM(r_out_rows) AS r_out_rows, - SUM(r_out_bytes) AS r_out_bytes, - SUM(r_errors) AS r_errors, - SUM(c_in_rows) AS c_in_rows, - SUM(c_in_bytes) AS c_in_bytes, - SUM(c_out_rows) AS c_out_rows, - SUM(c_out_bytes) AS c_out_bytes, - SUM(c_pendings) AS c_pendings, - SUM(c_errors) AS c_errors - FROM pg_catalog.get_cont_query_stats() - GROUP BY cq; - - CREATE OR REPLACE VIEW pg_catalog.stream_stats - AS - SELECT s.streamrelid AS "stream", - SUM(w_in_rows) AS w_in_rows, - SUM(w_in_bytes) AS w_in_bytes, - SUM(w_out_rows) AS w_out_rows, - SUM(w_out_bytes) AS w_out_bytes, - SUM(w_pendings) AS w_pendings, - SUM(w_errors) AS w_errors, - SUM(r_in_rows) AS r_in_rows, - SUM(r_in_bytes) AS r_in_bytes, - SUM(r_out_rows) AS r_out_rows, - SUM(r_out_bytes) AS r_out_bytes, - SUM(r_errors) AS r_errors, - SUM(c_in_rows) AS c_in_rows, - SUM(c_in_bytes) AS c_in_bytes, - SUM(c_out_rows) AS c_out_rows, - SUM(c_out_bytes) AS c_out_bytes, - SUM(c_pendings) AS c_pendings, - SUM(c_errors) AS c_errors - FROM pg_catalog.cont_query_stats c, pg_catalog.streaming_cont_query s - WHERE s.id = c.cq - GROUP BY "stream"; - end if; -END$$; - DO $$ DECLARE ans boolean; @@ -11604,72 +9027,6 @@ BEGIN end if; END$$; -CREATE OR REPLACE FUNCTION pg_catalog.reset_local_cont_query_stats(cq_id oid) -RETURNS bool -AS $$ -DECLARE - query_cq_ids text; - cq_ids record; - query_stats text; -BEGIN - query_cq_ids := 'SELECT id FROM streaming_cont_query WHERE streamrelid = (SELECT streamrelid FROM streaming_cont_query WHERE id = ' || cq_id || ')'; - FOR cq_ids IN EXECUTE(query_cq_ids) LOOP - query_stats := 'SELECT pg_catalog.reset_local_cont_query_stat(' || cq_ids.id || ')'; - EXECUTE(query_stats); - END LOOP; - return true; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.reset_cont_query_stats(stream_id oid) -RETURNS bool -AS $$ -DECLARE - query_cq_ids text; - cq_ids record; - query_nodes text; - nodes record; - query_stats text; -BEGIN - query_cq_ids := 'SELECT id FROM streaming_cont_query WHERE streamrelid = ' || stream_id || 'LIMIT 1'; - FOR cq_ids IN EXECUTE(query_cq_ids) LOOP - query_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR nodes IN EXECUTE(query_nodes) LOOP - query_stats := 'EXECUTE DIRECT ON (' || nodes.node_name || ') ''SELECT * FROM pg_catalog.reset_local_cont_query_stats(' || cq_ids.id || ')'''; - EXECUTE(query_stats); - END LOOP; - END LOOP; - return true; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.reset_cont_query_stats() -RETURNS bool -AS $$ -DECLARE - query_streams text; - streams record; - query_cq_ids text; - cq_ids record; - query_nodes text; - nodes record; - query_stats text; -BEGIN - query_streams := 'SELECT DISTINCT streamrelid FROM streaming_cont_query'; - FOR streams IN EXECUTE(query_streams) LOOP - query_cq_ids := 'SELECT id FROM streaming_cont_query WHERE streamrelid = ' || streams.streamrelid || 'LIMIT 1'; - FOR cq_ids IN EXECUTE(query_cq_ids) LOOP - query_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR nodes IN EXECUTE(query_nodes) LOOP - query_stats := 'EXECUTE DIRECT ON (' || nodes.node_name || ') ''SELECT * FROM pg_catalog.reset_local_cont_query_stats(' || cq_ids.id || ')'''; - EXECUTE(query_stats); - END LOOP; - END LOOP; - END LOOP; - return true; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - CREATE OR REPLACE FUNCTION pg_catalog.check_cont_query_schema_changed(cq_id oid) RETURNS bool AS $$ @@ -11832,84 +9189,20 @@ BEGIN DROP VIEW IF EXISTS DBE_PERF.local_plancache_status CASCADE; DROP VIEW IF EXISTS DBE_PERF.global_plancache_status CASCADE; DROP VIEW IF EXISTS DBE_PERF.local_prepare_statement_status CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.global_prepare_statement_status() CASCADE; - DROP VIEW IF EXISTS DBE_PERF.global_prepare_statement_status CASCADE; DROP FUNCTION IF EXISTS DBE_PERF.global_plancache_clean() CASCADE; DROP VIEW IF EXISTS DBE_PERF.local_plancache_clean CASCADE; CREATE VIEW DBE_PERF.local_plancache_status AS SELECT * FROM pg_catalog.plancache_status(); - CREATE OR REPLACE FUNCTION DBE_PERF.global_plancache_status() - RETURNS SETOF DBE_PERF.local_plancache_status - AS $$ - DECLARE - ROW_DATA DBE_PERF.local_plancache_status%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'') and nodeis_active=true'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.local_plancache_status'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE VIEW DBE_PERF.global_plancache_status AS - SELECT * FROM DBE_PERF.global_plancache_status(); - CREATE VIEW DBE_PERF.local_prepare_statement_status AS SELECT * FROM pg_catalog.prepare_statement_status(); - CREATE OR REPLACE FUNCTION DBE_PERF.global_prepare_statement_status() - RETURNS SETOF DBE_PERF.local_prepare_statement_status - AS $$ - DECLARE - ROW_DATA DBE_PERF.local_prepare_statement_status%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'') and nodeis_active=true'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.local_prepare_statement_status'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE VIEW DBE_PERF.global_prepare_statement_status AS - SELECT * FROM DBE_PERF.global_prepare_statement_status(); - CREATE VIEW DBE_PERF.local_plancache_clean AS SELECT * FROM pg_catalog.plancache_clean(); - CREATE OR REPLACE FUNCTION DBE_PERF.global_plancache_clean() - RETURNS BOOLEAN - AS $$ - DECLARE - ROW_DATA record; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'') and nodeis_active=true'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * from DBE_PERF.local_plancache_clean'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - END LOOP; - END LOOP; - RETURN TRUE; - END; $$ - LANGUAGE 'plpgsql'; + CREATE VIEW DBE_PERF.global_plancache_clean AS + SELECT * FROM pg_catalog.plancache_clean(); end if; END$DO$; @@ -12042,75 +9335,75 @@ BEGIN select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; if ans = true then CREATE OR REPLACE FUNCTION DBE_PERF.get_global_full_sql_by_timestamp - (in start_timestamp timestamp with time zone, - in end_timestamp timestamp with time zone, - OUT node_name name, - OUT db_name name, - OUT schema_name name, - OUT origin_node integer, - OUT user_name name, - OUT application_name text, - OUT client_addr text, - OUT client_port integer, - OUT unique_query_id bigint, - OUT debug_query_id bigint, - OUT query text, - OUT start_time timestamp with time zone, - OUT finish_time timestamp with time zone, - OUT slow_sql_threshold bigint, - OUT transaction_id bigint, - OUT thread_id bigint, - OUT session_id bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT query_plan text, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - OUT net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text, - OUT lock_count bigint, - OUT lock_time bigint, - OUT lock_wait_count bigint, - OUT lock_wait_time bigint, - OUT lock_max_count bigint, - OUT lwlock_count bigint, - OUT lwlock_wait_count bigint, - OUT lwlock_time bigint, - OUT lwlock_wait_time bigint, - OUT details text) - RETURNS setof record - AS $$ - DECLARE - row_data pg_catalog.statement_history%rowtype; - query_str text; - -- node name - node_names name[]; - each_node_name name; - BEGIN - -- Get all node names(CN + master DN) - node_names := ARRAY(SELECT pgxc_node.node_name FROM pgxc_node WHERE (node_type = 'C' or node_type = 'D') AND nodeis_active = true); - FOREACH each_node_name IN ARRAY node_names - LOOP - query_str := 'EXECUTE DIRECT ON (' || each_node_name || ') ''SELECT * FROM DBE_PERF.statement_history where start_time >= ''''' ||$1|| ''''' and start_time <= ''''' || $2 || ''''''''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := each_node_name; + (in start_timestamp timestamp with time zone, + in end_timestamp timestamp with time zone, + OUT node_name name, + OUT db_name name, + OUT schema_name name, + OUT origin_node integer, + OUT user_name name, + OUT application_name text, + OUT client_addr text, + OUT client_port integer, + OUT unique_query_id bigint, + OUT debug_query_id bigint, + OUT query text, + OUT start_time timestamp with time zone, + OUT finish_time timestamp with time zone, + OUT slow_sql_threshold bigint, + OUT transaction_id bigint, + OUT thread_id bigint, + OUT session_id bigint, + OUT n_soft_parse bigint, + OUT n_hard_parse bigint, + OUT query_plan text, + OUT n_returned_rows bigint, + OUT n_tuples_fetched bigint, + OUT n_tuples_returned bigint, + OUT n_tuples_inserted bigint, + OUT n_tuples_updated bigint, + OUT n_tuples_deleted bigint, + OUT n_blocks_fetched bigint, + OUT n_blocks_hit bigint, + OUT db_time bigint, + OUT cpu_time bigint, + OUT execution_time bigint, + OUT parse_time bigint, + OUT plan_time bigint, + OUT rewrite_time bigint, + OUT pl_execution_time bigint, + OUT pl_compilation_time bigint, + OUT data_io_time bigint, + OUT net_send_info text, + OUT net_recv_info text, + OUT net_stream_send_info text, + OUT net_stream_recv_info text, + OUT lock_count bigint, + OUT lock_time bigint, + OUT lock_wait_count bigint, + OUT lock_wait_time bigint, + OUT lock_max_count bigint, + OUT lwlock_count bigint, + OUT lwlock_wait_count bigint, + OUT lwlock_time bigint, + OUT lwlock_wait_time bigint, + OUT details bytea, + OUT is_slow_sql bool) + RETURNS setof record + AS $$ + DECLARE + row_data pg_catalog.statement_history%rowtype; + row_name record; + query_str text; + -- node name + query_str_nodes text; + BEGIN + -- Get all node names(CN + master DN) + query_str_nodes := 'select * from dbe_perf.node_name'; + FOR row_name IN EXECUTE(query_str_nodes) LOOP + query_str := 'SELECT * FROM DBE_PERF.statement_history where start_time >= ''' ||$1|| ''' and start_time <= ''' || $2 || ''''; + FOR row_data IN EXECUTE(query_str) LOOP + node_name := row_name.node_name; db_name := row_data.db_name; schema_name := row_data.schema_name; origin_node := row_data.origin_node; @@ -12161,84 +9454,84 @@ BEGIN lwlock_time := row_data.lwlock_time; lwlock_wait_time := row_data.lwlock_wait_time; details := row_data.details; + is_slow_sql := row_data.is_slow_sql; return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; + END LOOP; + END LOOP; + return; + END; $$ + LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE FUNCTION DBE_PERF.get_global_slow_sql_by_timestamp - (in start_timestamp timestamp with time zone, - in end_timestamp timestamp with time zone, - OUT node_name name, - OUT db_name name, - OUT schema_name name, - OUT origin_node integer, - OUT user_name name, - OUT application_name text, - OUT client_addr text, - OUT client_port integer, - OUT unique_query_id bigint, - OUT debug_query_id bigint, - OUT query text, - OUT start_time timestamp with time zone, - OUT finish_time timestamp with time zone, - OUT slow_sql_threshold bigint, - OUT transaction_id bigint, - OUT thread_id bigint, - OUT session_id bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT query_plan text, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - OUT net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text, - OUT lock_count bigint, - OUT lock_time bigint, - OUT lock_wait_count bigint, - OUT lock_wait_time bigint, - OUT lock_max_count bigint, - OUT lwlock_count bigint, - OUT lwlock_wait_count bigint, - OUT lwlock_time bigint, - OUT lwlock_wait_time bigint, - OUT details text) - RETURNS setof record - AS $$ - DECLARE - row_data pg_catalog.statement_history%rowtype; - row_name record; - query_str text; - -- node name - node_names name[]; - each_node_name name; - BEGIN - -- Get all node names(CN + master DN) - node_names := ARRAY(SELECT pgxc_node.node_name FROM pgxc_node WHERE (node_type = 'C' or node_type = 'D') AND nodeis_active = true); - FOREACH each_node_name IN ARRAY node_names - LOOP - query_str := 'EXECUTE DIRECT ON (' || each_node_name || ') ''SELECT * FROM DBE_PERF.statement_history where start_time >= ''''' ||$1|| ''''' and start_time <= ''''' || $2 || ''''' and (extract(epoch from (finish_time - start_time)) * 1000000) >= slow_sql_threshold '''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := each_node_name; + (in start_timestamp timestamp with time zone, + in end_timestamp timestamp with time zone, + OUT node_name name, + OUT db_name name, + OUT schema_name name, + OUT origin_node integer, + OUT user_name name, + OUT application_name text, + OUT client_addr text, + OUT client_port integer, + OUT unique_query_id bigint, + OUT debug_query_id bigint, + OUT query text, + OUT start_time timestamp with time zone, + OUT finish_time timestamp with time zone, + OUT slow_sql_threshold bigint, + OUT transaction_id bigint, + OUT thread_id bigint, + OUT session_id bigint, + OUT n_soft_parse bigint, + OUT n_hard_parse bigint, + OUT query_plan text, + OUT n_returned_rows bigint, + OUT n_tuples_fetched bigint, + OUT n_tuples_returned bigint, + OUT n_tuples_inserted bigint, + OUT n_tuples_updated bigint, + OUT n_tuples_deleted bigint, + OUT n_blocks_fetched bigint, + OUT n_blocks_hit bigint, + OUT db_time bigint, + OUT cpu_time bigint, + OUT execution_time bigint, + OUT parse_time bigint, + OUT plan_time bigint, + OUT rewrite_time bigint, + OUT pl_execution_time bigint, + OUT pl_compilation_time bigint, + OUT data_io_time bigint, + OUT net_send_info text, + OUT net_recv_info text, + OUT net_stream_send_info text, + OUT net_stream_recv_info text, + OUT lock_count bigint, + OUT lock_time bigint, + OUT lock_wait_count bigint, + OUT lock_wait_time bigint, + OUT lock_max_count bigint, + OUT lwlock_count bigint, + OUT lwlock_wait_count bigint, + OUT lwlock_time bigint, + OUT lwlock_wait_time bigint, + OUT details bytea, + OUT is_slow_sql bool) + RETURNS setof record + AS $$ + DECLARE + row_data pg_catalog.statement_history%rowtype; + row_name record; + query_str text; + -- node name + query_str_nodes text; + BEGIN + -- Get all node names(CN + master DN) + query_str_nodes := 'select * from dbe_perf.node_name'; + FOR row_name IN EXECUTE(query_str_nodes) LOOP + query_str := 'SELECT * FROM DBE_PERF.statement_history where start_time >= ''' ||$1|| ''' and start_time <= ''' || $2 || ''' and is_slow_sql = true '; + FOR row_data IN EXECUTE(query_str) LOOP + node_name := row_name.node_name; db_name := row_data.db_name; schema_name := row_data.schema_name; origin_node := row_data.origin_node; @@ -12289,12 +9582,13 @@ BEGIN lwlock_time := row_data.lwlock_time; lwlock_wait_time := row_data.lwlock_wait_time; details := row_data.details; + is_slow_sql := row_data.is_slow_sql; return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; + END LOOP; + END LOOP; + return; + END; $$ + LANGUAGE 'plpgsql' NOT FENCED; end if; END$DO$; @@ -12405,19 +9699,19 @@ BEGIN CREATE VIEW DBE_PERF.statement AS SELECT * FROM get_instr_unique_sql(); - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statement() - RETURNS setof DBE_PERF.statement + CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statement() + RETURNS setof dbe_perf.statement AS $$ DECLARE - row_data DBE_PERF.statement%rowtype; + row_data dbe_perf.statement%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement'''; + query_str := 'SELECT * FROM dbe_perf.statement'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -12500,19 +9794,19 @@ BEGIN CREATE VIEW DBE_PERF.wait_events AS SELECT * FROM get_instr_wait_event(NULL); - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_wait_events() - RETURNS setof DBE_PERF.wait_events + CREATE OR REPLACE FUNCTION dbe_perf.get_global_wait_events() + RETURNS setof dbe_perf.wait_events AS $$ DECLARE - row_data DBE_PERF.wait_events%rowtype; + row_data dbe_perf.wait_events%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.wait_events'''; + query_str := 'SELECT * FROM dbe_perf.wait_events'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -12723,19 +10017,19 @@ BEGIN CREATE VIEW DBE_PERF.statement AS SELECT * FROM get_instr_unique_sql(); - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statement() - RETURNS setof DBE_PERF.statement + CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statement() + RETURNS setof dbe_perf.statement AS $$ DECLARE - row_data DBE_PERF.statement%rowtype; + row_data dbe_perf.statement%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement'''; + query_str := 'SELECT * FROM dbe_perf.statement'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -13057,3062 +10351,6 @@ GRANT SELECT ON information_schema.role_table_grants TO PUBLIC; RESET search_path; -DO $DO$ -DECLARE - ans boolean; - user_name text; - global_query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_os_runtime - (OUT node_name name, OUT id integer, OUT name text, OUT value numeric, OUT comments text, OUT cumulative boolean) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.os_runtime'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - id := row_data.id; - name := row_data.name; - value := row_data.value; - comments := row_data.comments; - cumulative := row_data.cumulative; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_os_threads() - RETURNS setof DBE_PERF.os_threads - AS $$ - DECLARE - row_data DBE_PERF.os_threads%rowtype; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT * FROM DBE_PERF.os_threads'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_instance_time - (OUT node_name name, OUT stat_id integer, OUT stat_name text, OUT value bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all CN DN node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.instance_time'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - stat_id := row_data.stat_id; - stat_name := row_data.stat_name; - value := row_data.value; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_workload_sql_count - (OUT node_name name, OUT workload name, OUT select_count bigint, - OUT update_count bigint, OUT insert_count bigint, OUT delete_count bigint, - OUT ddl_count bigint, OUT dml_count bigint, OUT dcl_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all cn node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.workload_sql_count'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - workload := row_data.workload; - select_count := row_data.select_count; - update_count := row_data.update_count; - insert_count := row_data.insert_count; - delete_count := row_data.delete_count; - ddl_count := row_data.ddl_count; - dml_count := row_data.dml_count; - dcl_count := row_data.dcl_count; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_workload_sql_elapse_time - (OUT node_name name, OUT workload name, - OUT total_select_elapse bigint, OUT max_select_elapse bigint, OUT min_select_elapse bigint, OUT avg_select_elapse bigint, - OUT total_update_elapse bigint, OUT max_update_elapse bigint, OUT min_update_elapse bigint, OUT avg_update_elapse bigint, - OUT total_insert_elapse bigint, OUT max_insert_elapse bigint, OUT min_insert_elapse bigint, OUT avg_insert_elapse bigint, - OUT total_delete_elapse bigint, OUT max_delete_elapse bigint, OUT min_delete_elapse bigint, OUT avg_delete_elapse bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all cn node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.workload_sql_elapse_time'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - workload := row_data.workload; - total_select_elapse := row_data.total_select_elapse; - max_select_elapse := row_data.max_select_elapse; - min_select_elapse := row_data.min_select_elapse; - avg_select_elapse := row_data.avg_select_elapse; - total_update_elapse := row_data.total_update_elapse; - max_update_elapse := row_data.max_update_elapse; - min_update_elapse := row_data.min_update_elapse; - avg_update_elapse := row_data.avg_update_elapse; - total_insert_elapse := row_data.total_insert_elapse; - max_insert_elapse := row_data.max_insert_elapse; - min_insert_elapse := row_data.min_insert_elapse; - avg_insert_elapse := row_data.avg_insert_elapse; - total_delete_elapse := row_data.total_delete_elapse; - max_delete_elapse := row_data.max_delete_elapse; - min_delete_elapse := row_data.min_delete_elapse; - avg_delete_elapse := row_data.avg_delete_elapse; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_user_transaction - (OUT node_name name, OUT usename name, OUT commit_counter bigint, - OUT rollback_counter bigint, OUT resp_min bigint, OUT resp_max bigint, - OUT resp_avg bigint, OUT resp_total bigint, OUT bg_commit_counter bigint, - OUT bg_rollback_counter bigint, OUT bg_resp_min bigint, OUT bg_resp_max bigint, - OUT bg_resp_avg bigint, OUT bg_resp_total bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all cn node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.user_transaction'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - usename := row_data.usename; - commit_counter := row_data.commit_counter; - rollback_counter := row_data.rollback_counter; - resp_min := row_data.resp_min; - resp_max := row_data.resp_max; - resp_avg := row_data.resp_avg; - resp_total := row_data.resp_total; - bg_commit_counter := row_data.bg_commit_counter; - bg_rollback_counter := row_data.bg_rollback_counter; - bg_resp_min := row_data.bg_resp_min; - bg_resp_max := row_data.bg_resp_max; - bg_resp_avg := row_data.bg_resp_avg; - bg_resp_total := row_data.bg_resp_total; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_workload_transaction - (OUT node_name name, OUT workload name, OUT commit_counter bigint, - OUT rollback_counter bigint, OUT resp_min bigint, OUT resp_max bigint, - OUT resp_avg bigint, OUT resp_total bigint, OUT bg_commit_counter bigint, - OUT bg_rollback_counter bigint, OUT bg_resp_min bigint, OUT bg_resp_max bigint, - OUT bg_resp_avg bigint, OUT bg_resp_total bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all cn node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.workload_transaction'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - workload := row_data.workload; - commit_counter := row_data.commit_counter; - rollback_counter := row_data.rollback_counter; - resp_min := row_data.resp_min; - resp_max := row_data.resp_max; - resp_avg := row_data.resp_avg; - resp_total := row_data.resp_total; - bg_commit_counter := row_data.bg_commit_counter; - bg_rollback_counter := row_data.bg_rollback_counter; - bg_resp_min := row_data.bg_resp_min; - bg_resp_max := row_data.bg_resp_max; - bg_resp_avg := row_data.bg_resp_avg; - bg_resp_total := row_data.bg_resp_total; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_stat - (OUT node_name name, OUT sessid text, OUT statid integer, OUT statname text, OUT statunit text, OUT value bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.session_stat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - sessid := row_data.sessid; - statid := row_data.statid; - statname := row_data.statname; - statunit := row_data.statunit; - value := row_data.value; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_time - (OUT node_name name, OUT sessid text, OUT stat_id integer, OUT stat_name text, OUT value bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.session_time'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - sessid := row_data.sessid; - stat_id := row_data.stat_id; - stat_name := row_data.stat_name; - value := row_data.value; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_memory - (OUT node_name name, OUT sessid text, OUT init_mem integer, OUT used_mem integer, OUT peak_mem integer) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.session_memory'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - sessid := row_data.sessid; - init_mem := row_data.init_mem; - used_mem := row_data.used_mem; - peak_mem := row_data.peak_mem; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_memory_detail - (OUT node_name name, OUT sessid text, OUT sesstype text, OUT contextname text, OUT level smallint, - OUT parent text, OUT totalsize bigint, OUT freesize bigint, OUT usedsize bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.session_memory_detail'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - sessid := row_data.sessid; - sesstype := row_data.sesstype; - contextname := row_data.contextname; - level := row_data.level; - parent := row_data.parent; - totalsize := row_data.totalsize; - freesize := row_data.freesize; - usedsize := row_data.usedsize; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_thread_wait_status() - RETURNS setof DBE_PERF.thread_wait_status - AS $$ - DECLARE - row_data DBE_PERF.thread_wait_status%rowtype; - query_str text; - BEGIN - --Get all cn dn node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT * FROM DBE_PERF.thread_wait_status'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_wlm_workload_runtime() - RETURNS setof DBE_PERF.wlm_workload_runtime - AS $$ - DECLARE - row_data DBE_PERF.wlm_workload_runtime%rowtype; - query_str text; - BEGIN - --Get all coordinator node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.wlm_workload_runtime'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_ec_history() - RETURNS setof DBE_PERF.operator_ec_history - AS $$ - DECLARE - row_data DBE_PERF.operator_ec_history%rowtype; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.operator_ec_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_ec_history_table() - RETURNS setof DBE_PERF.operator_ec_history_table - AS $$ - DECLARE - row_data DBE_PERF.operator_ec_history_table%rowtype; - query_str text; - BEGIN - --Get all the CN node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.operator_ec_history_table'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_history_table() - RETURNS setof DBE_PERF.operator_history_table - AS $$ - DECLARE - row_data DBE_PERF.operator_history_table%rowtype; - query_str text; - BEGIN - --Get all the CN node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.operator_history_table '''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_history() - RETURNS setof DBE_PERF.operator_history - AS $$ - DECLARE - row_data DBE_PERF.operator_history%rowtype; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.operator_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_runtime() - RETURNS setof DBE_PERF.operator_runtime - AS $$ - DECLARE - row_data DBE_PERF.operator_runtime%rowtype; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.operator_runtime'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_complex_history() - RETURNS setof DBE_PERF.statement_complex_history - AS $$ - DECLARE - row_data DBE_PERF.statement_complex_history%rowtype; - query_str text; - BEGIN - --Get all cn node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.statement_complex_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_complex_history_table() - RETURNS setof DBE_PERF.statement_complex_history_table - AS $$ - DECLARE - row_data DBE_PERF.statement_complex_history_table%rowtype; - query_str text; - BEGIN - --Get all cn node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.statement_complex_history_table'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_complex_runtime() - RETURNS setof DBE_PERF.statement_complex_runtime - AS $$ - DECLARE - row_data DBE_PERF.statement_complex_runtime%rowtype; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.statement_complex_runtime'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_memory_node_detail() - RETURNS setof DBE_PERF.memory_node_detail - AS $$ - DECLARE - row_data DBE_PERF.memory_node_detail%rowtype; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT * FROM DBE_PERF.memory_node_detail'''; - FOR row_data IN EXECUTE(query_str) LOOP - RETURN NEXT row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_shared_memory_detail - (OUT node_name name, OUT contextname text, OUT level smallint, OUT parent text, - OUT totalsize bigint, OUT freesize bigint, OUT usedsize bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.shared_memory_detail'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - contextname := row_data.contextname; - level := row_data.level; - parent := row_data.parent; - totalsize := row_data.totalsize; - freesize := row_data.freesize; - usedsize := row_data.usedsize; - RETURN NEXT; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_comm_delay() - RETURNS setof DBE_PERF.comm_delay - AS $$ - DECLARE - row_data DBE_PERF.comm_delay%rowtype; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON DATANODES ''SELECT * FROM DBE_PERF.comm_delay'''; - FOR row_data IN EXECUTE(query_str) LOOP - RETURN NEXT row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_all_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.statio_all_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_all_indexes - (OUT schemaname name, OUT toastrelschemaname name, OUT toastrelname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_blks_read AS idx_blks_read, - T.idx_blks_hit AS idx_blks_hit - FROM DBE_PERF.statio_all_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_all_sequences - (OUT node_name name, OUT relid oid, OUT schemaname name, - OUT relname name, OUT blks_read bigint, OUT blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.statio_all_sequences'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - blks_read := row_data.blks_read; - blks_hit := row_data.blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint, - OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, - OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.statio_all_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_all_tables - (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT heap_blks_read bigint, - OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, - OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - C.relname AS relname, - C.schemaname AS schemaname, - O.relname AS toastrelname, - N.nspname AS toastrelschemaname, - C.heap_blks_read AS heap_blks_read, - C.heap_blks_hit AS heap_blks_hit, - C.idx_blks_read AS idx_blks_read, - C.idx_blks_hit AS idx_blks_hit, - C.toast_blks_read AS toast_blks_read, - C.toast_blks_hit AS toast_blks_hit, - C.tidx_blks_read AS tidx_blks_read, - C.tidx_blks_hit AS tidx_blks_hit - FROM DBE_PERF.statio_all_tables C - LEFT JOIN pg_class O ON C.relid = O.reltoastrelid - LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_sys_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.statio_sys_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_sys_indexes - (OUT schemaname name, OUT toastrelschemaname name, OUT toastrelname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_blks_read AS idx_blks_read, - T.idx_blks_hit AS idx_blks_hit - FROM DBE_PERF.statio_sys_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_sys_sequences - (OUT node_name name, OUT relid oid, OUT schemaname name, - OUT relname name, OUT blks_read bigint, OUT blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.statio_sys_sequences'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - blks_read := row_data.blks_read; - blks_hit := row_data.blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_sys_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint, - OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, - OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.statio_sys_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_sys_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT heap_blks_read bigint, OUT heap_blks_hit bigint, - OUT idx_blks_read bigint, OUT idx_blks_hit bigint, - OUT toast_blks_read bigint, OUT toast_blks_hit bigint, - OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - C.schemaname AS schemaname, - C.relname AS relname, - O.relname AS toastrelname, - N.nspname AS toastrelschemaname, - C.heap_blks_read AS heap_blks_read, - C.heap_blks_hit AS heap_blks_hit, - C.idx_blks_read AS idx_blks_read, - C.idx_blks_hit AS idx_blks_hit, - C.toast_blks_read AS toast_blks_read, - C.toast_blks_hit AS toast_blks_hit, - C.tidx_blks_read AS tidx_blks_read, - C.tidx_blks_hit AS tidx_blks_hit - FROM DBE_PERF.statio_sys_tables C - LEFT JOIN pg_class O ON C.relid = O.reltoastrelid - LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_user_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.statio_user_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_user_indexes - (OUT schemaname name, OUT toastrelschemaname name, OUT toastrelname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_blks_read AS idx_blks_read, - T.idx_blks_hit AS idx_blks_hit - FROM DBE_PERF.statio_user_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_user_sequences - (OUT node_name name, OUT relid oid, OUT schemaname name, - OUT relname name, OUT blks_read bigint, OUT blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.statio_user_sequences'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - blks_read := row_data.blks_read; - blks_hit := row_data.blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_user_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint, - OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, - OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.statio_user_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_user_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT heap_blks_read bigint, OUT heap_blks_hit bigint, - OUT idx_blks_read bigint, OUT idx_blks_hit bigint, - OUT toast_blks_read bigint, OUT toast_blks_hit bigint, - OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - C.schemaname AS schemaname, - C.relname AS relname, - O.relname AS toastrelname, - N.nspname AS toastrelschemaname, - C.heap_blks_read AS heap_blks_read, - C.heap_blks_hit AS heap_blks_hit, - C.idx_blks_read AS idx_blks_read, - C.idx_blks_hit AS idx_blks_hit, - C.toast_blks_read AS toast_blks_read, - C.toast_blks_hit AS toast_blks_hit, - C.tidx_blks_read AS tidx_blks_read, - C.tidx_blks_hit AS tidx_blks_hit - FROM DBE_PERF.statio_user_tables C - LEFT JOIN pg_class O ON C.relid = O.reltoastrelid - LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_dn_stat_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON DATANODES ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_all_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_dn_stat_all_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON DATANODES '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd, - T.n_live_tup AS n_live_tup, - T.n_dead_tup AS n_dead_tup, - T.last_vacuum AS last_vacuum, - T.last_autovacuum AS last_autovacuum, - T.last_analyze AS last_analyze, - T.last_autoanalyze AS last_autoanalyze, - T.vacuum_count AS vacuum_count, - T.autovacuum_count AS autovacuum_count, - T.analyze_count AS analyze_count, - T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_all_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_cn_stat_all_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON COORDINATORS '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd, - T.n_live_tup AS n_live_tup, - T.n_dead_tup AS n_dead_tup, - T.last_vacuum AS last_vacuum, - T.last_autovacuum AS last_autovacuum, - T.last_analyze AS last_analyze, - T.last_autoanalyze AS last_autoanalyze, - T.vacuum_count AS vacuum_count, - T.autovacuum_count AS autovacuum_count, - T.analyze_count AS analyze_count, - T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_all_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid - WHERE T.schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_all_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, - OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_all_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_all_indexes - (OUT schemaname name, OUT relname name, OUT indexrelname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_scan AS idx_scan, - T.idx_tup_read AS idx_tup_read, - T.idx_tup_fetch AS idx_tup_fetch - FROM DBE_PERF.stat_all_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_sys_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, - OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_sys_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_sys_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, - OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd, - T.n_live_tup AS n_live_tup, - T.n_dead_tup AS n_dead_tup, - T.last_vacuum AS last_vacuum, - T.last_autovacuum AS last_autovacuum, - T.last_analyze AS last_analyze, - T.last_autoanalyze AS last_autoanalyze, - T.vacuum_count AS vacuum_count, - T.autovacuum_count AS autovacuum_count, - T.analyze_count AS analyze_count, - T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_sys_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_sys_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, - OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_sys_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_sys_indexes - (OUT schemaname name, OUT relname name, OUT indexrelname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_scan AS idx_scan, - T.idx_tup_read AS idx_tup_read, - T.idx_tup_fetch AS idx_tup_fetch - FROM DBE_PERF.stat_sys_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_user_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, - OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON DATANODES ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_user_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_user_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, - OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON DATANODES '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd, - T.n_live_tup AS n_live_tup, - T.n_dead_tup AS n_dead_tup, - T.last_vacuum AS last_vacuum, - T.last_autovacuum AS last_autovacuum, - T.last_analyze AS last_analyze, - T.last_autoanalyze AS last_autoanalyze, - T.vacuum_count AS vacuum_count, - T.autovacuum_count AS autovacuum_count, - T.analyze_count AS analyze_count, - T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_user_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_user_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, - OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_user_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_user_indexes - (OUT schemaname name, OUT relname name, OUT indexrelname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_scan AS idx_scan, - T.idx_tup_read AS idx_tup_read, - T.idx_tup_fetch AS idx_tup_fetch - FROM DBE_PERF.stat_user_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_database - (OUT node_name name, OUT datid oid, OUT datname name, OUT numbackends integer, OUT xact_commit bigint, - OUT xact_rollback bigint, OUT blks_read bigint, OUT blks_hit bigint, OUT tup_returned bigint, OUT tup_fetched bigint, - OUT tup_inserted bigint, OUT tup_updated bigint, OUT tup_deleted bigint, OUT conflicts bigint, OUT temp_files bigint, - OUT temp_bytes bigint, OUT deadlocks bigint, OUT blk_read_time double precision, OUT blk_write_time double precision, - OUT stats_reset timestamp with time zone) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_database'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - datid := row_data.datid; - datname := row_data.datname; - numbackends := row_data.numbackends; - xact_commit := row_data.xact_commit; - xact_rollback := row_data.xact_rollback; - blks_read := row_data.blks_read; - blks_hit := row_data.blks_hit; - tup_returned := row_data.tup_returned; - tup_fetched := row_data.tup_fetched; - tup_inserted := row_data.tup_inserted; - tup_updated := row_data.tup_updated; - tup_deleted := row_data.tup_deleted; - conflicts := row_data.conflicts; - temp_files := row_data.temp_files; - temp_bytes := row_data.temp_bytes; - deadlocks := row_data.deadlocks; - blk_read_time := row_data.blk_read_time; - blk_write_time := row_data.blk_write_time; - stats_reset := row_data.stats_reset; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_database_conflicts - (OUT node_name name, OUT datid oid, OUT datname name, OUT confl_tablespace bigint, - OUT confl_lock bigint, OUT confl_snapshot bigint, OUT confl_bufferpin bigint, OUT confl_deadlock bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_database_conflicts'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - datid := row_data.datid; - datname := row_data.datname; - confl_tablespace := row_data.confl_tablespace; - confl_lock := row_data.confl_lock; - confl_snapshot := row_data.confl_snapshot; - confl_bufferpin := row_data.confl_bufferpin; - confl_deadlock := row_data.confl_deadlock; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_sys_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, - OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_xact_sys_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_xact_sys_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, - OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_sys_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_user_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, - OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON DATANODES ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_xact_user_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_xact_user_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, - OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON DATANODES '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_user_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_user_functions - (OUT node_name name, OUT funcid oid, OUT schemaname name, OUT funcname name, OUT calls bigint, - OUT total_time double precision, OUT self_time double precision) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_user_functions'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - funcid := row_data.funcid; - schemaname := row_data.schemaname; - funcname := row_data.funcname; - calls := row_data.calls; - total_time := row_data.total_time; - self_time := row_data.self_time; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_user_functions - (OUT node_name name, OUT funcid oid, OUT schemaname name, OUT funcname name, OUT calls bigint, - OUT total_time double precision, OUT self_time double precision) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_xact_user_functions'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - funcid := row_data.funcid; - schemaname := row_data.schemaname; - funcname := row_data.funcname; - calls := row_data.calls; - total_time := row_data.total_time; - self_time := row_data.self_time; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_bad_block - (OUT node_name TEXT, OUT databaseid INT4, OUT tablespaceid INT4, OUT relfilenode INT4, OUT forknum INT4, - OUT error_count INT4, OUT first_time timestamp with time zone, OUT last_time timestamp with time zone) - RETURNS setof record - AS $$ - DECLARE - each_node_out record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON DATANODES ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_bad_block'''; - FOR each_node_out IN EXECUTE(query_str) LOOP - node_name := each_node_out.node_name; - databaseid := each_node_out.databaseid; - tablespaceid := each_node_out.tablespaceid; - relfilenode := each_node_out.relfilenode; - forknum := each_node_out.forknum; - error_count := each_node_out.error_count; - first_time := each_node_out.first_time; - last_time := each_node_out.last_time; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_file_redo_iostat - (OUT node_name name, OUT phywrts bigint, OUT phyblkwrt bigint, OUT writetim bigint, - OUT avgiotim bigint, OUT lstiotim bigint, OUT miniotim bigint, OUT maxiowtm bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.file_redo_iostat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - phywrts := row_data.phywrts; - phyblkwrt := row_data.phyblkwrt; - writetim := row_data.writetim; - avgiotim := row_data.avgiotim; - lstiotim := row_data.lstiotim; - miniotim := row_data.miniotim; - maxiowtm := row_data.maxiowtm; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_rel_iostat - (OUT node_name name, OUT phyrds bigint, - OUT phywrts bigint, OUT phyblkrd bigint, OUT phyblkwrt bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.local_rel_iostat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - phyrds := row_data.phyrds; - phywrts := row_data.phywrts; - phyblkrd := row_data.phyblkrd; - phyblkwrt := row_data.phyblkwrt; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_file_iostat - (OUT node_name name, OUT filenum oid, OUT dbid oid, OUT spcid oid, OUT phyrds bigint, - OUT phywrts bigint, OUT phyblkrd bigint, OUT phyblkwrt bigint, OUT readtim bigint, - OUT writetim bigint, OUT avgiotim bigint, OUT lstiotim bigint, OUT miniotim bigint, OUT maxiowtm bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.file_iostat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - filenum := row_data.filenum; - dbid := row_data.dbid; - spcid := row_data.spcid; - phyrds := row_data.phyrds; - phywrts := row_data.phywrts; - phyblkrd := row_data.phyblkrd; - phyblkwrt := row_data.phyblkwrt; - readtim := row_data.readtim; - writetim := row_data.writetim; - avgiotim := row_data.avgiotim; - lstiotim := row_data.lstiotim; - miniotim := row_data.miniotim; - maxiowtm := row_data.maxiowtm; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_locks - (OUT node_name name, - OUT locktype text, - OUT database oid, - OUT relation oid, - OUT page integer, - OUT tuple smallint, - OUT virtualxid text, - OUT transactionid xid, - OUT classid oid, - OUT objid oid, - OUT objsubid smallint, - OUT virtualtransaction text, - OUT pid bigint, - OUT mode text, - OUT granted boolean, - OUT fastpath boolean) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.locks'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - locktype := row_data.locktype; - database := row_data.database; - relation := row_data.relation; - page := row_data.page; - tuple := row_data.tuple; - virtualxid := row_data.virtualxid; - transactionid := row_data.classid; - objid := row_data.objid; - objsubid := row_data.objsubid; - virtualtransaction := row_data.virtualtransaction; - pid := row_data.pid; - mode := row_data.mode; - granted := row_data.granted; - fastpath := row_data.fastpath; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_replication_slots - (OUT node_name name, - OUT slot_name text, - OUT plugin text, - OUT slot_type text, - OUT datoid oid, - OUT database name, - OUT active boolean, - OUT x_min xid, - OUT catalog_xmin xid, - OUT restart_lsn text, - OUT dummy_standby boolean) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON DATANODES ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.replication_slots'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - slot_name := row_data.slot_name; - plugin := row_data.plugin; - slot_type := row_data.slot_type; - datoid := row_data.datoid; - database := row_data.database; - active := row_data.active; - x_min := row_data.xmin; - catalog_xmin := row_data.catalog_xmin; - restart_lsn := row_data.restart_lsn; - dummy_standby := row_data.dummy_standby; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_bgwriter_stat - (OUT node_name name, - OUT checkpoints_timed bigint, - OUT checkpoints_req bigint, - OUT checkpoint_write_time double precision, - OUT checkpoint_sync_time double precision, - OUT buffers_checkpoint bigint, - OUT buffers_clean bigint, - OUT maxwritten_clean bigint, - OUT buffers_backend bigint, - OUT buffers_backend_fsync bigint, - OUT buffers_alloc bigint, - OUT stats_reset timestamp with time zone) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.bgwriter_stat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - checkpoints_timed := row_data.checkpoints_timed; - checkpoints_req := row_data.checkpoints_req; - checkpoint_write_time := row_data.checkpoint_write_time; - checkpoint_sync_time := row_data.checkpoint_sync_time; - buffers_checkpoint := row_data.buffers_checkpoint; - buffers_clean := row_data.buffers_clean; - maxwritten_clean := row_data.maxwritten_clean; - buffers_backend := row_data.buffers_backend; - buffers_backend_fsync := row_data.buffers_backend_fsync; - buffers_alloc := row_data.buffers_alloc; - stats_reset := row_data.stats_reset; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_replication_stat - (OUT node_name name, - OUT pid bigint, - OUT usesysid oid, - OUT usename name, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT backend_start timestamp with time zone, - OUT state text, - OUT sender_sent_location text, - OUT receiver_write_location text, - OUT receiver_flush_location text, - OUT receiver_replay_location text, - OUT sync_priority integer, - OUT sync_state text) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.replication_stat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - pid := row_data.pid; - usesysid := row_data.usesysid; - usename := row_data.usename; - client_addr := row_data.client_addr; - client_hostname := row_data.client_hostname; - client_port := row_data.client_port; - state := row_data.state; - sender_sent_location := row_data.sender_sent_location; - receiver_write_location := row_data.receiver_write_location; - receiver_flush_location := row_data.receiver_flush_location; - receiver_replay_location := row_data.receiver_replay_location; - sync_priority := row_data.sync_priority; - sync_state := row_data.sync_state; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_pooler_status - (OUT source_node_name name, - OUT database text, - OUT user_name text, - OUT tid bigint, - OUT node_oid bigint, - OUT node_name name, - OUT in_use boolean, - OUT fdsock bigint, - OUT remote_pid bigint, - OUT session_params text) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.pooler_status'''; - FOR row_data IN EXECUTE(query_str) LOOP - source_node_name := row_data.node_name; - database := row_data.database; - user_name := row_data.user_name; - tid := row_data.tid; - node_oid := row_data.node_oid; - node_name := row_data.node_name; - in_use := row_data.in_use; - fdsock := row_data.fdsock; - remote_pid := row_data.remote_pid; - session_params := row_data.session_params; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_transactions_running_xacts() - RETURNS setof DBE_PERF.transactions_running_xacts - AS $$ - DECLARE - row_data DBE_PERF.transactions_running_xacts%rowtype; - query_str text; - BEGIN - --Get all cn dn node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT * FROM DBE_PERF.transactions_running_xacts'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_transactions_running_xacts() - RETURNS setof DBE_PERF.transactions_running_xacts - AS $$ - DECLARE - row_data DBE_PERF.transactions_running_xacts%rowtype; - query_str text; - BEGIN - --Get all cn node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.transactions_running_xacts'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_transactions_prepared_xacts() - RETURNS setof DBE_PERF.transactions_prepared_xacts - AS $$ - DECLARE - row_data DBE_PERF.transactions_prepared_xacts%rowtype; - query_str text; - BEGIN - --Get all cn dn node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT * FROM DBE_PERF.transactions_prepared_xacts'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_transactions_prepared_xacts() - RETURNS setof DBE_PERF.transactions_prepared_xacts - AS $$ - DECLARE - row_data DBE_PERF.transactions_prepared_xacts%rowtype; - query_str text; - BEGIN - --Get all cn node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.transactions_prepared_xacts'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statement() - RETURNS setof DBE_PERF.statement - AS $$ - DECLARE - row_data DBE_PERF.statement%rowtype; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.statement'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_count() - RETURNS setof DBE_PERF.statement_count - AS $$ - DECLARE - row_data DBE_PERF.statement_count%rowtype; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT * FROM DBE_PERF.statement_count'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_config_settings - (out node_name text, - out name text, - out setting text, - out unit text, - out category text, - out short_desc text, - out extra_desc text, - out context text, - out vartype text, - out source text, - out min_val text, - out max_val text, - out enumvals text[], - out boot_val text, - out reset_val text, - out sourcefile text, - out sourceline integer) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.config_settings'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - name := row_data.name; - setting := row_data.setting; - unit := row_data.unit; - category := row_data.category; - short_desc := row_data.short_desc; - extra_desc := row_data.extra_desc; - context := row_data.context; - vartype := row_data.vartype; - source := row_data.source; - min_val := row_data.min_val; - max_val := row_data.max_val; - enumvals := row_data.enumvals; - boot_val := row_data.boot_val; - reset_val := row_data.reset_val; - sourcefile := row_data.sourcefile; - sourceline := row_data.sourceline; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_wait_events() - RETURNS setof DBE_PERF.wait_events - AS $$ - DECLARE - row_data DBE_PERF.wait_events%rowtype; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT * FROM DBE_PERF.wait_events'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_user_login() - RETURNS SETOF DBE_PERF.user_login - AS $$ - DECLARE - ROW_DATA DBE_PERF.user_login%ROWTYPE; - QUERY_STR TEXT; - BEGIN - QUERY_STR := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.user_login'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_record_reset_time(OUT node_name text, OUT reset_time timestamp with time zone) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM get_node_stat_reset_time()'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - reset_time := row_data.get_node_stat_reset_time; - return next; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.global_threadpool_status() - RETURNS SETOF DBE_PERF.local_threadpool_status - AS $$ - DECLARE - ROW_DATA DBE_PERF.local_threadpool_status%ROWTYPE; - QUERY_STR TEXT; - BEGIN - QUERY_STR := 'EXECUTE DIRECT ON ALL ''SELECT * FROM DBE_PERF.local_threadpool_status'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.global_plancache_status() - RETURNS SETOF DBE_PERF.local_plancache_status - AS $$ - DECLARE - ROW_DATA DBE_PERF.local_plancache_status%ROWTYPE; - QUERY_STR TEXT; - BEGIN - QUERY_STR := 'EXECUTE DIRECT ON ALL ''SELECT * FROM DBE_PERF.local_plancache_status'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.global_prepare_statement_status() - RETURNS SETOF DBE_PERF.local_prepare_statement_status - AS $$ - DECLARE - ROW_DATA DBE_PERF.local_prepare_statement_status%ROWTYPE; - QUERY_STR TEXT; - BEGIN - QUERY_STR := 'EXECUTE DIRECT ON ALL ''SELECT * FROM DBE_PERF.local_prepare_statement_status'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.global_slow_query_info() - RETURNS setof DBE_PERF.gs_slow_query_info - AS $$ - DECLARE - row_data DBE_PERF.gs_slow_query_info%rowtype; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.gs_slow_query_info'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.global_slow_query_info_bytime(text, TIMESTAMP, TIMESTAMP, int) - RETURNS setof DBE_PERF.gs_slow_query_info - AS $$ - DECLARE - row_data DBE_PERF.gs_slow_query_info%rowtype; - query_str text; - query_str_cn text; - BEGIN - IF $1 IN ('start_time', 'finish_time') THEN - ELSE - raise WARNING 'Illegal character entered for function, colname must be start_time or finish_time'; - return; - END IF; - --Get all the node names - query_str_cn := 'SELECT * FROM DBE_PERF.gs_slow_query_info where '||$1||'>'''''||$2||''''' and '||$1||'<'''''||$3||''''' limit '||$4; - query_str := 'EXECUTE DIRECT ON COORDINATORS ''' || query_str_cn||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - DROP FUNCTION IF EXISTS DBE_PERF.get_global_active_session() CASCADE; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_active_session - (OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text, - OUT locktag text, - OUT lockmode text, - OUT block_sessionid bigint, - OUT final_block_sessionid bigint, - OUT wait_status text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA record; - QUERY_STR TEXT; - BEGIN - QUERY_STR := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.local_active_session'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := ROW_DATA.node_name; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - unique_query := ROW_DATA.unique_query; - locktag := ROW_DATA.locktag; - lockmode := ROW_DATA.lockmode; - block_sessionid := ROW_DATA.block_sessionid; - final_block_sessionid := ROW_DATA.final_block_sessionid; - wait_status := ROW_DATA.wait_status; - RETURN NEXT; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - - CREATE OR REPLACE VIEW DBE_PERF.global_active_session AS - SELECT * FROM DBE_PERF.get_global_active_session(); - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, - OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON DATANODES ''SELECT pgxc_node_str() as node_name,* FROM DBE_PERF.stat_xact_all_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name,* FROM DBE_PERF.stat_xact_all_tables where schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_xact_all_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, - OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON DATANODES '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - N.nspname AS toastrelschemaname, - C.relname AS toastrelname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_all_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - query_str := 'EXECUTE DIRECT ON COORDINATORS '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_all_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid - WHERE T.schemaname = ''''pg_catalog'''' OR T.schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_stat_activity - (out coorname text, out datid oid, out datname text, out pid bigint, - out usesysid oid, out usename text, out application_name text, out client_addr inet, - out client_hostname text, out client_port integer, out backend_start timestamptz, - out xact_start timestamptz, out query_start timestamptz, out state_change timestamptz, - out waiting boolean, out enqueue text, out state text, out resource_pool name, - out query_id bigint, out query text) - RETURNS setof record - AS $$ - DECLARE - row_data record; - fet_active text; - BEGIN - fet_active := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name, * FROM DBE_PERF.session_stat_activity'''; - FOR row_data IN EXECUTE(fet_active) LOOP - coorname := row_data.node_name; - datid :=row_data.datid; - datname := row_data.datname; - pid := row_data.pid; - usesysid :=row_data.usesysid; - usename := row_data.usename; - application_name := row_data.application_name; - client_addr := row_data.client_addr; - client_hostname :=row_data.client_hostname; - client_port :=row_data.client_port; - backend_start := row_data.backend_start; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - state_change := row_data.state_change; - waiting := row_data.waiting; - enqueue := row_data.enqueue; - state := row_data.state; - resource_pool :=row_data.resource_pool; - query_id :=row_data.query_id; - query := row_data.query; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_cn_stat_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON COORDINATORS '' - SELECT pgxc_node_str() as node_name, * FROM DBE_PERF.stat_all_tables WHERE schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_stat_db_cu - (OUT node_name1 text, OUT db_name text, - OUT mem_hit bigint, OUT hdd_sync_read bigint, - OUT hdd_asyn_read bigint) - RETURNS setof record - AS $$ - DECLARE - each_node_out record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON ALL ''SELECT D.datname AS datname, - pg_stat_get_db_cu_mem_hit(D.oid) AS mem_hit, - pg_stat_get_db_cu_hdd_sync(D.oid) AS hdd_sync_read, - pg_stat_get_db_cu_hdd_asyn(D.oid) AS hdd_asyn_read, - pgxc_node_str() as node_name - FROM pg_database D;'''; - FOR each_node_out IN EXECUTE(query_str) LOOP - node_name1 := each_node_out.node_name; - db_name := each_node_out.datname; - mem_hit := each_node_out.mem_hit; - hdd_sync_read := each_node_out.hdd_sync_read; - hdd_asyn_read := each_node_out.hdd_asyn_read; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_cn_stat_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON COORDINATORS '' - SELECT pgxc_node_str() as node_name, * FROM DBE_PERF.stat_all_tables WHERE schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION dbe_perf.global_stat_activity_timeout(in execute_time int4, out nodename text, out database name, out pid int8, out sessionid int8, out usesysid oid, out application_name text, out query text, out xact_start timestamptz, out query_start timestamptz, out query_id int8) - RETURNS setof record - AS $$ - DECLARE - query_str text; - row_data record; - BEGIN - --Get the node names of all CNs - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name ,* FROM dbe_perf.gs_stat_activity_timeout(' || execute_time || ')'''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename := row_data.node_name; - database := row_data.database; - pid := row_data.pid; - sessionid := row_data.sessionid; - usesysid := row_data.usesysid; - application_name := row_data.application_name; - query := row_data.query; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - query_id := row_data.query_id; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_stat_activity - (out coorname text, out datid oid, out datname text, out pid bigint, - out usesysid oid, out usename text, out application_name text, out client_addr inet, - out client_hostname text, out client_port integer, out backend_start timestamptz, - out xact_start timestamptz, out query_start timestamptz, out state_change timestamptz, - out waiting boolean, out enqueue text, out state text, out resource_pool name, - out query_id bigint, out query text) - RETURNS setof record - AS $$ - DECLARE - row_data record; - fet_active text; - BEGIN - --Get all cn node names - fet_active := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name , * FROM DBE_PERF.session_stat_activity'''; - FOR row_data IN EXECUTE(fet_active) LOOP - coorname := row_data.node_name; - datid :=row_data.datid; - datname := row_data.datname; - pid := row_data.pid; - usesysid :=row_data.usesysid; - usename := row_data.usename; - application_name := row_data.application_name; - client_addr := row_data.client_addr; - client_hostname :=row_data.client_hostname; - client_port :=row_data.client_port; - backend_start := row_data.backend_start; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - state_change := row_data.state_change; - waiting := row_data.waiting; - enqueue := row_data.enqueue; - state := row_data.state; - resource_pool :=row_data.resource_pool; - query_id :=row_data.query_id; - query := row_data.query; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_ec_runtime() - RETURNS setof DBE_PERF.operator_ec_runtime - AS $$ - DECLARE - row_data DBE_PERF.operator_ec_runtime%rowtype; - fet_active text; - BEGIN - --Get all the CN node names - fet_active := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.operator_ec_runtime'''; - FOR row_data IN EXECUTE(fet_active) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.global_plancache_clean() - RETURNS BOOLEAN - AS $$ - DECLARE - ROW_DATA record; - QUERY_STR TEXT; - BEGIN - QUERY_STR := 'EXECUTE DIRECT ON ALL ''SELECT * from DBE_PERF.local_plancache_clean'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - END LOOP; - RETURN TRUE; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.global_slow_query_history - RETURNS setof DBE_PERF.gs_slow_query_history - AS $$ - DECLARE - row_data DBE_PERF.gs_slow_query_history%rowtype; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.gs_slow_query_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - SELECT SESSION_USER INTO user_name; - global_query_str := 'GRANT ALL ON TABLE DBE_PERF.global_active_session TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE global_query_str; - GRANT SELECT ON DBE_PERF.global_active_session TO public; - end if; -END $DO$; CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_statistics() RETURNS setof record AS $$ @@ -16282,79 +10520,6 @@ DECLARE END; $$ LANGUAGE 'plpgsql' NOT FENCED; - CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_get_wal_senders_status(OUT nodename text, OUT source_ip text, OUT source_port integer,OUT dest_ip text, OUT dest_port integer,OUT sender_pid int, OUT local_role text, OUT peer_role text, OUT peer_state text, - OUT state text, - OUT sender_sent_location text, OUT sender_write_location text, OUT sender_flush_location text, OUT sender_replay_location text, - OUT receiver_received_location text, OUT receiver_write_location text, OUT receiver_flush_location text, OUT receiver_replay_location text) - - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - source_addr text; - dest_addr text; - BEGIN - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM pg_stat_get_wal_senders()'''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename = row_data.node_name; - source_addr = substring(row_data.channel from 0 for position('-->' in row_data.channel)); - dest_addr = substring(row_data.channel from position('-->' in row_data.channel) + 3); - source_ip = substring(source_addr from 0 for position(':' in source_addr)); - source_port = cast(substring(source_addr from position(':' in source_addr) + 1) as integer); - dest_ip = substring(dest_addr from 0 for position(':' in dest_addr)); - dest_port = cast(substring(dest_addr from position(':' in dest_addr) + 1) as integer); - sender_pid = row_data.sender_pid; - local_role = row_data.local_role; - peer_role = row_data.peer_role; - peer_state = row_data.peer_state; - state = row_data.state; - sender_sent_location = row_data.sender_sent_location; - sender_write_location = row_data.sender_write_location; - sender_flush_location = row_data.sender_flush_location; - sender_replay_location = row_data.sender_replay_location; - receiver_received_location = row_data.receiver_received_location; - receiver_write_location = row_data.receiver_write_location; - receiver_flush_location = row_data.receiver_flush_location; - receiver_replay_location = row_data.receiver_replay_location; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_get_stat_session_cu(OUT node_name1 text, OUT mem_hit int, OUT hdd_sync_read int, OUT hdd_asyn_read int) -RETURNS setof record -AS $$ -DECLARE - each_node_out record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM pg_stat_session_cu()'''; - FOR each_node_out IN EXECUTE(query_str) LOOP - node_name1 := each_node_out.node_name; - mem_hit := each_node_out.mem_hit; - hdd_sync_read := each_node_out.hdd_sync_read; - hdd_asyn_read := each_node_out.hdd_asyn_read; - return next; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_stat_reset() -RETURNS void -AS $$ -DECLARE - each_node_out record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON ALL ''SELECT * FROM pg_stat_reset()'''; - EXECUTE(query_str); - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - CREATE OR REPLACE FUNCTION pg_catalog.pgxc_comm_delay() RETURNS setof pg_comm_delay AS $$ @@ -16464,75 +10629,9 @@ DECLARE END; $$ LANGUAGE 'plpgsql' NOT FENCED; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_bad_block(OUT nodename TEXT, OUT databaseid INT4, OUT tablespaceid INT4, OUT relfilenode INT4, OUT forknum INT4, OUT error_count INT4, OUT first_time timestamp with time zone, OUT last_time timestamp with time zone) -RETURNS setof record -AS $$ -DECLARE - each_node_out record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON DATANODES ''SELECT pgxc_node_str() as node_name ,* FROM pg_stat_bad_block()'''; - FOR each_node_out IN EXECUTE(query_str) LOOP - nodename := each_node_out.node_name; - databaseid := each_node_out.databaseid; - tablespaceid := each_node_out.tablespaceid; - relfilenode := each_node_out.relfilenode; - forknum := each_node_out.forknum; - error_count := each_node_out.error_count; - first_time := each_node_out.first_time; - last_time := each_node_out.last_time; - return next; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_bad_block_clear() -RETURNS void -AS $$ -DECLARE - each_node_out record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON DATANODES ''SELECT * FROM pg_stat_bad_block_clear()'''; - EXECUTE(query_str); - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - DROP FUNCTION IF EXISTS pg_catalog.pgxc_query_audit(IN starttime TIMESTAMPTZ, IN endtime TIMESTAMPTZ, OUT "time" TIMESTAMPTZ, OUT "type" text, OUT "result" text, OUT userid text, OUT username text, OUT database text, OUT client_conninfo text, OUT "object_name" text, OUT detail_info text, OUT node_name text, OUT thread_id text, OUT local_port text, OUT remote_port text) CASCADE; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_query_audit(IN starttime TIMESTAMPTZ, IN endtime TIMESTAMPTZ, OUT "time" TIMESTAMPTZ, OUT "type" text, OUT "result" text, OUT userid text, OUT username text, OUT database text, OUT client_conninfo text, OUT "object_name" text, OUT detail_info text, OUT node_name text, OUT thread_id text, OUT local_port text, OUT remote_port text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - query_str text; - BEGIN - --Get the node names of all CNs - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM pg_catalog.pg_query_audit(''''' || starttime || ''''',''''' || endtime || ''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - "time" := row_data."time"; - "type" := row_data."type"; - "result" := row_data."result"; - userid := row_data.userid; - username := row_data.username; - database := row_data.database; - client_conninfo := row_data.client_conninfo; - "object_name" := row_data."object_name"; - detail_info := row_data.detail_info; - node_name := row_data.node_name; - thread_id := row_data.thread_id; - local_port := row_data.local_port; - remote_port := row_data.remote_port; - return next; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - DROP FUNCTION IF EXISTS pg_catalog.pgxc_stat_all_tables() CASCADE; @@ -16564,174 +10663,6 @@ CREATE VIEW pg_catalog.pgxc_get_stat_all_tables AS AS NUMERIC(5,2)) dirty_page_rate FROM pgxc_stat_all_tables() GROUP BY (relname,schemaname)) s WHERE p.relname = s.relname AND p.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = s.schemaname) AND p.relname NOT LIKE '%pg_cudesc%' ORDER BY dirty_page_rate DESC; -CREATE OR REPLACE FUNCTION pg_catalog.gs_get_stat_db_cu(OUT node_name1 text, OUT db_name text, OUT mem_hit bigint, OUT hdd_sync_read bigint, OUT hdd_asyn_read bigint) -RETURNS setof record -AS $$ -DECLARE - each_node_out record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON ALL ''SELECT D.datname AS datname, - pg_stat_get_db_cu_mem_hit(D.oid) AS mem_hit, - pg_stat_get_db_cu_hdd_sync(D.oid) AS hdd_sync_read, - pg_stat_get_db_cu_hdd_asyn(D.oid) AS hdd_asyn_read, - pgxc_node_str() as node_name - FROM pg_database D;'''; - FOR each_node_out IN EXECUTE(query_str) LOOP - node_name1 := each_node_out.node_name; - db_name := each_node_out.datname; - mem_hit := each_node_out.mem_hit; - hdd_sync_read := each_node_out.hdd_sync_read; - hdd_asyn_read := each_node_out.hdd_asyn_read; - return next; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_delta_info(IN rel TEXT, OUT node_name TEXT, OUT part_name TEXT, OUT live_tuple INT8, OUT data_size INT8, OUT blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_str text; - rel_info record; - row_data record; - BEGIN - EXECUTE format('select c.relname,n.nspname from pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) where C.oid = (select %L::regclass::oid)', rel) into rel_info; - query_str := 'EXECUTE DIRECT ON DATANODES ''SELECT pgxc_node_str() as node_name , * from pg_catalog.pg_get_delta_info('''''||rel_info.relname||''''','''''||rel_info.nspname||''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - live_tuple := row_data.live_tuple; - data_size := row_data.data_size; - blockNum := row_data.blockNum; - part_name := row_data.part_name; - return next; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_activity_with_conninfo -( -out coorname text, -out datid oid, -out datname text, -out pid bigint, -out sessionid bigint, -out usesysid oid, -out usename text, -out application_name text, -out client_addr inet, -out client_hostname text, -out client_port integer, -out backend_start timestamptz, -out xact_start timestamptz, -out query_start timestamptz, -out state_change timestamptz, -out waiting boolean, -out enqueue text, -out state text, -out resource_pool name, -out query_id bigint, -out query text, -out connection_info text -) -RETURNS setof record -AS $$ -DECLARE - row_data record; - fet_active text; - BEGIN - --Get all the node names - fet_active := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name ,* FROM pg_stat_activity '''; - FOR row_data IN EXECUTE(fet_active) LOOP - coorname := row_data.node_name; - datid :=row_data.datid; - datname := row_data.datname; - pid := row_data.pid; - sessionid := row_data.sessionid; - usesysid :=row_data.usesysid; - usename := row_data.usename; - application_name := row_data.application_name; - client_addr := row_data.client_addr; - client_hostname :=row_data.client_hostname; - client_port :=row_data.client_port; - backend_start := row_data.backend_start; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - state_change := row_data.state_change; - waiting := row_data.waiting; - enqueue := row_data.enqueue; - state := row_data.state; - resource_pool :=row_data.resource_pool; - query_id :=row_data.query_id; - query := row_data.query; - connection_info := row_data.connection_info; - return next; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_activity -( -out coorname text, -out datid oid, -out datname text, -out pid bigint, -out sessionid bigint, -out usesysid oid, -out usename text, -out application_name text, -out client_addr inet, -out client_hostname text, -out client_port integer, -out backend_start timestamptz, -out xact_start timestamptz, -out query_start timestamptz, -out state_change timestamptz, -out waiting boolean, -out enqueue text, -out state text, -out resource_pool name, -out query_id bigint, -out query text -) -RETURNS setof record -AS $$ -DECLARE - row_data record; - fet_active text; - BEGIN - --Get all the node names - fet_active := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name ,* FROM pg_stat_activity '''; - FOR row_data IN EXECUTE(fet_active) LOOP - coorname := row_data.node_name; - datid :=row_data.datid; - datname := row_data.datname; - pid := row_data.pid; - sessionid := row_data.sessionid; - usesysid :=row_data.usesysid; - usename := row_data.usename; - application_name := row_data.application_name; - client_addr := row_data.client_addr; - client_hostname :=row_data.client_hostname; - client_port :=row_data.client_port; - backend_start := row_data.backend_start; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - state_change := row_data.state_change; - waiting := row_data.waiting; - enqueue := row_data.enqueue; - state := row_data.state; - resource_pool :=row_data.resource_pool; - query_id :=row_data.query_id; - query := row_data.query; - return next; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - create or replace function pg_catalog.pgxc_cgroup_map_ng_conf(IN ngname text) returns bool AS $$ @@ -16750,101 +10681,6 @@ begin end; $$language plpgsql NOT FENCED; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_xacts_iscommitted(IN xid int8, OUT nodename text, OUT iscommitted bool) -RETURNS setof record -AS $$ -DECLARE - row_data record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_is_committed('|| xid ||'::text::xid) as bcommitted , pgxc_node_str() as node_name'''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename = row_data.node_name; - iscommitted = row_data.bcommitted; - return next; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_senders_catchup_time(OUT nodename text, OUT lwpid int, OUT local_role text, OUT peer_role text, - OUT state text, OUT sender text, - OUT catchup_start TimestampTz, OUT catchup_end TimestampTz) - -RETURNS setof record -AS $$ -DECLARE - row_data record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name,* FROM pg_get_senders_catchup_time where state = ''''Catchup'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename = row_data.node_name; - lwpid = row_data.lwpid; - local_role = row_data.local_role; - peer_role = row_data.peer_role; - state = row_data.state; - sender = row_data."type"; - catchup_start = row_data.catchup_start; - catchup_end = row_data.catchup_end; - return next; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_parse_clog(OUT xid int8, OUT nodename text, OUT status text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL''SELECT pgxc_node_str() as node_name, * FROM pg_parse_clog() '''; - FOR row_data IN EXECUTE(query_str) LOOP - xid = row_data.xid; - nodename = row_data.node_name; - status = row_data.status; - return next; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_get_wal_senders(OUT nodename text, OUT sender_pid int, OUT local_role text, OUT peer_role text, OUT peer_state text, - OUT state text, - OUT sender_sent_location text, OUT sender_write_location text, OUT sender_flush_location text, OUT sender_replay_location text, - OUT receiver_received_location text, OUT receiver_write_location text, OUT receiver_flush_location text, OUT receiver_replay_location text) - -RETURNS setof record -AS $$ -DECLARE - row_data record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name, * FROM pg_stat_get_wal_senders() where sender_flush_location != receiver_replay_location '''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename = row_data.node_name; - sender_pid = row_data.sender_pid; - local_role = row_data.local_role; - peer_role = row_data.peer_role; - peer_state = row_data.peer_state; - state = row_data.state; - sender_sent_location = row_data.sender_sent_location; - sender_write_location = row_data.sender_write_location; - sender_flush_location = row_data.sender_flush_location; - sender_replay_location = row_data.sender_replay_location; - receiver_received_location = row_data.receiver_received_location; - receiver_write_location = row_data.receiver_write_location; - receiver_flush_location = row_data.receiver_flush_location; - receiver_replay_location = row_data.receiver_replay_location; - return next; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql'; - CREATE OR REPLACE FUNCTION pg_catalog.reload_active_coordinator() RETURNS boolean AS $$ @@ -17149,76 +10985,75 @@ BEGIN CREATE VIEW DBE_PERF.statement_history AS select * from pg_catalog.statement_history; CREATE OR REPLACE FUNCTION DBE_PERF.get_global_full_sql_by_timestamp - (in start_timestamp timestamp with time zone, - in end_timestamp timestamp with time zone, - OUT node_name name, - OUT db_name name, - OUT schema_name name, - OUT origin_node integer, - OUT user_name name, - OUT application_name text, - OUT client_addr text, - OUT client_port integer, - OUT unique_query_id bigint, - OUT debug_query_id bigint, - OUT query text, - OUT start_time timestamp with time zone, - OUT finish_time timestamp with time zone, - OUT slow_sql_threshold bigint, - OUT transaction_id bigint, - OUT thread_id bigint, - OUT session_id bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT query_plan text, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - OUT net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text, - OUT lock_count bigint, - OUT lock_time bigint, - OUT lock_wait_count bigint, - OUT lock_wait_time bigint, - OUT lock_max_count bigint, - OUT lwlock_count bigint, - OUT lwlock_wait_count bigint, - OUT lwlock_time bigint, - OUT lwlock_wait_time bigint, - OUT details bytea, - OUT is_slow_sql bool) - RETURNS setof record - AS $$ - DECLARE - row_data pg_catalog.statement_history%rowtype; - query_str text; - -- node name - node_names name[]; - each_node_name name; - BEGIN - -- Get all node names(CN + master DN) - node_names := ARRAY(SELECT pgxc_node.node_name FROM pgxc_node WHERE (node_type = 'C' or node_type = 'D') AND nodeis_active = true); - FOREACH each_node_name IN ARRAY node_names - LOOP - query_str := 'EXECUTE DIRECT ON (' || each_node_name || ') ''SELECT * FROM DBE_PERF.statement_history where start_time >= ''''' ||$1|| ''''' and start_time <= ''''' || $2 || ''''''''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := each_node_name; + (in start_timestamp timestamp with time zone, + in end_timestamp timestamp with time zone, + OUT node_name name, + OUT db_name name, + OUT schema_name name, + OUT origin_node integer, + OUT user_name name, + OUT application_name text, + OUT client_addr text, + OUT client_port integer, + OUT unique_query_id bigint, + OUT debug_query_id bigint, + OUT query text, + OUT start_time timestamp with time zone, + OUT finish_time timestamp with time zone, + OUT slow_sql_threshold bigint, + OUT transaction_id bigint, + OUT thread_id bigint, + OUT session_id bigint, + OUT n_soft_parse bigint, + OUT n_hard_parse bigint, + OUT query_plan text, + OUT n_returned_rows bigint, + OUT n_tuples_fetched bigint, + OUT n_tuples_returned bigint, + OUT n_tuples_inserted bigint, + OUT n_tuples_updated bigint, + OUT n_tuples_deleted bigint, + OUT n_blocks_fetched bigint, + OUT n_blocks_hit bigint, + OUT db_time bigint, + OUT cpu_time bigint, + OUT execution_time bigint, + OUT parse_time bigint, + OUT plan_time bigint, + OUT rewrite_time bigint, + OUT pl_execution_time bigint, + OUT pl_compilation_time bigint, + OUT data_io_time bigint, + OUT net_send_info text, + OUT net_recv_info text, + OUT net_stream_send_info text, + OUT net_stream_recv_info text, + OUT lock_count bigint, + OUT lock_time bigint, + OUT lock_wait_count bigint, + OUT lock_wait_time bigint, + OUT lock_max_count bigint, + OUT lwlock_count bigint, + OUT lwlock_wait_count bigint, + OUT lwlock_time bigint, + OUT lwlock_wait_time bigint, + OUT details bytea, + OUT is_slow_sql bool) + RETURNS setof record + AS $$ + DECLARE + row_data pg_catalog.statement_history%rowtype; + row_name record; + query_str text; + -- node name + query_str_nodes text; + BEGIN + -- Get all node names(CN + master DN) + query_str_nodes := 'select * from dbe_perf.node_name'; + FOR row_name IN EXECUTE(query_str_nodes) LOOP + query_str := 'SELECT * FROM DBE_PERF.statement_history where start_time >= ''' ||$1|| ''' and start_time <= ''' || $2 || ''''; + FOR row_data IN EXECUTE(query_str) LOOP + node_name := row_name.node_name; db_name := row_data.db_name; schema_name := row_data.schema_name; origin_node := row_data.origin_node; @@ -17278,77 +11113,75 @@ BEGIN LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE FUNCTION DBE_PERF.get_global_slow_sql_by_timestamp - (in start_timestamp timestamp with time zone, - in end_timestamp timestamp with time zone, - OUT node_name name, - OUT db_name name, - OUT schema_name name, - OUT origin_node integer, - OUT user_name name, - OUT application_name text, - OUT client_addr text, - OUT client_port integer, - OUT unique_query_id bigint, - OUT debug_query_id bigint, - OUT query text, - OUT start_time timestamp with time zone, - OUT finish_time timestamp with time zone, - OUT slow_sql_threshold bigint, - OUT transaction_id bigint, - OUT thread_id bigint, - OUT session_id bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT query_plan text, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - OUT net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text, - OUT lock_count bigint, - OUT lock_time bigint, - OUT lock_wait_count bigint, - OUT lock_wait_time bigint, - OUT lock_max_count bigint, - OUT lwlock_count bigint, - OUT lwlock_wait_count bigint, - OUT lwlock_time bigint, - OUT lwlock_wait_time bigint, - OUT details bytea, - OUT is_slow_sql bool) - RETURNS setof record - AS $$ - DECLARE + (in start_timestamp timestamp with time zone, + in end_timestamp timestamp with time zone, + OUT node_name name, + OUT db_name name, + OUT schema_name name, + OUT origin_node integer, + OUT user_name name, + OUT application_name text, + OUT client_addr text, + OUT client_port integer, + OUT unique_query_id bigint, + OUT debug_query_id bigint, + OUT query text, + OUT start_time timestamp with time zone, + OUT finish_time timestamp with time zone, + OUT slow_sql_threshold bigint, + OUT transaction_id bigint, + OUT thread_id bigint, + OUT session_id bigint, + OUT n_soft_parse bigint, + OUT n_hard_parse bigint, + OUT query_plan text, + OUT n_returned_rows bigint, + OUT n_tuples_fetched bigint, + OUT n_tuples_returned bigint, + OUT n_tuples_inserted bigint, + OUT n_tuples_updated bigint, + OUT n_tuples_deleted bigint, + OUT n_blocks_fetched bigint, + OUT n_blocks_hit bigint, + OUT db_time bigint, + OUT cpu_time bigint, + OUT execution_time bigint, + OUT parse_time bigint, + OUT plan_time bigint, + OUT rewrite_time bigint, + OUT pl_execution_time bigint, + OUT pl_compilation_time bigint, + OUT data_io_time bigint, + OUT net_send_info text, + OUT net_recv_info text, + OUT net_stream_send_info text, + OUT net_stream_recv_info text, + OUT lock_count bigint, + OUT lock_time bigint, + OUT lock_wait_count bigint, + OUT lock_wait_time bigint, + OUT lock_max_count bigint, + OUT lwlock_count bigint, + OUT lwlock_wait_count bigint, + OUT lwlock_time bigint, + OUT lwlock_wait_time bigint, + OUT details bytea, + OUT is_slow_sql bool) + RETURNS setof record + AS $$ + DECLARE row_data pg_catalog.statement_history%rowtype; row_name record; query_str text; -- node name - node_names name[]; - each_node_name name; + query_str_nodes text; BEGIN -- Get all node names(CN + master DN) - node_names := ARRAY(SELECT pgxc_node.node_name FROM pgxc_node WHERE (node_type = 'C' or node_type = 'D') AND nodeis_active = true); - FOREACH each_node_name IN ARRAY node_names - LOOP - query_str := 'EXECUTE DIRECT ON (' || each_node_name || ') ''SELECT * FROM DBE_PERF.statement_history where start_time >= ''''' ||$1|| ''''' and start_time <= ''''' || $2 || ''''' and is_slow_sql = true '''; + query_str_nodes := 'select * from dbe_perf.node_name'; + FOR row_name IN EXECUTE(query_str_nodes) LOOP + query_str := 'SELECT * FROM DBE_PERF.statement_history where start_time >= ''' ||$1|| ''' and start_time <= ''' || $2 || ''' and is_slow_sql = true '; FOR row_data IN EXECUTE(query_str) LOOP - node_name := each_node_name; + node_name := row_name.node_name; db_name := row_data.db_name; schema_name := row_data.schema_name; origin_node := row_data.origin_node; @@ -17504,3 +11337,143 @@ BEGIN END IF; END; / + +CREATE OR REPLACE VIEW pg_catalog.pg_seclabels AS +SELECT + l.objoid, l.classoid, l.objsubid, + CASE WHEN rel.relkind = 'r' THEN 'table'::text + WHEN rel.relkind = 'v' THEN 'view'::text + WHEN rel.relkind = 'm' THEN 'materialized view'::text + WHEN rel.relkind = 'S' THEN 'sequence'::text + WHEN rel.relkind = 'f' THEN 'foreign table'::text END AS objtype, + rel.relnamespace AS objnamespace, + CASE WHEN pg_table_is_visible(rel.oid) + THEN quote_ident(rel.relname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(rel.relname) + END AS objname, + l.provider, l.label +FROM + pg_seclabel l + JOIN pg_class rel ON l.classoid = rel.tableoid AND l.objoid = rel.oid + JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid +WHERE + l.objsubid = 0 +UNION ALL +SELECT + l.objoid, l.classoid, l.objsubid, + 'column'::text AS objtype, + rel.relnamespace AS objnamespace, + CASE WHEN pg_table_is_visible(rel.oid) + THEN quote_ident(rel.relname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(rel.relname) + END || '.' || att.attname AS objname, + l.provider, l.label +FROM + pg_seclabel l + JOIN pg_class rel ON l.classoid = rel.tableoid AND l.objoid = rel.oid + JOIN pg_attribute att + ON rel.oid = att.attrelid AND l.objsubid = att.attnum + JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid +WHERE + l.objsubid != 0 +UNION ALL +SELECT + l.objoid, l.classoid, l.objsubid, + CASE WHEN pro.proisagg = true THEN 'aggregate'::text + WHEN pro.proisagg = false THEN 'function'::text + END AS objtype, + pro.pronamespace AS objnamespace, + CASE WHEN pg_function_is_visible(pro.oid) + THEN quote_ident(pro.proname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(pro.proname) + END || '(' || pg_catalog.pg_get_function_arguments(pro.oid) || ')' AS objname, + l.provider, l.label +FROM + pg_seclabel l + JOIN pg_proc pro ON l.classoid = pro.tableoid AND l.objoid = pro.oid + JOIN pg_namespace nsp ON pro.pronamespace = nsp.oid +WHERE + l.objsubid = 0 +UNION ALL +SELECT + l.objoid, l.classoid, l.objsubid, + CASE WHEN typ.typtype = 'd' THEN 'domain'::text + ELSE 'type'::text END AS objtype, + typ.typnamespace AS objnamespace, + CASE WHEN pg_type_is_visible(typ.oid) + THEN quote_ident(typ.typname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(typ.typname) + END AS objname, + l.provider, l.label +FROM + pg_seclabel l + JOIN pg_type typ ON l.classoid = typ.tableoid AND l.objoid = typ.oid + JOIN pg_namespace nsp ON typ.typnamespace = nsp.oid +WHERE + l.objsubid = 0 +UNION ALL +SELECT + l.objoid, l.classoid, l.objsubid, + 'large object'::text AS objtype, + NULL::oid AS objnamespace, + l.objoid::text AS objname, + l.provider, l.label +FROM + pg_seclabel l + JOIN pg_largeobject_metadata lom ON l.objoid = lom.oid +WHERE + l.classoid = 'pg_catalog.pg_largeobject'::regclass AND l.objsubid = 0 +UNION ALL +SELECT + l.objoid, l.classoid, l.objsubid, + 'language'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident(lan.lanname) AS objname, + l.provider, l.label +FROM + pg_seclabel l + JOIN pg_language lan ON l.classoid = lan.tableoid AND l.objoid = lan.oid +WHERE + l.objsubid = 0 +UNION ALL +SELECT + l.objoid, l.classoid, l.objsubid, + 'schema'::text AS objtype, + nsp.oid AS objnamespace, + quote_ident(nsp.nspname) AS objname, + l.provider, l.label +FROM + pg_seclabel l + JOIN pg_namespace nsp ON l.classoid = nsp.tableoid AND l.objoid = nsp.oid +WHERE + l.objsubid = 0 +UNION ALL +SELECT + l.objoid, l.classoid, 0::int4 AS objsubid, + 'database'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident(dat.datname) AS objname, + l.provider, l.label +FROM + pg_shseclabel l + JOIN pg_database dat ON l.classoid = dat.tableoid AND l.objoid = dat.oid +UNION ALL +SELECT + l.objoid, l.classoid, 0::int4 AS objsubid, + 'tablespace'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident(spc.spcname) AS objname, + l.provider, l.label +FROM + pg_shseclabel l + JOIN pg_tablespace spc ON l.classoid = spc.tableoid AND l.objoid = spc.oid +UNION ALL +SELECT + l.objoid, l.classoid, 0::int4 AS objsubid, + 'role'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident(rol.rolname) AS objname, + l.provider, l.label +FROM + pg_shseclabel l + JOIN pg_authid rol ON l.classoid = rol.tableoid AND l.objoid = rol.oid; \ No newline at end of file diff --git a/src/include/catalog/upgrade_sql/open_gauss/upgrade_catalog_maindb/upgrade_catalog_maindb_92_200.sql b/src/include/catalog/upgrade_sql/open_gauss/upgrade_catalog_maindb/upgrade_catalog_maindb_92_200.sql index 89947471d..f4f95a3e9 100644 --- a/src/include/catalog/upgrade_sql/open_gauss/upgrade_catalog_maindb/upgrade_catalog_maindb_92_200.sql +++ b/src/include/catalog/upgrade_sql/open_gauss/upgrade_catalog_maindb/upgrade_catalog_maindb_92_200.sql @@ -97,71 +97,6 @@ RETURNS BOOL LANGUAGE INTERNAL strict volatile as 'pgxc_unlock_for_transfer'; DROP FUNCTION IF EXISTS pg_catalog.table_skewness(text, OUT DNName text, OUT Num text, OUT Ratio text); DROP FUNCTION IF EXISTS pg_catalog.distributed_count(IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text); -CREATE OR REPLACE FUNCTION pg_catalog.distributed_count(IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - total_num bigint; - flag boolean; - special text := '[;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN _table_name, IN special; - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - RETURN; - END IF; - EXECUTE 'SELECT count(1) FROM ' || _table_name - INTO total_num; - - --Get the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node, pgxc_class where node_type IN (''C'', ''D'') AND is_oid_in_group_members(oid, nodeoids) AND - pcrelid=''' || _table_name || '''::regclass::oid'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select ''''DN_name'''' as dnname1, count(1) as count1 from ' || $1 || ''''; - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.dnname1 := CASE - WHEN LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-length(row_name.node_name)) - ELSE SUBSTR(row_name.node_name,1,20) - END; - DNName := row_data.dnname1; - Num := row_data.count1; - IF total_num = 0 THEN - Ratio := 0.000 ||'%'; - ELSE - Ratio := ROUND(row_data.count1/total_num*100,3) || '%'; - END IF; - RETURN next; - END LOOP; - END LOOP; - - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.table_skewness(text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -declare -flag boolean; -special text := '[;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - return NEXT; - ELSE - RETURN QUERY EXECUTE 'SELECT * FROM distributed_count(''' || $1 || ''') ORDER BY num DESC, dnname'; - END IF; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -- upgrade 3956 DROP FUNCTION IF EXISTS pg_catalog.threadpool_status; @@ -543,36 +478,6 @@ SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 4520; CREATE FUNCTION pg_catalog.gs_stat_activity_timeout(IN timeout_threshold int4, OUT datid oid, OUT pid INT8, OUT sessionid INT8, OUT usesysid oid, OUT application_name text, OUT query text, OUT xact_start timestamptz, OUT query_start timestamptz, OUT query_id INT8) RETURNS SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_activity_timeout'; -CREATE OR REPLACE FUNCTION pg_catalog.global_stat_activity_timeout(in execute_time int4, out nodename text, out datid oid, out pid int8, out sessionid int8, out usesysid oid, out application_name text, out query text, out xact_start timestamptz, out query_start timestamptz, out query_id int8) -RETURNS setof record -AS $$ -DECLARE - query_str text; - node_data record; - row_data record; -BEGIN - --Get the node names of all CNs - query_str := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR node_data IN EXECUTE(query_str) LOOP - query_str := 'EXECUTE DIRECT ON (' || node_data.node_name || ') ''SELECT * FROM gs_stat_activity_timeout(' || execute_time || ')'''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename := node_data.node_name; - datid := row_data.datid; - pid := row_data.pid; - sessionid := row_data.sessionid; - usesysid := row_data.usesysid; - application_name := row_data.application_name; - query := row_data.query; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - query_id := row_data.query_id; - return next; - END LOOP; - END LOOP; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - DROP VIEW IF EXISTS pg_catalog.pgxc_wlm_session_history CASCADE; DROP FUNCTION IF EXISTS pg_catalog.pgxc_get_wlm_session_history() CASCADE; DROP VIEW IF EXISTS pg_catalog.gs_wlm_session_history CASCADE; @@ -917,122 +822,6 @@ SELECT S.top_cpu_dn FROM pg_catalog.gs_wlm_session_info_all S; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_history() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_catalog.gs_wlm_session_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE VIEW pg_catalog.pgxc_wlm_session_history AS -SELECT * FROM pg_catalog.pgxc_get_wlm_session_history() AS -( -datid Oid, -dbname text, -schemaname text, -nodename text, -username text, -application_name text, -client_addr inet, -client_hostname text, -client_port int, -query_band text, -block_time bigint, -start_time timestamp with time zone, -finish_time timestamp with time zone, -duration bigint, -estimate_total_time bigint, -status text, -abort_info text, -resource_pool text, -control_group text, -estimate_memory int, -min_peak_memory int, -max_peak_memory int, -average_peak_memory int, -memory_skew_percent int, -spill_info text, -min_spill_size int, -max_spill_size int, -average_spill_size int, -spill_skew_percent int, -min_dn_time bigint, -max_dn_time bigint, -average_dn_time bigint, -dntime_skew_percent int, -min_cpu_time bigint, -max_cpu_time bigint, -total_cpu_time bigint, -cpu_skew_percent int, -min_peak_iops int, -max_peak_iops int, -average_peak_iops int, -iops_skew_percent int, -warning text, -queryid bigint, -query text, -query_plan text, -node_group text, -cpu_top1_node_name text, -cpu_top2_node_name text, -cpu_top3_node_name text, -cpu_top4_node_name text, -cpu_top5_node_name text, -mem_top1_node_name text, -mem_top2_node_name text, -mem_top3_node_name text, -mem_top4_node_name text, -mem_top5_node_name text, -cpu_top1_value bigint, -cpu_top2_value bigint, -cpu_top3_value bigint, -cpu_top4_value bigint, -cpu_top5_value bigint, -mem_top1_value bigint, -mem_top2_value bigint, -mem_top3_value bigint, -mem_top4_value bigint, -mem_top5_value bigint, -top_mem_dn text, -top_cpu_dn text -); - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_info() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_catalog.gs_wlm_session_info'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION pg_catalog.create_wlm_session_info(IN flag int) RETURNS int AS $$ @@ -1054,115 +843,10 @@ DECLARE END; $$ LANGUAGE plpgsql NOT FENCED; -CREATE VIEW pg_catalog.pgxc_wlm_session_info AS -SELECT * FROM pg_catalog.pgxc_get_wlm_session_info() AS -( - datid Oid, - dbname text, - schemaname text, - nodename text, - username text, - application_name text, - client_addr inet, - client_hostname text, - client_port int, - query_band text, - block_time bigint, - start_time timestamp with time zone, - finish_time timestamp with time zone, - duration bigint, - estimate_total_time bigint, - status text, - abort_info text, - resource_pool text, - control_group text, - estimate_memory int, - min_peak_memory int, - max_peak_memory int, - average_peak_memory int, - memory_skew_percent int, - spill_info text, - min_spill_size int, - max_spill_size int, - average_spill_size int, - spill_skew_percent int, - min_dn_time bigint, - max_dn_time bigint, - average_dn_time bigint, - dntime_skew_percent int, - min_cpu_time bigint, - max_cpu_time bigint, - total_cpu_time bigint, - cpu_skew_percent int, - min_peak_iops int, - max_peak_iops int, - average_peak_iops int, - iops_skew_percent int, - warning text, - queryid bigint, - query text, - query_plan text, - node_group text, - cpu_top1_node_name text, - cpu_top2_node_name text, - cpu_top3_node_name text, - cpu_top4_node_name text, - cpu_top5_node_name text, - mem_top1_node_name text, - mem_top2_node_name text, - mem_top3_node_name text, - mem_top4_node_name text, - mem_top5_node_name text, - cpu_top1_value bigint, - cpu_top2_value bigint, - cpu_top3_value bigint, - cpu_top4_value bigint, - cpu_top5_value bigint, - mem_top1_value bigint, - mem_top2_value bigint, - mem_top3_value bigint, - mem_top4_value bigint, - mem_top5_value bigint, - top_mem_dn text, - top_cpu_dn text -); - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_info_bytime(text, TIMESTAMP, TIMESTAMP, int) -RETURNS setof pg_catalog.gs_wlm_session_info -AS $$ -DECLARE - row_data gs_wlm_session_info%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_cn text; - BEGIN - IF $1 IN ('start_time', 'finish_time') THEN - - ELSE - raise WARNING 'Illegal character entered for function, colname must be start_time or finish_time'; - return; - END IF; - - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - query_str_cn := 'SELECT * FROM pg_catalog.gs_wlm_session_info where '||$1||'>'''''||$2||''''' and '||$1||'<'''''||$3||''''' limit '||$4; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_cn||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - GRANT SELECT ON TABLE pg_catalog.gs_wlm_session_query_info_all TO PUBLIC; GRANT SELECT ON TABLE pg_catalog.gs_wlm_session_history TO PUBLIC; GRANT SELECT ON TABLE pg_catalog.gs_wlm_session_info TO PUBLIC; GRANT SELECT ON TABLE pg_catalog.gs_wlm_session_info_all TO PUBLIC; -GRANT SELECT ON TABLE pg_catalog.pgxc_wlm_session_history TO PUBLIC; -GRANT SELECT ON TABLE pg_catalog.pgxc_wlm_session_info TO PUBLIC; DROP INDEX IF EXISTS pg_catalog.pg_asp_oid_index; DROP TYPE IF EXISTS pg_catalog.pg_asp; @@ -1397,23 +1081,9 @@ GRANT SELECT ON TABLE pg_catalog.gs_auditing_access TO PUBLIC; GRANT SELECT ON TABLE pg_catalog.gs_auditing_privilege TO PUBLIC; GRANT SELECT ON TABLE pg_catalog.gs_auditing TO PUBLIC; -DROP FUNCTION IF EXISTS dbms_job.isubmit_on_nodes(bigint, name, name, text, timestamp without time zone, text) cascade; -DROP FUNCTION IF EXISTS dbms_job.submit_on_nodes(name, name, text, timestamp without time zone, text, OUT integer) cascade; DROP FUNCTION IF EXISTS pg_catalog.capture_view_to_json(text, integer) cascade; SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5717; -CREATE FUNCTION dbms_job.submit_on_nodes(node_name name, database name, what text, next_date timestamp without time zone, job_interval text, OUT job integer) - RETURNS integer - LANGUAGE internal - NOT FENCED NOT SHIPPABLE -AS 'submit_job_on_nodes'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5718; -CREATE FUNCTION dbms_job.isubmit_on_nodes(job bigint, node_name name, database name, what text, next_date timestamp without time zone, job_interval text) - RETURNS integer - LANGUAGE internal - NOT FENCED NOT SHIPPABLE -AS 'isubmit_job_on_nodes'; SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5719; CREATE FUNCTION pg_catalog.capture_view_to_json(view_name text, is_all_db integer) @@ -1559,15 +1229,6 @@ SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 0, GRANT SELECT ON TABLE pg_catalog.streaming_stream TO PUBLIC; GRANT SELECT ON TABLE pg_catalog.streaming_cont_query TO PUBLIC; -DROP FUNCTION IF EXISTS dbms_job.isubmit_on_nodes_internal(bigint, name, name, text, timestamp without time zone, text) cascade; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 6007; -CREATE FUNCTION dbms_job.isubmit_on_nodes_internal(job bigint, node_name name, database name, what text, next_date timestamp without time zone, job_interval text) - RETURNS integer - LANGUAGE internal - NOT FENCED NOT SHIPPABLE -AS 'isubmit_job_on_nodes_internal'; - CREATE OR REPLACE FUNCTION pg_catalog.proc_add_depend( IN relationname name, IN dbname name @@ -1706,17 +1367,6 @@ DROP VIEW IF EXISTS pg_catalog.user_views CASCADE; drop view if exists pg_catalog.v$session CASCADE; drop view if exists pg_catalog.V$SESSION_LONGOPS CASCADE; -DROP FUNCTION IF EXISTS dbms_job.remove(bigint) cascade; -DROP FUNCTION IF EXISTS dbms_job.change(bigint, text, timestamp, text) cascade; -DROP FUNCTION IF EXISTS dbms_job.what(bigint, text) cascade; -DROP FUNCTION IF EXISTS dbms_job.next_date(bigint, timestamp) cascade; -DROP FUNCTION IF EXISTS dbms_job.interval(bigint, text) cascade; -DROP FUNCTION IF EXISTS dbms_job.broken(bigint, boolean, timestamp) cascade; -DROP FUNCTION IF EXISTS dbms_job.isubmit(bigint, text, timestamp, text) cascade; -DROP FUNCTION IF EXISTS dbms_job.submit(text, timestamp, text, out integer) cascade; -DROP FUNCTION IF EXISTS dbms_job.isubmit_on_nodes(bigint, name, name, text, timestamp without time zone, text) cascade; -DROP FUNCTION IF EXISTS dbms_job.submit_on_nodes(name, name, text, timestamp without time zone, text, OUT integer) cascade; -DROP FUNCTION IF EXISTS dbms_job.isubmit_on_nodes_internal(bigint, name, name, text, timestamp without time zone, text) cascade; DROP SCHEMA IF EXISTS dbms_job cascade; CREATE OR REPLACE VIEW pg_catalog.gs_wlm_user_session_info AS @@ -2108,84 +1758,6 @@ CREATE UNIQUE INDEX gs_asp_sample_time_index ON pg_catalog.gs_asp USING BTREE(sa GRANT SELECT ON pg_catalog.gs_asp TO PUBLIC; SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 0, 0, 0, 0; -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_gs_asp - (in start_ts timestamp without time zone, - in end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) -RETURNS SETOF record -AS $$ -DECLARE - ROW_DATA pg_catalog.gs_asp%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - node_str TEXT; -BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'')'; - node_str := 'SELECT * FROM pg_catalog.gs_asp where sample_time > '''''||$1||''''' and sample_time < '''''||$2||''''; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') '''|| node_str ||''''';'; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := ROW_NAME.NODE_NAME; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - unique_query := ROW_DATA.unique_query; - RETURN NEXT; - END LOOP; - END LOOP; - RETURN; -END; $$ -LANGUAGE 'plpgsql'; - end if; -END$DO$; - -- use relfilenode to get schemane.tablename if the table is larger than threshold_size_gb CREATE OR REPLACE FUNCTION pg_catalog.get_large_table_name(relfile_node text, threshold_size_gb int8) RETURNS text @@ -2817,23 +2389,6 @@ DECLARE END; $$LANGUAGE plpgsql NOT FENCED; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC,3466; -CREATE FUNCTION pg_catalog.check_engine_status(IN text, IN text) RETURNS text LANGUAGE INTERNAL STABLE STRICT as 'check_engine_status'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC,3467; -CREATE FUNCTION pg_catalog.encode_plan_node(IN text, IN text, IN text, IN text, IN int8, IN text, IN text) RETURNS text LANGUAGE INTERNAL STABLE as 'encode_plan_node'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC,3481; -CREATE FUNCTION pg_catalog.model_train_opt(IN text, IN text, OUT startup_time_accuracy FLOAT8, OUT total_time_accuracy FLOAT8, OUT rows_accuracy FLOAT8, OUT peak_memory_accuracy FLOAT8) RETURNS SETOF RECORD LANGUAGE INTERNAL STABLE ROWS 1 STRICT as 'model_train_opt'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC,5033; -CREATE FUNCTION pg_catalog.gs_stat_get_wlm_plan_operator_info(IN OID, OUT datname text, OUT queryid int8, OUT plan_node_id int4, OUT startup_time int8, OUT total_time int8, OUT actual_rows int8, OUT max_peak_memory int4, OUT query_dop int4, OUT parent_node_id int4, OUT left_child_id int4, OUT right_child_id int4, OUT operation text, OUT orientation text, OUT strategy text, OUT options text, OUT condition text, OUT projection text) RETURNS SETOF RECORD LANGUAGE INTERNAL STABLE ROWS 100 STRICT as 'gs_stat_get_wlm_plan_operator_info'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC,3468; -CREATE FUNCTION pg_catalog.track_model_train_opt(IN text, IN text) RETURNS text LANGUAGE INTERNAL STABLE STRICT as 'track_model_train_opt'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 0, 0, 0, 0; - SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 3442; DROP FUNCTION IF EXISTS pg_catalog.pg_control_checkpoint() CASCADE; DROP FUNCTION IF EXISTS pg_catalog.pg_control_system() CASCADE; diff --git a/src/include/catalog/upgrade_sql/open_gauss/upgrade_catalog_otherdb/upgrade-post_catalog_otherdb_92_200.sql b/src/include/catalog/upgrade_sql/open_gauss/upgrade_catalog_otherdb/upgrade-post_catalog_otherdb_92_200.sql index d5b82af26..3ae865996 100644 --- a/src/include/catalog/upgrade_sql/open_gauss/upgrade_catalog_otherdb/upgrade-post_catalog_otherdb_92_200.sql +++ b/src/include/catalog/upgrade_sql/open_gauss/upgrade_catalog_otherdb/upgrade-post_catalog_otherdb_92_200.sql @@ -546,20 +546,20 @@ DROP FUNCTION IF EXISTS pg_catalog.proc_add_depend(name, name) cascade; CREATE OR REPLACE VIEW DBE_PERF.os_runtime AS SELECT * FROM pv_os_run_info(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_os_runtime +CREATE OR REPLACE FUNCTION dbe_perf.get_global_os_runtime (OUT node_name name, OUT id integer, OUT name text, OUT value numeric, OUT comments text, OUT cumulative boolean) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.os_runtime%rowtype; + row_data dbe_perf.os_runtime%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.os_runtime'''; + query_str := 'SELECT * FROM dbe_perf.os_runtime'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; id := row_data.id; @@ -586,19 +586,19 @@ CREATE OR REPLACE VIEW DBE_PERF.os_threads AS S.creation_time FROM pg_stat_get_thread() AS S; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_os_threads() -RETURNS setof DBE_PERF.os_threads +CREATE OR REPLACE FUNCTION dbe_perf.get_global_os_threads() +RETURNS setof dbe_perf.os_threads AS $$ DECLARE - row_data DBE_PERF.os_threads%rowtype; + row_data dbe_perf.os_threads%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.os_threads'''; + query_str := 'SELECT * FROM dbe_perf.os_threads'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -614,20 +614,20 @@ CREATE OR REPLACE VIEW DBE_PERF.global_os_threads AS CREATE OR REPLACE VIEW DBE_PERF.instance_time AS SELECT * FROM pv_instance_time(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_instance_time +CREATE OR REPLACE FUNCTION dbe_perf.get_global_instance_time (OUT node_name name, OUT stat_id integer, OUT stat_name text, OUT value bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.instance_time%rowtype; + row_data dbe_perf.instance_time%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all CN DN node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.instance_time'''; + query_str := 'SELECT * FROM dbe_perf.instance_time'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; stat_id := row_data.stat_id; @@ -681,22 +681,22 @@ CREATE OR REPLACE VIEW DBE_PERF.workload_sql_elapse_time AS pg_user left join pg_stat_get_sql_count() AS S on pg_user.usename = S.user_name GROUP by pg_user.respool; -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_workload_sql_count +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_workload_sql_count (OUT node_name name, OUT workload name, OUT select_count bigint, OUT update_count bigint, OUT insert_count bigint, OUT delete_count bigint, OUT ddl_count bigint, OUT dml_count bigint, OUT dcl_count bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.workload_sql_count%rowtype; + row_data dbe_perf.workload_sql_count%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.workload_sql_count'''; + query_str := 'SELECT * FROM dbe_perf.workload_sql_count'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; workload := row_data.workload; @@ -717,7 +717,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.summary_workload_sql_count AS SELECT * FROM DBE_PERF.get_summary_workload_sql_count(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_workload_sql_elapse_time +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_workload_sql_elapse_time (OUT node_name name, OUT workload name, OUT total_select_elapse bigint, OUT max_select_elapse bigint, OUT min_select_elapse bigint, OUT avg_select_elapse bigint, OUT total_update_elapse bigint, OUT max_update_elapse bigint, OUT min_update_elapse bigint, OUT avg_update_elapse bigint, @@ -726,15 +726,15 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_workload_sql_elapse_time RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.workload_sql_elapse_time%rowtype; + row_data dbe_perf.workload_sql_elapse_time%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.workload_sql_elapse_time'''; + query_str := 'SELECT * FROM dbe_perf.workload_sql_elapse_time'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; workload := row_data.workload; @@ -783,7 +783,7 @@ SELECT FROM pg_user left join get_instr_workload_info(0) AS giwi on pg_user.usesysid = giwi.user_oid; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_user_transaction +CREATE OR REPLACE FUNCTION dbe_perf.get_global_user_transaction (OUT node_name name, OUT usename name, OUT commit_counter bigint, OUT rollback_counter bigint, OUT resp_min bigint, OUT resp_max bigint, OUT resp_avg bigint, OUT resp_total bigint, OUT bg_commit_counter bigint, @@ -792,15 +792,15 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_user_transaction RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.user_transaction%rowtype; + row_data dbe_perf.user_transaction%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.user_transaction'''; + query_str := 'SELECT * FROM dbe_perf.user_transaction'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; usename := row_data.usename; @@ -856,15 +856,15 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_workload_transaction RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.workload_transaction%rowtype; + row_data dbe_perf.workload_transaction%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.workload_transaction'''; + query_str := 'SELECT * FROM dbe_perf.workload_transaction'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; workload := row_data.workload; @@ -912,20 +912,20 @@ CREATE OR REPLACE VIEW DBE_PERF.summary_workload_transaction AS CREATE OR REPLACE VIEW DBE_PERF.session_stat AS SELECT * FROM pv_session_stat(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_stat +CREATE OR REPLACE FUNCTION dbe_perf.get_global_session_stat (OUT node_name name, OUT sessid text, OUT statid integer, OUT statname text, OUT statunit text, OUT value bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.session_stat%rowtype; + row_data dbe_perf.session_stat%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.session_stat'''; + query_str := 'SELECT * FROM dbe_perf.session_stat'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; sessid := row_data.sessid; @@ -946,20 +946,20 @@ CREATE OR REPLACE VIEW DBE_PERF.global_session_stat AS CREATE OR REPLACE VIEW DBE_PERF.session_time AS SELECT * FROM pv_session_time(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_time +CREATE OR REPLACE FUNCTION dbe_perf.get_global_session_time (OUT node_name name, OUT sessid text, OUT stat_id integer, OUT stat_name text, OUT value bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.session_time%rowtype; + row_data dbe_perf.session_time%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.session_time'''; + query_str := 'SELECT * FROM dbe_perf.session_time'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; sessid := row_data.sessid; @@ -979,20 +979,20 @@ CREATE OR REPLACE VIEW DBE_PERF.global_session_time AS CREATE OR REPLACE VIEW DBE_PERF.session_memory AS SELECT * FROM pv_session_memory(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_memory +CREATE OR REPLACE FUNCTION dbe_perf.get_global_session_memory (OUT node_name name, OUT sessid text, OUT init_mem integer, OUT used_mem integer, OUT peak_mem integer) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.session_memory%rowtype; + row_data dbe_perf.session_memory%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.session_memory'''; + query_str := 'SELECT * FROM dbe_perf.session_memory'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; sessid := row_data.sessid; @@ -1009,24 +1009,118 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_session_memory AS SELECT DISTINCT * FROM DBE_PERF.get_global_session_memory(); + +CREATE OR REPLACE FUNCTION pg_catalog.pv_session_memory_detail_tp(OUT sessid TEXT, OUT sesstype TEXT, OUT contextname TEXT, OUT level INT2, OUT parent TEXT, OUT totalsize INT8, OUT freesize INT8, OUT usedsize INT8) +RETURNS setof record +AS $$ +DECLARE + enable_threadpool bool; + row_data record; + query_str text; +BEGIN + show enable_thread_pool into enable_threadpool; + + IF enable_threadpool THEN + query_str := 'with SM AS + (SELECT + S.sessid AS sessid, + T.thrdtype AS sesstype, + S.contextname AS contextname, + S.level AS level, + S.parent AS parent, + S.totalsize AS totalsize, + S.freesize AS freesize, + S.usedsize AS usedsize + FROM + pv_session_memory_context S + LEFT JOIN + (SELECT DISTINCT thrdtype, tid + FROM pv_thread_memory_context) T + on S.threadid = T.tid + ), + TM AS + (SELECT + S.sessid AS Ssessid, + T.thrdtype AS sesstype, + T.threadid AS Tsessid, + T.contextname AS contextname, + T.level AS level, + T.parent AS parent, + T.totalsize AS totalsize, + T.freesize AS freesize, + T.usedsize AS usedsize + FROM + pv_thread_memory_context T + LEFT JOIN + (SELECT DISTINCT sessid, threadid + FROM pv_session_memory_context) S + ON T.tid = S.threadid + ) + SELECT * from SM + UNION ALL + SELECT + Ssessid AS sessid, sesstype, contextname, level, parent, totalsize, freesize, usedsize + FROM TM WHERE Ssessid IS NOT NULL + UNION ALL + SELECT + Tsessid AS sessid, sesstype, contextname, level, parent, totalsize, freesize, usedsize + FROM TM WHERE Ssessid IS NULL;'; + FOR row_data IN EXECUTE(query_str) LOOP + sessid = row_data.sessid; + sesstype = row_data.sesstype; + contextname = row_data.contextname; + level = row_data.level; + parent = row_data.parent; + totalsize = row_data.totalsize; + freesize = row_data.freesize; + usedsize = row_data.usedsize; + return next; + END LOOP; + ELSE + query_str := 'SELECT + T.threadid AS sessid, + T.thrdtype AS sesstype, + T.contextname AS contextname, + T.level AS level, + T.parent AS parent, + T.totalsize AS totalsize, + T.freesize AS freesize, + T.usedsize AS usedsize + FROM pg_catalog.pv_thread_memory_detail() T;'; + FOR row_data IN EXECUTE(query_str) LOOP + sessid = row_data.sessid; + sesstype = row_data.sesstype; + contextname = row_data.contextname; + level = row_data.level; + parent = row_data.parent; + totalsize = row_data.totalsize; + freesize = row_data.freesize; + usedsize = row_data.usedsize; + return next; + END LOOP; + END IF; + RETURN; +END; $$ +LANGUAGE plpgsql NOT FENCED; + CREATE OR REPLACE VIEW DBE_PERF.session_memory_detail AS SELECT * FROM pv_session_memory_detail_tp(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_memory_detail +CREATE OR REPLACE FUNCTION dbe_perf.get_global_session_memory_detail (OUT node_name name, OUT sessid text, OUT sesstype text, OUT contextname text, OUT level smallint, OUT parent text, OUT totalsize bigint, OUT freesize bigint, OUT usedsize bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.session_memory_detail%rowtype; + row_data dbe_perf.session_memory_detail%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.session_memory_detail'''; + query_str := 'SELECT * FROM dbe_perf.session_memory_detail'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; sessid := row_data.sessid; @@ -1106,7 +1200,7 @@ CREATE OR REPLACE VIEW DBE_PERF.session_stat_activity AS S.usesysid = U.oid AND T.threadid = S.pid; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_stat_activity +CREATE OR REPLACE FUNCTION dbe_perf.get_global_session_stat_activity (out coorname text, out datid oid, out datname text, out pid bigint, out usesysid oid, out usename text, out application_name text, out client_addr inet, out client_hostname text, out client_port integer, out backend_start timestamptz, @@ -1116,16 +1210,16 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_stat_activity RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.session_stat_activity%rowtype; + row_data dbe_perf.session_stat_activity%rowtype; coor_name record; fet_active text; fetch_coor text; BEGIN --Get all cn node names - fetch_coor := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + fetch_coor := 'select * from dbe_perf.node_name'; FOR coor_name IN EXECUTE(fetch_coor) LOOP coorname := coor_name.node_name; - fet_active := 'EXECUTE DIRECT ON (' || coor_name.node_name || ') ''SELECT * FROM DBE_PERF.session_stat_activity'''; + fet_active := 'SELECT * FROM dbe_perf.session_stat_activity'; FOR row_data IN EXECUTE(fet_active) LOOP coorname := coorname; datid :=row_data.datid; @@ -1160,19 +1254,19 @@ CREATE OR REPLACE VIEW DBE_PERF.global_session_stat_activity AS CREATE OR REPLACE VIEW DBE_PERF.thread_wait_status AS SELECT * FROM pg_stat_get_status(NULL); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_thread_wait_status() -RETURNS setof DBE_PERF.thread_wait_status +CREATE OR REPLACE FUNCTION dbe_perf.get_global_thread_wait_status() +RETURNS setof dbe_perf.thread_wait_status AS $$ DECLARE - row_data DBE_PERF.thread_wait_status%rowtype; + row_data dbe_perf.thread_wait_status%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn dn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.thread_wait_status'''; + query_str := 'SELECT * FROM dbe_perf.thread_wait_status'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -1346,30 +1440,6 @@ CREATE OR REPLACE VIEW DBE_PERF.wlm_workload_runtime AS WHERE P.query_pid = S.threadpid AND S.usesysid = U.oid; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_wlm_workload_runtime() -RETURNS setof DBE_PERF.wlm_workload_runtime -AS $$ -DECLARE - row_data DBE_PERF.wlm_workload_runtime%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all coordinator node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.wlm_workload_runtime'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW DBE_PERF.global_wlm_workload_runtime AS - SELECT * from DBE_PERF.get_global_wlm_workload_runtime(); - CREATE OR REPLACE VIEW DBE_PERF.wlm_workload_history_info AS SELECT statement, @@ -1403,57 +1473,9 @@ CREATE OR REPLACE VIEW DBE_PERF.operator_ec_history AS ec_libodbc_type FROM pg_stat_get_wlm_ec_operator_info(0) where ec_operator > 0; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_ec_history() -RETURNS setof DBE_PERF.operator_ec_history -AS $$ -DECLARE - row_data DBE_PERF.operator_ec_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.operator_ec_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql'; - -CREATE OR REPLACE VIEW DBE_PERF.global_operator_ec_history AS - SELECT * FROM DBE_PERF.get_global_operator_ec_history(); - CREATE OR REPLACE VIEW DBE_PERF.operator_ec_history_table AS SELECT * FROM gs_wlm_ec_operator_info; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_ec_history_table() -RETURNS setof DBE_PERF.operator_ec_history_table -AS $$ -DECLARE - row_data DBE_PERF.operator_ec_history_table%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the CN node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.operator_ec_history_table'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW DBE_PERF.global_operator_ec_history_table AS - SELECT * FROM DBE_PERF.get_global_operator_ec_history_table(); - --real time ec operator-level view in single CN CREATE OR REPLACE VIEW DBE_PERF.operator_ec_runtime AS SELECT @@ -1470,47 +1492,23 @@ CREATE OR REPLACE VIEW DBE_PERF.operator_ec_runtime AS FROM DBE_PERF.session_stat_activity AS s, pg_stat_get_wlm_realtime_ec_operator_info(NULL) as t where s.query_id = t.queryid and t.ec_operator > 0; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_ec_runtime() -RETURNS setof DBE_PERF.operator_ec_runtime -AS $$ -DECLARE - row_data DBE_PERF.operator_ec_runtime%rowtype; - coor_name record; - fet_active text; - fetch_coor text; - BEGIN - --Get all the CN node names - fetch_coor := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR coor_name IN EXECUTE(fetch_coor) LOOP - fet_active := 'EXECUTE DIRECT ON (' || coor_name.node_name || ') ''SELECT * FROM DBE_PERF.operator_ec_runtime'''; - FOR row_data IN EXECUTE(fet_active) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW DBE_PERF.global_operator_ec_runtime AS - SELECT * FROM DBE_PERF.get_global_operator_ec_runtime(); - CREATE OR REPLACE VIEW DBE_PERF.operator_history_table AS SELECT * FROM gs_wlm_operator_info; --createing history operator-level view for test in multi-CN from single CN -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_history_table() -RETURNS setof DBE_PERF.operator_history_table +CREATE OR REPLACE FUNCTION dbe_perf.get_global_operator_history_table() +RETURNS setof dbe_perf.operator_history_table AS $$ DECLARE - row_data DBE_PERF.operator_history_table%rowtype; + row_data dbe_perf.operator_history_table%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the CN node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.operator_history_table '''; + query_str := 'SELECT * FROM dbe_perf.operator_history_table'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -1526,19 +1524,19 @@ CREATE OR REPLACE VIEW DBE_PERF.global_operator_history_table AS CREATE OR REPLACE VIEW DBE_PERF.operator_history AS SELECT * FROM pg_stat_get_wlm_operator_info(0); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_history() -RETURNS setof DBE_PERF.operator_history +CREATE OR REPLACE FUNCTION dbe_perf.get_global_operator_history() +RETURNS setof dbe_perf.operator_history AS $$ DECLARE - row_data DBE_PERF.operator_history%rowtype; + row_data dbe_perf.operator_history%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.operator_history'''; + query_str := 'SELECT * FROM dbe_perf.operator_history'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -1556,18 +1554,18 @@ CREATE OR REPLACE VIEW DBE_PERF.operator_runtime AS FROM DBE_PERF.session_stat_activity AS s, pg_stat_get_wlm_realtime_operator_info(NULL) as t WHERE s.query_id = t.queryid; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_runtime() -RETURNS setof DBE_PERF.operator_runtime +CREATE OR REPLACE FUNCTION dbe_perf.get_global_operator_runtime() +RETURNS setof dbe_perf.operator_runtime AS $$ DECLARE - row_data DBE_PERF.operator_runtime%rowtype; + row_data dbe_perf.operator_runtime%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.operator_runtime'''; + query_str := 'SELECT * FROM dbe_perf.operator_runtime'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -1653,19 +1651,19 @@ SELECT FROM pg_stat_get_wlm_session_info(0) S; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_complex_history() -RETURNS setof DBE_PERF.statement_complex_history +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statement_complex_history() +RETURNS setof dbe_perf.statement_complex_history AS $$ DECLARE - row_data DBE_PERF.statement_complex_history%rowtype; + row_data dbe_perf.statement_complex_history%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement_complex_history'''; + query_str := 'SELECT * FROM dbe_perf.statement_complex_history'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -1680,19 +1678,19 @@ CREATE OR REPLACE VIEW DBE_PERF.global_statement_complex_history AS CREATE OR REPLACE VIEW DBE_PERF.statement_complex_history_table AS SELECT * FROM gs_wlm_session_info; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_complex_history_table() -RETURNS setof DBE_PERF.statement_complex_history_table +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statement_complex_history_table() +RETURNS setof dbe_perf.statement_complex_history_table AS $$ DECLARE - row_data DBE_PERF.statement_complex_history_table%rowtype; + row_data dbe_perf.statement_complex_history_table%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement_complex_history_table'''; + query_str := 'SELECT * FROM dbe_perf.statement_complex_history_table'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -1761,18 +1759,18 @@ CREATE OR REPLACE VIEW DBE_PERF.statement_complex_runtime AS FROM pg_stat_activity_ng AS S, pg_stat_get_wlm_realtime_session_info(NULL) AS T WHERE S.pid = T.threadid; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_complex_runtime() -RETURNS setof DBE_PERF.statement_complex_runtime +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statement_complex_runtime() +RETURNS setof dbe_perf.statement_complex_runtime AS $$ DECLARE - row_data DBE_PERF.statement_complex_runtime%rowtype; + row_data dbe_perf.statement_complex_runtime%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.statement_complex_runtime'''; + query_str := 'SELECT * FROM dbe_perf.statement_complex_runtime'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -1838,19 +1836,19 @@ CREATE OR REPLACE VIEW DBE_PERF.statement_wlmstat_complex_runtime AS CREATE OR REPLACE VIEW DBE_PERF.memory_node_detail AS SELECT * FROM pv_total_memory_detail(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_memory_node_detail() -RETURNS setof DBE_PERF.memory_node_detail +CREATE OR REPLACE FUNCTION dbe_perf.get_global_memory_node_detail() +RETURNS setof dbe_perf.memory_node_detail AS $$ DECLARE row_name record; - row_data DBE_PERF.memory_node_detail%rowtype; + row_data dbe_perf.memory_node_detail%rowtype; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.memory_node_detail'''; + query_str := 'SELECT * FROM dbe_perf.memory_node_detail'; FOR row_data IN EXECUTE(query_str) LOOP RETURN NEXT row_data; END LOOP; @@ -1868,21 +1866,21 @@ CREATE OR REPLACE VIEW DBE_PERF.memory_node_ng_detail AS CREATE OR REPLACE VIEW DBE_PERF.shared_memory_detail AS SELECT * FROM pg_shared_memory_detail(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_shared_memory_detail +CREATE OR REPLACE FUNCTION dbe_perf.get_global_shared_memory_detail (OUT node_name name, OUT contextname text, OUT level smallint, OUT parent text, OUT totalsize bigint, OUT freesize bigint, OUT usedsize bigint) RETURNS setof record AS $$ DECLARE row_name record; - row_data DBE_PERF.shared_memory_detail%rowtype; + row_data dbe_perf.shared_memory_detail%rowtype; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.shared_memory_detail'''; + query_str := 'SELECT * FROM dbe_perf.shared_memory_detail'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; contextname := row_data.contextname; @@ -1905,29 +1903,6 @@ CREATE OR REPLACE VIEW DBE_PERF.global_shared_memory_detail AS CREATE OR REPLACE VIEW DBE_PERF.comm_delay AS SELECT DISTINCT * FROM pg_comm_delay(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_comm_delay() -RETURNS setof DBE_PERF.comm_delay -AS $$ -DECLARE - row_name record; - row_data DBE_PERF.comm_delay%rowtype; - query_str text; - query_str_nodes text; - BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.comm_delay'''; - FOR row_data IN EXECUTE(query_str) LOOP - RETURN NEXT row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW DBE_PERF.global_comm_delay AS - SELECT DISTINCT * FROM DBE_PERF.get_global_comm_delay(); - CREATE OR REPLACE VIEW DBE_PERF.comm_recv_stream AS SELECT S.node_name, @@ -2071,9 +2046,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_all_indexes'''; + query_str := 'SELECT * FROM dbe_perf.statio_all_indexes'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -2126,9 +2101,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.relname AS relname, T.schemaname AS schemaname, @@ -2139,7 +2114,7 @@ DECLARE T.idx_blks_hit AS idx_blks_hit FROM DBE_PERF.statio_all_indexes T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -2181,7 +2156,7 @@ CREATE OR REPLACE VIEW DBE_PERF.statio_all_sequences AS LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE C.relkind = 'S'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_all_sequences +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_all_sequences (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT blks_read bigint, OUT blks_hit bigint) RETURNS setof record @@ -2193,9 +2168,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_all_sequences'''; + query_str := 'SELECT * FROM dbe_perf.statio_all_sequences'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -2244,7 +2219,7 @@ CREATE OR REPLACE VIEW DBE_PERF.statio_all_tables AS WHERE C.relkind IN ('r', 't') GROUP BY C.oid, N.nspname, C.relname, T.oid, X.oid; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_all_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_all_tables (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint, OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) @@ -2257,9 +2232,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_all_tables'''; + query_str := 'SELECT * FROM dbe_perf.statio_all_tables'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -2283,7 +2258,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_statio_all_tables AS SELECT * FROM DBE_PERF.get_global_statio_all_tables(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_all_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statio_all_tables (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT heap_blks_read bigint, OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) @@ -2296,9 +2271,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT C.relname AS relname, C.schemaname AS schemaname, @@ -2312,9 +2287,9 @@ DECLARE C.toast_blks_hit AS toast_blks_hit, C.tidx_blks_read AS tidx_blks_read, C.tidx_blks_hit AS tidx_blks_hit - FROM DBE_PERF.statio_all_tables C + FROM dbe_perf.statio_all_tables C LEFT JOIN pg_class O ON C.relid = O.reltoastrelid - LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -2371,7 +2346,7 @@ CREATE OR REPLACE VIEW DBE_PERF.statio_sys_indexes AS WHERE schemaname IN ('pg_catalog', 'information_schema', 'snapshot') OR schemaname ~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_sys_indexes +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_sys_indexes (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) RETURNS setof record @@ -2383,9 +2358,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_sys_indexes'''; + query_str := 'SELECT * FROM dbe_perf.statio_sys_indexes'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -2405,7 +2380,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_statio_sys_indexes AS SELECT * FROM DBE_PERF.get_global_statio_sys_indexes(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_sys_indexes +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statio_sys_indexes (OUT schemaname name, OUT toastrelschemaname name, OUT toastrelname name, OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) RETURNS setof record @@ -2417,9 +2392,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.relname AS relname, T.schemaname AS schemaname, @@ -2428,9 +2403,9 @@ DECLARE T.indexrelname AS indexrelname, T.idx_blks_read AS idx_blks_read, T.idx_blks_hit AS idx_blks_hit - FROM DBE_PERF.statio_sys_indexes T + FROM dbe_perf.statio_sys_indexes T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -2465,7 +2440,7 @@ CREATE OR REPLACE VIEW DBE_PERF.statio_sys_sequences AS WHERE schemaname IN ('pg_catalog', 'information_schema') OR schemaname ~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_sys_sequences +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_sys_sequences (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT blks_read bigint, OUT blks_hit bigint) RETURNS setof record @@ -2477,9 +2452,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_sys_sequences'''; + query_str := 'SELECT * FROM dbe_perf.statio_sys_sequences'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -2508,7 +2483,7 @@ CREATE OR REPLACE VIEW DBE_PERF.statio_sys_tables AS WHERE schemaname IN ('pg_catalog', 'information_schema', 'snapshot') OR schemaname ~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_sys_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_sys_tables (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint, OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) @@ -2521,9 +2496,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_sys_tables'''; + query_str := 'SELECT * FROM dbe_perf.statio_sys_tables'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -2547,7 +2522,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_statio_sys_tables AS SELECT * FROM DBE_PERF.get_global_statio_sys_tables(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_sys_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statio_sys_tables (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT heap_blks_read bigint, OUT heap_blks_hit bigint, @@ -2563,9 +2538,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT C.schemaname AS schemaname, C.relname AS relname, @@ -2579,9 +2554,9 @@ DECLARE C.toast_blks_hit AS toast_blks_hit, C.tidx_blks_read AS tidx_blks_read, C.tidx_blks_hit AS tidx_blks_hit - FROM DBE_PERF.statio_sys_tables C + FROM dbe_perf.statio_sys_tables C LEFT JOIN pg_class O ON C.relid = O.reltoastrelid - LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -2623,7 +2598,7 @@ CREATE OR REPLACE VIEW DBE_PERF.statio_user_indexes AS WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'snapshot') AND schemaname !~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_user_indexes +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_user_indexes (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) RETURNS setof record @@ -2635,9 +2610,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_user_indexes'''; + query_str := 'SELECT * FROM dbe_perf.statio_user_indexes'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -2657,7 +2632,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_statio_user_indexes AS SELECT * FROM DBE_PERF.get_global_statio_user_indexes(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_user_indexes +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statio_user_indexes (OUT schemaname name, OUT toastrelschemaname name, OUT toastrelname name, OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) RETURNS setof record @@ -2669,9 +2644,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.relname AS relname, T.schemaname AS schemaname, @@ -2680,9 +2655,9 @@ DECLARE T.indexrelname AS indexrelname, T.idx_blks_read AS idx_blks_read, T.idx_blks_hit AS idx_blks_hit - FROM DBE_PERF.statio_user_indexes T + FROM dbe_perf.statio_user_indexes T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -2718,7 +2693,7 @@ CREATE OR REPLACE VIEW DBE_PERF.statio_user_sequences AS WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND schemaname !~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_user_sequences +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_user_sequences (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT blks_read bigint, OUT blks_hit bigint) RETURNS setof record @@ -2730,9 +2705,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_user_sequences'''; + query_str := 'SELECT * FROM dbe_perf.statio_user_sequences'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -2761,7 +2736,7 @@ CREATE OR REPLACE VIEW DBE_PERF.statio_user_tables AS WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'snapshot') AND schemaname !~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_user_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_user_tables (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint, OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) @@ -2774,9 +2749,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statio_user_tables'''; + query_str := 'SELECT * FROM dbe_perf.statio_user_tables'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -2800,7 +2775,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_statio_user_tables AS SELECT * FROM DBE_PERF.get_global_statio_user_tables(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_user_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statio_user_tables (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT heap_blks_read bigint, OUT heap_blks_hit bigint, @@ -2816,9 +2791,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT C.schemaname AS schemaname, C.relname AS relname, @@ -2832,9 +2807,9 @@ DECLARE C.toast_blks_hit AS toast_blks_hit, C.tidx_blks_read AS tidx_blks_read, C.tidx_blks_hit AS tidx_blks_hit - FROM DBE_PERF.statio_user_tables C + FROM dbe_perf.statio_user_tables C LEFT JOIN pg_class O ON C.relid = O.reltoastrelid - LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -2869,7 +2844,7 @@ CREATE OR REPLACE VIEW DBE_PERF.summary_statio_user_tables AS ON Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname GROUP BY (1, 2); -CREATE OR REPLACE FUNCTION DBE_PERF.get_stat_db_cu +CREATE OR REPLACE FUNCTION dbe_perf.get_stat_db_cu (OUT node_name1 text, OUT db_name text, OUT mem_hit bigint, OUT hdd_sync_read bigint, OUT hdd_asyn_read bigint) @@ -2881,13 +2856,13 @@ DECLARE query_str text; query_str_nodes text; BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT D.datname AS datname, + query_str := 'SELECT D.datname AS datname, pg_stat_get_db_cu_mem_hit(D.oid) AS mem_hit, pg_stat_get_db_cu_hdd_sync(D.oid) AS hdd_sync_read, pg_stat_get_db_cu_hdd_asyn(D.oid) AS hdd_asyn_read - FROM pg_database D;'''; + FROM pg_database D;'; FOR each_node_out IN EXECUTE(query_str) LOOP node_name1 := row_name.node_name; db_name := each_node_out.datname; @@ -2935,110 +2910,7 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_all_tables AS WHERE C.relkind IN ('r', 't') GROUP BY C.oid, N.nspname, C.relname; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_dn_stat_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_all_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_cn_stat_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT * FROM DBE_PERF.stat_all_tables WHERE schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW DBE_PERF.global_stat_all_tables AS - SELECT * FROM DBE_PERF.get_global_cn_stat_all_tables() - UNION ALL SELECT * FROM DBE_PERF.get_global_dn_stat_all_tables(); - -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_dn_stat_all_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_all_tables (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, @@ -3055,9 +2927,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''D'''; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.schemaname AS schemaname, T.relname AS relname, @@ -3081,9 +2953,9 @@ DECLARE T.autovacuum_count AS autovacuum_count, T.analyze_count AS analyze_count, T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_all_tables T + FROM dbe_perf.stat_all_tables T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -3118,104 +2990,6 @@ DECLARE END; $$ LANGUAGE 'plpgsql' NOT FENCED; -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_cn_stat_all_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd, - T.n_live_tup AS n_live_tup, - T.n_dead_tup AS n_dead_tup, - T.last_vacuum AS last_vacuum, - T.last_autovacuum AS last_autovacuum, - T.last_analyze AS last_analyze, - T.last_autoanalyze AS last_autoanalyze, - T.vacuum_count AS vacuum_count, - T.autovacuum_count AS autovacuum_count, - T.analyze_count AS analyze_count, - T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_all_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid - WHERE T.schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW DBE_PERF.summary_stat_all_tables AS - SELECT Ti.schemaname, COALESCE(Ti.relname, Tn.toastname, NULL) as relname, - SUM(Ti.seq_scan) seq_scan, SUM(Ti.seq_tup_read) seq_tup_read, - SUM(Ti.idx_scan) idx_scan, SUM(Ti.idx_tup_fetch) idx_tup_fetch, - SUM(Ti.n_tup_ins) n_tup_ins, SUM(Ti.n_tup_upd) n_tup_upd, - SUM(Ti.n_tup_del) n_tup_del, SUM(Ti.n_tup_hot_upd) n_tup_hot_upd, - SUM(Ti.n_live_tup) n_live_tup, SUM(Ti.n_dead_tup) n_dead_tup, - MAX(Ti.last_vacuum) last_vacuum, MAX(Ti.last_autovacuum) last_autovacuum, - MAX(Ti.last_analyze) last_analyze, MAX(Ti.last_autoanalyze) last_autoanalyze, - SUM(Ti.vacuum_count) vacuum_count, SUM(Ti.autovacuum_count) autovacuum_count, - SUM(Ti.analyze_count) analyze_count, SUM(Ti.autoanalyze_count) autoanalyze_count - FROM (SELECT * FROM DBE_PERF.get_summary_cn_stat_all_tables() - UNION ALL SELECT * FROM DBE_PERF.get_summary_dn_stat_all_tables()) AS Ti - LEFT JOIN DBE_PERF.get_local_toast_relation() Tn - ON Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname - GROUP BY (1, 2); - CREATE OR REPLACE VIEW DBE_PERF.stat_all_indexes AS SELECT C.oid AS relid, @@ -3232,7 +3006,7 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_all_indexes AS LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE C.relkind IN ('r', 't'); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_all_indexes +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_all_indexes (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) RETURNS setof record @@ -3244,9 +3018,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_all_indexes'''; + query_str := 'SELECT * FROM dbe_perf.stat_all_indexes'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -3267,7 +3041,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_stat_all_indexes AS SELECT * FROM DBE_PERF.get_global_stat_all_indexes(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_all_indexes +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_all_indexes (OUT schemaname name, OUT relname name, OUT indexrelname name, OUT toastrelschemaname name, OUT toastrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) @@ -3280,9 +3054,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.relname AS relname, T.schemaname AS schemaname, @@ -3292,9 +3066,9 @@ DECLARE T.idx_scan AS idx_scan, T.idx_tup_read AS idx_tup_read, T.idx_tup_fetch AS idx_tup_fetch - FROM DBE_PERF.stat_all_indexes T + FROM dbe_perf.stat_all_indexes T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -3330,7 +3104,7 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_sys_tables AS WHERE schemaname IN ('pg_catalog', 'information_schema') OR schemaname ~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_sys_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_sys_tables (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, @@ -3346,9 +3120,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_sys_tables'''; + query_str := 'SELECT * FROM dbe_perf.stat_sys_tables'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -3382,7 +3156,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_stat_sys_tables AS SELECT * FROM DBE_PERF.get_global_stat_sys_tables(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_sys_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_sys_tables (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT seq_scan bigint, OUT seq_tup_read bigint, @@ -3400,9 +3174,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.schemaname AS schemaname, T.relname AS relname, @@ -3426,9 +3200,9 @@ DECLARE T.autovacuum_count AS autovacuum_count, T.analyze_count AS analyze_count, T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_sys_tables T + FROM dbe_perf.stat_sys_tables T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -3483,7 +3257,7 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_sys_indexes AS WHERE schemaname IN ('pg_catalog', 'information_schema') OR schemaname ~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_sys_indexes +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_sys_indexes (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) RETURNS setof record @@ -3495,9 +3269,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_sys_indexes'''; + query_str := 'SELECT * FROM dbe_perf.stat_sys_indexes'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -3518,7 +3292,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_stat_sys_indexes AS SELECT * FROM DBE_PERF.get_global_stat_sys_indexes(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_sys_indexes +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_sys_indexes (OUT schemaname name, OUT relname name, OUT indexrelname name, OUT toastrelschemaname name, OUT toastrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) @@ -3531,9 +3305,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.relname AS relname, T.schemaname AS schemaname, @@ -3543,9 +3317,9 @@ DECLARE T.idx_scan AS idx_scan, T.idx_tup_read AS idx_tup_read, T.idx_tup_fetch AS idx_tup_fetch - FROM DBE_PERF.stat_sys_indexes T + FROM dbe_perf.stat_sys_indexes T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -3581,7 +3355,7 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_user_tables AS WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND schemaname !~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_user_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_user_tables (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, @@ -3597,9 +3371,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''D'')'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_user_tables'''; + query_str := 'SELECT * FROM dbe_perf.stat_user_tables'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -3633,7 +3407,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_stat_user_tables AS SELECT * FROM DBE_PERF.get_global_stat_user_tables(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_user_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_user_tables (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT seq_scan bigint, OUT seq_tup_read bigint, @@ -3651,9 +3425,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''D'')'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.schemaname AS schemaname, T.relname AS relname, @@ -3677,9 +3451,9 @@ DECLARE T.autovacuum_count AS autovacuum_count, T.analyze_count AS analyze_count, T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_user_tables T + FROM dbe_perf.stat_user_tables T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -3734,7 +3508,7 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_user_indexes AS WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND schemaname !~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_user_indexes +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_user_indexes (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) RETURNS setof record @@ -3746,9 +3520,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_user_indexes'''; + query_str := 'SELECT * FROM dbe_perf.stat_user_indexes'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -3769,7 +3543,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_stat_user_indexes AS SELECT * FROM DBE_PERF.get_global_stat_user_indexes(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_user_indexes +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_user_indexes (OUT schemaname name, OUT relname name, OUT indexrelname name, OUT toastrelschemaname name, OUT toastrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) @@ -3782,9 +3556,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.relname AS relname, T.schemaname AS schemaname, @@ -3794,9 +3568,9 @@ DECLARE T.idx_scan AS idx_scan, T.idx_tup_read AS idx_tup_read, T.idx_tup_fetch AS idx_tup_fetch - FROM DBE_PERF.stat_user_indexes T + FROM dbe_perf.stat_user_indexes T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -3851,7 +3625,7 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_database AS pg_stat_get_db_stat_reset_time(D.oid) AS stats_reset FROM pg_database D; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_database +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_database (OUT node_name name, OUT datid oid, OUT datname name, OUT numbackends integer, OUT xact_commit bigint, OUT xact_rollback bigint, OUT blks_read bigint, OUT blks_hit bigint, OUT tup_returned bigint, OUT tup_fetched bigint, OUT tup_inserted bigint, OUT tup_updated bigint, OUT tup_deleted bigint, OUT conflicts bigint, OUT temp_files bigint, @@ -3860,15 +3634,15 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_database RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.stat_database%rowtype; + row_data dbe_perf.stat_database%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_database'''; + query_str := 'SELECT * FROM dbe_perf.stat_database'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; datid := row_data.datid; @@ -3929,21 +3703,21 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_database_conflicts AS pg_stat_get_db_conflict_startup_deadlock(D.oid) AS confl_deadlock FROM pg_database D; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_database_conflicts +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_database_conflicts (OUT node_name name, OUT datid oid, OUT datname name, OUT confl_tablespace bigint, OUT confl_lock bigint, OUT confl_snapshot bigint, OUT confl_bufferpin bigint, OUT confl_deadlock bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.stat_database_conflicts%rowtype; + row_data dbe_perf.stat_database_conflicts%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_database_conflicts'''; + query_str := 'SELECT * FROM dbe_perf.stat_database_conflicts'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; datid := row_data.datid; @@ -3960,6 +3734,7 @@ DECLARE END; $$ LANGUAGE 'plpgsql' NOT FENCED; + CREATE OR REPLACE VIEW DBE_PERF.global_stat_database_conflicts AS SELECT * FROM DBE_PERF.get_global_stat_database_conflicts(); @@ -3993,22 +3768,22 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_xact_all_tables AS WHERE C.relkind IN ('r', 't') GROUP BY C.oid, N.nspname, C.relname; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_all_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_xact_all_tables (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.stat_xact_all_tables%rowtype; + row_data dbe_perf.stat_xact_all_tables%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''D'''; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_xact_all_tables'''; + query_str := 'SELECT * FROM dbe_perf.stat_xact_all_tables'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -4025,9 +3800,9 @@ DECLARE return next; END LOOP; END LOOP; - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type = ''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_xact_all_tables where schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; + query_str := 'SELECT * FROM dbe_perf.stat_xact_all_tables where schemaname = ''pg_catalog'' or schemaname =''pg_toast'' '; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -4051,7 +3826,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_stat_xact_all_tables AS SELECT * FROM DBE_PERF.get_global_stat_xact_all_tables(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_xact_all_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_xact_all_tables (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT seq_scan bigint, OUT seq_tup_read bigint, @@ -4066,9 +3841,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''D'''; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.schemaname AS schemaname, T.relname AS relname, @@ -4082,9 +3857,9 @@ DECLARE T.n_tup_upd AS n_tup_upd, T.n_tup_del AS n_tup_del, T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_all_tables T + FROM dbe_perf.stat_xact_all_tables T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -4105,47 +3880,7 @@ DECLARE return next; END LOOP; END LOOP; - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type = ''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_all_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid - WHERE T.schemaname = ''''pg_catalog'''' OR T.schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - END LOOP; - return; + return; END; $$ LANGUAGE 'plpgsql' NOT FENCED; @@ -4163,22 +3898,22 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_xact_sys_tables AS WHERE schemaname IN ('pg_catalog', 'information_schema') OR schemaname ~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_sys_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_xact_sys_tables (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.stat_xact_sys_tables%rowtype; + row_data dbe_perf.stat_xact_sys_tables%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_xact_sys_tables'''; + query_str := 'SELECT * FROM dbe_perf.stat_xact_sys_tables'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -4202,7 +3937,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_stat_xact_sys_tables AS SELECT * FROM DBE_PERF.get_global_stat_xact_sys_tables(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_xact_sys_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_xact_sys_tables (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT seq_scan bigint, OUT seq_tup_read bigint, @@ -4217,9 +3952,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.relname AS relname, T.schemaname AS schemaname, @@ -4233,9 +3968,9 @@ DECLARE T.n_tup_upd AS n_tup_upd, T.n_tup_del AS n_tup_del, T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_sys_tables T + FROM dbe_perf.stat_xact_sys_tables T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -4274,22 +4009,22 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_xact_user_tables AS WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND schemaname !~ '^pg_toast'; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_user_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_xact_user_tables (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.stat_xact_user_tables%rowtype; + row_data dbe_perf.stat_xact_user_tables%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''D'')'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_xact_user_tables'''; + query_str := 'SELECT * FROM dbe_perf.stat_xact_user_tables'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; relid := row_data.relid; @@ -4313,7 +4048,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_stat_xact_user_tables AS SELECT * FROM DBE_PERF.get_global_stat_xact_user_tables(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_xact_user_tables +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_xact_user_tables (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT seq_scan bigint, OUT seq_tup_read bigint, @@ -4328,9 +4063,9 @@ DECLARE query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''D'')'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') '' + query_str := ' SELECT T.relname AS relname, T.schemaname AS schemaname, @@ -4344,9 +4079,9 @@ DECLARE T.n_tup_upd AS n_tup_upd, T.n_tup_del AS n_tup_del, T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_user_tables T + FROM dbe_perf.stat_xact_user_tables T LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; + LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'; FOR row_data IN EXECUTE(query_str) LOOP schemaname := row_data.schemaname; IF row_data.toastrelname IS NULL THEN @@ -4392,21 +4127,21 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_user_functions AS WHERE P.prolang != 12 -- fast check to eliminate built-in functions AND pg_stat_get_function_calls(P.oid) IS NOT NULL; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_user_functions +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_user_functions (OUT node_name name, OUT funcid oid, OUT schemaname name, OUT funcname name, OUT calls bigint, OUT total_time double precision, OUT self_time double precision) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.stat_user_functions%rowtype; + row_data dbe_perf.stat_user_functions%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_user_functions'''; + query_str := 'SELECT * FROM dbe_perf.stat_user_functions'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; funcid := row_data.funcid; @@ -4443,21 +4178,21 @@ CREATE OR REPLACE VIEW DBE_PERF.stat_xact_user_functions AS WHERE P.prolang != 12 -- fast check to eliminate built-in functions AND pg_stat_get_xact_function_calls(P.oid) IS NOT NULL; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_user_functions +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_xact_user_functions (OUT node_name name, OUT funcid oid, OUT schemaname name, OUT funcname name, OUT calls bigint, OUT total_time double precision, OUT self_time double precision) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.stat_xact_user_functions%rowtype; + row_data dbe_perf.stat_xact_user_functions%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_xact_user_functions'''; + query_str := 'SELECT * FROM dbe_perf.stat_xact_user_functions'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; funcid := row_data.funcid; @@ -4485,7 +4220,7 @@ CREATE OR REPLACE VIEW DBE_PERF.summary_stat_xact_user_functions AS CREATE OR REPLACE VIEW DBE_PERF.stat_bad_block AS SELECT DISTINCT * from pg_stat_bad_block(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_bad_block +CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_bad_block (OUT node_name TEXT, OUT databaseid INT4, OUT tablespaceid INT4, OUT relfilenode INT4, OUT forknum INT4, OUT error_count INT4, OUT first_time timestamp with time zone, OUT last_time timestamp with time zone) RETURNS setof record @@ -4496,9 +4231,9 @@ DECLARE query_str text; query_str_nodes text; BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.stat_bad_block'''; + query_str := 'SELECT * FROM dbe_perf.stat_bad_block'; FOR each_node_out IN EXECUTE(query_str) LOOP node_name := row_name.node_name; databaseid := each_node_out.databaseid; @@ -4529,21 +4264,21 @@ CREATE OR REPLACE VIEW DBE_PERF.summary_stat_bad_block AS CREATE OR REPLACE VIEW DBE_PERF.file_redo_iostat AS SELECT * FROM pg_stat_get_redo_stat(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_file_redo_iostat +CREATE OR REPLACE FUNCTION dbe_perf.get_global_file_redo_iostat (OUT node_name name, OUT phywrts bigint, OUT phyblkwrt bigint, OUT writetim bigint, OUT avgiotim bigint, OUT lstiotim bigint, OUT miniotim bigint, OUT maxiowtm bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.file_redo_iostat%rowtype; + row_data dbe_perf.file_redo_iostat%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.file_redo_iostat'''; + query_str := 'SELECT * FROM dbe_perf.file_redo_iostat'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; phywrts := row_data.phywrts; @@ -4577,21 +4312,21 @@ CREATE OR REPLACE VIEW DBE_PERF.summary_file_redo_iostat AS CREATE OR REPLACE VIEW DBE_PERF.local_rel_iostat AS SELECT * FROM get_local_rel_iostat(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_rel_iostat +CREATE OR REPLACE FUNCTION dbe_perf.get_global_rel_iostat (OUT node_name name, OUT phyrds bigint, OUT phywrts bigint, OUT phyblkrd bigint, OUT phyblkwrt bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.local_rel_iostat%rowtype; + row_data dbe_perf.local_rel_iostat%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.local_rel_iostat'''; + query_str := 'SELECT * FROM dbe_perf.local_rel_iostat'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; phyrds := row_data.phyrds; @@ -4618,22 +4353,22 @@ CREATE OR REPLACE VIEW DBE_PERF.summary_rel_iostat AS CREATE OR REPLACE VIEW DBE_PERF.file_iostat AS SELECT * FROM pg_stat_get_file_stat(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_file_iostat +CREATE OR REPLACE FUNCTION dbe_perf.get_global_file_iostat (OUT node_name name, OUT filenum oid, OUT dbid oid, OUT spcid oid, OUT phyrds bigint, OUT phywrts bigint, OUT phyblkrd bigint, OUT phyblkwrt bigint, OUT readtim bigint, OUT writetim bigint, OUT avgiotim bigint, OUT lstiotim bigint, OUT miniotim bigint, OUT maxiowtm bigint) RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.file_iostat%rowtype; + row_data dbe_perf.file_iostat%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.file_iostat'''; + query_str := 'SELECT * FROM dbe_perf.file_iostat'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; filenum := row_data.filenum; @@ -4674,7 +4409,7 @@ CREATE OR REPLACE VIEW DBE_PERF.summary_file_iostat AS CREATE OR REPLACE VIEW DBE_PERF.locks AS SELECT * FROM pg_lock_status() AS L; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_locks +CREATE OR REPLACE FUNCTION dbe_perf.get_global_locks (OUT node_name name, OUT locktype text, OUT database oid, @@ -4694,15 +4429,15 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_locks RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.locks%rowtype; + row_data dbe_perf.locks%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.locks'''; + query_str := 'SELECT * FROM dbe_perf.locks'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; locktype := row_data.locktype; @@ -4711,7 +4446,7 @@ DECLARE page := row_data.page; tuple := row_data.tuple; virtualxid := row_data.virtualxid; - transactionid := row_data.classid; + transactionid := row_data.transactionid; objid := row_data.objid; objsubid := row_data.objsubid; virtualtransaction := row_data.virtualtransaction; @@ -4745,7 +4480,7 @@ CREATE OR REPLACE VIEW DBE_PERF.replication_slots AS FROM pg_get_replication_slots() AS L LEFT JOIN pg_database D ON (L.datoid = D.oid); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_replication_slots +CREATE OR REPLACE FUNCTION dbe_perf.get_global_replication_slots (OUT node_name name, OUT slot_name text, OUT plugin text, @@ -4760,15 +4495,15 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_replication_slots RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.replication_slots%rowtype; + row_data dbe_perf.replication_slots%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.replication_slots'''; + query_str := 'SELECT * FROM dbe_perf.replication_slots'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; slot_name := row_data.slot_name; @@ -4805,7 +4540,7 @@ CREATE OR REPLACE VIEW DBE_PERF.bgwriter_stat AS pg_stat_get_buf_alloc() AS buffers_alloc, pg_stat_get_bgwriter_stat_reset_time() AS stats_reset; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_bgwriter_stat +CREATE OR REPLACE FUNCTION dbe_perf.get_global_bgwriter_stat (OUT node_name name, OUT checkpoints_timed bigint, OUT checkpoints_req bigint, @@ -4821,15 +4556,15 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_bgwriter_stat RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.bgwriter_stat%rowtype; + row_data dbe_perf.bgwriter_stat%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.bgwriter_stat'''; + query_str := 'SELECT * FROM dbe_perf.bgwriter_stat'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; checkpoints_timed := row_data.checkpoints_timed; @@ -4875,7 +4610,7 @@ CREATE OR REPLACE VIEW DBE_PERF.replication_stat AS WHERE S.usesysid = U.oid AND S.pid = W.sender_pid; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_replication_stat +CREATE OR REPLACE FUNCTION dbe_perf.get_global_replication_stat (OUT node_name name, OUT pid bigint, OUT usesysid oid, @@ -4895,15 +4630,15 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_replication_stat RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.replication_stat%rowtype; + row_data dbe_perf.replication_stat%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.replication_stat'''; + query_str := 'SELECT * FROM dbe_perf.replication_stat'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; pid := row_data.pid; @@ -4929,82 +4664,23 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_replication_stat AS SELECT * FROM DBE_PERF.get_global_replication_stat(); -CREATE OR REPLACE VIEW DBE_PERF.pooler_status AS - SELECT - S.database_name AS database, - S.user_name AS user_name, - S.tid AS tid, - S.node_oid AS node_oid, - D.node_name AS node_name, - S.in_use AS in_use, - D.node_port AS node_port, - S.fdsock AS fdsock, - S.remote_pid AS remote_pid, - S.session_params AS session_params - FROM pgxc_node D, pg_stat_get_pooler_status() AS S - WHERE D.oid = S.node_oid; - -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_pooler_status - (OUT source_node_name name, - OUT database text, - OUT user_name text, - OUT tid bigint, - OUT node_oid bigint, - OUT node_name name, - OUT in_use boolean, - OUT fdsock bigint, - OUT remote_pid bigint, - OUT session_params text) -RETURNS setof record -AS $$ -DECLARE - row_data DBE_PERF.pooler_status%rowtype; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.pooler_status'''; - FOR row_data IN EXECUTE(query_str) LOOP - source_node_name := row_name.node_name; - database := row_data.database; - user_name := row_data.user_name; - tid := row_data.tid; - node_oid := row_data.node_oid; - node_name := row_data.node_name; - in_use := row_data.in_use; - fdsock := row_data.fdsock; - remote_pid := row_data.remote_pid; - session_params := row_data.session_params; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE VIEW DBE_PERF.global_pooler_status AS - SELECT * FROM DBE_PERF.get_global_pooler_status(); - /* transaction */ CREATE OR REPLACE VIEW DBE_PERF.transactions_running_xacts AS SELECT * FROM pg_get_running_xacts(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_transactions_running_xacts() -RETURNS setof DBE_PERF.transactions_running_xacts +CREATE OR REPLACE FUNCTION dbe_perf.get_global_transactions_running_xacts() +RETURNS setof dbe_perf.transactions_running_xacts AS $$ DECLARE - row_data DBE_PERF.transactions_running_xacts%rowtype; + row_data dbe_perf.transactions_running_xacts%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn dn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.transactions_running_xacts'''; + query_str := 'SELECT * FROM dbe_perf.transactions_running_xacts'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -5016,19 +4692,19 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_transactions_running_xacts AS SELECT DISTINCT * from DBE_PERF.get_global_transactions_running_xacts(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_transactions_running_xacts() -RETURNS setof DBE_PERF.transactions_running_xacts +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_transactions_running_xacts() +RETURNS setof dbe_perf.transactions_running_xacts AS $$ DECLARE - row_data DBE_PERF.transactions_running_xacts%rowtype; + row_data dbe_perf.transactions_running_xacts%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.transactions_running_xacts'''; + query_str := 'SELECT * FROM dbe_perf.transactions_running_xacts'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -5047,19 +4723,19 @@ CREATE OR REPLACE VIEW DBE_PERF.transactions_prepared_xacts AS LEFT JOIN pg_authid U ON P.ownerid = U.oid LEFT JOIN pg_database D ON P.dbid = D.oid; -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_transactions_prepared_xacts() -RETURNS setof DBE_PERF.transactions_prepared_xacts +CREATE OR REPLACE FUNCTION dbe_perf.get_global_transactions_prepared_xacts() +RETURNS setof dbe_perf.transactions_prepared_xacts AS $$ DECLARE - row_data DBE_PERF.transactions_prepared_xacts%rowtype; + row_data dbe_perf.transactions_prepared_xacts%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn dn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.transactions_prepared_xacts'''; + query_str := 'SELECT * FROM dbe_perf.transactions_prepared_xacts'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -5071,19 +4747,19 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_transactions_prepared_xacts AS SELECT DISTINCT * FROM DBE_PERF.get_global_transactions_prepared_xacts(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_transactions_prepared_xacts() -RETURNS setof DBE_PERF.transactions_prepared_xacts +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_transactions_prepared_xacts() +RETURNS setof dbe_perf.transactions_prepared_xacts AS $$ DECLARE - row_data DBE_PERF.transactions_prepared_xacts%rowtype; + row_data dbe_perf.transactions_prepared_xacts%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn node names - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type=''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name|| ') ''SELECT * FROM DBE_PERF.transactions_prepared_xacts'''; + query_str := 'SELECT * FROM dbe_perf.transactions_prepared_xacts'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -5099,19 +4775,19 @@ CREATE OR REPLACE VIEW DBE_PERF.summary_transactions_prepared_xacts AS CREATE OR REPLACE VIEW DBE_PERF.statement AS SELECT * FROM get_instr_unique_sql(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statement() -RETURNS setof DBE_PERF.statement +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statement() +RETURNS setof dbe_perf.statement AS $$ DECLARE - row_data DBE_PERF.statement%rowtype; + row_data dbe_perf.statement%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement'''; + query_str := 'SELECT * FROM dbe_perf.statement'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -5153,19 +4829,19 @@ CREATE OR REPLACE VIEW DBE_PERF.statement_count AS min_delete_elapse FROM pg_stat_get_sql_count(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_count() -RETURNS setof DBE_PERF.statement_count +CREATE OR REPLACE FUNCTION dbe_perf.get_global_statement_count() +RETURNS setof dbe_perf.statement_count AS $$ DECLARE - row_data DBE_PERF.statement_count%rowtype; + row_data dbe_perf.statement_count%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement_count'''; + query_str := 'SELECT * FROM dbe_perf.statement_count'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -5202,7 +4878,7 @@ CREATE OR REPLACE VIEW DBE_PERF.summary_statement_count AS CREATE OR REPLACE VIEW DBE_PERF.config_settings AS SELECT * FROM pg_show_all_settings(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_config_settings +CREATE OR REPLACE FUNCTION dbe_perf.get_global_config_settings (out node_name text, out name text, out setting text, @@ -5223,14 +4899,14 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_config_settings RETURNS setof record AS $$ DECLARE - row_data DBE_PERF.config_settings%rowtype; + row_data dbe_perf.config_settings%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.config_settings'''; + query_str := 'SELECT * FROM dbe_perf.config_settings'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; name := row_data.name; @@ -5263,19 +4939,19 @@ CREATE OR REPLACE VIEW DBE_PERF.global_config_settings AS CREATE OR REPLACE VIEW DBE_PERF.wait_events AS SELECT * FROM get_instr_wait_event(NULL); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_wait_events() -RETURNS setof DBE_PERF.wait_events +CREATE OR REPLACE FUNCTION dbe_perf.get_global_wait_events() +RETURNS setof dbe_perf.wait_events AS $$ DECLARE - row_data DBE_PERF.wait_events%rowtype; + row_data dbe_perf.wait_events%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.wait_events'''; + query_str := 'SELECT * FROM dbe_perf.wait_events'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -5287,7 +4963,7 @@ LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE VIEW DBE_PERF.global_wait_events AS SELECT * FROM DBE_PERF.get_global_wait_events(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_statement_responsetime_percentile(OUT p80 bigint, OUT p95 bigint) +CREATE OR REPLACE FUNCTION dbe_perf.get_statement_responsetime_percentile(OUT p80 bigint, OUT p95 bigint) RETURNS SETOF RECORD AS $$ DECLARE @@ -5296,9 +4972,9 @@ DECLARE QUERY_STR TEXT; QUERY_STR_NODES TEXT; BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'') and nodeis_central = true and nodeis_active = true'; + QUERY_STR_NODES := 'select * from dbe_perf.node_name'; FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM get_instr_rt_percentile(0)'''; + QUERY_STR := 'SELECT * FROM get_instr_rt_percentile(0)'; FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP p80 = ROW_DATA."P80"; p95 = ROW_DATA."P95"; @@ -5316,18 +4992,18 @@ CREATE OR REPLACE VIEW DBE_PERF.statement_responsetime_percentile AS CREATE OR REPLACE VIEW DBE_PERF.user_login AS SELECT * FROM get_instr_user_login(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_user_login() -RETURNS SETOF DBE_PERF.user_login +CREATE OR REPLACE FUNCTION dbe_perf.get_summary_user_login() +RETURNS SETOF dbe_perf.user_login AS $$ DECLARE - ROW_DATA DBE_PERF.user_login%ROWTYPE; + ROW_DATA dbe_perf.user_login%ROWTYPE; ROW_NAME RECORD; QUERY_STR TEXT; QUERY_STR_NODES TEXT; BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE=''C'' AND nodeis_active = true'; + QUERY_STR_NODES := 'select * from dbe_perf.node_name'; FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.user_login'''; + QUERY_STR := 'SELECT * FROM dbe_perf.user_login'; FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP RETURN NEXT ROW_DATA; END LOOP; @@ -5348,7 +5024,7 @@ CREATE OR REPLACE VIEW DBE_PERF.class_vital_info AS FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE C.relkind IN ('r', 't', 'i'); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_record_reset_time(OUT node_name text, OUT reset_time timestamp with time zone) +CREATE OR REPLACE FUNCTION dbe_perf.get_global_record_reset_time(OUT node_name text, OUT reset_time timestamp with time zone) RETURNS setof record AS $$ DECLARE @@ -5357,9 +5033,9 @@ DECLARE query_str text; query_str_nodes text; BEGIN - query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select * from get_node_stat_reset_time()'''; + query_str := 'select * from get_node_stat_reset_time()'; FOR row_data IN EXECUTE(query_str) LOOP node_name := row_name.node_name; reset_time := row_data.get_node_stat_reset_time; @@ -5370,42 +5046,24 @@ DECLARE END; $$ LANGUAGE 'plpgsql'; -CREATE OR REPLACE VIEW DBE_PERF.global_ckpt_status AS - SELECT node_name,ckpt_redo_point,ckpt_clog_flush_num,ckpt_csnlog_flush_num,ckpt_multixact_flush_num,ckpt_predicate_flush_num,ckpt_twophase_flush_num - FROM pg_catalog.remote_ckpt_stat() - UNION ALL +CREATE OR REPLACE VIEW dbe_perf.global_ckpt_status AS SELECT node_name,ckpt_redo_point,ckpt_clog_flush_num,ckpt_csnlog_flush_num,ckpt_multixact_flush_num,ckpt_predicate_flush_num,ckpt_twophase_flush_num FROM pg_catalog.local_ckpt_stat(); -CREATE OR REPLACE VIEW DBE_PERF.global_double_write_status AS - SELECT node_name, curr_dwn, curr_start_page, file_trunc_num, file_reset_num, - total_writes, low_threshold_writes, high_threshold_writes, - total_pages, low_threshold_pages, high_threshold_pages - FROM pg_catalog.remote_double_write_stat() - UNION ALL +CREATE OR REPLACE VIEW dbe_perf.global_double_write_status AS SELECT node_name, curr_dwn, curr_start_page, file_trunc_num, file_reset_num, total_writes, low_threshold_writes, high_threshold_writes, total_pages, low_threshold_pages, high_threshold_pages FROM pg_catalog.local_double_write_stat(); -CREATE OR REPLACE VIEW DBE_PERF.global_pagewriter_status AS - SELECT node_name,pgwr_actual_flush_total_num,pgwr_last_flush_num,remain_dirty_page_num,queue_head_page_rec_lsn,queue_rec_lsn,current_xlog_insert_lsn,ckpt_redo_point FROM pg_catalog.remote_pagewriter_stat() - UNION ALL +CREATE OR REPLACE VIEW dbe_perf.global_pagewriter_status AS SELECT node_name,pgwr_actual_flush_total_num,pgwr_last_flush_num,remain_dirty_page_num,queue_head_page_rec_lsn,queue_rec_lsn,current_xlog_insert_lsn,ckpt_redo_point FROM pg_catalog.local_pagewriter_stat(); CREATE OR REPLACE VIEW DBE_PERF.global_record_reset_time AS SELECT * FROM DBE_PERF.get_global_record_reset_time(); -CREATE OR REPLACE VIEW DBE_PERF.global_redo_status AS - SELECT node_name, redo_start_ptr, redo_start_time, redo_done_time, curr_time, - min_recovery_point, read_ptr, last_replayed_read_ptr, recovery_done_ptr, - read_xlog_io_counter, read_xlog_io_total_dur, read_data_io_counter, read_data_io_total_dur, - write_data_io_counter, write_data_io_total_dur, process_pending_counter, process_pending_total_dur, - apply_counter, apply_total_dur, - speed, local_max_ptr, primary_flush_ptr, worker_info - FROM pg_catalog.remote_redo_stat() - UNION ALL +CREATE OR REPLACE VIEW dbe_perf.global_redo_status AS SELECT node_name, redo_start_ptr, redo_start_time, redo_done_time, curr_time, min_recovery_point, read_ptr, last_replayed_read_ptr, recovery_done_ptr, read_xlog_io_counter, read_xlog_io_total_dur, read_data_io_counter, read_data_io_total_dur, @@ -5414,35 +5072,29 @@ CREATE OR REPLACE VIEW DBE_PERF.global_redo_status AS speed, local_max_ptr, primary_flush_ptr, worker_info FROM pg_catalog.local_redo_stat(); -CREATE OR REPLACE VIEW DBE_PERF.global_rto_status AS -SELECT node_name, rto_info - FROM pg_catalog.remote_rto_stat() - UNION ALL +CREATE OR REPLACE VIEW dbe_perf.global_rto_status AS SELECT node_name, rto_info FROM pg_catalog.local_rto_stat(); -CREATE OR REPLACE VIEW DBE_PERF.global_recovery_status AS -SELECT node_name, standby_node_name, source_ip, source_port, dest_ip, dest_port, current_rto, target_rto, current_sleep_time - FROM pg_catalog.remote_recovery_status() - UNION ALL +CREATE OR REPLACE VIEW dbe_perf.global_recovery_status AS SELECT node_name, standby_node_name, source_ip, source_port, dest_ip, dest_port, current_rto, target_rto, current_sleep_time FROM pg_catalog.local_recovery_status(); CREATE OR REPLACE VIEW DBE_PERF.local_threadpool_status AS SELECT * FROM threadpool_status(); -CREATE OR REPLACE FUNCTION DBE_PERF.global_threadpool_status() -RETURNS SETOF DBE_PERF.local_threadpool_status +CREATE OR REPLACE FUNCTION dbe_perf.global_threadpool_status() +RETURNS SETOF dbe_perf.local_threadpool_status AS $$ DECLARE - ROW_DATA DBE_PERF.local_threadpool_status%ROWTYPE; + ROW_DATA dbe_perf.local_threadpool_status%ROWTYPE; ROW_NAME RECORD; QUERY_STR TEXT; QUERY_STR_NODES TEXT; BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'') AND nodeis_active=true'; + QUERY_STR_NODES := 'select * from dbe_perf.node_name'; FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.local_threadpool_status'''; + QUERY_STR := 'SELECT * FROM dbe_perf.local_threadpool_status'; FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP RETURN NEXT ROW_DATA; END LOOP; @@ -5457,77 +5109,15 @@ CREATE OR REPLACE VIEW DBE_PERF.global_threadpool_status AS CREATE OR REPLACE VIEW DBE_PERF.local_plancache_status AS SELECT * FROM plancache_status(); -CREATE OR REPLACE FUNCTION DBE_PERF.global_plancache_status() -RETURNS SETOF DBE_PERF.local_plancache_status -AS $$ -DECLARE - ROW_DATA DBE_PERF.local_plancache_status%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; -BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'') and nodeis_active=true'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.local_plancache_status'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - END LOOP; - RETURN; -END; $$ -LANGUAGE 'plpgsql'; - -CREATE OR REPLACE VIEW DBE_PERF.global_plancache_status AS - SELECT * FROM DBE_PERF.global_plancache_status(); +CREATE VIEW DBE_PERF.global_plancache_status AS + SELECT * FROM pg_catalog.plancache_status(); CREATE OR REPLACE VIEW DBE_PERF.local_prepare_statement_status AS SELECT * FROM prepare_statement_status(); -CREATE OR REPLACE FUNCTION DBE_PERF.global_prepare_statement_status() -RETURNS SETOF DBE_PERF.local_prepare_statement_status -AS $$ -DECLARE - ROW_DATA DBE_PERF.local_prepare_statement_status%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; -BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'') and nodeis_active=true'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.local_prepare_statement_status'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - END LOOP; - RETURN; -END; $$ -LANGUAGE 'plpgsql'; - -CREATE OR REPLACE VIEW DBE_PERF.global_prepare_statement_status AS - SELECT * FROM DBE_PERF.global_prepare_statement_status(); - CREATE OR REPLACE VIEW DBE_PERF.local_plancache_clean AS SELECT * FROM plancache_clean(); -CREATE OR REPLACE FUNCTION DBE_PERF.global_plancache_clean() -RETURNS BOOLEAN -AS $$ -DECLARE - ROW_DATA record; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; -BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''D'') and nodeis_active=true'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * from DBE_PERF.local_plancache_clean'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - END LOOP; - END LOOP; - RETURN TRUE; -END; $$ -LANGUAGE 'plpgsql'; - CREATE OR REPLACE VIEW DBE_PERF.gs_slow_query_info AS SELECT S.dbname, @@ -5592,11 +5182,11 @@ SELECT S.data_io_time FROM pg_stat_get_wlm_session_info(0) S where S.is_slow_query = 1; -CREATE OR REPLACE FUNCTION DBE_PERF.global_slow_query_history -RETURNS setof DBE_PERF.gs_slow_query_history +CREATE OR REPLACE FUNCTION dbe_perf.global_slow_query_history +RETURNS setof dbe_perf.gs_slow_query_history AS $$ DECLARE - row_data DBE_PERF.gs_slow_query_history%rowtype; + row_data dbe_perf.gs_slow_query_history%rowtype; row_name record; query_str text; query_str_nodes text; @@ -5604,7 +5194,7 @@ DECLARE --Get all the node names query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.gs_slow_query_history'''; + query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM dbe_perf.gs_slow_query_history'''; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -5670,299 +5260,10 @@ SELECT * FROM DBE_PERF.global_slow_query_info(); CREATE OR REPLACE VIEW DBE_PERF.local_active_session AS SELECT * FROM pg_catalog.get_local_active_session(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_active_session - (OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) -RETURNS SETOF record -AS $$ -DECLARE - ROW_DATA DBE_PERF.local_active_session%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; -BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'')'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.local_active_session'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := ROW_NAME.NODE_NAME; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - unique_query := ROW_DATA.unique_query; - RETURN NEXT; - END LOOP; - END LOOP; - RETURN; -END; $$ -LANGUAGE 'plpgsql'; - -CREATE OR REPLACE VIEW DBE_PERF.global_active_session AS - SELECT * FROM DBE_PERF.get_global_active_session(); - -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_pg_asp - (OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) -RETURNS SETOF record -AS $$ -DECLARE - ROW_DATA pg_catalog.pg_asp%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; -BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'')'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM pg_asp'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := ROW_NAME.NODE_NAME; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - unique_query := ROW_DATA.unique_query; - RETURN NEXT; - END LOOP; - END LOOP; - RETURN; -END; $$ -LANGUAGE 'plpgsql'; - -CREATE OR REPLACE VIEW DBE_PERF.global_pg_asp AS - SELECT * FROM DBE_PERF.get_global_pg_asp(); CREATE OR REPLACE VIEW DBE_PERF.wait_event_info AS SELECT * FROM get_wait_event_info(); -CREATE OR REPLACE FUNCTION DBE_PERF.get_datanode_active_session -( in datanode text, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) -RETURNS SETOF record -AS $$ -DECLARE - row_data DBE_PERF.local_active_session%rowtype; - cn_name record; - query_text record; - QUERY_STR text; - query_cn text; - query_str_cn_name text; -BEGIN - --Get all the node names - QUERY_STR := 'EXECUTE DIRECT ON (' || $1 || ') ''SELECT * FROM DBE_PERF.local_active_session'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - IF ROW_DATA.cn_id IS NULL THEN - unique_query := ROW_DATA.unique_query; - ELSE - query_str_cn_name := 'SELECT node_name FROM pgxc_node WHERE node_id='||ROW_DATA.cn_id||' AND nodeis_active = true'; - FOR cn_name IN EXECUTE(query_str_cn_name) LOOP - query_cn := 'EXECUTE DIRECT ON (' || cn_name.node_name || ') ''SELECT unique_query FROM DBE_PERF.local_active_session where unique_query_id = '|| ROW_DATA.unique_query_id||' limit 1'''; - FOR query_text IN EXECUTE(query_cn) LOOP - unique_query := query_text.unique_query; - END LOOP; - END LOOP; - END IF; - RETURN NEXT; - END LOOP; - RETURN; -END; $$ -LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION DBE_PERF.get_datanode_active_session_hist -( in datanode text, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) -RETURNS SETOF record -AS $$ -DECLARE - ROW_DATA pg_catalog.pg_asp%ROWTYPE; - cn_name record; - query_text record; - QUERY_STR text; - query_cn text; - query_str_cn_name text; -BEGIN - --Get all the node names - QUERY_STR := 'EXECUTE DIRECT ON (' || $1 || ') ''SELECT * FROM pg_catalog.pg_asp'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - IF ROW_DATA.cn_id IS NULL THEN - unique_query := ROW_DATA.unique_query; - ELSE - query_str_cn_name := 'SELECT node_name FROM pgxc_node WHERE node_id='||ROW_DATA.cn_id||' AND nodeis_active = true'; - FOR cn_name IN EXECUTE(query_str_cn_name) LOOP - query_cn := 'EXECUTE DIRECT ON (' || cn_name.node_name || ') ''SELECT unique_query FROM pg_catalog.pg_asp where unique_query_id = '|| ROW_DATA.unique_query_id||' limit 1'''; - FOR query_text IN EXECUTE(query_cn) LOOP - unique_query := query_text.unique_query; - END LOOP; - END LOOP; - END IF; - RETURN NEXT; - END LOOP; - RETURN; -END; $$ -LANGUAGE 'plpgsql'; - grant select on all tables in schema DBE_PERF to public; DROP INDEX IF EXISTS pg_catalog.pg_asp_oid_index; @@ -5974,49 +5275,6 @@ CREATE EXTENSION security_plugin; DROP FUNCTION IF EXISTS pg_catalog.gs_stat_activity_timeout() cascade; DROP FUNCTION IF EXISTS pg_catalog.global_stat_activity_timeout() cascade; -DO $DO$ -DECLARE - ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 4520; - CREATE OR REPLACE FUNCTION dbe_perf.gs_stat_activity_timeout(IN timeout_threshold int4, OUT datid oid, OUT pid INT8, OUT sessionid INT8, OUT usesysid oid, OUT application_name text, OUT query text, OUT xact_start timestamptz, OUT query_start timestamptz, OUT query_id INT8) - RETURNS SETOF RECORD LANGUAGE INTERNAL as 'gs_stat_activity_timeout'; - - SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 0; - CREATE OR REPLACE FUNCTION dbe_perf.global_stat_activity_timeout(in execute_time int4, out nodename text, out datid oid, out pid int8, out sessionid int8, out usesysid oid, out application_name text, out query text, out xact_start timestamptz, out query_start timestamptz, out query_id int8) - RETURNS setof record - AS $$ - DECLARE - query_str text; - node_data record; - row_data record; - BEGIN - --Get the node names of all CNs - query_str := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR node_data IN EXECUTE(query_str) LOOP - query_str := 'EXECUTE DIRECT ON (' || node_data.node_name || ') ''SELECT * FROM dbe_perf.gs_stat_activity_timeout(' || execute_time || ')'''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename := node_data.node_name; - datid := row_data.datid; - pid := row_data.pid; - sessionid := row_data.sessionid; - usesysid := row_data.usesysid; - application_name := row_data.application_name; - query := row_data.query; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - query_id := row_data.query_id; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - end if; -END$DO$; - DROP FUNCTION IF EXISTS remove_create_partition_policy(name, name); DROP FUNCTION IF EXISTS remove_drop_partition_policy(name, name); DROP FUNCTION IF EXISTS is_super_user_or_sysadm(name); @@ -6287,40 +5545,6 @@ END; $$ LANGUAGE plpgsql NOT FENCED; --get audit log from all CNs -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_query_audit(IN starttime TIMESTAMPTZ, IN endtime TIMESTAMPTZ, OUT "time" TIMESTAMPTZ, OUT "type" text, OUT "result" text, OUT userid text, OUT username text, OUT database text, OUT client_conninfo text, OUT "object_name" text, OUT detail_info text, OUT node_name text, OUT thread_id text, OUT local_port text, OUT remote_port text) -RETURNS setof record -AS $$ -DECLARE - row_name record; - row_data record; - query_str text; - query_str_nodes text; - BEGIN - --Get the node names of all CNs - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_query_audit(''''' || starttime || ''''',''''' || endtime || ''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - "time" := row_data."time"; - "type" := row_data."type"; - "result" := row_data."result"; - userid := row_data.userid; - username := row_data.username; - database := row_data.database; - client_conninfo := row_data.client_conninfo; - "object_name" := row_data."object_name"; - detail_info := row_data.detail_info; - node_name := row_data.node_name; - thread_id := row_data.thread_id; - local_port := row_data.local_port; - remote_port := row_data.remote_port; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - DO $DO$ DECLARE ans boolean; @@ -6334,37 +5558,6 @@ BEGIN SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 4520; CREATE OR REPLACE FUNCTION dbe_perf.gs_stat_activity_timeout(IN timeout_threshold int4, OUT database name, OUT pid INT8, OUT sessionid INT8, OUT usesysid oid, OUT application_name text, OUT query text, OUT xact_start timestamptz, OUT query_start timestamptz, OUT query_id INT8) RETURNS SETOF RECORD LANGUAGE INTERNAL as 'gs_stat_activity_timeout'; - - SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 0; - CREATE OR REPLACE FUNCTION dbe_perf.global_stat_activity_timeout(in execute_time int4, out nodename text, out database name, out pid int8, out sessionid int8, out usesysid oid, out application_name text, out query text, out xact_start timestamptz, out query_start timestamptz, out query_id int8) - RETURNS setof record - AS $$ - DECLARE - query_str text; - node_data record; - row_data record; - BEGIN - --Get the node names of all CNs - query_str := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR node_data IN EXECUTE(query_str) LOOP - query_str := 'EXECUTE DIRECT ON (' || node_data.node_name || ') ''SELECT * FROM dbe_perf.gs_stat_activity_timeout(' || execute_time || ')'''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename := node_data.node_name; - database := row_data.database; - pid := row_data.pid; - sessionid := row_data.sessionid; - usesysid := row_data.usesysid; - application_name := row_data.application_name; - query := row_data.query; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - query_id := row_data.query_id; - return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; end if; END$DO$; @@ -6380,8 +5573,6 @@ CREATE OR REPLACE FUNCTION pkg_service.job_submit( IMMUTABLE NOT SHIPPABLE as 'job_submit'; - DROP VIEW IF EXISTS DBE_PERF.global_prepare_statement_status CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.global_prepare_statement_status() CASCADE; DROP VIEW IF EXISTS DBE_PERF.local_prepare_statement_status CASCADE; DROP FUNCTION IF EXISTS pg_catalog.prepare_statement_status() CASCADE; set local inplace_upgrade_next_system_object_oids = IUO_PROC,3959; @@ -6389,28 +5580,6 @@ as 'job_submit'; CREATE VIEW DBE_PERF.local_prepare_statement_status AS SELECT * FROM prepare_statement_status(); - CREATE OR REPLACE FUNCTION DBE_PERF.global_prepare_statement_status() - RETURNS SETOF DBE_PERF.local_prepare_statement_status - AS $$ - DECLARE - ROW_DATA DBE_PERF.local_prepare_statement_status%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'') and nodeis_active=true'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.local_prepare_statement_status'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE VIEW DBE_PERF.global_prepare_statement_status AS - SELECT * FROM DBE_PERF.global_prepare_statement_status(); DECLARE user_name text; @@ -6421,181 +5590,10 @@ as 'job_submit'; query_str := 'GRANT ALL ON TABLE DBE_PERF.local_prepare_statement_status TO ' || quote_ident(user_name) || ';'; EXECUTE IMMEDIATE query_str; - query_str := 'GRANT ALL ON TABLE DBE_PERF.global_prepare_statement_status TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - END; / GRANT SELECT ON TABLE DBE_PERF.local_prepare_statement_status TO PUBLIC; - GRANT SELECT ON TABLE DBE_PERF.global_prepare_statement_status TO PUBLIC; - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP FUNCTION IF EXISTS DBE_PERF.get_global_pg_asp - (in start_ts timestamp without time zone, - in end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_datanode_active_session_hist - (in datanode text, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) cascade; - DROP FUNCTION IF EXISTS DBE_PERF.get_datanode_active_session_hist - (in datanode text, - in start_ts timestamp without time zone, - in end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) cascade; - CREATE OR REPLACE FUNCTION DBE_PERF.get_datanode_active_session_hist - (in datanode text, - in start_ts timestamp without time zone, - in end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA pg_catalog.gs_asp%ROWTYPE; - cn_name record; - query_text record; - QUERY_STR text; - query_cn text; - query_str_cn_name text; - node_str text; - BEGIN - --Get all the node names - node_str := 'SELECT * FROM pg_catalog.gs_asp where sample_time > '''''||$2||''''' and sample_time < '''''||$3||''''; - QUERY_STR := 'EXECUTE DIRECT ON (' || $1 || ') '''|| node_str ||''''';'; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := datanode; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - IF ROW_DATA.cn_id IS NULL THEN - unique_query := ROW_DATA.unique_query; - ELSE - query_str_cn_name := 'SELECT node_name FROM pgxc_node WHERE node_id='||ROW_DATA.cn_id||' AND nodeis_active = true'; - FOR cn_name IN EXECUTE(query_str_cn_name) LOOP - query_cn := 'EXECUTE DIRECT ON (' || cn_name.node_name || ') ''SELECT unique_query FROM pg_catalog.gs_asp where unique_query_id = '|| ROW_DATA.unique_query_id||' limit 1'''; - FOR query_text IN EXECUTE(query_cn) LOOP - unique_query := query_text.unique_query; - END LOOP; - END LOOP; - END IF; - RETURN NEXT; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - end if; -END$DO$; drop function if exists pg_catalog.login_audit_messages(boolean); drop function if exists pg_catalog.login_audit_messages_pid(boolean); @@ -7171,113 +6169,6 @@ CREATE OR REPLACE VIEW pg_catalog.DV_SESSIONS AS LEFT JOIN pg_authid ad ON(sa.usesysid = ad.oid) WHERE sa.application_name <> 'JobScheduler'; -CREATE OR REPLACE FUNCTION pg_catalog.pg_nodes_memmon(OUT InnerNName text, OUT InnerUsedMem int8, OUT InnerTopCtxt int8, OUT NName text, OUT UsedMem text, OUT SharedBufferCache text, OUT TopContext text) -RETURNS setof record -AS $$ -DECLARE - enable_threadpool bool; - row_data record; - row_data1 record; - row_name record; - query_str text; - query_str1 text; - shared_bcache text; - query_str_nodes text; - itr integer; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select ''''N_name'''' as nname1, sum(usedsize) as usedmem1 from pv_session_memory_detail where 1=1 '''; - query_str1 := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select contextname as contextname1, sum(usedsize) as usedsize1 from pv_session_memory_detail group by contextname order by usedsize1 desc limit 3 '''; - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.nname1 := CASE - WHEN pg_catalog.LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-pg_catalog.length(row_name.node_name)) - ELSE pg_catalog.SUBSTR(row_name.node_name,1,20) - END; - - InnerNName := row_data.nname1; - NName := row_data.nname1; - InnerUsedMem := row_data.usedmem1; - UsedMem := pg_size_pretty(row_data.usedmem1); - - EXECUTE 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT pg_size_pretty(count(*) * 8192) || ''''(Utilization: '''' || pg_size_pretty((SELECT setting FROM pg_settings WHERE name =''''shared_buffers'''') * 8192) || ''''/'''' || round(count(*)/(SELECT setting FROM pg_settings WHERE name =''''shared_buffers''''),2)*100 || ''''%)'''' FROM pg_buffercache_pages() WHERE relfilenode IS NOT NULL ''' - INTO shared_bcache; - - SharedBufferCache := shared_bcache; - - itr := 1; - FOR row_data1 IN EXECUTE(query_str1) LOOP - --We should have 3 return rows - TopContext := row_data1.contextname1 || '(' || pg_size_pretty(row_data1.usedsize1) || ')'; - InnerTopCtxt := row_data1.usedsize1; - IF itr = 1 THEN - RETURN next; - ELSE - NName := ''; - UsedMem := ''; - SharedBufferCache := ''; - RETURN next; - END IF; - itr := itr + 1; - END LOOP; - END LOOP; - END LOOP; - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.distributed_count(IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - total_num bigint; - flag boolean; - special text := '[;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN _table_name, IN special; - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - RETURN; - END IF; - EXECUTE 'SELECT count(1) FROM ' || _table_name - INTO total_num; - - --Get the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node, pgxc_class where node_type IN (''C'', ''D'') AND is_oid_in_group_members(oid, nodeoids) AND - pcrelid=''' || _table_name || '''::regclass::oid'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select ''''DN_name'''' as dnname1, count(1) as count1 from ' || $1 || ''''; - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.dnname1 := CASE - WHEN pg_catalog.LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-pg_catalog.length(row_name.node_name)) - ELSE pg_catalog.SUBSTR(row_name.node_name,1,20) - END; - DNName := row_data.dnname1; - Num := row_data.count1; - IF total_num = 0 THEN - Ratio := 0.000 ||'%'; - ELSE - Ratio := ROUND(row_data.count1/total_num*100,3) || '%'; - END IF; - RETURN next; - END LOOP; - END LOOP; - - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - CREATE OR REPLACE FUNCTION pg_catalog.login_audit_messages(in flag boolean) returns table (username text, database text, logintime timestamp with time zone, mytype text, result text, client_conninfo text) AUTHID DEFINER AS $$ DECLARE @@ -7448,30 +6339,6 @@ LANGUAGE plpgsql NOT FENCED; CREATE OR REPLACE VIEW pg_catalog.pg_thread_wait_status AS SELECT * FROM pg_catalog.pg_stat_get_status(NULL); -create or replace function pg_catalog.pgxc_cgroup_map_ng_conf(IN ngname text) -returns bool -AS $$ -declare - host_info record; - query_str text; - query_string text; - flag boolean; - special text := '[^A-z0-9_]'; -begin - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN ngname, IN special; - IF flag = true THEN - return false; - ELSE - query_str = 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - for host_info in execute(query_str) loop - query_string := 'execute direct on (' || host_info.node_name || ') ''SELECT * from pg_catalog.gs_cgroup_map_ng_conf(''''' || ngname || ''''')'''; - execute query_string; - end loop; - END IF; - return true; -end; -$$language plpgsql NOT FENCED; - create or replace function pg_catalog.table_skewness(table_name text, column_name text, OUT seqNum text, OUT Num text, OUT Ratio text, row_num text default '0') RETURNS setof record @@ -7669,33 +6536,6 @@ DECLARE END; $$ LANGUAGE 'plpgsql' NOT FENCED; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_delta_info(IN rel TEXT, OUT node_name TEXT, OUT part_name TEXT, OUT live_tuple INT8, OUT data_size INT8, OUT blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_str_nodes text; - query_str text; - query_part_str text; - rel_info record; - row_name record; - row_data record; - BEGIN - EXECUTE ('select c.relname,n.nspname from pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) where C.oid = (select '''|| rel ||'''::regclass::oid)') into rel_info; - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_catalog.pg_get_delta_info('''''||rel_info.relname||''''','''''||rel_info.nspname||''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - live_tuple := row_data.live_tuple; - data_size := row_data.data_size; - blockNum := row_data.blockNum; - part_name := row_data.part_name; - return next; - END LOOP; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - CREATE OR REPLACE FUNCTION pg_catalog.get_delta_info(IN rel TEXT, OUT part_name TEXT, OUT total_live_tuple INT8, OUT total_data_size INT8, OUT max_blockNum INT8) RETURNS setof record AS $$ @@ -7714,60 +6554,6 @@ DECLARE END; $$ LANGUAGE 'plpgsql' NOT FENCED; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_query_audit(IN starttime TIMESTAMPTZ, IN endtime TIMESTAMPTZ, OUT "time" TIMESTAMPTZ, OUT "type" text, OUT "result" text, OUT userid text, OUT username text, OUT database text, OUT client_conninfo text, OUT "object_name" text, OUT detail_info text, OUT node_name text, OUT thread_id text, OUT local_port text, OUT remote_port text) -RETURNS setof record -AS $$ -DECLARE - row_name record; - row_data record; - query_str text; - query_str_nodes text; - BEGIN - --Get the node names of all CNs - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_catalog.pg_query_audit(''''' || starttime || ''''',''''' || endtime || ''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - "time" := row_data."time"; - "type" := row_data."type"; - "result" := row_data."result"; - userid := row_data.userid; - username := row_data.username; - database := row_data.database; - client_conninfo := row_data.client_conninfo; - "object_name" := row_data."object_name"; - detail_info := row_data.detail_info; - node_name := row_data.node_name; - thread_id := row_data.thread_id; - local_port := row_data.local_port; - remote_port := row_data.remote_port; - return next; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.is_oid_in_group_members(IN node_oid Oid, IN group_members oidvector_extend) -RETURNS BOOLEAN AS $$ -DECLARE -query_str text; -match_count int; -node_list text; -BEGIN - match_count := 0; - select pg_catalog.array_to_string($2, ',') into node_list; - - query_str := 'SELECT count(1) FROM pgxc_node n WHERE n.oid = ' || node_oid || ' AND n.node_name IN (SELECT n1.node_name FROM pgxc_node n1 WHERE n1.oid in (' || node_list || '))'; - EXECUTE query_str into match_count; - - IF match_count = 1 THEN - RETURN true; - END IF; - RETURN false; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - CREATE OR REPLACE FUNCTION pg_catalog.lock_cluster_ddl() RETURNS boolean AS $$ @@ -7872,54 +6658,6 @@ DECLARE END; $$ LANGUAGE 'plpgsql' NOT FENCED; -CREATE OR REPLACE FUNCTION pg_catalog.distributed_count(IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - total_num bigint; - flag boolean; - special text := '[;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - RETURN; - END IF; - EXECUTE 'SELECT count(1) FROM ' || $1 - INTO total_num; - - --Get the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node, pgxc_class where node_type IN (''C'', ''D'') AND is_oid_in_group_members(oid, nodeoids) AND - pcrelid=''' || $1 || '''::regclass::oid'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select ''''DN_name'''' as dnname1, count(1) as count1 from ' || $1 || ''''; - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.dnname1 := CASE - WHEN LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-length(row_name.node_name)) - ELSE SUBSTR(row_name.node_name,1,20) - END; - DNName := row_data.dnname1; - Num := row_data.count1; - IF total_num = 0 THEN - Ratio := 0.000 ||'%'; - ELSE - Ratio := ROUND(row_data.count1/total_num*100,3) || '%'; - END IF; - RETURN next; - END LOOP; - END LOOP; - - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - CREATE OR REPLACE FUNCTION pg_catalog.get_delta_info(IN rel TEXT, OUT part_name TEXT, OUT total_live_tuple INT8, OUT total_data_size INT8, OUT max_blockNum INT8) RETURNS setof record AS $$ @@ -7938,31 +6676,6 @@ DECLARE END; $$ LANGUAGE 'plpgsql' NOT FENCED; -CREATE OR REPLACE FUNCTION pg_catalog.get_shard_oids_byname(IN node_name varchar) -RETURNS Oid[] AS $$ -declare - node_oid Oid; - nodes Oid[]; - nodenames_query text; - total_num bigint; - flag boolean; - special text := '[;|-]'; -BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - return '{0}'; - ELSE - nodenames_query := 'SELECT oid FROM pgxc_node WHERE node_name = $1 ORDER BY oid'; - FOR node_oid IN EXECUTE nodenames_query USING node_name LOOP - nodes := array_append(nodes, node_oid); - END LOOP; - RETURN nodes; - END IF; -END; $$ -LANGUAGE plpgsql NOT FENCED; - CREATE OR REPLACE FUNCTION pg_catalog.get_large_table_name(relfile_node text, threshold_size_gb int8) RETURNS text AS $$ @@ -8032,99 +6745,6 @@ DECLARE END; $$LANGUAGE plpgsql NOT FENCED; -CREATE OR REPLACE FUNCTION pg_catalog.pv_session_memory_detail_tp(OUT sessid TEXT, OUT sesstype TEXT, OUT contextname TEXT, OUT level INT2, OUT parent TEXT, OUT totalsize INT8, OUT freesize INT8, OUT usedsize INT8) -RETURNS setof record -AS $$ -DECLARE - enable_threadpool bool; - row_data record; - query_str text; -BEGIN - show enable_thread_pool into enable_threadpool; - - IF enable_threadpool THEN - query_str := 'with SM AS - (SELECT - S.sessid AS sessid, - T.thrdtype AS sesstype, - S.contextname AS contextname, - S.level AS level, - S.parent AS parent, - S.totalsize AS totalsize, - S.freesize AS freesize, - S.usedsize AS usedsize - FROM - pv_session_memory_context S - LEFT JOIN - (SELECT DISTINCT thrdtype, tid - FROM pv_thread_memory_context) T - on S.threadid = T.tid - ), - TM AS - (SELECT - S.sessid AS Ssessid, - T.thrdtype AS sesstype, - T.threadid AS Tsessid, - T.contextname AS contextname, - T.level AS level, - T.parent AS parent, - T.totalsize AS totalsize, - T.freesize AS freesize, - T.usedsize AS usedsize - FROM - pv_thread_memory_context T - LEFT JOIN - (SELECT DISTINCT sessid, threadid - FROM pv_session_memory_context) S - ON T.tid = S.threadid - ) - SELECT * from SM - UNION ALL - SELECT - Ssessid AS sessid, sesstype, contextname, level, parent, totalsize, freesize, usedsize - FROM TM WHERE Ssessid IS NOT NULL - UNION ALL - SELECT - Tsessid AS sessid, sesstype, contextname, level, parent, totalsize, freesize, usedsize - FROM TM WHERE Ssessid IS NULL;'; - FOR row_data IN EXECUTE(query_str) LOOP - sessid = row_data.sessid; - sesstype = row_data.sesstype; - contextname = row_data.contextname; - level = row_data.level; - parent = row_data.parent; - totalsize = row_data.totalsize; - freesize = row_data.freesize; - usedsize = row_data.usedsize; - return next; - END LOOP; - ELSE - query_str := 'SELECT - T.threadid AS sessid, - T.thrdtype AS sesstype, - T.contextname AS contextname, - T.level AS level, - T.parent AS parent, - T.totalsize AS totalsize, - T.freesize AS freesize, - T.usedsize AS usedsize - FROM pg_catalog.pv_thread_memory_detail() T;'; - FOR row_data IN EXECUTE(query_str) LOOP - sessid = row_data.sessid; - sesstype = row_data.sesstype; - contextname = row_data.contextname; - level = row_data.level; - parent = row_data.parent; - totalsize = row_data.totalsize; - freesize = row_data.freesize; - usedsize = row_data.usedsize; - return next; - END LOOP; - END IF; - RETURN; -END; $$ -LANGUAGE plpgsql NOT FENCED; - CREATE OR REPLACE VIEW pg_catalog.gs_session_memory_statistics AS SELECT S.datid AS datid, @@ -8209,12 +6829,6 @@ SELECT FROM pg_stat_activity_ng AS S, pg_catalog.pg_stat_get_wlm_realtime_session_info(NULL) AS T WHERE S.sessionid = T.threadid; -set local inplace_upgrade_next_system_object_oids = IUO_PROC, 2099; -CREATE OR REPLACE FUNCTION pg_catalog.pg_terminate_session - (IN threadid BIGINT, - IN sessionid BIGINT) -RETURNS bool LANGUAGE INTERNAL NOT FENCED as 'pg_terminate_session'; - CREATE OR REPLACE FUNCTION pg_catalog.pg_get_delta_info(IN rel TEXT, IN schema_name TEXT, OUT part_name TEXT, OUT live_tuple INT8, OUT data_size INT8, OUT blockNum INT8) RETURNS setof record AS $$ @@ -8259,33 +6873,6 @@ DECLARE END; $$ LANGUAGE 'plpgsql' NOT FENCED; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_delta_info(IN rel TEXT, OUT node_name TEXT, OUT part_name TEXT, OUT live_tuple INT8, OUT data_size INT8, OUT blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_str_nodes text; - query_str text; - query_part_str text; - rel_info record; - row_name record; - row_data record; - BEGIN - EXECUTE format('select c.relname,n.nspname from pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) where C.oid = (select %L::regclass::oid)', rel) into rel_info; - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''D'''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_catalog.pg_get_delta_info('''''||rel_info.relname||''''','''''||rel_info.nspname||''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_name.node_name; - live_tuple := row_data.live_tuple; - data_size := row_data.data_size; - blockNum := row_data.blockNum; - part_name := row_data.part_name; - return next; - END LOOP; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - CREATE OR REPLACE FUNCTION pg_catalog.get_delta_info(IN rel TEXT, OUT part_name TEXT, OUT total_live_tuple INT8, OUT total_data_size INT8, OUT max_blockNum INT8) RETURNS setof record AS $$ @@ -8434,153 +7021,6 @@ BEGIN end if; END $DO$; -CREATE or REPLACE FUNCTION pg_catalog.gs_get_table_distribution( IN table_name TEXT, IN schema_name TEXT) -RETURNS TEXT -AS -$$ -DECLARE -nodename text; -query_str text; -row_data record; -row_data1 record; -nodelist text; -flag boolean; -special text := '[ ;|-]'; -BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN table_name, IN special; - IF flag = true THEN - raise WARNING 'Illegal character entered for function'; - return nodelist; - END IF; - - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN schema_name, IN special; - IF flag = true THEN - raise WARNING 'Illegal character entered for function'; - return nodelist; - END IF; - - query_str := 'SELECT oid,node_name FROM pgxc_node WHERE node_type=''D'' order by node_name'; - - FOR row_data IN EXECUTE(query_str) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_data.node_name || ') ''SELECT count(*) AS num FROM pg_class c LEFT JOIN pg_namespace n ON c.relnamespace = n.oid WHERE relname='''''||table_name||''''' AND n.nspname='''''||schema_name||''''' '''; - FOR row_data1 IN EXECUTE(query_str) LOOP - IF row_data1.num = 1 THEN - nodelist := nodelist || ' '|| row_data.oid; - END IF; - END LOOP; - END LOOP; - - RETURN nodelist; -END; -$$ -LANGUAGE plpgsql; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_current_instance_info(text, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name text; - flag boolean; - special text := '[ ;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT pg_catalog.regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - IF flag = true THEN - RAISE WARNING 'Illegal character entered for function'; - return; - END IF; - - IF $2 is null THEN - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info()'; - ELSE - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info() limit '||$2; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='''||$1||''''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - query_str := 'EXECUTE DIRECT ON ('||node_name||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_history_instance_info(text, TIMESTAMP, TIMESTAMP, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name text; - flag boolean; - special text := '[ ;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT pg_catalog.regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - IF flag = true THEN - RAISE WARNING 'Illegal character entered for function'; - return; - END IF; - - IF $4 is null THEN - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'''''||$2||''''' and timestamp <'''''||$3||''''' '; - ELSE - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'''''||$2||''''' and timestamp <'''''||$3||''''' limit '||$4; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='''||$1||''''; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - query_str := 'EXECUTE DIRECT ON ('||node_name||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - DROP VIEW IF EXISTS pg_catalog.pg_stat_replication; CREATE VIEW pg_catalog.pg_stat_replication AS SELECT @@ -9138,19 +7578,19 @@ BEGIN CREATE VIEW DBE_PERF.statement AS SELECT * FROM get_instr_unique_sql(); - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statement() - RETURNS setof DBE_PERF.statement + CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statement() + RETURNS setof dbe_perf.statement AS $$ DECLARE - row_data DBE_PERF.statement%rowtype; + row_data dbe_perf.statement%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement'''; + query_str := 'SELECT * FROM dbe_perf.statement'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -9195,62 +7635,6 @@ DROP FUNCTION IF EXISTS pg_catalog.pg_stat_get_pooler_status(OUT database_name t SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 3955; CREATE FUNCTION pg_catalog.pg_stat_get_pooler_status(OUT database_name text, OUT user_name text, OUT tid int8, OUT pgoptions text, OUT node_oid int8, OUT in_use boolean, OUT session_params text, OUT fdsock int8, OUT remote_pid int8, OUT used_count int8) RETURNS SETOF record LANGUAGE INTERNAL STABLE ROWS 100 as 'pg_stat_get_pooler_status'; -DROP VIEW IF EXISTS pg_catalog.pg_pooler_status; -CREATE VIEW pg_catalog.pg_pooler_status AS - SELECT - S.database_name AS database, - S.user_name AS user_name, - S.tid AS tid, - S.node_oid AS node_oid, - D.node_name AS node_name, - S.in_use AS in_use, - D.node_port AS node_port, - S.fdsock AS fdsock, - S.remote_pid AS remote_pid, - S.session_params AS session_params, - S.used_count AS used_count - FROM pgxc_node D, pg_stat_get_pooler_status() AS S - WHERE D.oid = S.node_oid; - -GRANT SELECT ON pg_catalog.pg_pooler_status TO public; - - -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - DROP VIEW IF EXISTS DBE_PERF.pooler_status; - CREATE VIEW DBE_PERF.pooler_status AS - SELECT - S.database_name AS database, - S.user_name AS user_name, - S.tid AS tid, - S.node_oid AS node_oid, - D.node_name AS node_name, - S.in_use AS in_use, - D.node_port AS node_port, - S.fdsock AS fdsock, - S.remote_pid AS remote_pid, - S.session_params AS session_params, - S.used_count AS used_count - FROM pgxc_node D, pg_stat_get_pooler_status() AS S - WHERE D.oid = S.node_oid; - - DECLARE - user_name text; - query_str text; - BEGIN - SELECT SESSION_USER INTO user_name; - - query_str := 'GRANT ALL ON TABLE DBE_PERF.pooler_status TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE query_str; - END; - GRANT SELECT ON TABLE DBE_PERF.pooler_status TO PUBLIC; - end if; -END$DO$; - DO $$ DECLARE ans boolean; @@ -9258,10 +7642,7 @@ BEGIN select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; if ans = true then DROP FUNCTION IF EXISTS DBE_PERF.get_global_gs_asp() CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.get_datanode_active_session() CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.get_datanode_active_session_hist() CASCADE; DROP VIEW IF EXISTS DBE_PERF.global_active_session CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.get_global_active_session() CASCADE; DROP VIEW IF EXISTS DBE_PERF.local_active_session CASCADE; DROP VIEW IF EXISTS DBE_PERF.global_thread_wait_status CASCADE; DROP FUNCTION IF EXISTS DBE_PERF.get_global_thread_wait_status() CASCADE; @@ -9398,19 +7779,19 @@ BEGIN CREATE OR REPLACE VIEW DBE_PERF.thread_wait_status AS SELECT * FROM pg_catalog.pg_stat_get_status(NULL); - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_thread_wait_status() - RETURNS setof DBE_PERF.thread_wait_status + CREATE OR REPLACE FUNCTION dbe_perf.get_global_thread_wait_status() + RETURNS setof dbe_perf.thread_wait_status AS $$ DECLARE - row_data DBE_PERF.thread_wait_status%rowtype; + row_data dbe_perf.thread_wait_status%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all cn dn node names - query_str_nodes := 'SELECT node_name FROM pg_catalog.pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.thread_wait_status'''; + query_str := 'SELECT * FROM dbe_perf.thread_wait_status'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -9434,343 +7815,6 @@ BEGIN SELECT sampleid, sample_time, need_flush_sample, databaseid, thread_id, sessionid, start_time, event, lwtid, psessionid, tlevel, smpid, userid, application_name, client_addr, client_hostname, client_port, query_id, unique_query_id, user_id, cn_id, unique_query, locktag, lockmode, block_sessionid, final_block_sessionid, wait_status FROM tt WHERE level = (SELECT MAX(level) FROM tt t1 WHERE t1.sessionid = tt.sessionid); - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_active_session - (OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text, - OUT locktag text, - OUT lockmode text, - OUT block_sessionid bigint, - OUT final_block_sessionid bigint, - OUT wait_status text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA DBE_PERF.local_active_session%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM pg_catalog.PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'')'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.local_active_session'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := ROW_NAME.NODE_NAME; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - unique_query := ROW_DATA.unique_query; - locktag := ROW_DATA.locktag; - lockmode := ROW_DATA.lockmode; - block_sessionid := ROW_DATA.block_sessionid; - final_block_sessionid := ROW_DATA.final_block_sessionid; - wait_status := ROW_DATA.wait_status; - RETURN NEXT; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE VIEW DBE_PERF.global_active_session AS - SELECT * FROM DBE_PERF.get_global_active_session(); - - CREATE OR REPLACE FUNCTION DBE_PERF.get_datanode_active_session_hist - ( IN datanode text, - IN start_ts timestamp without time zone, - IN end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text, - OUT locktag text, - OUT lockmode text, - OUT block_sessionid bigint, - OUT wait_status text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA pg_catalog.gs_asp%ROWTYPE; - cn_name record; - query_text record; - QUERY_STR text; - query_cn text; - query_str_cn_name text; - node_str text; - BEGIN - if (select working_version_num() < 92217) then - raise exception 'function get_datanode_active_session_hist should not be call during upgrade.'; - end if; - node_str := 'SELECT * FROM pg_catalog.gs_asp where sample_time > '''''||$2||''''' and sample_time < '''''||$3||''''; - QUERY_STR := 'EXECUTE DIRECT ON (' || $1 || ') '''|| node_str ||''''';'; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := datanode; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - IF ROW_DATA.cn_id IS NULL THEN - unique_query := ROW_DATA.unique_query; - ELSE - query_str_cn_name := 'SELECT node_name FROM pg_catalog.pgxc_node WHERE node_id='||ROW_DATA.cn_id||' AND nodeis_active = true'; - FOR cn_name IN EXECUTE(query_str_cn_name) LOOP - query_cn := 'EXECUTE DIRECT ON (' || cn_name.node_name || ') ''SELECT unique_query FROM pg_catalog.gs_asp where unique_query_id = '|| ROW_DATA.unique_query_id||' limit 1'''; - FOR query_text IN EXECUTE(query_cn) LOOP - unique_query := query_text.unique_query; - END LOOP; - END LOOP; - END IF; - locktag := ROW_DATA.locktag; - lockmode := ROW_DATA.lockmode; - block_sessionid := ROW_DATA.block_sessionid; - wait_status := ROW_DATA.wait_status; - RETURN NEXT; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_datanode_active_session - ( in datanode text, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text, - OUT locktag text, - OUT lockmode text, - OUT block_sessionid bigint, - OUT final_block_sessionid bigint, - OUT wait_status text) - RETURNS SETOF record - AS $$ - DECLARE - row_data DBE_PERF.local_active_session%rowtype; - cn_name record; - query_text record; - QUERY_STR text; - query_cn text; - query_str_cn_name text; - BEGIN - QUERY_STR := 'EXECUTE DIRECT ON (' || $1 || ') ''SELECT * FROM DBE_PERF.local_active_session'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := datanode; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - IF ROW_DATA.cn_id IS NULL THEN - unique_query := ROW_DATA.unique_query; - ELSE - query_str_cn_name := 'SELECT node_name FROM pg_catalog.pgxc_node WHERE node_id='||ROW_DATA.cn_id||' AND nodeis_active = true'; - FOR cn_name IN EXECUTE(query_str_cn_name) LOOP - query_cn := 'EXECUTE DIRECT ON (' || cn_name.node_name || ') ''SELECT unique_query FROM DBE_PERF.local_active_session where unique_query_id = '|| ROW_DATA.unique_query_id||' limit 1'''; - FOR query_text IN EXECUTE(query_cn) LOOP - unique_query := query_text.unique_query; - END LOOP; - END LOOP; - END IF; - locktag := ROW_DATA.locktag; - lockmode := ROW_DATA.lockmode; - block_sessionid := ROW_DATA.block_sessionid; - final_block_sessionid := ROW_DATA.final_block_sessionid; - wait_status := ROW_DATA.wait_status; - RETURN NEXT; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_gs_asp - (IN start_ts timestamp without time zone, - IN end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text, - OUT locktag text, - OUT lockmode text, - OUT block_sessionid bigint, - OUT wait_status text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA pg_catalog.gs_asp%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - node_str TEXT; - BEGIN - if (select working_version_num() < 92217) then - raise exception 'function get_global_gs_asp should not be call during upgrade.'; - end if; - QUERY_STR_NODES := 'SELECT NODE_NAME FROM pg_catalog.PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'')'; - node_str := 'SELECT * FROM pg_catalog.gs_asp where sample_time > '''''||$1||''''' and sample_time < '''''||$2||''''; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') '''|| node_str ||''''';'; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := ROW_NAME.NODE_NAME; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - unique_query := ROW_DATA.unique_query; - locktag := ROW_DATA.locktag; - lockmode := ROW_DATA.lockmode; - block_sessionid := ROW_DATA.block_sessionid; - wait_status := ROW_DATA.wait_status; - RETURN NEXT; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - SELECT SESSION_USER INTO user_name; global_query_str := 'GRANT ALL ON TABLE DBE_PERF.locks TO ' || quote_ident(user_name) || ';'; EXECUTE IMMEDIATE global_query_str; @@ -9780,14 +7824,11 @@ BEGIN EXECUTE IMMEDIATE global_query_str; global_query_str := 'GRANT ALL ON TABLE DBE_PERF.local_active_session TO ' || quote_ident(user_name) || ';'; EXECUTE IMMEDIATE global_query_str; - global_query_str := 'GRANT ALL ON TABLE DBE_PERF.global_active_session TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE global_query_str; GRANT SELECT ON DBE_PERF.locks TO public; GRANT SELECT ON DBE_PERF.global_thread_wait_status TO public; GRANT SELECT ON DBE_PERF.thread_wait_status TO public; GRANT SELECT ON DBE_PERF.local_active_session TO public; - GRANT SELECT ON DBE_PERF.global_active_session TO public; end if; END $DO$; @@ -10290,245 +8331,6 @@ CREATE OR REPLACE VIEW pg_catalog.gs_wlm_workload_records AS WHERE P.query_pid = S.threadpid AND S.usesysid = U.oid; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_current_instance_info(text, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name text; - BEGIN - - IF $2 is null THEN - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info()'; - ELSE - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info() limit '||$2; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='||quote_literal($1); - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name in select pg_catalog.regexp_split_to_table(quote_literal($1),',') LOOP - query_str := 'EXECUTE DIRECT ON ('||node_name||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_history_instance_info(text, TIMESTAMP, TIMESTAMP, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name text; - BEGIN - - IF $4 is null THEN - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'||quote_literal($2)||' and timestamp <'||quote_literal($3); - ELSE - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'||quote_literal($2)||' and timestamp <'||quote_literal($3)||' limit '||quote_literal($4); - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='||quote_literal($1); - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name in select pg_catalog.regexp_split_to_table(quote_literal($1),',') LOOP - query_str := 'EXECUTE DIRECT ON ('||node_name||') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.distributed_count(IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - total_num bigint; - flag boolean; - BEGIN - - query_str_nodes := 'SELECT count(1) FROM "' || $1 || '";'; - EXECUTE query_str_nodes INTO total_num; - - --Get the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node, pgxc_class where node_type IN (''C'', ''D'') AND is_oid_in_group_members(oid, nodeoids) AND - pcrelid=' || quote_literal('"'||$1||'"') || '::regclass::oid'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select ''''DN_name'''' as dnname1, count(1) as count1 from "' || $1 || '"'''; - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.dnname1 := CASE - WHEN pg_catalog.LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-pg_catalog.length(row_name.node_name)) - ELSE pg_catalog.SUBSTR(row_name.node_name,1,20) - END; - DNName := row_data.dnname1; - Num := row_data.count1; - IF total_num = 0 THEN - Ratio := 0.000 ||'%'; - ELSE - Ratio := ROUND(row_data.count1/total_num*100,3) || '%'; - END IF; - RETURN next; - END LOOP; - END LOOP; - - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.distributed_count(IN _schema_name text, IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - total_num bigint; - flag boolean; - BEGIN - - query_str_nodes := 'SELECT count(1) FROM "' || $1 || '"."' || $2 || '";'; - EXECUTE query_str_nodes INTO total_num; - - --Get the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node, pgxc_class where node_type IN (''C'', ''D'') AND is_oid_in_group_members(oid, nodeoids) AND - pcrelid=' || quote_literal('"'||$1||'"."' || $2 || '"') || '::regclass::oid'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal('select ''DN_name'' as dnname1, count(1) as count1 from "' || $1 || '"."' || $2 || '"'); - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.dnname1 := CASE - WHEN pg_catalog.LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-pg_catalog.length(row_name.node_name)) - ELSE pg_catalog.SUBSTR(row_name.node_name,1,20) - END; - DNName := row_data.dnname1; - Num := row_data.count1; - IF total_num = 0 THEN - Ratio := 0.000 ||'%'; - ELSE - Ratio := ROUND(row_data.count1/total_num*100,3) || '%'; - END IF; - RETURN next; - END LOOP; - END LOOP; - - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.table_skewness(text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ - BEGIN - RETURN QUERY EXECUTE 'SELECT * FROM pg_catalog.distributed_count(' || quote_literal($1) || ') ORDER BY num DESC, dnname'; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.table_skewness_with_schema(IN _schema_name text,text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ - BEGIN - RETURN QUERY EXECUTE 'SELECT * FROM pg_catalog.distributed_count(' || quote_literal($1) || ',' || quote_literal($2) || ') ORDER BY num DESC, dnname'; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_get_table_distribution( IN table_name TEXT, IN schema_name TEXT) -RETURNS TEXT -AS -$$ -DECLARE -nodename text; -query_str text; -row_data record; -row_data1 record; -nodelist text; -BEGIN - - query_str := 'SELECT oid,node_name FROM pgxc_node WHERE node_type=''D'' order by node_name'; - - FOR row_data IN EXECUTE(query_str) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_data.node_name || ') ' || quote_literal('SELECT count(*) AS num FROM pg_class c LEFT JOIN pg_namespace n ON c.relnamespace = n.oid WHERE relname='||quote_literal(table_name)||' AND n.nspname='||quote_literal(schema_name)); - FOR row_data1 IN EXECUTE(query_str) LOOP - IF row_data1.num = 1 THEN - nodelist := nodelist || ' '|| row_data.oid; - END IF; - END LOOP; - END LOOP; - - RETURN nodelist; -END; -$$ -LANGUAGE plpgsql; - -CREATE OR REPLACE FUNCTION pg_catalog.get_shard_oids_byname(IN node_name varchar) -RETURNS Oid[] AS $$ -declare - node_oid Oid; - nodes Oid[]; - nodenames_query text; - total_num bigint; -BEGIN - nodenames_query := 'SELECT oid FROM pgxc_node WHERE node_name = '||quote_literal($1)||' ORDER BY oid'; - FOR node_oid IN EXECUTE nodenames_query USING node_name LOOP - nodes := array_append(nodes, node_oid); - END LOOP; - RETURN nodes; - -END; $$ -LANGUAGE plpgsql NOT FENCED; - DROP FUNCTION IF EXISTS pg_catalog.pg_cbm_rotate_file(in rotate_lsn text); SET LOCAL inplace_upgrade_next_system_object_oids=IUO_PROC, 4660; CREATE FUNCTION pg_catalog.pg_cbm_rotate_file @@ -10609,214 +8411,6 @@ SELECT FROM pg_user AS S, pg_catalog.pg_total_user_resource_info_oid AS T WHERE S.usesysid = T.userid; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_current_instance_info(text, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name_new text; - node_count int; - BEGIN - - IF $2 is null THEN - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info()'; - ELSE - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info() limit '||$2; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='||quote_literal($1); - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name_new in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - select count(*) from pgxc_node where node_name=quote_literal(node_name_new) into node_count; - IF node_count <> 0 THEN - query_str := 'EXECUTE DIRECT ON ('||node_name_new||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END IF; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_history_instance_info(text, TIMESTAMP, TIMESTAMP, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name_new text; - node_count int; - BEGIN - - IF $4 is null THEN - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'||quote_literal($2)||' and timestamp <'||quote_literal($3); - ELSE - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'||quote_literal($2)||' and timestamp <'||quote_literal($3)||' limit '||quote_literal($4); - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='||quote_literal($1); - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name_new in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - select count(*) from pgxc_node where node_name=quote_literal(node_name_new) into node_count; - IF node_count <> 0 THEN - query_str := 'EXECUTE DIRECT ON ('||node_name_new||') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END IF; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_current_instance_info(text, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name_new text; - node_count int; - node_str text; - query_text text; - BEGIN - - IF $2 is null THEN - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info()'; - ELSE - query_str_temp := 'SELECT * FROM pg_stat_get_wlm_instance_info() limit '||$2; - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='||quote_literal($1); - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name_new in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - node_str := quote_literal(trim(node_name_new)); - query_text := 'select count(*) from pgxc_node where node_name = ' || node_str; - EXECUTE(query_text) into node_count; - IF node_count <> 0 THEN - query_str := 'EXECUTE DIRECT ON ('||node_name_new||') ''' || query_str_temp ||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END IF; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_history_instance_info(text, TIMESTAMP, TIMESTAMP, int default null) -RETURNS setof gs_wlm_instance_history -AS $$ -DECLARE - row_data gs_wlm_instance_history%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_temp text; - node_name_new text; - node_count int; - node_str text; - query_text text; - BEGIN - - IF $4 is null THEN - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'||quote_literal($2)||' and timestamp <'||quote_literal($3); - ELSE - query_str_temp := 'SELECT * FROM gs_wlm_instance_history where timestamp >'||quote_literal($2)||' and timestamp <'||quote_literal($3)||' limit '||quote_literal($4); - END IF; - - IF $1 IN ('C','D') THEN - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type='||quote_literal($1); - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSIF $1 ='ALL' THEN - query_str_nodes := 'SELECT distinct node_name FROM pgxc_node'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - ELSE - FOR node_name_new in select pg_catalog.regexp_split_to_table('' || $1 || '',',') LOOP - node_str := quote_literal(trim(node_name_new)); - query_text := 'select count(*) from pgxc_node where node_name = ' || node_str; - EXECUTE(query_text) into node_count; - IF node_count <> 0 THEN - query_str := 'EXECUTE DIRECT ON ('||node_name_new||') ' || quote_literal(query_str_temp) ||';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END IF; - END LOOP; - END IF; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - DO $DO$ DECLARE ans boolean; @@ -11230,7 +8824,7 @@ CREATE OR REPLACE VIEW pg_catalog.pg_indexes AS JOIN pg_class I ON (I.oid = X.indexrelid) LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) LEFT JOIN pg_tablespace T ON (T.oid = I.reltablespace) - WHERE C.relkind = 'r' AND I.relkind IN ('i','I'); + WHERE C.relkind IN ('r','m') AND I.relkind IN ('i','I'); DROP TABLE IF EXISTS snapshot.snap_global_operator_runtime; DROP TABLE IF EXISTS snapshot.snap_global_operator_history; @@ -11411,177 +9005,6 @@ END$$; SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 0; -CREATE OR REPLACE FUNCTION pg_catalog.get_local_cont_query_stats() -RETURNS TABLE ( - cq oid, - w_in_rows int8, - w_in_bytes int8, - w_out_rows int8, - w_out_bytes int8, - w_pendings int8, - w_errors int8, - r_in_rows int8, - r_in_bytes int8, - r_out_rows int8, - r_out_bytes int8, - r_errors int8, - c_in_rows int8, - c_in_bytes int8, - c_out_rows int8, - c_out_bytes int8, - c_pendings int8, - c_errors int8 -) -AS $$ -DECLARE - query_cq_ids text; - cq_ids record; - query_stats text; - stats record; -BEGIN - query_cq_ids := 'SELECT id FROM streaming_cont_query'; - FOR cq_ids IN EXECUTE(query_cq_ids) LOOP - query_stats := 'SELECT * FROM pg_catalog.get_local_cont_query_stat(' || cq_ids.id || ')'; - FOR stats IN EXECUTE(query_stats) LOOP - cq = stats.cq; - w_in_rows = stats.w_in_rows; - w_in_bytes = stats.w_in_bytes; - w_out_rows = stats.w_out_rows; - w_out_bytes = stats.w_out_bytes; - w_pendings = stats.w_pendings; - w_errors = stats.w_errors; - r_in_rows = stats.r_in_rows; - r_in_bytes = stats.r_in_bytes; - r_out_rows = stats.r_out_rows; - r_out_bytes = stats.r_out_bytes; - r_errors = stats.r_errors; - c_in_rows = stats.c_in_rows; - c_in_bytes = stats.c_in_bytes; - c_out_rows = stats.c_out_rows; - c_out_bytes = stats.c_out_bytes; - c_pendings = stats.c_pendings; - c_errors = stats.c_errors; - return NEXT; - END LOOP; - END LOOP; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.get_cont_query_stats() -RETURNS TABLE ( - node name, - cq oid, - w_in_rows int8, - w_in_bytes int8, - w_out_rows int8, - w_out_bytes int8, - w_pendings int8, - w_errors int8, - r_in_rows int8, - r_in_bytes int8, - r_out_rows int8, - r_out_bytes int8, - r_errors int8, - c_in_rows int8, - c_in_bytes int8, - c_out_rows int8, - c_out_bytes int8, - c_pendings int8, - c_errors int8 -) -AS $$ -DECLARE - query_nodes text; - nodes record; - query_stats text; - stats record; -BEGIN - query_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR nodes IN EXECUTE(query_nodes) LOOP - query_stats := 'EXECUTE DIRECT ON (' || nodes.node_name || ') ''SELECT * FROM pg_catalog.get_local_cont_query_stats()'''; - FOR stats IN EXECUTE(query_stats) LOOP - node = nodes.node_name; - cq = stats.cq; - w_in_rows = stats.w_in_rows; - w_in_bytes = stats.w_in_bytes; - w_out_rows = stats.w_out_rows; - w_out_bytes = stats.w_out_bytes; - w_pendings = stats.w_pendings; - w_errors = stats.w_errors; - r_in_rows = stats.r_in_rows; - r_in_bytes = stats.r_in_bytes; - r_out_rows = stats.r_out_rows; - r_out_bytes = stats.r_out_bytes; - r_errors = stats.r_errors; - c_in_rows = stats.c_in_rows; - c_in_bytes = stats.c_in_bytes; - c_out_rows = stats.c_out_rows; - c_out_bytes = stats.c_out_bytes; - c_pendings = stats.c_pendings; - c_errors = stats.c_errors; - return NEXT; - END LOOP; - END LOOP; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -DO $$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select * from pg_extension where extname = 'streaming' limit 1) into ans; - if ans = true then - CREATE OR REPLACE VIEW pg_catalog.cont_query_stats - AS - SELECT cq, - SUM(w_in_rows) AS w_in_rows, - SUM(w_in_bytes) AS w_in_bytes, - SUM(w_out_rows) AS w_out_rows, - SUM(w_out_bytes) AS w_out_bytes, - SUM(w_pendings) AS w_pendings, - SUM(w_errors) AS w_errors, - SUM(r_in_rows) AS r_in_rows, - SUM(r_in_bytes) AS r_in_bytes, - SUM(r_out_rows) AS r_out_rows, - SUM(r_out_bytes) AS r_out_bytes, - SUM(r_errors) AS r_errors, - SUM(c_in_rows) AS c_in_rows, - SUM(c_in_bytes) AS c_in_bytes, - SUM(c_out_rows) AS c_out_rows, - SUM(c_out_bytes) AS c_out_bytes, - SUM(c_pendings) AS c_pendings, - SUM(c_errors) AS c_errors - FROM pg_catalog.get_cont_query_stats() - GROUP BY cq; - - CREATE OR REPLACE VIEW pg_catalog.stream_stats - AS - SELECT s.streamrelid AS "stream", - SUM(w_in_rows) AS w_in_rows, - SUM(w_in_bytes) AS w_in_bytes, - SUM(w_out_rows) AS w_out_rows, - SUM(w_out_bytes) AS w_out_bytes, - SUM(w_pendings) AS w_pendings, - SUM(w_errors) AS w_errors, - SUM(r_in_rows) AS r_in_rows, - SUM(r_in_bytes) AS r_in_bytes, - SUM(r_out_rows) AS r_out_rows, - SUM(r_out_bytes) AS r_out_bytes, - SUM(r_errors) AS r_errors, - SUM(c_in_rows) AS c_in_rows, - SUM(c_in_bytes) AS c_in_bytes, - SUM(c_out_rows) AS c_out_rows, - SUM(c_out_bytes) AS c_out_bytes, - SUM(c_pendings) AS c_pendings, - SUM(c_errors) AS c_errors - FROM pg_catalog.cont_query_stats c, pg_catalog.streaming_cont_query s - WHERE s.id = c.cq - GROUP BY "stream"; - end if; -END$$; - DO $$ DECLARE ans boolean; @@ -11604,72 +9027,6 @@ BEGIN end if; END$$; -CREATE OR REPLACE FUNCTION pg_catalog.reset_local_cont_query_stats(cq_id oid) -RETURNS bool -AS $$ -DECLARE - query_cq_ids text; - cq_ids record; - query_stats text; -BEGIN - query_cq_ids := 'SELECT id FROM streaming_cont_query WHERE streamrelid = (SELECT streamrelid FROM streaming_cont_query WHERE id = ' || cq_id || ')'; - FOR cq_ids IN EXECUTE(query_cq_ids) LOOP - query_stats := 'SELECT pg_catalog.reset_local_cont_query_stat(' || cq_ids.id || ')'; - EXECUTE(query_stats); - END LOOP; - return true; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.reset_cont_query_stats(stream_id oid) -RETURNS bool -AS $$ -DECLARE - query_cq_ids text; - cq_ids record; - query_nodes text; - nodes record; - query_stats text; -BEGIN - query_cq_ids := 'SELECT id FROM streaming_cont_query WHERE streamrelid = ' || stream_id || 'LIMIT 1'; - FOR cq_ids IN EXECUTE(query_cq_ids) LOOP - query_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR nodes IN EXECUTE(query_nodes) LOOP - query_stats := 'EXECUTE DIRECT ON (' || nodes.node_name || ') ''SELECT * FROM pg_catalog.reset_local_cont_query_stats(' || cq_ids.id || ')'''; - EXECUTE(query_stats); - END LOOP; - END LOOP; - return true; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.reset_cont_query_stats() -RETURNS bool -AS $$ -DECLARE - query_streams text; - streams record; - query_cq_ids text; - cq_ids record; - query_nodes text; - nodes record; - query_stats text; -BEGIN - query_streams := 'SELECT DISTINCT streamrelid FROM streaming_cont_query'; - FOR streams IN EXECUTE(query_streams) LOOP - query_cq_ids := 'SELECT id FROM streaming_cont_query WHERE streamrelid = ' || streams.streamrelid || 'LIMIT 1'; - FOR cq_ids IN EXECUTE(query_cq_ids) LOOP - query_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; - FOR nodes IN EXECUTE(query_nodes) LOOP - query_stats := 'EXECUTE DIRECT ON (' || nodes.node_name || ') ''SELECT * FROM pg_catalog.reset_local_cont_query_stats(' || cq_ids.id || ')'''; - EXECUTE(query_stats); - END LOOP; - END LOOP; - END LOOP; - return true; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - CREATE OR REPLACE FUNCTION pg_catalog.check_cont_query_schema_changed(cq_id oid) RETURNS bool AS $$ @@ -11832,84 +9189,20 @@ BEGIN DROP VIEW IF EXISTS DBE_PERF.local_plancache_status CASCADE; DROP VIEW IF EXISTS DBE_PERF.global_plancache_status CASCADE; DROP VIEW IF EXISTS DBE_PERF.local_prepare_statement_status CASCADE; - DROP FUNCTION IF EXISTS DBE_PERF.global_prepare_statement_status() CASCADE; - DROP VIEW IF EXISTS DBE_PERF.global_prepare_statement_status CASCADE; DROP FUNCTION IF EXISTS DBE_PERF.global_plancache_clean() CASCADE; DROP VIEW IF EXISTS DBE_PERF.local_plancache_clean CASCADE; CREATE VIEW DBE_PERF.local_plancache_status AS SELECT * FROM pg_catalog.plancache_status(); - CREATE OR REPLACE FUNCTION DBE_PERF.global_plancache_status() - RETURNS SETOF DBE_PERF.local_plancache_status - AS $$ - DECLARE - ROW_DATA DBE_PERF.local_plancache_status%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'') and nodeis_active=true'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.local_plancache_status'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE VIEW DBE_PERF.global_plancache_status AS - SELECT * FROM DBE_PERF.global_plancache_status(); - CREATE VIEW DBE_PERF.local_prepare_statement_status AS SELECT * FROM pg_catalog.prepare_statement_status(); - CREATE OR REPLACE FUNCTION DBE_PERF.global_prepare_statement_status() - RETURNS SETOF DBE_PERF.local_prepare_statement_status - AS $$ - DECLARE - ROW_DATA DBE_PERF.local_prepare_statement_status%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'') and nodeis_active=true'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * FROM DBE_PERF.local_prepare_statement_status'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE VIEW DBE_PERF.global_prepare_statement_status AS - SELECT * FROM DBE_PERF.global_prepare_statement_status(); - CREATE VIEW DBE_PERF.local_plancache_clean AS SELECT * FROM pg_catalog.plancache_clean(); - CREATE OR REPLACE FUNCTION DBE_PERF.global_plancache_clean() - RETURNS BOOLEAN - AS $$ - DECLARE - ROW_DATA record; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'') and nodeis_active=true'; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') ''SELECT * from DBE_PERF.local_plancache_clean'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - END LOOP; - END LOOP; - RETURN TRUE; - END; $$ - LANGUAGE 'plpgsql'; + CREATE VIEW DBE_PERF.global_plancache_clean AS + SELECT * FROM pg_catalog.plancache_clean(); end if; END$DO$; @@ -12042,75 +9335,75 @@ BEGIN select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; if ans = true then CREATE OR REPLACE FUNCTION DBE_PERF.get_global_full_sql_by_timestamp - (in start_timestamp timestamp with time zone, - in end_timestamp timestamp with time zone, - OUT node_name name, - OUT db_name name, - OUT schema_name name, - OUT origin_node integer, - OUT user_name name, - OUT application_name text, - OUT client_addr text, - OUT client_port integer, - OUT unique_query_id bigint, - OUT debug_query_id bigint, - OUT query text, - OUT start_time timestamp with time zone, - OUT finish_time timestamp with time zone, - OUT slow_sql_threshold bigint, - OUT transaction_id bigint, - OUT thread_id bigint, - OUT session_id bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT query_plan text, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - OUT net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text, - OUT lock_count bigint, - OUT lock_time bigint, - OUT lock_wait_count bigint, - OUT lock_wait_time bigint, - OUT lock_max_count bigint, - OUT lwlock_count bigint, - OUT lwlock_wait_count bigint, - OUT lwlock_time bigint, - OUT lwlock_wait_time bigint, - OUT details text) - RETURNS setof record - AS $$ - DECLARE - row_data pg_catalog.statement_history%rowtype; - query_str text; - -- node name - node_names name[]; - each_node_name name; - BEGIN - -- Get all node names(CN + master DN) - node_names := ARRAY(SELECT pgxc_node.node_name FROM pgxc_node WHERE (node_type = 'C' or node_type = 'D') AND nodeis_active = true); - FOREACH each_node_name IN ARRAY node_names - LOOP - query_str := 'EXECUTE DIRECT ON (' || each_node_name || ') ''SELECT * FROM DBE_PERF.statement_history where start_time >= ''''' ||$1|| ''''' and start_time <= ''''' || $2 || ''''''''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := each_node_name; + (in start_timestamp timestamp with time zone, + in end_timestamp timestamp with time zone, + OUT node_name name, + OUT db_name name, + OUT schema_name name, + OUT origin_node integer, + OUT user_name name, + OUT application_name text, + OUT client_addr text, + OUT client_port integer, + OUT unique_query_id bigint, + OUT debug_query_id bigint, + OUT query text, + OUT start_time timestamp with time zone, + OUT finish_time timestamp with time zone, + OUT slow_sql_threshold bigint, + OUT transaction_id bigint, + OUT thread_id bigint, + OUT session_id bigint, + OUT n_soft_parse bigint, + OUT n_hard_parse bigint, + OUT query_plan text, + OUT n_returned_rows bigint, + OUT n_tuples_fetched bigint, + OUT n_tuples_returned bigint, + OUT n_tuples_inserted bigint, + OUT n_tuples_updated bigint, + OUT n_tuples_deleted bigint, + OUT n_blocks_fetched bigint, + OUT n_blocks_hit bigint, + OUT db_time bigint, + OUT cpu_time bigint, + OUT execution_time bigint, + OUT parse_time bigint, + OUT plan_time bigint, + OUT rewrite_time bigint, + OUT pl_execution_time bigint, + OUT pl_compilation_time bigint, + OUT data_io_time bigint, + OUT net_send_info text, + OUT net_recv_info text, + OUT net_stream_send_info text, + OUT net_stream_recv_info text, + OUT lock_count bigint, + OUT lock_time bigint, + OUT lock_wait_count bigint, + OUT lock_wait_time bigint, + OUT lock_max_count bigint, + OUT lwlock_count bigint, + OUT lwlock_wait_count bigint, + OUT lwlock_time bigint, + OUT lwlock_wait_time bigint, + OUT details bytea, + OUT is_slow_sql bool) + RETURNS setof record + AS $$ + DECLARE + row_data pg_catalog.statement_history%rowtype; + row_name record; + query_str text; + -- node name + query_str_nodes text; + BEGIN + -- Get all node names(CN + master DN) + query_str_nodes := 'select * from dbe_perf.node_name'; + FOR row_name IN EXECUTE(query_str_nodes) LOOP + query_str := 'SELECT * FROM DBE_PERF.statement_history where start_time >= ''' ||$1|| ''' and start_time <= ''' || $2 || ''''; + FOR row_data IN EXECUTE(query_str) LOOP + node_name := row_name.node_name; db_name := row_data.db_name; schema_name := row_data.schema_name; origin_node := row_data.origin_node; @@ -12161,84 +9454,84 @@ BEGIN lwlock_time := row_data.lwlock_time; lwlock_wait_time := row_data.lwlock_wait_time; details := row_data.details; + is_slow_sql := row_data.is_slow_sql; return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; + END LOOP; + END LOOP; + return; + END; $$ + LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE FUNCTION DBE_PERF.get_global_slow_sql_by_timestamp - (in start_timestamp timestamp with time zone, - in end_timestamp timestamp with time zone, - OUT node_name name, - OUT db_name name, - OUT schema_name name, - OUT origin_node integer, - OUT user_name name, - OUT application_name text, - OUT client_addr text, - OUT client_port integer, - OUT unique_query_id bigint, - OUT debug_query_id bigint, - OUT query text, - OUT start_time timestamp with time zone, - OUT finish_time timestamp with time zone, - OUT slow_sql_threshold bigint, - OUT transaction_id bigint, - OUT thread_id bigint, - OUT session_id bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT query_plan text, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - OUT net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text, - OUT lock_count bigint, - OUT lock_time bigint, - OUT lock_wait_count bigint, - OUT lock_wait_time bigint, - OUT lock_max_count bigint, - OUT lwlock_count bigint, - OUT lwlock_wait_count bigint, - OUT lwlock_time bigint, - OUT lwlock_wait_time bigint, - OUT details text) - RETURNS setof record - AS $$ - DECLARE - row_data pg_catalog.statement_history%rowtype; - row_name record; - query_str text; - -- node name - node_names name[]; - each_node_name name; - BEGIN - -- Get all node names(CN + master DN) - node_names := ARRAY(SELECT pgxc_node.node_name FROM pgxc_node WHERE (node_type = 'C' or node_type = 'D') AND nodeis_active = true); - FOREACH each_node_name IN ARRAY node_names - LOOP - query_str := 'EXECUTE DIRECT ON (' || each_node_name || ') ''SELECT * FROM DBE_PERF.statement_history where start_time >= ''''' ||$1|| ''''' and start_time <= ''''' || $2 || ''''' and (extract(epoch from (finish_time - start_time)) * 1000000) >= slow_sql_threshold '''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := each_node_name; + (in start_timestamp timestamp with time zone, + in end_timestamp timestamp with time zone, + OUT node_name name, + OUT db_name name, + OUT schema_name name, + OUT origin_node integer, + OUT user_name name, + OUT application_name text, + OUT client_addr text, + OUT client_port integer, + OUT unique_query_id bigint, + OUT debug_query_id bigint, + OUT query text, + OUT start_time timestamp with time zone, + OUT finish_time timestamp with time zone, + OUT slow_sql_threshold bigint, + OUT transaction_id bigint, + OUT thread_id bigint, + OUT session_id bigint, + OUT n_soft_parse bigint, + OUT n_hard_parse bigint, + OUT query_plan text, + OUT n_returned_rows bigint, + OUT n_tuples_fetched bigint, + OUT n_tuples_returned bigint, + OUT n_tuples_inserted bigint, + OUT n_tuples_updated bigint, + OUT n_tuples_deleted bigint, + OUT n_blocks_fetched bigint, + OUT n_blocks_hit bigint, + OUT db_time bigint, + OUT cpu_time bigint, + OUT execution_time bigint, + OUT parse_time bigint, + OUT plan_time bigint, + OUT rewrite_time bigint, + OUT pl_execution_time bigint, + OUT pl_compilation_time bigint, + OUT data_io_time bigint, + OUT net_send_info text, + OUT net_recv_info text, + OUT net_stream_send_info text, + OUT net_stream_recv_info text, + OUT lock_count bigint, + OUT lock_time bigint, + OUT lock_wait_count bigint, + OUT lock_wait_time bigint, + OUT lock_max_count bigint, + OUT lwlock_count bigint, + OUT lwlock_wait_count bigint, + OUT lwlock_time bigint, + OUT lwlock_wait_time bigint, + OUT details bytea, + OUT is_slow_sql bool) + RETURNS setof record + AS $$ + DECLARE + row_data pg_catalog.statement_history%rowtype; + row_name record; + query_str text; + -- node name + query_str_nodes text; + BEGIN + -- Get all node names(CN + master DN) + query_str_nodes := 'select * from dbe_perf.node_name'; + FOR row_name IN EXECUTE(query_str_nodes) LOOP + query_str := 'SELECT * FROM DBE_PERF.statement_history where start_time >= ''' ||$1|| ''' and start_time <= ''' || $2 || ''' and is_slow_sql = true '; + FOR row_data IN EXECUTE(query_str) LOOP + node_name := row_name.node_name; db_name := row_data.db_name; schema_name := row_data.schema_name; origin_node := row_data.origin_node; @@ -12289,12 +9582,13 @@ BEGIN lwlock_time := row_data.lwlock_time; lwlock_wait_time := row_data.lwlock_wait_time; details := row_data.details; + is_slow_sql := row_data.is_slow_sql; return next; - END LOOP; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; + END LOOP; + END LOOP; + return; + END; $$ + LANGUAGE 'plpgsql' NOT FENCED; end if; END$DO$; @@ -12405,19 +9699,19 @@ BEGIN CREATE VIEW DBE_PERF.statement AS SELECT * FROM get_instr_unique_sql(); - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statement() - RETURNS setof DBE_PERF.statement + CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statement() + RETURNS setof dbe_perf.statement AS $$ DECLARE - row_data DBE_PERF.statement%rowtype; + row_data dbe_perf.statement%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement'''; + query_str := 'SELECT * FROM dbe_perf.statement'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -12500,19 +9794,19 @@ BEGIN CREATE VIEW DBE_PERF.wait_events AS SELECT * FROM get_instr_wait_event(NULL); - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_wait_events() - RETURNS setof DBE_PERF.wait_events + CREATE OR REPLACE FUNCTION dbe_perf.get_global_wait_events() + RETURNS setof dbe_perf.wait_events AS $$ DECLARE - row_data DBE_PERF.wait_events%rowtype; + row_data dbe_perf.wait_events%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type IN (''C'', ''D'') AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.wait_events'''; + query_str := 'SELECT * FROM dbe_perf.wait_events'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -12723,19 +10017,19 @@ BEGIN CREATE VIEW DBE_PERF.statement AS SELECT * FROM get_instr_unique_sql(); - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statement() - RETURNS setof DBE_PERF.statement + CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statement() + RETURNS setof dbe_perf.statement AS $$ DECLARE - row_data DBE_PERF.statement%rowtype; + row_data dbe_perf.statement%rowtype; row_name record; query_str text; query_str_nodes text; BEGIN --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type = ''C'' AND nodeis_active = true'; + query_str_nodes := 'select * from dbe_perf.node_name'; FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM DBE_PERF.statement'''; + query_str := 'SELECT * FROM dbe_perf.statement'; FOR row_data IN EXECUTE(query_str) LOOP return next row_data; END LOOP; @@ -13057,3062 +10351,6 @@ GRANT SELECT ON information_schema.role_table_grants TO PUBLIC; RESET search_path; -DO $DO$ -DECLARE - ans boolean; - user_name text; - global_query_str text; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_os_runtime - (OUT node_name name, OUT id integer, OUT name text, OUT value numeric, OUT comments text, OUT cumulative boolean) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.os_runtime'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - id := row_data.id; - name := row_data.name; - value := row_data.value; - comments := row_data.comments; - cumulative := row_data.cumulative; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_os_threads() - RETURNS setof DBE_PERF.os_threads - AS $$ - DECLARE - row_data DBE_PERF.os_threads%rowtype; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT * FROM DBE_PERF.os_threads'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_instance_time - (OUT node_name name, OUT stat_id integer, OUT stat_name text, OUT value bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all CN DN node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.instance_time'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - stat_id := row_data.stat_id; - stat_name := row_data.stat_name; - value := row_data.value; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_workload_sql_count - (OUT node_name name, OUT workload name, OUT select_count bigint, - OUT update_count bigint, OUT insert_count bigint, OUT delete_count bigint, - OUT ddl_count bigint, OUT dml_count bigint, OUT dcl_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all cn node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.workload_sql_count'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - workload := row_data.workload; - select_count := row_data.select_count; - update_count := row_data.update_count; - insert_count := row_data.insert_count; - delete_count := row_data.delete_count; - ddl_count := row_data.ddl_count; - dml_count := row_data.dml_count; - dcl_count := row_data.dcl_count; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_workload_sql_elapse_time - (OUT node_name name, OUT workload name, - OUT total_select_elapse bigint, OUT max_select_elapse bigint, OUT min_select_elapse bigint, OUT avg_select_elapse bigint, - OUT total_update_elapse bigint, OUT max_update_elapse bigint, OUT min_update_elapse bigint, OUT avg_update_elapse bigint, - OUT total_insert_elapse bigint, OUT max_insert_elapse bigint, OUT min_insert_elapse bigint, OUT avg_insert_elapse bigint, - OUT total_delete_elapse bigint, OUT max_delete_elapse bigint, OUT min_delete_elapse bigint, OUT avg_delete_elapse bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all cn node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.workload_sql_elapse_time'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - workload := row_data.workload; - total_select_elapse := row_data.total_select_elapse; - max_select_elapse := row_data.max_select_elapse; - min_select_elapse := row_data.min_select_elapse; - avg_select_elapse := row_data.avg_select_elapse; - total_update_elapse := row_data.total_update_elapse; - max_update_elapse := row_data.max_update_elapse; - min_update_elapse := row_data.min_update_elapse; - avg_update_elapse := row_data.avg_update_elapse; - total_insert_elapse := row_data.total_insert_elapse; - max_insert_elapse := row_data.max_insert_elapse; - min_insert_elapse := row_data.min_insert_elapse; - avg_insert_elapse := row_data.avg_insert_elapse; - total_delete_elapse := row_data.total_delete_elapse; - max_delete_elapse := row_data.max_delete_elapse; - min_delete_elapse := row_data.min_delete_elapse; - avg_delete_elapse := row_data.avg_delete_elapse; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_user_transaction - (OUT node_name name, OUT usename name, OUT commit_counter bigint, - OUT rollback_counter bigint, OUT resp_min bigint, OUT resp_max bigint, - OUT resp_avg bigint, OUT resp_total bigint, OUT bg_commit_counter bigint, - OUT bg_rollback_counter bigint, OUT bg_resp_min bigint, OUT bg_resp_max bigint, - OUT bg_resp_avg bigint, OUT bg_resp_total bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all cn node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.user_transaction'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - usename := row_data.usename; - commit_counter := row_data.commit_counter; - rollback_counter := row_data.rollback_counter; - resp_min := row_data.resp_min; - resp_max := row_data.resp_max; - resp_avg := row_data.resp_avg; - resp_total := row_data.resp_total; - bg_commit_counter := row_data.bg_commit_counter; - bg_rollback_counter := row_data.bg_rollback_counter; - bg_resp_min := row_data.bg_resp_min; - bg_resp_max := row_data.bg_resp_max; - bg_resp_avg := row_data.bg_resp_avg; - bg_resp_total := row_data.bg_resp_total; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_workload_transaction - (OUT node_name name, OUT workload name, OUT commit_counter bigint, - OUT rollback_counter bigint, OUT resp_min bigint, OUT resp_max bigint, - OUT resp_avg bigint, OUT resp_total bigint, OUT bg_commit_counter bigint, - OUT bg_rollback_counter bigint, OUT bg_resp_min bigint, OUT bg_resp_max bigint, - OUT bg_resp_avg bigint, OUT bg_resp_total bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all cn node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.workload_transaction'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - workload := row_data.workload; - commit_counter := row_data.commit_counter; - rollback_counter := row_data.rollback_counter; - resp_min := row_data.resp_min; - resp_max := row_data.resp_max; - resp_avg := row_data.resp_avg; - resp_total := row_data.resp_total; - bg_commit_counter := row_data.bg_commit_counter; - bg_rollback_counter := row_data.bg_rollback_counter; - bg_resp_min := row_data.bg_resp_min; - bg_resp_max := row_data.bg_resp_max; - bg_resp_avg := row_data.bg_resp_avg; - bg_resp_total := row_data.bg_resp_total; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_stat - (OUT node_name name, OUT sessid text, OUT statid integer, OUT statname text, OUT statunit text, OUT value bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.session_stat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - sessid := row_data.sessid; - statid := row_data.statid; - statname := row_data.statname; - statunit := row_data.statunit; - value := row_data.value; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_time - (OUT node_name name, OUT sessid text, OUT stat_id integer, OUT stat_name text, OUT value bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.session_time'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - sessid := row_data.sessid; - stat_id := row_data.stat_id; - stat_name := row_data.stat_name; - value := row_data.value; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_memory - (OUT node_name name, OUT sessid text, OUT init_mem integer, OUT used_mem integer, OUT peak_mem integer) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.session_memory'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - sessid := row_data.sessid; - init_mem := row_data.init_mem; - used_mem := row_data.used_mem; - peak_mem := row_data.peak_mem; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_memory_detail - (OUT node_name name, OUT sessid text, OUT sesstype text, OUT contextname text, OUT level smallint, - OUT parent text, OUT totalsize bigint, OUT freesize bigint, OUT usedsize bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.session_memory_detail'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - sessid := row_data.sessid; - sesstype := row_data.sesstype; - contextname := row_data.contextname; - level := row_data.level; - parent := row_data.parent; - totalsize := row_data.totalsize; - freesize := row_data.freesize; - usedsize := row_data.usedsize; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_thread_wait_status() - RETURNS setof DBE_PERF.thread_wait_status - AS $$ - DECLARE - row_data DBE_PERF.thread_wait_status%rowtype; - query_str text; - BEGIN - --Get all cn dn node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT * FROM DBE_PERF.thread_wait_status'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_wlm_workload_runtime() - RETURNS setof DBE_PERF.wlm_workload_runtime - AS $$ - DECLARE - row_data DBE_PERF.wlm_workload_runtime%rowtype; - query_str text; - BEGIN - --Get all coordinator node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.wlm_workload_runtime'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_ec_history() - RETURNS setof DBE_PERF.operator_ec_history - AS $$ - DECLARE - row_data DBE_PERF.operator_ec_history%rowtype; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.operator_ec_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_ec_history_table() - RETURNS setof DBE_PERF.operator_ec_history_table - AS $$ - DECLARE - row_data DBE_PERF.operator_ec_history_table%rowtype; - query_str text; - BEGIN - --Get all the CN node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.operator_ec_history_table'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_history_table() - RETURNS setof DBE_PERF.operator_history_table - AS $$ - DECLARE - row_data DBE_PERF.operator_history_table%rowtype; - query_str text; - BEGIN - --Get all the CN node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.operator_history_table '''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_history() - RETURNS setof DBE_PERF.operator_history - AS $$ - DECLARE - row_data DBE_PERF.operator_history%rowtype; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.operator_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_runtime() - RETURNS setof DBE_PERF.operator_runtime - AS $$ - DECLARE - row_data DBE_PERF.operator_runtime%rowtype; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.operator_runtime'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_complex_history() - RETURNS setof DBE_PERF.statement_complex_history - AS $$ - DECLARE - row_data DBE_PERF.statement_complex_history%rowtype; - query_str text; - BEGIN - --Get all cn node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.statement_complex_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_complex_history_table() - RETURNS setof DBE_PERF.statement_complex_history_table - AS $$ - DECLARE - row_data DBE_PERF.statement_complex_history_table%rowtype; - query_str text; - BEGIN - --Get all cn node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.statement_complex_history_table'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_complex_runtime() - RETURNS setof DBE_PERF.statement_complex_runtime - AS $$ - DECLARE - row_data DBE_PERF.statement_complex_runtime%rowtype; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.statement_complex_runtime'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_memory_node_detail() - RETURNS setof DBE_PERF.memory_node_detail - AS $$ - DECLARE - row_data DBE_PERF.memory_node_detail%rowtype; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT * FROM DBE_PERF.memory_node_detail'''; - FOR row_data IN EXECUTE(query_str) LOOP - RETURN NEXT row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_shared_memory_detail - (OUT node_name name, OUT contextname text, OUT level smallint, OUT parent text, - OUT totalsize bigint, OUT freesize bigint, OUT usedsize bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.shared_memory_detail'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - contextname := row_data.contextname; - level := row_data.level; - parent := row_data.parent; - totalsize := row_data.totalsize; - freesize := row_data.freesize; - usedsize := row_data.usedsize; - RETURN NEXT; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_comm_delay() - RETURNS setof DBE_PERF.comm_delay - AS $$ - DECLARE - row_data DBE_PERF.comm_delay%rowtype; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON DATANODES ''SELECT * FROM DBE_PERF.comm_delay'''; - FOR row_data IN EXECUTE(query_str) LOOP - RETURN NEXT row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_all_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.statio_all_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_all_indexes - (OUT schemaname name, OUT toastrelschemaname name, OUT toastrelname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_blks_read AS idx_blks_read, - T.idx_blks_hit AS idx_blks_hit - FROM DBE_PERF.statio_all_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_all_sequences - (OUT node_name name, OUT relid oid, OUT schemaname name, - OUT relname name, OUT blks_read bigint, OUT blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.statio_all_sequences'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - blks_read := row_data.blks_read; - blks_hit := row_data.blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint, - OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, - OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.statio_all_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_all_tables - (OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT heap_blks_read bigint, - OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, - OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - C.relname AS relname, - C.schemaname AS schemaname, - O.relname AS toastrelname, - N.nspname AS toastrelschemaname, - C.heap_blks_read AS heap_blks_read, - C.heap_blks_hit AS heap_blks_hit, - C.idx_blks_read AS idx_blks_read, - C.idx_blks_hit AS idx_blks_hit, - C.toast_blks_read AS toast_blks_read, - C.toast_blks_hit AS toast_blks_hit, - C.tidx_blks_read AS tidx_blks_read, - C.tidx_blks_hit AS tidx_blks_hit - FROM DBE_PERF.statio_all_tables C - LEFT JOIN pg_class O ON C.relid = O.reltoastrelid - LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_sys_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.statio_sys_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_sys_indexes - (OUT schemaname name, OUT toastrelschemaname name, OUT toastrelname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_blks_read AS idx_blks_read, - T.idx_blks_hit AS idx_blks_hit - FROM DBE_PERF.statio_sys_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_sys_sequences - (OUT node_name name, OUT relid oid, OUT schemaname name, - OUT relname name, OUT blks_read bigint, OUT blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.statio_sys_sequences'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - blks_read := row_data.blks_read; - blks_hit := row_data.blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_sys_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint, - OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, - OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.statio_sys_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_sys_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT heap_blks_read bigint, OUT heap_blks_hit bigint, - OUT idx_blks_read bigint, OUT idx_blks_hit bigint, - OUT toast_blks_read bigint, OUT toast_blks_hit bigint, - OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - C.schemaname AS schemaname, - C.relname AS relname, - O.relname AS toastrelname, - N.nspname AS toastrelschemaname, - C.heap_blks_read AS heap_blks_read, - C.heap_blks_hit AS heap_blks_hit, - C.idx_blks_read AS idx_blks_read, - C.idx_blks_hit AS idx_blks_hit, - C.toast_blks_read AS toast_blks_read, - C.toast_blks_hit AS toast_blks_hit, - C.tidx_blks_read AS tidx_blks_read, - C.tidx_blks_hit AS tidx_blks_hit - FROM DBE_PERF.statio_sys_tables C - LEFT JOIN pg_class O ON C.relid = O.reltoastrelid - LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_user_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.statio_user_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_user_indexes - (OUT schemaname name, OUT toastrelschemaname name, OUT toastrelname name, - OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_blks_read AS idx_blks_read, - T.idx_blks_hit AS idx_blks_hit - FROM DBE_PERF.statio_user_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_user_sequences - (OUT node_name name, OUT relid oid, OUT schemaname name, - OUT relname name, OUT blks_read bigint, OUT blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.statio_user_sequences'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - blks_read := row_data.blks_read; - blks_hit := row_data.blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statio_user_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint, - OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint, - OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.statio_user_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statio_user_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT heap_blks_read bigint, OUT heap_blks_hit bigint, - OUT idx_blks_read bigint, OUT idx_blks_hit bigint, - OUT toast_blks_read bigint, OUT toast_blks_hit bigint, - OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - C.schemaname AS schemaname, - C.relname AS relname, - O.relname AS toastrelname, - N.nspname AS toastrelschemaname, - C.heap_blks_read AS heap_blks_read, - C.heap_blks_hit AS heap_blks_hit, - C.idx_blks_read AS idx_blks_read, - C.idx_blks_hit AS idx_blks_hit, - C.toast_blks_read AS toast_blks_read, - C.toast_blks_hit AS toast_blks_hit, - C.tidx_blks_read AS tidx_blks_read, - C.tidx_blks_hit AS tidx_blks_hit - FROM DBE_PERF.statio_user_tables C - LEFT JOIN pg_class O ON C.relid = O.reltoastrelid - LEFT JOIN pg_namespace N ON O.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - heap_blks_read := row_data.heap_blks_read; - heap_blks_hit := row_data.heap_blks_hit; - idx_blks_read := row_data.idx_blks_read; - idx_blks_hit := row_data.idx_blks_hit; - toast_blks_read := row_data.toast_blks_read; - toast_blks_hit := row_data.toast_blks_hit; - tidx_blks_read := row_data.tidx_blks_read; - tidx_blks_hit := row_data.tidx_blks_hit; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_dn_stat_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON DATANODES ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_all_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_dn_stat_all_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON DATANODES '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd, - T.n_live_tup AS n_live_tup, - T.n_dead_tup AS n_dead_tup, - T.last_vacuum AS last_vacuum, - T.last_autovacuum AS last_autovacuum, - T.last_analyze AS last_analyze, - T.last_autoanalyze AS last_autoanalyze, - T.vacuum_count AS vacuum_count, - T.autovacuum_count AS autovacuum_count, - T.analyze_count AS analyze_count, - T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_all_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_cn_stat_all_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON COORDINATORS '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd, - T.n_live_tup AS n_live_tup, - T.n_dead_tup AS n_dead_tup, - T.last_vacuum AS last_vacuum, - T.last_autovacuum AS last_autovacuum, - T.last_analyze AS last_analyze, - T.last_autoanalyze AS last_autoanalyze, - T.vacuum_count AS vacuum_count, - T.autovacuum_count AS autovacuum_count, - T.analyze_count AS analyze_count, - T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_all_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid - WHERE T.schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_all_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, - OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_all_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_all_indexes - (OUT schemaname name, OUT relname name, OUT indexrelname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_scan AS idx_scan, - T.idx_tup_read AS idx_tup_read, - T.idx_tup_fetch AS idx_tup_fetch - FROM DBE_PERF.stat_all_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_sys_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, - OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_sys_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_sys_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, - OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd, - T.n_live_tup AS n_live_tup, - T.n_dead_tup AS n_dead_tup, - T.last_vacuum AS last_vacuum, - T.last_autovacuum AS last_autovacuum, - T.last_analyze AS last_analyze, - T.last_autoanalyze AS last_autoanalyze, - T.vacuum_count AS vacuum_count, - T.autovacuum_count AS autovacuum_count, - T.analyze_count AS analyze_count, - T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_sys_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_sys_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, - OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_sys_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_sys_indexes - (OUT schemaname name, OUT relname name, OUT indexrelname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_scan AS idx_scan, - T.idx_tup_read AS idx_tup_read, - T.idx_tup_fetch AS idx_tup_fetch - FROM DBE_PERF.stat_sys_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_user_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, - OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON DATANODES ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_user_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_user_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, - OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON DATANODES '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd, - T.n_live_tup AS n_live_tup, - T.n_dead_tup AS n_dead_tup, - T.last_vacuum AS last_vacuum, - T.last_autovacuum AS last_autovacuum, - T.last_analyze AS last_analyze, - T.last_autoanalyze AS last_autoanalyze, - T.vacuum_count AS vacuum_count, - T.autovacuum_count AS autovacuum_count, - T.analyze_count AS analyze_count, - T.autoanalyze_count AS autoanalyze_count - FROM DBE_PERF.stat_user_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_user_indexes - (OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name, - OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_user_indexes'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - indexrelid := row_data.indexrelid; - schemaname := row_data.schemaname; - relname := row_data.relname; - indexrelname := row_data.indexrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_user_indexes - (OUT schemaname name, OUT relname name, OUT indexrelname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.indexrelname AS indexrelname, - T.idx_scan AS idx_scan, - T.idx_tup_read AS idx_tup_read, - T.idx_tup_fetch AS idx_tup_fetch - FROM DBE_PERF.stat_user_indexes T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - indexrelname := row_data.indexrelname; - ELSE - relname := NULL; - indexrelname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - idx_scan := row_data.idx_scan; - idx_tup_read := row_data.idx_tup_read; - idx_tup_fetch := row_data.idx_tup_fetch; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_database - (OUT node_name name, OUT datid oid, OUT datname name, OUT numbackends integer, OUT xact_commit bigint, - OUT xact_rollback bigint, OUT blks_read bigint, OUT blks_hit bigint, OUT tup_returned bigint, OUT tup_fetched bigint, - OUT tup_inserted bigint, OUT tup_updated bigint, OUT tup_deleted bigint, OUT conflicts bigint, OUT temp_files bigint, - OUT temp_bytes bigint, OUT deadlocks bigint, OUT blk_read_time double precision, OUT blk_write_time double precision, - OUT stats_reset timestamp with time zone) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_database'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - datid := row_data.datid; - datname := row_data.datname; - numbackends := row_data.numbackends; - xact_commit := row_data.xact_commit; - xact_rollback := row_data.xact_rollback; - blks_read := row_data.blks_read; - blks_hit := row_data.blks_hit; - tup_returned := row_data.tup_returned; - tup_fetched := row_data.tup_fetched; - tup_inserted := row_data.tup_inserted; - tup_updated := row_data.tup_updated; - tup_deleted := row_data.tup_deleted; - conflicts := row_data.conflicts; - temp_files := row_data.temp_files; - temp_bytes := row_data.temp_bytes; - deadlocks := row_data.deadlocks; - blk_read_time := row_data.blk_read_time; - blk_write_time := row_data.blk_write_time; - stats_reset := row_data.stats_reset; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_database_conflicts - (OUT node_name name, OUT datid oid, OUT datname name, OUT confl_tablespace bigint, - OUT confl_lock bigint, OUT confl_snapshot bigint, OUT confl_bufferpin bigint, OUT confl_deadlock bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_database_conflicts'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - datid := row_data.datid; - datname := row_data.datname; - confl_tablespace := row_data.confl_tablespace; - confl_lock := row_data.confl_lock; - confl_snapshot := row_data.confl_snapshot; - confl_bufferpin := row_data.confl_bufferpin; - confl_deadlock := row_data.confl_deadlock; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_sys_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, - OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_xact_sys_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_xact_sys_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, - OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_sys_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_user_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, - OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON DATANODES ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_xact_user_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_xact_user_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, - OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON DATANODES '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_user_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_user_functions - (OUT node_name name, OUT funcid oid, OUT schemaname name, OUT funcname name, OUT calls bigint, - OUT total_time double precision, OUT self_time double precision) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_user_functions'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - funcid := row_data.funcid; - schemaname := row_data.schemaname; - funcname := row_data.funcname; - calls := row_data.calls; - total_time := row_data.total_time; - self_time := row_data.self_time; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_user_functions - (OUT node_name name, OUT funcid oid, OUT schemaname name, OUT funcname name, OUT calls bigint, - OUT total_time double precision, OUT self_time double precision) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_xact_user_functions'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - funcid := row_data.funcid; - schemaname := row_data.schemaname; - funcname := row_data.funcname; - calls := row_data.calls; - total_time := row_data.total_time; - self_time := row_data.self_time; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_bad_block - (OUT node_name TEXT, OUT databaseid INT4, OUT tablespaceid INT4, OUT relfilenode INT4, OUT forknum INT4, - OUT error_count INT4, OUT first_time timestamp with time zone, OUT last_time timestamp with time zone) - RETURNS setof record - AS $$ - DECLARE - each_node_out record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON DATANODES ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.stat_bad_block'''; - FOR each_node_out IN EXECUTE(query_str) LOOP - node_name := each_node_out.node_name; - databaseid := each_node_out.databaseid; - tablespaceid := each_node_out.tablespaceid; - relfilenode := each_node_out.relfilenode; - forknum := each_node_out.forknum; - error_count := each_node_out.error_count; - first_time := each_node_out.first_time; - last_time := each_node_out.last_time; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_file_redo_iostat - (OUT node_name name, OUT phywrts bigint, OUT phyblkwrt bigint, OUT writetim bigint, - OUT avgiotim bigint, OUT lstiotim bigint, OUT miniotim bigint, OUT maxiowtm bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.file_redo_iostat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - phywrts := row_data.phywrts; - phyblkwrt := row_data.phyblkwrt; - writetim := row_data.writetim; - avgiotim := row_data.avgiotim; - lstiotim := row_data.lstiotim; - miniotim := row_data.miniotim; - maxiowtm := row_data.maxiowtm; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_rel_iostat - (OUT node_name name, OUT phyrds bigint, - OUT phywrts bigint, OUT phyblkrd bigint, OUT phyblkwrt bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.local_rel_iostat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - phyrds := row_data.phyrds; - phywrts := row_data.phywrts; - phyblkrd := row_data.phyblkrd; - phyblkwrt := row_data.phyblkwrt; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_file_iostat - (OUT node_name name, OUT filenum oid, OUT dbid oid, OUT spcid oid, OUT phyrds bigint, - OUT phywrts bigint, OUT phyblkrd bigint, OUT phyblkwrt bigint, OUT readtim bigint, - OUT writetim bigint, OUT avgiotim bigint, OUT lstiotim bigint, OUT miniotim bigint, OUT maxiowtm bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.file_iostat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - filenum := row_data.filenum; - dbid := row_data.dbid; - spcid := row_data.spcid; - phyrds := row_data.phyrds; - phywrts := row_data.phywrts; - phyblkrd := row_data.phyblkrd; - phyblkwrt := row_data.phyblkwrt; - readtim := row_data.readtim; - writetim := row_data.writetim; - avgiotim := row_data.avgiotim; - lstiotim := row_data.lstiotim; - miniotim := row_data.miniotim; - maxiowtm := row_data.maxiowtm; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_locks - (OUT node_name name, - OUT locktype text, - OUT database oid, - OUT relation oid, - OUT page integer, - OUT tuple smallint, - OUT virtualxid text, - OUT transactionid xid, - OUT classid oid, - OUT objid oid, - OUT objsubid smallint, - OUT virtualtransaction text, - OUT pid bigint, - OUT mode text, - OUT granted boolean, - OUT fastpath boolean) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.locks'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - locktype := row_data.locktype; - database := row_data.database; - relation := row_data.relation; - page := row_data.page; - tuple := row_data.tuple; - virtualxid := row_data.virtualxid; - transactionid := row_data.classid; - objid := row_data.objid; - objsubid := row_data.objsubid; - virtualtransaction := row_data.virtualtransaction; - pid := row_data.pid; - mode := row_data.mode; - granted := row_data.granted; - fastpath := row_data.fastpath; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_replication_slots - (OUT node_name name, - OUT slot_name text, - OUT plugin text, - OUT slot_type text, - OUT datoid oid, - OUT database name, - OUT active boolean, - OUT x_min xid, - OUT catalog_xmin xid, - OUT restart_lsn text, - OUT dummy_standby boolean) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON DATANODES ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.replication_slots'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - slot_name := row_data.slot_name; - plugin := row_data.plugin; - slot_type := row_data.slot_type; - datoid := row_data.datoid; - database := row_data.database; - active := row_data.active; - x_min := row_data.xmin; - catalog_xmin := row_data.catalog_xmin; - restart_lsn := row_data.restart_lsn; - dummy_standby := row_data.dummy_standby; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_bgwriter_stat - (OUT node_name name, - OUT checkpoints_timed bigint, - OUT checkpoints_req bigint, - OUT checkpoint_write_time double precision, - OUT checkpoint_sync_time double precision, - OUT buffers_checkpoint bigint, - OUT buffers_clean bigint, - OUT maxwritten_clean bigint, - OUT buffers_backend bigint, - OUT buffers_backend_fsync bigint, - OUT buffers_alloc bigint, - OUT stats_reset timestamp with time zone) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.bgwriter_stat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - checkpoints_timed := row_data.checkpoints_timed; - checkpoints_req := row_data.checkpoints_req; - checkpoint_write_time := row_data.checkpoint_write_time; - checkpoint_sync_time := row_data.checkpoint_sync_time; - buffers_checkpoint := row_data.buffers_checkpoint; - buffers_clean := row_data.buffers_clean; - maxwritten_clean := row_data.maxwritten_clean; - buffers_backend := row_data.buffers_backend; - buffers_backend_fsync := row_data.buffers_backend_fsync; - buffers_alloc := row_data.buffers_alloc; - stats_reset := row_data.stats_reset; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_replication_stat - (OUT node_name name, - OUT pid bigint, - OUT usesysid oid, - OUT usename name, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT backend_start timestamp with time zone, - OUT state text, - OUT sender_sent_location text, - OUT receiver_write_location text, - OUT receiver_flush_location text, - OUT receiver_replay_location text, - OUT sync_priority integer, - OUT sync_state text) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.replication_stat'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - pid := row_data.pid; - usesysid := row_data.usesysid; - usename := row_data.usename; - client_addr := row_data.client_addr; - client_hostname := row_data.client_hostname; - client_port := row_data.client_port; - state := row_data.state; - sender_sent_location := row_data.sender_sent_location; - receiver_write_location := row_data.receiver_write_location; - receiver_flush_location := row_data.receiver_flush_location; - receiver_replay_location := row_data.receiver_replay_location; - sync_priority := row_data.sync_priority; - sync_state := row_data.sync_state; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_pooler_status - (OUT source_node_name name, - OUT database text, - OUT user_name text, - OUT tid bigint, - OUT node_oid bigint, - OUT node_name name, - OUT in_use boolean, - OUT fdsock bigint, - OUT remote_pid bigint, - OUT session_params text) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.pooler_status'''; - FOR row_data IN EXECUTE(query_str) LOOP - source_node_name := row_data.node_name; - database := row_data.database; - user_name := row_data.user_name; - tid := row_data.tid; - node_oid := row_data.node_oid; - node_name := row_data.node_name; - in_use := row_data.in_use; - fdsock := row_data.fdsock; - remote_pid := row_data.remote_pid; - session_params := row_data.session_params; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_transactions_running_xacts() - RETURNS setof DBE_PERF.transactions_running_xacts - AS $$ - DECLARE - row_data DBE_PERF.transactions_running_xacts%rowtype; - query_str text; - BEGIN - --Get all cn dn node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT * FROM DBE_PERF.transactions_running_xacts'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_transactions_running_xacts() - RETURNS setof DBE_PERF.transactions_running_xacts - AS $$ - DECLARE - row_data DBE_PERF.transactions_running_xacts%rowtype; - query_str text; - BEGIN - --Get all cn node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.transactions_running_xacts'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_transactions_prepared_xacts() - RETURNS setof DBE_PERF.transactions_prepared_xacts - AS $$ - DECLARE - row_data DBE_PERF.transactions_prepared_xacts%rowtype; - query_str text; - BEGIN - --Get all cn dn node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT * FROM DBE_PERF.transactions_prepared_xacts'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_transactions_prepared_xacts() - RETURNS setof DBE_PERF.transactions_prepared_xacts - AS $$ - DECLARE - row_data DBE_PERF.transactions_prepared_xacts%rowtype; - query_str text; - BEGIN - --Get all cn node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.transactions_prepared_xacts'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_statement() - RETURNS setof DBE_PERF.statement - AS $$ - DECLARE - row_data DBE_PERF.statement%rowtype; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.statement'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_statement_count() - RETURNS setof DBE_PERF.statement_count - AS $$ - DECLARE - row_data DBE_PERF.statement_count%rowtype; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT * FROM DBE_PERF.statement_count'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_config_settings - (out node_name text, - out name text, - out setting text, - out unit text, - out category text, - out short_desc text, - out extra_desc text, - out context text, - out vartype text, - out source text, - out min_val text, - out max_val text, - out enumvals text[], - out boot_val text, - out reset_val text, - out sourcefile text, - out sourceline integer) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.config_settings'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - name := row_data.name; - setting := row_data.setting; - unit := row_data.unit; - category := row_data.category; - short_desc := row_data.short_desc; - extra_desc := row_data.extra_desc; - context := row_data.context; - vartype := row_data.vartype; - source := row_data.source; - min_val := row_data.min_val; - max_val := row_data.max_val; - enumvals := row_data.enumvals; - boot_val := row_data.boot_val; - reset_val := row_data.reset_val; - sourcefile := row_data.sourcefile; - sourceline := row_data.sourceline; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_wait_events() - RETURNS setof DBE_PERF.wait_events - AS $$ - DECLARE - row_data DBE_PERF.wait_events%rowtype; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL ''SELECT * FROM DBE_PERF.wait_events'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_user_login() - RETURNS SETOF DBE_PERF.user_login - AS $$ - DECLARE - ROW_DATA DBE_PERF.user_login%ROWTYPE; - QUERY_STR TEXT; - BEGIN - QUERY_STR := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.user_login'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_record_reset_time(OUT node_name text, OUT reset_time timestamp with time zone) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM get_node_stat_reset_time()'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - reset_time := row_data.get_node_stat_reset_time; - return next; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.global_threadpool_status() - RETURNS SETOF DBE_PERF.local_threadpool_status - AS $$ - DECLARE - ROW_DATA DBE_PERF.local_threadpool_status%ROWTYPE; - QUERY_STR TEXT; - BEGIN - QUERY_STR := 'EXECUTE DIRECT ON ALL ''SELECT * FROM DBE_PERF.local_threadpool_status'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.global_plancache_status() - RETURNS SETOF DBE_PERF.local_plancache_status - AS $$ - DECLARE - ROW_DATA DBE_PERF.local_plancache_status%ROWTYPE; - QUERY_STR TEXT; - BEGIN - QUERY_STR := 'EXECUTE DIRECT ON ALL ''SELECT * FROM DBE_PERF.local_plancache_status'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.global_prepare_statement_status() - RETURNS SETOF DBE_PERF.local_prepare_statement_status - AS $$ - DECLARE - ROW_DATA DBE_PERF.local_prepare_statement_status%ROWTYPE; - QUERY_STR TEXT; - BEGIN - QUERY_STR := 'EXECUTE DIRECT ON ALL ''SELECT * FROM DBE_PERF.local_prepare_statement_status'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - RETURN NEXT ROW_DATA; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.global_slow_query_info() - RETURNS setof DBE_PERF.gs_slow_query_info - AS $$ - DECLARE - row_data DBE_PERF.gs_slow_query_info%rowtype; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.gs_slow_query_info'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.global_slow_query_info_bytime(text, TIMESTAMP, TIMESTAMP, int) - RETURNS setof DBE_PERF.gs_slow_query_info - AS $$ - DECLARE - row_data DBE_PERF.gs_slow_query_info%rowtype; - query_str text; - query_str_cn text; - BEGIN - IF $1 IN ('start_time', 'finish_time') THEN - ELSE - raise WARNING 'Illegal character entered for function, colname must be start_time or finish_time'; - return; - END IF; - --Get all the node names - query_str_cn := 'SELECT * FROM DBE_PERF.gs_slow_query_info where '||$1||'>'''''||$2||''''' and '||$1||'<'''''||$3||''''' limit '||$4; - query_str := 'EXECUTE DIRECT ON COORDINATORS ''' || query_str_cn||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - DROP FUNCTION IF EXISTS DBE_PERF.get_global_active_session() CASCADE; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_active_session - (OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text, - OUT locktag text, - OUT lockmode text, - OUT block_sessionid bigint, - OUT final_block_sessionid bigint, - OUT wait_status text) - RETURNS SETOF record - AS $$ - DECLARE - ROW_DATA record; - QUERY_STR TEXT; - BEGIN - QUERY_STR := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM DBE_PERF.local_active_session'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := ROW_DATA.node_name; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - unique_query := ROW_DATA.unique_query; - locktag := ROW_DATA.locktag; - lockmode := ROW_DATA.lockmode; - block_sessionid := ROW_DATA.block_sessionid; - final_block_sessionid := ROW_DATA.final_block_sessionid; - wait_status := ROW_DATA.wait_status; - RETURN NEXT; - END LOOP; - RETURN; - END; $$ - LANGUAGE 'plpgsql'; - - - CREATE OR REPLACE VIEW DBE_PERF.global_active_session AS - SELECT * FROM DBE_PERF.get_global_active_session(); - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_stat_xact_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint, - OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - row_name record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON DATANODES ''SELECT pgxc_node_str() as node_name,* FROM DBE_PERF.stat_xact_all_tables'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name,* FROM DBE_PERF.stat_xact_all_tables where schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_summary_stat_xact_all_tables - (OUT schemaname name, OUT relname name, - OUT toastrelschemaname name, OUT toastrelname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, - OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint, - OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON DATANODES '' - SELECT - T.schemaname AS schemaname, - T.relname AS relname, - N.nspname AS toastrelschemaname, - C.relname AS toastrelname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_all_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid'''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - query_str := 'EXECUTE DIRECT ON COORDINATORS '' - SELECT - T.relname AS relname, - T.schemaname AS schemaname, - C.relname AS toastrelname, - N.nspname AS toastrelschemaname, - T.seq_scan AS seq_scan, - T.seq_tup_read AS seq_tup_read, - T.idx_scan AS idx_scan, - T.idx_tup_fetch AS idx_tup_fetch, - T.n_tup_ins AS n_tup_ins, - T.n_tup_upd AS n_tup_upd, - T.n_tup_del AS n_tup_del, - T.n_tup_hot_upd AS n_tup_hot_upd - FROM DBE_PERF.stat_xact_all_tables T - LEFT JOIN pg_class C ON T.relid = C.reltoastrelid - LEFT JOIN pg_namespace N ON C.relnamespace = N.oid - WHERE T.schemaname = ''''pg_catalog'''' OR T.schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - schemaname := row_data.schemaname; - IF row_data.toastrelname IS NULL THEN - relname := row_data.relname; - ELSE - relname := NULL; - END IF; - toastrelschemaname := row_data.toastrelschemaname; - toastrelname := row_data.toastrelname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_stat_activity - (out coorname text, out datid oid, out datname text, out pid bigint, - out usesysid oid, out usename text, out application_name text, out client_addr inet, - out client_hostname text, out client_port integer, out backend_start timestamptz, - out xact_start timestamptz, out query_start timestamptz, out state_change timestamptz, - out waiting boolean, out enqueue text, out state text, out resource_pool name, - out query_id bigint, out query text) - RETURNS setof record - AS $$ - DECLARE - row_data record; - fet_active text; - BEGIN - fet_active := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name, * FROM DBE_PERF.session_stat_activity'''; - FOR row_data IN EXECUTE(fet_active) LOOP - coorname := row_data.node_name; - datid :=row_data.datid; - datname := row_data.datname; - pid := row_data.pid; - usesysid :=row_data.usesysid; - usename := row_data.usename; - application_name := row_data.application_name; - client_addr := row_data.client_addr; - client_hostname :=row_data.client_hostname; - client_port :=row_data.client_port; - backend_start := row_data.backend_start; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - state_change := row_data.state_change; - waiting := row_data.waiting; - enqueue := row_data.enqueue; - state := row_data.state; - resource_pool :=row_data.resource_pool; - query_id :=row_data.query_id; - query := row_data.query; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_cn_stat_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON COORDINATORS '' - SELECT pgxc_node_str() as node_name, * FROM DBE_PERF.stat_all_tables WHERE schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_stat_db_cu - (OUT node_name1 text, OUT db_name text, - OUT mem_hit bigint, OUT hdd_sync_read bigint, - OUT hdd_asyn_read bigint) - RETURNS setof record - AS $$ - DECLARE - each_node_out record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON ALL ''SELECT D.datname AS datname, - pg_stat_get_db_cu_mem_hit(D.oid) AS mem_hit, - pg_stat_get_db_cu_hdd_sync(D.oid) AS hdd_sync_read, - pg_stat_get_db_cu_hdd_asyn(D.oid) AS hdd_asyn_read, - pgxc_node_str() as node_name - FROM pg_database D;'''; - FOR each_node_out IN EXECUTE(query_str) LOOP - node_name1 := each_node_out.node_name; - db_name := each_node_out.datname; - mem_hit := each_node_out.mem_hit; - hdd_sync_read := each_node_out.hdd_sync_read; - hdd_asyn_read := each_node_out.hdd_asyn_read; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_cn_stat_all_tables - (OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, - OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, - OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint, - OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone, - OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint, - OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint) - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON COORDINATORS '' - SELECT pgxc_node_str() as node_name, * FROM DBE_PERF.stat_all_tables WHERE schemaname = ''''pg_catalog'''' or schemaname =''''pg_toast'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - relid := row_data.relid; - schemaname := row_data.schemaname; - relname := row_data.relname; - seq_scan := row_data.seq_scan; - seq_tup_read := row_data.seq_tup_read; - idx_scan := row_data.idx_scan; - idx_tup_fetch := row_data.idx_tup_fetch; - n_tup_ins := row_data.n_tup_ins; - n_tup_upd := row_data.n_tup_upd; - n_tup_del := row_data.n_tup_del; - n_tup_hot_upd := row_data.n_tup_hot_upd; - n_live_tup := row_data.n_live_tup; - n_dead_tup := row_data.n_dead_tup; - last_vacuum := row_data.last_vacuum; - last_autovacuum := row_data.last_autovacuum; - last_analyze := row_data.last_analyze; - last_autoanalyze := row_data.last_autoanalyze; - vacuum_count := row_data.vacuum_count; - autovacuum_count := row_data.autovacuum_count; - analyze_count := row_data.analyze_count; - autoanalyze_count := row_data.autoanalyze_count; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION dbe_perf.global_stat_activity_timeout(in execute_time int4, out nodename text, out database name, out pid int8, out sessionid int8, out usesysid oid, out application_name text, out query text, out xact_start timestamptz, out query_start timestamptz, out query_id int8) - RETURNS setof record - AS $$ - DECLARE - query_str text; - row_data record; - BEGIN - --Get the node names of all CNs - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name ,* FROM dbe_perf.gs_stat_activity_timeout(' || execute_time || ')'''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename := row_data.node_name; - database := row_data.database; - pid := row_data.pid; - sessionid := row_data.sessionid; - usesysid := row_data.usesysid; - application_name := row_data.application_name; - query := row_data.query; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - query_id := row_data.query_id; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_session_stat_activity - (out coorname text, out datid oid, out datname text, out pid bigint, - out usesysid oid, out usename text, out application_name text, out client_addr inet, - out client_hostname text, out client_port integer, out backend_start timestamptz, - out xact_start timestamptz, out query_start timestamptz, out state_change timestamptz, - out waiting boolean, out enqueue text, out state text, out resource_pool name, - out query_id bigint, out query text) - RETURNS setof record - AS $$ - DECLARE - row_data record; - fet_active text; - BEGIN - --Get all cn node names - fet_active := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name , * FROM DBE_PERF.session_stat_activity'''; - FOR row_data IN EXECUTE(fet_active) LOOP - coorname := row_data.node_name; - datid :=row_data.datid; - datname := row_data.datname; - pid := row_data.pid; - usesysid :=row_data.usesysid; - usename := row_data.usename; - application_name := row_data.application_name; - client_addr := row_data.client_addr; - client_hostname :=row_data.client_hostname; - client_port :=row_data.client_port; - backend_start := row_data.backend_start; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - state_change := row_data.state_change; - waiting := row_data.waiting; - enqueue := row_data.enqueue; - state := row_data.state; - resource_pool :=row_data.resource_pool; - query_id :=row_data.query_id; - query := row_data.query; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.get_global_operator_ec_runtime() - RETURNS setof DBE_PERF.operator_ec_runtime - AS $$ - DECLARE - row_data DBE_PERF.operator_ec_runtime%rowtype; - fet_active text; - BEGIN - --Get all the CN node names - fet_active := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.operator_ec_runtime'''; - FOR row_data IN EXECUTE(fet_active) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION DBE_PERF.global_plancache_clean() - RETURNS BOOLEAN - AS $$ - DECLARE - ROW_DATA record; - QUERY_STR TEXT; - BEGIN - QUERY_STR := 'EXECUTE DIRECT ON ALL ''SELECT * from DBE_PERF.local_plancache_clean'''; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - END LOOP; - RETURN TRUE; - END; $$ - LANGUAGE 'plpgsql'; - - CREATE OR REPLACE FUNCTION DBE_PERF.global_slow_query_history - RETURNS setof DBE_PERF.gs_slow_query_history - AS $$ - DECLARE - row_data DBE_PERF.gs_slow_query_history%rowtype; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM DBE_PERF.gs_slow_query_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql' NOT FENCED; - - SELECT SESSION_USER INTO user_name; - global_query_str := 'GRANT ALL ON TABLE DBE_PERF.global_active_session TO ' || quote_ident(user_name) || ';'; - EXECUTE IMMEDIATE global_query_str; - GRANT SELECT ON DBE_PERF.global_active_session TO public; - end if; -END $DO$; CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_statistics() RETURNS setof record AS $$ @@ -16282,79 +10520,6 @@ DECLARE END; $$ LANGUAGE 'plpgsql' NOT FENCED; - CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_get_wal_senders_status(OUT nodename text, OUT source_ip text, OUT source_port integer,OUT dest_ip text, OUT dest_port integer,OUT sender_pid int, OUT local_role text, OUT peer_role text, OUT peer_state text, - OUT state text, - OUT sender_sent_location text, OUT sender_write_location text, OUT sender_flush_location text, OUT sender_replay_location text, - OUT receiver_received_location text, OUT receiver_write_location text, OUT receiver_flush_location text, OUT receiver_replay_location text) - - RETURNS setof record - AS $$ - DECLARE - row_data record; - query_str text; - source_addr text; - dest_addr text; - BEGIN - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM pg_stat_get_wal_senders()'''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename = row_data.node_name; - source_addr = substring(row_data.channel from 0 for position('-->' in row_data.channel)); - dest_addr = substring(row_data.channel from position('-->' in row_data.channel) + 3); - source_ip = substring(source_addr from 0 for position(':' in source_addr)); - source_port = cast(substring(source_addr from position(':' in source_addr) + 1) as integer); - dest_ip = substring(dest_addr from 0 for position(':' in dest_addr)); - dest_port = cast(substring(dest_addr from position(':' in dest_addr) + 1) as integer); - sender_pid = row_data.sender_pid; - local_role = row_data.local_role; - peer_role = row_data.peer_role; - peer_state = row_data.peer_state; - state = row_data.state; - sender_sent_location = row_data.sender_sent_location; - sender_write_location = row_data.sender_write_location; - sender_flush_location = row_data.sender_flush_location; - sender_replay_location = row_data.sender_replay_location; - receiver_received_location = row_data.receiver_received_location; - receiver_write_location = row_data.receiver_write_location; - receiver_flush_location = row_data.receiver_flush_location; - receiver_replay_location = row_data.receiver_replay_location; - return next; - END LOOP; - return; - END; $$ - LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_get_stat_session_cu(OUT node_name1 text, OUT mem_hit int, OUT hdd_sync_read int, OUT hdd_asyn_read int) -RETURNS setof record -AS $$ -DECLARE - each_node_out record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name ,* FROM pg_stat_session_cu()'''; - FOR each_node_out IN EXECUTE(query_str) LOOP - node_name1 := each_node_out.node_name; - mem_hit := each_node_out.mem_hit; - hdd_sync_read := each_node_out.hdd_sync_read; - hdd_asyn_read := each_node_out.hdd_asyn_read; - return next; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.gs_stat_reset() -RETURNS void -AS $$ -DECLARE - each_node_out record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON ALL ''SELECT * FROM pg_stat_reset()'''; - EXECUTE(query_str); - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - CREATE OR REPLACE FUNCTION pg_catalog.pgxc_comm_delay() RETURNS setof pg_comm_delay AS $$ @@ -16464,75 +10629,9 @@ DECLARE END; $$ LANGUAGE 'plpgsql' NOT FENCED; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_bad_block(OUT nodename TEXT, OUT databaseid INT4, OUT tablespaceid INT4, OUT relfilenode INT4, OUT forknum INT4, OUT error_count INT4, OUT first_time timestamp with time zone, OUT last_time timestamp with time zone) -RETURNS setof record -AS $$ -DECLARE - each_node_out record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON DATANODES ''SELECT pgxc_node_str() as node_name ,* FROM pg_stat_bad_block()'''; - FOR each_node_out IN EXECUTE(query_str) LOOP - nodename := each_node_out.node_name; - databaseid := each_node_out.databaseid; - tablespaceid := each_node_out.tablespaceid; - relfilenode := each_node_out.relfilenode; - forknum := each_node_out.forknum; - error_count := each_node_out.error_count; - first_time := each_node_out.first_time; - last_time := each_node_out.last_time; - return next; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_bad_block_clear() -RETURNS void -AS $$ -DECLARE - each_node_out record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON DATANODES ''SELECT * FROM pg_stat_bad_block_clear()'''; - EXECUTE(query_str); - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - DROP FUNCTION IF EXISTS pg_catalog.pgxc_query_audit(IN starttime TIMESTAMPTZ, IN endtime TIMESTAMPTZ, OUT "time" TIMESTAMPTZ, OUT "type" text, OUT "result" text, OUT userid text, OUT username text, OUT database text, OUT client_conninfo text, OUT "object_name" text, OUT detail_info text, OUT node_name text, OUT thread_id text, OUT local_port text, OUT remote_port text) CASCADE; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_query_audit(IN starttime TIMESTAMPTZ, IN endtime TIMESTAMPTZ, OUT "time" TIMESTAMPTZ, OUT "type" text, OUT "result" text, OUT userid text, OUT username text, OUT database text, OUT client_conninfo text, OUT "object_name" text, OUT detail_info text, OUT node_name text, OUT thread_id text, OUT local_port text, OUT remote_port text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - query_str text; - BEGIN - --Get the node names of all CNs - query_str := 'EXECUTE DIRECT ON COORDINATORS ''SELECT * FROM pg_catalog.pg_query_audit(''''' || starttime || ''''',''''' || endtime || ''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - "time" := row_data."time"; - "type" := row_data."type"; - "result" := row_data."result"; - userid := row_data.userid; - username := row_data.username; - database := row_data.database; - client_conninfo := row_data.client_conninfo; - "object_name" := row_data."object_name"; - detail_info := row_data.detail_info; - node_name := row_data.node_name; - thread_id := row_data.thread_id; - local_port := row_data.local_port; - remote_port := row_data.remote_port; - return next; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - DROP FUNCTION IF EXISTS pg_catalog.pgxc_stat_all_tables() CASCADE; @@ -16564,174 +10663,6 @@ CREATE VIEW pg_catalog.pgxc_get_stat_all_tables AS AS NUMERIC(5,2)) dirty_page_rate FROM pgxc_stat_all_tables() GROUP BY (relname,schemaname)) s WHERE p.relname = s.relname AND p.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = s.schemaname) AND p.relname NOT LIKE '%pg_cudesc%' ORDER BY dirty_page_rate DESC; -CREATE OR REPLACE FUNCTION pg_catalog.gs_get_stat_db_cu(OUT node_name1 text, OUT db_name text, OUT mem_hit bigint, OUT hdd_sync_read bigint, OUT hdd_asyn_read bigint) -RETURNS setof record -AS $$ -DECLARE - each_node_out record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON ALL ''SELECT D.datname AS datname, - pg_stat_get_db_cu_mem_hit(D.oid) AS mem_hit, - pg_stat_get_db_cu_hdd_sync(D.oid) AS hdd_sync_read, - pg_stat_get_db_cu_hdd_asyn(D.oid) AS hdd_asyn_read, - pgxc_node_str() as node_name - FROM pg_database D;'''; - FOR each_node_out IN EXECUTE(query_str) LOOP - node_name1 := each_node_out.node_name; - db_name := each_node_out.datname; - mem_hit := each_node_out.mem_hit; - hdd_sync_read := each_node_out.hdd_sync_read; - hdd_asyn_read := each_node_out.hdd_asyn_read; - return next; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_delta_info(IN rel TEXT, OUT node_name TEXT, OUT part_name TEXT, OUT live_tuple INT8, OUT data_size INT8, OUT blockNum INT8) -RETURNS setof record -AS $$ -DECLARE - query_str text; - rel_info record; - row_data record; - BEGIN - EXECUTE format('select c.relname,n.nspname from pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) where C.oid = (select %L::regclass::oid)', rel) into rel_info; - query_str := 'EXECUTE DIRECT ON DATANODES ''SELECT pgxc_node_str() as node_name , * from pg_catalog.pg_get_delta_info('''''||rel_info.relname||''''','''''||rel_info.nspname||''''')'''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := row_data.node_name; - live_tuple := row_data.live_tuple; - data_size := row_data.data_size; - blockNum := row_data.blockNum; - part_name := row_data.part_name; - return next; - END LOOP; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_activity_with_conninfo -( -out coorname text, -out datid oid, -out datname text, -out pid bigint, -out sessionid bigint, -out usesysid oid, -out usename text, -out application_name text, -out client_addr inet, -out client_hostname text, -out client_port integer, -out backend_start timestamptz, -out xact_start timestamptz, -out query_start timestamptz, -out state_change timestamptz, -out waiting boolean, -out enqueue text, -out state text, -out resource_pool name, -out query_id bigint, -out query text, -out connection_info text -) -RETURNS setof record -AS $$ -DECLARE - row_data record; - fet_active text; - BEGIN - --Get all the node names - fet_active := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name ,* FROM pg_stat_activity '''; - FOR row_data IN EXECUTE(fet_active) LOOP - coorname := row_data.node_name; - datid :=row_data.datid; - datname := row_data.datname; - pid := row_data.pid; - sessionid := row_data.sessionid; - usesysid :=row_data.usesysid; - usename := row_data.usename; - application_name := row_data.application_name; - client_addr := row_data.client_addr; - client_hostname :=row_data.client_hostname; - client_port :=row_data.client_port; - backend_start := row_data.backend_start; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - state_change := row_data.state_change; - waiting := row_data.waiting; - enqueue := row_data.enqueue; - state := row_data.state; - resource_pool :=row_data.resource_pool; - query_id :=row_data.query_id; - query := row_data.query; - connection_info := row_data.connection_info; - return next; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_activity -( -out coorname text, -out datid oid, -out datname text, -out pid bigint, -out sessionid bigint, -out usesysid oid, -out usename text, -out application_name text, -out client_addr inet, -out client_hostname text, -out client_port integer, -out backend_start timestamptz, -out xact_start timestamptz, -out query_start timestamptz, -out state_change timestamptz, -out waiting boolean, -out enqueue text, -out state text, -out resource_pool name, -out query_id bigint, -out query text -) -RETURNS setof record -AS $$ -DECLARE - row_data record; - fet_active text; - BEGIN - --Get all the node names - fet_active := 'EXECUTE DIRECT ON COORDINATORS ''SELECT pgxc_node_str() as node_name ,* FROM pg_stat_activity '''; - FOR row_data IN EXECUTE(fet_active) LOOP - coorname := row_data.node_name; - datid :=row_data.datid; - datname := row_data.datname; - pid := row_data.pid; - sessionid := row_data.sessionid; - usesysid :=row_data.usesysid; - usename := row_data.usename; - application_name := row_data.application_name; - client_addr := row_data.client_addr; - client_hostname :=row_data.client_hostname; - client_port :=row_data.client_port; - backend_start := row_data.backend_start; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - state_change := row_data.state_change; - waiting := row_data.waiting; - enqueue := row_data.enqueue; - state := row_data.state; - resource_pool :=row_data.resource_pool; - query_id :=row_data.query_id; - query := row_data.query; - return next; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - create or replace function pg_catalog.pgxc_cgroup_map_ng_conf(IN ngname text) returns bool AS $$ @@ -16750,101 +10681,6 @@ begin end; $$language plpgsql NOT FENCED; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_xacts_iscommitted(IN xid int8, OUT nodename text, OUT iscommitted bool) -RETURNS setof record -AS $$ -DECLARE - row_data record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_is_committed('|| xid ||'::text::xid) as bcommitted , pgxc_node_str() as node_name'''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename = row_data.node_name; - iscommitted = row_data.bcommitted; - return next; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_senders_catchup_time(OUT nodename text, OUT lwpid int, OUT local_role text, OUT peer_role text, - OUT state text, OUT sender text, - OUT catchup_start TimestampTz, OUT catchup_end TimestampTz) - -RETURNS setof record -AS $$ -DECLARE - row_data record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name,* FROM pg_get_senders_catchup_time where state = ''''Catchup'''' '''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename = row_data.node_name; - lwpid = row_data.lwpid; - local_role = row_data.local_role; - peer_role = row_data.peer_role; - state = row_data.state; - sender = row_data."type"; - catchup_start = row_data.catchup_start; - catchup_end = row_data.catchup_end; - return next; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_parse_clog(OUT xid int8, OUT nodename text, OUT status text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - query_str text; - BEGIN - --Get all the node names - query_str := 'EXECUTE DIRECT ON ALL''SELECT pgxc_node_str() as node_name, * FROM pg_parse_clog() '''; - FOR row_data IN EXECUTE(query_str) LOOP - xid = row_data.xid; - nodename = row_data.node_name; - status = row_data.status; - return next; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_get_wal_senders(OUT nodename text, OUT sender_pid int, OUT local_role text, OUT peer_role text, OUT peer_state text, - OUT state text, - OUT sender_sent_location text, OUT sender_write_location text, OUT sender_flush_location text, OUT sender_replay_location text, - OUT receiver_received_location text, OUT receiver_write_location text, OUT receiver_flush_location text, OUT receiver_replay_location text) - -RETURNS setof record -AS $$ -DECLARE - row_data record; - query_str text; - BEGIN - query_str := 'EXECUTE DIRECT ON ALL ''SELECT pgxc_node_str() as node_name, * FROM pg_stat_get_wal_senders() where sender_flush_location != receiver_replay_location '''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename = row_data.node_name; - sender_pid = row_data.sender_pid; - local_role = row_data.local_role; - peer_role = row_data.peer_role; - peer_state = row_data.peer_state; - state = row_data.state; - sender_sent_location = row_data.sender_sent_location; - sender_write_location = row_data.sender_write_location; - sender_flush_location = row_data.sender_flush_location; - sender_replay_location = row_data.sender_replay_location; - receiver_received_location = row_data.receiver_received_location; - receiver_write_location = row_data.receiver_write_location; - receiver_flush_location = row_data.receiver_flush_location; - receiver_replay_location = row_data.receiver_replay_location; - return next; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql'; - CREATE OR REPLACE FUNCTION pg_catalog.reload_active_coordinator() RETURNS boolean AS $$ @@ -17149,76 +10985,75 @@ BEGIN CREATE VIEW DBE_PERF.statement_history AS select * from pg_catalog.statement_history; CREATE OR REPLACE FUNCTION DBE_PERF.get_global_full_sql_by_timestamp - (in start_timestamp timestamp with time zone, - in end_timestamp timestamp with time zone, - OUT node_name name, - OUT db_name name, - OUT schema_name name, - OUT origin_node integer, - OUT user_name name, - OUT application_name text, - OUT client_addr text, - OUT client_port integer, - OUT unique_query_id bigint, - OUT debug_query_id bigint, - OUT query text, - OUT start_time timestamp with time zone, - OUT finish_time timestamp with time zone, - OUT slow_sql_threshold bigint, - OUT transaction_id bigint, - OUT thread_id bigint, - OUT session_id bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT query_plan text, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - OUT net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text, - OUT lock_count bigint, - OUT lock_time bigint, - OUT lock_wait_count bigint, - OUT lock_wait_time bigint, - OUT lock_max_count bigint, - OUT lwlock_count bigint, - OUT lwlock_wait_count bigint, - OUT lwlock_time bigint, - OUT lwlock_wait_time bigint, - OUT details bytea, - OUT is_slow_sql bool) - RETURNS setof record - AS $$ - DECLARE - row_data pg_catalog.statement_history%rowtype; - query_str text; - -- node name - node_names name[]; - each_node_name name; - BEGIN - -- Get all node names(CN + master DN) - node_names := ARRAY(SELECT pgxc_node.node_name FROM pgxc_node WHERE (node_type = 'C' or node_type = 'D') AND nodeis_active = true); - FOREACH each_node_name IN ARRAY node_names - LOOP - query_str := 'EXECUTE DIRECT ON (' || each_node_name || ') ''SELECT * FROM DBE_PERF.statement_history where start_time >= ''''' ||$1|| ''''' and start_time <= ''''' || $2 || ''''''''; - FOR row_data IN EXECUTE(query_str) LOOP - node_name := each_node_name; + (in start_timestamp timestamp with time zone, + in end_timestamp timestamp with time zone, + OUT node_name name, + OUT db_name name, + OUT schema_name name, + OUT origin_node integer, + OUT user_name name, + OUT application_name text, + OUT client_addr text, + OUT client_port integer, + OUT unique_query_id bigint, + OUT debug_query_id bigint, + OUT query text, + OUT start_time timestamp with time zone, + OUT finish_time timestamp with time zone, + OUT slow_sql_threshold bigint, + OUT transaction_id bigint, + OUT thread_id bigint, + OUT session_id bigint, + OUT n_soft_parse bigint, + OUT n_hard_parse bigint, + OUT query_plan text, + OUT n_returned_rows bigint, + OUT n_tuples_fetched bigint, + OUT n_tuples_returned bigint, + OUT n_tuples_inserted bigint, + OUT n_tuples_updated bigint, + OUT n_tuples_deleted bigint, + OUT n_blocks_fetched bigint, + OUT n_blocks_hit bigint, + OUT db_time bigint, + OUT cpu_time bigint, + OUT execution_time bigint, + OUT parse_time bigint, + OUT plan_time bigint, + OUT rewrite_time bigint, + OUT pl_execution_time bigint, + OUT pl_compilation_time bigint, + OUT data_io_time bigint, + OUT net_send_info text, + OUT net_recv_info text, + OUT net_stream_send_info text, + OUT net_stream_recv_info text, + OUT lock_count bigint, + OUT lock_time bigint, + OUT lock_wait_count bigint, + OUT lock_wait_time bigint, + OUT lock_max_count bigint, + OUT lwlock_count bigint, + OUT lwlock_wait_count bigint, + OUT lwlock_time bigint, + OUT lwlock_wait_time bigint, + OUT details bytea, + OUT is_slow_sql bool) + RETURNS setof record + AS $$ + DECLARE + row_data pg_catalog.statement_history%rowtype; + row_name record; + query_str text; + -- node name + query_str_nodes text; + BEGIN + -- Get all node names(CN + master DN) + query_str_nodes := 'select * from dbe_perf.node_name'; + FOR row_name IN EXECUTE(query_str_nodes) LOOP + query_str := 'SELECT * FROM DBE_PERF.statement_history where start_time >= ''' ||$1|| ''' and start_time <= ''' || $2 || ''''; + FOR row_data IN EXECUTE(query_str) LOOP + node_name := row_name.node_name; db_name := row_data.db_name; schema_name := row_data.schema_name; origin_node := row_data.origin_node; @@ -17278,77 +11113,75 @@ BEGIN LANGUAGE 'plpgsql' NOT FENCED; CREATE OR REPLACE FUNCTION DBE_PERF.get_global_slow_sql_by_timestamp - (in start_timestamp timestamp with time zone, - in end_timestamp timestamp with time zone, - OUT node_name name, - OUT db_name name, - OUT schema_name name, - OUT origin_node integer, - OUT user_name name, - OUT application_name text, - OUT client_addr text, - OUT client_port integer, - OUT unique_query_id bigint, - OUT debug_query_id bigint, - OUT query text, - OUT start_time timestamp with time zone, - OUT finish_time timestamp with time zone, - OUT slow_sql_threshold bigint, - OUT transaction_id bigint, - OUT thread_id bigint, - OUT session_id bigint, - OUT n_soft_parse bigint, - OUT n_hard_parse bigint, - OUT query_plan text, - OUT n_returned_rows bigint, - OUT n_tuples_fetched bigint, - OUT n_tuples_returned bigint, - OUT n_tuples_inserted bigint, - OUT n_tuples_updated bigint, - OUT n_tuples_deleted bigint, - OUT n_blocks_fetched bigint, - OUT n_blocks_hit bigint, - OUT db_time bigint, - OUT cpu_time bigint, - OUT execution_time bigint, - OUT parse_time bigint, - OUT plan_time bigint, - OUT rewrite_time bigint, - OUT pl_execution_time bigint, - OUT pl_compilation_time bigint, - OUT data_io_time bigint, - OUT net_send_info text, - OUT net_recv_info text, - OUT net_stream_send_info text, - OUT net_stream_recv_info text, - OUT lock_count bigint, - OUT lock_time bigint, - OUT lock_wait_count bigint, - OUT lock_wait_time bigint, - OUT lock_max_count bigint, - OUT lwlock_count bigint, - OUT lwlock_wait_count bigint, - OUT lwlock_time bigint, - OUT lwlock_wait_time bigint, - OUT details bytea, - OUT is_slow_sql bool) - RETURNS setof record - AS $$ - DECLARE + (in start_timestamp timestamp with time zone, + in end_timestamp timestamp with time zone, + OUT node_name name, + OUT db_name name, + OUT schema_name name, + OUT origin_node integer, + OUT user_name name, + OUT application_name text, + OUT client_addr text, + OUT client_port integer, + OUT unique_query_id bigint, + OUT debug_query_id bigint, + OUT query text, + OUT start_time timestamp with time zone, + OUT finish_time timestamp with time zone, + OUT slow_sql_threshold bigint, + OUT transaction_id bigint, + OUT thread_id bigint, + OUT session_id bigint, + OUT n_soft_parse bigint, + OUT n_hard_parse bigint, + OUT query_plan text, + OUT n_returned_rows bigint, + OUT n_tuples_fetched bigint, + OUT n_tuples_returned bigint, + OUT n_tuples_inserted bigint, + OUT n_tuples_updated bigint, + OUT n_tuples_deleted bigint, + OUT n_blocks_fetched bigint, + OUT n_blocks_hit bigint, + OUT db_time bigint, + OUT cpu_time bigint, + OUT execution_time bigint, + OUT parse_time bigint, + OUT plan_time bigint, + OUT rewrite_time bigint, + OUT pl_execution_time bigint, + OUT pl_compilation_time bigint, + OUT data_io_time bigint, + OUT net_send_info text, + OUT net_recv_info text, + OUT net_stream_send_info text, + OUT net_stream_recv_info text, + OUT lock_count bigint, + OUT lock_time bigint, + OUT lock_wait_count bigint, + OUT lock_wait_time bigint, + OUT lock_max_count bigint, + OUT lwlock_count bigint, + OUT lwlock_wait_count bigint, + OUT lwlock_time bigint, + OUT lwlock_wait_time bigint, + OUT details bytea, + OUT is_slow_sql bool) + RETURNS setof record + AS $$ + DECLARE row_data pg_catalog.statement_history%rowtype; row_name record; query_str text; -- node name - node_names name[]; - each_node_name name; + query_str_nodes text; BEGIN -- Get all node names(CN + master DN) - node_names := ARRAY(SELECT pgxc_node.node_name FROM pgxc_node WHERE (node_type = 'C' or node_type = 'D') AND nodeis_active = true); - FOREACH each_node_name IN ARRAY node_names - LOOP - query_str := 'EXECUTE DIRECT ON (' || each_node_name || ') ''SELECT * FROM DBE_PERF.statement_history where start_time >= ''''' ||$1|| ''''' and start_time <= ''''' || $2 || ''''' and is_slow_sql = true '''; + query_str_nodes := 'select * from dbe_perf.node_name'; + FOR row_name IN EXECUTE(query_str_nodes) LOOP + query_str := 'SELECT * FROM DBE_PERF.statement_history where start_time >= ''' ||$1|| ''' and start_time <= ''' || $2 || ''' and is_slow_sql = true '; FOR row_data IN EXECUTE(query_str) LOOP - node_name := each_node_name; + node_name := row_name.node_name; db_name := row_data.db_name; schema_name := row_data.schema_name; origin_node := row_data.origin_node; @@ -17504,3 +11337,143 @@ BEGIN END IF; END; / + +CREATE OR REPLACE VIEW pg_catalog.pg_seclabels AS +SELECT + l.objoid, l.classoid, l.objsubid, + CASE WHEN rel.relkind = 'r' THEN 'table'::text + WHEN rel.relkind = 'v' THEN 'view'::text + WHEN rel.relkind = 'm' THEN 'materialized view'::text + WHEN rel.relkind = 'S' THEN 'sequence'::text + WHEN rel.relkind = 'f' THEN 'foreign table'::text END AS objtype, + rel.relnamespace AS objnamespace, + CASE WHEN pg_table_is_visible(rel.oid) + THEN quote_ident(rel.relname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(rel.relname) + END AS objname, + l.provider, l.label +FROM + pg_seclabel l + JOIN pg_class rel ON l.classoid = rel.tableoid AND l.objoid = rel.oid + JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid +WHERE + l.objsubid = 0 +UNION ALL +SELECT + l.objoid, l.classoid, l.objsubid, + 'column'::text AS objtype, + rel.relnamespace AS objnamespace, + CASE WHEN pg_table_is_visible(rel.oid) + THEN quote_ident(rel.relname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(rel.relname) + END || '.' || att.attname AS objname, + l.provider, l.label +FROM + pg_seclabel l + JOIN pg_class rel ON l.classoid = rel.tableoid AND l.objoid = rel.oid + JOIN pg_attribute att + ON rel.oid = att.attrelid AND l.objsubid = att.attnum + JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid +WHERE + l.objsubid != 0 +UNION ALL +SELECT + l.objoid, l.classoid, l.objsubid, + CASE WHEN pro.proisagg = true THEN 'aggregate'::text + WHEN pro.proisagg = false THEN 'function'::text + END AS objtype, + pro.pronamespace AS objnamespace, + CASE WHEN pg_function_is_visible(pro.oid) + THEN quote_ident(pro.proname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(pro.proname) + END || '(' || pg_catalog.pg_get_function_arguments(pro.oid) || ')' AS objname, + l.provider, l.label +FROM + pg_seclabel l + JOIN pg_proc pro ON l.classoid = pro.tableoid AND l.objoid = pro.oid + JOIN pg_namespace nsp ON pro.pronamespace = nsp.oid +WHERE + l.objsubid = 0 +UNION ALL +SELECT + l.objoid, l.classoid, l.objsubid, + CASE WHEN typ.typtype = 'd' THEN 'domain'::text + ELSE 'type'::text END AS objtype, + typ.typnamespace AS objnamespace, + CASE WHEN pg_type_is_visible(typ.oid) + THEN quote_ident(typ.typname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(typ.typname) + END AS objname, + l.provider, l.label +FROM + pg_seclabel l + JOIN pg_type typ ON l.classoid = typ.tableoid AND l.objoid = typ.oid + JOIN pg_namespace nsp ON typ.typnamespace = nsp.oid +WHERE + l.objsubid = 0 +UNION ALL +SELECT + l.objoid, l.classoid, l.objsubid, + 'large object'::text AS objtype, + NULL::oid AS objnamespace, + l.objoid::text AS objname, + l.provider, l.label +FROM + pg_seclabel l + JOIN pg_largeobject_metadata lom ON l.objoid = lom.oid +WHERE + l.classoid = 'pg_catalog.pg_largeobject'::regclass AND l.objsubid = 0 +UNION ALL +SELECT + l.objoid, l.classoid, l.objsubid, + 'language'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident(lan.lanname) AS objname, + l.provider, l.label +FROM + pg_seclabel l + JOIN pg_language lan ON l.classoid = lan.tableoid AND l.objoid = lan.oid +WHERE + l.objsubid = 0 +UNION ALL +SELECT + l.objoid, l.classoid, l.objsubid, + 'schema'::text AS objtype, + nsp.oid AS objnamespace, + quote_ident(nsp.nspname) AS objname, + l.provider, l.label +FROM + pg_seclabel l + JOIN pg_namespace nsp ON l.classoid = nsp.tableoid AND l.objoid = nsp.oid +WHERE + l.objsubid = 0 +UNION ALL +SELECT + l.objoid, l.classoid, 0::int4 AS objsubid, + 'database'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident(dat.datname) AS objname, + l.provider, l.label +FROM + pg_shseclabel l + JOIN pg_database dat ON l.classoid = dat.tableoid AND l.objoid = dat.oid +UNION ALL +SELECT + l.objoid, l.classoid, 0::int4 AS objsubid, + 'tablespace'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident(spc.spcname) AS objname, + l.provider, l.label +FROM + pg_shseclabel l + JOIN pg_tablespace spc ON l.classoid = spc.tableoid AND l.objoid = spc.oid +UNION ALL +SELECT + l.objoid, l.classoid, 0::int4 AS objsubid, + 'role'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident(rol.rolname) AS objname, + l.provider, l.label +FROM + pg_shseclabel l + JOIN pg_authid rol ON l.classoid = rol.tableoid AND l.objoid = rol.oid; \ No newline at end of file diff --git a/src/include/catalog/upgrade_sql/open_gauss/upgrade_catalog_otherdb/upgrade_catalog_otherdb_92_200.sql b/src/include/catalog/upgrade_sql/open_gauss/upgrade_catalog_otherdb/upgrade_catalog_otherdb_92_200.sql index cc8a0f733..db77b8725 100644 --- a/src/include/catalog/upgrade_sql/open_gauss/upgrade_catalog_otherdb/upgrade_catalog_otherdb_92_200.sql +++ b/src/include/catalog/upgrade_sql/open_gauss/upgrade_catalog_otherdb/upgrade_catalog_otherdb_92_200.sql @@ -98,71 +98,6 @@ RETURNS BOOL LANGUAGE INTERNAL strict volatile as 'pgxc_unlock_for_transfer'; DROP FUNCTION IF EXISTS pg_catalog.table_skewness(text, OUT DNName text, OUT Num text, OUT Ratio text); DROP FUNCTION IF EXISTS pg_catalog.distributed_count(IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text); -CREATE OR REPLACE FUNCTION pg_catalog.distributed_count(IN _table_name text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - total_num bigint; - flag boolean; - special text := '[;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN _table_name, IN special; - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - RETURN; - END IF; - EXECUTE 'SELECT count(1) FROM ' || _table_name - INTO total_num; - - --Get the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node, pgxc_class where node_type IN (''C'', ''D'') AND is_oid_in_group_members(oid, nodeoids) AND - pcrelid=''' || _table_name || '''::regclass::oid'; - - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''select ''''DN_name'''' as dnname1, count(1) as count1 from ' || $1 || ''''; - - FOR row_data IN EXECUTE(query_str) LOOP - row_data.dnname1 := CASE - WHEN LENGTH(row_name.node_name)<20 - THEN row_name.node_name || right(' ',20-length(row_name.node_name)) - ELSE SUBSTR(row_name.node_name,1,20) - END; - DNName := row_data.dnname1; - Num := row_data.count1; - IF total_num = 0 THEN - Ratio := 0.000 ||'%'; - ELSE - Ratio := ROUND(row_data.count1/total_num*100,3) || '%'; - END IF; - RETURN next; - END LOOP; - END LOOP; - - RETURN; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -CREATE OR REPLACE FUNCTION pg_catalog.table_skewness(text, OUT DNName text, OUT Num text, OUT Ratio text) -RETURNS setof record -AS $$ -declare -flag boolean; -special text := '[;|-]'; - BEGIN - EXECUTE IMMEDIATE 'SELECT regexp_like(:1,:2);' INTO flag USING IN $1, IN special; - IF flag = true THEN - raise WARNING 'illegal character entered for function'; - return NEXT; - ELSE - RETURN QUERY EXECUTE 'SELECT * FROM distributed_count(''' || $1 || ''') ORDER BY num DESC, dnname'; - END IF; - END; $$ -LANGUAGE plpgsql NOT FENCED; - -- upgrade 3956 DROP FUNCTION IF EXISTS pg_catalog.threadpool_status; @@ -544,36 +479,6 @@ SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 4520; CREATE FUNCTION pg_catalog.gs_stat_activity_timeout(IN timeout_threshold int4, OUT datid oid, OUT pid INT8, OUT sessionid INT8, OUT usesysid oid, OUT application_name text, OUT query text, OUT xact_start timestamptz, OUT query_start timestamptz, OUT query_id INT8) RETURNS SETOF RECORD LANGUAGE INTERNAL as 'pg_stat_get_activity_timeout'; -CREATE OR REPLACE FUNCTION pg_catalog.global_stat_activity_timeout(in execute_time int4, out nodename text, out datid oid, out pid int8, out sessionid int8, out usesysid oid, out application_name text, out query text, out xact_start timestamptz, out query_start timestamptz, out query_id int8) -RETURNS setof record -AS $$ -DECLARE - query_str text; - node_data record; - row_data record; -BEGIN - --Get the node names of all CNs - query_str := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR node_data IN EXECUTE(query_str) LOOP - query_str := 'EXECUTE DIRECT ON (' || node_data.node_name || ') ''SELECT * FROM gs_stat_activity_timeout(' || execute_time || ')'''; - FOR row_data IN EXECUTE(query_str) LOOP - nodename := node_data.node_name; - datid := row_data.datid; - pid := row_data.pid; - sessionid := row_data.sessionid; - usesysid := row_data.usesysid; - application_name := row_data.application_name; - query := row_data.query; - xact_start := row_data.xact_start; - query_start := row_data.query_start; - query_id := row_data.query_id; - return next; - END LOOP; - END LOOP; - return; -END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - DROP VIEW IF EXISTS pg_catalog.pgxc_wlm_session_history CASCADE; DROP FUNCTION IF EXISTS pg_catalog.pgxc_get_wlm_session_history() CASCADE; DROP VIEW IF EXISTS pg_catalog.gs_wlm_session_history CASCADE; @@ -918,122 +823,6 @@ SELECT S.top_cpu_dn FROM pg_catalog.gs_wlm_session_info_all S; -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_history() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_catalog.gs_wlm_session_history'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - -CREATE VIEW pg_catalog.pgxc_wlm_session_history AS -SELECT * FROM pg_catalog.pgxc_get_wlm_session_history() AS -( -datid Oid, -dbname text, -schemaname text, -nodename text, -username text, -application_name text, -client_addr inet, -client_hostname text, -client_port int, -query_band text, -block_time bigint, -start_time timestamp with time zone, -finish_time timestamp with time zone, -duration bigint, -estimate_total_time bigint, -status text, -abort_info text, -resource_pool text, -control_group text, -estimate_memory int, -min_peak_memory int, -max_peak_memory int, -average_peak_memory int, -memory_skew_percent int, -spill_info text, -min_spill_size int, -max_spill_size int, -average_spill_size int, -spill_skew_percent int, -min_dn_time bigint, -max_dn_time bigint, -average_dn_time bigint, -dntime_skew_percent int, -min_cpu_time bigint, -max_cpu_time bigint, -total_cpu_time bigint, -cpu_skew_percent int, -min_peak_iops int, -max_peak_iops int, -average_peak_iops int, -iops_skew_percent int, -warning text, -queryid bigint, -query text, -query_plan text, -node_group text, -cpu_top1_node_name text, -cpu_top2_node_name text, -cpu_top3_node_name text, -cpu_top4_node_name text, -cpu_top5_node_name text, -mem_top1_node_name text, -mem_top2_node_name text, -mem_top3_node_name text, -mem_top4_node_name text, -mem_top5_node_name text, -cpu_top1_value bigint, -cpu_top2_value bigint, -cpu_top3_value bigint, -cpu_top4_value bigint, -cpu_top5_value bigint, -mem_top1_value bigint, -mem_top2_value bigint, -mem_top3_value bigint, -mem_top4_value bigint, -mem_top5_value bigint, -top_mem_dn text, -top_cpu_dn text -); - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_info() -RETURNS setof record -AS $$ -DECLARE - row_data record; - row_name record; - query_str text; - query_str_nodes text; - BEGIN - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM pg_catalog.gs_wlm_session_info'''; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - - CREATE OR REPLACE FUNCTION pg_catalog.create_wlm_session_info(IN flag int) RETURNS int AS $$ @@ -1055,115 +844,10 @@ DECLARE END; $$ LANGUAGE plpgsql NOT FENCED; -CREATE VIEW pg_catalog.pgxc_wlm_session_info AS -SELECT * FROM pg_catalog.pgxc_get_wlm_session_info() AS -( - datid Oid, - dbname text, - schemaname text, - nodename text, - username text, - application_name text, - client_addr inet, - client_hostname text, - client_port int, - query_band text, - block_time bigint, - start_time timestamp with time zone, - finish_time timestamp with time zone, - duration bigint, - estimate_total_time bigint, - status text, - abort_info text, - resource_pool text, - control_group text, - estimate_memory int, - min_peak_memory int, - max_peak_memory int, - average_peak_memory int, - memory_skew_percent int, - spill_info text, - min_spill_size int, - max_spill_size int, - average_spill_size int, - spill_skew_percent int, - min_dn_time bigint, - max_dn_time bigint, - average_dn_time bigint, - dntime_skew_percent int, - min_cpu_time bigint, - max_cpu_time bigint, - total_cpu_time bigint, - cpu_skew_percent int, - min_peak_iops int, - max_peak_iops int, - average_peak_iops int, - iops_skew_percent int, - warning text, - queryid bigint, - query text, - query_plan text, - node_group text, - cpu_top1_node_name text, - cpu_top2_node_name text, - cpu_top3_node_name text, - cpu_top4_node_name text, - cpu_top5_node_name text, - mem_top1_node_name text, - mem_top2_node_name text, - mem_top3_node_name text, - mem_top4_node_name text, - mem_top5_node_name text, - cpu_top1_value bigint, - cpu_top2_value bigint, - cpu_top3_value bigint, - cpu_top4_value bigint, - cpu_top5_value bigint, - mem_top1_value bigint, - mem_top2_value bigint, - mem_top3_value bigint, - mem_top4_value bigint, - mem_top5_value bigint, - top_mem_dn text, - top_cpu_dn text -); - -CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_wlm_session_info_bytime(text, TIMESTAMP, TIMESTAMP, int) -RETURNS setof pg_catalog.gs_wlm_session_info -AS $$ -DECLARE - row_data gs_wlm_session_info%rowtype; - row_name record; - query_str text; - query_str_nodes text; - query_str_cn text; - BEGIN - IF $1 IN ('start_time', 'finish_time') THEN - - ELSE - raise WARNING 'Illegal character entered for function, colname must be start_time or finish_time'; - return; - END IF; - - --Get all the node names - query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true'; - query_str_cn := 'SELECT * FROM pg_catalog.gs_wlm_session_info where '||$1||'>'''''||$2||''''' and '||$1||'<'''''||$3||''''' limit '||$4; - FOR row_name IN EXECUTE(query_str_nodes) LOOP - query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_cn||''';'; - FOR row_data IN EXECUTE(query_str) LOOP - return next row_data; - END LOOP; - END LOOP; - return; - END; $$ -LANGUAGE 'plpgsql' NOT FENCED; - GRANT SELECT ON TABLE pg_catalog.gs_wlm_session_query_info_all TO PUBLIC; GRANT SELECT ON TABLE pg_catalog.gs_wlm_session_history TO PUBLIC; GRANT SELECT ON TABLE pg_catalog.gs_wlm_session_info TO PUBLIC; GRANT SELECT ON TABLE pg_catalog.gs_wlm_session_info_all TO PUBLIC; -GRANT SELECT ON TABLE pg_catalog.pgxc_wlm_session_history TO PUBLIC; -GRANT SELECT ON TABLE pg_catalog.pgxc_wlm_session_info TO PUBLIC; DROP INDEX IF EXISTS pg_catalog.pg_asp_oid_index; DROP TYPE IF EXISTS pg_catalog.pg_asp; @@ -1399,25 +1083,8 @@ GRANT SELECT ON TABLE pg_catalog.gs_auditing_policy_privileges TO PUBLIC; GRANT SELECT ON TABLE pg_catalog.gs_auditing_access TO PUBLIC; GRANT SELECT ON TABLE pg_catalog.gs_auditing_privilege TO PUBLIC; GRANT SELECT ON TABLE pg_catalog.gs_auditing TO PUBLIC; - -DROP FUNCTION IF EXISTS dbms_job.isubmit_on_nodes(bigint, name, name, text, timestamp without time zone, text) cascade; -DROP FUNCTION IF EXISTS dbms_job.submit_on_nodes(name, name, text, timestamp without time zone, text, OUT integer) cascade; DROP FUNCTION IF EXISTS pg_catalog.capture_view_to_json(text, integer) cascade; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5717; -CREATE FUNCTION dbms_job.submit_on_nodes(node_name name, database name, what text, next_date timestamp without time zone, job_interval text, OUT job integer) - RETURNS integer - LANGUAGE internal - NOT FENCED NOT SHIPPABLE -AS 'submit_job_on_nodes'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5718; -CREATE FUNCTION dbms_job.isubmit_on_nodes(job bigint, node_name name, database name, what text, next_date timestamp without time zone, job_interval text) - RETURNS integer - LANGUAGE internal - NOT FENCED NOT SHIPPABLE -AS 'isubmit_job_on_nodes'; - SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 5719; CREATE FUNCTION pg_catalog.capture_view_to_json(view_name text, is_all_db integer) RETURNS integer @@ -1563,15 +1230,6 @@ SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 0, GRANT SELECT ON TABLE pg_catalog.streaming_stream TO PUBLIC; GRANT SELECT ON TABLE pg_catalog.streaming_cont_query TO PUBLIC; -DROP FUNCTION IF EXISTS dbms_job.isubmit_on_nodes_internal(bigint, name, name, text, timestamp without time zone, text) cascade; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 6007; -CREATE FUNCTION dbms_job.isubmit_on_nodes_internal(job bigint, node_name name, database name, what text, next_date timestamp without time zone, job_interval text) - RETURNS integer - LANGUAGE internal - NOT FENCED NOT SHIPPABLE -AS 'isubmit_job_on_nodes_internal'; - CREATE OR REPLACE FUNCTION pg_catalog.proc_add_depend( IN relationname name, IN dbname name @@ -1711,17 +1369,6 @@ DROP VIEW IF EXISTS pg_catalog.user_views CASCADE; drop view if exists pg_catalog.v$session CASCADE; drop view if exists pg_catalog.V$SESSION_LONGOPS CASCADE; -DROP FUNCTION IF EXISTS dbms_job.remove(bigint) cascade; -DROP FUNCTION IF EXISTS dbms_job.change(bigint, text, timestamp, text) cascade; -DROP FUNCTION IF EXISTS dbms_job.what(bigint, text) cascade; -DROP FUNCTION IF EXISTS dbms_job.next_date(bigint, timestamp) cascade; -DROP FUNCTION IF EXISTS dbms_job.interval(bigint, text) cascade; -DROP FUNCTION IF EXISTS dbms_job.broken(bigint, boolean, timestamp) cascade; -DROP FUNCTION IF EXISTS dbms_job.isubmit(bigint, text, timestamp, text) cascade; -DROP FUNCTION IF EXISTS dbms_job.submit(text, timestamp, text, out integer) cascade; -DROP FUNCTION IF EXISTS dbms_job.isubmit_on_nodes(bigint, name, name, text, timestamp without time zone, text) cascade; -DROP FUNCTION IF EXISTS dbms_job.submit_on_nodes(name, name, text, timestamp without time zone, text, OUT integer) cascade; -DROP FUNCTION IF EXISTS dbms_job.isubmit_on_nodes_internal(bigint, name, name, text, timestamp without time zone, text) cascade; DROP SCHEMA IF EXISTS dbms_job cascade; CREATE OR REPLACE VIEW pg_catalog.gs_wlm_user_session_info AS @@ -2142,84 +1789,6 @@ CREATE UNIQUE INDEX gs_asp_sample_time_index ON pg_catalog.gs_asp USING BTREE(sa GRANT SELECT ON pg_catalog.gs_asp TO PUBLIC; SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 0, 0, 0, 0; -DO $DO$ -DECLARE -ans boolean; -BEGIN - select case when count(*)=1 then true else false end as ans from (select nspname from pg_namespace where nspname='dbe_perf' limit 1) into ans; - if ans = true then -CREATE OR REPLACE FUNCTION DBE_PERF.get_global_gs_asp - (in start_ts timestamp without time zone, - in end_ts timestamp without time zone, - OUT node_name text, - OUT sampleid bigint, - OUT sample_time timestamp without time zone, - OUT need_flush_sample boolean, - OUT databaseid oid, - OUT thread_id bigint, - OUT sessionid bigint, - OUT start_time timestamp without time zone, - OUT event text, - OUT lwtid integer, - OUT psessionid bigint, - OUT tlevel integer, - OUT smpid integer, - OUT userid oid, - OUT application_name text, - OUT client_addr inet, - OUT client_hostname text, - OUT client_port integer, - OUT query_id bigint, - OUT unique_query_id bigint, - OUT user_id oid, - OUT cn_id integer, - OUT unique_query text) -RETURNS SETOF record -AS $$ -DECLARE - ROW_DATA pg_catalog.gs_asp%ROWTYPE; - ROW_NAME RECORD; - QUERY_STR TEXT; - QUERY_STR_NODES TEXT; - node_str TEXT; -BEGIN - QUERY_STR_NODES := 'SELECT NODE_NAME FROM PGXC_NODE WHERE NODE_TYPE IN (''C'', ''D'')'; - node_str := 'SELECT * FROM pg_catalog.gs_asp where sample_time > '''''||$1||''''' and sample_time < '''''||$2||''''; - FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP - QUERY_STR := 'EXECUTE DIRECT ON (' || ROW_NAME.NODE_NAME || ') '''|| node_str ||''''';'; - FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP - node_name := ROW_NAME.NODE_NAME; - sampleid := ROW_DATA.sampleid; - sample_time := ROW_DATA.sample_time; - need_flush_sample := ROW_DATA.need_flush_sample; - databaseid := ROW_DATA.databaseid; - thread_id := ROW_DATA.thread_id; - sessionid := ROW_DATA.sessionid; - start_time := ROW_DATA.start_time; - event := ROW_DATA.event; - lwtid := ROW_DATA.lwtid; - psessionid := ROW_DATA.psessionid; - tlevel := ROW_DATA.tlevel; - smpid := ROW_DATA.smpid; - userid := ROW_DATA.userid; - application_name := ROW_DATA.application_name; - client_addr := ROW_DATA.client_addr; - client_hostname := ROW_DATA.client_hostname; - client_port := ROW_DATA.client_port; - query_id := ROW_DATA.query_id; - unique_query_id := ROW_DATA.unique_query_id; - user_id := ROW_DATA.user_id; - cn_id := ROW_DATA.cn_id; - unique_query := ROW_DATA.unique_query; - RETURN NEXT; - END LOOP; - END LOOP; - RETURN; -END; $$ -LANGUAGE 'plpgsql'; - end if; -END$DO$; - -- use relfilenode to get schemane.tablename if the table is larger than threshold_size_gb CREATE OR REPLACE FUNCTION pg_catalog.get_large_table_name(relfile_node text, threshold_size_gb int8) RETURNS text @@ -2855,23 +2424,6 @@ DECLARE END; $$LANGUAGE plpgsql NOT FENCED; -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC,3466; -CREATE FUNCTION pg_catalog.check_engine_status(IN text, IN text) RETURNS text LANGUAGE INTERNAL STABLE STRICT as 'check_engine_status'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC,3467; -CREATE FUNCTION pg_catalog.encode_plan_node(IN text, IN text, IN text, IN text, IN int8, IN text, IN text) RETURNS text LANGUAGE INTERNAL STABLE as 'encode_plan_node'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC,3481; -CREATE FUNCTION pg_catalog.model_train_opt(IN text, IN text, OUT startup_time_accuracy FLOAT8, OUT total_time_accuracy FLOAT8, OUT rows_accuracy FLOAT8, OUT peak_memory_accuracy FLOAT8) RETURNS SETOF RECORD LANGUAGE INTERNAL STABLE ROWS 1 STRICT as 'model_train_opt'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC,5033; -CREATE FUNCTION pg_catalog.gs_stat_get_wlm_plan_operator_info(IN OID, OUT datname text, OUT queryid int8, OUT plan_node_id int4, OUT startup_time int8, OUT total_time int8, OUT actual_rows int8, OUT max_peak_memory int4, OUT query_dop int4, OUT parent_node_id int4, OUT left_child_id int4, OUT right_child_id int4, OUT operation text, OUT orientation text, OUT strategy text, OUT options text, OUT condition text, OUT projection text) RETURNS SETOF RECORD LANGUAGE INTERNAL STABLE ROWS 100 STRICT as 'gs_stat_get_wlm_plan_operator_info'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC,3468; -CREATE FUNCTION pg_catalog.track_model_train_opt(IN text, IN text) RETURNS text LANGUAGE INTERNAL STABLE STRICT as 'track_model_train_opt'; - -SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 0, 0, 0, 0; - SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 3442; DROP FUNCTION IF EXISTS pg_catalog.pg_control_checkpoint() CASCADE; DROP FUNCTION IF EXISTS pg_catalog.pg_control_system() CASCADE; From 0607e9952a1372196120d325ff4cfba3cb00894c Mon Sep 17 00:00:00 2001 From: dengxuyue Date: Wed, 30 Dec 2020 22:42:06 +0800 Subject: [PATCH 2/2] rectify jdk version --- src/gausskernel/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gausskernel/Makefile b/src/gausskernel/Makefile index 42a0710c1..584db058e 100644 --- a/src/gausskernel/Makefile +++ b/src/gausskernel/Makefile @@ -672,7 +672,7 @@ ifeq ($(enable_thread_check), yes) endif cp $(with_3rd)/buildtools/server_key/* '$(DESTDIR)$(bindir)/' endif - cp -r $(with_3rd)/platform/$(PLAT_FORM_STR)/openjdk8/jdk1.8.222/jre/* '$(DESTDIR)$(bindir)/../jre/' + cp -r $(with_3rd)/platform/$(PLAT_FORM_STR)/openjdk8/jdk1.8.0_222/jre/* '$(DESTDIR)$(bindir)/../jre/' cp $(PLJAVA_LIB_PATH)/* '$(DESTDIR)$(libdir)/' cp $(PLJAVA_JAR_PATH)/$(JARPLJAVA) '$(DESTDIR)$(pkglibdir)/java/'