From 78de8799bac296a6fcc4ec93b6c1d0817ef1c9f6 Mon Sep 17 00:00:00 2001 From: Leonid Fedorov <79837786+mariadb-LeonidFedorov@users.noreply.github.com> Date: Tue, 10 Jun 2025 14:34:38 +0400 Subject: [PATCH 01/79] chore(build): fix pipeline (#3590) --- build/bootstrap_mcs.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build/bootstrap_mcs.sh b/build/bootstrap_mcs.sh index dff4aea4d..8fe38dd36 100755 --- a/build/bootstrap_mcs.sh +++ b/build/bootstrap_mcs.sh @@ -742,8 +742,7 @@ if [[ $BUILD_PACKAGES = true ]]; then modify_packaging build_package message_splitted "PACKAGES BUILD FINISHED" - - return 0 + exit 0 fi stop_service From a0c861adbb28c1e1c599249c6e0941e3d42a7eb6 Mon Sep 17 00:00:00 2001 From: Leonid Fedorov Date: Tue, 10 Jun 2025 10:58:06 +0000 Subject: [PATCH 02/79] chore(install): no more deps for awk and ps for postinstall script --- .../columnstore-post-install.in | 375 ++++++++++-------- 1 file changed, 219 insertions(+), 156 deletions(-) diff --git a/oam/install_scripts/columnstore-post-install.in b/oam/install_scripts/columnstore-post-install.in index a25a2eccc..4f86eeb86 100755 --- a/oam/install_scripts/columnstore-post-install.in +++ b/oam/install_scripts/columnstore-post-install.in @@ -5,11 +5,76 @@ # Post-install steps for columnstore install running_systemd() { - if [ "$(ps --no-headers -o comm 1)" = "systemd" ]; then - echo 0 - else - echo 1 - fi + # Check if init process (PID 1) is systemd by reading /proc/1/comm + if [ -r "/proc/1/comm" ]; then + if [ "$(cat /proc/1/comm)" = "systemd" ]; then + echo 0 + return 0 + fi + fi + + # Alternative check using /proc/1/exe symlink + if [ -L "/proc/1/exe" ]; then + local exe_target + exe_target=$(readlink -f "/proc/1/exe") + if [[ "${exe_target##*/}" == "systemd" ]]; then + echo 0 + return 0 + fi + fi + + # Fallback check for systemd presence in /run/systemd + if [ -d "/run/systemd/system" ]; then + echo 0 + return 0 + fi + + echo 1 + return 1 +} + +get_parent_pid() { + local pid=$1 + local ppid + + # Read the stat file for the given PID + if [ -f "/proc/$pid/stat" ]; then + # Read the entire stat file into a variable + read -r stat <"/proc/$pid/stat" + + # Split into array (parent PID is the 4th field) + IFS=' ' read -ra stat_array <<<"$stat" + + # The PPID is the 4th element (0-based index 3) + ppid=${stat_array[3]} + + echo "$ppid" + return 0 + else + echo "Error: Process $pid does not exist" >&2 + return 1 + fi +} + +get_env_var_value() { + local pid=$1 + local var_name=$2 + local env_file="/proc/$pid/environ" + + if [ ! -r "$env_file" ]; then + echo "Error: Cannot read $env_file" >&2 + return 1 + fi + + # Read null-delimited environ file and process each line + while IFS= read -r -d '' line; do + if [[ "$line" == "${var_name}="* ]]; then + echo "${line#*=}" + return 0 + fi + done <"$env_file" + + return 1 } # This function recursively(up to PID 1) searches for @@ -18,67 +83,66 @@ find_env_var() { env_var_name=$1 pid=$$ ENV_VAR='' - while [ -z "$ENV_VAR" -a "$pid" != 1 ]; do - ppid=$(ps -oppid -p$pid|tail -1|awk '{print $1}') + while [ -z "$ENV_VAR" -a "$pid" != 1 ]; do + ppid=$(get_parent_pid $pid) # This condition is true in containers if [ "$ppid" == 0 ]; then - break; + break fi - env=$(strings /proc/$ppid/environ) - ENV_VAR=$(echo "$env"|awk -F= "\$1 == \"$env_var_name\" { print \$2; }") + ENV_VAR=$(get_env_var_value $ppid $env_var_name) pid=$ppid done echo $ENV_VAR } if [[ -f /etc/mysql/debian.cnf ]]; then - MDB="/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf" + MDB="/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf" else - MDB="/usr/bin/mysql" + MDB="/usr/bin/mysql" fi checkForError() { - # check for password error - grep "ERROR 1045" ${installLogDir}/mysql_install.log > ${installLogDir}/error.check - if [ `cat ${installLogDir}/error.check | wc -c` -ne 0 ]; then - echo "There were authentication issues running install_mcs_mysql.sh \ + # check for password error + grep "ERROR 1045" ${installLogDir}/mysql_install.log >${installLogDir}/error.check + if [ $(cat ${installLogDir}/error.check | wc -c) -ne 0 ]; then + echo "There were authentication issues running install_mcs_mysql.sh \ script. The log is available in ${installLogDir}/mysql_install.log. Please re-run \ columnstore-post-install manually after solving the authentication issues." - rm -f ${installLogDir}/error.check - return 2; - fi + rm -f ${installLogDir}/error.check + return 2 + fi - rm -f ${installLogDir}/error.check + rm -f ${installLogDir}/error.check - #--------------------------------------------------------------------------- - # See if engine columnstore exist - #--------------------------------------------------------------------------- - echo "checking for engine columnstore..." - $MDB --execute="show engines" 2> ${installLogDir}/post-mysql-install.log | grep -i columnstore >> ${installLogDir}/post-mysql-install.log 2>&1 + #--------------------------------------------------------------------------- + # See if engine columnstore exist + #--------------------------------------------------------------------------- + echo "checking for engine columnstore..." + $MDB --execute="show engines" 2>${installLogDir}/post-mysql-install.log | grep -i columnstore >>${installLogDir}/post-mysql-install.log 2>&1 - # - # Add compressiontype column to SYSCOLUMN if applicable - # - if [ $? -ne 0 ]; then - echo "columnstore doesn't exist" - return 1 - fi + # + # Add compressiontype column to SYSCOLUMN if applicable + # + if [ $? -ne 0 ]; then + echo "columnstore doesn't exist" + return 1 + fi - echo "columnstore exists" + echo "columnstore exists" - return 0; + return 0 } rpmmode=install -user=`whoami 2>/dev/null` +user=$(whoami 2>/dev/null) quiet=0 stop_mysqld=0 -if [ -z "$(pgrep -x mariadbd)" ];then +if [ -z "$(pgrep -x mariadbd)" ]; then # Startup mysqld - systemctl cat mariadb.service > /dev/null 2>&1 + systemctl cat mariadb.service >/dev/null 2>&1 if [ $? -eq 0 ] && [ $(running_systemd) -eq 0 ]; then systemctl start mariadb.service else @@ -107,12 +171,11 @@ if [ -f @ENGINE_SYSCONFDIR@/columnstore/Columnstore.xml.rpmsave ]; then fi touch /dev/shm/columnstore-test && rm /dev/shm/columnstore-test -if [ $? -ne 0 ] ; then +if [ $? -ne 0 ]; then echo "User $user will need R/W access to /dev/shm." exit 1 fi - profileFile="/etc/profile.d/columnstoreAlias.sh" /bin/cp -f @ENGINE_SUPPORTDIR@/columnstoreAlias /etc/profile.d/columnstoreAlias.sh chmod 644 /etc/profile.d/columnstoreAlias.sh >/dev/null 2>&1 @@ -124,7 +187,7 @@ test -d @ENGINE_LOGDIR@/trace || mkdir @ENGINE_LOGDIR@/trace >/dev/null 2>&1 test -d @ENGINE_LOGDIR@/cpimport || mkdir @ENGINE_LOGDIR@/cpimport >/dev/null 2>&1 test -d @ENGINE_LOGDIR@/install || mkdir @ENGINE_LOGDIR@/install >/dev/null 2>&1 test -h @ENGINE_LOGDIR@/data && rm -f @ENGINE_LOGDIR@/data -chmod 755 @ENGINE_LOGDIR@/corefiles > /dev/null 2>&1 +chmod 755 @ENGINE_LOGDIR@/corefiles >/dev/null 2>&1 chmod 777 @ENGINE_LOGDIR@/cpimport chmod 777 @ENGINE_LOGDIR@/install installLogDir=@ENGINE_LOGDIR@/install @@ -136,7 +199,7 @@ test -d @ENGINE_DATADIR@/data1/systemFiles/dataTransaction || rmdir @ENGINE_DATA test -d @ENGINE_DATADIR@/data1/systemFiles/dataTransaction/archive || rmdir @ENGINE_DATADIR@/data1/systemFiles/dataTransaction/archive >/dev/null 2>&1 chmod 1755 @ENGINE_DATADIR@/data1 >/dev/null 2>&1 chmod -R 1755 @ENGINE_DATADIR@/data1/systemFiles >/dev/null 2>&1 -chmod 1755 @ENGINE_SYSCONFDIR@/columnstore > /dev/null 2>&1 +chmod 1755 @ENGINE_SYSCONFDIR@/columnstore >/dev/null 2>&1 #create the bulk-load dirs mkdir -p @ENGINE_LOGDIR@/data/bulk/data/import >/dev/null 2>&1 @@ -147,28 +210,28 @@ rm -f @ENGINE_LOGDIR@/data/bulk/tmpjob/* >/dev/null 2>&1 chmod -R 777 @ENGINE_LOGDIR@/data #get columnstore temp file directory name -tmpDir=`@ENGINE_BINDIR@/mcsGetConfig SystemConfig SystemTempFileDir` -scratchDir=$tmpDir`@ENGINE_BINDIR@/mcsGetConfig SystemConfig hdfsRdwrScratch` +tmpDir=$(@ENGINE_BINDIR@/mcsGetConfig SystemConfig SystemTempFileDir) +scratchDir=$tmpDir$(@ENGINE_BINDIR@/mcsGetConfig SystemConfig hdfsRdwrScratch) mkdir $tmpDir >/dev/null 2>&1 mkdir $scratchDir >/dev/null 2>&1 chmod 777 $tmpDir chmod 777 $scratchDir #create mount directories -mkdir /mnt/tmp > /dev/null 2>&1 +mkdir /mnt/tmp >/dev/null 2>&1 if [ $user = "root" ]; then - #setup the columnstore service script + #setup the columnstore service script rm -f /etc/init.d/columnstore >/dev/null 2>&1 rm -f /etc/default/columnstore - systemctl=`which systemctl 2>/dev/null` + systemctl=$(which systemctl 2>/dev/null) if [ -n "$systemctl" ]; then # Removing a separate ExeMgr unit. - if [[ -f /usr/lib/systemd/system/mcs-exemgr.service ]]; then + if [[ -f /usr/lib/systemd/system/mcs-exemgr.service ]]; then rm -f /usr/lib/systemd/system/mcs-exemgr.service fi - if [[ -f /lib/systemd/system/mcs-exemgr.service ]]; then + if [[ -f /lib/systemd/system/mcs-exemgr.service ]]; then rm -f /lib/systemd/system/mcs-exemgr.service fi cp @ENGINE_SUPPORTDIR@/mariadb-columnstore.service /usr/lib/systemd/system/. >/dev/null 2>&1 @@ -181,7 +244,7 @@ if [ $user = "root" ]; then cp @ENGINE_SUPPORTDIR@/mcs-dmlproc.service /lib/systemd/system/. >/dev/null 2>&1 cp @ENGINE_SUPPORTDIR@/mcs-primproc.service /usr/lib/systemd/system/. >/dev/null 2>&1 cp @ENGINE_SUPPORTDIR@/mcs-primproc.service /lib/systemd/system/. >/dev/null 2>&1 - cp @ENGINE_SUPPORTDIR@/mcs-workernode.service /usr/lib/systemd/system/mcs-workernode@.service >/dev/null 2>&1 + cp @ENGINE_SUPPORTDIR@/mcs-workernode.service /usr/lib/systemd/system/mcs-workernode@.service >/dev/null 2>&1 cp @ENGINE_SUPPORTDIR@/mcs-workernode.service /lib/systemd/system/mcs-workernode@.service >/dev/null 2>&1 cp @ENGINE_SUPPORTDIR@/mcs-writeengineserver.service /usr/lib/systemd/system/. >/dev/null 2>&1 cp @ENGINE_SUPPORTDIR@/mcs-writeengineserver.service /lib/systemd/system/. >/dev/null 2>&1 @@ -190,27 +253,27 @@ if [ $user = "root" ]; then cp @ENGINE_SUPPORTDIR@/mcs-storagemanager.service /usr/lib/systemd/system/. >/dev/null 2>&1 cp @ENGINE_SUPPORTDIR@/mcs-storagemanager.service /lib/systemd/system/. >/dev/null 2>&1 systemctl enable mariadb-columnstore >/dev/null 2>&1 - systemctl enable mcs-controllernode > /dev/null 2>&1 - systemctl enable mcs-ddlproc > /dev/null 2>&1 - systemctl enable mcs-dmlproc > /dev/null 2>&1 - systemctl enable mcs-primproc > /dev/null 2>&1 - systemctl enable mcs-workernode@1 > /dev/null 2>&1 - systemctl enable mcs-writeengineserver > /dev/null 2>&1 - systemctl enable mcs-loadbrm > /dev/null 2>&1 - systemctl enable mcs-storagemanager > /dev/null 2>&1 + systemctl enable mcs-controllernode >/dev/null 2>&1 + systemctl enable mcs-ddlproc >/dev/null 2>&1 + systemctl enable mcs-dmlproc >/dev/null 2>&1 + systemctl enable mcs-primproc >/dev/null 2>&1 + systemctl enable mcs-workernode@1 >/dev/null 2>&1 + systemctl enable mcs-writeengineserver >/dev/null 2>&1 + systemctl enable mcs-loadbrm >/dev/null 2>&1 + systemctl enable mcs-storagemanager >/dev/null 2>&1 else - chkconfig=`which chkconfig 2>/dev/null` + chkconfig=$(which chkconfig 2>/dev/null) if [ -n "$chkconfig" ]; then cp @ENGINE_SBINDIR@/columnstore /etc/init.d/. >/dev/null 2>&1 - chkconfig --add columnstore > /dev/null 2>&1 - chkconfig columnstore on > /dev/null 2>&1 + chkconfig --add columnstore >/dev/null 2>&1 + chkconfig columnstore on >/dev/null 2>&1 else cp @ENGINE_SBINDIR@/columnstore /etc/init.d/. >/dev/null 2>&1 - updaterc=`which update-rc.d 2>/dev/null` + updaterc=$(which update-rc.d 2>/dev/null) if [ -n "$updaterc" ]; then - update-rc.d columnstore defaults 99 > /dev/null 2>&1 + update-rc.d columnstore defaults 99 >/dev/null 2>&1 else echo "" echo "Package 'systemctl', 'chkconfig' or 'update-rc.d' not installed, contact your sysadmin if you want to setup to autostart for columnstore" @@ -221,12 +284,12 @@ fi # upgrade the columnstore.cnf file if [ -f @MARIADB_MYCNFDIR@/columnstore.cnf.rpmsave ]; then - cp -f @MARIADB_MYCNFDIR@/columnstore.cnf @MARIADB_MYCNFDIR@/columnstore.cnf.new - cp -f @MARIADB_MYCNFDIR@/columnstore.cnf.rpmsave @MARIADB_MYCNFDIR@/columnstore.cnf + cp -f @MARIADB_MYCNFDIR@/columnstore.cnf @MARIADB_MYCNFDIR@/columnstore.cnf.new + cp -f @MARIADB_MYCNFDIR@/columnstore.cnf.rpmsave @MARIADB_MYCNFDIR@/columnstore.cnf fi if [ $user = "root" ]; then - @ENGINE_BINDIR@/columnstoreSyslogSetup.sh install > $installLogDir/syslog_install.log 2>&1 + @ENGINE_BINDIR@/columnstoreSyslogSetup.sh install >$installLogDir/syslog_install.log 2>&1 #check if MariaDB Columnstore system logging was setup cat $installLogDir/syslog_install.log | grep 'No System Logging' >/dev/null 2>&1 @@ -236,7 +299,7 @@ if [ $user = "root" ]; then else chown $user:$user @ENGINE_SYSCONFDIR@/columnstore/Columnstore.xml -cat < /dev/null 2>&1 +systemctl cat mariadb.service >/dev/null 2>&1 if [ $? -eq 0 ] && [ $(running_systemd) -eq 0 ]; then - systemctl restart mariadb.service > /dev/null 2>&1 + systemctl restart mariadb.service >/dev/null 2>&1 else - pkill mysqld > /dev/null 2>&1 - while [ -n "$(pgrep -x mysqld)" ] ; do + pkill mysqld >/dev/null 2>&1 + while [ -n "$(pgrep -x mysqld)" ]; do sleep 1 done /usr/bin/mysqld_safe & @@ -286,88 +349,88 @@ fi $MDB <@ENGINE_SUPPORTDIR@/syscatalog_mysql.sql 2>/dev/null if [ -z "$MCS_USE_S3_STORAGE" ]; then - MCS_USE_S3_STORAGE="$(find_env_var "MCS_USE_S3_STORAGE")" - MCS_S3_BUCKET="$(find_env_var "MCS_S3_BUCKET")" - MCS_S3_ENDPOINT="$(find_env_var "MCS_S3_ENDPOINT")" - MCS_S3_ACCESS_KEY_ID="$(find_env_var "MCS_S3_ACCESS_KEY_ID")" - MCS_S3_SECRET_ACCESS_KEY="$(find_env_var "MCS_S3_SECRET_ACCESS_KEY")" - MCS_S3_REGION="$(find_env_var "MCS_S3_REGION")" - MCS_S3_ROLE_NAME="$(find_env_var "MCS_S3_ROLE_NAME")" - MCS_S3_STS_REGION="$(find_env_var "MCS_S3_STS_REGION")" - MCS_S3_STS_ENDPOINT="$(find_env_var "MCS_S3_STS_ENDPOINT")" - MCS_S3_USE_HTTP="$(find_env_var "MCS_S3_USE_HTTP")" - MCS_S3_NO_SSL_VERIFY="$(find_env_var "MCS_S3_NO_SSL_VERIFY")" - MCS_S3_LIBS3_DEBUG="$(find_env_var "MCS_S3_LIBS3_DEBUG")" + MCS_USE_S3_STORAGE="$(find_env_var "MCS_USE_S3_STORAGE")" + MCS_S3_BUCKET="$(find_env_var "MCS_S3_BUCKET")" + MCS_S3_ENDPOINT="$(find_env_var "MCS_S3_ENDPOINT")" + MCS_S3_ACCESS_KEY_ID="$(find_env_var "MCS_S3_ACCESS_KEY_ID")" + MCS_S3_SECRET_ACCESS_KEY="$(find_env_var "MCS_S3_SECRET_ACCESS_KEY")" + MCS_S3_REGION="$(find_env_var "MCS_S3_REGION")" + MCS_S3_ROLE_NAME="$(find_env_var "MCS_S3_ROLE_NAME")" + MCS_S3_STS_REGION="$(find_env_var "MCS_S3_STS_REGION")" + MCS_S3_STS_ENDPOINT="$(find_env_var "MCS_S3_STS_ENDPOINT")" + MCS_S3_USE_HTTP="$(find_env_var "MCS_S3_USE_HTTP")" + MCS_S3_NO_SSL_VERIFY="$(find_env_var "MCS_S3_NO_SSL_VERIFY")" + MCS_S3_LIBS3_DEBUG="$(find_env_var "MCS_S3_LIBS3_DEBUG")" fi if [ ! -z "$MCS_USE_S3_STORAGE" ] && [ $MCS_USE_S3_STORAGE -eq 1 ]; then - if [ -z "$MCS_S3_BUCKET" ]; then - echo "Environment variable \$MCS_USE_S3_STORAGE is set but there is no \$MCS_S3_BUCKET." - fi - if [ -z "$MCS_S3_ACCESS_KEY_ID" ] && [ -z "$MCS_S3_ROLE_NAME" ]; then - echo "Environment variable \$MCS_USE_S3_STORAGE is set but there is no \$MCS_S3_ACCESS_KEY_ID." - fi - if [ -z "$MCS_S3_SECRET_ACCESS_KEY" ] && [ -z "$MCS_S3_ROLE_NAME" ]; then - echo "Environment variable \$MCS_USE_S3_STORAGE is set but there is no \$MCS_S3_SECRET_ACCESS_KEY." - fi - if [ -z "$MCS_S3_BUCKET" ] || [[ -z "$MCS_S3_ACCESS_KEY_ID" && -z "$MCS_S3_ROLE_NAME" ]] || [[ -z "$MCS_S3_SECRET_ACCESS_KEY" && -z "$MCS_S3_ROLE_NAME" ]]; then - echo "Using local storage." - @ENGINE_BINDIR@/mcsSetConfig -d Installation DBRootStorageType "storagemanager" - @ENGINE_BINDIR@/mcsSetConfig -d StorageManager Enabled "Y" - @ENGINE_BINDIR@/mcsSetConfig -d SystemConfig DataFilePlugin "libcloudio.so" - else - @ENGINE_BINDIR@/mcsSetConfig -d Installation DBRootStorageType "storagemanager" - @ENGINE_BINDIR@/mcsSetConfig -d StorageManager Enabled "Y" - @ENGINE_BINDIR@/mcsSetConfig -d SystemConfig DataFilePlugin "libcloudio.so" - sed -i "s|^service =.*|service = S3|" /etc/columnstore/storagemanager.cnf - if [ ! -z "$MCS_S3_REGION" ]; then - sed -i "s|^region =.*|region = $MCS_S3_REGION|" /etc/columnstore/storagemanager.cnf - fi - if [ ! -z "$MCS_S3_ROLE_NAME" ]; then - sed -i "s|^# iam_role_name =.*|iam_role_name = $MCS_S3_ROLE_NAME|" /etc/columnstore/storagemanager.cnf - fi - if [ ! -z "$MCS_S3_STS_REGION" ]; then - sed -i "s|^# sts_region =.*|sts_region = $MCS_S3_STS_REGION|" /etc/columnstore/storagemanager.cnf - fi - if [ ! -z "$MCS_S3_STS_ENDPOINT" ]; then - sed -i "s|^# sts_endpoint =.*|sts_endpoint = $MCS_S3_STS_ENDPOINT|" /etc/columnstore/storagemanager.cnf - fi - if [ ! -z "$MCS_S3_USE_HTTP" ]; then - sed -i "s|^# use_http =.*|use_http = enabled|" /etc/columnstore/storagemanager.cnf - fi - if [ ! -z "$MCS_S3_NO_SSL_VERIFY" ]; then - sed -i "s|^# ssl_verify =.*|ssl_verify = disabled|" /etc/columnstore/storagemanager.cnf - fi - if [ ! -z "$MCS_S3_LIBS3_DEBUG" ]; then - sed -i "s|^# libs3_debug =.*|libs3_debug = enabled|" /etc/columnstore/storagemanager.cnf - fi - sed -i "s|^bucket =.*|bucket = $MCS_S3_BUCKET|" /etc/columnstore/storagemanager.cnf - sed -i "s|^# endpoint =.*|endpoint = $MCS_S3_ENDPOINT|" /etc/columnstore/storagemanager.cnf - sed -i "s|^# aws_access_key_id =.*|aws_access_key_id = $MCS_S3_ACCESS_KEY_ID|" /etc/columnstore/storagemanager.cnf - sed -i "s|^# aws_secret_access_key =.*|aws_secret_access_key = $MCS_S3_SECRET_ACCESS_KEY|" /etc/columnstore/storagemanager.cnf - @ENGINE_BINDIR@/testS3Connection - if [ $? -ne 0 ]; then - sed -i "s|^iam_role_name =.*|# iam_role_name = |" /etc/columnstore/storagemanager.cnf - sed -i "s|^sts_region =.*|# sts_region = |" /etc/columnstore/storagemanager.cnf - sed -i "s|^sts_endpoint =.*|# sts_endpoint = |" /etc/columnstore/storagemanager.cnf - sed -i "s|^endpoint =.*|# endpoint = |" /etc/columnstore/storagemanager.cnf - sed -i "s|^aws_access_key_id =.*|# aws_access_key_id = |" /etc/columnstore/storagemanager.cnf - sed -i "s|^aws_secret_access_key =.*|# aws_secret_access_key = |" /etc/columnstore/storagemanager.cnf - echo "There was an error validating the settings used to access S3." - echo "The specified user or role must have GET, PUT, HEAD, and DELETE permissions to the bucket." - echo "Verify the following environment variables are correct:" - echo "MCS_S3_BUCKET" - echo "MCS_S3_ENDPOINT" - echo "MCS_S3_ACCESS_KEY_ID" - echo "MCS_S3_SECRET_ACCESS_KEY" - echo "MCS_S3_REGION" - echo "MCS_S3_ROLE_NAME (optional)" - echo "MCS_S3_STS_REGION (optional)" - echo "MCS_S3_STS_ENDPOINT (optional)" - echo "After environment variables are fixed, run command: columnstore-post-install" - exit 1 - fi - fi + if [ -z "$MCS_S3_BUCKET" ]; then + echo "Environment variable \$MCS_USE_S3_STORAGE is set but there is no \$MCS_S3_BUCKET." + fi + if [ -z "$MCS_S3_ACCESS_KEY_ID" ] && [ -z "$MCS_S3_ROLE_NAME" ]; then + echo "Environment variable \$MCS_USE_S3_STORAGE is set but there is no \$MCS_S3_ACCESS_KEY_ID." + fi + if [ -z "$MCS_S3_SECRET_ACCESS_KEY" ] && [ -z "$MCS_S3_ROLE_NAME" ]; then + echo "Environment variable \$MCS_USE_S3_STORAGE is set but there is no \$MCS_S3_SECRET_ACCESS_KEY." + fi + if [ -z "$MCS_S3_BUCKET" ] || [[ -z "$MCS_S3_ACCESS_KEY_ID" && -z "$MCS_S3_ROLE_NAME" ]] || [[ -z "$MCS_S3_SECRET_ACCESS_KEY" && -z "$MCS_S3_ROLE_NAME" ]]; then + echo "Using local storage." + @ENGINE_BINDIR@/mcsSetConfig -d Installation DBRootStorageType "storagemanager" + @ENGINE_BINDIR@/mcsSetConfig -d StorageManager Enabled "Y" + @ENGINE_BINDIR@/mcsSetConfig -d SystemConfig DataFilePlugin "libcloudio.so" + else + @ENGINE_BINDIR@/mcsSetConfig -d Installation DBRootStorageType "storagemanager" + @ENGINE_BINDIR@/mcsSetConfig -d StorageManager Enabled "Y" + @ENGINE_BINDIR@/mcsSetConfig -d SystemConfig DataFilePlugin "libcloudio.so" + sed -i "s|^service =.*|service = S3|" /etc/columnstore/storagemanager.cnf + if [ ! -z "$MCS_S3_REGION" ]; then + sed -i "s|^region =.*|region = $MCS_S3_REGION|" /etc/columnstore/storagemanager.cnf + fi + if [ ! -z "$MCS_S3_ROLE_NAME" ]; then + sed -i "s|^# iam_role_name =.*|iam_role_name = $MCS_S3_ROLE_NAME|" /etc/columnstore/storagemanager.cnf + fi + if [ ! -z "$MCS_S3_STS_REGION" ]; then + sed -i "s|^# sts_region =.*|sts_region = $MCS_S3_STS_REGION|" /etc/columnstore/storagemanager.cnf + fi + if [ ! -z "$MCS_S3_STS_ENDPOINT" ]; then + sed -i "s|^# sts_endpoint =.*|sts_endpoint = $MCS_S3_STS_ENDPOINT|" /etc/columnstore/storagemanager.cnf + fi + if [ ! -z "$MCS_S3_USE_HTTP" ]; then + sed -i "s|^# use_http =.*|use_http = enabled|" /etc/columnstore/storagemanager.cnf + fi + if [ ! -z "$MCS_S3_NO_SSL_VERIFY" ]; then + sed -i "s|^# ssl_verify =.*|ssl_verify = disabled|" /etc/columnstore/storagemanager.cnf + fi + if [ ! -z "$MCS_S3_LIBS3_DEBUG" ]; then + sed -i "s|^# libs3_debug =.*|libs3_debug = enabled|" /etc/columnstore/storagemanager.cnf + fi + sed -i "s|^bucket =.*|bucket = $MCS_S3_BUCKET|" /etc/columnstore/storagemanager.cnf + sed -i "s|^# endpoint =.*|endpoint = $MCS_S3_ENDPOINT|" /etc/columnstore/storagemanager.cnf + sed -i "s|^# aws_access_key_id =.*|aws_access_key_id = $MCS_S3_ACCESS_KEY_ID|" /etc/columnstore/storagemanager.cnf + sed -i "s|^# aws_secret_access_key =.*|aws_secret_access_key = $MCS_S3_SECRET_ACCESS_KEY|" /etc/columnstore/storagemanager.cnf + @ENGINE_BINDIR@/testS3Connection + if [ $? -ne 0 ]; then + sed -i "s|^iam_role_name =.*|# iam_role_name = |" /etc/columnstore/storagemanager.cnf + sed -i "s|^sts_region =.*|# sts_region = |" /etc/columnstore/storagemanager.cnf + sed -i "s|^sts_endpoint =.*|# sts_endpoint = |" /etc/columnstore/storagemanager.cnf + sed -i "s|^endpoint =.*|# endpoint = |" /etc/columnstore/storagemanager.cnf + sed -i "s|^aws_access_key_id =.*|# aws_access_key_id = |" /etc/columnstore/storagemanager.cnf + sed -i "s|^aws_secret_access_key =.*|# aws_secret_access_key = |" /etc/columnstore/storagemanager.cnf + echo "There was an error validating the settings used to access S3." + echo "The specified user or role must have GET, PUT, HEAD, and DELETE permissions to the bucket." + echo "Verify the following environment variables are correct:" + echo "MCS_S3_BUCKET" + echo "MCS_S3_ENDPOINT" + echo "MCS_S3_ACCESS_KEY_ID" + echo "MCS_S3_SECRET_ACCESS_KEY" + echo "MCS_S3_REGION" + echo "MCS_S3_ROLE_NAME (optional)" + echo "MCS_S3_STS_REGION (optional)" + echo "MCS_S3_STS_ENDPOINT (optional)" + echo "After environment variables are fixed, run command: columnstore-post-install" + exit 1 + fi + fi fi #change ownership/permissions to be able to run columnstore as non-root @@ -375,14 +438,14 @@ fi if [ $(running_systemd) -eq 0 ]; then chown -R @DEFAULT_USER@:@DEFAULT_GROUP@ @ENGINE_LOGDIR@ chown -R @DEFAULT_USER@:@DEFAULT_GROUP@ /etc/columnstore - findcmd=`which find 2>/dev/null` + findcmd=$(which find 2>/dev/null) if [ -n "$findcmd" ]; then if [[ $($findcmd @ENGINE_DATADIR@ -maxdepth 3 ! -user @DEFAULT_USER@ -exec echo {} \; -quit 2>/dev/null) ]]; then echo "At least one file is not owned by @DEFAULT_USER@ in @ENGINE_DATADIR@. Running chown..." chown -R @DEFAULT_USER@:@DEFAULT_GROUP@ @ENGINE_DATADIR@ else echo "Confirmed top @ENGINE_DATADIR@ folders owned by @DEFAULT_USER@" - fi + fi else chown -R @DEFAULT_USER@:@DEFAULT_GROUP@ @ENGINE_DATADIR@ fi @@ -390,7 +453,7 @@ if [ $(running_systemd) -eq 0 ]; then chmod 777 /dev/shm fi -systemctl cat mariadb-columnstore.service > /dev/null 2>&1 +systemctl cat mariadb-columnstore.service >/dev/null 2>&1 if [ $? -eq 0 ] && [ $(running_systemd) -eq 0 ]; then # mask mariadb-columnstore service to prevent starting services and dbbuilder @@ -421,13 +484,13 @@ if [ $? -eq 0 ] && [ $(running_systemd) -eq 0 ]; then flock -u "$fd_lock" fi -if [ $stop_mysqld -eq 1 ];then +if [ $stop_mysqld -eq 1 ]; then # Make sure we stop mariadb since it wasn't running prior to columnstore installation - systemctl cat mariadb.service > /dev/null 2>&1 + systemctl cat mariadb.service >/dev/null 2>&1 if [ $? -eq 0 ] && [ $(running_systemd) -eq 0 ]; then - systemctl stop mariadb.service > /dev/null 2>&1 + systemctl stop mariadb.service >/dev/null 2>&1 else - pkill mysqld > /dev/null 2>&1 + pkill mysqld >/dev/null 2>&1 fi fi From 576f4fb81cb9d48e9fed4ee2414f3deb112da6e5 Mon Sep 17 00:00:00 2001 From: Leonid Fedorov Date: Tue, 10 Jun 2025 11:32:01 +0000 Subject: [PATCH 03/79] chore(packaging): add requires of snappy, ps awk and jemalloc required --- CMakeLists.txt | 1 + cmake/cpack_manage.cmake | 33 +++++++++++++++++++++++++++++++++ debian/control | 1 + 3 files changed, 35 insertions(+) create mode 100644 cmake/cpack_manage.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 093fb1f93..ec22f91d0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,6 +47,7 @@ include(columnstore_version) include(configureEngine) include(compiler_flags) include(misc) +include(cpack_manage) set(COMPONENTS dbcon/mysql diff --git a/cmake/cpack_manage.cmake b/cmake/cpack_manage.cmake new file mode 100644 index 000000000..e463db9cf --- /dev/null +++ b/cmake/cpack_manage.cmake @@ -0,0 +1,33 @@ +macro(columnstore_append_for_cpack var_name) + # Get current value from parent scope or use empty string + if(DEFINED ${var_name}) + set(current_val "${${var_name}}") + else() + set(current_val "") + endif() + + # Process each argument to append + foreach(arg IN LISTS ARGN) + if(current_val) + # If not empty, add comma before new item + set(current_val "${current_val}, ${arg}") + else() + # If empty, just add the item + set(current_val "${arg}") + endif() + endforeach() + + # Set back in parent scope + set(${var_name} + "${current_val}" + PARENT_SCOPE + ) +endmacro() + +macro(columnstore_add_rpm_deps) + columnstore_append_for_cpack(CPACK_RPM_columnstore-engine_PACKAGE_REQUIRES ${ARGN}) +endmacro() + +if(RPM) + columnstore_add_rpm_deps("snappy" "jemalloc" "procps-ng" "gawk") +endif() diff --git a/debian/control b/debian/control index cbb11cea4..7bde08ee8 100644 --- a/debian/control +++ b/debian/control @@ -9,6 +9,7 @@ Depends: binutils, net-tools, python3, procps, + gawk, ${misc:Depends}, ${shlibs:Depends} Breaks: mariadb-columnstore-libs, From c4d60f66c4ddb20cad97e0897c2edad7178d3a6b Mon Sep 17 00:00:00 2001 From: drrtuy Date: Thu, 12 Jun 2025 17:23:46 +0000 Subject: [PATCH 04/79] fix(asan): fix ASAN warnings spoted --- versioning/BRM/slavecomm.cpp | 4 ++-- versioning/BRM/vbbm.cpp | 6 +++--- versioning/BRM/vss.cpp | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/versioning/BRM/slavecomm.cpp b/versioning/BRM/slavecomm.cpp index 27e0eece0..358ff5201 100644 --- a/versioning/BRM/slavecomm.cpp +++ b/versioning/BRM/slavecomm.cpp @@ -2116,8 +2116,8 @@ int SlaveComm::replayJournal(string prefix) const char* filename = fName.c_str(); - IDBDataFile* journalf = - IDBDataFile::open(IDBPolicy::getType(filename, IDBPolicy::WRITEENG), filename, "rb", 0); + std::unique_ptr journalf = + std::unique_ptr(IDBDataFile::open(IDBPolicy::getType(filename, IDBPolicy::WRITEENG), filename, "rb", 0)); if (!journalf) { diff --git a/versioning/BRM/vbbm.cpp b/versioning/BRM/vbbm.cpp index d490783eb..b485304e3 100644 --- a/versioning/BRM/vbbm.cpp +++ b/versioning/BRM/vbbm.cpp @@ -986,12 +986,12 @@ void VBBM::loadVersion2(IDBDataFile* in) } size_t readSize = vbbmEntries * sizeof(entry); - char* readBuf = new char[readSize]; + std::unique_ptr readBuf(new char[readSize]); size_t progress = 0; int err; while (progress < readSize) { - err = in->read(readBuf + progress, readSize - progress); + err = in->read(readBuf.get() + progress, readSize - progress); if (err < 0) { log_errno("VBBM::load()"); @@ -1005,7 +1005,7 @@ void VBBM::loadVersion2(IDBDataFile* in) progress += err; } - VBBMEntry* loadedEntries = (VBBMEntry*)readBuf; + VBBMEntry* loadedEntries = reinterpret_cast(readBuf.get()); for (i = 0; i < vbbmEntries; i++) insert(loadedEntries[i].lbid, loadedEntries[i].verID, loadedEntries[i].vbOID, loadedEntries[i].vbFBO, true); diff --git a/versioning/BRM/vss.cpp b/versioning/BRM/vss.cpp index 522fc378e..b437f670c 100644 --- a/versioning/BRM/vss.cpp +++ b/versioning/BRM/vss.cpp @@ -1402,12 +1402,12 @@ void VSS::load(string filename) */ size_t readSize = header.entries * sizeof(entry); - char* readBuf = new char[readSize]; + std::unique_ptr readBuf(new char[readSize]); size_t progress = 0; int err; while (progress < readSize) { - err = in->read(readBuf + progress, readSize - progress); + err = in->read(readBuf.get() + progress, readSize - progress); if (err < 0) { log_errno("VBBM::load()"); @@ -1421,7 +1421,7 @@ void VSS::load(string filename) progress += err; } - VSSEntry* loadedEntries = (VSSEntry*)readBuf; + VSSEntry* loadedEntries = reinterpret_cast(readBuf.get()); for (i = 0; i < header.entries; i++) insert(loadedEntries[i].lbid, loadedEntries[i].verID, loadedEntries[i].vbFlag, loadedEntries[i].locked, true); From a492d6604f916aca92103df53458693b3cd4af3f Mon Sep 17 00:00:00 2001 From: "aleksei.bukhalov" Date: Fri, 13 Jun 2025 15:09:03 +0200 Subject: [PATCH 05/79] chore(ci): downgrade amazon/aws-cli image in publish step to avoid awscli bug, set specific versions for some other images --- .drone.jsonnet | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.drone.jsonnet b/.drone.jsonnet index 0e10ea228..03be12ade 100644 --- a/.drone.jsonnet +++ b/.drone.jsonnet @@ -176,7 +176,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", publish(step_prefix="pkg", eventp=event + "/${DRONE_BUILD_NUMBER}"):: { name: "publish " + step_prefix, depends_on: [std.strReplace(step_prefix, " latest", ""), "createrepo"], - image: "amazon/aws-cli", + image: "amazon/aws-cli:2.23.5", when: { status: ["success", "failure"], }, @@ -271,7 +271,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", smoke:: { name: "smoke", depends_on: ["publish pkg"], - image: "docker", + image: "docker:28.2.2", volumes: [pipeline._volumes.mdb, pipeline._volumes.docker], commands: [ prepareTestStage(getContainerName("smoke"), result, true), @@ -281,7 +281,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", smokelog:: { name: "smokelog", depends_on: ["smoke"], - image: "docker", + image: "docker:28.2.2", volumes: [pipeline._volumes.docker, pipeline._volumes.mdb], commands: [ reportTestStage(getContainerName("smoke"), result, "smoke"), @@ -293,7 +293,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", upgrade(version):: { name: "upgrade-test from " + version, depends_on: ["regressionlog"], - image: "docker", + image: "docker:28.2.2", volumes: [pipeline._volumes.docker], environment: { UPGRADE_TOKEN: { @@ -314,7 +314,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", upgradelog:: { name: "upgradelog", depends_on: std.map(function(p) "upgrade-test from " + p, mdb_server_versions), - image: "docker", + image: "docker:28.2.2", volumes: [pipeline._volumes.docker, pipeline._volumes.mdb], commands: ["echo"] + @@ -377,7 +377,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", mtrlog:: { name: "mtrlog", depends_on: ["mtr"], - image: "docker", + image: "docker:28.2.2", volumes: [pipeline._volumes.docker, pipeline._volumes.mdb], commands: [ reportTestStage(getContainerName("mtr"), result, "mtr"), @@ -467,7 +467,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", regressionlog:: { name: "regressionlog", depends_on: [regression_tests[std.length(regression_tests) - 1]], - image: "docker", + image: "docker:28.2.2", volumes: [pipeline._volumes.docker, pipeline._volumes.mdb], commands: [ reportTestStage(getContainerName("regression"), result, "regression"), @@ -480,7 +480,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", name: "dockerfile", depends_on: ["publish pkg", "publish cmapi build"], //failure: 'ignore', - image: "alpine/git", + image: "alpine/git:2.49.0", environment: { DOCKER_BRANCH_REF: "${DRONE_SOURCE_BRANCH}", DOCKER_REF_AUX: branch_ref, @@ -554,7 +554,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", cmapilog:: { name: "cmapilog", depends_on: ["cmapi test"], - image: "docker", + image: "docker:28.2.2", volumes: [pipeline._volumes.docker, pipeline._volumes.mdb], commands: [ reportTestStage(getContainerName("cmapi"), result, "cmapi"), @@ -567,7 +567,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", name: "mtr", depends_on: ["dockerhub"], //failure: 'ignore', - image: "docker", + image: "docker:28.2.2", volumes: [pipeline._volumes.docker], environment: { DOCKER_LOGIN: { @@ -604,7 +604,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", steps: [ { name: "submodules", - image: "alpine/git", + image: "alpine/git:2.49.0", commands: [ "git submodule update --init --recursive", "git config cmake.update-submodules no", @@ -613,7 +613,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", }, { name: "clone-mdb", - image: "alpine/git", + image: "alpine/git:2.49.0", volumes: [pipeline._volumes.mdb], environment: { SERVER_REF: "${SERVER_REF:-" + server + "}", @@ -714,7 +714,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", { name: "pkg", depends_on: ["unittests"], - image: "alpine/git", + image: "alpine/git:2.49.0", when: { status: ["success", "failure"], }, From 92390896351c4796c0efb498744ceb6a24e854bf Mon Sep 17 00:00:00 2001 From: drrtuy Date: Mon, 16 Jun 2025 17:02:48 +0000 Subject: [PATCH 06/79] chore(bootstrap): do not replace MDB config --- build/bootstrap_mcs.sh | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/build/bootstrap_mcs.sh b/build/bootstrap_mcs.sh index 8fe38dd36..a82992c16 100755 --- a/build/bootstrap_mcs.sh +++ b/build/bootstrap_mcs.sh @@ -574,11 +574,15 @@ run_microbenchmarks_tests() { disable_plugins_for_bootstrap() { find /etc -type f -exec sed -i 's/plugin-load-add=auth_gssapi.so//g' {} + - find /etc -type f -exec sed -i 's/plugin-load-add=ha_columnstore.so//g' {} + + find /etc -type f -exec sed -i 's/plugin-load-add=ha_columnstore.so/#plugin-load-add=ha_columnstore.so/g' {} + } enable_columnstore_back() { - cp "$MDB_SOURCE_PATH"/storage/columnstore/columnstore/dbcon/mysql/columnstore.cnf $CONFIG_DIR + if [[ "$NO_CLEAN" == true ]]; then + find /etc -type f -exec sed -i 's/#plugin-load-add=ha_columnstore.so/plugin-load-add=ha_columnstore.so/g' {} + + else + cp "$MDB_SOURCE_PATH"/storage/columnstore/columnstore/dbcon/mysql/columnstore.cnf $CONFIG_DIR + fi } fix_config_files() { @@ -594,6 +598,7 @@ fix_config_files() { if grep -q thread_stack $COLUMNSTORE_CONFIG; then warn "MDB Server has thread_stack settings on $COLUMNSTORE_CONFIG check it's compatibility with ASAN" else + echo "" >>$COLUMNSTORE_CONFIG echo "thread_stack = ${THREAD_STACK_SIZE}" >>$COLUMNSTORE_CONFIG message "thread_stack was set to ${THREAD_STACK_SIZE} in $COLUMNSTORE_CONFIG" fi From 97c6ceabe9a37a4eba9de6a1213318d5ccd57001 Mon Sep 17 00:00:00 2001 From: drrtuy Date: Mon, 16 Jun 2025 17:03:16 +0000 Subject: [PATCH 07/79] chore(ASAN): fix ASAN ODR warning introduced recently --- utils/common/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/common/CMakeLists.txt b/utils/common/CMakeLists.txt index 2f7aa2bc9..dc19cd77d 100644 --- a/utils/common/CMakeLists.txt +++ b/utils/common/CMakeLists.txt @@ -15,4 +15,4 @@ set(common_LIB_SRCS ) columnstore_library(common ${common_LIB_SRCS}) -columnstore_link(common boost_filesystem configcpp loggingcpp messageqcpp ${MARIADB_STRING_LIBS}) +columnstore_link(common boost_filesystem configcpp loggingcpp messageqcpp) From 2ba31d124075dbc68df777b4b77c075aad3dcbe3 Mon Sep 17 00:00:00 2001 From: "aleksei.bukhalov" Date: Wed, 28 May 2025 18:00:00 +0200 Subject: [PATCH 08/79] MCOL-6022 mtr running from mariadb-test package --- .drone.jsonnet | 33 +++---------------- build/prepare_test_stage.sh | 2 +- build/run_mtr.sh | 64 +++++++++++++++++++++++++++++++++++++ tests/scripts/fullmtr.sh | 2 +- 4 files changed, 71 insertions(+), 30 deletions(-) create mode 100755 build/run_mtr.sh diff --git a/.drone.jsonnet b/.drone.jsonnet index 03be12ade..9369691e1 100644 --- a/.drone.jsonnet +++ b/.drone.jsonnet @@ -342,36 +342,13 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", }, commands: [ prepareTestStage(getContainerName("mtr"), result, true), - "docker cp mysql-test/columnstore mtr$${DRONE_BUILD_NUMBER}:" + mtr_path + "/suite/", - execInnerDocker("chown -R mysql:mysql " + mtr_path, getContainerName("mtr")), - // disable systemd 'ProtectSystem' (we need to write to /usr/share/) - execInnerDocker("bash -c 'sed -i /ProtectSystem/d $(systemctl show --property FragmentPath mariadb | sed s/FragmentPath=//)'", getContainerName("mtr")), - execInnerDocker("systemctl daemon-reload", getContainerName("mtr")), - execInnerDocker("systemctl start mariadb", getContainerName("mtr")), - // Set RAM consumption limits to avoid RAM contention b/w mtr and regression steps. - execInnerDocker("/usr/bin/mcsSetConfig SystemConfig CGroup just_no_group_use_local", getContainerName("mtr")), - execInnerDocker('mariadb -e "create database if not exists test;"', getContainerName("mtr")), - execInnerDocker("systemctl restart mariadb-columnstore", getContainerName("mtr")), - - // delay mtr for manual debugging on live instance - "sleep $${MTR_DELAY_SECONDS:-1s}", 'MTR_SUITE_LIST=$([ "$MTR_FULL_SUITE" == true ] && echo "' + mtr_full_set + '" || echo "$MTR_SUITE_LIST")', - if (event == "custom" || event == "cron") then - execInnerDocker('bash -c "wget -qO- https://cspkg.s3.amazonaws.com/mtr-test-data.tar.lz4 | lz4 -dc - | tar xf - -C /"', - getContainerName("mtr")), - if (event == "custom" || event == "cron") then - execInnerDocker('bash -c "cd ' + mtr_path + " && ./mtr --extern socket=" + socket_path + ' --force --print-core=detailed --print-method=gdb --max-test-fail=0 --suite=columnstore/setup"', - getContainerName("mtr")), - if (event == "cron") then - execInnerDocker('bash -c "cd ' + mtr_path + " && ./mtr --extern socket=" + socket_path + - " --force --print-core=detailed --print-method=gdb --max-test-fail=0 --suite=" - + std.join(",", std.map(function(x) "columnstore/" + x, std.split(mtr_full_set, ","))), - getContainerName("mtr")) + '"' - else - execInnerDocker('bash -c "cd ' + mtr_path + " && ./mtr --extern socket=" + socket_path + - ' --force --print-core=detailed --print-method=gdb --max-test-fail=0 --suite=columnstore/$${MTR_SUITE_LIST//,/,columnstore/}"', - getContainerName("mtr")), + 'bash /mdb/' + builddir + '/storage/columnstore/columnstore/build/run_mtr.sh' + + ' --container-name ' + getContainerName("mtr") + + ' --distro ' + platform + + ' --suite-list $${MTR_SUITE_LIST}' + + ' --triggering-event ' + event, ], }, mtrlog:: { diff --git a/build/prepare_test_stage.sh b/build/prepare_test_stage.sh index 5266c5511..11a6eeeec 100755 --- a/build/prepare_test_stage.sh +++ b/build/prepare_test_stage.sh @@ -118,7 +118,7 @@ echo "Installing columnstore..." if [[ "$RESULT" == *rocky* ]]; then execInnerDockerWithRetry "$CONTAINER_NAME" 'yum install -y MariaDB-columnstore-engine MariaDB-test' else - execInnerDockerWithRetry "$CONTAINER_NAME" 'apt update -y && apt install -y mariadb-plugin-columnstore mariadb-test' + execInnerDockerWithRetry "$CONTAINER_NAME" 'apt update -y && apt install -y mariadb-plugin-columnstore mariadb-test mariadb-test-data' fi sleep 5 diff --git a/build/run_mtr.sh b/build/run_mtr.sh new file mode 100755 index 000000000..52c8d533b --- /dev/null +++ b/build/run_mtr.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +set -eo pipefail + +SCRIPT_LOCATION=$(dirname "$0") +source "$SCRIPT_LOCATION"/utils.sh + +optparse.define short=c long=container-name desc="Name of the Docker container where mtr tests will run" variable=CONTAINER_NAME +optparse.define short=d long=distro desc="Linux distro for which mtr is runned" variable=DISTRO +optparse.define short=s long=suite-list desc="Comma-separated list of test suites to run" variable=MTR_SUITE_LIST +optparse.define short=e long=triggering-event desc="Event that triggers testrun" variable=EVENT +source $(optparse.build) + +MTR_FULL_SET="basic,bugfixes,devregression,autopilot,extended,multinode,oracle,1pmonly" + +echo "Arguments received: $@" + +if [[ "$EUID" -ne 0 ]]; then + error "Please run script as root" + exit 1 +fi + +if [[ -z "${CONTAINER_NAME}" ]]; then + echo "Please provide mtr container name as a parameter, e.g. ./run_mtr.sh -c mtr183" + exit 1 +fi + +if [[ -z $(docker ps -q --filter "name=${CONTAINER_NAME}") ]]; then + error "Container '${CONTAINER_NAME}' is not running." + exit 1 +fi + +if [[ "$DISTRO" == *rocky* ]]; then + SOCKET_PATH="/var/lib/mysql/mysql.sock" + MTR_PATH="/usr/share/mysql-test" +else + SOCKET_PATH="/run/mysqld/mysqld.sock" + MTR_PATH="/usr/share/mysql/mysql-test" +fi + +message "Running mtr tests..." + +execInnerDocker "${CONTAINER_NAME}" "chown -R mysql:mysql ${MTR_PATH}" + +# disable systemd 'ProtectSystem' (we need to write to /usr/share/) +execInnerDocker "${CONTAINER_NAME}" "sed -i /ProtectSystem/d \$(systemctl show --property FragmentPath mariadb | sed s/FragmentPath=//) || true" +execInnerDocker "${CONTAINER_NAME}" "systemctl daemon-reload" +execInnerDocker "${CONTAINER_NAME}" "systemctl start mariadb" + +# Set RAM consumption limits to avoid RAM contention b/w mtr and regression steps. +execInnerDocker "${CONTAINER_NAME}" "/usr/bin/mcsSetConfig SystemConfig CGroup just_no_group_use_local" +execInnerDocker "${CONTAINER_NAME}" "mariadb -e \"create database if not exists test;\"" +execInnerDocker "${CONTAINER_NAME}" "systemctl restart mariadb-columnstore" + +if [[ "${EVENT}" == "custom" || "${EVENT}" == "cron" ]]; then + execInnerDocker "${CONTAINER_NAME}" "cd ${MTR_PATH} && ./mtr --extern socket=${SOCKET_PATH} --force --print-core=detailed --print-method=gdb --max-test-fail=0 --suite=columnstore/setup" + execInnerDocker "${CONTAINER_NAME}" "wget -qO- https://cspkg.s3.amazonaws.com/mtr-test-data.tar.lz4 | lz4 -dc - | tar xf - -C /" +fi + +if [[ "${EVENT}" == "cron" ]]; then + execInnerDocker "${CONTAINER_NAME}" "cd ${MTR_PATH} && ./mtr --extern socket=${SOCKET_PATH} --force --print-core=detailed --print-method=gdb --max-test-fail=0 --suite=columnstore/${MTR_FULL_SET//,/,columnstore/}" +else + execInnerDocker "${CONTAINER_NAME}" "cd ${MTR_PATH} && ./mtr --extern socket=${SOCKET_PATH} --force --print-core=detailed --print-method=gdb --max-test-fail=0 --suite=columnstore/${MTR_SUITE_LIST//,/,columnstore/}" +fi \ No newline at end of file diff --git a/tests/scripts/fullmtr.sh b/tests/scripts/fullmtr.sh index 3f8d86adf..7ca3a4558 100644 --- a/tests/scripts/fullmtr.sh +++ b/tests/scripts/fullmtr.sh @@ -4,7 +4,7 @@ SCRIPT_LOCATION=$(dirname "$0") MARIADB_SOURCE_PATH=$(realpath $SCRIPT_LOCATION/../../../../../) COLUMNSTORE_MTR_SOURCE=$(realpath $SCRIPT_LOCATION/../../mysql-test/columnstore) INSTALLED_MTR_PATH='/usr/share/mysql/mysql-test' -COLUMSNTORE_MTR_INSTALLED=${INSTALLED_MTR_PATH}/suite/columnstore +COLUMSNTORE_MTR_INSTALLED=${INSTALLED_MTR_PATH}/plugin/columnstore/columnstore/ PATCHNAME=$(realpath $SCRIPT_LOCATION)/mtr_warn.patch CURRENT_DIR=`pwd` mysql -e "create database if not exists test;" From 780e34680fe7b2758563bb8817e8ccae2c7feef6 Mon Sep 17 00:00:00 2001 From: "aleksei.bukhalov" Date: Mon, 16 Jun 2025 15:57:33 +0200 Subject: [PATCH 09/79] MCOL-6022 fix unstable mtrs --- .../columnstore/basic/r/mcol-5005.result | 3 ++- .../columnstore/basic/r/mcol641-create.result | 24 +++++++++++++++++-- .../r/mcs229_data_compression_type.result | 8 +++---- mysql-test/columnstore/basic/t/mcol-5005.test | 3 ++- .../columnstore/basic/t/mcol641-create.test | 24 +++++++++++++++++-- .../basic/t/mcs229_data_compression_type.test | 2 +- 6 files changed, 53 insertions(+), 11 deletions(-) diff --git a/mysql-test/columnstore/basic/r/mcol-5005.result b/mysql-test/columnstore/basic/r/mcol-5005.result index 19a5b7a3e..e70fa3623 100644 --- a/mysql-test/columnstore/basic/r/mcol-5005.result +++ b/mysql-test/columnstore/basic/r/mcol-5005.result @@ -58,7 +58,8 @@ t4 CREATE TABLE `t4` ( `a` varchar(15) DEFAULT NULL ) ENGINE=Columnstore DEFAULT CHARSET=latin2 COLLATE=latin2_general_ci SELECT `schema`, tablename, columnname, charsetnum FROM calpontsys.syscolumn -WHERE `schema`='mcol5005' AND tablename in ('t1', 't2', 't3', 't4'); +WHERE `schema`='mcol5005' AND tablename in ('t1', 't2', 't3', 't4') +ORDER BY tablename, columnname, charsetnum; schema tablename columnname charsetnum mcol5005 t1 a 227 mcol5005 t1 b 33 diff --git a/mysql-test/columnstore/basic/r/mcol641-create.result b/mysql-test/columnstore/basic/r/mcol641-create.result index 50560b968..52e1ef005 100644 --- a/mysql-test/columnstore/basic/r/mcol641-create.result +++ b/mysql-test/columnstore/basic/r/mcol641-create.result @@ -11,7 +11,17 @@ CREATE TABLE cs3(d1 DECIMAL(38) UNSIGNED ZEROFILL, d2 DECIMAL(38,10) UNSIGNED ZE Warnings: Warning 1618 ZEROFILL is ignored in ColumnStore CREATE TABLE cs4(d1 DECIMAL(18), d2 DECIMAL(18,10), d3 DECIMAL(18,18)) ENGINE=columnstore; -SELECT TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,DATA_TYPE,COLUMN_LENGTH,COLUMN_POSITION,COLUMN_DEFAULT,NUMERIC_PRECISION,NUMERIC_SCALE FROM information_schema.columnstore_columns WHERE table_name = 'cs1' OR table_name = 'cs2' OR table_name = 'cs3' OR table_name = 'cs4' ORDER BY table_name,column_name ASC; +SELECT TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,DATA_TYPE,COLUMN_LENGTH,COLUMN_POSITION,COLUMN_DEFAULT,NUMERIC_PRECISION,NUMERIC_SCALE FROM information_schema.columnstore_columns WHERE table_name = 'cs1' OR table_name = 'cs2' OR table_name = 'cs3' OR table_name = 'cs4' +ORDER BY +TABLE_SCHEMA, +TABLE_NAME, +COLUMN_NAME, +DATA_TYPE, +COLUMN_LENGTH, +COLUMN_POSITION, +COLUMN_DEFAULT, +NUMERIC_PRECISION, +NUMERIC_SCALE; TABLE_SCHEMA TABLE_NAME COLUMN_NAME DATA_TYPE COLUMN_LENGTH COLUMN_POSITION COLUMN_DEFAULT NUMERIC_PRECISION NUMERIC_SCALE test_mcol641_create cs1 d1 decimal 16 0 NULL 38 0 test_mcol641_create cs1 d2 decimal 16 1 NULL 38 10 @@ -40,7 +50,17 @@ ALTER TABLE cs2 ADD COLUMN (d5 DECIMAL(38,5), d6 DECIMAL(35,15)); ERROR 42000: The storage engine for the table doesn't support Multiple actions in alter table statement is currently not supported by Columnstore. ALTER TABLE cs3 MODIFY d1 DECIMAL(38) SIGNED; ERROR HY000: Internal error: CAL0001: Alter table Failed: Altertable: Error in the action type -SELECT TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,DATA_TYPE,COLUMN_LENGTH,COLUMN_POSITION,COLUMN_DEFAULT,NUMERIC_PRECISION,NUMERIC_SCALE FROM information_schema.columnstore_columns WHERE table_schema = 'test_mcol641_create' ORDER BY table_name,column_name ASC; +SELECT TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,DATA_TYPE,COLUMN_LENGTH,COLUMN_POSITION,COLUMN_DEFAULT,NUMERIC_PRECISION,NUMERIC_SCALE FROM information_schema.columnstore_columns WHERE table_schema = 'test_mcol641_create' +ORDER BY +TABLE_SCHEMA, +TABLE_NAME, +COLUMN_NAME, +DATA_TYPE, +COLUMN_LENGTH, +COLUMN_POSITION, +COLUMN_DEFAULT, +NUMERIC_PRECISION, +NUMERIC_SCALE; TABLE_SCHEMA TABLE_NAME COLUMN_NAME DATA_TYPE COLUMN_LENGTH COLUMN_POSITION COLUMN_DEFAULT NUMERIC_PRECISION NUMERIC_SCALE test_mcol641_create cs1 d1 decimal 16 0 NULL 38 0 test_mcol641_create cs1 d2 decimal 16 1 NULL 38 10 diff --git a/mysql-test/columnstore/basic/r/mcs229_data_compression_type.result b/mysql-test/columnstore/basic/r/mcs229_data_compression_type.result index 2b54b6977..b9803b8cf 100644 --- a/mysql-test/columnstore/basic/r/mcs229_data_compression_type.result +++ b/mysql-test/columnstore/basic/r/mcs229_data_compression_type.result @@ -37,16 +37,16 @@ t2 CREATE TABLE `t2` ( `t2_DATE` date DEFAULT NULL, `t2_TIME` time DEFAULT NULL ) ENGINE=Columnstore DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci -SELECT `schema`, tablename, columnname, compressiontype FROM calpontsys.syscolumn WHERE `schema`='mcs229_db' ORDER BY 2; +SELECT `schema`, tablename, columnname, compressiontype FROM calpontsys.syscolumn WHERE `schema`='mcs229_db' ORDER BY 2,3,4; schema tablename columnname compressiontype +mcs229_db t1 t1_date 2 +mcs229_db t1 t1_decimal 2 mcs229_db t1 t1_int 2 mcs229_db t1 t1_text 2 -mcs229_db t1 t1_date 2 mcs229_db t1 t1_time 2 -mcs229_db t1 t1_decimal 2 mcs229_db t2 t2_date 2 +mcs229_db t2 t2_decimal 2 mcs229_db t2 t2_int 2 mcs229_db t2 t2_text 2 mcs229_db t2 t2_time 2 -mcs229_db t2 t2_decimal 2 DROP DATABASE mcs229_db; diff --git a/mysql-test/columnstore/basic/t/mcol-5005.test b/mysql-test/columnstore/basic/t/mcol-5005.test index 1cbca1eb1..988a4ab16 100644 --- a/mysql-test/columnstore/basic/t/mcol-5005.test +++ b/mysql-test/columnstore/basic/t/mcol-5005.test @@ -52,7 +52,8 @@ SHOW CREATE TABLE t3; SHOW CREATE TABLE t4; SELECT `schema`, tablename, columnname, charsetnum FROM calpontsys.syscolumn -WHERE `schema`='mcol5005' AND tablename in ('t1', 't2', 't3', 't4'); +WHERE `schema`='mcol5005' AND tablename in ('t1', 't2', 't3', 't4') +ORDER BY tablename, columnname, charsetnum; DROP DATABASE mcol5005; diff --git a/mysql-test/columnstore/basic/t/mcol641-create.test b/mysql-test/columnstore/basic/t/mcol641-create.test index 89b6c1f25..ee1f23e35 100644 --- a/mysql-test/columnstore/basic/t/mcol641-create.test +++ b/mysql-test/columnstore/basic/t/mcol641-create.test @@ -19,7 +19,17 @@ CREATE TABLE cs2(d1 DECIMAL(38) SIGNED, d2 DECIMAL(38,10) SIGNED, d3 DECIMAL(38, #This must raise a warning CREATE TABLE cs3(d1 DECIMAL(38) UNSIGNED ZEROFILL, d2 DECIMAL(38,10) UNSIGNED ZEROFILL, d3 DECIMAL(38,38) UNSIGNED ZEROFILL) ENGINE=columnstore; CREATE TABLE cs4(d1 DECIMAL(18), d2 DECIMAL(18,10), d3 DECIMAL(18,18)) ENGINE=columnstore; -SELECT TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,DATA_TYPE,COLUMN_LENGTH,COLUMN_POSITION,COLUMN_DEFAULT,NUMERIC_PRECISION,NUMERIC_SCALE FROM information_schema.columnstore_columns WHERE table_name = 'cs1' OR table_name = 'cs2' OR table_name = 'cs3' OR table_name = 'cs4' ORDER BY table_name,column_name ASC; +SELECT TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,DATA_TYPE,COLUMN_LENGTH,COLUMN_POSITION,COLUMN_DEFAULT,NUMERIC_PRECISION,NUMERIC_SCALE FROM information_schema.columnstore_columns WHERE table_name = 'cs1' OR table_name = 'cs2' OR table_name = 'cs3' OR table_name = 'cs4' +ORDER BY +TABLE_SCHEMA, +TABLE_NAME, +COLUMN_NAME, +DATA_TYPE, +COLUMN_LENGTH, +COLUMN_POSITION, +COLUMN_DEFAULT, +NUMERIC_PRECISION, +NUMERIC_SCALE; ALTER TABLE cs1 DROP COLUMN d4; ALTER TABLE cs1 ADD COLUMN d7 DECIMAL(38,37); @@ -34,7 +44,17 @@ ALTER TABLE cs2 ADD COLUMN (d5 DECIMAL(38,5), d6 DECIMAL(35,15)); # Bug. This must work fine. --error 1815 ALTER TABLE cs3 MODIFY d1 DECIMAL(38) SIGNED; -SELECT TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,DATA_TYPE,COLUMN_LENGTH,COLUMN_POSITION,COLUMN_DEFAULT,NUMERIC_PRECISION,NUMERIC_SCALE FROM information_schema.columnstore_columns WHERE table_schema = 'test_mcol641_create' ORDER BY table_name,column_name ASC; +SELECT TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,DATA_TYPE,COLUMN_LENGTH,COLUMN_POSITION,COLUMN_DEFAULT,NUMERIC_PRECISION,NUMERIC_SCALE FROM information_schema.columnstore_columns WHERE table_schema = 'test_mcol641_create' +ORDER BY +TABLE_SCHEMA, +TABLE_NAME, +COLUMN_NAME, +DATA_TYPE, +COLUMN_LENGTH, +COLUMN_POSITION, +COLUMN_DEFAULT, +NUMERIC_PRECISION, +NUMERIC_SCALE; # This must return an error --error 1815 diff --git a/mysql-test/columnstore/basic/t/mcs229_data_compression_type.test b/mysql-test/columnstore/basic/t/mcs229_data_compression_type.test index b3af73432..3737eaa68 100644 --- a/mysql-test/columnstore/basic/t/mcs229_data_compression_type.test +++ b/mysql-test/columnstore/basic/t/mcs229_data_compression_type.test @@ -49,7 +49,7 @@ CREATE TABLE t2 --replace_regex /( COLLATE=latin1_swedish_ci)// SHOW CREATE TABLE t2; -SELECT `schema`, tablename, columnname, compressiontype FROM calpontsys.syscolumn WHERE `schema`='mcs229_db' ORDER BY 2; +SELECT `schema`, tablename, columnname, compressiontype FROM calpontsys.syscolumn WHERE `schema`='mcs229_db' ORDER BY 2,3,4; # Clean UP DROP DATABASE mcs229_db; From dcdfb9d018b8acfe40afc4fc51b703b4d7c9000a Mon Sep 17 00:00:00 2001 From: mariadb-KristinaPavlova Date: Thu, 12 Jun 2025 15:08:56 +0300 Subject: [PATCH 10/79] add verbose optio in testS3Connection --- storage-manager/CMakeLists.txt | 2 +- storage-manager/src/S3Storage.cpp | 4 +-- storage-manager/src/S3Storage.h | 3 +- storage-manager/src/testS3Connection.cpp | 40 +++++++++++++++++------- utils/libmarias3/libmarias3 | 2 +- 5 files changed, 34 insertions(+), 17 deletions(-) diff --git a/storage-manager/CMakeLists.txt b/storage-manager/CMakeLists.txt index fa459e2f8..b89012804 100755 --- a/storage-manager/CMakeLists.txt +++ b/storage-manager/CMakeLists.txt @@ -93,7 +93,7 @@ columnstore_link(unit_tests storagemanager) columnstore_executable(testS3Connection src/testS3Connection.cpp) target_compile_definitions(testS3Connection PUBLIC BOOST_NO_CXX11_SCOPED_ENUMS) -columnstore_link(testS3Connection storagemanager) +columnstore_link(testS3Connection storagemanager boost_program_options) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${TMPDIR}) diff --git a/storage-manager/src/S3Storage.cpp b/storage-manager/src/S3Storage.cpp index 7e0b1957e..8c45336b3 100644 --- a/storage-manager/src/S3Storage.cpp +++ b/storage-manager/src/S3Storage.cpp @@ -112,7 +112,7 @@ S3Storage::ScopedConnection::~ScopedConnection() s3->returnConnection(conn); } -S3Storage::S3Storage(bool skipRetry) : skipRetryableErrors(skipRetry) +S3Storage::S3Storage(bool skipRetry, bool verbose) : skipRetryableErrors(skipRetry), verbose_enabled(verbose) { /* Check creds from envvars Get necessary vars from config @@ -225,7 +225,7 @@ S3Storage::S3Storage(bool skipRetry) : skipRetryableErrors(skipRetry) } ms3_library_init(); - if (libs3_debug == "enabled") + if (verbose_enabled || libs3_debug == "enabled") { ms3_debug(1); } diff --git a/storage-manager/src/S3Storage.h b/storage-manager/src/S3Storage.h index cda369a18..df63afc5b 100644 --- a/storage-manager/src/S3Storage.h +++ b/storage-manager/src/S3Storage.h @@ -32,7 +32,7 @@ namespace storagemanager class S3Storage : public CloudStorage { public: - explicit S3Storage(bool skipRetry = false); + explicit S3Storage(bool skipRetry = false, bool verbose = false); ~S3Storage() override; @@ -57,6 +57,7 @@ class S3Storage : public CloudStorage void returnConnection(std::shared_ptr conn); bool skipRetryableErrors; + bool verbose_enabled; std::string bucket; // might store this as a char *, since it's only used that way std::string prefix; diff --git a/storage-manager/src/testS3Connection.cpp b/storage-manager/src/testS3Connection.cpp index 99e344cd6..425f2a4e5 100644 --- a/storage-manager/src/testS3Connection.cpp +++ b/storage-manager/src/testS3Connection.cpp @@ -20,23 +20,26 @@ #include #include #include +#include using namespace storagemanager; using namespace std; +namespace po = boost::program_options; -void printUsage() +void printUsage(const po::options_description& desc) { cout << "MariaDB Columnstore Storage Manager Test Configuration Connectivity.\n" << endl; cout << "Usage: testS3Connection \n" << endl; + cout<< desc <()->default_value(false), "Enable verbose output"); + + // Parse command line + po::variables_map vm; + po::store(po::parse_command_line(argc, argv, desc), vm); + po::notify(vm); + + if(vm.count("help")) { - case 'h': - default: - printUsage(); - return 0; - break; + printUsage (desc); + return 0; } + // Run the test with verbose flag + return s3TestConnection(vm["verbose"].as()); } - return s3TestConnection(); + catch(const std::exception& e) + { + std::cerr << e.what() << '\n'; + } + } diff --git a/utils/libmarias3/libmarias3 b/utils/libmarias3/libmarias3 index f74150b05..d9cb536a5 160000 --- a/utils/libmarias3/libmarias3 +++ b/utils/libmarias3/libmarias3 @@ -1 +1 @@ -Subproject commit f74150b05693440d35f93c43e2d2411cc66fee19 +Subproject commit d9cb536a532ef6e71df66d99e95562e1169ec93f From e1a99818e64d70a4ab91bc9ad00fd2cdce8eed5c Mon Sep 17 00:00:00 2001 From: Leonid Fedorov Date: Wed, 18 Jun 2025 14:41:40 +0000 Subject: [PATCH 11/79] chore(ci): downgrade awscli image to 2.22.30 --- .drone.jsonnet | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.jsonnet b/.drone.jsonnet index 9369691e1..9c39b2126 100644 --- a/.drone.jsonnet +++ b/.drone.jsonnet @@ -176,7 +176,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", publish(step_prefix="pkg", eventp=event + "/${DRONE_BUILD_NUMBER}"):: { name: "publish " + step_prefix, depends_on: [std.strReplace(step_prefix, " latest", ""), "createrepo"], - image: "amazon/aws-cli:2.23.5", + image: "amazon/aws-cli:2.22.30", when: { status: ["success", "failure"], }, From c987a6775390debe7e4c9faaae0508647410910b Mon Sep 17 00:00:00 2001 From: "aleksei.bukhalov" Date: Thu, 19 Jun 2025 14:40:33 +0200 Subject: [PATCH 12/79] MCOL-6022 fix mtr testdata downloading --- build/run_mtr.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/run_mtr.sh b/build/run_mtr.sh index 52c8d533b..273fa1720 100755 --- a/build/run_mtr.sh +++ b/build/run_mtr.sh @@ -53,8 +53,8 @@ execInnerDocker "${CONTAINER_NAME}" "mariadb -e \"create database if not exists execInnerDocker "${CONTAINER_NAME}" "systemctl restart mariadb-columnstore" if [[ "${EVENT}" == "custom" || "${EVENT}" == "cron" ]]; then - execInnerDocker "${CONTAINER_NAME}" "cd ${MTR_PATH} && ./mtr --extern socket=${SOCKET_PATH} --force --print-core=detailed --print-method=gdb --max-test-fail=0 --suite=columnstore/setup" execInnerDocker "${CONTAINER_NAME}" "wget -qO- https://cspkg.s3.amazonaws.com/mtr-test-data.tar.lz4 | lz4 -dc - | tar xf - -C /" + execInnerDocker "${CONTAINER_NAME}" "cd ${MTR_PATH} && ./mtr --extern socket=${SOCKET_PATH} --force --print-core=detailed --print-method=gdb --max-test-fail=0 --suite=columnstore/setup" fi if [[ "${EVENT}" == "cron" ]]; then From dd9298f9881d92edc3b0dcb31328c5cba69f693e Mon Sep 17 00:00:00 2001 From: drrtuy Date: Tue, 17 Jun 2025 17:19:41 +0000 Subject: [PATCH 13/79] feat(plugin): add extra logging to the plugin init --- dbcon/mysql/ha_mcs.cpp | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/dbcon/mysql/ha_mcs.cpp b/dbcon/mysql/ha_mcs.cpp index 8232146c4..c1c7456ac 100644 --- a/dbcon/mysql/ha_mcs.cpp +++ b/dbcon/mysql/ha_mcs.cpp @@ -1828,14 +1828,20 @@ static int columnstore_init_func(void* p) fprintf(stderr, "Columnstore: Started; Version: %s-%s\n", columnstore_version.c_str(), columnstore_release.c_str()); + plugin_ref plugin_innodb; LEX_CSTRING name = {STRING_WITH_LEN("INNODB")}; - auto* plugin_innodb = ha_resolve_by_name(0, &name, 0); - if (!plugin_innodb || plugin_state(plugin_innodb) != PLUGIN_IS_READY) + if (get_innodb_queries_uses_mcs()) { - DBUG_RETURN(HA_ERR_RETRY_INIT); - } + std::cerr << "Columnstore: innodb_queries_uses_mcs is set, looking for InnoDB plugin." << std::endl; + plugin_innodb = ha_resolve_by_name(0, &name, 0); + if (!plugin_innodb || plugin_state(plugin_innodb) != PLUGIN_IS_READY) + { + DBUG_RETURN(HA_ERR_RETRY_INIT); + } + } + strncpy(cs_version, columnstore_version.c_str(), sizeof(cs_version) - 1); cs_version[sizeof(cs_version) - 1] = 0; @@ -1844,10 +1850,14 @@ static int columnstore_init_func(void* p) mcs_hton = (handlerton*)p; + std::cerr << "Columnstore: init pthread_mutex_init" << std::endl; (void)pthread_mutex_init(&mcs_mutex, MY_MUTEX_INIT_FAST); + std::cerr << "Columnstore: init my_hash_init" << std::endl; (void)my_hash_init(PSI_NOT_INSTRUMENTED, &mcs_open_tables, system_charset_info, 32, 0, 0, (my_hash_get_key)mcs_get_key, 0, 0); + std::cerr << "Columnstore: init mcs_hton attributes" << std::endl; + mcs_hton->create = ha_mcs_cache_create_handler; mcs_hton->panic = 0; mcs_hton->flags = HTON_CAN_RECREATE | HTON_NO_PARTITION; @@ -1863,10 +1873,13 @@ static int columnstore_init_func(void* p) if (get_innodb_queries_uses_mcs()) { + std::cerr << "Columnstore: innodb_queries_uses_mcs is set, redirecting all InnoDB queries to Columnstore." << std::endl; + auto* innodb_hton = plugin_hton(plugin_innodb); int error = innodb_hton == nullptr; // Engine must exists! if (error) { + std::cerr << "Columnstore: innodb_queries_uses_mcs is set, but could not find InnoDB plugin." << std::endl; my_error(HA_ERR_INITIALIZATION, MYF(0), "Could not find storage engine %s", name.str); } innodb_hton->create_select = create_columnstore_select_handler; @@ -1874,11 +1887,13 @@ static int columnstore_init_func(void* p) } #ifdef HAVE_PSI_INTERFACE + std::cerr << "Columnstore: Registering mutex for Columnstore write cache." << std::endl; uint count = sizeof(all_mutexes) / sizeof(all_mutexes[0]); mysql_mutex_register("ha_mcs_cache", all_mutexes, count); #else (void)key_LOCK_cache_share; #endif + std::cerr << "Columnstore: Initialising mutex for Columnstore write cache." << std::endl; mysql_mutex_init(key_LOCK_cache_share, &LOCK_cache_share, MY_MUTEX_INIT_FAST); DBUG_RETURN(0); From 5d0b3a88f34a0ee836dd372291f845053eb83950 Mon Sep 17 00:00:00 2001 From: mariadb-AlanMologorsky Date: Tue, 17 Jun 2025 05:53:02 +0300 Subject: [PATCH 14/79] fix(cmapi): MCOL-5899 confusing cluster_mode status when columnstore offline. --- cmapi/cmapi_server/handlers/cluster.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cmapi/cmapi_server/handlers/cluster.py b/cmapi/cmapi_server/handlers/cluster.py index 10a213fb7..f2d8f892b 100644 --- a/cmapi/cmapi_server/handlers/cluster.py +++ b/cmapi/cmapi_server/handlers/cluster.py @@ -83,6 +83,7 @@ class ClusterHandler(): r_json = r.json() if len(r_json.get('services', 0)) == 0: r_json['dbrm_mode'] = 'offline' + r_json['cluster_mode'] = 'offline' response[f'{str(node)}'] = r_json num_nodes += 1 From c9cf1a5944283eaabf985f975431ecd86f947048 Mon Sep 17 00:00:00 2001 From: "aleksei.bukhalov" Date: Thu, 19 Jun 2025 18:11:41 +0200 Subject: [PATCH 15/79] MCOL-6038 regression to bash --- .drone.jsonnet | 56 +++++++------------------------- build/prepare_regression.sh | 64 +++++++++++++++++++++++++++++++++++++ build/run_regression.sh | 37 +++++++++++++++++++++ build/utils.sh | 13 ++++++++ 4 files changed, 126 insertions(+), 44 deletions(-) create mode 100755 build/prepare_regression.sh create mode 100755 build/run_regression.sh diff --git a/.drone.jsonnet b/.drone.jsonnet index 9c39b2126..03a31d08a 100644 --- a/.drone.jsonnet +++ b/.drone.jsonnet @@ -344,7 +344,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", prepareTestStage(getContainerName("mtr"), result, true), 'MTR_SUITE_LIST=$([ "$MTR_FULL_SUITE" == true ] && echo "' + mtr_full_set + '" || echo "$MTR_SUITE_LIST")', - 'bash /mdb/' + builddir + '/storage/columnstore/columnstore/build/run_mtr.sh' + + 'apk add bash && bash /mdb/' + builddir + '/storage/columnstore/columnstore/build/run_mtr.sh' + ' --container-name ' + getContainerName("mtr") + ' --distro ' + platform + ' --suite-list $${MTR_SUITE_LIST}' + @@ -365,7 +365,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", }, prepare_regression:: { name: "prepare regression", - depends_on: ["mtr", "publish pkg", "publish cmapi build"], + depends_on: ["publish pkg", "publish cmapi build"], when: { status: ["success", "failure"], }, @@ -376,53 +376,23 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", REGRESSION_REF_AUX: branch_ref, }, commands: [ - // compute branch. - 'echo "$$REGRESSION_REF"', - 'echo "$$REGRESSION_BRANCH_REF"', + // REGRESSION_REF can be empty if there is no appropriate branch in regression repository. // if REGRESSION_REF is empty, try to see whether regression repository has a branch named as one we PR. 'export REGRESSION_REF=$${REGRESSION_REF:-$$(git ls-remote https://github.com/mariadb-corporation/mariadb-columnstore-regression-test --h --sort origin "refs/heads/$$REGRESSION_BRANCH_REF" | grep -E -o "[^/]+$$")}', - 'echo "$$REGRESSION_REF"', - // REGRESSION_REF can be empty if there is no appropriate branch in regression repository. - // assign what is appropriate by default. "export REGRESSION_REF=$${REGRESSION_REF:-$$REGRESSION_REF_AUX}", 'echo "$$REGRESSION_REF"', - // clone regression test repo - "git clone --recurse-submodules --branch $$REGRESSION_REF --depth 1 https://github.com/mariadb-corporation/mariadb-columnstore-regression-test", - // where are we now? - "cd mariadb-columnstore-regression-test", - "git rev-parse --abbrev-ref HEAD && git rev-parse HEAD", - "cd ..", prepareTestStage(getContainerName("regression"), result, true), - - "docker cp mariadb-columnstore-regression-test regression$${DRONE_BUILD_NUMBER}:/", - // list storage manager binary - "ls -la /mdb/" + builddir + "/storage/columnstore/columnstore/storage-manager", - "docker cp /mdb/" + builddir + "/storage/columnstore/columnstore/storage-manager regression$${DRONE_BUILD_NUMBER}:/", - // check storage-manager unit test binary file - execInnerDocker("ls -l /storage-manager", getContainerName("regression")), - // copy test data for regression test suite - execInnerDocker('bash -c "wget -qO- https://cspkg.s3.amazonaws.com/testData.tar.lz4 | lz4 -dc - | tar xf - -C mariadb-columnstore-regression-test/"', getContainerName("regression")), - - // set mariadb lower_case_table_names=1 config option - execInnerDocker('sed -i "/^.mariadb.$/a lower_case_table_names=1" ' + config_path_prefix + "server.cnf", getContainerName("regression")), - // set default client character set to utf-8 - execInnerDocker('sed -i "/^.client.$/a default-character-set=utf8" ' + config_path_prefix + "client.cnf", getContainerName("regression")), - - // Set RAM consumption limits to avoid RAM contention b/w mtr andregression steps. - execInnerDocker("/usr/bin/mcsSetConfig SystemConfig CGroup just_no_group_use_local", getContainerName("regression")), - - execInnerDocker("systemctl start mariadb", getContainerName("regression")), - execInnerDocker("systemctl restart mariadb-columnstore", getContainerName("regression")), - // delay regression for manual debugging on live instance - "sleep $${REGRESSION_DELAY_SECONDS:-1s}", - execInnerDocker("/usr/bin/g++ /mariadb-columnstore-regression-test/mysql/queries/queryTester.cpp -O2 -o /mariadb-columnstore-regression-test/mysql/queries/queryTester", getContainerName("regression")), + "apk add bash && bash /mdb/" + builddir + "/storage/columnstore/columnstore/build/prepare_regression.sh " + + "--container-name " + getContainerName("regression") + + " --regression-branch $$REGRESSION_REF" + + " --distro " + platform, ], }, regression(name, depends_on):: { name: name, depends_on: depends_on, image: "docker:git", - volumes: [pipeline._volumes.docker], + volumes: [pipeline._volumes.docker, pipeline._volumes.mdb], when: { status: ["success", "failure"], }, @@ -433,12 +403,10 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", }, }, commands: [ - execInnerDocker("mkdir -p reg-logs", getContainerName("regression"), "--workdir /mariadb-columnstore-regression-test/mysql/queries/nightly/alltest"), - execInnerDocker("bash -c 'sleep 4800 && bash /save_stack.sh /mariadb-columnstore-regression-test/mysql/queries/nightly/alltest/reg-logs/' & ", - getContainerName("regresion")), - execInnerDockerNoTTY('bash -c "timeout -k 1m -s SIGKILL --preserve-status $${REGRESSION_TIMEOUT} ./go.sh --sm_unit_test_dir=/storage-manager --tests=' + name + " || ./regression_logs.sh " + name + '"', - getContainerName("regression"), - "--env PRESERVE_LOGS=true --workdir /mariadb-columnstore-regression-test/mysql/queries/nightly/alltest"), + "apk add bash && bash /mdb/" + builddir + "/storage/columnstore/columnstore/build/run_regression.sh " + + "--container-name " + getContainerName("regression") + + " --test-name " + name + + " --regression-timeout $${REGRESSION_TIMEOUT}", ], }, regressionlog:: { diff --git a/build/prepare_regression.sh b/build/prepare_regression.sh new file mode 100755 index 000000000..1e08c0c5d --- /dev/null +++ b/build/prepare_regression.sh @@ -0,0 +1,64 @@ +#!/bin/bash +set -eo pipefail + +SCRIPT_LOCATION=$(dirname "$0") +source "$SCRIPT_LOCATION"/utils.sh + +optparse.define short=c long=container-name desc="Name of the Docker container where regression tests will run" variable=CONTAINER_NAME +optparse.define short=b long=regression-branch desc="Branch from regression tests repo" variable=REGRESSION_BRANCH +optparse.define short=d long=distro desc="Linux distro for which regression is executed" variable=DISTRO +source $(optparse.build) + +for var in CONTAINER_NAME REGRESSION_BRANCH DISTRO; do + if [[ -z "${!var}" ]]; then + error "Missing required flag: -${var:0:1} / --${var,,}" + exit 1 + fi +done + +if [[ -z $(docker ps -q --filter "name=${CONTAINER_NAME}") ]]; then + error "Container '${CONTAINER_NAME}' is not running." + exit 1 +fi + +if [[ "$DISTRO" == *rocky* ]]; then + CONFIG_PATH_PREFIX="/etc/my.cnf.d/" +else + CONFIG_PATH_PREFIX="/etc/mysql/mariadb.conf.d/50-" +fi + +BUILD_DIR="verylongdirnameforverystrangecpackbehavior" + +git clone --recurse-submodules --branch "${REGRESSION_BRANCH}" --depth 1 https://github.com/mariadb-corporation/mariadb-columnstore-regression-test + +cd mariadb-columnstore-regression-test +git rev-parse --abbrev-ref HEAD && git rev-parse HEAD +cd .. + +docker cp mariadb-columnstore-regression-test "${CONTAINER_NAME}:/" + +echo "list storage manager binary:" +ls -la "/mdb/${BUILD_DIR}/storage/columnstore/columnstore/storage-manager" + +docker cp "/mdb/${BUILD_DIR}/storage/columnstore/columnstore/storage-manager" "${CONTAINER_NAME}:/" + +#copy test data for regression test suite +execInnerDocker "$CONTAINER_NAME" 'bash -c "wget -qO- https://cspkg.s3.amazonaws.com/testData.tar.lz4 | lz4 -dc - | tar xf - -C mariadb-columnstore-regression-test/"' + +# set mariadb lower_case_table_names=1 config option +execInnerDocker "$CONTAINER_NAME" "sed -i '/^\[mariadb\]/a lower_case_table_names=1' ${CONFIG_PATH_PREFIX}server.cnf" + +# set default client character set to utf-8 +execInnerDocker "$CONTAINER_NAME" "sed -i '/^\[client\]/a default-character-set=utf8' ${CONFIG_PATH_PREFIX}client.cnf" + + +execInnerDocker "$CONTAINER_NAME" "systemctl start mariadb" +execInnerDocker "$CONTAINER_NAME" "systemctl restart mariadb-columnstore" + +# Set RAM consumption limits to avoid RAM contention b/w mtr and regression steps. +execInnerDocker "$CONTAINER_NAME" '/usr/bin/mcsSetConfig SystemConfig CGroup just_no_group_use_local' + +# Compile queryTester inside container +execInnerDocker "$CONTAINER_NAME" "g++ /mariadb-columnstore-regression-test/mysql/queries/queryTester.cpp -O2 -o /mariadb-columnstore-regression-test/mysql/queries/queryTester" + +echo "Prepare_regression stage has completed" diff --git a/build/run_regression.sh b/build/run_regression.sh new file mode 100755 index 000000000..73c2e240c --- /dev/null +++ b/build/run_regression.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +set -eo pipefail + +SCRIPT_LOCATION=$(dirname "$0") +source "$SCRIPT_LOCATION"/utils.sh + +optparse.define short=c long=container-name desc="Name of the Docker container where regression tests will be executed" variable=CONTAINER_NAME +optparse.define short=t long=regression-timeout desc="Name of the Docker container where regression tests will be executed" variable=REGRESSION_TIMEOUT +optparse.define short=n long=test-name desc="Test name" variable=TEST_NAME +source $(optparse.build) + +echo "Arguments received: $@" + +if [[ "$EUID" -ne 0 ]]; then + error "Please run script as root" + exit 1 +fi + +if [[ -z "${CONTAINER_NAME}" ]]; then + echo "Please provide mtr container name as a parameter, e.g. ./run_mtr.sh -c mtr183" + exit 1 +fi + +if [[ -z $(docker ps -q --filter "name=${CONTAINER_NAME}") ]]; then + error "Container '${CONTAINER_NAME}' is not running." + exit 1 +fi + +execInnerDocker "$CONTAINER_NAME" "cd /mariadb-columnstore-regression-test/mysql/queries/nightly/alltest && mkdir -p reg-logs" + +execInnerDocker "$CONTAINER_NAME" "bash -c 'sleep 4800 && bash /save_stack.sh /mariadb-columnstore-regression-test/mysql/queries/nightly/alltest/reg-logs/' &" + +execInnerDockerNoTTY "$CONTAINER_NAME" \ + "export PRESERVE_LOGS=true && cd /mariadb-columnstore-regression-test/mysql/queries/nightly/alltest && \ + bash -c \"timeout -k 1m -s SIGKILL --preserve-status ${REGRESSION_TIMEOUT} ./go.sh --sm_unit_test_dir=/storage-manager --tests=${TEST_NAME} \ + || ./regression_logs.sh ${TEST_NAME}\"" diff --git a/build/utils.sh b/build/utils.sh index 56b6ee3c7..771b575d2 100644 --- a/build/utils.sh +++ b/build/utils.sh @@ -535,6 +535,19 @@ function execInnerDocker() { fi } +function execInnerDockerNoTTY() { + local container_name=$1 + shift 1 + + docker exec "$container_name" bash -c "$@" + local dockerCommandExitCode=$? + + if [[ $dockerCommandExitCode -ne 0 ]]; then + error "Command \"$@\" failed in container \"$container_name\"" + exit $dockerCommandExitCode + fi +} + function change_ubuntu_mirror() { local region="$1" message "Changing Ubuntu mirror to $region" From 0112e7b13cf3b119ce1d3e0d30d5d0c3ef69cc1c Mon Sep 17 00:00:00 2001 From: "aleksei.bukhalov" Date: Mon, 23 Jun 2025 17:20:51 +0200 Subject: [PATCH 16/79] MCOL-6038 combine regression and prepare regression --- .drone.jsonnet | 56 ++++------ build/prepare_regression.sh | 64 ----------- ...est_stage.sh => prepare_test_container.sh} | 11 +- build/run_regression.sh | 100 ++++++++++++++---- build/utils.sh | 4 +- 5 files changed, 109 insertions(+), 126 deletions(-) delete mode 100755 build/prepare_regression.sh rename build/{prepare_test_stage.sh => prepare_test_container.sh} (96%) diff --git a/.drone.jsonnet b/.drone.jsonnet index 03a31d08a..1d77c227f 100644 --- a/.drone.jsonnet +++ b/.drone.jsonnet @@ -248,8 +248,8 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", if (pkg_format == "deb") then execInnerDocker('bash -c "apt-get clean && apt-get update -y && apt-get install -y mariadb-columnstore-cmapi"', containerName) else execInnerDocker('bash -c "yum update -y && yum install -y MariaDB-columnstore-cmapi"', containerName), - local prepareTestStage(containerName, result, do_setup) = - 'sh -c "apk add bash && bash /mdb/' + builddir + "/storage/columnstore/columnstore/build/prepare_test_stage.sh" + + local prepareTestContainer(containerName, result, do_setup) = + 'sh -c "apk add bash && bash /mdb/' + builddir + "/storage/columnstore/columnstore/build/prepare_test_container.sh" + " --container-name " + containerName + " --docker-image " + img + " --result-path " + result + @@ -274,7 +274,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", image: "docker:28.2.2", volumes: [pipeline._volumes.mdb, pipeline._volumes.docker], commands: [ - prepareTestStage(getContainerName("smoke"), result, true), + prepareTestContainer(getContainerName("smoke"), result, true), "bash /mdb/" + builddir + "/storage/columnstore/columnstore/build/run_smoke.sh " + getContainerName("smoke"), ], }, @@ -302,7 +302,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", }, commands: [ // why do we mount cgroups here, but miss it on other steps? - prepareTestStage(getContainerName("upgrade") + version, result, false), + prepareTestContainer(getContainerName("upgrade") + version, result, false), if (pkg_format == "deb") then execInnerDocker('bash -c "./upgrade_setup_deb.sh ' + version + " " + result + " " + arch + " " + repo_pkg_url_no_res + ' $${UPGRADE_TOKEN}"', getContainerName("upgrade") + version), @@ -341,7 +341,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", MTR_FULL_SUITE: "${MTR_FULL_SUITE:-false}", }, commands: [ - prepareTestStage(getContainerName("mtr"), result, true), + prepareTestContainer(getContainerName("mtr"), result, true), 'MTR_SUITE_LIST=$([ "$MTR_FULL_SUITE" == true ] && echo "' + mtr_full_set + '" || echo "$MTR_SUITE_LIST")', 'apk add bash && bash /mdb/' + builddir + '/storage/columnstore/columnstore/build/run_mtr.sh' + @@ -363,31 +363,6 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", status: ["success", "failure"], }, }, - prepare_regression:: { - name: "prepare regression", - depends_on: ["publish pkg", "publish cmapi build"], - when: { - status: ["success", "failure"], - }, - image: "docker:git", - volumes: [pipeline._volumes.docker, pipeline._volumes.mdb], - environment: { - REGRESSION_BRANCH_REF: "${DRONE_SOURCE_BRANCH}", - REGRESSION_REF_AUX: branch_ref, - }, - commands: [ - // REGRESSION_REF can be empty if there is no appropriate branch in regression repository. - // if REGRESSION_REF is empty, try to see whether regression repository has a branch named as one we PR. - 'export REGRESSION_REF=$${REGRESSION_REF:-$$(git ls-remote https://github.com/mariadb-corporation/mariadb-columnstore-regression-test --h --sort origin "refs/heads/$$REGRESSION_BRANCH_REF" | grep -E -o "[^/]+$$")}', - "export REGRESSION_REF=$${REGRESSION_REF:-$$REGRESSION_REF_AUX}", - 'echo "$$REGRESSION_REF"', - prepareTestStage(getContainerName("regression"), result, true), - "apk add bash && bash /mdb/" + builddir + "/storage/columnstore/columnstore/build/prepare_regression.sh " + - "--container-name " + getContainerName("regression") + - " --regression-branch $$REGRESSION_REF" + - " --distro " + platform, - ], - }, regression(name, depends_on):: { name: name, depends_on: depends_on, @@ -401,11 +376,23 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", REGRESSION_TIMEOUT: { from_secret: "regression_timeout", }, + REGRESSION_BRANCH_REF: "${DRONE_SOURCE_BRANCH}", + REGRESSION_REF_AUX: branch_ref, }, commands: [ - "apk add bash && bash /mdb/" + builddir + "/storage/columnstore/columnstore/build/run_regression.sh " + - "--container-name " + getContainerName("regression") + + prepareTestContainer(getContainerName("regression"), result, true), + + // REGRESSION_REF can be empty if there is no appropriate branch in regression repository. + // if REGRESSION_REF is empty, try to see whether regression repository has a branch named as one we PR. + 'export REGRESSION_REF=$${REGRESSION_REF:-$$(git ls-remote https://github.com/mariadb-corporation/mariadb-columnstore-regression-test --h --sort origin "refs/heads/$$REGRESSION_BRANCH_REF" | grep -E -o "[^/]+$$")}', + "export REGRESSION_REF=$${REGRESSION_REF:-$$REGRESSION_REF_AUX}", + 'echo "$$REGRESSION_REF"', + + "apk add bash && bash /mdb/" + builddir + "/storage/columnstore/columnstore/build/run_regression.sh" + + " --container-name " + getContainerName("regression") + " --test-name " + name + + " --distro " + platform + + " --regression-branch $$REGRESSION_REF" + " --regression-timeout $${REGRESSION_TIMEOUT}", ], }, @@ -482,7 +469,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", PYTHONPATH: "/usr/share/columnstore/cmapi/deps", }, commands: [ - prepareTestStage(getContainerName("cmapi"), result, true), + prepareTestContainer(getContainerName("cmapi"), result, true), installCmapi(getContainerName("cmapi"), pkg_format), "cd cmapi", "for i in mcs_node_control cmapi_server failover; do docker cp $${i}/test cmapi$${DRONE_BUILD_NUMBER}:" + cmapi_path + "/$${i}/; done", @@ -695,8 +682,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", [pipeline.cmapilog] + [pipeline.publish("cmapilog")] + (if (platform == "rockylinux:8" && arch == "amd64") then [pipeline.dockerfile] + [pipeline.dockerhub] + [pipeline.multi_node_mtr] else [pipeline.mtr] + [pipeline.mtrlog] + [pipeline.publish("mtrlog")]) + - [pipeline.prepare_regression] + - [pipeline.regression(regression_tests[i], [if (i == 0) then "prepare regression" else regression_tests[i - 1]]) for i in indexes(regression_tests)] + + [pipeline.regression(regression_tests[i], if (i == 0) then ["mtr", "publish pkg", "publish cmapi build"] else [regression_tests[i - 1]]) for i in indexes(regression_tests)] + [pipeline.regressionlog] + [pipeline.publish("regressionlog")] + // [pipeline.upgrade(mdb_server_versions[i]) for i in indexes(mdb_server_versions)] + diff --git a/build/prepare_regression.sh b/build/prepare_regression.sh deleted file mode 100755 index 1e08c0c5d..000000000 --- a/build/prepare_regression.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/bash -set -eo pipefail - -SCRIPT_LOCATION=$(dirname "$0") -source "$SCRIPT_LOCATION"/utils.sh - -optparse.define short=c long=container-name desc="Name of the Docker container where regression tests will run" variable=CONTAINER_NAME -optparse.define short=b long=regression-branch desc="Branch from regression tests repo" variable=REGRESSION_BRANCH -optparse.define short=d long=distro desc="Linux distro for which regression is executed" variable=DISTRO -source $(optparse.build) - -for var in CONTAINER_NAME REGRESSION_BRANCH DISTRO; do - if [[ -z "${!var}" ]]; then - error "Missing required flag: -${var:0:1} / --${var,,}" - exit 1 - fi -done - -if [[ -z $(docker ps -q --filter "name=${CONTAINER_NAME}") ]]; then - error "Container '${CONTAINER_NAME}' is not running." - exit 1 -fi - -if [[ "$DISTRO" == *rocky* ]]; then - CONFIG_PATH_PREFIX="/etc/my.cnf.d/" -else - CONFIG_PATH_PREFIX="/etc/mysql/mariadb.conf.d/50-" -fi - -BUILD_DIR="verylongdirnameforverystrangecpackbehavior" - -git clone --recurse-submodules --branch "${REGRESSION_BRANCH}" --depth 1 https://github.com/mariadb-corporation/mariadb-columnstore-regression-test - -cd mariadb-columnstore-regression-test -git rev-parse --abbrev-ref HEAD && git rev-parse HEAD -cd .. - -docker cp mariadb-columnstore-regression-test "${CONTAINER_NAME}:/" - -echo "list storage manager binary:" -ls -la "/mdb/${BUILD_DIR}/storage/columnstore/columnstore/storage-manager" - -docker cp "/mdb/${BUILD_DIR}/storage/columnstore/columnstore/storage-manager" "${CONTAINER_NAME}:/" - -#copy test data for regression test suite -execInnerDocker "$CONTAINER_NAME" 'bash -c "wget -qO- https://cspkg.s3.amazonaws.com/testData.tar.lz4 | lz4 -dc - | tar xf - -C mariadb-columnstore-regression-test/"' - -# set mariadb lower_case_table_names=1 config option -execInnerDocker "$CONTAINER_NAME" "sed -i '/^\[mariadb\]/a lower_case_table_names=1' ${CONFIG_PATH_PREFIX}server.cnf" - -# set default client character set to utf-8 -execInnerDocker "$CONTAINER_NAME" "sed -i '/^\[client\]/a default-character-set=utf8' ${CONFIG_PATH_PREFIX}client.cnf" - - -execInnerDocker "$CONTAINER_NAME" "systemctl start mariadb" -execInnerDocker "$CONTAINER_NAME" "systemctl restart mariadb-columnstore" - -# Set RAM consumption limits to avoid RAM contention b/w mtr and regression steps. -execInnerDocker "$CONTAINER_NAME" '/usr/bin/mcsSetConfig SystemConfig CGroup just_no_group_use_local' - -# Compile queryTester inside container -execInnerDocker "$CONTAINER_NAME" "g++ /mariadb-columnstore-regression-test/mysql/queries/queryTester.cpp -O2 -o /mariadb-columnstore-regression-test/mysql/queries/queryTester" - -echo "Prepare_regression stage has completed" diff --git a/build/prepare_test_stage.sh b/build/prepare_test_container.sh similarity index 96% rename from build/prepare_test_stage.sh rename to build/prepare_test_container.sh index 11a6eeeec..924382bcf 100755 --- a/build/prepare_test_stage.sh +++ b/build/prepare_test_container.sh @@ -75,8 +75,7 @@ start_container() { fi } -start_container - +prepare_container() { if [[ "$RESULT" != *rocky* ]]; then execInnerDocker "$CONTAINER_NAME" 'sed -i "s/exit 101/exit 0/g" /usr/sbin/policy-rc.d' fi @@ -123,3 +122,11 @@ fi sleep 5 echo "PrepareTestStage completed in $CONTAINER_NAME" +} + + +if [[ -z $(docker ps -q --filter "name=${CONTAINER_NAME}") ]]; then + start_container + prepare_container +else warn "Container ${CONTAINER_NAME} is already running!" +fi diff --git a/build/run_regression.sh b/build/run_regression.sh index 73c2e240c..83b41fb02 100755 --- a/build/run_regression.sh +++ b/build/run_regression.sh @@ -1,37 +1,91 @@ #!/bin/bash -set -eo pipefail +set -o pipefail SCRIPT_LOCATION=$(dirname "$0") source "$SCRIPT_LOCATION"/utils.sh -optparse.define short=c long=container-name desc="Name of the Docker container where regression tests will be executed" variable=CONTAINER_NAME -optparse.define short=t long=regression-timeout desc="Name of the Docker container where regression tests will be executed" variable=REGRESSION_TIMEOUT -optparse.define short=n long=test-name desc="Test name" variable=TEST_NAME -source $(optparse.build) +optparse.define short=c long=container-name desc="Name of the Docker container where regression tests will run" variable=CONTAINER_NAME +optparse.define short=b long=regression-branch desc="Branch from regression tests repo" variable=REGRESSION_BRANCH +optparse.define short=d long=distro desc="Linux distro for which regression is executed" variable=DISTRO +optparse.define short=t long=regression-timeout desc="Timeout for the regression test run" variable=REGRESSION_TIMEOUT +optparse.define short=n long=test-name desc="Name of regression test to execute" variable=TEST_NAME +source "$(optparse.build)" -echo "Arguments received: $@" - -if [[ "$EUID" -ne 0 ]]; then - error "Please run script as root" +for flag in CONTAINER_NAME REGRESSION_BRANCH DISTRO; do + if [[ -z "${!flag}" ]]; then + error "Missing required flag: -${flag:0:1} / --${flag,,}" exit 1 -fi - -if [[ -z "${CONTAINER_NAME}" ]]; then - echo "Please provide mtr container name as a parameter, e.g. ./run_mtr.sh -c mtr183" - exit 1 -fi + fi +done if [[ -z $(docker ps -q --filter "name=${CONTAINER_NAME}") ]]; then - error "Container '${CONTAINER_NAME}' is not running." - exit 1 + error "Container '${CONTAINER_NAME}' is not running." + exit 1 fi -execInnerDocker "$CONTAINER_NAME" "cd /mariadb-columnstore-regression-test/mysql/queries/nightly/alltest && mkdir -p reg-logs" +BUILD_DIR="verylongdirnameforverystrangecpackbehavior" -execInnerDocker "$CONTAINER_NAME" "bash -c 'sleep 4800 && bash /save_stack.sh /mariadb-columnstore-regression-test/mysql/queries/nightly/alltest/reg-logs/' &" +prepare_regression() { + if execInnerDocker "${CONTAINER_NAME}" "test -f /mariadb-columnstore-regression-test/mysql/queries/queryTester.cpp"; then + return 0 + fi + + message "Running one-time preparation for regression tests" + + # Set config path prefix based on distro + if [[ "$DISTRO" == *rocky* ]]; then + CONFIG_PATH_PREFIX="/etc/my.cnf.d/" + else + CONFIG_PATH_PREFIX="/etc/mysql/mariadb.conf.d/50-" + fi + + git clone --recurse-submodules --branch "${REGRESSION_BRANCH}" --depth 1 https://github.com/mariadb-corporation/mariadb-columnstore-regression-test + cd mariadb-columnstore-regression-test + git rev-parse --abbrev-ref HEAD && git rev-parse HEAD + cd .. + + docker cp mariadb-columnstore-regression-test "${CONTAINER_NAME}:/" + docker cp "/mdb/${BUILD_DIR}/storage/columnstore/columnstore/storage-manager" "${CONTAINER_NAME}:/" + + #copy test data for regression test suite + execInnerDocker "${CONTAINER_NAME}" 'bash -c "wget -qO- https://cspkg.s3.amazonaws.com/testData.tar.lz4 | lz4 -dc - | tar xf - -C mariadb-columnstore-regression-test/"' + + # set mariadb lower_case_table_names=1 config option + execInnerDocker "${CONTAINER_NAME}" "sed -i '/^\[mariadb\]/a lower_case_table_names=1' ${CONFIG_PATH_PREFIX}server.cnf" + + # set default client character set to utf-8 + execInnerDocker "${CONTAINER_NAME}" "sed -i '/^\[client\]/a default-character-set=utf8' ${CONFIG_PATH_PREFIX}client.cnf" + + # Start services and build queryTester + execInnerDocker "${CONTAINER_NAME}" "systemctl start mariadb" + execInnerDocker "${CONTAINER_NAME}" "systemctl restart mariadb-columnstore" + execInnerDocker "${CONTAINER_NAME}" "g++ /mariadb-columnstore-regression-test/mysql/queries/queryTester.cpp -O2 -o /mariadb-columnstore-regression-test/mysql/queries/queryTester" + + message "Regression preparation complete" +} + +run_test() { + message "Running test: ${TEST_NAME:-}" + + execInnerDocker "${CONTAINER_NAME}" "bash -c 'sleep 4800 && bash /save_stack.sh /mariadb-columnstore-regression-test/mysql/queries/nightly/alltest/reg-logs/' &" + + execInnerDockerNoTTY "${CONTAINER_NAME}" \ + "export PRESERVE_LOGS=true && cd /mariadb-columnstore-regression-test/mysql/queries/nightly/alltest && \ + timeout -k 1m -s SIGKILL --preserve-status ${REGRESSION_TIMEOUT} ./go.sh --sm_unit_test_dir=/storage-manager --tests=${TEST_NAME} \ + || ./regression_logs.sh ${TEST_NAME}" +} + +on_exit() { + exit_code=$? + if [[ $exit_code -eq 0 ]]; then + message "Regression finished successfully" + else + message "Some of regression tests has failed" + fi +} +trap on_exit EXIT + +prepare_regression +run_test -execInnerDockerNoTTY "$CONTAINER_NAME" \ - "export PRESERVE_LOGS=true && cd /mariadb-columnstore-regression-test/mysql/queries/nightly/alltest && \ - bash -c \"timeout -k 1m -s SIGKILL --preserve-status ${REGRESSION_TIMEOUT} ./go.sh --sm_unit_test_dir=/storage-manager --tests=${TEST_NAME} \ - || ./regression_logs.sh ${TEST_NAME}\"" diff --git a/build/utils.sh b/build/utils.sh index 771b575d2..d2551655a 100644 --- a/build/utils.sh +++ b/build/utils.sh @@ -531,7 +531,7 @@ function execInnerDocker() { if [[ $dockerCommandExitCode -ne 0 ]]; then error "Command \"$@\" failed in container \"$container_name\"" - exit $dockerCommandExitCode + return $dockerCommandExitCode fi } @@ -544,7 +544,7 @@ function execInnerDockerNoTTY() { if [[ $dockerCommandExitCode -ne 0 ]]; then error "Command \"$@\" failed in container \"$container_name\"" - exit $dockerCommandExitCode + return $dockerCommandExitCode fi } From b7dbf8948222b4a2438a3341a22612e2616bb02f Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Thu, 8 Aug 2024 01:52:30 +0300 Subject: [PATCH 17/79] skip all tests with LOAD DATA in case of tests via Maxscale --- ...52-cpimport-sets-wide-decimals-ranges.test | 1 + .../t/mcs201_calshowpartitions_function.test | 1 + .../mcs202_caldisablepartitions_function.test | 1 + .../mcs203_calenablepartitions_function.test | 1 + .../t/mcs204_caldroppartitions_function.test | 1 + .../t/mcs208_idbPartition_function.test | 1 + .../1pmonly/t/mcs209_idbDBRoot_function.test | 1 + .../1pmonly/t/mcs210_idbPm_function.test | 1 + .../mcs214_idbExtentRelativeRid_function.test | 1 + .../1pmonly/t/mcs215_idbSegment_function.test | 1 + ...cs4009_autopilot_partition_management.test | 1 + .../1pmonly/t/mcs7000_version_buffer.test | 1 + .../t/mcs4004_autopilot_batchInsert_ldi.test | 1 + .../t/mcs4005_autopilot_add_drop_columns.test | 1 + ...006_autopilot_create_dbt3_database_1m.test | 1 + ...autopilot_dbt3_performance_queries_1g.test | 1 + .../t/mcs4008_autopilot_sanity_test.test | 1 + .../mcs4010_autopilot_cross_engine_join.test | 1 + .../t/mcs4011_autopilot_query_stats.test | 1 + .../basic/r/mcs10_drop_db_table.result | 2 - .../r/mcs117_create_utf8_maxscale.result | 39 ++ .../basic/r/mcs11_show_db_table.result | 2 - .../basic/r/mcs12_alter_table.result | 2 - .../basic/r/mcs13_alter_table_negative.result | 2 - .../basic/r/mcs14_truncate_table.result | 2 - .../mcs170_session_functions_maxscale.result | 23 ++ .../basic/r/mcs19_grant_revoke.result | 2 - .../columnstore/basic/t/mcol641-insert.test | 1 + .../basic/t/mcs102_ldi_transform_csv.test | 1 + .../t/mcs103_ldi_fields_enclosed_by.test | 1 + .../basic/t/mcs104_ldi_fields_escaped_by.test | 1 + .../t/mcs105_ldi_lines_terminated_by.test | 1 + .../basic/t/mcs106_ldi_ignore_rows.test | 1 + .../basic/t/mcs10_drop_db_table.test | 16 +- .../basic/t/mcs117_create_utf8.test | 1 + .../basic/t/mcs117_create_utf8_maxscale.test | 44 ++ .../basic/t/mcs11_show_db_table.test | 16 +- .../basic/t/mcs12_alter_table.test | 16 +- .../basic/t/mcs13_alter_table_negative.test | 16 +- .../basic/t/mcs14_truncate_table.test | 16 +- .../basic/t/mcs170_session_functions.test | 2 + .../t/mcs170_session_functions_maxscale.test | 26 ++ .../basic/t/mcs19_grant_revoke.test | 15 +- .../basic/t/mcs211_idbExtentId_function.test | 1 + .../basic/t/mcs212_idbExtentMax_function.test | 1 + .../basic/t/mcs213_idbExtentMin_function.test | 1 + .../t/mcs216_idbSegmentDir_function.test | 1 + .../basic/t/mcs28_load_data_local_infile.test | 1 + ...mcs29_load_data_local_infile_negative.test | 1 + ...mcs47_cpimport_central_loc_sin_source.test | 1 + .../basic/t/mcs50_cpimport_stdin.test | 1 + .../basic/t/mcs51_cpimport_select_from.test | 1 + .../basic/t/mcs55_cpimport_binary_source.test | 1 + .../t/mcs67_ldi_datafile_separators.test | 1 + .../t/mcs68_cpimport_datafile_separators.test | 1 + .../basic/t/mcs88_import_export_csv.test | 1 + .../basic/t/std_aggregate_columnstore.test | 1 + .../t/std_aggregate_window_columnstore.test | 1 + .../basic/t/unsigned_aggregate.test | 1 + .../columnstore/basic/t/unsigned_joins.test | 1 + ...mcol-4741-strings-ranges-are-unsigned.test | 2 + .../columnstore/bugfixes/mcol-4931.test | 1 + .../columnstore/bugfixes/mcol-5480.test | 1 + .../t/mcs7058_regression_bug3262.test | 2 + .../t/mcs7072_regression_bug3406.test | 2 + .../t/mcs7094_regression_bug3520.test | 2 + .../t/mcs7130_regression_bug3935.test | 2 + .../t/mcs7230_regression_MCOL-4000.test | 2 + .../t/mcs7231_regression_MCOL-4002.test | 1 + .../t/mcs7001_update_100mil_rows.test | 1 + .../extended/t/mcs7002_ldi_rollback.test | 1 + .../columnstore/include/check_maxscale.inc | 9 + .../columnstore/include/detect_maxscale.inc | 10 + .../include/detect_no_maxscale.inc | 10 + .../oracle/func_concat_oracle.test | 3 + .../oracle/func_concat_oracle_maxscale.result | 389 ++++++++++++++++++ .../oracle/func_concat_oracle_maxscale.test | 192 +++++++++ .../setup/regression_env_setup.test | 1 + 78 files changed, 890 insertions(+), 25 deletions(-) create mode 100644 mysql-test/columnstore/basic/r/mcs117_create_utf8_maxscale.result create mode 100644 mysql-test/columnstore/basic/r/mcs170_session_functions_maxscale.result create mode 100644 mysql-test/columnstore/basic/t/mcs117_create_utf8_maxscale.test create mode 100644 mysql-test/columnstore/basic/t/mcs170_session_functions_maxscale.test create mode 100644 mysql-test/columnstore/include/check_maxscale.inc create mode 100644 mysql-test/columnstore/include/detect_maxscale.inc create mode 100644 mysql-test/columnstore/include/detect_no_maxscale.inc create mode 100644 mysql-test/columnstore/oracle/func_concat_oracle_maxscale.result create mode 100644 mysql-test/columnstore/oracle/func_concat_oracle_maxscale.test diff --git a/mysql-test/columnstore/1pmonly/t/mcol4652-cpimport-sets-wide-decimals-ranges.test b/mysql-test/columnstore/1pmonly/t/mcol4652-cpimport-sets-wide-decimals-ranges.test index 9eeb068f1..00c901f8e 100644 --- a/mysql-test/columnstore/1pmonly/t/mcol4652-cpimport-sets-wide-decimals-ranges.test +++ b/mysql-test/columnstore/1pmonly/t/mcol4652-cpimport-sets-wide-decimals-ranges.test @@ -1,4 +1,5 @@ -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcol4652; diff --git a/mysql-test/columnstore/1pmonly/t/mcs201_calshowpartitions_function.test b/mysql-test/columnstore/1pmonly/t/mcs201_calshowpartitions_function.test index b2f50ec39..f9f2e8c89 100644 --- a/mysql-test/columnstore/1pmonly/t/mcs201_calshowpartitions_function.test +++ b/mysql-test/columnstore/1pmonly/t/mcs201_calshowpartitions_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcs201_db; diff --git a/mysql-test/columnstore/1pmonly/t/mcs202_caldisablepartitions_function.test b/mysql-test/columnstore/1pmonly/t/mcs202_caldisablepartitions_function.test index a7b055b92..83c447e3e 100644 --- a/mysql-test/columnstore/1pmonly/t/mcs202_caldisablepartitions_function.test +++ b/mysql-test/columnstore/1pmonly/t/mcs202_caldisablepartitions_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcs202_db; diff --git a/mysql-test/columnstore/1pmonly/t/mcs203_calenablepartitions_function.test b/mysql-test/columnstore/1pmonly/t/mcs203_calenablepartitions_function.test index 777dcd29e..543c8aef4 100644 --- a/mysql-test/columnstore/1pmonly/t/mcs203_calenablepartitions_function.test +++ b/mysql-test/columnstore/1pmonly/t/mcs203_calenablepartitions_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcs203_db; diff --git a/mysql-test/columnstore/1pmonly/t/mcs204_caldroppartitions_function.test b/mysql-test/columnstore/1pmonly/t/mcs204_caldroppartitions_function.test index a2c626abd..70c36af24 100644 --- a/mysql-test/columnstore/1pmonly/t/mcs204_caldroppartitions_function.test +++ b/mysql-test/columnstore/1pmonly/t/mcs204_caldroppartitions_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcs204_db; diff --git a/mysql-test/columnstore/1pmonly/t/mcs208_idbPartition_function.test b/mysql-test/columnstore/1pmonly/t/mcs208_idbPartition_function.test index 939b08682..2102a459e 100644 --- a/mysql-test/columnstore/1pmonly/t/mcs208_idbPartition_function.test +++ b/mysql-test/columnstore/1pmonly/t/mcs208_idbPartition_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcs208_db; diff --git a/mysql-test/columnstore/1pmonly/t/mcs209_idbDBRoot_function.test b/mysql-test/columnstore/1pmonly/t/mcs209_idbDBRoot_function.test index b7b381215..d8088cf46 100644 --- a/mysql-test/columnstore/1pmonly/t/mcs209_idbDBRoot_function.test +++ b/mysql-test/columnstore/1pmonly/t/mcs209_idbDBRoot_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcs209_db; diff --git a/mysql-test/columnstore/1pmonly/t/mcs210_idbPm_function.test b/mysql-test/columnstore/1pmonly/t/mcs210_idbPm_function.test index 683acb519..118fa9271 100644 --- a/mysql-test/columnstore/1pmonly/t/mcs210_idbPm_function.test +++ b/mysql-test/columnstore/1pmonly/t/mcs210_idbPm_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcs210_db; diff --git a/mysql-test/columnstore/1pmonly/t/mcs214_idbExtentRelativeRid_function.test b/mysql-test/columnstore/1pmonly/t/mcs214_idbExtentRelativeRid_function.test index 3799c855a..dce101885 100644 --- a/mysql-test/columnstore/1pmonly/t/mcs214_idbExtentRelativeRid_function.test +++ b/mysql-test/columnstore/1pmonly/t/mcs214_idbExtentRelativeRid_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcs214_db; diff --git a/mysql-test/columnstore/1pmonly/t/mcs215_idbSegment_function.test b/mysql-test/columnstore/1pmonly/t/mcs215_idbSegment_function.test index 927c93c89..eb30ae1b8 100644 --- a/mysql-test/columnstore/1pmonly/t/mcs215_idbSegment_function.test +++ b/mysql-test/columnstore/1pmonly/t/mcs215_idbSegment_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcs215_db; diff --git a/mysql-test/columnstore/1pmonly/t/mcs4009_autopilot_partition_management.test b/mysql-test/columnstore/1pmonly/t/mcs4009_autopilot_partition_management.test index bfacdf3f1..074cd1e1b 100755 --- a/mysql-test/columnstore/1pmonly/t/mcs4009_autopilot_partition_management.test +++ b/mysql-test/columnstore/1pmonly/t/mcs4009_autopilot_partition_management.test @@ -4,6 +4,7 @@ # Author: Daniel Lee, daniel.lee@mariadb.com # -------------------------------------------------------------- # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # --disable_warnings DROP DATABASE IF EXISTS mcs4009_db; diff --git a/mysql-test/columnstore/1pmonly/t/mcs7000_version_buffer.test b/mysql-test/columnstore/1pmonly/t/mcs7000_version_buffer.test index db4b43de5..265e121e3 100644 --- a/mysql-test/columnstore/1pmonly/t/mcs7000_version_buffer.test +++ b/mysql-test/columnstore/1pmonly/t/mcs7000_version_buffer.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # --disable_warnings DROP DATABASE IF EXISTS mcs7000_db; diff --git a/mysql-test/columnstore/autopilot/t/mcs4004_autopilot_batchInsert_ldi.test b/mysql-test/columnstore/autopilot/t/mcs4004_autopilot_batchInsert_ldi.test index 4d6c27ed8..81356dcef 100644 --- a/mysql-test/columnstore/autopilot/t/mcs4004_autopilot_batchInsert_ldi.test +++ b/mysql-test/columnstore/autopilot/t/mcs4004_autopilot_batchInsert_ldi.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # --disable_warnings DROP DATABASE IF EXISTS mcs4004_db; diff --git a/mysql-test/columnstore/autopilot/t/mcs4005_autopilot_add_drop_columns.test b/mysql-test/columnstore/autopilot/t/mcs4005_autopilot_add_drop_columns.test index 861ed85c7..1b2a311bb 100755 --- a/mysql-test/columnstore/autopilot/t/mcs4005_autopilot_add_drop_columns.test +++ b/mysql-test/columnstore/autopilot/t/mcs4005_autopilot_add_drop_columns.test @@ -4,6 +4,7 @@ # Author: Daniel Lee, daniel.lee@mariadb.com # -------------------------------------------------------------- # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # --disable_warnings DROP DATABASE IF EXISTS mcs4005_db; diff --git a/mysql-test/columnstore/autopilot/t/mcs4006_autopilot_create_dbt3_database_1m.test b/mysql-test/columnstore/autopilot/t/mcs4006_autopilot_create_dbt3_database_1m.test index fe537e167..148281e16 100755 --- a/mysql-test/columnstore/autopilot/t/mcs4006_autopilot_create_dbt3_database_1m.test +++ b/mysql-test/columnstore/autopilot/t/mcs4006_autopilot_create_dbt3_database_1m.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # --disable_warnings DROP DATABASE IF EXISTS mcs4006_db; diff --git a/mysql-test/columnstore/autopilot/t/mcs4007_autopilot_dbt3_performance_queries_1g.test b/mysql-test/columnstore/autopilot/t/mcs4007_autopilot_dbt3_performance_queries_1g.test index eb7560ad6..1a106a2d6 100644 --- a/mysql-test/columnstore/autopilot/t/mcs4007_autopilot_dbt3_performance_queries_1g.test +++ b/mysql-test/columnstore/autopilot/t/mcs4007_autopilot_dbt3_performance_queries_1g.test @@ -8,6 +8,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # --disable_warnings DROP DATABASE IF EXISTS mcs4007_db; diff --git a/mysql-test/columnstore/autopilot/t/mcs4008_autopilot_sanity_test.test b/mysql-test/columnstore/autopilot/t/mcs4008_autopilot_sanity_test.test index 81f9d4dea..0ce02a580 100755 --- a/mysql-test/columnstore/autopilot/t/mcs4008_autopilot_sanity_test.test +++ b/mysql-test/columnstore/autopilot/t/mcs4008_autopilot_sanity_test.test @@ -4,6 +4,7 @@ # Author: Daniel Lee, daniel.lee@mariadb.com # -------------------------------------------------------------- # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # --disable_warnings DROP DATABASE IF EXISTS mcs4008_db; diff --git a/mysql-test/columnstore/autopilot/t/mcs4010_autopilot_cross_engine_join.test b/mysql-test/columnstore/autopilot/t/mcs4010_autopilot_cross_engine_join.test index bbceec2ad..4649a4d2f 100755 --- a/mysql-test/columnstore/autopilot/t/mcs4010_autopilot_cross_engine_join.test +++ b/mysql-test/columnstore/autopilot/t/mcs4010_autopilot_cross_engine_join.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # --disable_warnings DROP DATABASE IF EXISTS mcs4010_db; diff --git a/mysql-test/columnstore/autopilot/t/mcs4011_autopilot_query_stats.test b/mysql-test/columnstore/autopilot/t/mcs4011_autopilot_query_stats.test index 0387834af..d08529bd5 100755 --- a/mysql-test/columnstore/autopilot/t/mcs4011_autopilot_query_stats.test +++ b/mysql-test/columnstore/autopilot/t/mcs4011_autopilot_query_stats.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # --disable_warnings DROP DATABASE IF EXISTS mcs4011_db; diff --git a/mysql-test/columnstore/basic/r/mcs10_drop_db_table.result b/mysql-test/columnstore/basic/r/mcs10_drop_db_table.result index 655070bda..b1e8acc10 100644 --- a/mysql-test/columnstore/basic/r/mcs10_drop_db_table.result +++ b/mysql-test/columnstore/basic/r/mcs10_drop_db_table.result @@ -62,8 +62,6 @@ DROP TABLE IF EXISTS mcs10_db2.t_columnstore1; USE mcs10_db1; CREATE TABLE t_columnstore1 (id int) engine=columnstore; CREATE TABLE t_columnstore2 (id int) engine=columnstore; -connect addconroot1, localhost, root,,; -connect addconroot2, localhost, root,,; connection addconroot1; DROP TABLE mcs10_db1.t_columnstore1; connection addconroot2; diff --git a/mysql-test/columnstore/basic/r/mcs117_create_utf8_maxscale.result b/mysql-test/columnstore/basic/r/mcs117_create_utf8_maxscale.result new file mode 100644 index 000000000..1007dcd30 --- /dev/null +++ b/mysql-test/columnstore/basic/r/mcs117_create_utf8_maxscale.result @@ -0,0 +1,39 @@ +set names utf8; +DROP DATABASE IF EXISTS mcs117_db; +CREATE DATABASE имя_базы_в_кодировке_утф8_длиной_больше_чем_45; +USE имя_базы_в_кодировке_утф8_длиной_больше_чем_45; +SELECT DATABASE(); +DATABASE() +имя_базы_в_кодировке_утф8_длиной_больше_чем_45 +CREATE DATABASE mcs117_db; +USE mcs117_db; +SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.schemata +WHERE schema_name='имя_базы_в_кодировке_утф8_длиной_больше_чем_45'; +SCHEMA_NAME +имя_базы_в_кодировке_утф8_длиной_больше_чем_45 +DROP DATABASE имя_базы_в_кодировке_утф8_длиной_больше_чем_45; +CREATE TABLE имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48 +( +имя_поля_в_кодировке_утф8_длиной_больше_чем_45 INT +)ENGINE=Columnstore; +SHOW CREATE TABLE имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48; +Table Create Table +имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48 CREATE TABLE `имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48` ( + `имя_поля_в_кодировке_утф8_длиной_больше_чем_45` int(11) DEFAULT NULL +) ENGINE=Columnstore DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci +CREATE VIEW имя_вью_кодировке_утф8_длиной_больше_чем_42 AS SELECT * FROM имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48; +SHOW CREATE VIEW имя_вью_кодировке_утф8_длиной_больше_чем_42; +View Create View character_set_client collation_connection +имя_вью_кодировке_утф8_длиной_больше_чем_42 CREATE ALGORITHM=UNDEFINED DEFINER=`testUser`@`%` SQL SECURITY DEFINER VIEW `имя_вью_кодировке_утф8_длиной_больше_чем_42` AS select `имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48`.`имя_поля_в_кодировке_утф8_длиной_больше_чем_45` AS `имя_поля_в_кодировке_утф8_длиной_больше_чем_45` from `имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48` utf8mb3 utf8mb3_general_ci +select TABLE_NAME from information_schema.tables where table_schema='mcs117_db' order by 1; +TABLE_NAME +имя_вью_кодировке_утф8_длиной_больше_чем_42 +имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48 +select COLUMN_NAME from information_schema.columns where table_schema='mcs117_db' order by 1; +COLUMN_NAME +имя_поля_в_кодировке_утф8_длиной_больше_чем_45 +имя_поля_в_кодировке_утф8_длиной_больше_чем_45 +select TABLE_NAME from information_schema.views where table_schema='mcs117_db' order by 1; +TABLE_NAME +имя_вью_кодировке_утф8_длиной_больше_чем_42 +DROP DATABASE mcs117_db; diff --git a/mysql-test/columnstore/basic/r/mcs11_show_db_table.result b/mysql-test/columnstore/basic/r/mcs11_show_db_table.result index a6085be2a..d703e01f4 100644 --- a/mysql-test/columnstore/basic/r/mcs11_show_db_table.result +++ b/mysql-test/columnstore/basic/r/mcs11_show_db_table.result @@ -40,8 +40,6 @@ SHOW TABLES IN mcs11_db2; Tables_in_mcs11_db2 t1 t2 -connect addconroot1, localhost, root,,; -connect addconroot2, localhost, root,,; connection addconroot1; SHOW DATABASES LIKE 'mcs11%'; Database (mcs11%) diff --git a/mysql-test/columnstore/basic/r/mcs12_alter_table.result b/mysql-test/columnstore/basic/r/mcs12_alter_table.result index 62a91fe61..086f05143 100644 --- a/mysql-test/columnstore/basic/r/mcs12_alter_table.result +++ b/mysql-test/columnstore/basic/r/mcs12_alter_table.result @@ -114,8 +114,6 @@ new_i c i2 2 b 22 DROP TABLE t1; CREATE TABLE t1 (i INTEGER) ENGINE=Columnstore; -connect addconroot1, localhost, root,,; -connect addconroot2, localhost, root,,; connection addconroot1; SHOW CREATE TABLE mcs12_db1.t1; Table Create Table diff --git a/mysql-test/columnstore/basic/r/mcs13_alter_table_negative.result b/mysql-test/columnstore/basic/r/mcs13_alter_table_negative.result index 02d6be8fd..288952088 100644 --- a/mysql-test/columnstore/basic/r/mcs13_alter_table_negative.result +++ b/mysql-test/columnstore/basic/r/mcs13_alter_table_negative.result @@ -38,8 +38,6 @@ ALTER TABLE t1 ADD PRIMARY KEY pk(c1); ERROR 42000: Too many keys specified; max 0 keys allowed ALTER TABLE t1 DROP KEY k1; ERROR 42000: Can't DROP INDEX `k1`; check that it exists -connect addconroot1, localhost, root,,; -connect addconroot2, localhost, root,,; connection addconroot1; ALTER TABLE mcs13_db1.t1 CHANGE c1 c2 INVALIDDATATYPE; ERROR HY000: Unknown data type: 'INVALIDDATATYPE' diff --git a/mysql-test/columnstore/basic/r/mcs14_truncate_table.result b/mysql-test/columnstore/basic/r/mcs14_truncate_table.result index 835d89b28..82b23a0d5 100644 --- a/mysql-test/columnstore/basic/r/mcs14_truncate_table.result +++ b/mysql-test/columnstore/basic/r/mcs14_truncate_table.result @@ -65,8 +65,6 @@ CREATE TABLE t1 (id INT) ENGINE=Columnstore; INSERT INTO t1 (id) VALUES (1), (2), (3), (4), (5); CREATE TABLE t2 LIKE t1; INSERT INTO t2 SELECT * FROM t1; -connect addconroot1, localhost, root,,; -connect addconroot2, localhost, root,,; connection addconroot1; TRUNCATE mcs14_db1.t1; connection addconroot2; diff --git a/mysql-test/columnstore/basic/r/mcs170_session_functions_maxscale.result b/mysql-test/columnstore/basic/r/mcs170_session_functions_maxscale.result new file mode 100644 index 000000000..a00639d39 --- /dev/null +++ b/mysql-test/columnstore/basic/r/mcs170_session_functions_maxscale.result @@ -0,0 +1,23 @@ +SET default_storage_engine=Columnstore; +DROP DATABASE IF EXISTS mcs170_db; +CREATE DATABASE mcs170_db; +USE mcs170_db; +SELECT CONNECTION_ID() > 0; +CONNECTION_ID() > 0 +1 +SELECT CURRENT_USER(); +CURRENT_USER() +testUser@max +SELECT USER(); +USER() +testUser@% +SELECT SESSION_USER(); +SESSION_USER() +testUser@max +SELECT SYSTEM_USER(); +SYSTEM_USER() +testUser@max +SELECT DATABASE(); +DATABASE() +mcs170_db +DROP DATABASE mcs170_db; diff --git a/mysql-test/columnstore/basic/r/mcs19_grant_revoke.result b/mysql-test/columnstore/basic/r/mcs19_grant_revoke.result index b342d3a92..6ab1854c4 100644 --- a/mysql-test/columnstore/basic/r/mcs19_grant_revoke.result +++ b/mysql-test/columnstore/basic/r/mcs19_grant_revoke.result @@ -23,8 +23,6 @@ SHOW GRANTS FOR 'user1'@'localhost'; Grants for user1@localhost GRANT USAGE ON *.* TO `user1`@`localhost` IDENTIFIED BY PASSWORD '*CB386B3062EFB295ED40F6A5B1A8CFE300642E38' GRANT CREATE, SELECT, INSERT ON mcs19_db.* TO 'user1'@'localhost'; -connect conn1, localhost, user1, Vagrant1|0000001,; -connect conn2, localhost, user1, Vagrant1|0000001,; connection conn1; SELECT USER(); USER() diff --git a/mysql-test/columnstore/basic/t/mcol641-insert.test b/mysql-test/columnstore/basic/t/mcol641-insert.test index 7b6aae841..d9f51526a 100644 --- a/mysql-test/columnstore/basic/t/mcol641-insert.test +++ b/mysql-test/columnstore/basic/t/mcol641-insert.test @@ -1,4 +1,5 @@ -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcol641_insert_db; diff --git a/mysql-test/columnstore/basic/t/mcs102_ldi_transform_csv.test b/mysql-test/columnstore/basic/t/mcs102_ldi_transform_csv.test index 1490893e8..0772e48c1 100755 --- a/mysql-test/columnstore/basic/t/mcs102_ldi_transform_csv.test +++ b/mysql-test/columnstore/basic/t/mcs102_ldi_transform_csv.test @@ -3,6 +3,7 @@ # Author: Susil, susil.behera@mariadb.com # # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc let $DATADIR= `SELECT @@datadir`; diff --git a/mysql-test/columnstore/basic/t/mcs103_ldi_fields_enclosed_by.test b/mysql-test/columnstore/basic/t/mcs103_ldi_fields_enclosed_by.test index 81ddf530d..6fc5f1ac6 100755 --- a/mysql-test/columnstore/basic/t/mcs103_ldi_fields_enclosed_by.test +++ b/mysql-test/columnstore/basic/t/mcs103_ldi_fields_enclosed_by.test @@ -3,6 +3,7 @@ # Author: Susil, susil.behera@mariadb.com # # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc let $DATADIR= `SELECT @@datadir`; diff --git a/mysql-test/columnstore/basic/t/mcs104_ldi_fields_escaped_by.test b/mysql-test/columnstore/basic/t/mcs104_ldi_fields_escaped_by.test index fbaff61f2..75f0769b8 100755 --- a/mysql-test/columnstore/basic/t/mcs104_ldi_fields_escaped_by.test +++ b/mysql-test/columnstore/basic/t/mcs104_ldi_fields_escaped_by.test @@ -3,6 +3,7 @@ # Author: Susil, susil.behera@mariadb.com # # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc let $DATADIR= `SELECT @@datadir`; diff --git a/mysql-test/columnstore/basic/t/mcs105_ldi_lines_terminated_by.test b/mysql-test/columnstore/basic/t/mcs105_ldi_lines_terminated_by.test index cd0b4c9af..1a4b9c61d 100755 --- a/mysql-test/columnstore/basic/t/mcs105_ldi_lines_terminated_by.test +++ b/mysql-test/columnstore/basic/t/mcs105_ldi_lines_terminated_by.test @@ -3,6 +3,7 @@ # Author: Susil, susil.behera@mariadb.com # # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc let $DATADIR= `SELECT @@datadir`; diff --git a/mysql-test/columnstore/basic/t/mcs106_ldi_ignore_rows.test b/mysql-test/columnstore/basic/t/mcs106_ldi_ignore_rows.test index 79d799558..ee984177e 100755 --- a/mysql-test/columnstore/basic/t/mcs106_ldi_ignore_rows.test +++ b/mysql-test/columnstore/basic/t/mcs106_ldi_ignore_rows.test @@ -3,6 +3,7 @@ # Author: Susil, susil.behera@mariadb.com # # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc let $DATADIR= `SELECT @@datadir`; diff --git a/mysql-test/columnstore/basic/t/mcs10_drop_db_table.test b/mysql-test/columnstore/basic/t/mcs10_drop_db_table.test index 2699ead99..8cc8c15f3 100644 --- a/mysql-test/columnstore/basic/t/mcs10_drop_db_table.test +++ b/mysql-test/columnstore/basic/t/mcs10_drop_db_table.test @@ -3,6 +3,8 @@ # -- source ../include/have_columnstore.inc -- source include/have_innodb.inc +-- source ../include/check_maxscale.inc + --disable_warnings DROP DATABASE IF EXISTS mcs10_db1; @@ -68,8 +70,18 @@ DROP TABLE IF EXISTS mcs10_db2.t_columnstore1; USE mcs10_db1; CREATE TABLE t_columnstore1 (id int) engine=columnstore; CREATE TABLE t_columnstore2 (id int) engine=columnstore; -connect (addconroot1, localhost, root,,); -connect (addconroot2, localhost, root,,); +--disable_query_log +if ($maxscale == 1) +{ + connect(addconroot1, 127.0.0.1, testUser, 'ct570c3521fCCR#ef',,4006); + connect(addconroot2, 127.0.0.1, testUser, 'ct570c3521fCCR#ef',,4006); +} +if ($maxscale == 0) +{ + connect (addconroot1, localhost, root,,); + connect (addconroot2, localhost, root,,); +} +--enable_query_log connection addconroot1; DROP TABLE mcs10_db1.t_columnstore1; connection addconroot2; diff --git a/mysql-test/columnstore/basic/t/mcs117_create_utf8.test b/mysql-test/columnstore/basic/t/mcs117_create_utf8.test index 6b40b3b61..0c11cab5b 100644 --- a/mysql-test/columnstore/basic/t/mcs117_create_utf8.test +++ b/mysql-test/columnstore/basic/t/mcs117_create_utf8.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +-- source ../include/detect_maxscale.inc set names utf8; diff --git a/mysql-test/columnstore/basic/t/mcs117_create_utf8_maxscale.test b/mysql-test/columnstore/basic/t/mcs117_create_utf8_maxscale.test new file mode 100644 index 000000000..b04312d38 --- /dev/null +++ b/mysql-test/columnstore/basic/t/mcs117_create_utf8_maxscale.test @@ -0,0 +1,44 @@ +# +# Test UTF8 names +# Author: Bharath, bharath.bokka@mariadb.com +# +-- source ../include/have_columnstore.inc +-- source ../include/detect_no_maxscale.inc + +set names utf8; + +--disable_warnings +DROP DATABASE IF EXISTS mcs117_db; +--enable_warnings + +CREATE DATABASE имя_базы_в_кодировке_утф8_длиной_больше_чем_45; +USE имя_базы_в_кодировке_утф8_длиной_больше_чем_45; +SELECT DATABASE(); + +CREATE DATABASE mcs117_db; +USE mcs117_db; + +SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.schemata +WHERE schema_name='имя_базы_в_кодировке_утф8_длиной_больше_чем_45'; + +DROP DATABASE имя_базы_в_кодировке_утф8_длиной_больше_чем_45; + +CREATE TABLE имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48 +( + имя_поля_в_кодировке_утф8_длиной_больше_чем_45 INT +)ENGINE=Columnstore; + +--replace_regex /( COLLATE=latin1_swedish_ci)// +SHOW CREATE TABLE имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48; + +CREATE VIEW имя_вью_кодировке_утф8_длиной_больше_чем_42 AS SELECT * FROM имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48; +SHOW CREATE VIEW имя_вью_кодировке_утф8_длиной_больше_чем_42; + +select TABLE_NAME from information_schema.tables where table_schema='mcs117_db' order by 1; + +select COLUMN_NAME from information_schema.columns where table_schema='mcs117_db' order by 1; + +select TABLE_NAME from information_schema.views where table_schema='mcs117_db' order by 1; + +# Clean UP +DROP DATABASE mcs117_db; diff --git a/mysql-test/columnstore/basic/t/mcs11_show_db_table.test b/mysql-test/columnstore/basic/t/mcs11_show_db_table.test index 3d7fb8756..2d90ca47d 100644 --- a/mysql-test/columnstore/basic/t/mcs11_show_db_table.test +++ b/mysql-test/columnstore/basic/t/mcs11_show_db_table.test @@ -3,6 +3,8 @@ # -- source ../include/have_columnstore.inc -- source include/have_innodb.inc +-- source ../include/check_maxscale.inc + --disable_warnings DROP DATABASE IF EXISTS mcs11_db1; @@ -41,8 +43,18 @@ SHOW TABLES; SHOW TABLES IN mcs11_db2; # Test from parallel connections -connect (addconroot1, localhost, root,,); -connect (addconroot2, localhost, root,,); +--disable_query_log +if ($maxscale == 1) +{ + connect(addconroot1, 127.0.0.1, testUser, 'ct570c3521fCCR#ef',,4006); + connect(addconroot2, 127.0.0.1, testUser, 'ct570c3521fCCR#ef',,4006); +} +if ($maxscale == 0) +{ + connect (addconroot1, localhost, root,,); + connect (addconroot2, localhost, root,,); +} +--enable_query_log connection addconroot1; --sorted_result SHOW DATABASES LIKE 'mcs11%'; diff --git a/mysql-test/columnstore/basic/t/mcs12_alter_table.test b/mysql-test/columnstore/basic/t/mcs12_alter_table.test index f1f67b5f8..69fa2c1ff 100644 --- a/mysql-test/columnstore/basic/t/mcs12_alter_table.test +++ b/mysql-test/columnstore/basic/t/mcs12_alter_table.test @@ -3,6 +3,8 @@ # -- source ../include/have_columnstore.inc -- source include/have_innodb.inc +-- source ../include/check_maxscale.inc + --disable_warnings DROP DATABASE IF EXISTS mcs12_db1; @@ -67,8 +69,18 @@ DROP TABLE t1; CREATE TABLE t1 (i INTEGER) ENGINE=Columnstore; # Test from parallel connections -connect (addconroot1, localhost, root,,); -connect (addconroot2, localhost, root,,); +--disable_query_log +if ($maxscale == 1) +{ + connect(addconroot1, 127.0.0.1, testUser, 'ct570c3521fCCR#ef',,4006); + connect(addconroot2, 127.0.0.1, testUser, 'ct570c3521fCCR#ef',,4006); +} +if ($maxscale == 0) +{ + connect (addconroot1, localhost, root,,); + connect (addconroot2, localhost, root,,); +} +--enable_query_log connection addconroot1; --replace_regex /( COLLATE=latin1_swedish_ci)// SHOW CREATE TABLE mcs12_db1.t1; diff --git a/mysql-test/columnstore/basic/t/mcs13_alter_table_negative.test b/mysql-test/columnstore/basic/t/mcs13_alter_table_negative.test index 436fd6535..0c4b86415 100644 --- a/mysql-test/columnstore/basic/t/mcs13_alter_table_negative.test +++ b/mysql-test/columnstore/basic/t/mcs13_alter_table_negative.test @@ -2,6 +2,8 @@ # Test ALTER TABLE schemas in various negative scenarios. # -- source ../include/have_columnstore.inc +-- source ../include/check_maxscale.inc + --disable_warnings DROP DATABASE IF EXISTS mcs13_db1; @@ -54,8 +56,18 @@ ALTER TABLE t1 ADD PRIMARY KEY pk(c1); ALTER TABLE t1 DROP KEY k1; # Test from parallel connections -connect (addconroot1, localhost, root,,); -connect (addconroot2, localhost, root,,); +--disable_query_log +if ($maxscale == 1) +{ + connect(addconroot1, 127.0.0.1, testUser, 'ct570c3521fCCR#ef',,4006); + connect(addconroot2, 127.0.0.1, testUser, 'ct570c3521fCCR#ef',,4006); +} +if ($maxscale == 0) +{ + connect (addconroot1, localhost, root,,); + connect (addconroot2, localhost, root,,); +} +--enable_query_log connection addconroot1; --error 4161 ALTER TABLE mcs13_db1.t1 CHANGE c1 c2 INVALIDDATATYPE; diff --git a/mysql-test/columnstore/basic/t/mcs14_truncate_table.test b/mysql-test/columnstore/basic/t/mcs14_truncate_table.test index ad143d68d..58903bf7f 100644 --- a/mysql-test/columnstore/basic/t/mcs14_truncate_table.test +++ b/mysql-test/columnstore/basic/t/mcs14_truncate_table.test @@ -3,6 +3,8 @@ # -- source ../include/have_columnstore.inc -- source include/have_innodb.inc +-- source ../include/check_maxscale.inc + --disable_warnings DROP DATABASE IF EXISTS mcs14_db1; @@ -68,8 +70,18 @@ CREATE TABLE t2 LIKE t1; INSERT INTO t2 SELECT * FROM t1; # Test from parallel connections -connect (addconroot1, localhost, root,,); -connect (addconroot2, localhost, root,,); +--disable_query_log +if ($maxscale == 1) +{ + connect(addconroot1, 127.0.0.1, testUser, 'ct570c3521fCCR#ef',,4006); + connect(addconroot2, 127.0.0.1, testUser, 'ct570c3521fCCR#ef',,4006); +} +if ($maxscale == 0) +{ + connect (addconroot1, localhost, root,,); + connect (addconroot2, localhost, root,,); +} +--enable_query_log connection addconroot1; TRUNCATE mcs14_db1.t1; connection addconroot2; diff --git a/mysql-test/columnstore/basic/t/mcs170_session_functions.test b/mysql-test/columnstore/basic/t/mcs170_session_functions.test index 210f172bb..27bd33471 100644 --- a/mysql-test/columnstore/basic/t/mcs170_session_functions.test +++ b/mysql-test/columnstore/basic/t/mcs170_session_functions.test @@ -3,6 +3,8 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc + SET default_storage_engine=Columnstore; diff --git a/mysql-test/columnstore/basic/t/mcs170_session_functions_maxscale.test b/mysql-test/columnstore/basic/t/mcs170_session_functions_maxscale.test new file mode 100644 index 000000000..dbf198748 --- /dev/null +++ b/mysql-test/columnstore/basic/t/mcs170_session_functions_maxscale.test @@ -0,0 +1,26 @@ +# +# Test Session functions +# Author: Bharath, bharath.bokka@mariadb.com +# +-- source ../include/have_columnstore.inc +--source ../include/detect_no_maxscale.inc + + +SET default_storage_engine=Columnstore; + +--disable_warnings +DROP DATABASE IF EXISTS mcs170_db; +--enable_warnings + +CREATE DATABASE mcs170_db; +USE mcs170_db; + +SELECT CONNECTION_ID() > 0; +SELECT CURRENT_USER(); +SELECT USER(); +SELECT SESSION_USER(); +SELECT SYSTEM_USER(); +SELECT DATABASE(); + +# Clean UP +DROP DATABASE mcs170_db; diff --git a/mysql-test/columnstore/basic/t/mcs19_grant_revoke.test b/mysql-test/columnstore/basic/t/mcs19_grant_revoke.test index 8ad56181c..f514756ef 100644 --- a/mysql-test/columnstore/basic/t/mcs19_grant_revoke.test +++ b/mysql-test/columnstore/basic/t/mcs19_grant_revoke.test @@ -4,6 +4,8 @@ # -- source ../include/have_columnstore.inc -- source include/have_innodb.inc +-- source ../include/check_maxscale.inc + SET default_storage_engine=InnoDB; @@ -29,10 +31,17 @@ GRANT CREATE, SELECT, INSERT ON mcs19_db.* TO 'user1'@'localhost'; --disable_query_log GRANT ALL ON test.* TO 'user1'@'localhost'; +if ($maxscale == 1) +{ + connect(conn1, 127.0.0.1, user1, Vagrant1|0000001,,4006); + connect(conn2, 127.0.0.1, user1, Vagrant1|0000001,,4006); +} +if ($maxscale == 0) +{ + connect(conn1, localhost, user1, Vagrant1|0000001,); + connect(conn2, localhost, user1, Vagrant1|0000001,); +} --enable_query_log -connect(conn1, localhost, user1, Vagrant1|0000001,); -connect(conn2, localhost, user1, Vagrant1|0000001,); - connection conn1; SELECT USER(); SHOW GRANTS FOR 'user1'@'localhost'; diff --git a/mysql-test/columnstore/basic/t/mcs211_idbExtentId_function.test b/mysql-test/columnstore/basic/t/mcs211_idbExtentId_function.test index 09b676e30..97d4d5a3f 100644 --- a/mysql-test/columnstore/basic/t/mcs211_idbExtentId_function.test +++ b/mysql-test/columnstore/basic/t/mcs211_idbExtentId_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcs211_db; diff --git a/mysql-test/columnstore/basic/t/mcs212_idbExtentMax_function.test b/mysql-test/columnstore/basic/t/mcs212_idbExtentMax_function.test index af0e28b59..ed1d6d85c 100644 --- a/mysql-test/columnstore/basic/t/mcs212_idbExtentMax_function.test +++ b/mysql-test/columnstore/basic/t/mcs212_idbExtentMax_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcs212_db; diff --git a/mysql-test/columnstore/basic/t/mcs213_idbExtentMin_function.test b/mysql-test/columnstore/basic/t/mcs213_idbExtentMin_function.test index 6f19f7c3e..fefccb568 100644 --- a/mysql-test/columnstore/basic/t/mcs213_idbExtentMin_function.test +++ b/mysql-test/columnstore/basic/t/mcs213_idbExtentMin_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcs213_db; diff --git a/mysql-test/columnstore/basic/t/mcs216_idbSegmentDir_function.test b/mysql-test/columnstore/basic/t/mcs216_idbSegmentDir_function.test index ec3a48419..303deafc8 100644 --- a/mysql-test/columnstore/basic/t/mcs216_idbSegmentDir_function.test +++ b/mysql-test/columnstore/basic/t/mcs216_idbSegmentDir_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcs216_db; diff --git a/mysql-test/columnstore/basic/t/mcs28_load_data_local_infile.test b/mysql-test/columnstore/basic/t/mcs28_load_data_local_infile.test index ff994d78c..af2e11e78 100755 --- a/mysql-test/columnstore/basic/t/mcs28_load_data_local_infile.test +++ b/mysql-test/columnstore/basic/t/mcs28_load_data_local_infile.test @@ -3,6 +3,7 @@ # Author: Susil, susil.behera@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcs28_db1; diff --git a/mysql-test/columnstore/basic/t/mcs29_load_data_local_infile_negative.test b/mysql-test/columnstore/basic/t/mcs29_load_data_local_infile_negative.test index 3923f74b9..514c5fc76 100755 --- a/mysql-test/columnstore/basic/t/mcs29_load_data_local_infile_negative.test +++ b/mysql-test/columnstore/basic/t/mcs29_load_data_local_infile_negative.test @@ -3,6 +3,7 @@ # Author: Susil, susil.behera@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcs29_db1; diff --git a/mysql-test/columnstore/basic/t/mcs47_cpimport_central_loc_sin_source.test b/mysql-test/columnstore/basic/t/mcs47_cpimport_central_loc_sin_source.test index 613dfb88b..e31f97e7c 100644 --- a/mysql-test/columnstore/basic/t/mcs47_cpimport_central_loc_sin_source.test +++ b/mysql-test/columnstore/basic/t/mcs47_cpimport_central_loc_sin_source.test @@ -8,6 +8,7 @@ if (!$MYSQL_TEST_ROOT){ } -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcs47_db; diff --git a/mysql-test/columnstore/basic/t/mcs50_cpimport_stdin.test b/mysql-test/columnstore/basic/t/mcs50_cpimport_stdin.test index adb9d3b3b..4f22be8e6 100644 --- a/mysql-test/columnstore/basic/t/mcs50_cpimport_stdin.test +++ b/mysql-test/columnstore/basic/t/mcs50_cpimport_stdin.test @@ -8,6 +8,7 @@ if (!$MYSQL_TEST_ROOT){ } -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcs50_db; diff --git a/mysql-test/columnstore/basic/t/mcs51_cpimport_select_from.test b/mysql-test/columnstore/basic/t/mcs51_cpimport_select_from.test index 00ba6ce8d..84d70a107 100644 --- a/mysql-test/columnstore/basic/t/mcs51_cpimport_select_from.test +++ b/mysql-test/columnstore/basic/t/mcs51_cpimport_select_from.test @@ -8,6 +8,7 @@ if (!$MYSQL_TEST_ROOT){ } -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc -- source include/have_innodb.inc --disable_warnings diff --git a/mysql-test/columnstore/basic/t/mcs55_cpimport_binary_source.test b/mysql-test/columnstore/basic/t/mcs55_cpimport_binary_source.test index 993e0fdba..aa5f7e978 100644 --- a/mysql-test/columnstore/basic/t/mcs55_cpimport_binary_source.test +++ b/mysql-test/columnstore/basic/t/mcs55_cpimport_binary_source.test @@ -8,6 +8,7 @@ if (!$MYSQL_TEST_ROOT){ } -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcs55_db; diff --git a/mysql-test/columnstore/basic/t/mcs67_ldi_datafile_separators.test b/mysql-test/columnstore/basic/t/mcs67_ldi_datafile_separators.test index ff4bef139..23ac68456 100644 --- a/mysql-test/columnstore/basic/t/mcs67_ldi_datafile_separators.test +++ b/mysql-test/columnstore/basic/t/mcs67_ldi_datafile_separators.test @@ -3,6 +3,7 @@ # Author: Susil, susil.behera@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcs67_db; diff --git a/mysql-test/columnstore/basic/t/mcs68_cpimport_datafile_separators.test b/mysql-test/columnstore/basic/t/mcs68_cpimport_datafile_separators.test index 907f09014..e22913d11 100644 --- a/mysql-test/columnstore/basic/t/mcs68_cpimport_datafile_separators.test +++ b/mysql-test/columnstore/basic/t/mcs68_cpimport_datafile_separators.test @@ -8,6 +8,7 @@ if (!$MYSQL_TEST_ROOT){ } -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS mcs68_db; diff --git a/mysql-test/columnstore/basic/t/mcs88_import_export_csv.test b/mysql-test/columnstore/basic/t/mcs88_import_export_csv.test index 2c0ba7c26..daeaf4bbb 100644 --- a/mysql-test/columnstore/basic/t/mcs88_import_export_csv.test +++ b/mysql-test/columnstore/basic/t/mcs88_import_export_csv.test @@ -3,6 +3,7 @@ # Author: Susil, susil.behera@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc let $DATADIR= `SELECT @@datadir`; diff --git a/mysql-test/columnstore/basic/t/std_aggregate_columnstore.test b/mysql-test/columnstore/basic/t/std_aggregate_columnstore.test index fdc90fba9..8b9598504 100644 --- a/mysql-test/columnstore/basic/t/std_aggregate_columnstore.test +++ b/mysql-test/columnstore/basic/t/std_aggregate_columnstore.test @@ -1,4 +1,5 @@ -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS std_test_db; diff --git a/mysql-test/columnstore/basic/t/std_aggregate_window_columnstore.test b/mysql-test/columnstore/basic/t/std_aggregate_window_columnstore.test index 874095076..17405588b 100644 --- a/mysql-test/columnstore/basic/t/std_aggregate_window_columnstore.test +++ b/mysql-test/columnstore/basic/t/std_aggregate_window_columnstore.test @@ -1,4 +1,5 @@ -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS std_test_db; diff --git a/mysql-test/columnstore/basic/t/unsigned_aggregate.test b/mysql-test/columnstore/basic/t/unsigned_aggregate.test index 14c068991..e45fb4e4d 100644 --- a/mysql-test/columnstore/basic/t/unsigned_aggregate.test +++ b/mysql-test/columnstore/basic/t/unsigned_aggregate.test @@ -1,4 +1,5 @@ -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS unsigned_aggregate_db; diff --git a/mysql-test/columnstore/basic/t/unsigned_joins.test b/mysql-test/columnstore/basic/t/unsigned_joins.test index 9accb2be0..9d60f0b4b 100644 --- a/mysql-test/columnstore/basic/t/unsigned_joins.test +++ b/mysql-test/columnstore/basic/t/unsigned_joins.test @@ -1,4 +1,5 @@ -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS unsigned_joins_db; diff --git a/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.test b/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.test index 06cc2abdd..31311d992 100644 --- a/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.test +++ b/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.test @@ -1,3 +1,5 @@ +--source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --disable_warnings DROP DATABASE IF EXISTS db4741; --enable_warnings diff --git a/mysql-test/columnstore/bugfixes/mcol-4931.test b/mysql-test/columnstore/bugfixes/mcol-4931.test index eafcc3ceb..5a5c509cf 100644 --- a/mysql-test/columnstore/bugfixes/mcol-4931.test +++ b/mysql-test/columnstore/bugfixes/mcol-4931.test @@ -7,6 +7,7 @@ if (!$MYSQL_TEST_ROOT){ } --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc let $DATADIR=`SELECT @@datadir`; diff --git a/mysql-test/columnstore/bugfixes/mcol-5480.test b/mysql-test/columnstore/bugfixes/mcol-5480.test index 48fa79464..ab32e1503 100644 --- a/mysql-test/columnstore/bugfixes/mcol-5480.test +++ b/mysql-test/columnstore/bugfixes/mcol-5480.test @@ -4,6 +4,7 @@ # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc let $DATADIR=`SELECT @@datadir`; diff --git a/mysql-test/columnstore/devregression/t/mcs7058_regression_bug3262.test b/mysql-test/columnstore/devregression/t/mcs7058_regression_bug3262.test index d8f216990..7916dff54 100644 --- a/mysql-test/columnstore/devregression/t/mcs7058_regression_bug3262.test +++ b/mysql-test/columnstore/devregression/t/mcs7058_regression_bug3262.test @@ -5,6 +5,8 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc + # USE tpch1; # diff --git a/mysql-test/columnstore/devregression/t/mcs7072_regression_bug3406.test b/mysql-test/columnstore/devregression/t/mcs7072_regression_bug3406.test index 990f68501..39aa61e80 100644 --- a/mysql-test/columnstore/devregression/t/mcs7072_regression_bug3406.test +++ b/mysql-test/columnstore/devregression/t/mcs7072_regression_bug3406.test @@ -5,6 +5,8 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc + # USE tpch1; # diff --git a/mysql-test/columnstore/devregression/t/mcs7094_regression_bug3520.test b/mysql-test/columnstore/devregression/t/mcs7094_regression_bug3520.test index b65aa5f54..f347bf345 100644 --- a/mysql-test/columnstore/devregression/t/mcs7094_regression_bug3520.test +++ b/mysql-test/columnstore/devregression/t/mcs7094_regression_bug3520.test @@ -5,6 +5,8 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc + # USE ssb1; # diff --git a/mysql-test/columnstore/devregression/t/mcs7130_regression_bug3935.test b/mysql-test/columnstore/devregression/t/mcs7130_regression_bug3935.test index a111e77ee..7979eaad0 100644 --- a/mysql-test/columnstore/devregression/t/mcs7130_regression_bug3935.test +++ b/mysql-test/columnstore/devregression/t/mcs7130_regression_bug3935.test @@ -5,6 +5,8 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc + # USE tpch1; # diff --git a/mysql-test/columnstore/devregression/t/mcs7230_regression_MCOL-4000.test b/mysql-test/columnstore/devregression/t/mcs7230_regression_MCOL-4000.test index c8455c619..dce283beb 100644 --- a/mysql-test/columnstore/devregression/t/mcs7230_regression_MCOL-4000.test +++ b/mysql-test/columnstore/devregression/t/mcs7230_regression_MCOL-4000.test @@ -5,6 +5,8 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc + # USE tpch1; # diff --git a/mysql-test/columnstore/devregression/t/mcs7231_regression_MCOL-4002.test b/mysql-test/columnstore/devregression/t/mcs7231_regression_MCOL-4002.test index dd9736d25..50aa87676 100644 --- a/mysql-test/columnstore/devregression/t/mcs7231_regression_MCOL-4002.test +++ b/mysql-test/columnstore/devregression/t/mcs7231_regression_MCOL-4002.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE tpch1; # diff --git a/mysql-test/columnstore/extended/t/mcs7001_update_100mil_rows.test b/mysql-test/columnstore/extended/t/mcs7001_update_100mil_rows.test index f14947289..0763bdf04 100644 --- a/mysql-test/columnstore/extended/t/mcs7001_update_100mil_rows.test +++ b/mysql-test/columnstore/extended/t/mcs7001_update_100mil_rows.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # --disable_warnings DROP DATABASE IF EXISTS mcs7001_db; diff --git a/mysql-test/columnstore/extended/t/mcs7002_ldi_rollback.test b/mysql-test/columnstore/extended/t/mcs7002_ldi_rollback.test index f66730221..aa7dd7ff4 100644 --- a/mysql-test/columnstore/extended/t/mcs7002_ldi_rollback.test +++ b/mysql-test/columnstore/extended/t/mcs7002_ldi_rollback.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # --disable_warnings DROP DATABASE IF EXISTS mcs7002_db; diff --git a/mysql-test/columnstore/include/check_maxscale.inc b/mysql-test/columnstore/include/check_maxscale.inc new file mode 100644 index 000000000..10039348e --- /dev/null +++ b/mysql-test/columnstore/include/check_maxscale.inc @@ -0,0 +1,9 @@ +--disable_abort_on_error +let $maxscale = 0; +let $maxscalerepl = `SELECT @is_maxscale`; +if ($maxscalerepl == "YES") +{ + let $maxscale = 1; +} + +--enable_abort_on_error diff --git a/mysql-test/columnstore/include/detect_maxscale.inc b/mysql-test/columnstore/include/detect_maxscale.inc new file mode 100644 index 000000000..33165732a --- /dev/null +++ b/mysql-test/columnstore/include/detect_maxscale.inc @@ -0,0 +1,10 @@ +--disable_abort_on_error + +let $maxscale = `SELECT @is_maxscale`; + +if ($maxscale == "YES") +{ + --skip Test can not be used with Maxscale. +} + +--enable_abort_on_error diff --git a/mysql-test/columnstore/include/detect_no_maxscale.inc b/mysql-test/columnstore/include/detect_no_maxscale.inc new file mode 100644 index 000000000..4701df844 --- /dev/null +++ b/mysql-test/columnstore/include/detect_no_maxscale.inc @@ -0,0 +1,10 @@ +--disable_abort_on_error + +let $maxscale = `SELECT @is_maxscale`; + +if ($maxscale != "YES") +{ + --skip Test requires connection via Maxscale. +} + +--enable_abort_on_error diff --git a/mysql-test/columnstore/oracle/func_concat_oracle.test b/mysql-test/columnstore/oracle/func_concat_oracle.test index be8399eb0..fb4ad720f 100644 --- a/mysql-test/columnstore/oracle/func_concat_oracle.test +++ b/mysql-test/columnstore/oracle/func_concat_oracle.test @@ -1,6 +1,9 @@ # # Testing CONCAT with null values # +--source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc + SET sql_mode=ORACLE; SET default_storage_engine=ColumnStore; diff --git a/mysql-test/columnstore/oracle/func_concat_oracle_maxscale.result b/mysql-test/columnstore/oracle/func_concat_oracle_maxscale.result new file mode 100644 index 000000000..2efb6daff --- /dev/null +++ b/mysql-test/columnstore/oracle/func_concat_oracle_maxscale.result @@ -0,0 +1,389 @@ +SET sql_mode=ORACLE; +SET default_storage_engine=ColumnStore; +EXPLAIN EXTENDED SELECT 'a'||'b'||'c'; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Warnings: +Note 1003 select concat(concat('a','b'),'c') AS "'a'||'b'||'c'" +EXPLAIN EXTENDED SELECT CONCAT('a'||'b'||'c'); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Warnings: +Note 1003 select concat(concat(concat('a','b'),'c')) AS "CONCAT('a'||'b'||'c')" +SELECT '' || ''; +'' || '' + +SELECT '' || 'b'; +'' || 'b' +b +SELECT '' || NULL; +'' || NULL + +SELECT 'a' || ''; +'a' || '' +a +SELECT 'a' || 'b'; +'a' || 'b' +ab +SELECT 'a' || NULL; +'a' || NULL +a +SELECT NULL || ''; +NULL || '' + +SELECT NULL || 'b'; +NULL || 'b' +b +SELECT NULL || NULL; +NULL || NULL +NULL +SELECT '' || '' || ''; +'' || '' || '' + +SELECT '' || '' || 'c'; +'' || '' || 'c' +c +SELECT '' || '' || NULL; +'' || '' || NULL + +SELECT '' || 'b' || ''; +'' || 'b' || '' +b +SELECT '' || 'b' || 'c'; +'' || 'b' || 'c' +bc +SELECT '' || 'b' || NULL; +'' || 'b' || NULL +b +SELECT '' || NULL || ''; +'' || NULL || '' + +SELECT '' || NULL || 'c'; +'' || NULL || 'c' +c +SELECT '' || NULL || NULL; +'' || NULL || NULL + +SELECT 'a' || '' || ''; +'a' || '' || '' +a +SELECT 'a' || '' || 'c'; +'a' || '' || 'c' +ac +SELECT 'a' || '' || NULL; +'a' || '' || NULL +a +SELECT 'a' || 'b' || ''; +'a' || 'b' || '' +ab +SELECT 'a' || 'b' || 'c'; +'a' || 'b' || 'c' +abc +SELECT 'a' || 'b' || NULL; +'a' || 'b' || NULL +ab +SELECT 'a' || NULL || ''; +'a' || NULL || '' +a +SELECT 'a' || NULL || 'c'; +'a' || NULL || 'c' +ac +SELECT 'a' || NULL || NULL; +'a' || NULL || NULL +a +SELECT NULL || '' || ''; +NULL || '' || '' + +SELECT NULL || '' || 'c'; +NULL || '' || 'c' +c +SELECT NULL || '' || NULL; +NULL || '' || NULL + +SELECT NULL || 'b' || ''; +NULL || 'b' || '' +b +SELECT NULL || 'b' || 'c'; +NULL || 'b' || 'c' +bc +SELECT NULL || 'b' || NULL; +NULL || 'b' || NULL +b +SELECT NULL || NULL || ''; +NULL || NULL || '' + +SELECT NULL || NULL || 'c'; +NULL || NULL || 'c' +c +SELECT NULL || NULL || NULL; +NULL || NULL || NULL +NULL +CREATE TABLE t1 (a VARCHAR(10), b VARCHAR(10), c VARCHAR(10)); +INSERT INTO t1 VALUES ('', '', ''); +INSERT INTO t1 VALUES ('', '', 'c'); +INSERT INTO t1 VALUES ('', '', NULL); +INSERT INTO t1 VALUES ('', 'b', ''); +INSERT INTO t1 VALUES ('', 'b', 'c'); +INSERT INTO t1 VALUES ('', 'b', NULL); +INSERT INTO t1 VALUES ('', NULL, ''); +INSERT INTO t1 VALUES ('', NULL, 'c'); +INSERT INTO t1 VALUES ('', NULL, NULL); +INSERT INTO t1 VALUES ('a', '', ''); +INSERT INTO t1 VALUES ('a', '', 'c'); +INSERT INTO t1 VALUES ('a', '', NULL); +INSERT INTO t1 VALUES ('a', 'b', ''); +INSERT INTO t1 VALUES ('a', 'b', 'c'); +INSERT INTO t1 VALUES ('a', 'b', NULL); +INSERT INTO t1 VALUES ('a', NULL, ''); +INSERT INTO t1 VALUES ('a', NULL, 'c'); +INSERT INTO t1 VALUES ('a', NULL, NULL); +INSERT INTO t1 VALUES (NULL, '', ''); +INSERT INTO t1 VALUES (NULL, '', 'c'); +INSERT INTO t1 VALUES (NULL, '', NULL); +INSERT INTO t1 VALUES (NULL, 'b', ''); +INSERT INTO t1 VALUES (NULL, 'b', 'c'); +INSERT INTO t1 VALUES (NULL, 'b', NULL); +INSERT INTO t1 VALUES (NULL, NULL, ''); +INSERT INTO t1 VALUES (NULL, NULL, 'c'); +INSERT INTO t1 VALUES (NULL, NULL, NULL); +SELECT LENGTH(a||b||c), a||b||c FROM t1 ORDER BY a,b,c; +LENGTH(a||b||c) a||b||c +NULL NULL +0 +1 c +0 +0 +1 c +1 b +1 b +2 bc +0 +0 +1 c +0 +0 +1 c +1 b +1 b +2 bc +1 a +1 a +2 ac +1 a +1 a +2 ac +2 ab +2 ab +3 abc +SELECT LENGTH(CONCAT(a||b||c)), CONCAT(a||b||c) FROM t1 ORDER BY a,b,c; +LENGTH(CONCAT(a||b||c)) CONCAT(a||b||c) +NULL NULL +0 +1 c +0 +0 +1 c +1 b +1 b +2 bc +0 +0 +1 c +0 +0 +1 c +1 b +1 b +2 bc +1 a +1 a +2 ac +1 a +1 a +2 ac +2 ab +2 ab +3 abc +DROP TABLE t1; +# +# MDEV-12478 CONCAT function inside view casts values incorrectly with Oracle sql_mode +# +SET sql_mode=ORACLE; +CREATE VIEW v1 AS SELECT 'foo'||NULL||'bar' AS test; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE VIEW "v1" AS select concat(concat('foo',NULL),'bar') AS "test" latin1 latin1_swedish_ci +SELECT * FROM v1; +test +foobar +SET sql_mode=DEFAULT; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`testUser`@`%` SQL SECURITY DEFINER VIEW `v1` AS select oracle_schema.concat(oracle_schema.concat('foo',NULL),'bar') AS `test` latin1 latin1_swedish_ci +SELECT * FROM v1; +test +foobar +DROP VIEW v1; +SET sql_mode=DEFAULT; +CREATE VIEW v1 AS SELECT CONCAT('foo',NULL,'bar') AS test; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`testUser`@`%` SQL SECURITY DEFINER VIEW `v1` AS select concat('foo',NULL,'bar') AS `test` latin1 latin1_swedish_ci +SELECT * FROM v1; +test +NULL +SET sql_mode=ORACLE; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE VIEW "v1" AS select mariadb_schema.concat('foo',NULL,'bar') AS "test" latin1 latin1_swedish_ci +SELECT * FROM v1; +test +NULL +DROP VIEW v1; +SET sql_mode=DEFAULT; +CREATE VIEW v1 AS SELECT '0'||'1' AS test; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`testUser`@`%` SQL SECURITY DEFINER VIEW `v1` AS select '0' or '1' AS `test` latin1 latin1_swedish_ci +SELECT * FROM v1; +test +1 +SET sql_mode=ORACLE; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE VIEW "v1" AS select '0' or '1' AS "test" latin1 latin1_swedish_ci +SELECT * FROM v1; +test +1 +DROP VIEW v1; +# +# MDEV-16186 Concatenation operator || returns wrong results in sql_mode=ORACLE +# +SELECT -1<<1||1 AS a FROM DUAL; +a +18446744073709549568 +SELECT -1||0<<1 AS a FROM DUAL; +a +18446744073709551596 +EXPLAIN EXTENDED SELECT -1<<1||1 AS a FROM DUAL; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Warnings: +Note 1003 select -1 << concat(1,1) AS "a" +EXPLAIN EXTENDED SELECT -1||0<<1 AS a FROM DUAL; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Warnings: +Note 1003 select concat(-1,0) << 1 AS "a" +SELECT -1+1||1 AS a FROM DUAL; +a +01 +SELECT -1||0+1 AS a FROM DUAL; +a +-9 +EXPLAIN EXTENDED SELECT -1+1||1 AS a FROM DUAL; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Warnings: +Note 1003 select concat(-1 + 1,1) AS "a" +EXPLAIN EXTENDED SELECT -1||0+1 AS a FROM DUAL; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Warnings: +Note 1003 select concat(-1,0) + 1 AS "a" +SELECT 1*1||-1 AS a FROM DUAL; +a +1-1 +SELECT 1||1*-1 AS a FROM DUAL; +a +1-1 +EXPLAIN EXTENDED SELECT 1*1||-1 AS a FROM DUAL; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Warnings: +Note 1003 select concat(1 * 1,-1) AS "a" +EXPLAIN EXTENDED SELECT 1||1*-1 AS a FROM DUAL; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Warnings: +Note 1003 select concat(1,1 * -1) AS "a" +SELECT -1^1||1 AS a FROM DUAL; +a +184467440737095516141 +SELECT -1||0^1 AS a FROM DUAL; +a +-11 +EXPLAIN EXTENDED SELECT -1^1||1 AS a FROM DUAL; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Warnings: +Note 1003 select concat(-1 ^ 1,1) AS "a" +EXPLAIN EXTENDED SELECT -1||0^1 AS a FROM DUAL; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Warnings: +Note 1003 select concat(-1,0 ^ 1) AS "a" +# +# MDEV-17359 Concatenation operator || in like expression failed in sql_mode=ORACLE +# +SELECT 'abc' LIKE 'a'||'%'; +'abc' LIKE 'a'||'%' +1 +EXPLAIN EXTENDED SELECT 'abc' LIKE 'a'||'%'; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Warnings: +Note 1003 select 'abc' like concat('a','%') AS "'abc' LIKE 'a'||'%'" +SELECT 'x' FROM DUAL WHERE 11 LIKE 1||1; +x +x +SELECT 'x' FROM DUAL WHERE 1||1 LIKE 11; +x +x +SELECT 'x' FROM DUAL WHERE 1||1 LIKE 1||1; +x +x +CREATE TABLE t1 (c1 VARCHAR(10),c2 VARCHAR(10), ord INTEGER); +INSERT INTO t1 VALUES ('a', 'ab' ,1); +INSERT INTO t1 VALUES ('ab', 'ab', 2); +INSERT INTO t1 VALUES ('abc', 'ab', 3); +SELECT c1 FROM t1 WHERE c1 LIKE '%'||'b' ORDER BY ord; +c1 +ab +EXPLAIN EXTENDED SELECT c1 FROM t1 WHERE c1 LIKE '%'||'b' ORDER BY ord; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PUSHED SELECT NULL NULL NULL NULL NULL NULL NULL NULL NULL +Warnings: +Note 1003 select "test"."t1"."c1" AS "c1" from "test"."t1" where "test"."t1"."c1" like convert(concat('%','b') using utf8mb3) order by "test"."t1"."ord" +SELECT c1 FROM t1 WHERE c1 LIKE c2||'%'||'c' ORDER BY ord; +c1 +abc +EXPLAIN EXTENDED SELECT c1 FROM t1 WHERE c1 LIKE c2||'%'||'c' ORDER BY ord; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PUSHED SELECT NULL NULL NULL NULL NULL NULL NULL NULL NULL +Warnings: +Note 1003 select "test"."t1"."c1" AS "c1" from "test"."t1" where "test"."t1"."c1" like concat(concat("test"."t1"."c2",'%'),'c') order by "test"."t1"."ord" +SELECT 'x' FROM t1 WHERE c1||c2 LIKE 'aa%'; +x +x +EXPLAIN EXTENDED SELECT 'x' FROM t1 WHERE c1||c2 LIKE 'aa%'; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PUSHED SELECT NULL NULL NULL NULL NULL NULL NULL NULL NULL +Warnings: +Note 1003 select 'x' AS "x" from "test"."t1" where concat("test"."t1"."c1","test"."t1"."c2") like 'aa%' +SELECT 'x' FROM t1 WHERE c1||c2 LIKE c2||c1; +x +x +EXPLAIN EXTENDED SELECT 'x' FROM t1 WHERE c1||c2 LIKE c2||c1; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PUSHED SELECT NULL NULL NULL NULL NULL NULL NULL NULL NULL +Warnings: +Note 1003 select 'x' AS "x" from "test"."t1" where concat("test"."t1"."c1","test"."t1"."c2") like concat("test"."t1"."c2","test"."t1"."c1") +CREATE VIEW v1 AS SELECT c1, c2, c1 LIKE c2||'_' FROM t1 ORDER BY ord; +EXPLAIN EXTENDED SELECT * FROM v1; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PUSHED SELECT NULL NULL NULL NULL NULL NULL NULL NULL NULL +Warnings: +Note 1003 select "test"."t1"."c1" AS "c1","test"."t1"."c2" AS "c2","test"."t1"."c1" like concat("test"."t1"."c2",'_') AS "c1 LIKE c2||'_'" from ("test"."t1") order by "test"."t1"."ord" +DROP VIEW v1; +DROP TABLE t1; diff --git a/mysql-test/columnstore/oracle/func_concat_oracle_maxscale.test b/mysql-test/columnstore/oracle/func_concat_oracle_maxscale.test new file mode 100644 index 000000000..a4fbe5a60 --- /dev/null +++ b/mysql-test/columnstore/oracle/func_concat_oracle_maxscale.test @@ -0,0 +1,192 @@ +# +# Testing CONCAT with null values +# +--source ../include/have_columnstore.inc +--source ../include/detect_no_maxscale.inc + + +SET sql_mode=ORACLE; +SET default_storage_engine=ColumnStore; + +EXPLAIN EXTENDED SELECT 'a'||'b'||'c'; +EXPLAIN EXTENDED SELECT CONCAT('a'||'b'||'c'); + +SELECT '' || ''; +SELECT '' || 'b'; +SELECT '' || NULL; +SELECT 'a' || ''; +SELECT 'a' || 'b'; +SELECT 'a' || NULL; +SELECT NULL || ''; +SELECT NULL || 'b'; +SELECT NULL || NULL; + +SELECT '' || '' || ''; +SELECT '' || '' || 'c'; +SELECT '' || '' || NULL; +SELECT '' || 'b' || ''; +SELECT '' || 'b' || 'c'; +SELECT '' || 'b' || NULL; +SELECT '' || NULL || ''; +SELECT '' || NULL || 'c'; +SELECT '' || NULL || NULL; + +SELECT 'a' || '' || ''; +SELECT 'a' || '' || 'c'; +SELECT 'a' || '' || NULL; +SELECT 'a' || 'b' || ''; +SELECT 'a' || 'b' || 'c'; +SELECT 'a' || 'b' || NULL; +SELECT 'a' || NULL || ''; +SELECT 'a' || NULL || 'c'; +SELECT 'a' || NULL || NULL; + +SELECT NULL || '' || ''; +SELECT NULL || '' || 'c'; +SELECT NULL || '' || NULL; +SELECT NULL || 'b' || ''; +SELECT NULL || 'b' || 'c'; +SELECT NULL || 'b' || NULL; +SELECT NULL || NULL || ''; +SELECT NULL || NULL || 'c'; +SELECT NULL || NULL || NULL; + + +CREATE TABLE t1 (a VARCHAR(10), b VARCHAR(10), c VARCHAR(10)); + +INSERT INTO t1 VALUES ('', '', ''); +INSERT INTO t1 VALUES ('', '', 'c'); +INSERT INTO t1 VALUES ('', '', NULL); +INSERT INTO t1 VALUES ('', 'b', ''); +INSERT INTO t1 VALUES ('', 'b', 'c'); +INSERT INTO t1 VALUES ('', 'b', NULL); +INSERT INTO t1 VALUES ('', NULL, ''); +INSERT INTO t1 VALUES ('', NULL, 'c'); +INSERT INTO t1 VALUES ('', NULL, NULL); + +INSERT INTO t1 VALUES ('a', '', ''); +INSERT INTO t1 VALUES ('a', '', 'c'); +INSERT INTO t1 VALUES ('a', '', NULL); +INSERT INTO t1 VALUES ('a', 'b', ''); +INSERT INTO t1 VALUES ('a', 'b', 'c'); +INSERT INTO t1 VALUES ('a', 'b', NULL); +INSERT INTO t1 VALUES ('a', NULL, ''); +INSERT INTO t1 VALUES ('a', NULL, 'c'); +INSERT INTO t1 VALUES ('a', NULL, NULL); + +INSERT INTO t1 VALUES (NULL, '', ''); +INSERT INTO t1 VALUES (NULL, '', 'c'); +INSERT INTO t1 VALUES (NULL, '', NULL); +INSERT INTO t1 VALUES (NULL, 'b', ''); +INSERT INTO t1 VALUES (NULL, 'b', 'c'); +INSERT INTO t1 VALUES (NULL, 'b', NULL); +INSERT INTO t1 VALUES (NULL, NULL, ''); +INSERT INTO t1 VALUES (NULL, NULL, 'c'); +INSERT INTO t1 VALUES (NULL, NULL, NULL); + +SELECT LENGTH(a||b||c), a||b||c FROM t1 ORDER BY a,b,c; +SELECT LENGTH(CONCAT(a||b||c)), CONCAT(a||b||c) FROM t1 ORDER BY a,b,c; + +DROP TABLE t1; + + + + + +--echo # +--echo # MDEV-12478 CONCAT function inside view casts values incorrectly with Oracle sql_mode +--echo # + +SET sql_mode=ORACLE; +CREATE VIEW v1 AS SELECT 'foo'||NULL||'bar' AS test; +SHOW CREATE VIEW v1; +SELECT * FROM v1; +SET sql_mode=DEFAULT; +SHOW CREATE VIEW v1; +SELECT * FROM v1; +DROP VIEW v1; + +SET sql_mode=DEFAULT; +CREATE VIEW v1 AS SELECT CONCAT('foo',NULL,'bar') AS test; +SHOW CREATE VIEW v1; +SELECT * FROM v1; +SET sql_mode=ORACLE; +SHOW CREATE VIEW v1; +SELECT * FROM v1; +DROP VIEW v1; + +SET sql_mode=DEFAULT; +CREATE VIEW v1 AS SELECT '0'||'1' AS test; +SHOW CREATE VIEW v1; +SELECT * FROM v1; +SET sql_mode=ORACLE; +SHOW CREATE VIEW v1; +SELECT * FROM v1; +DROP VIEW v1; + + +--echo # +--echo # MDEV-16186 Concatenation operator || returns wrong results in sql_mode=ORACLE +--echo # + +# Concatenation operator || has the same precedence with + +# (stronger than << and weaker than * ^) + +SELECT -1<<1||1 AS a FROM DUAL; +SELECT -1||0<<1 AS a FROM DUAL; + +EXPLAIN EXTENDED SELECT -1<<1||1 AS a FROM DUAL; +EXPLAIN EXTENDED SELECT -1||0<<1 AS a FROM DUAL; + +SELECT -1+1||1 AS a FROM DUAL; +SELECT -1||0+1 AS a FROM DUAL; + +EXPLAIN EXTENDED SELECT -1+1||1 AS a FROM DUAL; +EXPLAIN EXTENDED SELECT -1||0+1 AS a FROM DUAL; + +SELECT 1*1||-1 AS a FROM DUAL; +SELECT 1||1*-1 AS a FROM DUAL; + +EXPLAIN EXTENDED SELECT 1*1||-1 AS a FROM DUAL; +EXPLAIN EXTENDED SELECT 1||1*-1 AS a FROM DUAL; + +SELECT -1^1||1 AS a FROM DUAL; +SELECT -1||0^1 AS a FROM DUAL; + +EXPLAIN EXTENDED SELECT -1^1||1 AS a FROM DUAL; +EXPLAIN EXTENDED SELECT -1||0^1 AS a FROM DUAL; + + +--echo # +--echo # MDEV-17359 Concatenation operator || in like expression failed in sql_mode=ORACLE +--echo # + +SELECT 'abc' LIKE 'a'||'%'; +EXPLAIN EXTENDED SELECT 'abc' LIKE 'a'||'%'; + +SELECT 'x' FROM DUAL WHERE 11 LIKE 1||1; +SELECT 'x' FROM DUAL WHERE 1||1 LIKE 11; +SELECT 'x' FROM DUAL WHERE 1||1 LIKE 1||1; + +CREATE TABLE t1 (c1 VARCHAR(10),c2 VARCHAR(10), ord INTEGER); +INSERT INTO t1 VALUES ('a', 'ab' ,1); +INSERT INTO t1 VALUES ('ab', 'ab', 2); +INSERT INTO t1 VALUES ('abc', 'ab', 3); + +SELECT c1 FROM t1 WHERE c1 LIKE '%'||'b' ORDER BY ord; +EXPLAIN EXTENDED SELECT c1 FROM t1 WHERE c1 LIKE '%'||'b' ORDER BY ord; + +SELECT c1 FROM t1 WHERE c1 LIKE c2||'%'||'c' ORDER BY ord; +EXPLAIN EXTENDED SELECT c1 FROM t1 WHERE c1 LIKE c2||'%'||'c' ORDER BY ord; + +SELECT 'x' FROM t1 WHERE c1||c2 LIKE 'aa%'; +EXPLAIN EXTENDED SELECT 'x' FROM t1 WHERE c1||c2 LIKE 'aa%'; + +SELECT 'x' FROM t1 WHERE c1||c2 LIKE c2||c1; +EXPLAIN EXTENDED SELECT 'x' FROM t1 WHERE c1||c2 LIKE c2||c1; + +CREATE VIEW v1 AS SELECT c1, c2, c1 LIKE c2||'_' FROM t1 ORDER BY ord; +EXPLAIN EXTENDED SELECT * FROM v1; + +DROP VIEW v1; +DROP TABLE t1; diff --git a/mysql-test/columnstore/setup/regression_env_setup.test b/mysql-test/columnstore/setup/regression_env_setup.test index f184584e7..49c37618e 100644 --- a/mysql-test/columnstore/setup/regression_env_setup.test +++ b/mysql-test/columnstore/setup/regression_env_setup.test @@ -7,6 +7,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # --disable_warnings DROP DATABASE IF EXISTS tpch1m; From cfe95ea8462aa9c58b5c4d6f09fea412f49a7e3a Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Tue, 20 Aug 2024 12:51:54 +0300 Subject: [PATCH 18/79] Fix mcs170_session_functions_maxscale test --- .../basic/r/mcs170_session_functions_maxscale.result | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/columnstore/basic/r/mcs170_session_functions_maxscale.result b/mysql-test/columnstore/basic/r/mcs170_session_functions_maxscale.result index a00639d39..18e1d00cc 100644 --- a/mysql-test/columnstore/basic/r/mcs170_session_functions_maxscale.result +++ b/mysql-test/columnstore/basic/r/mcs170_session_functions_maxscale.result @@ -7,10 +7,10 @@ CONNECTION_ID() > 0 1 SELECT CURRENT_USER(); CURRENT_USER() -testUser@max +testUser@% SELECT USER(); USER() -testUser@% +testUser@max SELECT SESSION_USER(); SESSION_USER() testUser@max From 5a709e11a5ff9e6aaf1328e64913837f5cd98ed6 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Fri, 6 Jun 2025 14:06:36 +0300 Subject: [PATCH 19/79] Add drop view v1 to the test to avoid failure if previous test forget to drop it --- .../columnstore/oracle/func_concat_oracle_maxscale.test | 7 +++++++ mysql-test/columnstore/oracle/func_decode_oracle.test | 7 +++++++ mysql-test/columnstore/oracle/func_replace_oracle.test | 7 +++++++ 3 files changed, 21 insertions(+) diff --git a/mysql-test/columnstore/oracle/func_concat_oracle_maxscale.test b/mysql-test/columnstore/oracle/func_concat_oracle_maxscale.test index a4fbe5a60..571564b8e 100644 --- a/mysql-test/columnstore/oracle/func_concat_oracle_maxscale.test +++ b/mysql-test/columnstore/oracle/func_concat_oracle_maxscale.test @@ -8,6 +8,13 @@ SET sql_mode=ORACLE; SET default_storage_engine=ColumnStore; +--disable_query_log +--disable_warnings +DROP VIEW IF EXISTS v1; +--enable_warnings +--enable_query_log + + EXPLAIN EXTENDED SELECT 'a'||'b'||'c'; EXPLAIN EXTENDED SELECT CONCAT('a'||'b'||'c'); diff --git a/mysql-test/columnstore/oracle/func_decode_oracle.test b/mysql-test/columnstore/oracle/func_decode_oracle.test index 6eaf98ac8..2d381b999 100644 --- a/mysql-test/columnstore/oracle/func_decode_oracle.test +++ b/mysql-test/columnstore/oracle/func_decode_oracle.test @@ -1,5 +1,12 @@ SET sql_mode=ORACLE; SET default_storage_engine=ColumnStore; + +--disable_query_log +--disable_warnings +DROP VIEW IF EXISTS v1; +--enable_warnings +--enable_query_log + --error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT SELECT DECODE(10); --error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT diff --git a/mysql-test/columnstore/oracle/func_replace_oracle.test b/mysql-test/columnstore/oracle/func_replace_oracle.test index 87dc1d87a..dbc43da92 100644 --- a/mysql-test/columnstore/oracle/func_replace_oracle.test +++ b/mysql-test/columnstore/oracle/func_replace_oracle.test @@ -8,6 +8,13 @@ SET default_storage_engine=ColumnStore; --echo # MDEV-13003 - Oracle compatibility : Replace function --echo # +--disable_query_log +--disable_warnings +DROP VIEW IF EXISTS v1; +--enable_warnings +--enable_query_log + + SELECT REPLACE(null,'a','b') ; SELECT REPLACE('ab',null,'b') ; SELECT REPLACE('ab','a',null) ; From 4fe23292131bd3c047f2adb5fa64a9f02b21e284 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Fri, 6 Jun 2025 14:58:11 +0300 Subject: [PATCH 20/79] Add drop table t1 to the test to avoid failure if previous test forget to drop it --- mysql-test/columnstore/oracle/func_trim_oracle.test | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mysql-test/columnstore/oracle/func_trim_oracle.test b/mysql-test/columnstore/oracle/func_trim_oracle.test index a09617118..0ce44a110 100644 --- a/mysql-test/columnstore/oracle/func_trim_oracle.test +++ b/mysql-test/columnstore/oracle/func_trim_oracle.test @@ -1,6 +1,12 @@ SET sql_mode=ORACLE; SET default_storage_engine=ColumnStore; +--disable_query_log +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +--enable_query_log + --echo # --echo # MDEV-15664 sql_mode=ORACLE: Make TRIM return NULL instead of empty string --echo # From cfaeeeb449cb86ecd34bfc422e41e987d6835e28 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Fri, 6 Jun 2025 15:43:07 +0300 Subject: [PATCH 21/79] disable warnings for all tests via Maxscale --- ...5_function_CNX_LAST_DAY_DS_maxscale.result | 25 + ...unction_CNX_MICROSECOND_DS_maxscale.result | 22 + ..._function_CNX_MONTHNAME_DS_maxscale.result | 23 + ...ion_CNX_NULLIF_NM_Archived_maxscale.result | 897 +++++++++++++++++ ...unction_CNX_TIME_TO_SEC_DS_maxscale.result | 26 + ...function_CNXPP_LAST_DAY_DS_maxscale.result | 25 + ...ction_CNXPP_MICROSECOND_DS_maxscale.result | 25 + ...unction_CNXPP_MONTHNAME_DS_maxscale.result | 25 + ...n_CNXPP_NULLIF_NM_Archived_maxscale.result | 901 ++++++++++++++++++ ...ction_CNXPP_TIME_TO_SEC_DS_maxscale.result | 28 + .../t/mcs4125_function_CNX_LAST_DAY_DS.test | 1 + ...125_function_CNX_LAST_DAY_DS_maxscale.test | 23 + .../mcs4154_function_CNX_MICROSECOND_DS.test | 1 + ..._function_CNX_MICROSECOND_DS_maxscale.test | 21 + .../t/mcs4162_function_CNX_MONTHNAME_DS.test | 1 + ...62_function_CNX_MONTHNAME_DS_maxscale.test | 23 + ...s4164_function_CNX_NULLIF_NM_Archived.test | 1 + ...ction_CNX_NULLIF_NM_Archived_maxscale.test | 313 ++++++ .../mcs4220_function_CNX_TIME_TO_SEC_DS.test | 1 + ..._function_CNX_TIME_TO_SEC_DS_maxscale.test | 22 + .../t/mcs4350_function_CNXPP_LAST_DAY_DS.test | 1 + ...0_function_CNXPP_LAST_DAY_DS_maxscale.test | 23 + ...mcs4379_function_CNXPP_MICROSECOND_DS.test | 1 + ...unction_CNXPP_MICROSECOND_DS_maxscale.test | 21 + .../mcs4387_function_CNXPP_MONTHNAME_DS.test | 1 + ..._function_CNXPP_MONTHNAME_DS_maxscale.test | 23 + ...389_function_CNXPP_NULLIF_NM_Archived.test | 1 + ...ion_CNXPP_NULLIF_NM_Archived_maxscale.test | 313 ++++++ ...mcs4445_function_CNXPP_TIME_TO_SEC_DS.test | 1 + ...unction_CNXPP_TIME_TO_SEC_DS_maxscale.test | 22 + ...s7225_regression_MCOL-3721_maxscale.result | 41 + .../t/mcs7225_regression_MCOL-3721.test | 1 + ...mcs7225_regression_MCOL-3721_maxscale.test | 52 + .../oracle/func_concat_oracle_maxscale.result | 32 - .../oracle/func_concat_oracle_maxscale.test | 2 +- .../oracle/func_decode_oracle.test | 3 + .../oracle/func_decode_oracle_maxscale.result | 161 ++++ .../oracle/func_decode_oracle_maxscale.test | 104 ++ 38 files changed, 3174 insertions(+), 33 deletions(-) create mode 100644 mysql-test/columnstore/autopilot/r/mcs4125_function_CNX_LAST_DAY_DS_maxscale.result create mode 100644 mysql-test/columnstore/autopilot/r/mcs4154_function_CNX_MICROSECOND_DS_maxscale.result create mode 100644 mysql-test/columnstore/autopilot/r/mcs4162_function_CNX_MONTHNAME_DS_maxscale.result create mode 100644 mysql-test/columnstore/autopilot/r/mcs4164_function_CNX_NULLIF_NM_Archived_maxscale.result create mode 100644 mysql-test/columnstore/autopilot/r/mcs4220_function_CNX_TIME_TO_SEC_DS_maxscale.result create mode 100644 mysql-test/columnstore/autopilot/r/mcs4350_function_CNXPP_LAST_DAY_DS_maxscale.result create mode 100644 mysql-test/columnstore/autopilot/r/mcs4379_function_CNXPP_MICROSECOND_DS_maxscale.result create mode 100644 mysql-test/columnstore/autopilot/r/mcs4387_function_CNXPP_MONTHNAME_DS_maxscale.result create mode 100644 mysql-test/columnstore/autopilot/r/mcs4389_function_CNXPP_NULLIF_NM_Archived_maxscale.result create mode 100644 mysql-test/columnstore/autopilot/r/mcs4445_function_CNXPP_TIME_TO_SEC_DS_maxscale.result create mode 100644 mysql-test/columnstore/autopilot/t/mcs4125_function_CNX_LAST_DAY_DS_maxscale.test create mode 100644 mysql-test/columnstore/autopilot/t/mcs4154_function_CNX_MICROSECOND_DS_maxscale.test create mode 100644 mysql-test/columnstore/autopilot/t/mcs4162_function_CNX_MONTHNAME_DS_maxscale.test create mode 100644 mysql-test/columnstore/autopilot/t/mcs4164_function_CNX_NULLIF_NM_Archived_maxscale.test create mode 100644 mysql-test/columnstore/autopilot/t/mcs4220_function_CNX_TIME_TO_SEC_DS_maxscale.test create mode 100644 mysql-test/columnstore/autopilot/t/mcs4350_function_CNXPP_LAST_DAY_DS_maxscale.test create mode 100644 mysql-test/columnstore/autopilot/t/mcs4379_function_CNXPP_MICROSECOND_DS_maxscale.test create mode 100644 mysql-test/columnstore/autopilot/t/mcs4387_function_CNXPP_MONTHNAME_DS_maxscale.test create mode 100644 mysql-test/columnstore/autopilot/t/mcs4389_function_CNXPP_NULLIF_NM_Archived_maxscale.test create mode 100644 mysql-test/columnstore/autopilot/t/mcs4445_function_CNXPP_TIME_TO_SEC_DS_maxscale.test create mode 100644 mysql-test/columnstore/devregression/r/mcs7225_regression_MCOL-3721_maxscale.result create mode 100644 mysql-test/columnstore/devregression/t/mcs7225_regression_MCOL-3721_maxscale.test create mode 100644 mysql-test/columnstore/oracle/func_decode_oracle_maxscale.result create mode 100644 mysql-test/columnstore/oracle/func_decode_oracle_maxscale.test diff --git a/mysql-test/columnstore/autopilot/r/mcs4125_function_CNX_LAST_DAY_DS_maxscale.result b/mysql-test/columnstore/autopilot/r/mcs4125_function_CNX_LAST_DAY_DS_maxscale.result new file mode 100644 index 000000000..526ca8707 --- /dev/null +++ b/mysql-test/columnstore/autopilot/r/mcs4125_function_CNX_LAST_DAY_DS_maxscale.result @@ -0,0 +1,25 @@ +USE autopilot; +select cidx, CDATE, LAST_DAY(CDATE) from datatypetestm order by cidx; +cidx CDATE LAST_DAY(CDATE) +1 1997-01-01 1997-01-31 +select cidx, CDATETIME, LAST_DAY(CDATETIME) from datatypetestm order by cidx; +cidx CDATETIME LAST_DAY(CDATETIME) +1 1997-01-01 00:00:00 1997-01-31 +select cidx, CTIME, LAST_DAY(CTIME) from datatypetestm order by cidx; +cidx CTIME LAST_DAY(CTIME) +1 13:00:00 REPLACEDVALUE +select cidx, LAST_DAY('2009-02-28') from datatypetestm order by cidx; +cidx LAST_DAY('2009-02-28') +1 2009-02-28 +select cidx, LAST_DAY('2009-07-04') from datatypetestm order by cidx; +cidx LAST_DAY('2009-07-04') +1 2009-07-31 +select cidx, LAST_DAY('2010-02-31') from datatypetestm order by cidx; +cidx LAST_DAY('2010-02-31') +1 NULL +select cidx, CDATE from datatypetestm where LAST_DAY(CDATE) <> 0 order by cidx; +cidx CDATE +1 1997-01-01 +select cidx, CDATETIME from datatypetestm where LAST_DAY(CDATETIME) <> 0 order by cidx; +cidx CDATETIME +1 1997-01-01 00:00:00 diff --git a/mysql-test/columnstore/autopilot/r/mcs4154_function_CNX_MICROSECOND_DS_maxscale.result b/mysql-test/columnstore/autopilot/r/mcs4154_function_CNX_MICROSECOND_DS_maxscale.result new file mode 100644 index 000000000..12f7654f3 --- /dev/null +++ b/mysql-test/columnstore/autopilot/r/mcs4154_function_CNX_MICROSECOND_DS_maxscale.result @@ -0,0 +1,22 @@ +USE autopilot; +select cidx, CDATE, MICROSECOND(CDATE) from datatypetestm order by cidx; +cidx CDATE MICROSECOND(CDATE) +1 1997-01-01 0 +select cidx, CDATETIME, MICROSECOND(CDATETIME) from datatypetestm order by cidx; +cidx CDATETIME MICROSECOND(CDATETIME) +1 1997-01-01 00:00:00 0 +select cidx, CTIME, MICROSECOND(CTIME) from datatypetestm order by cidx; +cidx CTIME MICROSECOND(CTIME) +1 13:00:00 0 +select cidx, MICROSECOND('2011-05-01') from datatypetestm order by cidx; +cidx MICROSECOND('2011-05-01') +1 0 +select cidx, MICROSECOND('2011-05-01 13:58:22.123456') from datatypetestm order by cidx; +cidx MICROSECOND('2011-05-01 13:58:22.123456') +1 123456 +select cidx, CDATE from datatypetestm where MICROSECOND(CDATE) <> 0 order by cidx; +cidx CDATE +select cidx, CDATETIME from datatypetestm where MICROSECOND(CDATETIME) <> 0 order by cidx; +cidx CDATETIME +select cidx, CTIME from datatypetestm where MICROSECOND(CTIME) <> 0 order by cidx; +cidx CTIME diff --git a/mysql-test/columnstore/autopilot/r/mcs4162_function_CNX_MONTHNAME_DS_maxscale.result b/mysql-test/columnstore/autopilot/r/mcs4162_function_CNX_MONTHNAME_DS_maxscale.result new file mode 100644 index 000000000..f0ee6d4e6 --- /dev/null +++ b/mysql-test/columnstore/autopilot/r/mcs4162_function_CNX_MONTHNAME_DS_maxscale.result @@ -0,0 +1,23 @@ +USE autopilot; +select cidx, CDATE, MONTHNAME(CDATE) from datatypetestm order by cidx; +cidx CDATE MONTHNAME(CDATE) +1 1997-01-01 January +select cidx, CDATETIME, MONTHNAME(CDATETIME) from datatypetestm order by cidx; +cidx CDATETIME MONTHNAME(CDATETIME) +1 1997-01-01 00:00:00 January +select cidx, CTIME, MONTHNAME(CTIME) from datatypetestm order by cidx; +cidx CTIME MONTHNAME(CTIME) +1 13:00:00 REPLACEDVALUE +select cidx, MONTHNAME('2009-02-28') from datatypetestm order by cidx; +cidx MONTHNAME('2009-02-28') +1 February +select cidx, MONTHNAME('2009-07-04') from datatypetestm order by cidx; +cidx MONTHNAME('2009-07-04') +1 July +select cidx, MONTHNAME('2010-02-31') from datatypetestm order by cidx; +cidx MONTHNAME('2010-02-31') +1 NULL +select cidx, CDATE from datatypetestm where MONTHNAME(CDATE) <> 0 order by cidx; +cidx CDATE +select cidx, CDATETIME from datatypetestm where MONTHNAME(CDATETIME) <> 0 order by cidx; +cidx CDATETIME diff --git a/mysql-test/columnstore/autopilot/r/mcs4164_function_CNX_NULLIF_NM_Archived_maxscale.result b/mysql-test/columnstore/autopilot/r/mcs4164_function_CNX_NULLIF_NM_Archived_maxscale.result new file mode 100644 index 000000000..5bbaf2395 --- /dev/null +++ b/mysql-test/columnstore/autopilot/r/mcs4164_function_CNX_NULLIF_NM_Archived_maxscale.result @@ -0,0 +1,897 @@ +USE autopilot; +select cidx, CBIGINT, NULLIF(CBIGINT,CBIGINT) from datatypetestm order by cidx; +cidx CBIGINT NULLIF(CBIGINT,CBIGINT) +1 -72036854775806 NULL +select cidx, CBIGINT, NULLIF(CBIGINT,CINTEGER) from datatypetestm order by cidx; +cidx CBIGINT NULLIF(CBIGINT,CINTEGER) +1 -72036854775806 -72036854775806 +select cidx, CBIGINT, NULLIF(CBIGINT,CDOUBLE) from datatypetestm order by cidx; +cidx CBIGINT NULLIF(CBIGINT,CDOUBLE) +1 -72036854775806 -72036854775806 +select cidx, CBIGINT, NULLIF(CBIGINT,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CBIGINT NULLIF(CBIGINT,CDECIMAL9_2) +1 -72036854775806 -72036854775806 +select cidx, CBIGINT, NULLIF(CBIGINT,1) from datatypetestm order by cidx; +cidx CBIGINT NULLIF(CBIGINT,1) +1 -72036854775806 -72036854775806 +select cidx, CBIGINT, NULLIF(CBIGINT,3.14) from datatypetestm order by cidx; +cidx CBIGINT NULLIF(CBIGINT,3.14) +1 -72036854775806 -72036854775806 +select cidx, CBIGINT, NULLIF(CBIGINT,CCHAR4) from datatypetestm order by cidx; +cidx CBIGINT NULLIF(CBIGINT,CCHAR4) +1 -72036854775806 -72036854775806 +select cidx, CBIGINT, NULLIF(CBIGINT,CDATE) from datatypetestm order by cidx; +cidx CBIGINT NULLIF(CBIGINT,CDATE) +1 -72036854775806 -72036854775806 +select cidx, CBIGINT, NULLIF(CBIGINT,NULL) from datatypetestm order by cidx; +cidx CBIGINT NULLIF(CBIGINT,NULL) +1 -72036854775806 -72036854775806 +select cidx, CBIGINT, NULLIF(CBIGINT,'HELLO WORLD') from datatypetestm order by cidx; +cidx CBIGINT NULLIF(CBIGINT,'HELLO WORLD') +1 -72036854775806 -72036854775806 +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CBIGINT) from datatypetestm order by cidx; +cidx CDECIMAL1 NULLIF(CDECIMAL1,CBIGINT) +1 -9 -9 +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CINTEGER) from datatypetestm order by cidx; +cidx CDECIMAL1 NULLIF(CDECIMAL1,CINTEGER) +1 -9 -9 +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CDOUBLE) from datatypetestm order by cidx; +cidx CDECIMAL1 NULLIF(CDECIMAL1,CDOUBLE) +1 -9 -9 +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CDECIMAL1 NULLIF(CDECIMAL1,CDECIMAL9_2) +1 -9 -9 +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,1) from datatypetestm order by cidx; +cidx CDECIMAL1 NULLIF(CDECIMAL1,1) +1 -9 -9 +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,3.14) from datatypetestm order by cidx; +cidx CDECIMAL1 NULLIF(CDECIMAL1,3.14) +1 -9 -9 +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CCHAR4) from datatypetestm order by cidx; +cidx CDECIMAL1 NULLIF(CDECIMAL1,CCHAR4) +1 -9 -9 +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CDATE) from datatypetestm order by cidx; +cidx CDECIMAL1 NULLIF(CDECIMAL1,CDATE) +1 -9 -9 +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,NULL) from datatypetestm order by cidx; +cidx CDECIMAL1 NULLIF(CDECIMAL1,NULL) +1 -9 -9 +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,'HELLO WORLD') from datatypetestm order by cidx; +cidx CDECIMAL1 NULLIF(CDECIMAL1,'HELLO WORLD') +1 -9 -9 +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CBIGINT) from datatypetestm order by cidx; +cidx CDECIMAL4 NULLIF(CDECIMAL4,CBIGINT) +1 -999 -999 +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CINTEGER) from datatypetestm order by cidx; +cidx CDECIMAL4 NULLIF(CDECIMAL4,CINTEGER) +1 -999 -999 +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CDOUBLE) from datatypetestm order by cidx; +cidx CDECIMAL4 NULLIF(CDECIMAL4,CDOUBLE) +1 -999 -999 +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CDECIMAL4 NULLIF(CDECIMAL4,CDECIMAL9_2) +1 -999 -999 +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,1) from datatypetestm order by cidx; +cidx CDECIMAL4 NULLIF(CDECIMAL4,1) +1 -999 -999 +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,3.14) from datatypetestm order by cidx; +cidx CDECIMAL4 NULLIF(CDECIMAL4,3.14) +1 -999 -999 +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CCHAR4) from datatypetestm order by cidx; +cidx CDECIMAL4 NULLIF(CDECIMAL4,CCHAR4) +1 -999 -999 +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CDATE) from datatypetestm order by cidx; +cidx CDECIMAL4 NULLIF(CDECIMAL4,CDATE) +1 -999 -999 +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,NULL) from datatypetestm order by cidx; +cidx CDECIMAL4 NULLIF(CDECIMAL4,NULL) +1 -999 -999 +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,'HELLO WORLD') from datatypetestm order by cidx; +cidx CDECIMAL4 NULLIF(CDECIMAL4,'HELLO WORLD') +1 -999 -999 +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CBIGINT) from datatypetestm order by cidx; +cidx CDECIMAL4_2 NULLIF(CDECIMAL4_2,CBIGINT) +1 -9.99 -9.99 +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CINTEGER) from datatypetestm order by cidx; +cidx CDECIMAL4_2 NULLIF(CDECIMAL4_2,CINTEGER) +1 -9.99 -9.99 +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CDOUBLE) from datatypetestm order by cidx; +cidx CDECIMAL4_2 NULLIF(CDECIMAL4_2,CDOUBLE) +1 -9.99 -9.99 +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CDECIMAL4_2 NULLIF(CDECIMAL4_2,CDECIMAL9_2) +1 -9.99 -9.99 +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,1) from datatypetestm order by cidx; +cidx CDECIMAL4_2 NULLIF(CDECIMAL4_2,1) +1 -9.99 -9.99 +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,3.14) from datatypetestm order by cidx; +cidx CDECIMAL4_2 NULLIF(CDECIMAL4_2,3.14) +1 -9.99 -9.99 +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CCHAR4) from datatypetestm order by cidx; +cidx CDECIMAL4_2 NULLIF(CDECIMAL4_2,CCHAR4) +1 -9.99 -9.99 +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CDATE) from datatypetestm order by cidx; +cidx CDECIMAL4_2 NULLIF(CDECIMAL4_2,CDATE) +1 -9.99 -9.99 +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,NULL) from datatypetestm order by cidx; +cidx CDECIMAL4_2 NULLIF(CDECIMAL4_2,NULL) +1 -9.99 -9.99 +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,'HELLO WORLD') from datatypetestm order by cidx; +cidx CDECIMAL4_2 NULLIF(CDECIMAL4_2,'HELLO WORLD') +1 -9.99 -9.99 +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CBIGINT) from datatypetestm order by cidx; +cidx CDECIMAL5 NULLIF(CDECIMAL5,CBIGINT) +1 -999 -999 +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CINTEGER) from datatypetestm order by cidx; +cidx CDECIMAL5 NULLIF(CDECIMAL5,CINTEGER) +1 -999 -999 +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CDOUBLE) from datatypetestm order by cidx; +cidx CDECIMAL5 NULLIF(CDECIMAL5,CDOUBLE) +1 -999 -999 +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CDECIMAL5 NULLIF(CDECIMAL5,CDECIMAL9_2) +1 -999 -999 +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,1) from datatypetestm order by cidx; +cidx CDECIMAL5 NULLIF(CDECIMAL5,1) +1 -999 -999 +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,3.14) from datatypetestm order by cidx; +cidx CDECIMAL5 NULLIF(CDECIMAL5,3.14) +1 -999 -999 +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CCHAR4) from datatypetestm order by cidx; +cidx CDECIMAL5 NULLIF(CDECIMAL5,CCHAR4) +1 -999 -999 +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CDATE) from datatypetestm order by cidx; +cidx CDECIMAL5 NULLIF(CDECIMAL5,CDATE) +1 -999 -999 +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,NULL) from datatypetestm order by cidx; +cidx CDECIMAL5 NULLIF(CDECIMAL5,NULL) +1 -999 -999 +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,'HELLO WORLD') from datatypetestm order by cidx; +cidx CDECIMAL5 NULLIF(CDECIMAL5,'HELLO WORLD') +1 -999 -999 +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CBIGINT) from datatypetestm order by cidx; +cidx CDECIMAL9 NULLIF(CDECIMAL9,CBIGINT) +1 -999999 -999999 +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CINTEGER) from datatypetestm order by cidx; +cidx CDECIMAL9 NULLIF(CDECIMAL9,CINTEGER) +1 -999999 -999999 +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CDOUBLE) from datatypetestm order by cidx; +cidx CDECIMAL9 NULLIF(CDECIMAL9,CDOUBLE) +1 -999999 -999999 +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CDECIMAL9 NULLIF(CDECIMAL9,CDECIMAL9_2) +1 -999999 -999999 +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,1) from datatypetestm order by cidx; +cidx CDECIMAL9 NULLIF(CDECIMAL9,1) +1 -999999 -999999 +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,3.14) from datatypetestm order by cidx; +cidx CDECIMAL9 NULLIF(CDECIMAL9,3.14) +1 -999999 -999999 +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CCHAR4) from datatypetestm order by cidx; +cidx CDECIMAL9 NULLIF(CDECIMAL9,CCHAR4) +1 -999999 -999999 +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CDATE) from datatypetestm order by cidx; +cidx CDECIMAL9 NULLIF(CDECIMAL9,CDATE) +1 -999999 -999999 +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,NULL) from datatypetestm order by cidx; +cidx CDECIMAL9 NULLIF(CDECIMAL9,NULL) +1 -999999 -999999 +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,'HELLO WORLD') from datatypetestm order by cidx; +cidx CDECIMAL9 NULLIF(CDECIMAL9,'HELLO WORLD') +1 -999999 -999999 +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CBIGINT) from datatypetestm order by cidx; +cidx CDECIMAL9_2 NULLIF(CDECIMAL9_2,CBIGINT) +1 -9999.99 -9999.99 +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CINTEGER) from datatypetestm order by cidx; +cidx CDECIMAL9_2 NULLIF(CDECIMAL9_2,CINTEGER) +1 -9999.99 -9999.99 +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CDOUBLE) from datatypetestm order by cidx; +cidx CDECIMAL9_2 NULLIF(CDECIMAL9_2,CDOUBLE) +1 -9999.99 -9999.99 +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CDECIMAL9_2 NULLIF(CDECIMAL9_2,CDECIMAL9_2) +1 -9999.99 NULL +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,1) from datatypetestm order by cidx; +cidx CDECIMAL9_2 NULLIF(CDECIMAL9_2,1) +1 -9999.99 -9999.99 +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,3.14) from datatypetestm order by cidx; +cidx CDECIMAL9_2 NULLIF(CDECIMAL9_2,3.14) +1 -9999.99 -9999.99 +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CCHAR4) from datatypetestm order by cidx; +cidx CDECIMAL9_2 NULLIF(CDECIMAL9_2,CCHAR4) +1 -9999.99 -9999.99 +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CDATE) from datatypetestm order by cidx; +cidx CDECIMAL9_2 NULLIF(CDECIMAL9_2,CDATE) +1 -9999.99 -9999.99 +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,NULL) from datatypetestm order by cidx; +cidx CDECIMAL9_2 NULLIF(CDECIMAL9_2,NULL) +1 -9999.99 -9999.99 +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,'HELLO WORLD') from datatypetestm order by cidx; +cidx CDECIMAL9_2 NULLIF(CDECIMAL9_2,'HELLO WORLD') +1 -9999.99 -9999.99 +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CBIGINT) from datatypetestm order by cidx; +cidx CDECIMAL10 NULLIF(CDECIMAL10,CBIGINT) +1 -9999999 -9999999 +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CINTEGER) from datatypetestm order by cidx; +cidx CDECIMAL10 NULLIF(CDECIMAL10,CINTEGER) +1 -9999999 -9999999 +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CDOUBLE) from datatypetestm order by cidx; +cidx CDECIMAL10 NULLIF(CDECIMAL10,CDOUBLE) +1 -9999999 -9999999 +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CDECIMAL10 NULLIF(CDECIMAL10,CDECIMAL9_2) +1 -9999999 -9999999 +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,1) from datatypetestm order by cidx; +cidx CDECIMAL10 NULLIF(CDECIMAL10,1) +1 -9999999 -9999999 +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,3.14) from datatypetestm order by cidx; +cidx CDECIMAL10 NULLIF(CDECIMAL10,3.14) +1 -9999999 -9999999 +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CCHAR4) from datatypetestm order by cidx; +cidx CDECIMAL10 NULLIF(CDECIMAL10,CCHAR4) +1 -9999999 -9999999 +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CDATE) from datatypetestm order by cidx; +cidx CDECIMAL10 NULLIF(CDECIMAL10,CDATE) +1 -9999999 -9999999 +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,NULL) from datatypetestm order by cidx; +cidx CDECIMAL10 NULLIF(CDECIMAL10,NULL) +1 -9999999 -9999999 +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,'HELLO WORLD') from datatypetestm order by cidx; +cidx CDECIMAL10 NULLIF(CDECIMAL10,'HELLO WORLD') +1 -9999999 -9999999 +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CBIGINT) from datatypetestm order by cidx; +cidx CDECIMAL18 NULLIF(CDECIMAL18,CBIGINT) +1 -9999999999999 -9999999999999 +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CINTEGER) from datatypetestm order by cidx; +cidx CDECIMAL18 NULLIF(CDECIMAL18,CINTEGER) +1 -9999999999999 -9999999999999 +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CDOUBLE) from datatypetestm order by cidx; +cidx CDECIMAL18 NULLIF(CDECIMAL18,CDOUBLE) +1 -9999999999999 -9999999999999 +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CDECIMAL18 NULLIF(CDECIMAL18,CDECIMAL9_2) +1 -9999999999999 -9999999999999 +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,1) from datatypetestm order by cidx; +cidx CDECIMAL18 NULLIF(CDECIMAL18,1) +1 -9999999999999 -9999999999999 +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,3.14) from datatypetestm order by cidx; +cidx CDECIMAL18 NULLIF(CDECIMAL18,3.14) +1 -9999999999999 -9999999999999 +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CCHAR4) from datatypetestm order by cidx; +cidx CDECIMAL18 NULLIF(CDECIMAL18,CCHAR4) +1 -9999999999999 -9999999999999 +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CDATE) from datatypetestm order by cidx; +cidx CDECIMAL18 NULLIF(CDECIMAL18,CDATE) +1 -9999999999999 -9999999999999 +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,NULL) from datatypetestm order by cidx; +cidx CDECIMAL18 NULLIF(CDECIMAL18,NULL) +1 -9999999999999 -9999999999999 +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,'HELLO WORLD') from datatypetestm order by cidx; +cidx CDECIMAL18 NULLIF(CDECIMAL18,'HELLO WORLD') +1 -9999999999999 -9999999999999 +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CBIGINT) from datatypetestm order by cidx; +cidx CDECIMAL18_2 NULLIF(CDECIMAL18_2,CBIGINT) +1 -99999999999.99 -99999999999.99 +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CINTEGER) from datatypetestm order by cidx; +cidx CDECIMAL18_2 NULLIF(CDECIMAL18_2,CINTEGER) +1 -99999999999.99 -99999999999.99 +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CDOUBLE) from datatypetestm order by cidx; +cidx CDECIMAL18_2 NULLIF(CDECIMAL18_2,CDOUBLE) +1 -99999999999.99 -99999999999.99 +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CDECIMAL18_2 NULLIF(CDECIMAL18_2,CDECIMAL9_2) +1 -99999999999.99 -99999999999.99 +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,1) from datatypetestm order by cidx; +cidx CDECIMAL18_2 NULLIF(CDECIMAL18_2,1) +1 -99999999999.99 -99999999999.99 +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,3.14) from datatypetestm order by cidx; +cidx CDECIMAL18_2 NULLIF(CDECIMAL18_2,3.14) +1 -99999999999.99 -99999999999.99 +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CCHAR4) from datatypetestm order by cidx; +cidx CDECIMAL18_2 NULLIF(CDECIMAL18_2,CCHAR4) +1 -99999999999.99 -99999999999.99 +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CDATE) from datatypetestm order by cidx; +cidx CDECIMAL18_2 NULLIF(CDECIMAL18_2,CDATE) +1 -99999999999.99 -99999999999.99 +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,NULL) from datatypetestm order by cidx; +cidx CDECIMAL18_2 NULLIF(CDECIMAL18_2,NULL) +1 -99999999999.99 -99999999999.99 +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,'HELLO WORLD') from datatypetestm order by cidx; +cidx CDECIMAL18_2 NULLIF(CDECIMAL18_2,'HELLO WORLD') +1 -99999999999.99 -99999999999.99 +select cidx, CINTEGER, NULLIF(CINTEGER,CBIGINT) from datatypetestm order by cidx; +cidx CINTEGER NULLIF(CINTEGER,CBIGINT) +1 -7483646 -7483646 +select cidx, CINTEGER, NULLIF(CINTEGER,CINTEGER) from datatypetestm order by cidx; +cidx CINTEGER NULLIF(CINTEGER,CINTEGER) +1 -7483646 NULL +select cidx, CINTEGER, NULLIF(CINTEGER,CDOUBLE) from datatypetestm order by cidx; +cidx CINTEGER NULLIF(CINTEGER,CDOUBLE) +1 -7483646 -7483646 +select cidx, CINTEGER, NULLIF(CINTEGER,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CINTEGER NULLIF(CINTEGER,CDECIMAL9_2) +1 -7483646 -7483646 +select cidx, CINTEGER, NULLIF(CINTEGER,1) from datatypetestm order by cidx; +cidx CINTEGER NULLIF(CINTEGER,1) +1 -7483646 -7483646 +select cidx, CINTEGER, NULLIF(CINTEGER,3.14) from datatypetestm order by cidx; +cidx CINTEGER NULLIF(CINTEGER,3.14) +1 -7483646 -7483646 +select cidx, CINTEGER, NULLIF(CINTEGER,CCHAR4) from datatypetestm order by cidx; +cidx CINTEGER NULLIF(CINTEGER,CCHAR4) +1 -7483646 -7483646 +select cidx, CINTEGER, NULLIF(CINTEGER,CDATE) from datatypetestm order by cidx; +cidx CINTEGER NULLIF(CINTEGER,CDATE) +1 -7483646 -7483646 +select cidx, CINTEGER, NULLIF(CINTEGER,NULL) from datatypetestm order by cidx; +cidx CINTEGER NULLIF(CINTEGER,NULL) +1 -7483646 -7483646 +select cidx, CINTEGER, NULLIF(CINTEGER,'HELLO WORLD') from datatypetestm order by cidx; +cidx CINTEGER NULLIF(CINTEGER,'HELLO WORLD') +1 -7483646 -7483646 +select cidx, CSMALLINT, NULLIF(CSMALLINT,CBIGINT) from datatypetestm order by cidx; +cidx CSMALLINT NULLIF(CSMALLINT,CBIGINT) +1 -766 -766 +select cidx, CSMALLINT, NULLIF(CSMALLINT,CINTEGER) from datatypetestm order by cidx; +cidx CSMALLINT NULLIF(CSMALLINT,CINTEGER) +1 -766 -766 +select cidx, CSMALLINT, NULLIF(CSMALLINT,CDOUBLE) from datatypetestm order by cidx; +cidx CSMALLINT NULLIF(CSMALLINT,CDOUBLE) +1 -766 -766 +select cidx, CSMALLINT, NULLIF(CSMALLINT,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CSMALLINT NULLIF(CSMALLINT,CDECIMAL9_2) +1 -766 -766 +select cidx, CSMALLINT, NULLIF(CSMALLINT,1) from datatypetestm order by cidx; +cidx CSMALLINT NULLIF(CSMALLINT,1) +1 -766 -766 +select cidx, CSMALLINT, NULLIF(CSMALLINT,3.14) from datatypetestm order by cidx; +cidx CSMALLINT NULLIF(CSMALLINT,3.14) +1 -766 -766 +select cidx, CSMALLINT, NULLIF(CSMALLINT,CCHAR4) from datatypetestm order by cidx; +cidx CSMALLINT NULLIF(CSMALLINT,CCHAR4) +1 -766 -766 +select cidx, CSMALLINT, NULLIF(CSMALLINT,CDATE) from datatypetestm order by cidx; +cidx CSMALLINT NULLIF(CSMALLINT,CDATE) +1 -766 -766 +select cidx, CSMALLINT, NULLIF(CSMALLINT,NULL) from datatypetestm order by cidx; +cidx CSMALLINT NULLIF(CSMALLINT,NULL) +1 -766 -766 +select cidx, CSMALLINT, NULLIF(CSMALLINT,'HELLO WORLD') from datatypetestm order by cidx; +cidx CSMALLINT NULLIF(CSMALLINT,'HELLO WORLD') +1 -766 -766 +select cidx, CTINYINT, NULLIF(CTINYINT,CBIGINT) from datatypetestm order by cidx; +cidx CTINYINT NULLIF(CTINYINT,CBIGINT) +1 -26 -26 +select cidx, CTINYINT, NULLIF(CTINYINT,CINTEGER) from datatypetestm order by cidx; +cidx CTINYINT NULLIF(CTINYINT,CINTEGER) +1 -26 -26 +select cidx, CTINYINT, NULLIF(CTINYINT,CDOUBLE) from datatypetestm order by cidx; +cidx CTINYINT NULLIF(CTINYINT,CDOUBLE) +1 -26 -26 +select cidx, CTINYINT, NULLIF(CTINYINT,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CTINYINT NULLIF(CTINYINT,CDECIMAL9_2) +1 -26 -26 +select cidx, CTINYINT, NULLIF(CTINYINT,1) from datatypetestm order by cidx; +cidx CTINYINT NULLIF(CTINYINT,1) +1 -26 -26 +select cidx, CTINYINT, NULLIF(CTINYINT,3.14) from datatypetestm order by cidx; +cidx CTINYINT NULLIF(CTINYINT,3.14) +1 -26 -26 +select cidx, CTINYINT, NULLIF(CTINYINT,CCHAR4) from datatypetestm order by cidx; +cidx CTINYINT NULLIF(CTINYINT,CCHAR4) +1 -26 -26 +select cidx, CTINYINT, NULLIF(CTINYINT,CDATE) from datatypetestm order by cidx; +cidx CTINYINT NULLIF(CTINYINT,CDATE) +1 -26 -26 +select cidx, CTINYINT, NULLIF(CTINYINT,NULL) from datatypetestm order by cidx; +cidx CTINYINT NULLIF(CTINYINT,NULL) +1 -26 -26 +select cidx, CTINYINT, NULLIF(CTINYINT,'HELLO WORLD') from datatypetestm order by cidx; +cidx CTINYINT NULLIF(CTINYINT,'HELLO WORLD') +1 -26 -26 +select cidx, CDOUBLE, NULLIF(CDOUBLE,CBIGINT) from datatypetestm order by cidx; +cidx CDOUBLE NULLIF(CDOUBLE,CBIGINT) +1 -1.797693231e108 -1.797693231e108 +select cidx, CDOUBLE, NULLIF(CDOUBLE,CINTEGER) from datatypetestm order by cidx; +cidx CDOUBLE NULLIF(CDOUBLE,CINTEGER) +1 -1.797693231e108 -1.797693231e108 +select cidx, CDOUBLE, NULLIF(CDOUBLE,CDOUBLE) from datatypetestm order by cidx; +cidx CDOUBLE NULLIF(CDOUBLE,CDOUBLE) +1 -1.797693231e108 NULL +select cidx, CDOUBLE, NULLIF(CDOUBLE,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CDOUBLE NULLIF(CDOUBLE,CDECIMAL9_2) +1 -1.797693231e108 -1.797693231e108 +select cidx, CDOUBLE, NULLIF(CDOUBLE,1) from datatypetestm order by cidx; +cidx CDOUBLE NULLIF(CDOUBLE,1) +1 -1.797693231e108 -1.797693231e108 +select cidx, CDOUBLE, NULLIF(CDOUBLE,3.14) from datatypetestm order by cidx; +cidx CDOUBLE NULLIF(CDOUBLE,3.14) +1 -1.797693231e108 -1.797693231e108 +select cidx, CDOUBLE, NULLIF(CDOUBLE,CCHAR4) from datatypetestm order by cidx; +cidx CDOUBLE NULLIF(CDOUBLE,CCHAR4) +1 -1.797693231e108 -1.797693231e108 +select cidx, CDOUBLE, NULLIF(CDOUBLE,CDATE) from datatypetestm order by cidx; +cidx CDOUBLE NULLIF(CDOUBLE,CDATE) +1 -1.797693231e108 -1.797693231e108 +select cidx, CDOUBLE, NULLIF(CDOUBLE,NULL) from datatypetestm order by cidx; +cidx CDOUBLE NULLIF(CDOUBLE,NULL) +1 -1.797693231e108 -1.797693231e108 +select cidx, CDOUBLE, NULLIF(CDOUBLE,'HELLO WORLD') from datatypetestm order by cidx; +cidx CDOUBLE NULLIF(CDOUBLE,'HELLO WORLD') +1 -1.797693231e108 -1.797693231e108 +select cidx, CFLOAT, NULLIF(CFLOAT,CBIGINT) from datatypetestm order by cidx; +cidx CFLOAT NULLIF(CFLOAT,CBIGINT) +1 -3.40287e18 -3.40287e18 +select cidx, CFLOAT, NULLIF(CFLOAT,CINTEGER) from datatypetestm order by cidx; +cidx CFLOAT NULLIF(CFLOAT,CINTEGER) +1 -3.40287e18 -3.40287e18 +select cidx, CFLOAT, NULLIF(CFLOAT,CDOUBLE) from datatypetestm order by cidx; +cidx CFLOAT NULLIF(CFLOAT,CDOUBLE) +1 -3.40287e18 -3.40287e18 +select cidx, CFLOAT, NULLIF(CFLOAT,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CFLOAT NULLIF(CFLOAT,CDECIMAL9_2) +1 -3.40287e18 -3.40287e18 +select cidx, CFLOAT, NULLIF(CFLOAT,1) from datatypetestm order by cidx; +cidx CFLOAT NULLIF(CFLOAT,1) +1 -3.40287e18 -3.40287e18 +select cidx, CFLOAT, NULLIF(CFLOAT,3.14) from datatypetestm order by cidx; +cidx CFLOAT NULLIF(CFLOAT,3.14) +1 -3.40287e18 -3.40287e18 +select cidx, CFLOAT, NULLIF(CFLOAT,CCHAR4) from datatypetestm order by cidx; +cidx CFLOAT NULLIF(CFLOAT,CCHAR4) +1 -3.40287e18 -3.40287e18 +select cidx, CFLOAT, NULLIF(CFLOAT,CDATE) from datatypetestm order by cidx; +cidx CFLOAT NULLIF(CFLOAT,CDATE) +1 -3.40287e18 -3.40287e18 +select cidx, CFLOAT, NULLIF(CFLOAT,NULL) from datatypetestm order by cidx; +cidx CFLOAT NULLIF(CFLOAT,NULL) +1 -3.40287e18 -3.40287e18 +select cidx, CFLOAT, NULLIF(CFLOAT,'HELLO WORLD') from datatypetestm order by cidx; +cidx CFLOAT NULLIF(CFLOAT,'HELLO WORLD') +1 -3.40287e18 -3.40287e18 +select cidx, CBIGINT from datatypetestm where NULLIF(CBIGINT,CBIGINT) <> 0 order by cidx; +cidx CBIGINT +select cidx, CBIGINT from datatypetestm where NULLIF(CBIGINT,CINTEGER) <> 0 order by cidx; +cidx CBIGINT +1 -72036854775806 +select cidx, CBIGINT from datatypetestm where NULLIF(CBIGINT,CDOUBLE) <> 0 order by cidx; +cidx CBIGINT +1 -72036854775806 +select cidx, CBIGINT from datatypetestm where NULLIF(CBIGINT,CDECIMAL9_2) <> 0 order by cidx; +cidx CBIGINT +1 -72036854775806 +select cidx, CBIGINT from datatypetestm where NULLIF(CBIGINT,1) <> 0 order by cidx; +cidx CBIGINT +1 -72036854775806 +select cidx, CBIGINT from datatypetestm where NULLIF(CBIGINT,3.14) <> 0 order by cidx; +cidx CBIGINT +1 -72036854775806 +select cidx, CBIGINT from datatypetestm where NULLIF(CBIGINT,CCHAR4) <> 0 order by cidx; +cidx CBIGINT +1 -72036854775806 +select cidx, CBIGINT from datatypetestm where NULLIF(CBIGINT,CDATE) <> 0 order by cidx; +cidx CBIGINT +1 -72036854775806 +select cidx, CBIGINT from datatypetestm where NULLIF(CBIGINT,NULL) <> 0 order by cidx; +cidx CBIGINT +1 -72036854775806 +select cidx, CBIGINT from datatypetestm where NULLIF(CBIGINT,'HELLO WORLD') <> 0 order by cidx; +cidx CBIGINT +1 -72036854775806 +select cidx, CDECIMAL1 from datatypetestm where NULLIF(CDECIMAL1,CBIGINT) <> 0 order by cidx; +cidx CDECIMAL1 +1 -9 +select cidx, CDECIMAL1 from datatypetestm where NULLIF(CDECIMAL1,CINTEGER) <> 0 order by cidx; +cidx CDECIMAL1 +1 -9 +select cidx, CDECIMAL1 from datatypetestm where NULLIF(CDECIMAL1,CDOUBLE) <> 0 order by cidx; +cidx CDECIMAL1 +1 -9 +select cidx, CDECIMAL1 from datatypetestm where NULLIF(CDECIMAL1,CDECIMAL9_2) <> 0 order by cidx; +cidx CDECIMAL1 +1 -9 +select cidx, CDECIMAL1 from datatypetestm where NULLIF(CDECIMAL1,1) <> 0 order by cidx; +cidx CDECIMAL1 +1 -9 +select cidx, CDECIMAL1 from datatypetestm where NULLIF(CDECIMAL1,3.14) <> 0 order by cidx; +cidx CDECIMAL1 +1 -9 +select cidx, CDECIMAL1 from datatypetestm where NULLIF(CDECIMAL1,CCHAR4) <> 0 order by cidx; +cidx CDECIMAL1 +1 -9 +select cidx, CDECIMAL1 from datatypetestm where NULLIF(CDECIMAL1,CDATE) <> 0 order by cidx; +cidx CDECIMAL1 +1 -9 +select cidx, CDECIMAL1 from datatypetestm where NULLIF(CDECIMAL1,NULL) <> 0 order by cidx; +cidx CDECIMAL1 +1 -9 +select cidx, CDECIMAL1 from datatypetestm where NULLIF(CDECIMAL1,'HELLO WORLD') <> 0 order by cidx; +cidx CDECIMAL1 +1 -9 +select cidx, CDECIMAL4 from datatypetestm where NULLIF(CDECIMAL4,CBIGINT) <> 0 order by cidx; +cidx CDECIMAL4 +1 -999 +select cidx, CDECIMAL4 from datatypetestm where NULLIF(CDECIMAL4,CINTEGER) <> 0 order by cidx; +cidx CDECIMAL4 +1 -999 +select cidx, CDECIMAL4 from datatypetestm where NULLIF(CDECIMAL4,CDOUBLE) <> 0 order by cidx; +cidx CDECIMAL4 +1 -999 +select cidx, CDECIMAL4 from datatypetestm where NULLIF(CDECIMAL4,CDECIMAL9_2) <> 0 order by cidx; +cidx CDECIMAL4 +1 -999 +select cidx, CDECIMAL4 from datatypetestm where NULLIF(CDECIMAL4,1) <> 0 order by cidx; +cidx CDECIMAL4 +1 -999 +select cidx, CDECIMAL4 from datatypetestm where NULLIF(CDECIMAL4,3.14) <> 0 order by cidx; +cidx CDECIMAL4 +1 -999 +select cidx, CDECIMAL4 from datatypetestm where NULLIF(CDECIMAL4,CCHAR4) <> 0 order by cidx; +cidx CDECIMAL4 +1 -999 +select cidx, CDECIMAL4 from datatypetestm where NULLIF(CDECIMAL4,CDATE) <> 0 order by cidx; +cidx CDECIMAL4 +1 -999 +select cidx, CDECIMAL4 from datatypetestm where NULLIF(CDECIMAL4,NULL) <> 0 order by cidx; +cidx CDECIMAL4 +1 -999 +select cidx, CDECIMAL4 from datatypetestm where NULLIF(CDECIMAL4,'HELLO WORLD') <> 0 order by cidx; +cidx CDECIMAL4 +1 -999 +select cidx, CDECIMAL4_2 from datatypetestm where NULLIF(CDECIMAL4_2,CBIGINT) <> 0 order by cidx; +cidx CDECIMAL4_2 +1 -9.99 +select cidx, CDECIMAL4_2 from datatypetestm where NULLIF(CDECIMAL4_2,CINTEGER) <> 0 order by cidx; +cidx CDECIMAL4_2 +1 -9.99 +select cidx, CDECIMAL4_2 from datatypetestm where NULLIF(CDECIMAL4_2,CDOUBLE) <> 0 order by cidx; +cidx CDECIMAL4_2 +1 -9.99 +select cidx, CDECIMAL4_2 from datatypetestm where NULLIF(CDECIMAL4_2,CDECIMAL9_2) <> 0 order by cidx; +cidx CDECIMAL4_2 +1 -9.99 +select cidx, CDECIMAL4_2 from datatypetestm where NULLIF(CDECIMAL4_2,1) <> 0 order by cidx; +cidx CDECIMAL4_2 +1 -9.99 +select cidx, CDECIMAL4_2 from datatypetestm where NULLIF(CDECIMAL4_2,3.14) <> 0 order by cidx; +cidx CDECIMAL4_2 +1 -9.99 +select cidx, CDECIMAL4_2 from datatypetestm where NULLIF(CDECIMAL4_2,CCHAR4) <> 0 order by cidx; +cidx CDECIMAL4_2 +1 -9.99 +select cidx, CDECIMAL4_2 from datatypetestm where NULLIF(CDECIMAL4_2,CDATE) <> 0 order by cidx; +cidx CDECIMAL4_2 +1 -9.99 +select cidx, CDECIMAL4_2 from datatypetestm where NULLIF(CDECIMAL4_2,NULL) <> 0 order by cidx; +cidx CDECIMAL4_2 +1 -9.99 +select cidx, CDECIMAL4_2 from datatypetestm where NULLIF(CDECIMAL4_2,'HELLO WORLD') <> 0 order by cidx; +cidx CDECIMAL4_2 +1 -9.99 +select cidx, CDECIMAL5 from datatypetestm where NULLIF(CDECIMAL5,CBIGINT) <> 0 order by cidx; +cidx CDECIMAL5 +1 -999 +select cidx, CDECIMAL5 from datatypetestm where NULLIF(CDECIMAL5,CINTEGER) <> 0 order by cidx; +cidx CDECIMAL5 +1 -999 +select cidx, CDECIMAL5 from datatypetestm where NULLIF(CDECIMAL5,CDOUBLE) <> 0 order by cidx; +cidx CDECIMAL5 +1 -999 +select cidx, CDECIMAL5 from datatypetestm where NULLIF(CDECIMAL5,CDECIMAL9_2) <> 0 order by cidx; +cidx CDECIMAL5 +1 -999 +select cidx, CDECIMAL5 from datatypetestm where NULLIF(CDECIMAL5,1) <> 0 order by cidx; +cidx CDECIMAL5 +1 -999 +select cidx, CDECIMAL5 from datatypetestm where NULLIF(CDECIMAL5,3.14) <> 0 order by cidx; +cidx CDECIMAL5 +1 -999 +select cidx, CDECIMAL5 from datatypetestm where NULLIF(CDECIMAL5,CCHAR4) <> 0 order by cidx; +cidx CDECIMAL5 +1 -999 +select cidx, CDECIMAL5 from datatypetestm where NULLIF(CDECIMAL5,CDATE) <> 0 order by cidx; +cidx CDECIMAL5 +1 -999 +select cidx, CDECIMAL5 from datatypetestm where NULLIF(CDECIMAL5,NULL) <> 0 order by cidx; +cidx CDECIMAL5 +1 -999 +select cidx, CDECIMAL5 from datatypetestm where NULLIF(CDECIMAL5,'HELLO WORLD') <> 0 order by cidx; +cidx CDECIMAL5 +1 -999 +select cidx, CDECIMAL9 from datatypetestm where NULLIF(CDECIMAL9,CBIGINT) <> 0 order by cidx; +cidx CDECIMAL9 +1 -999999 +select cidx, CDECIMAL9 from datatypetestm where NULLIF(CDECIMAL9,CINTEGER) <> 0 order by cidx; +cidx CDECIMAL9 +1 -999999 +select cidx, CDECIMAL9 from datatypetestm where NULLIF(CDECIMAL9,CDOUBLE) <> 0 order by cidx; +cidx CDECIMAL9 +1 -999999 +select cidx, CDECIMAL9 from datatypetestm where NULLIF(CDECIMAL9,CDECIMAL9_2) <> 0 order by cidx; +cidx CDECIMAL9 +1 -999999 +select cidx, CDECIMAL9 from datatypetestm where NULLIF(CDECIMAL9,1) <> 0 order by cidx; +cidx CDECIMAL9 +1 -999999 +select cidx, CDECIMAL9 from datatypetestm where NULLIF(CDECIMAL9,3.14) <> 0 order by cidx; +cidx CDECIMAL9 +1 -999999 +select cidx, CDECIMAL9 from datatypetestm where NULLIF(CDECIMAL9,CCHAR4) <> 0 order by cidx; +cidx CDECIMAL9 +1 -999999 +select cidx, CDECIMAL9 from datatypetestm where NULLIF(CDECIMAL9,CDATE) <> 0 order by cidx; +cidx CDECIMAL9 +1 -999999 +select cidx, CDECIMAL9 from datatypetestm where NULLIF(CDECIMAL9,NULL) <> 0 order by cidx; +cidx CDECIMAL9 +1 -999999 +select cidx, CDECIMAL9 from datatypetestm where NULLIF(CDECIMAL9,'HELLO WORLD') <> 0 order by cidx; +cidx CDECIMAL9 +1 -999999 +select cidx, CDECIMAL9_2 from datatypetestm where NULLIF(CDECIMAL9_2,CBIGINT) <> 0 order by cidx; +cidx CDECIMAL9_2 +1 -9999.99 +select cidx, CDECIMAL9_2 from datatypetestm where NULLIF(CDECIMAL9_2,CINTEGER) <> 0 order by cidx; +cidx CDECIMAL9_2 +1 -9999.99 +select cidx, CDECIMAL9_2 from datatypetestm where NULLIF(CDECIMAL9_2,CDOUBLE) <> 0 order by cidx; +cidx CDECIMAL9_2 +1 -9999.99 +select cidx, CDECIMAL9_2 from datatypetestm where NULLIF(CDECIMAL9_2,CDECIMAL9_2) <> 0 order by cidx; +cidx CDECIMAL9_2 +select cidx, CDECIMAL9_2 from datatypetestm where NULLIF(CDECIMAL9_2,1) <> 0 order by cidx; +cidx CDECIMAL9_2 +1 -9999.99 +select cidx, CDECIMAL9_2 from datatypetestm where NULLIF(CDECIMAL9_2,3.14) <> 0 order by cidx; +cidx CDECIMAL9_2 +1 -9999.99 +select cidx, CDECIMAL9_2 from datatypetestm where NULLIF(CDECIMAL9_2,CCHAR4) <> 0 order by cidx; +cidx CDECIMAL9_2 +1 -9999.99 +select cidx, CDECIMAL9_2 from datatypetestm where NULLIF(CDECIMAL9_2,CDATE) <> 0 order by cidx; +cidx CDECIMAL9_2 +1 -9999.99 +select cidx, CDECIMAL9_2 from datatypetestm where NULLIF(CDECIMAL9_2,NULL) <> 0 order by cidx; +cidx CDECIMAL9_2 +1 -9999.99 +select cidx, CDECIMAL9_2 from datatypetestm where NULLIF(CDECIMAL9_2,'HELLO WORLD') <> 0 order by cidx; +cidx CDECIMAL9_2 +1 -9999.99 +select cidx, CDECIMAL10 from datatypetestm where NULLIF(CDECIMAL10,CBIGINT) <> 0 order by cidx; +cidx CDECIMAL10 +1 -9999999 +select cidx, CDECIMAL10 from datatypetestm where NULLIF(CDECIMAL10,CINTEGER) <> 0 order by cidx; +cidx CDECIMAL10 +1 -9999999 +select cidx, CDECIMAL10 from datatypetestm where NULLIF(CDECIMAL10,CDOUBLE) <> 0 order by cidx; +cidx CDECIMAL10 +1 -9999999 +select cidx, CDECIMAL10 from datatypetestm where NULLIF(CDECIMAL10,CDECIMAL9_2) <> 0 order by cidx; +cidx CDECIMAL10 +1 -9999999 +select cidx, CDECIMAL10 from datatypetestm where NULLIF(CDECIMAL10,1) <> 0 order by cidx; +cidx CDECIMAL10 +1 -9999999 +select cidx, CDECIMAL10 from datatypetestm where NULLIF(CDECIMAL10,3.14) <> 0 order by cidx; +cidx CDECIMAL10 +1 -9999999 +select cidx, CDECIMAL10 from datatypetestm where NULLIF(CDECIMAL10,CCHAR4) <> 0 order by cidx; +cidx CDECIMAL10 +1 -9999999 +select cidx, CDECIMAL10 from datatypetestm where NULLIF(CDECIMAL10,CDATE) <> 0 order by cidx; +cidx CDECIMAL10 +1 -9999999 +select cidx, CDECIMAL10 from datatypetestm where NULLIF(CDECIMAL10,NULL) <> 0 order by cidx; +cidx CDECIMAL10 +1 -9999999 +select cidx, CDECIMAL10 from datatypetestm where NULLIF(CDECIMAL10,'HELLO WORLD') <> 0 order by cidx; +cidx CDECIMAL10 +1 -9999999 +select cidx, CDECIMAL18 from datatypetestm where NULLIF(CDECIMAL18,CBIGINT) <> 0 order by cidx; +cidx CDECIMAL18 +1 -9999999999999 +select cidx, CDECIMAL18 from datatypetestm where NULLIF(CDECIMAL18,CINTEGER) <> 0 order by cidx; +cidx CDECIMAL18 +1 -9999999999999 +select cidx, CDECIMAL18 from datatypetestm where NULLIF(CDECIMAL18,CDOUBLE) <> 0 order by cidx; +cidx CDECIMAL18 +1 -9999999999999 +select cidx, CDECIMAL18 from datatypetestm where NULLIF(CDECIMAL18,CDECIMAL9_2) <> 0 order by cidx; +cidx CDECIMAL18 +1 -9999999999999 +select cidx, CDECIMAL18 from datatypetestm where NULLIF(CDECIMAL18,1) <> 0 order by cidx; +cidx CDECIMAL18 +1 -9999999999999 +select cidx, CDECIMAL18 from datatypetestm where NULLIF(CDECIMAL18,3.14) <> 0 order by cidx; +cidx CDECIMAL18 +1 -9999999999999 +select cidx, CDECIMAL18 from datatypetestm where NULLIF(CDECIMAL18,CCHAR4) <> 0 order by cidx; +cidx CDECIMAL18 +1 -9999999999999 +select cidx, CDECIMAL18 from datatypetestm where NULLIF(CDECIMAL18,CDATE) <> 0 order by cidx; +cidx CDECIMAL18 +1 -9999999999999 +select cidx, CDECIMAL18 from datatypetestm where NULLIF(CDECIMAL18,NULL) <> 0 order by cidx; +cidx CDECIMAL18 +1 -9999999999999 +select cidx, CDECIMAL18 from datatypetestm where NULLIF(CDECIMAL18,'HELLO WORLD') <> 0 order by cidx; +cidx CDECIMAL18 +1 -9999999999999 +select cidx, CDECIMAL18_2 from datatypetestm where NULLIF(CDECIMAL18_2,CBIGINT) <> 0 order by cidx; +cidx CDECIMAL18_2 +1 -99999999999.99 +select cidx, CDECIMAL18_2 from datatypetestm where NULLIF(CDECIMAL18_2,CINTEGER) <> 0 order by cidx; +cidx CDECIMAL18_2 +1 -99999999999.99 +select cidx, CDECIMAL18_2 from datatypetestm where NULLIF(CDECIMAL18_2,CDOUBLE) <> 0 order by cidx; +cidx CDECIMAL18_2 +1 -99999999999.99 +select cidx, CDECIMAL18_2 from datatypetestm where NULLIF(CDECIMAL18_2,CDECIMAL9_2) <> 0 order by cidx; +cidx CDECIMAL18_2 +1 -99999999999.99 +select cidx, CDECIMAL18_2 from datatypetestm where NULLIF(CDECIMAL18_2,1) <> 0 order by cidx; +cidx CDECIMAL18_2 +1 -99999999999.99 +select cidx, CDECIMAL18_2 from datatypetestm where NULLIF(CDECIMAL18_2,3.14) <> 0 order by cidx; +cidx CDECIMAL18_2 +1 -99999999999.99 +select cidx, CDECIMAL18_2 from datatypetestm where NULLIF(CDECIMAL18_2,CCHAR4) <> 0 order by cidx; +cidx CDECIMAL18_2 +1 -99999999999.99 +select cidx, CDECIMAL18_2 from datatypetestm where NULLIF(CDECIMAL18_2,CDATE) <> 0 order by cidx; +cidx CDECIMAL18_2 +1 -99999999999.99 +select cidx, CDECIMAL18_2 from datatypetestm where NULLIF(CDECIMAL18_2,NULL) <> 0 order by cidx; +cidx CDECIMAL18_2 +1 -99999999999.99 +select cidx, CDECIMAL18_2 from datatypetestm where NULLIF(CDECIMAL18_2,'HELLO WORLD') <> 0 order by cidx; +cidx CDECIMAL18_2 +1 -99999999999.99 +select cidx, CINTEGER from datatypetestm where NULLIF(CINTEGER,CBIGINT) <> 0 order by cidx; +cidx CINTEGER +1 -7483646 +select cidx, CINTEGER from datatypetestm where NULLIF(CINTEGER,CINTEGER) <> 0 order by cidx; +cidx CINTEGER +select cidx, CINTEGER from datatypetestm where NULLIF(CINTEGER,CDOUBLE) <> 0 order by cidx; +cidx CINTEGER +1 -7483646 +select cidx, CINTEGER from datatypetestm where NULLIF(CINTEGER,CDECIMAL9_2) <> 0 order by cidx; +cidx CINTEGER +1 -7483646 +select cidx, CINTEGER from datatypetestm where NULLIF(CINTEGER,1) <> 0 order by cidx; +cidx CINTEGER +1 -7483646 +select cidx, CINTEGER from datatypetestm where NULLIF(CINTEGER,3.14) <> 0 order by cidx; +cidx CINTEGER +1 -7483646 +select cidx, CINTEGER from datatypetestm where NULLIF(CINTEGER,CCHAR4) <> 0 order by cidx; +cidx CINTEGER +1 -7483646 +select cidx, CINTEGER from datatypetestm where NULLIF(CINTEGER,CDATE) <> 0 order by cidx; +cidx CINTEGER +1 -7483646 +select cidx, CINTEGER from datatypetestm where NULLIF(CINTEGER,NULL) <> 0 order by cidx; +cidx CINTEGER +1 -7483646 +select cidx, CINTEGER from datatypetestm where NULLIF(CINTEGER,'HELLO WORLD') <> 0 order by cidx; +cidx CINTEGER +1 -7483646 +select cidx, CSMALLINT from datatypetestm where NULLIF(CSMALLINT,CBIGINT) <> 0 order by cidx; +cidx CSMALLINT +1 -766 +select cidx, CSMALLINT from datatypetestm where NULLIF(CSMALLINT,CINTEGER) <> 0 order by cidx; +cidx CSMALLINT +1 -766 +select cidx, CSMALLINT from datatypetestm where NULLIF(CSMALLINT,CDOUBLE) <> 0 order by cidx; +cidx CSMALLINT +1 -766 +select cidx, CSMALLINT from datatypetestm where NULLIF(CSMALLINT,CDECIMAL9_2) <> 0 order by cidx; +cidx CSMALLINT +1 -766 +select cidx, CSMALLINT from datatypetestm where NULLIF(CSMALLINT,1) <> 0 order by cidx; +cidx CSMALLINT +1 -766 +select cidx, CSMALLINT from datatypetestm where NULLIF(CSMALLINT,3.14) <> 0 order by cidx; +cidx CSMALLINT +1 -766 +select cidx, CSMALLINT from datatypetestm where NULLIF(CSMALLINT,CCHAR4) <> 0 order by cidx; +cidx CSMALLINT +1 -766 +select cidx, CSMALLINT from datatypetestm where NULLIF(CSMALLINT,CDATE) <> 0 order by cidx; +cidx CSMALLINT +1 -766 +select cidx, CSMALLINT from datatypetestm where NULLIF(CSMALLINT,NULL) <> 0 order by cidx; +cidx CSMALLINT +1 -766 +select cidx, CSMALLINT from datatypetestm where NULLIF(CSMALLINT,'HELLO WORLD') <> 0 order by cidx; +cidx CSMALLINT +1 -766 +select cidx, CTINYINT from datatypetestm where NULLIF(CTINYINT,CBIGINT) <> 0 order by cidx; +cidx CTINYINT +1 -26 +select cidx, CTINYINT from datatypetestm where NULLIF(CTINYINT,CINTEGER) <> 0 order by cidx; +cidx CTINYINT +1 -26 +select cidx, CTINYINT from datatypetestm where NULLIF(CTINYINT,CDOUBLE) <> 0 order by cidx; +cidx CTINYINT +1 -26 +select cidx, CTINYINT from datatypetestm where NULLIF(CTINYINT,CDECIMAL9_2) <> 0 order by cidx; +cidx CTINYINT +1 -26 +select cidx, CTINYINT from datatypetestm where NULLIF(CTINYINT,1) <> 0 order by cidx; +cidx CTINYINT +1 -26 +select cidx, CTINYINT from datatypetestm where NULLIF(CTINYINT,3.14) <> 0 order by cidx; +cidx CTINYINT +1 -26 +select cidx, CTINYINT from datatypetestm where NULLIF(CTINYINT,CCHAR4) <> 0 order by cidx; +cidx CTINYINT +1 -26 +select cidx, CTINYINT from datatypetestm where NULLIF(CTINYINT,CDATE) <> 0 order by cidx; +cidx CTINYINT +1 -26 +select cidx, CTINYINT from datatypetestm where NULLIF(CTINYINT,NULL) <> 0 order by cidx; +cidx CTINYINT +1 -26 +select cidx, CTINYINT from datatypetestm where NULLIF(CTINYINT,'HELLO WORLD') <> 0 order by cidx; +cidx CTINYINT +1 -26 +select cidx, CDOUBLE from datatypetestm where NULLIF(CDOUBLE,CBIGINT) <> 0 order by cidx; +cidx CDOUBLE +1 -1.797693231e108 +select cidx, CDOUBLE from datatypetestm where NULLIF(CDOUBLE,CINTEGER) <> 0 order by cidx; +cidx CDOUBLE +1 -1.797693231e108 +select cidx, CDOUBLE from datatypetestm where NULLIF(CDOUBLE,CDOUBLE) <> 0 order by cidx; +cidx CDOUBLE +select cidx, CDOUBLE from datatypetestm where NULLIF(CDOUBLE,CDECIMAL9_2) <> 0 order by cidx; +cidx CDOUBLE +1 -1.797693231e108 +select cidx, CDOUBLE from datatypetestm where NULLIF(CDOUBLE,1) <> 0 order by cidx; +cidx CDOUBLE +1 -1.797693231e108 +select cidx, CDOUBLE from datatypetestm where NULLIF(CDOUBLE,3.14) <> 0 order by cidx; +cidx CDOUBLE +1 -1.797693231e108 +select cidx, CDOUBLE from datatypetestm where NULLIF(CDOUBLE,CCHAR4) <> 0 order by cidx; +cidx CDOUBLE +1 -1.797693231e108 +select cidx, CDOUBLE from datatypetestm where NULLIF(CDOUBLE,CDATE) <> 0 order by cidx; +cidx CDOUBLE +1 -1.797693231e108 +select cidx, CDOUBLE from datatypetestm where NULLIF(CDOUBLE,NULL) <> 0 order by cidx; +cidx CDOUBLE +1 -1.797693231e108 +select cidx, CDOUBLE from datatypetestm where NULLIF(CDOUBLE,'HELLO WORLD') <> 0 order by cidx; +cidx CDOUBLE +1 -1.797693231e108 +select cidx, CFLOAT from datatypetestm where NULLIF(CFLOAT,CBIGINT) <> 0 order by cidx; +cidx CFLOAT +1 -3.40287e18 +select cidx, CFLOAT from datatypetestm where NULLIF(CFLOAT,CINTEGER) <> 0 order by cidx; +cidx CFLOAT +1 -3.40287e18 +select cidx, CFLOAT from datatypetestm where NULLIF(CFLOAT,CDOUBLE) <> 0 order by cidx; +cidx CFLOAT +1 -3.40287e18 +select cidx, CFLOAT from datatypetestm where NULLIF(CFLOAT,CDECIMAL9_2) <> 0 order by cidx; +cidx CFLOAT +1 -3.40287e18 +select cidx, CFLOAT from datatypetestm where NULLIF(CFLOAT,1) <> 0 order by cidx; +cidx CFLOAT +1 -3.40287e18 +select cidx, CFLOAT from datatypetestm where NULLIF(CFLOAT,3.14) <> 0 order by cidx; +cidx CFLOAT +1 -3.40287e18 +select cidx, CFLOAT from datatypetestm where NULLIF(CFLOAT,CCHAR4) <> 0 order by cidx; +cidx CFLOAT +1 -3.40287e18 +select cidx, CFLOAT from datatypetestm where NULLIF(CFLOAT,CDATE) <> 0 order by cidx; +cidx CFLOAT +1 -3.40287e18 +select cidx, CFLOAT from datatypetestm where NULLIF(CFLOAT,NULL) <> 0 order by cidx; +cidx CFLOAT +1 -3.40287e18 +select cidx, CFLOAT from datatypetestm where NULLIF(CFLOAT,'HELLO WORLD') <> 0 order by cidx; +cidx CFLOAT +1 -3.40287e18 diff --git a/mysql-test/columnstore/autopilot/r/mcs4220_function_CNX_TIME_TO_SEC_DS_maxscale.result b/mysql-test/columnstore/autopilot/r/mcs4220_function_CNX_TIME_TO_SEC_DS_maxscale.result new file mode 100644 index 000000000..905617197 --- /dev/null +++ b/mysql-test/columnstore/autopilot/r/mcs4220_function_CNX_TIME_TO_SEC_DS_maxscale.result @@ -0,0 +1,26 @@ +USE autopilot; +select cidx, CDATE, TIME_TO_SEC(CDATE) from datatypetestm order by cidx; +cidx CDATE TIME_TO_SEC(CDATE) +1 1997-01-01 0 +select cidx, CDATETIME, TIME_TO_SEC(CDATETIME) from datatypetestm order by cidx; +cidx CDATETIME TIME_TO_SEC(CDATETIME) +1 1997-01-01 00:00:00 0 +select cidx, CTIME, TIME_TO_SEC(CTIME) from datatypetestm order by cidx; +cidx CTIME TIME_TO_SEC(CTIME) +1 13:00:00 46800 +select cidx, TIME_TO_SEC('22:23:00') from datatypetestm order by cidx; +cidx TIME_TO_SEC('22:23:00') +1 80580 +select cidx, TIME_TO_SEC('00:39:38') from datatypetestm order by cidx; +cidx TIME_TO_SEC('00:39:38') +1 2378 +select cidx, TIME_TO_SEC('22:23:49 999999') from datatypetestm order by cidx; +cidx TIME_TO_SEC('22:23:49 999999') +1 NULL +select cidx, CDATE from datatypetestm where TIME_TO_SEC(CDATE) <> 0 order by cidx; +cidx CDATE +select cidx, CDATETIME from datatypetestm where TIME_TO_SEC(CDATETIME) <> 0 order by cidx; +cidx CDATETIME +select cidx, CTIME from datatypetestm where TIME_TO_SEC(CTIME) <> 0 order by cidx; +cidx CTIME +1 13:00:00 diff --git a/mysql-test/columnstore/autopilot/r/mcs4350_function_CNXPP_LAST_DAY_DS_maxscale.result b/mysql-test/columnstore/autopilot/r/mcs4350_function_CNXPP_LAST_DAY_DS_maxscale.result new file mode 100644 index 000000000..323a010ee --- /dev/null +++ b/mysql-test/columnstore/autopilot/r/mcs4350_function_CNXPP_LAST_DAY_DS_maxscale.result @@ -0,0 +1,25 @@ +USE autopilot; +select cidx, CDATE, LAST_DAY(CDATE) from datatypetestm order by cidx; +cidx CDATE LAST_DAY(CDATE) +1 1997-01-01 1997-01-31 +select cidx, CDATETIME, LAST_DAY(CDATETIME) from datatypetestm order by cidx; +cidx CDATETIME LAST_DAY(CDATETIME) +1 1997-01-01 00:00:00 1997-01-31 +select cidx, CTIME, LAST_DAY(CTIME) from datatypetestm order by cidx; +cidx CTIME LAST_DAY(CTIME) +1 13:00:00 REPLACEDVALUE +select cidx, LAST_DAY('2009-02-28') from datatypetestm order by cidx; +cidx LAST_DAY('2009-02-28') +1 2009-02-28 +select cidx, LAST_DAY('2009-07-04') from datatypetestm order by cidx; +cidx LAST_DAY('2009-07-04') +1 2009-07-31 +select cidx, LAST_DAY('2010-02-31') from datatypetestm order by cidx; +cidx LAST_DAY('2010-02-31') +1 NULL +select cidx, CDATE from datatypetestm order by LAST_DAY(CDATE), cidx; +cidx CDATE +1 1997-01-01 +select cidx, CDATETIME from datatypetestm order by LAST_DAY(CDATETIME), cidx; +cidx CDATETIME +1 1997-01-01 00:00:00 diff --git a/mysql-test/columnstore/autopilot/r/mcs4379_function_CNXPP_MICROSECOND_DS_maxscale.result b/mysql-test/columnstore/autopilot/r/mcs4379_function_CNXPP_MICROSECOND_DS_maxscale.result new file mode 100644 index 000000000..2f5f69a36 --- /dev/null +++ b/mysql-test/columnstore/autopilot/r/mcs4379_function_CNXPP_MICROSECOND_DS_maxscale.result @@ -0,0 +1,25 @@ +USE autopilot; +select cidx, CDATE, MICROSECOND(CDATE) from datatypetestm order by cidx; +cidx CDATE MICROSECOND(CDATE) +1 1997-01-01 0 +select cidx, CDATETIME, MICROSECOND(CDATETIME) from datatypetestm order by cidx; +cidx CDATETIME MICROSECOND(CDATETIME) +1 1997-01-01 00:00:00 0 +select cidx, CTIME, MICROSECOND(CTIME) from datatypetestm order by cidx; +cidx CTIME MICROSECOND(CTIME) +1 13:00:00 0 +select cidx, MICROSECOND('2011-05-01') from datatypetestm order by cidx; +cidx MICROSECOND('2011-05-01') +1 0 +select cidx, MICROSECOND('2011-05-01 13:58:22.123456') from datatypetestm order by cidx; +cidx MICROSECOND('2011-05-01 13:58:22.123456') +1 123456 +select cidx, CDATE from datatypetestm order by MICROSECOND(CDATE), cidx; +cidx CDATE +1 1997-01-01 +select cidx, CDATETIME from datatypetestm order by MICROSECOND(CDATETIME), cidx; +cidx CDATETIME +1 1997-01-01 00:00:00 +select cidx, CTIME from datatypetestm order by MICROSECOND(CTIME), cidx; +cidx CTIME +1 13:00:00 diff --git a/mysql-test/columnstore/autopilot/r/mcs4387_function_CNXPP_MONTHNAME_DS_maxscale.result b/mysql-test/columnstore/autopilot/r/mcs4387_function_CNXPP_MONTHNAME_DS_maxscale.result new file mode 100644 index 000000000..ced940980 --- /dev/null +++ b/mysql-test/columnstore/autopilot/r/mcs4387_function_CNXPP_MONTHNAME_DS_maxscale.result @@ -0,0 +1,25 @@ +USE autopilot; +select cidx, CDATE, MONTHNAME(CDATE) from datatypetestm order by cidx; +cidx CDATE MONTHNAME(CDATE) +1 1997-01-01 January +select cidx, CDATETIME, MONTHNAME(CDATETIME) from datatypetestm order by cidx; +cidx CDATETIME MONTHNAME(CDATETIME) +1 1997-01-01 00:00:00 January +select cidx, CTIME, MONTHNAME(CTIME) from datatypetestm order by cidx; +cidx CTIME MONTHNAME(CTIME) +1 13:00:00 REPLACEDVALUE +select cidx, MONTHNAME('2009-02-28') from datatypetestm order by cidx; +cidx MONTHNAME('2009-02-28') +1 February +select cidx, MONTHNAME('2009-07-04') from datatypetestm order by cidx; +cidx MONTHNAME('2009-07-04') +1 July +select cidx, MONTHNAME('2010-02-31') from datatypetestm order by cidx; +cidx MONTHNAME('2010-02-31') +1 NULL +select cidx, CDATE from datatypetestm order by MONTHNAME(CDATE), cidx; +cidx CDATE +1 1997-01-01 +select cidx, CDATETIME from datatypetestm order by MONTHNAME(CDATETIME), cidx; +cidx CDATETIME +1 1997-01-01 00:00:00 diff --git a/mysql-test/columnstore/autopilot/r/mcs4389_function_CNXPP_NULLIF_NM_Archived_maxscale.result b/mysql-test/columnstore/autopilot/r/mcs4389_function_CNXPP_NULLIF_NM_Archived_maxscale.result new file mode 100644 index 000000000..2225347ba --- /dev/null +++ b/mysql-test/columnstore/autopilot/r/mcs4389_function_CNXPP_NULLIF_NM_Archived_maxscale.result @@ -0,0 +1,901 @@ +USE autopilot; +select cidx, CBIGINT, NULLIF(CBIGINT,CBIGINT) from datatypetestm order by cidx; +cidx CBIGINT NULLIF(CBIGINT,CBIGINT) +1 -72036854775806 NULL +select cidx, CBIGINT, NULLIF(CBIGINT,CINTEGER) from datatypetestm order by cidx; +cidx CBIGINT NULLIF(CBIGINT,CINTEGER) +1 -72036854775806 -72036854775806 +select cidx, CBIGINT, NULLIF(CBIGINT,CDOUBLE) from datatypetestm order by cidx; +cidx CBIGINT NULLIF(CBIGINT,CDOUBLE) +1 -72036854775806 -72036854775806 +select cidx, CBIGINT, NULLIF(CBIGINT,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CBIGINT NULLIF(CBIGINT,CDECIMAL9_2) +1 -72036854775806 -72036854775806 +select cidx, CBIGINT, NULLIF(CBIGINT,1) from datatypetestm order by cidx; +cidx CBIGINT NULLIF(CBIGINT,1) +1 -72036854775806 -72036854775806 +select cidx, CBIGINT, NULLIF(CBIGINT,3.14) from datatypetestm order by cidx; +cidx CBIGINT NULLIF(CBIGINT,3.14) +1 -72036854775806 -72036854775806 +select cidx, CBIGINT, NULLIF(CBIGINT,CCHAR4) from datatypetestm order by cidx; +cidx CBIGINT NULLIF(CBIGINT,CCHAR4) +1 -72036854775806 -72036854775806 +select cidx, CBIGINT, NULLIF(CBIGINT,CDATE) from datatypetestm order by cidx; +cidx CBIGINT NULLIF(CBIGINT,CDATE) +1 -72036854775806 -72036854775806 +select cidx, CBIGINT, NULLIF(CBIGINT,NULL) from datatypetestm order by cidx; +cidx CBIGINT NULLIF(CBIGINT,NULL) +1 -72036854775806 -72036854775806 +select cidx, CBIGINT, NULLIF(CBIGINT,'HELLO WORLD') from datatypetestm order by cidx; +cidx CBIGINT NULLIF(CBIGINT,'HELLO WORLD') +1 -72036854775806 -72036854775806 +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CBIGINT) from datatypetestm order by cidx; +cidx CDECIMAL1 NULLIF(CDECIMAL1,CBIGINT) +1 -9 -9 +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CINTEGER) from datatypetestm order by cidx; +cidx CDECIMAL1 NULLIF(CDECIMAL1,CINTEGER) +1 -9 -9 +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CDOUBLE) from datatypetestm order by cidx; +cidx CDECIMAL1 NULLIF(CDECIMAL1,CDOUBLE) +1 -9 -9 +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CDECIMAL1 NULLIF(CDECIMAL1,CDECIMAL9_2) +1 -9 -9 +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,1) from datatypetestm order by cidx; +cidx CDECIMAL1 NULLIF(CDECIMAL1,1) +1 -9 -9 +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,3.14) from datatypetestm order by cidx; +cidx CDECIMAL1 NULLIF(CDECIMAL1,3.14) +1 -9 -9 +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CCHAR4) from datatypetestm order by cidx; +cidx CDECIMAL1 NULLIF(CDECIMAL1,CCHAR4) +1 -9 -9 +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CDATE) from datatypetestm order by cidx; +cidx CDECIMAL1 NULLIF(CDECIMAL1,CDATE) +1 -9 -9 +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,NULL) from datatypetestm order by cidx; +cidx CDECIMAL1 NULLIF(CDECIMAL1,NULL) +1 -9 -9 +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,'HELLO WORLD') from datatypetestm order by cidx; +cidx CDECIMAL1 NULLIF(CDECIMAL1,'HELLO WORLD') +1 -9 -9 +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CBIGINT) from datatypetestm order by cidx; +cidx CDECIMAL4 NULLIF(CDECIMAL4,CBIGINT) +1 -999 -999 +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CINTEGER) from datatypetestm order by cidx; +cidx CDECIMAL4 NULLIF(CDECIMAL4,CINTEGER) +1 -999 -999 +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CDOUBLE) from datatypetestm order by cidx; +cidx CDECIMAL4 NULLIF(CDECIMAL4,CDOUBLE) +1 -999 -999 +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CDECIMAL4 NULLIF(CDECIMAL4,CDECIMAL9_2) +1 -999 -999 +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,1) from datatypetestm order by cidx; +cidx CDECIMAL4 NULLIF(CDECIMAL4,1) +1 -999 -999 +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,3.14) from datatypetestm order by cidx; +cidx CDECIMAL4 NULLIF(CDECIMAL4,3.14) +1 -999 -999 +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CCHAR4) from datatypetestm order by cidx; +cidx CDECIMAL4 NULLIF(CDECIMAL4,CCHAR4) +1 -999 -999 +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CDATE) from datatypetestm order by cidx; +cidx CDECIMAL4 NULLIF(CDECIMAL4,CDATE) +1 -999 -999 +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,NULL) from datatypetestm order by cidx; +cidx CDECIMAL4 NULLIF(CDECIMAL4,NULL) +1 -999 -999 +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,'HELLO WORLD') from datatypetestm order by cidx; +cidx CDECIMAL4 NULLIF(CDECIMAL4,'HELLO WORLD') +1 -999 -999 +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CBIGINT) from datatypetestm order by cidx; +cidx CDECIMAL4_2 NULLIF(CDECIMAL4_2,CBIGINT) +1 -9.99 -9.99 +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CINTEGER) from datatypetestm order by cidx; +cidx CDECIMAL4_2 NULLIF(CDECIMAL4_2,CINTEGER) +1 -9.99 -9.99 +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CDOUBLE) from datatypetestm order by cidx; +cidx CDECIMAL4_2 NULLIF(CDECIMAL4_2,CDOUBLE) +1 -9.99 -9.99 +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CDECIMAL4_2 NULLIF(CDECIMAL4_2,CDECIMAL9_2) +1 -9.99 -9.99 +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,1) from datatypetestm order by cidx; +cidx CDECIMAL4_2 NULLIF(CDECIMAL4_2,1) +1 -9.99 -9.99 +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,3.14) from datatypetestm order by cidx; +cidx CDECIMAL4_2 NULLIF(CDECIMAL4_2,3.14) +1 -9.99 -9.99 +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CCHAR4) from datatypetestm order by cidx; +cidx CDECIMAL4_2 NULLIF(CDECIMAL4_2,CCHAR4) +1 -9.99 -9.99 +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CDATE) from datatypetestm order by cidx; +cidx CDECIMAL4_2 NULLIF(CDECIMAL4_2,CDATE) +1 -9.99 -9.99 +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,NULL) from datatypetestm order by cidx; +cidx CDECIMAL4_2 NULLIF(CDECIMAL4_2,NULL) +1 -9.99 -9.99 +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,'HELLO WORLD') from datatypetestm order by cidx; +cidx CDECIMAL4_2 NULLIF(CDECIMAL4_2,'HELLO WORLD') +1 -9.99 -9.99 +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CBIGINT) from datatypetestm order by cidx; +cidx CDECIMAL5 NULLIF(CDECIMAL5,CBIGINT) +1 -999 -999 +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CINTEGER) from datatypetestm order by cidx; +cidx CDECIMAL5 NULLIF(CDECIMAL5,CINTEGER) +1 -999 -999 +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CDOUBLE) from datatypetestm order by cidx; +cidx CDECIMAL5 NULLIF(CDECIMAL5,CDOUBLE) +1 -999 -999 +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CDECIMAL5 NULLIF(CDECIMAL5,CDECIMAL9_2) +1 -999 -999 +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,1) from datatypetestm order by cidx; +cidx CDECIMAL5 NULLIF(CDECIMAL5,1) +1 -999 -999 +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,3.14) from datatypetestm order by cidx; +cidx CDECIMAL5 NULLIF(CDECIMAL5,3.14) +1 -999 -999 +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CCHAR4) from datatypetestm order by cidx; +cidx CDECIMAL5 NULLIF(CDECIMAL5,CCHAR4) +1 -999 -999 +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CDATE) from datatypetestm order by cidx; +cidx CDECIMAL5 NULLIF(CDECIMAL5,CDATE) +1 -999 -999 +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,NULL) from datatypetestm order by cidx; +cidx CDECIMAL5 NULLIF(CDECIMAL5,NULL) +1 -999 -999 +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,'HELLO WORLD') from datatypetestm order by cidx; +cidx CDECIMAL5 NULLIF(CDECIMAL5,'HELLO WORLD') +1 -999 -999 +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CBIGINT) from datatypetestm order by cidx; +cidx CDECIMAL9 NULLIF(CDECIMAL9,CBIGINT) +1 -999999 -999999 +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CINTEGER) from datatypetestm order by cidx; +cidx CDECIMAL9 NULLIF(CDECIMAL9,CINTEGER) +1 -999999 -999999 +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CDOUBLE) from datatypetestm order by cidx; +cidx CDECIMAL9 NULLIF(CDECIMAL9,CDOUBLE) +1 -999999 -999999 +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CDECIMAL9 NULLIF(CDECIMAL9,CDECIMAL9_2) +1 -999999 -999999 +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,1) from datatypetestm order by cidx; +cidx CDECIMAL9 NULLIF(CDECIMAL9,1) +1 -999999 -999999 +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,3.14) from datatypetestm order by cidx; +cidx CDECIMAL9 NULLIF(CDECIMAL9,3.14) +1 -999999 -999999 +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CCHAR4) from datatypetestm order by cidx; +cidx CDECIMAL9 NULLIF(CDECIMAL9,CCHAR4) +1 -999999 -999999 +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CDATE) from datatypetestm order by cidx; +cidx CDECIMAL9 NULLIF(CDECIMAL9,CDATE) +1 -999999 -999999 +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,NULL) from datatypetestm order by cidx; +cidx CDECIMAL9 NULLIF(CDECIMAL9,NULL) +1 -999999 -999999 +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,'HELLO WORLD') from datatypetestm order by cidx; +cidx CDECIMAL9 NULLIF(CDECIMAL9,'HELLO WORLD') +1 -999999 -999999 +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CBIGINT) from datatypetestm order by cidx; +cidx CDECIMAL9_2 NULLIF(CDECIMAL9_2,CBIGINT) +1 -9999.99 -9999.99 +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CINTEGER) from datatypetestm order by cidx; +cidx CDECIMAL9_2 NULLIF(CDECIMAL9_2,CINTEGER) +1 -9999.99 -9999.99 +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CDOUBLE) from datatypetestm order by cidx; +cidx CDECIMAL9_2 NULLIF(CDECIMAL9_2,CDOUBLE) +1 -9999.99 -9999.99 +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CDECIMAL9_2 NULLIF(CDECIMAL9_2,CDECIMAL9_2) +1 -9999.99 NULL +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,1) from datatypetestm order by cidx; +cidx CDECIMAL9_2 NULLIF(CDECIMAL9_2,1) +1 -9999.99 -9999.99 +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,3.14) from datatypetestm order by cidx; +cidx CDECIMAL9_2 NULLIF(CDECIMAL9_2,3.14) +1 -9999.99 -9999.99 +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CCHAR4) from datatypetestm order by cidx; +cidx CDECIMAL9_2 NULLIF(CDECIMAL9_2,CCHAR4) +1 -9999.99 -9999.99 +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CDATE) from datatypetestm order by cidx; +cidx CDECIMAL9_2 NULLIF(CDECIMAL9_2,CDATE) +1 -9999.99 -9999.99 +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,NULL) from datatypetestm order by cidx; +cidx CDECIMAL9_2 NULLIF(CDECIMAL9_2,NULL) +1 -9999.99 -9999.99 +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,'HELLO WORLD') from datatypetestm order by cidx; +cidx CDECIMAL9_2 NULLIF(CDECIMAL9_2,'HELLO WORLD') +1 -9999.99 -9999.99 +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CBIGINT) from datatypetestm order by cidx; +cidx CDECIMAL10 NULLIF(CDECIMAL10,CBIGINT) +1 -9999999 -9999999 +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CINTEGER) from datatypetestm order by cidx; +cidx CDECIMAL10 NULLIF(CDECIMAL10,CINTEGER) +1 -9999999 -9999999 +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CDOUBLE) from datatypetestm order by cidx; +cidx CDECIMAL10 NULLIF(CDECIMAL10,CDOUBLE) +1 -9999999 -9999999 +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CDECIMAL10 NULLIF(CDECIMAL10,CDECIMAL9_2) +1 -9999999 -9999999 +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,1) from datatypetestm order by cidx; +cidx CDECIMAL10 NULLIF(CDECIMAL10,1) +1 -9999999 -9999999 +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,3.14) from datatypetestm order by cidx; +cidx CDECIMAL10 NULLIF(CDECIMAL10,3.14) +1 -9999999 -9999999 +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CCHAR4) from datatypetestm order by cidx; +cidx CDECIMAL10 NULLIF(CDECIMAL10,CCHAR4) +1 -9999999 -9999999 +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CDATE) from datatypetestm order by cidx; +cidx CDECIMAL10 NULLIF(CDECIMAL10,CDATE) +1 -9999999 -9999999 +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,NULL) from datatypetestm order by cidx; +cidx CDECIMAL10 NULLIF(CDECIMAL10,NULL) +1 -9999999 -9999999 +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,'HELLO WORLD') from datatypetestm order by cidx; +cidx CDECIMAL10 NULLIF(CDECIMAL10,'HELLO WORLD') +1 -9999999 -9999999 +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CBIGINT) from datatypetestm order by cidx; +cidx CDECIMAL18 NULLIF(CDECIMAL18,CBIGINT) +1 -9999999999999 -9999999999999 +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CINTEGER) from datatypetestm order by cidx; +cidx CDECIMAL18 NULLIF(CDECIMAL18,CINTEGER) +1 -9999999999999 -9999999999999 +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CDOUBLE) from datatypetestm order by cidx; +cidx CDECIMAL18 NULLIF(CDECIMAL18,CDOUBLE) +1 -9999999999999 -9999999999999 +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CDECIMAL18 NULLIF(CDECIMAL18,CDECIMAL9_2) +1 -9999999999999 -9999999999999 +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,1) from datatypetestm order by cidx; +cidx CDECIMAL18 NULLIF(CDECIMAL18,1) +1 -9999999999999 -9999999999999 +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,3.14) from datatypetestm order by cidx; +cidx CDECIMAL18 NULLIF(CDECIMAL18,3.14) +1 -9999999999999 -9999999999999 +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CCHAR4) from datatypetestm order by cidx; +cidx CDECIMAL18 NULLIF(CDECIMAL18,CCHAR4) +1 -9999999999999 -9999999999999 +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CDATE) from datatypetestm order by cidx; +cidx CDECIMAL18 NULLIF(CDECIMAL18,CDATE) +1 -9999999999999 -9999999999999 +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,NULL) from datatypetestm order by cidx; +cidx CDECIMAL18 NULLIF(CDECIMAL18,NULL) +1 -9999999999999 -9999999999999 +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,'HELLO WORLD') from datatypetestm order by cidx; +cidx CDECIMAL18 NULLIF(CDECIMAL18,'HELLO WORLD') +1 -9999999999999 -9999999999999 +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CBIGINT) from datatypetestm order by cidx; +cidx CDECIMAL18_2 NULLIF(CDECIMAL18_2,CBIGINT) +1 -99999999999.99 -99999999999.99 +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CINTEGER) from datatypetestm order by cidx; +cidx CDECIMAL18_2 NULLIF(CDECIMAL18_2,CINTEGER) +1 -99999999999.99 -99999999999.99 +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CDOUBLE) from datatypetestm order by cidx; +cidx CDECIMAL18_2 NULLIF(CDECIMAL18_2,CDOUBLE) +1 -99999999999.99 -99999999999.99 +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CDECIMAL18_2 NULLIF(CDECIMAL18_2,CDECIMAL9_2) +1 -99999999999.99 -99999999999.99 +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,1) from datatypetestm order by cidx; +cidx CDECIMAL18_2 NULLIF(CDECIMAL18_2,1) +1 -99999999999.99 -99999999999.99 +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,3.14) from datatypetestm order by cidx; +cidx CDECIMAL18_2 NULLIF(CDECIMAL18_2,3.14) +1 -99999999999.99 -99999999999.99 +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CCHAR4) from datatypetestm order by cidx; +cidx CDECIMAL18_2 NULLIF(CDECIMAL18_2,CCHAR4) +1 -99999999999.99 -99999999999.99 +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CDATE) from datatypetestm order by cidx; +cidx CDECIMAL18_2 NULLIF(CDECIMAL18_2,CDATE) +1 -99999999999.99 -99999999999.99 +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,NULL) from datatypetestm order by cidx; +cidx CDECIMAL18_2 NULLIF(CDECIMAL18_2,NULL) +1 -99999999999.99 -99999999999.99 +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,'HELLO WORLD') from datatypetestm order by cidx; +cidx CDECIMAL18_2 NULLIF(CDECIMAL18_2,'HELLO WORLD') +1 -99999999999.99 -99999999999.99 +select cidx, CINTEGER, NULLIF(CINTEGER,CBIGINT) from datatypetestm order by cidx; +cidx CINTEGER NULLIF(CINTEGER,CBIGINT) +1 -7483646 -7483646 +select cidx, CINTEGER, NULLIF(CINTEGER,CINTEGER) from datatypetestm order by cidx; +cidx CINTEGER NULLIF(CINTEGER,CINTEGER) +1 -7483646 NULL +select cidx, CINTEGER, NULLIF(CINTEGER,CDOUBLE) from datatypetestm order by cidx; +cidx CINTEGER NULLIF(CINTEGER,CDOUBLE) +1 -7483646 -7483646 +select cidx, CINTEGER, NULLIF(CINTEGER,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CINTEGER NULLIF(CINTEGER,CDECIMAL9_2) +1 -7483646 -7483646 +select cidx, CINTEGER, NULLIF(CINTEGER,1) from datatypetestm order by cidx; +cidx CINTEGER NULLIF(CINTEGER,1) +1 -7483646 -7483646 +select cidx, CINTEGER, NULLIF(CINTEGER,3.14) from datatypetestm order by cidx; +cidx CINTEGER NULLIF(CINTEGER,3.14) +1 -7483646 -7483646 +select cidx, CINTEGER, NULLIF(CINTEGER,CCHAR4) from datatypetestm order by cidx; +cidx CINTEGER NULLIF(CINTEGER,CCHAR4) +1 -7483646 -7483646 +select cidx, CINTEGER, NULLIF(CINTEGER,CDATE) from datatypetestm order by cidx; +cidx CINTEGER NULLIF(CINTEGER,CDATE) +1 -7483646 -7483646 +select cidx, CINTEGER, NULLIF(CINTEGER,NULL) from datatypetestm order by cidx; +cidx CINTEGER NULLIF(CINTEGER,NULL) +1 -7483646 -7483646 +select cidx, CINTEGER, NULLIF(CINTEGER,'HELLO WORLD') from datatypetestm order by cidx; +cidx CINTEGER NULLIF(CINTEGER,'HELLO WORLD') +1 -7483646 -7483646 +select cidx, CSMALLINT, NULLIF(CSMALLINT,CBIGINT) from datatypetestm order by cidx; +cidx CSMALLINT NULLIF(CSMALLINT,CBIGINT) +1 -766 -766 +select cidx, CSMALLINT, NULLIF(CSMALLINT,CINTEGER) from datatypetestm order by cidx; +cidx CSMALLINT NULLIF(CSMALLINT,CINTEGER) +1 -766 -766 +select cidx, CSMALLINT, NULLIF(CSMALLINT,CDOUBLE) from datatypetestm order by cidx; +cidx CSMALLINT NULLIF(CSMALLINT,CDOUBLE) +1 -766 -766 +select cidx, CSMALLINT, NULLIF(CSMALLINT,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CSMALLINT NULLIF(CSMALLINT,CDECIMAL9_2) +1 -766 -766 +select cidx, CSMALLINT, NULLIF(CSMALLINT,1) from datatypetestm order by cidx; +cidx CSMALLINT NULLIF(CSMALLINT,1) +1 -766 -766 +select cidx, CSMALLINT, NULLIF(CSMALLINT,3.14) from datatypetestm order by cidx; +cidx CSMALLINT NULLIF(CSMALLINT,3.14) +1 -766 -766 +select cidx, CSMALLINT, NULLIF(CSMALLINT,CCHAR4) from datatypetestm order by cidx; +cidx CSMALLINT NULLIF(CSMALLINT,CCHAR4) +1 -766 -766 +select cidx, CSMALLINT, NULLIF(CSMALLINT,CDATE) from datatypetestm order by cidx; +cidx CSMALLINT NULLIF(CSMALLINT,CDATE) +1 -766 -766 +select cidx, CSMALLINT, NULLIF(CSMALLINT,NULL) from datatypetestm order by cidx; +cidx CSMALLINT NULLIF(CSMALLINT,NULL) +1 -766 -766 +select cidx, CSMALLINT, NULLIF(CSMALLINT,'HELLO WORLD') from datatypetestm order by cidx; +cidx CSMALLINT NULLIF(CSMALLINT,'HELLO WORLD') +1 -766 -766 +select cidx, CTINYINT, NULLIF(CTINYINT,CBIGINT) from datatypetestm order by cidx; +cidx CTINYINT NULLIF(CTINYINT,CBIGINT) +1 -26 -26 +select cidx, CTINYINT, NULLIF(CTINYINT,CINTEGER) from datatypetestm order by cidx; +cidx CTINYINT NULLIF(CTINYINT,CINTEGER) +1 -26 -26 +select cidx, CTINYINT, NULLIF(CTINYINT,CDOUBLE) from datatypetestm order by cidx; +cidx CTINYINT NULLIF(CTINYINT,CDOUBLE) +1 -26 -26 +select cidx, CTINYINT, NULLIF(CTINYINT,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CTINYINT NULLIF(CTINYINT,CDECIMAL9_2) +1 -26 -26 +select cidx, CTINYINT, NULLIF(CTINYINT,1) from datatypetestm order by cidx; +cidx CTINYINT NULLIF(CTINYINT,1) +1 -26 -26 +select cidx, CTINYINT, NULLIF(CTINYINT,3.14) from datatypetestm order by cidx; +cidx CTINYINT NULLIF(CTINYINT,3.14) +1 -26 -26 +select cidx, CTINYINT, NULLIF(CTINYINT,CCHAR4) from datatypetestm order by cidx; +cidx CTINYINT NULLIF(CTINYINT,CCHAR4) +1 -26 -26 +select cidx, CTINYINT, NULLIF(CTINYINT,CDATE) from datatypetestm order by cidx; +cidx CTINYINT NULLIF(CTINYINT,CDATE) +1 -26 -26 +select cidx, CTINYINT, NULLIF(CTINYINT,NULL) from datatypetestm order by cidx; +cidx CTINYINT NULLIF(CTINYINT,NULL) +1 -26 -26 +select cidx, CTINYINT, NULLIF(CTINYINT,'HELLO WORLD') from datatypetestm order by cidx; +cidx CTINYINT NULLIF(CTINYINT,'HELLO WORLD') +1 -26 -26 +select cidx, CDOUBLE, NULLIF(CDOUBLE,CBIGINT) from datatypetestm order by cidx; +cidx CDOUBLE NULLIF(CDOUBLE,CBIGINT) +1 -1.797693231e108 -1.797693231e108 +select cidx, CDOUBLE, NULLIF(CDOUBLE,CINTEGER) from datatypetestm order by cidx; +cidx CDOUBLE NULLIF(CDOUBLE,CINTEGER) +1 -1.797693231e108 -1.797693231e108 +select cidx, CDOUBLE, NULLIF(CDOUBLE,CDOUBLE) from datatypetestm order by cidx; +cidx CDOUBLE NULLIF(CDOUBLE,CDOUBLE) +1 -1.797693231e108 NULL +select cidx, CDOUBLE, NULLIF(CDOUBLE,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CDOUBLE NULLIF(CDOUBLE,CDECIMAL9_2) +1 -1.797693231e108 -1.797693231e108 +select cidx, CDOUBLE, NULLIF(CDOUBLE,1) from datatypetestm order by cidx; +cidx CDOUBLE NULLIF(CDOUBLE,1) +1 -1.797693231e108 -1.797693231e108 +select cidx, CDOUBLE, NULLIF(CDOUBLE,3.14) from datatypetestm order by cidx; +cidx CDOUBLE NULLIF(CDOUBLE,3.14) +1 -1.797693231e108 -1.797693231e108 +select cidx, CDOUBLE, NULLIF(CDOUBLE,CCHAR4) from datatypetestm order by cidx; +cidx CDOUBLE NULLIF(CDOUBLE,CCHAR4) +1 -1.797693231e108 -1.797693231e108 +select cidx, CDOUBLE, NULLIF(CDOUBLE,CDATE) from datatypetestm order by cidx; +cidx CDOUBLE NULLIF(CDOUBLE,CDATE) +1 -1.797693231e108 -1.797693231e108 +select cidx, CDOUBLE, NULLIF(CDOUBLE,NULL) from datatypetestm order by cidx; +cidx CDOUBLE NULLIF(CDOUBLE,NULL) +1 -1.797693231e108 -1.797693231e108 +select cidx, CDOUBLE, NULLIF(CDOUBLE,'HELLO WORLD') from datatypetestm order by cidx; +cidx CDOUBLE NULLIF(CDOUBLE,'HELLO WORLD') +1 -1.797693231e108 -1.797693231e108 +select cidx, CFLOAT, NULLIF(CFLOAT,CBIGINT) from datatypetestm order by cidx; +cidx CFLOAT NULLIF(CFLOAT,CBIGINT) +1 -3.40287e18 -3.40287e18 +select cidx, CFLOAT, NULLIF(CFLOAT,CINTEGER) from datatypetestm order by cidx; +cidx CFLOAT NULLIF(CFLOAT,CINTEGER) +1 -3.40287e18 -3.40287e18 +select cidx, CFLOAT, NULLIF(CFLOAT,CDOUBLE) from datatypetestm order by cidx; +cidx CFLOAT NULLIF(CFLOAT,CDOUBLE) +1 -3.40287e18 -3.40287e18 +select cidx, CFLOAT, NULLIF(CFLOAT,CDECIMAL9_2) from datatypetestm order by cidx; +cidx CFLOAT NULLIF(CFLOAT,CDECIMAL9_2) +1 -3.40287e18 -3.40287e18 +select cidx, CFLOAT, NULLIF(CFLOAT,1) from datatypetestm order by cidx; +cidx CFLOAT NULLIF(CFLOAT,1) +1 -3.40287e18 -3.40287e18 +select cidx, CFLOAT, NULLIF(CFLOAT,3.14) from datatypetestm order by cidx; +cidx CFLOAT NULLIF(CFLOAT,3.14) +1 -3.40287e18 -3.40287e18 +select cidx, CFLOAT, NULLIF(CFLOAT,CCHAR4) from datatypetestm order by cidx; +cidx CFLOAT NULLIF(CFLOAT,CCHAR4) +1 -3.40287e18 -3.40287e18 +select cidx, CFLOAT, NULLIF(CFLOAT,CDATE) from datatypetestm order by cidx; +cidx CFLOAT NULLIF(CFLOAT,CDATE) +1 -3.40287e18 -3.40287e18 +select cidx, CFLOAT, NULLIF(CFLOAT,NULL) from datatypetestm order by cidx; +cidx CFLOAT NULLIF(CFLOAT,NULL) +1 -3.40287e18 -3.40287e18 +select cidx, CFLOAT, NULLIF(CFLOAT,'HELLO WORLD') from datatypetestm order by cidx; +cidx CFLOAT NULLIF(CFLOAT,'HELLO WORLD') +1 -3.40287e18 -3.40287e18 +select cidx, CBIGINT from datatypetestm order by NULLIF(CBIGINT,CBIGINT), cidx; +cidx CBIGINT +1 -72036854775806 +select cidx, CBIGINT from datatypetestm order by NULLIF(CBIGINT,CINTEGER), cidx; +cidx CBIGINT +1 -72036854775806 +select cidx, CBIGINT from datatypetestm order by NULLIF(CBIGINT,CDOUBLE), cidx; +cidx CBIGINT +1 -72036854775806 +select cidx, CBIGINT from datatypetestm order by NULLIF(CBIGINT,CDECIMAL9_2), cidx; +cidx CBIGINT +1 -72036854775806 +select cidx, CBIGINT from datatypetestm order by NULLIF(CBIGINT,1), cidx; +cidx CBIGINT +1 -72036854775806 +select cidx, CBIGINT from datatypetestm order by NULLIF(CBIGINT,3.14), cidx; +cidx CBIGINT +1 -72036854775806 +select cidx, CBIGINT from datatypetestm order by NULLIF(CBIGINT,CCHAR4), cidx; +cidx CBIGINT +1 -72036854775806 +select cidx, CBIGINT from datatypetestm order by NULLIF(CBIGINT,CDATE), cidx; +cidx CBIGINT +1 -72036854775806 +select cidx, CBIGINT from datatypetestm order by NULLIF(CBIGINT,NULL), cidx; +cidx CBIGINT +1 -72036854775806 +select cidx, CBIGINT from datatypetestm order by NULLIF(CBIGINT,'HELLO WORLD'), cidx; +cidx CBIGINT +1 -72036854775806 +select cidx, CDECIMAL1 from datatypetestm order by NULLIF(CDECIMAL1,CBIGINT), cidx; +cidx CDECIMAL1 +1 -9 +select cidx, CDECIMAL1 from datatypetestm order by NULLIF(CDECIMAL1,CINTEGER), cidx; +cidx CDECIMAL1 +1 -9 +select cidx, CDECIMAL1 from datatypetestm order by NULLIF(CDECIMAL1,CDOUBLE), cidx; +cidx CDECIMAL1 +1 -9 +select cidx, CDECIMAL1 from datatypetestm order by NULLIF(CDECIMAL1,CDECIMAL9_2), cidx; +cidx CDECIMAL1 +1 -9 +select cidx, CDECIMAL1 from datatypetestm order by NULLIF(CDECIMAL1,1), cidx; +cidx CDECIMAL1 +1 -9 +select cidx, CDECIMAL1 from datatypetestm order by NULLIF(CDECIMAL1,3.14), cidx; +cidx CDECIMAL1 +1 -9 +select cidx, CDECIMAL1 from datatypetestm order by NULLIF(CDECIMAL1,CCHAR4), cidx; +cidx CDECIMAL1 +1 -9 +select cidx, CDECIMAL1 from datatypetestm order by NULLIF(CDECIMAL1,CDATE), cidx; +cidx CDECIMAL1 +1 -9 +select cidx, CDECIMAL1 from datatypetestm order by NULLIF(CDECIMAL1,NULL), cidx; +cidx CDECIMAL1 +1 -9 +select cidx, CDECIMAL1 from datatypetestm order by NULLIF(CDECIMAL1,'HELLO WORLD'), cidx; +cidx CDECIMAL1 +1 -9 +select cidx, CDECIMAL4 from datatypetestm order by NULLIF(CDECIMAL4,CBIGINT), cidx; +cidx CDECIMAL4 +1 -999 +select cidx, CDECIMAL4 from datatypetestm order by NULLIF(CDECIMAL4,CINTEGER), cidx; +cidx CDECIMAL4 +1 -999 +select cidx, CDECIMAL4 from datatypetestm order by NULLIF(CDECIMAL4,CDOUBLE), cidx; +cidx CDECIMAL4 +1 -999 +select cidx, CDECIMAL4 from datatypetestm order by NULLIF(CDECIMAL4,CDECIMAL9_2), cidx; +cidx CDECIMAL4 +1 -999 +select cidx, CDECIMAL4 from datatypetestm order by NULLIF(CDECIMAL4,1), cidx; +cidx CDECIMAL4 +1 -999 +select cidx, CDECIMAL4 from datatypetestm order by NULLIF(CDECIMAL4,3.14), cidx; +cidx CDECIMAL4 +1 -999 +select cidx, CDECIMAL4 from datatypetestm order by NULLIF(CDECIMAL4,CCHAR4), cidx; +cidx CDECIMAL4 +1 -999 +select cidx, CDECIMAL4 from datatypetestm order by NULLIF(CDECIMAL4,CDATE), cidx; +cidx CDECIMAL4 +1 -999 +select cidx, CDECIMAL4 from datatypetestm order by NULLIF(CDECIMAL4,NULL), cidx; +cidx CDECIMAL4 +1 -999 +select cidx, CDECIMAL4 from datatypetestm order by NULLIF(CDECIMAL4,'HELLO WORLD'), cidx; +cidx CDECIMAL4 +1 -999 +select cidx, CDECIMAL4_2 from datatypetestm order by NULLIF(CDECIMAL4_2,CBIGINT), cidx; +cidx CDECIMAL4_2 +1 -9.99 +select cidx, CDECIMAL4_2 from datatypetestm order by NULLIF(CDECIMAL4_2,CINTEGER), cidx; +cidx CDECIMAL4_2 +1 -9.99 +select cidx, CDECIMAL4_2 from datatypetestm order by NULLIF(CDECIMAL4_2,CDOUBLE), cidx; +cidx CDECIMAL4_2 +1 -9.99 +select cidx, CDECIMAL4_2 from datatypetestm order by NULLIF(CDECIMAL4_2,CDECIMAL9_2), cidx; +cidx CDECIMAL4_2 +1 -9.99 +select cidx, CDECIMAL4_2 from datatypetestm order by NULLIF(CDECIMAL4_2,1), cidx; +cidx CDECIMAL4_2 +1 -9.99 +select cidx, CDECIMAL4_2 from datatypetestm order by NULLIF(CDECIMAL4_2,3.14), cidx; +cidx CDECIMAL4_2 +1 -9.99 +select cidx, CDECIMAL4_2 from datatypetestm order by NULLIF(CDECIMAL4_2,CCHAR4), cidx; +cidx CDECIMAL4_2 +1 -9.99 +select cidx, CDECIMAL4_2 from datatypetestm order by NULLIF(CDECIMAL4_2,CDATE), cidx; +cidx CDECIMAL4_2 +1 -9.99 +select cidx, CDECIMAL4_2 from datatypetestm order by NULLIF(CDECIMAL4_2,NULL), cidx; +cidx CDECIMAL4_2 +1 -9.99 +select cidx, CDECIMAL4_2 from datatypetestm order by NULLIF(CDECIMAL4_2,'HELLO WORLD'), cidx; +cidx CDECIMAL4_2 +1 -9.99 +select cidx, CDECIMAL5 from datatypetestm order by NULLIF(CDECIMAL5,CBIGINT), cidx; +cidx CDECIMAL5 +1 -999 +select cidx, CDECIMAL5 from datatypetestm order by NULLIF(CDECIMAL5,CINTEGER), cidx; +cidx CDECIMAL5 +1 -999 +select cidx, CDECIMAL5 from datatypetestm order by NULLIF(CDECIMAL5,CDOUBLE), cidx; +cidx CDECIMAL5 +1 -999 +select cidx, CDECIMAL5 from datatypetestm order by NULLIF(CDECIMAL5,CDECIMAL9_2), cidx; +cidx CDECIMAL5 +1 -999 +select cidx, CDECIMAL5 from datatypetestm order by NULLIF(CDECIMAL5,1), cidx; +cidx CDECIMAL5 +1 -999 +select cidx, CDECIMAL5 from datatypetestm order by NULLIF(CDECIMAL5,3.14), cidx; +cidx CDECIMAL5 +1 -999 +select cidx, CDECIMAL5 from datatypetestm order by NULLIF(CDECIMAL5,CCHAR4), cidx; +cidx CDECIMAL5 +1 -999 +select cidx, CDECIMAL5 from datatypetestm order by NULLIF(CDECIMAL5,CDATE), cidx; +cidx CDECIMAL5 +1 -999 +select cidx, CDECIMAL5 from datatypetestm order by NULLIF(CDECIMAL5,NULL), cidx; +cidx CDECIMAL5 +1 -999 +select cidx, CDECIMAL5 from datatypetestm order by NULLIF(CDECIMAL5,'HELLO WORLD'), cidx; +cidx CDECIMAL5 +1 -999 +select cidx, CDECIMAL9 from datatypetestm order by NULLIF(CDECIMAL9,CBIGINT), cidx; +cidx CDECIMAL9 +1 -999999 +select cidx, CDECIMAL9 from datatypetestm order by NULLIF(CDECIMAL9,CINTEGER), cidx; +cidx CDECIMAL9 +1 -999999 +select cidx, CDECIMAL9 from datatypetestm order by NULLIF(CDECIMAL9,CDOUBLE), cidx; +cidx CDECIMAL9 +1 -999999 +select cidx, CDECIMAL9 from datatypetestm order by NULLIF(CDECIMAL9,CDECIMAL9_2), cidx; +cidx CDECIMAL9 +1 -999999 +select cidx, CDECIMAL9 from datatypetestm order by NULLIF(CDECIMAL9,1), cidx; +cidx CDECIMAL9 +1 -999999 +select cidx, CDECIMAL9 from datatypetestm order by NULLIF(CDECIMAL9,3.14), cidx; +cidx CDECIMAL9 +1 -999999 +select cidx, CDECIMAL9 from datatypetestm order by NULLIF(CDECIMAL9,CCHAR4), cidx; +cidx CDECIMAL9 +1 -999999 +select cidx, CDECIMAL9 from datatypetestm order by NULLIF(CDECIMAL9,CDATE), cidx; +cidx CDECIMAL9 +1 -999999 +select cidx, CDECIMAL9 from datatypetestm order by NULLIF(CDECIMAL9,NULL), cidx; +cidx CDECIMAL9 +1 -999999 +select cidx, CDECIMAL9 from datatypetestm order by NULLIF(CDECIMAL9,'HELLO WORLD'), cidx; +cidx CDECIMAL9 +1 -999999 +select cidx, CDECIMAL9_2 from datatypetestm order by NULLIF(CDECIMAL9_2,CBIGINT), cidx; +cidx CDECIMAL9_2 +1 -9999.99 +select cidx, CDECIMAL9_2 from datatypetestm order by NULLIF(CDECIMAL9_2,CINTEGER), cidx; +cidx CDECIMAL9_2 +1 -9999.99 +select cidx, CDECIMAL9_2 from datatypetestm order by NULLIF(CDECIMAL9_2,CDOUBLE), cidx; +cidx CDECIMAL9_2 +1 -9999.99 +select cidx, CDECIMAL9_2 from datatypetestm order by NULLIF(CDECIMAL9_2,CDECIMAL9_2), cidx; +cidx CDECIMAL9_2 +1 -9999.99 +select cidx, CDECIMAL9_2 from datatypetestm order by NULLIF(CDECIMAL9_2,1), cidx; +cidx CDECIMAL9_2 +1 -9999.99 +select cidx, CDECIMAL9_2 from datatypetestm order by NULLIF(CDECIMAL9_2,3.14), cidx; +cidx CDECIMAL9_2 +1 -9999.99 +select cidx, CDECIMAL9_2 from datatypetestm order by NULLIF(CDECIMAL9_2,CCHAR4), cidx; +cidx CDECIMAL9_2 +1 -9999.99 +select cidx, CDECIMAL9_2 from datatypetestm order by NULLIF(CDECIMAL9_2,CDATE), cidx; +cidx CDECIMAL9_2 +1 -9999.99 +select cidx, CDECIMAL9_2 from datatypetestm order by NULLIF(CDECIMAL9_2,NULL), cidx; +cidx CDECIMAL9_2 +1 -9999.99 +select cidx, CDECIMAL9_2 from datatypetestm order by NULLIF(CDECIMAL9_2,'HELLO WORLD'), cidx; +cidx CDECIMAL9_2 +1 -9999.99 +select cidx, CDECIMAL10 from datatypetestm order by NULLIF(CDECIMAL10,CBIGINT), cidx; +cidx CDECIMAL10 +1 -9999999 +select cidx, CDECIMAL10 from datatypetestm order by NULLIF(CDECIMAL10,CINTEGER), cidx; +cidx CDECIMAL10 +1 -9999999 +select cidx, CDECIMAL10 from datatypetestm order by NULLIF(CDECIMAL10,CDOUBLE), cidx; +cidx CDECIMAL10 +1 -9999999 +select cidx, CDECIMAL10 from datatypetestm order by NULLIF(CDECIMAL10,CDECIMAL9_2), cidx; +cidx CDECIMAL10 +1 -9999999 +select cidx, CDECIMAL10 from datatypetestm order by NULLIF(CDECIMAL10,1), cidx; +cidx CDECIMAL10 +1 -9999999 +select cidx, CDECIMAL10 from datatypetestm order by NULLIF(CDECIMAL10,3.14), cidx; +cidx CDECIMAL10 +1 -9999999 +select cidx, CDECIMAL10 from datatypetestm order by NULLIF(CDECIMAL10,CCHAR4), cidx; +cidx CDECIMAL10 +1 -9999999 +select cidx, CDECIMAL10 from datatypetestm order by NULLIF(CDECIMAL10,CDATE), cidx; +cidx CDECIMAL10 +1 -9999999 +select cidx, CDECIMAL10 from datatypetestm order by NULLIF(CDECIMAL10,NULL), cidx; +cidx CDECIMAL10 +1 -9999999 +select cidx, CDECIMAL10 from datatypetestm order by NULLIF(CDECIMAL10,'HELLO WORLD'), cidx; +cidx CDECIMAL10 +1 -9999999 +select cidx, CDECIMAL18 from datatypetestm order by NULLIF(CDECIMAL18,CBIGINT), cidx; +cidx CDECIMAL18 +1 -9999999999999 +select cidx, CDECIMAL18 from datatypetestm order by NULLIF(CDECIMAL18,CINTEGER), cidx; +cidx CDECIMAL18 +1 -9999999999999 +select cidx, CDECIMAL18 from datatypetestm order by NULLIF(CDECIMAL18,CDOUBLE), cidx; +cidx CDECIMAL18 +1 -9999999999999 +select cidx, CDECIMAL18 from datatypetestm order by NULLIF(CDECIMAL18,CDECIMAL9_2), cidx; +cidx CDECIMAL18 +1 -9999999999999 +select cidx, CDECIMAL18 from datatypetestm order by NULLIF(CDECIMAL18,1), cidx; +cidx CDECIMAL18 +1 -9999999999999 +select cidx, CDECIMAL18 from datatypetestm order by NULLIF(CDECIMAL18,3.14), cidx; +cidx CDECIMAL18 +1 -9999999999999 +select cidx, CDECIMAL18 from datatypetestm order by NULLIF(CDECIMAL18,CCHAR4), cidx; +cidx CDECIMAL18 +1 -9999999999999 +select cidx, CDECIMAL18 from datatypetestm order by NULLIF(CDECIMAL18,CDATE), cidx; +cidx CDECIMAL18 +1 -9999999999999 +select cidx, CDECIMAL18 from datatypetestm order by NULLIF(CDECIMAL18,NULL), cidx; +cidx CDECIMAL18 +1 -9999999999999 +select cidx, CDECIMAL18 from datatypetestm order by NULLIF(CDECIMAL18,'HELLO WORLD'), cidx; +cidx CDECIMAL18 +1 -9999999999999 +select cidx, CDECIMAL18_2 from datatypetestm order by NULLIF(CDECIMAL18_2,CBIGINT), cidx; +cidx CDECIMAL18_2 +1 -99999999999.99 +select cidx, CDECIMAL18_2 from datatypetestm order by NULLIF(CDECIMAL18_2,CINTEGER), cidx; +cidx CDECIMAL18_2 +1 -99999999999.99 +select cidx, CDECIMAL18_2 from datatypetestm order by NULLIF(CDECIMAL18_2,CDOUBLE), cidx; +cidx CDECIMAL18_2 +1 -99999999999.99 +select cidx, CDECIMAL18_2 from datatypetestm order by NULLIF(CDECIMAL18_2,CDECIMAL9_2), cidx; +cidx CDECIMAL18_2 +1 -99999999999.99 +select cidx, CDECIMAL18_2 from datatypetestm order by NULLIF(CDECIMAL18_2,1), cidx; +cidx CDECIMAL18_2 +1 -99999999999.99 +select cidx, CDECIMAL18_2 from datatypetestm order by NULLIF(CDECIMAL18_2,3.14), cidx; +cidx CDECIMAL18_2 +1 -99999999999.99 +select cidx, CDECIMAL18_2 from datatypetestm order by NULLIF(CDECIMAL18_2,CCHAR4), cidx; +cidx CDECIMAL18_2 +1 -99999999999.99 +select cidx, CDECIMAL18_2 from datatypetestm order by NULLIF(CDECIMAL18_2,CDATE), cidx; +cidx CDECIMAL18_2 +1 -99999999999.99 +select cidx, CDECIMAL18_2 from datatypetestm order by NULLIF(CDECIMAL18_2,NULL), cidx; +cidx CDECIMAL18_2 +1 -99999999999.99 +select cidx, CDECIMAL18_2 from datatypetestm order by NULLIF(CDECIMAL18_2,'HELLO WORLD'), cidx; +cidx CDECIMAL18_2 +1 -99999999999.99 +select cidx, CINTEGER from datatypetestm order by NULLIF(CINTEGER,CBIGINT), cidx; +cidx CINTEGER +1 -7483646 +select cidx, CINTEGER from datatypetestm order by NULLIF(CINTEGER,CINTEGER), cidx; +cidx CINTEGER +1 -7483646 +select cidx, CINTEGER from datatypetestm order by NULLIF(CINTEGER,CDOUBLE), cidx; +cidx CINTEGER +1 -7483646 +select cidx, CINTEGER from datatypetestm order by NULLIF(CINTEGER,CDECIMAL9_2), cidx; +cidx CINTEGER +1 -7483646 +select cidx, CINTEGER from datatypetestm order by NULLIF(CINTEGER,1), cidx; +cidx CINTEGER +1 -7483646 +select cidx, CINTEGER from datatypetestm order by NULLIF(CINTEGER,3.14), cidx; +cidx CINTEGER +1 -7483646 +select cidx, CINTEGER from datatypetestm order by NULLIF(CINTEGER,CCHAR4), cidx; +cidx CINTEGER +1 -7483646 +select cidx, CINTEGER from datatypetestm order by NULLIF(CINTEGER,CDATE), cidx; +cidx CINTEGER +1 -7483646 +select cidx, CINTEGER from datatypetestm order by NULLIF(CINTEGER,NULL), cidx; +cidx CINTEGER +1 -7483646 +select cidx, CINTEGER from datatypetestm order by NULLIF(CINTEGER,'HELLO WORLD'), cidx; +cidx CINTEGER +1 -7483646 +select cidx, CSMALLINT from datatypetestm order by NULLIF(CSMALLINT,CBIGINT), cidx; +cidx CSMALLINT +1 -766 +select cidx, CSMALLINT from datatypetestm order by NULLIF(CSMALLINT,CINTEGER), cidx; +cidx CSMALLINT +1 -766 +select cidx, CSMALLINT from datatypetestm order by NULLIF(CSMALLINT,CDOUBLE), cidx; +cidx CSMALLINT +1 -766 +select cidx, CSMALLINT from datatypetestm order by NULLIF(CSMALLINT,CDECIMAL9_2), cidx; +cidx CSMALLINT +1 -766 +select cidx, CSMALLINT from datatypetestm order by NULLIF(CSMALLINT,1), cidx; +cidx CSMALLINT +1 -766 +select cidx, CSMALLINT from datatypetestm order by NULLIF(CSMALLINT,3.14), cidx; +cidx CSMALLINT +1 -766 +select cidx, CSMALLINT from datatypetestm order by NULLIF(CSMALLINT,CCHAR4), cidx; +cidx CSMALLINT +1 -766 +select cidx, CSMALLINT from datatypetestm order by NULLIF(CSMALLINT,CDATE), cidx; +cidx CSMALLINT +1 -766 +select cidx, CSMALLINT from datatypetestm order by NULLIF(CSMALLINT,NULL), cidx; +cidx CSMALLINT +1 -766 +select cidx, CSMALLINT from datatypetestm order by NULLIF(CSMALLINT,'HELLO WORLD'), cidx; +cidx CSMALLINT +1 -766 +select cidx, CTINYINT from datatypetestm order by NULLIF(CTINYINT,CBIGINT), cidx; +cidx CTINYINT +1 -26 +select cidx, CTINYINT from datatypetestm order by NULLIF(CTINYINT,CINTEGER), cidx; +cidx CTINYINT +1 -26 +select cidx, CTINYINT from datatypetestm order by NULLIF(CTINYINT,CDOUBLE), cidx; +cidx CTINYINT +1 -26 +select cidx, CTINYINT from datatypetestm order by NULLIF(CTINYINT,CDECIMAL9_2), cidx; +cidx CTINYINT +1 -26 +select cidx, CTINYINT from datatypetestm order by NULLIF(CTINYINT,1), cidx; +cidx CTINYINT +1 -26 +select cidx, CTINYINT from datatypetestm order by NULLIF(CTINYINT,3.14), cidx; +cidx CTINYINT +1 -26 +select cidx, CTINYINT from datatypetestm order by NULLIF(CTINYINT,CCHAR4), cidx; +cidx CTINYINT +1 -26 +select cidx, CTINYINT from datatypetestm order by NULLIF(CTINYINT,CDATE), cidx; +cidx CTINYINT +1 -26 +select cidx, CTINYINT from datatypetestm order by NULLIF(CTINYINT,NULL), cidx; +cidx CTINYINT +1 -26 +select cidx, CTINYINT from datatypetestm order by NULLIF(CTINYINT,'HELLO WORLD'), cidx; +cidx CTINYINT +1 -26 +select cidx, CDOUBLE from datatypetestm order by NULLIF(CDOUBLE,CBIGINT), cidx; +cidx CDOUBLE +1 -1.797693231e108 +select cidx, CDOUBLE from datatypetestm order by NULLIF(CDOUBLE,CINTEGER), cidx; +cidx CDOUBLE +1 -1.797693231e108 +select cidx, CDOUBLE from datatypetestm order by NULLIF(CDOUBLE,CDOUBLE), cidx; +cidx CDOUBLE +1 -1.797693231e108 +select cidx, CDOUBLE from datatypetestm order by NULLIF(CDOUBLE,CDECIMAL9_2), cidx; +cidx CDOUBLE +1 -1.797693231e108 +select cidx, CDOUBLE from datatypetestm order by NULLIF(CDOUBLE,1), cidx; +cidx CDOUBLE +1 -1.797693231e108 +select cidx, CDOUBLE from datatypetestm order by NULLIF(CDOUBLE,3.14), cidx; +cidx CDOUBLE +1 -1.797693231e108 +select cidx, CDOUBLE from datatypetestm order by NULLIF(CDOUBLE,CCHAR4), cidx; +cidx CDOUBLE +1 -1.797693231e108 +select cidx, CDOUBLE from datatypetestm order by NULLIF(CDOUBLE,CDATE), cidx; +cidx CDOUBLE +1 -1.797693231e108 +select cidx, CDOUBLE from datatypetestm order by NULLIF(CDOUBLE,NULL), cidx; +cidx CDOUBLE +1 -1.797693231e108 +select cidx, CDOUBLE from datatypetestm order by NULLIF(CDOUBLE,'HELLO WORLD'), cidx; +cidx CDOUBLE +1 -1.797693231e108 +select cidx, CFLOAT from datatypetestm order by NULLIF(CFLOAT,CBIGINT), cidx; +cidx CFLOAT +1 -3.40287e18 +select cidx, CFLOAT from datatypetestm order by NULLIF(CFLOAT,CINTEGER), cidx; +cidx CFLOAT +1 -3.40287e18 +select cidx, CFLOAT from datatypetestm order by NULLIF(CFLOAT,CDOUBLE), cidx; +cidx CFLOAT +1 -3.40287e18 +select cidx, CFLOAT from datatypetestm order by NULLIF(CFLOAT,CDECIMAL9_2), cidx; +cidx CFLOAT +1 -3.40287e18 +select cidx, CFLOAT from datatypetestm order by NULLIF(CFLOAT,1), cidx; +cidx CFLOAT +1 -3.40287e18 +select cidx, CFLOAT from datatypetestm order by NULLIF(CFLOAT,3.14), cidx; +cidx CFLOAT +1 -3.40287e18 +select cidx, CFLOAT from datatypetestm order by NULLIF(CFLOAT,CCHAR4), cidx; +cidx CFLOAT +1 -3.40287e18 +select cidx, CFLOAT from datatypetestm order by NULLIF(CFLOAT,CDATE), cidx; +cidx CFLOAT +1 -3.40287e18 +select cidx, CFLOAT from datatypetestm order by NULLIF(CFLOAT,NULL), cidx; +cidx CFLOAT +1 -3.40287e18 +select cidx, CFLOAT from datatypetestm order by NULLIF(CFLOAT,'HELLO WORLD'), cidx; +cidx CFLOAT +1 -3.40287e18 diff --git a/mysql-test/columnstore/autopilot/r/mcs4445_function_CNXPP_TIME_TO_SEC_DS_maxscale.result b/mysql-test/columnstore/autopilot/r/mcs4445_function_CNXPP_TIME_TO_SEC_DS_maxscale.result new file mode 100644 index 000000000..8c62e52a6 --- /dev/null +++ b/mysql-test/columnstore/autopilot/r/mcs4445_function_CNXPP_TIME_TO_SEC_DS_maxscale.result @@ -0,0 +1,28 @@ +USE autopilot; +select cidx, CDATE, TIME_TO_SEC(CDATE) from datatypetestm order by cidx; +cidx CDATE TIME_TO_SEC(CDATE) +1 1997-01-01 0 +select cidx, CDATETIME, TIME_TO_SEC(CDATETIME) from datatypetestm order by cidx; +cidx CDATETIME TIME_TO_SEC(CDATETIME) +1 1997-01-01 00:00:00 0 +select cidx, CTIME, TIME_TO_SEC(CTIME) from datatypetestm order by cidx; +cidx CTIME TIME_TO_SEC(CTIME) +1 13:00:00 46800 +select cidx, TIME_TO_SEC('22:23:00') from datatypetestm order by cidx; +cidx TIME_TO_SEC('22:23:00') +1 80580 +select cidx, TIME_TO_SEC('00:39:38') from datatypetestm order by cidx; +cidx TIME_TO_SEC('00:39:38') +1 2378 +select cidx, TIME_TO_SEC('22:23:49 999999') from datatypetestm order by cidx; +cidx TIME_TO_SEC('22:23:49 999999') +1 NULL +select cidx, CDATE from datatypetestm order by TIME_TO_SEC(CDATE), cidx; +cidx CDATE +1 1997-01-01 +select cidx, CDATETIME from datatypetestm order by TIME_TO_SEC(CDATETIME), cidx; +cidx CDATETIME +1 1997-01-01 00:00:00 +select cidx, CTIME from datatypetestm order by TIME_TO_SEC(CTIME), cidx; +cidx CTIME +1 13:00:00 diff --git a/mysql-test/columnstore/autopilot/t/mcs4125_function_CNX_LAST_DAY_DS.test b/mysql-test/columnstore/autopilot/t/mcs4125_function_CNX_LAST_DAY_DS.test index c4902fa20..0cee52caa 100644 --- a/mysql-test/columnstore/autopilot/t/mcs4125_function_CNX_LAST_DAY_DS.test +++ b/mysql-test/columnstore/autopilot/t/mcs4125_function_CNX_LAST_DAY_DS.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE autopilot; # diff --git a/mysql-test/columnstore/autopilot/t/mcs4125_function_CNX_LAST_DAY_DS_maxscale.test b/mysql-test/columnstore/autopilot/t/mcs4125_function_CNX_LAST_DAY_DS_maxscale.test new file mode 100644 index 000000000..0dd87f552 --- /dev/null +++ b/mysql-test/columnstore/autopilot/t/mcs4125_function_CNX_LAST_DAY_DS_maxscale.test @@ -0,0 +1,23 @@ +# -------------------------------------------------------------- # +# Test case migrated from Autopilot functions test suite +# +# Author: Daniel Lee, daniel.lee@mariadb.com +# -------------------------------------------------------------- # +# +--source ../include/have_columnstore.inc +--source ../include/detect_no_maxscale.inc +--disable_warnings +# +USE autopilot; +# +select cidx, CDATE, LAST_DAY(CDATE) from datatypetestm order by cidx; +select cidx, CDATETIME, LAST_DAY(CDATETIME) from datatypetestm order by cidx; +--replace_column 3 REPLACEDVALUE +select cidx, CTIME, LAST_DAY(CTIME) from datatypetestm order by cidx; +select cidx, LAST_DAY('2009-02-28') from datatypetestm order by cidx; +select cidx, LAST_DAY('2009-07-04') from datatypetestm order by cidx; +select cidx, LAST_DAY('2010-02-31') from datatypetestm order by cidx; +select cidx, CDATE from datatypetestm where LAST_DAY(CDATE) <> 0 order by cidx; +select cidx, CDATETIME from datatypetestm where LAST_DAY(CDATETIME) <> 0 order by cidx; +#select cidx, CTIME from datatypetestm where LAST_DAY(CTIME) <> 0 order by cidx; +--enable_warnings diff --git a/mysql-test/columnstore/autopilot/t/mcs4154_function_CNX_MICROSECOND_DS.test b/mysql-test/columnstore/autopilot/t/mcs4154_function_CNX_MICROSECOND_DS.test index 6f04ab5e1..387078d3e 100644 --- a/mysql-test/columnstore/autopilot/t/mcs4154_function_CNX_MICROSECOND_DS.test +++ b/mysql-test/columnstore/autopilot/t/mcs4154_function_CNX_MICROSECOND_DS.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE autopilot; # diff --git a/mysql-test/columnstore/autopilot/t/mcs4154_function_CNX_MICROSECOND_DS_maxscale.test b/mysql-test/columnstore/autopilot/t/mcs4154_function_CNX_MICROSECOND_DS_maxscale.test new file mode 100644 index 000000000..c9b000043 --- /dev/null +++ b/mysql-test/columnstore/autopilot/t/mcs4154_function_CNX_MICROSECOND_DS_maxscale.test @@ -0,0 +1,21 @@ +# -------------------------------------------------------------- # +# Test case migrated from Autopilot functions test suite +# +# Author: Daniel Lee, daniel.lee@mariadb.com +# -------------------------------------------------------------- # +# +--source ../include/have_columnstore.inc +--source ../include/detect_no_maxscale.inc +--disable_warnings +# +USE autopilot; +# +select cidx, CDATE, MICROSECOND(CDATE) from datatypetestm order by cidx; +select cidx, CDATETIME, MICROSECOND(CDATETIME) from datatypetestm order by cidx; +select cidx, CTIME, MICROSECOND(CTIME) from datatypetestm order by cidx; +select cidx, MICROSECOND('2011-05-01') from datatypetestm order by cidx; +select cidx, MICROSECOND('2011-05-01 13:58:22.123456') from datatypetestm order by cidx; +select cidx, CDATE from datatypetestm where MICROSECOND(CDATE) <> 0 order by cidx; +select cidx, CDATETIME from datatypetestm where MICROSECOND(CDATETIME) <> 0 order by cidx; +select cidx, CTIME from datatypetestm where MICROSECOND(CTIME) <> 0 order by cidx; +--enable_warnings diff --git a/mysql-test/columnstore/autopilot/t/mcs4162_function_CNX_MONTHNAME_DS.test b/mysql-test/columnstore/autopilot/t/mcs4162_function_CNX_MONTHNAME_DS.test index 3592d3fc9..35a4dbfeb 100644 --- a/mysql-test/columnstore/autopilot/t/mcs4162_function_CNX_MONTHNAME_DS.test +++ b/mysql-test/columnstore/autopilot/t/mcs4162_function_CNX_MONTHNAME_DS.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE autopilot; # diff --git a/mysql-test/columnstore/autopilot/t/mcs4162_function_CNX_MONTHNAME_DS_maxscale.test b/mysql-test/columnstore/autopilot/t/mcs4162_function_CNX_MONTHNAME_DS_maxscale.test new file mode 100644 index 000000000..582416369 --- /dev/null +++ b/mysql-test/columnstore/autopilot/t/mcs4162_function_CNX_MONTHNAME_DS_maxscale.test @@ -0,0 +1,23 @@ +# -------------------------------------------------------------- # +# Test case migrated from Autopilot functions test suite +# +# Author: Daniel Lee, daniel.lee@mariadb.com +# -------------------------------------------------------------- # +# +--source ../include/have_columnstore.inc +--source ../include/detect_no_maxscale.inc +--disable_warnings +# +USE autopilot; +# +select cidx, CDATE, MONTHNAME(CDATE) from datatypetestm order by cidx; +select cidx, CDATETIME, MONTHNAME(CDATETIME) from datatypetestm order by cidx; +--replace_column 3 REPLACEDVALUE +select cidx, CTIME, MONTHNAME(CTIME) from datatypetestm order by cidx; +select cidx, MONTHNAME('2009-02-28') from datatypetestm order by cidx; +select cidx, MONTHNAME('2009-07-04') from datatypetestm order by cidx; +select cidx, MONTHNAME('2010-02-31') from datatypetestm order by cidx; +select cidx, CDATE from datatypetestm where MONTHNAME(CDATE) <> 0 order by cidx; +select cidx, CDATETIME from datatypetestm where MONTHNAME(CDATETIME) <> 0 order by cidx; +#select cidx, CTIME from datatypetestm where MONTHNAME(CTIME) <> 0 order by cidx; +--enable_warnings diff --git a/mysql-test/columnstore/autopilot/t/mcs4164_function_CNX_NULLIF_NM_Archived.test b/mysql-test/columnstore/autopilot/t/mcs4164_function_CNX_NULLIF_NM_Archived.test index 8c37f09ff..93e455cea 100644 --- a/mysql-test/columnstore/autopilot/t/mcs4164_function_CNX_NULLIF_NM_Archived.test +++ b/mysql-test/columnstore/autopilot/t/mcs4164_function_CNX_NULLIF_NM_Archived.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE autopilot; # diff --git a/mysql-test/columnstore/autopilot/t/mcs4164_function_CNX_NULLIF_NM_Archived_maxscale.test b/mysql-test/columnstore/autopilot/t/mcs4164_function_CNX_NULLIF_NM_Archived_maxscale.test new file mode 100644 index 000000000..c1c92d5e3 --- /dev/null +++ b/mysql-test/columnstore/autopilot/t/mcs4164_function_CNX_NULLIF_NM_Archived_maxscale.test @@ -0,0 +1,313 @@ +# -------------------------------------------------------------- # +# Test case migrated from Autopilot functions test suite +# +# Author: Daniel Lee, daniel.lee@mariadb.com +# -------------------------------------------------------------- # +# +--source ../include/have_columnstore.inc +--source ../include/detect_no_maxscale.inc +--disable_warnings +# +USE autopilot; +# +select cidx, CBIGINT, NULLIF(CBIGINT,CBIGINT) from datatypetestm order by cidx; +select cidx, CBIGINT, NULLIF(CBIGINT,CINTEGER) from datatypetestm order by cidx; +select cidx, CBIGINT, NULLIF(CBIGINT,CDOUBLE) from datatypetestm order by cidx; +select cidx, CBIGINT, NULLIF(CBIGINT,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CBIGINT, NULLIF(CBIGINT,1) from datatypetestm order by cidx; +select cidx, CBIGINT, NULLIF(CBIGINT,3.14) from datatypetestm order by cidx; +select cidx, CBIGINT, NULLIF(CBIGINT,CCHAR4) from datatypetestm order by cidx; +select cidx, CBIGINT, NULLIF(CBIGINT,CDATE) from datatypetestm order by cidx; +select cidx, CBIGINT, NULLIF(CBIGINT,NULL) from datatypetestm order by cidx; +select cidx, CBIGINT, NULLIF(CBIGINT,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CBIGINT) from datatypetestm order by cidx; +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CINTEGER) from datatypetestm order by cidx; +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CDOUBLE) from datatypetestm order by cidx; +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,1) from datatypetestm order by cidx; +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,3.14) from datatypetestm order by cidx; +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CCHAR4) from datatypetestm order by cidx; +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CDATE) from datatypetestm order by cidx; +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,NULL) from datatypetestm order by cidx; +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CBIGINT) from datatypetestm order by cidx; +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CINTEGER) from datatypetestm order by cidx; +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CDOUBLE) from datatypetestm order by cidx; +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,1) from datatypetestm order by cidx; +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,3.14) from datatypetestm order by cidx; +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CCHAR4) from datatypetestm order by cidx; +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CDATE) from datatypetestm order by cidx; +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,NULL) from datatypetestm order by cidx; +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CBIGINT) from datatypetestm order by cidx; +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CINTEGER) from datatypetestm order by cidx; +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CDOUBLE) from datatypetestm order by cidx; +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,1) from datatypetestm order by cidx; +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,3.14) from datatypetestm order by cidx; +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CCHAR4) from datatypetestm order by cidx; +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CDATE) from datatypetestm order by cidx; +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,NULL) from datatypetestm order by cidx; +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CBIGINT) from datatypetestm order by cidx; +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CINTEGER) from datatypetestm order by cidx; +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CDOUBLE) from datatypetestm order by cidx; +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,1) from datatypetestm order by cidx; +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,3.14) from datatypetestm order by cidx; +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CCHAR4) from datatypetestm order by cidx; +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CDATE) from datatypetestm order by cidx; +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,NULL) from datatypetestm order by cidx; +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CBIGINT) from datatypetestm order by cidx; +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CINTEGER) from datatypetestm order by cidx; +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CDOUBLE) from datatypetestm order by cidx; +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,1) from datatypetestm order by cidx; +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,3.14) from datatypetestm order by cidx; +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CCHAR4) from datatypetestm order by cidx; +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CDATE) from datatypetestm order by cidx; +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,NULL) from datatypetestm order by cidx; +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CBIGINT) from datatypetestm order by cidx; +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CINTEGER) from datatypetestm order by cidx; +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CDOUBLE) from datatypetestm order by cidx; +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,1) from datatypetestm order by cidx; +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,3.14) from datatypetestm order by cidx; +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CCHAR4) from datatypetestm order by cidx; +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CDATE) from datatypetestm order by cidx; +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,NULL) from datatypetestm order by cidx; +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CBIGINT) from datatypetestm order by cidx; +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CINTEGER) from datatypetestm order by cidx; +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CDOUBLE) from datatypetestm order by cidx; +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,1) from datatypetestm order by cidx; +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,3.14) from datatypetestm order by cidx; +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CCHAR4) from datatypetestm order by cidx; +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CDATE) from datatypetestm order by cidx; +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,NULL) from datatypetestm order by cidx; +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CBIGINT) from datatypetestm order by cidx; +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CINTEGER) from datatypetestm order by cidx; +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CDOUBLE) from datatypetestm order by cidx; +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,1) from datatypetestm order by cidx; +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,3.14) from datatypetestm order by cidx; +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CCHAR4) from datatypetestm order by cidx; +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CDATE) from datatypetestm order by cidx; +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,NULL) from datatypetestm order by cidx; +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CBIGINT) from datatypetestm order by cidx; +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CINTEGER) from datatypetestm order by cidx; +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CDOUBLE) from datatypetestm order by cidx; +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,1) from datatypetestm order by cidx; +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,3.14) from datatypetestm order by cidx; +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CCHAR4) from datatypetestm order by cidx; +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CDATE) from datatypetestm order by cidx; +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,NULL) from datatypetestm order by cidx; +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CINTEGER, NULLIF(CINTEGER,CBIGINT) from datatypetestm order by cidx; +select cidx, CINTEGER, NULLIF(CINTEGER,CINTEGER) from datatypetestm order by cidx; +select cidx, CINTEGER, NULLIF(CINTEGER,CDOUBLE) from datatypetestm order by cidx; +select cidx, CINTEGER, NULLIF(CINTEGER,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CINTEGER, NULLIF(CINTEGER,1) from datatypetestm order by cidx; +select cidx, CINTEGER, NULLIF(CINTEGER,3.14) from datatypetestm order by cidx; +select cidx, CINTEGER, NULLIF(CINTEGER,CCHAR4) from datatypetestm order by cidx; +select cidx, CINTEGER, NULLIF(CINTEGER,CDATE) from datatypetestm order by cidx; +select cidx, CINTEGER, NULLIF(CINTEGER,NULL) from datatypetestm order by cidx; +select cidx, CINTEGER, NULLIF(CINTEGER,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CSMALLINT, NULLIF(CSMALLINT,CBIGINT) from datatypetestm order by cidx; +select cidx, CSMALLINT, NULLIF(CSMALLINT,CINTEGER) from datatypetestm order by cidx; +select cidx, CSMALLINT, NULLIF(CSMALLINT,CDOUBLE) from datatypetestm order by cidx; +select cidx, CSMALLINT, NULLIF(CSMALLINT,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CSMALLINT, NULLIF(CSMALLINT,1) from datatypetestm order by cidx; +select cidx, CSMALLINT, NULLIF(CSMALLINT,3.14) from datatypetestm order by cidx; +select cidx, CSMALLINT, NULLIF(CSMALLINT,CCHAR4) from datatypetestm order by cidx; +select cidx, CSMALLINT, NULLIF(CSMALLINT,CDATE) from datatypetestm order by cidx; +select cidx, CSMALLINT, NULLIF(CSMALLINT,NULL) from datatypetestm order by cidx; +select cidx, CSMALLINT, NULLIF(CSMALLINT,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CTINYINT, NULLIF(CTINYINT,CBIGINT) from datatypetestm order by cidx; +select cidx, CTINYINT, NULLIF(CTINYINT,CINTEGER) from datatypetestm order by cidx; +select cidx, CTINYINT, NULLIF(CTINYINT,CDOUBLE) from datatypetestm order by cidx; +select cidx, CTINYINT, NULLIF(CTINYINT,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CTINYINT, NULLIF(CTINYINT,1) from datatypetestm order by cidx; +select cidx, CTINYINT, NULLIF(CTINYINT,3.14) from datatypetestm order by cidx; +select cidx, CTINYINT, NULLIF(CTINYINT,CCHAR4) from datatypetestm order by cidx; +select cidx, CTINYINT, NULLIF(CTINYINT,CDATE) from datatypetestm order by cidx; +select cidx, CTINYINT, NULLIF(CTINYINT,NULL) from datatypetestm order by cidx; +select cidx, CTINYINT, NULLIF(CTINYINT,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CDOUBLE, NULLIF(CDOUBLE,CBIGINT) from datatypetestm order by cidx; +select cidx, CDOUBLE, NULLIF(CDOUBLE,CINTEGER) from datatypetestm order by cidx; +select cidx, CDOUBLE, NULLIF(CDOUBLE,CDOUBLE) from datatypetestm order by cidx; +select cidx, CDOUBLE, NULLIF(CDOUBLE,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CDOUBLE, NULLIF(CDOUBLE,1) from datatypetestm order by cidx; +select cidx, CDOUBLE, NULLIF(CDOUBLE,3.14) from datatypetestm order by cidx; +select cidx, CDOUBLE, NULLIF(CDOUBLE,CCHAR4) from datatypetestm order by cidx; +select cidx, CDOUBLE, NULLIF(CDOUBLE,CDATE) from datatypetestm order by cidx; +select cidx, CDOUBLE, NULLIF(CDOUBLE,NULL) from datatypetestm order by cidx; +select cidx, CDOUBLE, NULLIF(CDOUBLE,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CFLOAT, NULLIF(CFLOAT,CBIGINT) from datatypetestm order by cidx; +select cidx, CFLOAT, NULLIF(CFLOAT,CINTEGER) from datatypetestm order by cidx; +select cidx, CFLOAT, NULLIF(CFLOAT,CDOUBLE) from datatypetestm order by cidx; +select cidx, CFLOAT, NULLIF(CFLOAT,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CFLOAT, NULLIF(CFLOAT,1) from datatypetestm order by cidx; +select cidx, CFLOAT, NULLIF(CFLOAT,3.14) from datatypetestm order by cidx; +select cidx, CFLOAT, NULLIF(CFLOAT,CCHAR4) from datatypetestm order by cidx; +select cidx, CFLOAT, NULLIF(CFLOAT,CDATE) from datatypetestm order by cidx; +select cidx, CFLOAT, NULLIF(CFLOAT,NULL) from datatypetestm order by cidx; +select cidx, CFLOAT, NULLIF(CFLOAT,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CBIGINT from datatypetestm where NULLIF(CBIGINT,CBIGINT) <> 0 order by cidx; +select cidx, CBIGINT from datatypetestm where NULLIF(CBIGINT,CINTEGER) <> 0 order by cidx; +select cidx, CBIGINT from datatypetestm where NULLIF(CBIGINT,CDOUBLE) <> 0 order by cidx; +select cidx, CBIGINT from datatypetestm where NULLIF(CBIGINT,CDECIMAL9_2) <> 0 order by cidx; +select cidx, CBIGINT from datatypetestm where NULLIF(CBIGINT,1) <> 0 order by cidx; +select cidx, CBIGINT from datatypetestm where NULLIF(CBIGINT,3.14) <> 0 order by cidx; +select cidx, CBIGINT from datatypetestm where NULLIF(CBIGINT,CCHAR4) <> 0 order by cidx; +select cidx, CBIGINT from datatypetestm where NULLIF(CBIGINT,CDATE) <> 0 order by cidx; +select cidx, CBIGINT from datatypetestm where NULLIF(CBIGINT,NULL) <> 0 order by cidx; +select cidx, CBIGINT from datatypetestm where NULLIF(CBIGINT,'HELLO WORLD') <> 0 order by cidx; +select cidx, CDECIMAL1 from datatypetestm where NULLIF(CDECIMAL1,CBIGINT) <> 0 order by cidx; +select cidx, CDECIMAL1 from datatypetestm where NULLIF(CDECIMAL1,CINTEGER) <> 0 order by cidx; +select cidx, CDECIMAL1 from datatypetestm where NULLIF(CDECIMAL1,CDOUBLE) <> 0 order by cidx; +select cidx, CDECIMAL1 from datatypetestm where NULLIF(CDECIMAL1,CDECIMAL9_2) <> 0 order by cidx; +select cidx, CDECIMAL1 from datatypetestm where NULLIF(CDECIMAL1,1) <> 0 order by cidx; +select cidx, CDECIMAL1 from datatypetestm where NULLIF(CDECIMAL1,3.14) <> 0 order by cidx; +select cidx, CDECIMAL1 from datatypetestm where NULLIF(CDECIMAL1,CCHAR4) <> 0 order by cidx; +select cidx, CDECIMAL1 from datatypetestm where NULLIF(CDECIMAL1,CDATE) <> 0 order by cidx; +select cidx, CDECIMAL1 from datatypetestm where NULLIF(CDECIMAL1,NULL) <> 0 order by cidx; +select cidx, CDECIMAL1 from datatypetestm where NULLIF(CDECIMAL1,'HELLO WORLD') <> 0 order by cidx; +select cidx, CDECIMAL4 from datatypetestm where NULLIF(CDECIMAL4,CBIGINT) <> 0 order by cidx; +select cidx, CDECIMAL4 from datatypetestm where NULLIF(CDECIMAL4,CINTEGER) <> 0 order by cidx; +select cidx, CDECIMAL4 from datatypetestm where NULLIF(CDECIMAL4,CDOUBLE) <> 0 order by cidx; +select cidx, CDECIMAL4 from datatypetestm where NULLIF(CDECIMAL4,CDECIMAL9_2) <> 0 order by cidx; +select cidx, CDECIMAL4 from datatypetestm where NULLIF(CDECIMAL4,1) <> 0 order by cidx; +select cidx, CDECIMAL4 from datatypetestm where NULLIF(CDECIMAL4,3.14) <> 0 order by cidx; +select cidx, CDECIMAL4 from datatypetestm where NULLIF(CDECIMAL4,CCHAR4) <> 0 order by cidx; +select cidx, CDECIMAL4 from datatypetestm where NULLIF(CDECIMAL4,CDATE) <> 0 order by cidx; +select cidx, CDECIMAL4 from datatypetestm where NULLIF(CDECIMAL4,NULL) <> 0 order by cidx; +select cidx, CDECIMAL4 from datatypetestm where NULLIF(CDECIMAL4,'HELLO WORLD') <> 0 order by cidx; +select cidx, CDECIMAL4_2 from datatypetestm where NULLIF(CDECIMAL4_2,CBIGINT) <> 0 order by cidx; +select cidx, CDECIMAL4_2 from datatypetestm where NULLIF(CDECIMAL4_2,CINTEGER) <> 0 order by cidx; +select cidx, CDECIMAL4_2 from datatypetestm where NULLIF(CDECIMAL4_2,CDOUBLE) <> 0 order by cidx; +select cidx, CDECIMAL4_2 from datatypetestm where NULLIF(CDECIMAL4_2,CDECIMAL9_2) <> 0 order by cidx; +select cidx, CDECIMAL4_2 from datatypetestm where NULLIF(CDECIMAL4_2,1) <> 0 order by cidx; +select cidx, CDECIMAL4_2 from datatypetestm where NULLIF(CDECIMAL4_2,3.14) <> 0 order by cidx; +select cidx, CDECIMAL4_2 from datatypetestm where NULLIF(CDECIMAL4_2,CCHAR4) <> 0 order by cidx; +select cidx, CDECIMAL4_2 from datatypetestm where NULLIF(CDECIMAL4_2,CDATE) <> 0 order by cidx; +select cidx, CDECIMAL4_2 from datatypetestm where NULLIF(CDECIMAL4_2,NULL) <> 0 order by cidx; +select cidx, CDECIMAL4_2 from datatypetestm where NULLIF(CDECIMAL4_2,'HELLO WORLD') <> 0 order by cidx; +select cidx, CDECIMAL5 from datatypetestm where NULLIF(CDECIMAL5,CBIGINT) <> 0 order by cidx; +select cidx, CDECIMAL5 from datatypetestm where NULLIF(CDECIMAL5,CINTEGER) <> 0 order by cidx; +select cidx, CDECIMAL5 from datatypetestm where NULLIF(CDECIMAL5,CDOUBLE) <> 0 order by cidx; +select cidx, CDECIMAL5 from datatypetestm where NULLIF(CDECIMAL5,CDECIMAL9_2) <> 0 order by cidx; +select cidx, CDECIMAL5 from datatypetestm where NULLIF(CDECIMAL5,1) <> 0 order by cidx; +select cidx, CDECIMAL5 from datatypetestm where NULLIF(CDECIMAL5,3.14) <> 0 order by cidx; +select cidx, CDECIMAL5 from datatypetestm where NULLIF(CDECIMAL5,CCHAR4) <> 0 order by cidx; +select cidx, CDECIMAL5 from datatypetestm where NULLIF(CDECIMAL5,CDATE) <> 0 order by cidx; +select cidx, CDECIMAL5 from datatypetestm where NULLIF(CDECIMAL5,NULL) <> 0 order by cidx; +select cidx, CDECIMAL5 from datatypetestm where NULLIF(CDECIMAL5,'HELLO WORLD') <> 0 order by cidx; +select cidx, CDECIMAL9 from datatypetestm where NULLIF(CDECIMAL9,CBIGINT) <> 0 order by cidx; +select cidx, CDECIMAL9 from datatypetestm where NULLIF(CDECIMAL9,CINTEGER) <> 0 order by cidx; +select cidx, CDECIMAL9 from datatypetestm where NULLIF(CDECIMAL9,CDOUBLE) <> 0 order by cidx; +select cidx, CDECIMAL9 from datatypetestm where NULLIF(CDECIMAL9,CDECIMAL9_2) <> 0 order by cidx; +select cidx, CDECIMAL9 from datatypetestm where NULLIF(CDECIMAL9,1) <> 0 order by cidx; +select cidx, CDECIMAL9 from datatypetestm where NULLIF(CDECIMAL9,3.14) <> 0 order by cidx; +select cidx, CDECIMAL9 from datatypetestm where NULLIF(CDECIMAL9,CCHAR4) <> 0 order by cidx; +select cidx, CDECIMAL9 from datatypetestm where NULLIF(CDECIMAL9,CDATE) <> 0 order by cidx; +select cidx, CDECIMAL9 from datatypetestm where NULLIF(CDECIMAL9,NULL) <> 0 order by cidx; +select cidx, CDECIMAL9 from datatypetestm where NULLIF(CDECIMAL9,'HELLO WORLD') <> 0 order by cidx; +select cidx, CDECIMAL9_2 from datatypetestm where NULLIF(CDECIMAL9_2,CBIGINT) <> 0 order by cidx; +select cidx, CDECIMAL9_2 from datatypetestm where NULLIF(CDECIMAL9_2,CINTEGER) <> 0 order by cidx; +select cidx, CDECIMAL9_2 from datatypetestm where NULLIF(CDECIMAL9_2,CDOUBLE) <> 0 order by cidx; +select cidx, CDECIMAL9_2 from datatypetestm where NULLIF(CDECIMAL9_2,CDECIMAL9_2) <> 0 order by cidx; +select cidx, CDECIMAL9_2 from datatypetestm where NULLIF(CDECIMAL9_2,1) <> 0 order by cidx; +select cidx, CDECIMAL9_2 from datatypetestm where NULLIF(CDECIMAL9_2,3.14) <> 0 order by cidx; +select cidx, CDECIMAL9_2 from datatypetestm where NULLIF(CDECIMAL9_2,CCHAR4) <> 0 order by cidx; +select cidx, CDECIMAL9_2 from datatypetestm where NULLIF(CDECIMAL9_2,CDATE) <> 0 order by cidx; +select cidx, CDECIMAL9_2 from datatypetestm where NULLIF(CDECIMAL9_2,NULL) <> 0 order by cidx; +select cidx, CDECIMAL9_2 from datatypetestm where NULLIF(CDECIMAL9_2,'HELLO WORLD') <> 0 order by cidx; +select cidx, CDECIMAL10 from datatypetestm where NULLIF(CDECIMAL10,CBIGINT) <> 0 order by cidx; +select cidx, CDECIMAL10 from datatypetestm where NULLIF(CDECIMAL10,CINTEGER) <> 0 order by cidx; +select cidx, CDECIMAL10 from datatypetestm where NULLIF(CDECIMAL10,CDOUBLE) <> 0 order by cidx; +select cidx, CDECIMAL10 from datatypetestm where NULLIF(CDECIMAL10,CDECIMAL9_2) <> 0 order by cidx; +select cidx, CDECIMAL10 from datatypetestm where NULLIF(CDECIMAL10,1) <> 0 order by cidx; +select cidx, CDECIMAL10 from datatypetestm where NULLIF(CDECIMAL10,3.14) <> 0 order by cidx; +select cidx, CDECIMAL10 from datatypetestm where NULLIF(CDECIMAL10,CCHAR4) <> 0 order by cidx; +select cidx, CDECIMAL10 from datatypetestm where NULLIF(CDECIMAL10,CDATE) <> 0 order by cidx; +select cidx, CDECIMAL10 from datatypetestm where NULLIF(CDECIMAL10,NULL) <> 0 order by cidx; +select cidx, CDECIMAL10 from datatypetestm where NULLIF(CDECIMAL10,'HELLO WORLD') <> 0 order by cidx; +select cidx, CDECIMAL18 from datatypetestm where NULLIF(CDECIMAL18,CBIGINT) <> 0 order by cidx; +select cidx, CDECIMAL18 from datatypetestm where NULLIF(CDECIMAL18,CINTEGER) <> 0 order by cidx; +select cidx, CDECIMAL18 from datatypetestm where NULLIF(CDECIMAL18,CDOUBLE) <> 0 order by cidx; +select cidx, CDECIMAL18 from datatypetestm where NULLIF(CDECIMAL18,CDECIMAL9_2) <> 0 order by cidx; +select cidx, CDECIMAL18 from datatypetestm where NULLIF(CDECIMAL18,1) <> 0 order by cidx; +select cidx, CDECIMAL18 from datatypetestm where NULLIF(CDECIMAL18,3.14) <> 0 order by cidx; +select cidx, CDECIMAL18 from datatypetestm where NULLIF(CDECIMAL18,CCHAR4) <> 0 order by cidx; +select cidx, CDECIMAL18 from datatypetestm where NULLIF(CDECIMAL18,CDATE) <> 0 order by cidx; +select cidx, CDECIMAL18 from datatypetestm where NULLIF(CDECIMAL18,NULL) <> 0 order by cidx; +select cidx, CDECIMAL18 from datatypetestm where NULLIF(CDECIMAL18,'HELLO WORLD') <> 0 order by cidx; +select cidx, CDECIMAL18_2 from datatypetestm where NULLIF(CDECIMAL18_2,CBIGINT) <> 0 order by cidx; +select cidx, CDECIMAL18_2 from datatypetestm where NULLIF(CDECIMAL18_2,CINTEGER) <> 0 order by cidx; +select cidx, CDECIMAL18_2 from datatypetestm where NULLIF(CDECIMAL18_2,CDOUBLE) <> 0 order by cidx; +select cidx, CDECIMAL18_2 from datatypetestm where NULLIF(CDECIMAL18_2,CDECIMAL9_2) <> 0 order by cidx; +select cidx, CDECIMAL18_2 from datatypetestm where NULLIF(CDECIMAL18_2,1) <> 0 order by cidx; +select cidx, CDECIMAL18_2 from datatypetestm where NULLIF(CDECIMAL18_2,3.14) <> 0 order by cidx; +select cidx, CDECIMAL18_2 from datatypetestm where NULLIF(CDECIMAL18_2,CCHAR4) <> 0 order by cidx; +select cidx, CDECIMAL18_2 from datatypetestm where NULLIF(CDECIMAL18_2,CDATE) <> 0 order by cidx; +select cidx, CDECIMAL18_2 from datatypetestm where NULLIF(CDECIMAL18_2,NULL) <> 0 order by cidx; +select cidx, CDECIMAL18_2 from datatypetestm where NULLIF(CDECIMAL18_2,'HELLO WORLD') <> 0 order by cidx; +select cidx, CINTEGER from datatypetestm where NULLIF(CINTEGER,CBIGINT) <> 0 order by cidx; +select cidx, CINTEGER from datatypetestm where NULLIF(CINTEGER,CINTEGER) <> 0 order by cidx; +select cidx, CINTEGER from datatypetestm where NULLIF(CINTEGER,CDOUBLE) <> 0 order by cidx; +select cidx, CINTEGER from datatypetestm where NULLIF(CINTEGER,CDECIMAL9_2) <> 0 order by cidx; +select cidx, CINTEGER from datatypetestm where NULLIF(CINTEGER,1) <> 0 order by cidx; +select cidx, CINTEGER from datatypetestm where NULLIF(CINTEGER,3.14) <> 0 order by cidx; +select cidx, CINTEGER from datatypetestm where NULLIF(CINTEGER,CCHAR4) <> 0 order by cidx; +select cidx, CINTEGER from datatypetestm where NULLIF(CINTEGER,CDATE) <> 0 order by cidx; +select cidx, CINTEGER from datatypetestm where NULLIF(CINTEGER,NULL) <> 0 order by cidx; +select cidx, CINTEGER from datatypetestm where NULLIF(CINTEGER,'HELLO WORLD') <> 0 order by cidx; +select cidx, CSMALLINT from datatypetestm where NULLIF(CSMALLINT,CBIGINT) <> 0 order by cidx; +select cidx, CSMALLINT from datatypetestm where NULLIF(CSMALLINT,CINTEGER) <> 0 order by cidx; +select cidx, CSMALLINT from datatypetestm where NULLIF(CSMALLINT,CDOUBLE) <> 0 order by cidx; +select cidx, CSMALLINT from datatypetestm where NULLIF(CSMALLINT,CDECIMAL9_2) <> 0 order by cidx; +select cidx, CSMALLINT from datatypetestm where NULLIF(CSMALLINT,1) <> 0 order by cidx; +select cidx, CSMALLINT from datatypetestm where NULLIF(CSMALLINT,3.14) <> 0 order by cidx; +select cidx, CSMALLINT from datatypetestm where NULLIF(CSMALLINT,CCHAR4) <> 0 order by cidx; +select cidx, CSMALLINT from datatypetestm where NULLIF(CSMALLINT,CDATE) <> 0 order by cidx; +select cidx, CSMALLINT from datatypetestm where NULLIF(CSMALLINT,NULL) <> 0 order by cidx; +select cidx, CSMALLINT from datatypetestm where NULLIF(CSMALLINT,'HELLO WORLD') <> 0 order by cidx; +select cidx, CTINYINT from datatypetestm where NULLIF(CTINYINT,CBIGINT) <> 0 order by cidx; +select cidx, CTINYINT from datatypetestm where NULLIF(CTINYINT,CINTEGER) <> 0 order by cidx; +select cidx, CTINYINT from datatypetestm where NULLIF(CTINYINT,CDOUBLE) <> 0 order by cidx; +select cidx, CTINYINT from datatypetestm where NULLIF(CTINYINT,CDECIMAL9_2) <> 0 order by cidx; +select cidx, CTINYINT from datatypetestm where NULLIF(CTINYINT,1) <> 0 order by cidx; +select cidx, CTINYINT from datatypetestm where NULLIF(CTINYINT,3.14) <> 0 order by cidx; +select cidx, CTINYINT from datatypetestm where NULLIF(CTINYINT,CCHAR4) <> 0 order by cidx; +select cidx, CTINYINT from datatypetestm where NULLIF(CTINYINT,CDATE) <> 0 order by cidx; +select cidx, CTINYINT from datatypetestm where NULLIF(CTINYINT,NULL) <> 0 order by cidx; +select cidx, CTINYINT from datatypetestm where NULLIF(CTINYINT,'HELLO WORLD') <> 0 order by cidx; +select cidx, CDOUBLE from datatypetestm where NULLIF(CDOUBLE,CBIGINT) <> 0 order by cidx; +select cidx, CDOUBLE from datatypetestm where NULLIF(CDOUBLE,CINTEGER) <> 0 order by cidx; +select cidx, CDOUBLE from datatypetestm where NULLIF(CDOUBLE,CDOUBLE) <> 0 order by cidx; +select cidx, CDOUBLE from datatypetestm where NULLIF(CDOUBLE,CDECIMAL9_2) <> 0 order by cidx; +select cidx, CDOUBLE from datatypetestm where NULLIF(CDOUBLE,1) <> 0 order by cidx; +select cidx, CDOUBLE from datatypetestm where NULLIF(CDOUBLE,3.14) <> 0 order by cidx; +select cidx, CDOUBLE from datatypetestm where NULLIF(CDOUBLE,CCHAR4) <> 0 order by cidx; +select cidx, CDOUBLE from datatypetestm where NULLIF(CDOUBLE,CDATE) <> 0 order by cidx; +select cidx, CDOUBLE from datatypetestm where NULLIF(CDOUBLE,NULL) <> 0 order by cidx; +select cidx, CDOUBLE from datatypetestm where NULLIF(CDOUBLE,'HELLO WORLD') <> 0 order by cidx; +select cidx, CFLOAT from datatypetestm where NULLIF(CFLOAT,CBIGINT) <> 0 order by cidx; +select cidx, CFLOAT from datatypetestm where NULLIF(CFLOAT,CINTEGER) <> 0 order by cidx; +select cidx, CFLOAT from datatypetestm where NULLIF(CFLOAT,CDOUBLE) <> 0 order by cidx; +select cidx, CFLOAT from datatypetestm where NULLIF(CFLOAT,CDECIMAL9_2) <> 0 order by cidx; +select cidx, CFLOAT from datatypetestm where NULLIF(CFLOAT,1) <> 0 order by cidx; +select cidx, CFLOAT from datatypetestm where NULLIF(CFLOAT,3.14) <> 0 order by cidx; +select cidx, CFLOAT from datatypetestm where NULLIF(CFLOAT,CCHAR4) <> 0 order by cidx; +select cidx, CFLOAT from datatypetestm where NULLIF(CFLOAT,CDATE) <> 0 order by cidx; +select cidx, CFLOAT from datatypetestm where NULLIF(CFLOAT,NULL) <> 0 order by cidx; +select cidx, CFLOAT from datatypetestm where NULLIF(CFLOAT,'HELLO WORLD') <> 0 order by cidx; +--enable_warnings diff --git a/mysql-test/columnstore/autopilot/t/mcs4220_function_CNX_TIME_TO_SEC_DS.test b/mysql-test/columnstore/autopilot/t/mcs4220_function_CNX_TIME_TO_SEC_DS.test index b47b7aac8..94cd600e3 100644 --- a/mysql-test/columnstore/autopilot/t/mcs4220_function_CNX_TIME_TO_SEC_DS.test +++ b/mysql-test/columnstore/autopilot/t/mcs4220_function_CNX_TIME_TO_SEC_DS.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE autopilot; # diff --git a/mysql-test/columnstore/autopilot/t/mcs4220_function_CNX_TIME_TO_SEC_DS_maxscale.test b/mysql-test/columnstore/autopilot/t/mcs4220_function_CNX_TIME_TO_SEC_DS_maxscale.test new file mode 100644 index 000000000..f804aed2d --- /dev/null +++ b/mysql-test/columnstore/autopilot/t/mcs4220_function_CNX_TIME_TO_SEC_DS_maxscale.test @@ -0,0 +1,22 @@ +# -------------------------------------------------------------- # +# Test case migrated from Autopilot functions test suite +# +# Author: Daniel Lee, daniel.lee@mariadb.com +# -------------------------------------------------------------- # +# +--source ../include/have_columnstore.inc +--source ../include/detect_no_maxscale.inc +--disable_warnings +# +USE autopilot; +# +select cidx, CDATE, TIME_TO_SEC(CDATE) from datatypetestm order by cidx; +select cidx, CDATETIME, TIME_TO_SEC(CDATETIME) from datatypetestm order by cidx; +select cidx, CTIME, TIME_TO_SEC(CTIME) from datatypetestm order by cidx; +select cidx, TIME_TO_SEC('22:23:00') from datatypetestm order by cidx; +select cidx, TIME_TO_SEC('00:39:38') from datatypetestm order by cidx; +select cidx, TIME_TO_SEC('22:23:49 999999') from datatypetestm order by cidx; +select cidx, CDATE from datatypetestm where TIME_TO_SEC(CDATE) <> 0 order by cidx; +select cidx, CDATETIME from datatypetestm where TIME_TO_SEC(CDATETIME) <> 0 order by cidx; +select cidx, CTIME from datatypetestm where TIME_TO_SEC(CTIME) <> 0 order by cidx; +--enable_warnings diff --git a/mysql-test/columnstore/autopilot/t/mcs4350_function_CNXPP_LAST_DAY_DS.test b/mysql-test/columnstore/autopilot/t/mcs4350_function_CNXPP_LAST_DAY_DS.test index 85ceff2b1..b3c2ebf11 100644 --- a/mysql-test/columnstore/autopilot/t/mcs4350_function_CNXPP_LAST_DAY_DS.test +++ b/mysql-test/columnstore/autopilot/t/mcs4350_function_CNXPP_LAST_DAY_DS.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE autopilot; # diff --git a/mysql-test/columnstore/autopilot/t/mcs4350_function_CNXPP_LAST_DAY_DS_maxscale.test b/mysql-test/columnstore/autopilot/t/mcs4350_function_CNXPP_LAST_DAY_DS_maxscale.test new file mode 100644 index 000000000..1b8fc71f4 --- /dev/null +++ b/mysql-test/columnstore/autopilot/t/mcs4350_function_CNXPP_LAST_DAY_DS_maxscale.test @@ -0,0 +1,23 @@ +# -------------------------------------------------------------- # +# Test case migrated from Autopilot functions test suite +# +# Author: Daniel Lee, daniel.lee@mariadb.com +# -------------------------------------------------------------- # +# +--source ../include/have_columnstore.inc +--source ../include/detect_no_maxscale.inc +--disable_warnings +# +USE autopilot; +# +select cidx, CDATE, LAST_DAY(CDATE) from datatypetestm order by cidx; +select cidx, CDATETIME, LAST_DAY(CDATETIME) from datatypetestm order by cidx; +--replace_column 3 REPLACEDVALUE +select cidx, CTIME, LAST_DAY(CTIME) from datatypetestm order by cidx; +select cidx, LAST_DAY('2009-02-28') from datatypetestm order by cidx; +select cidx, LAST_DAY('2009-07-04') from datatypetestm order by cidx; +select cidx, LAST_DAY('2010-02-31') from datatypetestm order by cidx; +select cidx, CDATE from datatypetestm order by LAST_DAY(CDATE), cidx; +select cidx, CDATETIME from datatypetestm order by LAST_DAY(CDATETIME), cidx; +#select cidx, CTIME from datatypetestm order by LAST_DAY(CTIME), cidx; +--enable_warnings diff --git a/mysql-test/columnstore/autopilot/t/mcs4379_function_CNXPP_MICROSECOND_DS.test b/mysql-test/columnstore/autopilot/t/mcs4379_function_CNXPP_MICROSECOND_DS.test index 83293bd8c..a6b011083 100644 --- a/mysql-test/columnstore/autopilot/t/mcs4379_function_CNXPP_MICROSECOND_DS.test +++ b/mysql-test/columnstore/autopilot/t/mcs4379_function_CNXPP_MICROSECOND_DS.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE autopilot; # diff --git a/mysql-test/columnstore/autopilot/t/mcs4379_function_CNXPP_MICROSECOND_DS_maxscale.test b/mysql-test/columnstore/autopilot/t/mcs4379_function_CNXPP_MICROSECOND_DS_maxscale.test new file mode 100644 index 000000000..48c9829b7 --- /dev/null +++ b/mysql-test/columnstore/autopilot/t/mcs4379_function_CNXPP_MICROSECOND_DS_maxscale.test @@ -0,0 +1,21 @@ +# -------------------------------------------------------------- # +# Test case migrated from Autopilot functions test suite +# +# Author: Daniel Lee, daniel.lee@mariadb.com +# -------------------------------------------------------------- # +# +--source ../include/have_columnstore.inc +--source ../include/detect_no_maxscale.inc +--disable_warnings +# +USE autopilot; +# +select cidx, CDATE, MICROSECOND(CDATE) from datatypetestm order by cidx; +select cidx, CDATETIME, MICROSECOND(CDATETIME) from datatypetestm order by cidx; +select cidx, CTIME, MICROSECOND(CTIME) from datatypetestm order by cidx; +select cidx, MICROSECOND('2011-05-01') from datatypetestm order by cidx; +select cidx, MICROSECOND('2011-05-01 13:58:22.123456') from datatypetestm order by cidx; +select cidx, CDATE from datatypetestm order by MICROSECOND(CDATE), cidx; +select cidx, CDATETIME from datatypetestm order by MICROSECOND(CDATETIME), cidx; +select cidx, CTIME from datatypetestm order by MICROSECOND(CTIME), cidx; +--enable_warnings diff --git a/mysql-test/columnstore/autopilot/t/mcs4387_function_CNXPP_MONTHNAME_DS.test b/mysql-test/columnstore/autopilot/t/mcs4387_function_CNXPP_MONTHNAME_DS.test index fe2fdbb15..3fa26697e 100644 --- a/mysql-test/columnstore/autopilot/t/mcs4387_function_CNXPP_MONTHNAME_DS.test +++ b/mysql-test/columnstore/autopilot/t/mcs4387_function_CNXPP_MONTHNAME_DS.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE autopilot; # diff --git a/mysql-test/columnstore/autopilot/t/mcs4387_function_CNXPP_MONTHNAME_DS_maxscale.test b/mysql-test/columnstore/autopilot/t/mcs4387_function_CNXPP_MONTHNAME_DS_maxscale.test new file mode 100644 index 000000000..bdcf1c982 --- /dev/null +++ b/mysql-test/columnstore/autopilot/t/mcs4387_function_CNXPP_MONTHNAME_DS_maxscale.test @@ -0,0 +1,23 @@ +# -------------------------------------------------------------- # +# Test case migrated from Autopilot functions test suite +# +# Author: Daniel Lee, daniel.lee@mariadb.com +# -------------------------------------------------------------- # +# +--source ../include/have_columnstore.inc +--source ../include/detect_no_maxscale.inc +--disable_warnings +# +USE autopilot; +# +select cidx, CDATE, MONTHNAME(CDATE) from datatypetestm order by cidx; +select cidx, CDATETIME, MONTHNAME(CDATETIME) from datatypetestm order by cidx; +--replace_column 3 REPLACEDVALUE +select cidx, CTIME, MONTHNAME(CTIME) from datatypetestm order by cidx; +select cidx, MONTHNAME('2009-02-28') from datatypetestm order by cidx; +select cidx, MONTHNAME('2009-07-04') from datatypetestm order by cidx; +select cidx, MONTHNAME('2010-02-31') from datatypetestm order by cidx; +select cidx, CDATE from datatypetestm order by MONTHNAME(CDATE), cidx; +select cidx, CDATETIME from datatypetestm order by MONTHNAME(CDATETIME), cidx; +#select cidx, CTIME from datatypetestm order by MONTHNAME(CTIME), cidx; +--enable_warnings diff --git a/mysql-test/columnstore/autopilot/t/mcs4389_function_CNXPP_NULLIF_NM_Archived.test b/mysql-test/columnstore/autopilot/t/mcs4389_function_CNXPP_NULLIF_NM_Archived.test index 26e63f6ae..335dae861 100644 --- a/mysql-test/columnstore/autopilot/t/mcs4389_function_CNXPP_NULLIF_NM_Archived.test +++ b/mysql-test/columnstore/autopilot/t/mcs4389_function_CNXPP_NULLIF_NM_Archived.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE autopilot; # diff --git a/mysql-test/columnstore/autopilot/t/mcs4389_function_CNXPP_NULLIF_NM_Archived_maxscale.test b/mysql-test/columnstore/autopilot/t/mcs4389_function_CNXPP_NULLIF_NM_Archived_maxscale.test new file mode 100644 index 000000000..6a5432e91 --- /dev/null +++ b/mysql-test/columnstore/autopilot/t/mcs4389_function_CNXPP_NULLIF_NM_Archived_maxscale.test @@ -0,0 +1,313 @@ +# -------------------------------------------------------------- # +# Test case migrated from Autopilot functions test suite +# +# Author: Daniel Lee, daniel.lee@mariadb.com +# -------------------------------------------------------------- # +# +--source ../include/have_columnstore.inc +--source ../include/detect_no_maxscale.inc +--disable_warnings +# +USE autopilot; +# +select cidx, CBIGINT, NULLIF(CBIGINT,CBIGINT) from datatypetestm order by cidx; +select cidx, CBIGINT, NULLIF(CBIGINT,CINTEGER) from datatypetestm order by cidx; +select cidx, CBIGINT, NULLIF(CBIGINT,CDOUBLE) from datatypetestm order by cidx; +select cidx, CBIGINT, NULLIF(CBIGINT,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CBIGINT, NULLIF(CBIGINT,1) from datatypetestm order by cidx; +select cidx, CBIGINT, NULLIF(CBIGINT,3.14) from datatypetestm order by cidx; +select cidx, CBIGINT, NULLIF(CBIGINT,CCHAR4) from datatypetestm order by cidx; +select cidx, CBIGINT, NULLIF(CBIGINT,CDATE) from datatypetestm order by cidx; +select cidx, CBIGINT, NULLIF(CBIGINT,NULL) from datatypetestm order by cidx; +select cidx, CBIGINT, NULLIF(CBIGINT,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CBIGINT) from datatypetestm order by cidx; +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CINTEGER) from datatypetestm order by cidx; +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CDOUBLE) from datatypetestm order by cidx; +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,1) from datatypetestm order by cidx; +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,3.14) from datatypetestm order by cidx; +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CCHAR4) from datatypetestm order by cidx; +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,CDATE) from datatypetestm order by cidx; +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,NULL) from datatypetestm order by cidx; +select cidx, CDECIMAL1, NULLIF(CDECIMAL1,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CBIGINT) from datatypetestm order by cidx; +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CINTEGER) from datatypetestm order by cidx; +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CDOUBLE) from datatypetestm order by cidx; +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,1) from datatypetestm order by cidx; +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,3.14) from datatypetestm order by cidx; +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CCHAR4) from datatypetestm order by cidx; +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,CDATE) from datatypetestm order by cidx; +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,NULL) from datatypetestm order by cidx; +select cidx, CDECIMAL4, NULLIF(CDECIMAL4,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CBIGINT) from datatypetestm order by cidx; +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CINTEGER) from datatypetestm order by cidx; +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CDOUBLE) from datatypetestm order by cidx; +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,1) from datatypetestm order by cidx; +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,3.14) from datatypetestm order by cidx; +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CCHAR4) from datatypetestm order by cidx; +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,CDATE) from datatypetestm order by cidx; +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,NULL) from datatypetestm order by cidx; +select cidx, CDECIMAL4_2, NULLIF(CDECIMAL4_2,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CBIGINT) from datatypetestm order by cidx; +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CINTEGER) from datatypetestm order by cidx; +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CDOUBLE) from datatypetestm order by cidx; +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,1) from datatypetestm order by cidx; +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,3.14) from datatypetestm order by cidx; +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CCHAR4) from datatypetestm order by cidx; +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,CDATE) from datatypetestm order by cidx; +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,NULL) from datatypetestm order by cidx; +select cidx, CDECIMAL5, NULLIF(CDECIMAL5,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CBIGINT) from datatypetestm order by cidx; +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CINTEGER) from datatypetestm order by cidx; +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CDOUBLE) from datatypetestm order by cidx; +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,1) from datatypetestm order by cidx; +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,3.14) from datatypetestm order by cidx; +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CCHAR4) from datatypetestm order by cidx; +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,CDATE) from datatypetestm order by cidx; +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,NULL) from datatypetestm order by cidx; +select cidx, CDECIMAL9, NULLIF(CDECIMAL9,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CBIGINT) from datatypetestm order by cidx; +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CINTEGER) from datatypetestm order by cidx; +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CDOUBLE) from datatypetestm order by cidx; +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,1) from datatypetestm order by cidx; +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,3.14) from datatypetestm order by cidx; +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CCHAR4) from datatypetestm order by cidx; +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,CDATE) from datatypetestm order by cidx; +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,NULL) from datatypetestm order by cidx; +select cidx, CDECIMAL9_2, NULLIF(CDECIMAL9_2,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CBIGINT) from datatypetestm order by cidx; +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CINTEGER) from datatypetestm order by cidx; +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CDOUBLE) from datatypetestm order by cidx; +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,1) from datatypetestm order by cidx; +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,3.14) from datatypetestm order by cidx; +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CCHAR4) from datatypetestm order by cidx; +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,CDATE) from datatypetestm order by cidx; +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,NULL) from datatypetestm order by cidx; +select cidx, CDECIMAL10, NULLIF(CDECIMAL10,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CBIGINT) from datatypetestm order by cidx; +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CINTEGER) from datatypetestm order by cidx; +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CDOUBLE) from datatypetestm order by cidx; +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,1) from datatypetestm order by cidx; +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,3.14) from datatypetestm order by cidx; +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CCHAR4) from datatypetestm order by cidx; +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,CDATE) from datatypetestm order by cidx; +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,NULL) from datatypetestm order by cidx; +select cidx, CDECIMAL18, NULLIF(CDECIMAL18,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CBIGINT) from datatypetestm order by cidx; +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CINTEGER) from datatypetestm order by cidx; +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CDOUBLE) from datatypetestm order by cidx; +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,1) from datatypetestm order by cidx; +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,3.14) from datatypetestm order by cidx; +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CCHAR4) from datatypetestm order by cidx; +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,CDATE) from datatypetestm order by cidx; +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,NULL) from datatypetestm order by cidx; +select cidx, CDECIMAL18_2, NULLIF(CDECIMAL18_2,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CINTEGER, NULLIF(CINTEGER,CBIGINT) from datatypetestm order by cidx; +select cidx, CINTEGER, NULLIF(CINTEGER,CINTEGER) from datatypetestm order by cidx; +select cidx, CINTEGER, NULLIF(CINTEGER,CDOUBLE) from datatypetestm order by cidx; +select cidx, CINTEGER, NULLIF(CINTEGER,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CINTEGER, NULLIF(CINTEGER,1) from datatypetestm order by cidx; +select cidx, CINTEGER, NULLIF(CINTEGER,3.14) from datatypetestm order by cidx; +select cidx, CINTEGER, NULLIF(CINTEGER,CCHAR4) from datatypetestm order by cidx; +select cidx, CINTEGER, NULLIF(CINTEGER,CDATE) from datatypetestm order by cidx; +select cidx, CINTEGER, NULLIF(CINTEGER,NULL) from datatypetestm order by cidx; +select cidx, CINTEGER, NULLIF(CINTEGER,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CSMALLINT, NULLIF(CSMALLINT,CBIGINT) from datatypetestm order by cidx; +select cidx, CSMALLINT, NULLIF(CSMALLINT,CINTEGER) from datatypetestm order by cidx; +select cidx, CSMALLINT, NULLIF(CSMALLINT,CDOUBLE) from datatypetestm order by cidx; +select cidx, CSMALLINT, NULLIF(CSMALLINT,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CSMALLINT, NULLIF(CSMALLINT,1) from datatypetestm order by cidx; +select cidx, CSMALLINT, NULLIF(CSMALLINT,3.14) from datatypetestm order by cidx; +select cidx, CSMALLINT, NULLIF(CSMALLINT,CCHAR4) from datatypetestm order by cidx; +select cidx, CSMALLINT, NULLIF(CSMALLINT,CDATE) from datatypetestm order by cidx; +select cidx, CSMALLINT, NULLIF(CSMALLINT,NULL) from datatypetestm order by cidx; +select cidx, CSMALLINT, NULLIF(CSMALLINT,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CTINYINT, NULLIF(CTINYINT,CBIGINT) from datatypetestm order by cidx; +select cidx, CTINYINT, NULLIF(CTINYINT,CINTEGER) from datatypetestm order by cidx; +select cidx, CTINYINT, NULLIF(CTINYINT,CDOUBLE) from datatypetestm order by cidx; +select cidx, CTINYINT, NULLIF(CTINYINT,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CTINYINT, NULLIF(CTINYINT,1) from datatypetestm order by cidx; +select cidx, CTINYINT, NULLIF(CTINYINT,3.14) from datatypetestm order by cidx; +select cidx, CTINYINT, NULLIF(CTINYINT,CCHAR4) from datatypetestm order by cidx; +select cidx, CTINYINT, NULLIF(CTINYINT,CDATE) from datatypetestm order by cidx; +select cidx, CTINYINT, NULLIF(CTINYINT,NULL) from datatypetestm order by cidx; +select cidx, CTINYINT, NULLIF(CTINYINT,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CDOUBLE, NULLIF(CDOUBLE,CBIGINT) from datatypetestm order by cidx; +select cidx, CDOUBLE, NULLIF(CDOUBLE,CINTEGER) from datatypetestm order by cidx; +select cidx, CDOUBLE, NULLIF(CDOUBLE,CDOUBLE) from datatypetestm order by cidx; +select cidx, CDOUBLE, NULLIF(CDOUBLE,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CDOUBLE, NULLIF(CDOUBLE,1) from datatypetestm order by cidx; +select cidx, CDOUBLE, NULLIF(CDOUBLE,3.14) from datatypetestm order by cidx; +select cidx, CDOUBLE, NULLIF(CDOUBLE,CCHAR4) from datatypetestm order by cidx; +select cidx, CDOUBLE, NULLIF(CDOUBLE,CDATE) from datatypetestm order by cidx; +select cidx, CDOUBLE, NULLIF(CDOUBLE,NULL) from datatypetestm order by cidx; +select cidx, CDOUBLE, NULLIF(CDOUBLE,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CFLOAT, NULLIF(CFLOAT,CBIGINT) from datatypetestm order by cidx; +select cidx, CFLOAT, NULLIF(CFLOAT,CINTEGER) from datatypetestm order by cidx; +select cidx, CFLOAT, NULLIF(CFLOAT,CDOUBLE) from datatypetestm order by cidx; +select cidx, CFLOAT, NULLIF(CFLOAT,CDECIMAL9_2) from datatypetestm order by cidx; +select cidx, CFLOAT, NULLIF(CFLOAT,1) from datatypetestm order by cidx; +select cidx, CFLOAT, NULLIF(CFLOAT,3.14) from datatypetestm order by cidx; +select cidx, CFLOAT, NULLIF(CFLOAT,CCHAR4) from datatypetestm order by cidx; +select cidx, CFLOAT, NULLIF(CFLOAT,CDATE) from datatypetestm order by cidx; +select cidx, CFLOAT, NULLIF(CFLOAT,NULL) from datatypetestm order by cidx; +select cidx, CFLOAT, NULLIF(CFLOAT,'HELLO WORLD') from datatypetestm order by cidx; +select cidx, CBIGINT from datatypetestm order by NULLIF(CBIGINT,CBIGINT), cidx; +select cidx, CBIGINT from datatypetestm order by NULLIF(CBIGINT,CINTEGER), cidx; +select cidx, CBIGINT from datatypetestm order by NULLIF(CBIGINT,CDOUBLE), cidx; +select cidx, CBIGINT from datatypetestm order by NULLIF(CBIGINT,CDECIMAL9_2), cidx; +select cidx, CBIGINT from datatypetestm order by NULLIF(CBIGINT,1), cidx; +select cidx, CBIGINT from datatypetestm order by NULLIF(CBIGINT,3.14), cidx; +select cidx, CBIGINT from datatypetestm order by NULLIF(CBIGINT,CCHAR4), cidx; +select cidx, CBIGINT from datatypetestm order by NULLIF(CBIGINT,CDATE), cidx; +select cidx, CBIGINT from datatypetestm order by NULLIF(CBIGINT,NULL), cidx; +select cidx, CBIGINT from datatypetestm order by NULLIF(CBIGINT,'HELLO WORLD'), cidx; +select cidx, CDECIMAL1 from datatypetestm order by NULLIF(CDECIMAL1,CBIGINT), cidx; +select cidx, CDECIMAL1 from datatypetestm order by NULLIF(CDECIMAL1,CINTEGER), cidx; +select cidx, CDECIMAL1 from datatypetestm order by NULLIF(CDECIMAL1,CDOUBLE), cidx; +select cidx, CDECIMAL1 from datatypetestm order by NULLIF(CDECIMAL1,CDECIMAL9_2), cidx; +select cidx, CDECIMAL1 from datatypetestm order by NULLIF(CDECIMAL1,1), cidx; +select cidx, CDECIMAL1 from datatypetestm order by NULLIF(CDECIMAL1,3.14), cidx; +select cidx, CDECIMAL1 from datatypetestm order by NULLIF(CDECIMAL1,CCHAR4), cidx; +select cidx, CDECIMAL1 from datatypetestm order by NULLIF(CDECIMAL1,CDATE), cidx; +select cidx, CDECIMAL1 from datatypetestm order by NULLIF(CDECIMAL1,NULL), cidx; +select cidx, CDECIMAL1 from datatypetestm order by NULLIF(CDECIMAL1,'HELLO WORLD'), cidx; +select cidx, CDECIMAL4 from datatypetestm order by NULLIF(CDECIMAL4,CBIGINT), cidx; +select cidx, CDECIMAL4 from datatypetestm order by NULLIF(CDECIMAL4,CINTEGER), cidx; +select cidx, CDECIMAL4 from datatypetestm order by NULLIF(CDECIMAL4,CDOUBLE), cidx; +select cidx, CDECIMAL4 from datatypetestm order by NULLIF(CDECIMAL4,CDECIMAL9_2), cidx; +select cidx, CDECIMAL4 from datatypetestm order by NULLIF(CDECIMAL4,1), cidx; +select cidx, CDECIMAL4 from datatypetestm order by NULLIF(CDECIMAL4,3.14), cidx; +select cidx, CDECIMAL4 from datatypetestm order by NULLIF(CDECIMAL4,CCHAR4), cidx; +select cidx, CDECIMAL4 from datatypetestm order by NULLIF(CDECIMAL4,CDATE), cidx; +select cidx, CDECIMAL4 from datatypetestm order by NULLIF(CDECIMAL4,NULL), cidx; +select cidx, CDECIMAL4 from datatypetestm order by NULLIF(CDECIMAL4,'HELLO WORLD'), cidx; +select cidx, CDECIMAL4_2 from datatypetestm order by NULLIF(CDECIMAL4_2,CBIGINT), cidx; +select cidx, CDECIMAL4_2 from datatypetestm order by NULLIF(CDECIMAL4_2,CINTEGER), cidx; +select cidx, CDECIMAL4_2 from datatypetestm order by NULLIF(CDECIMAL4_2,CDOUBLE), cidx; +select cidx, CDECIMAL4_2 from datatypetestm order by NULLIF(CDECIMAL4_2,CDECIMAL9_2), cidx; +select cidx, CDECIMAL4_2 from datatypetestm order by NULLIF(CDECIMAL4_2,1), cidx; +select cidx, CDECIMAL4_2 from datatypetestm order by NULLIF(CDECIMAL4_2,3.14), cidx; +select cidx, CDECIMAL4_2 from datatypetestm order by NULLIF(CDECIMAL4_2,CCHAR4), cidx; +select cidx, CDECIMAL4_2 from datatypetestm order by NULLIF(CDECIMAL4_2,CDATE), cidx; +select cidx, CDECIMAL4_2 from datatypetestm order by NULLIF(CDECIMAL4_2,NULL), cidx; +select cidx, CDECIMAL4_2 from datatypetestm order by NULLIF(CDECIMAL4_2,'HELLO WORLD'), cidx; +select cidx, CDECIMAL5 from datatypetestm order by NULLIF(CDECIMAL5,CBIGINT), cidx; +select cidx, CDECIMAL5 from datatypetestm order by NULLIF(CDECIMAL5,CINTEGER), cidx; +select cidx, CDECIMAL5 from datatypetestm order by NULLIF(CDECIMAL5,CDOUBLE), cidx; +select cidx, CDECIMAL5 from datatypetestm order by NULLIF(CDECIMAL5,CDECIMAL9_2), cidx; +select cidx, CDECIMAL5 from datatypetestm order by NULLIF(CDECIMAL5,1), cidx; +select cidx, CDECIMAL5 from datatypetestm order by NULLIF(CDECIMAL5,3.14), cidx; +select cidx, CDECIMAL5 from datatypetestm order by NULLIF(CDECIMAL5,CCHAR4), cidx; +select cidx, CDECIMAL5 from datatypetestm order by NULLIF(CDECIMAL5,CDATE), cidx; +select cidx, CDECIMAL5 from datatypetestm order by NULLIF(CDECIMAL5,NULL), cidx; +select cidx, CDECIMAL5 from datatypetestm order by NULLIF(CDECIMAL5,'HELLO WORLD'), cidx; +select cidx, CDECIMAL9 from datatypetestm order by NULLIF(CDECIMAL9,CBIGINT), cidx; +select cidx, CDECIMAL9 from datatypetestm order by NULLIF(CDECIMAL9,CINTEGER), cidx; +select cidx, CDECIMAL9 from datatypetestm order by NULLIF(CDECIMAL9,CDOUBLE), cidx; +select cidx, CDECIMAL9 from datatypetestm order by NULLIF(CDECIMAL9,CDECIMAL9_2), cidx; +select cidx, CDECIMAL9 from datatypetestm order by NULLIF(CDECIMAL9,1), cidx; +select cidx, CDECIMAL9 from datatypetestm order by NULLIF(CDECIMAL9,3.14), cidx; +select cidx, CDECIMAL9 from datatypetestm order by NULLIF(CDECIMAL9,CCHAR4), cidx; +select cidx, CDECIMAL9 from datatypetestm order by NULLIF(CDECIMAL9,CDATE), cidx; +select cidx, CDECIMAL9 from datatypetestm order by NULLIF(CDECIMAL9,NULL), cidx; +select cidx, CDECIMAL9 from datatypetestm order by NULLIF(CDECIMAL9,'HELLO WORLD'), cidx; +select cidx, CDECIMAL9_2 from datatypetestm order by NULLIF(CDECIMAL9_2,CBIGINT), cidx; +select cidx, CDECIMAL9_2 from datatypetestm order by NULLIF(CDECIMAL9_2,CINTEGER), cidx; +select cidx, CDECIMAL9_2 from datatypetestm order by NULLIF(CDECIMAL9_2,CDOUBLE), cidx; +select cidx, CDECIMAL9_2 from datatypetestm order by NULLIF(CDECIMAL9_2,CDECIMAL9_2), cidx; +select cidx, CDECIMAL9_2 from datatypetestm order by NULLIF(CDECIMAL9_2,1), cidx; +select cidx, CDECIMAL9_2 from datatypetestm order by NULLIF(CDECIMAL9_2,3.14), cidx; +select cidx, CDECIMAL9_2 from datatypetestm order by NULLIF(CDECIMAL9_2,CCHAR4), cidx; +select cidx, CDECIMAL9_2 from datatypetestm order by NULLIF(CDECIMAL9_2,CDATE), cidx; +select cidx, CDECIMAL9_2 from datatypetestm order by NULLIF(CDECIMAL9_2,NULL), cidx; +select cidx, CDECIMAL9_2 from datatypetestm order by NULLIF(CDECIMAL9_2,'HELLO WORLD'), cidx; +select cidx, CDECIMAL10 from datatypetestm order by NULLIF(CDECIMAL10,CBIGINT), cidx; +select cidx, CDECIMAL10 from datatypetestm order by NULLIF(CDECIMAL10,CINTEGER), cidx; +select cidx, CDECIMAL10 from datatypetestm order by NULLIF(CDECIMAL10,CDOUBLE), cidx; +select cidx, CDECIMAL10 from datatypetestm order by NULLIF(CDECIMAL10,CDECIMAL9_2), cidx; +select cidx, CDECIMAL10 from datatypetestm order by NULLIF(CDECIMAL10,1), cidx; +select cidx, CDECIMAL10 from datatypetestm order by NULLIF(CDECIMAL10,3.14), cidx; +select cidx, CDECIMAL10 from datatypetestm order by NULLIF(CDECIMAL10,CCHAR4), cidx; +select cidx, CDECIMAL10 from datatypetestm order by NULLIF(CDECIMAL10,CDATE), cidx; +select cidx, CDECIMAL10 from datatypetestm order by NULLIF(CDECIMAL10,NULL), cidx; +select cidx, CDECIMAL10 from datatypetestm order by NULLIF(CDECIMAL10,'HELLO WORLD'), cidx; +select cidx, CDECIMAL18 from datatypetestm order by NULLIF(CDECIMAL18,CBIGINT), cidx; +select cidx, CDECIMAL18 from datatypetestm order by NULLIF(CDECIMAL18,CINTEGER), cidx; +select cidx, CDECIMAL18 from datatypetestm order by NULLIF(CDECIMAL18,CDOUBLE), cidx; +select cidx, CDECIMAL18 from datatypetestm order by NULLIF(CDECIMAL18,CDECIMAL9_2), cidx; +select cidx, CDECIMAL18 from datatypetestm order by NULLIF(CDECIMAL18,1), cidx; +select cidx, CDECIMAL18 from datatypetestm order by NULLIF(CDECIMAL18,3.14), cidx; +select cidx, CDECIMAL18 from datatypetestm order by NULLIF(CDECIMAL18,CCHAR4), cidx; +select cidx, CDECIMAL18 from datatypetestm order by NULLIF(CDECIMAL18,CDATE), cidx; +select cidx, CDECIMAL18 from datatypetestm order by NULLIF(CDECIMAL18,NULL), cidx; +select cidx, CDECIMAL18 from datatypetestm order by NULLIF(CDECIMAL18,'HELLO WORLD'), cidx; +select cidx, CDECIMAL18_2 from datatypetestm order by NULLIF(CDECIMAL18_2,CBIGINT), cidx; +select cidx, CDECIMAL18_2 from datatypetestm order by NULLIF(CDECIMAL18_2,CINTEGER), cidx; +select cidx, CDECIMAL18_2 from datatypetestm order by NULLIF(CDECIMAL18_2,CDOUBLE), cidx; +select cidx, CDECIMAL18_2 from datatypetestm order by NULLIF(CDECIMAL18_2,CDECIMAL9_2), cidx; +select cidx, CDECIMAL18_2 from datatypetestm order by NULLIF(CDECIMAL18_2,1), cidx; +select cidx, CDECIMAL18_2 from datatypetestm order by NULLIF(CDECIMAL18_2,3.14), cidx; +select cidx, CDECIMAL18_2 from datatypetestm order by NULLIF(CDECIMAL18_2,CCHAR4), cidx; +select cidx, CDECIMAL18_2 from datatypetestm order by NULLIF(CDECIMAL18_2,CDATE), cidx; +select cidx, CDECIMAL18_2 from datatypetestm order by NULLIF(CDECIMAL18_2,NULL), cidx; +select cidx, CDECIMAL18_2 from datatypetestm order by NULLIF(CDECIMAL18_2,'HELLO WORLD'), cidx; +select cidx, CINTEGER from datatypetestm order by NULLIF(CINTEGER,CBIGINT), cidx; +select cidx, CINTEGER from datatypetestm order by NULLIF(CINTEGER,CINTEGER), cidx; +select cidx, CINTEGER from datatypetestm order by NULLIF(CINTEGER,CDOUBLE), cidx; +select cidx, CINTEGER from datatypetestm order by NULLIF(CINTEGER,CDECIMAL9_2), cidx; +select cidx, CINTEGER from datatypetestm order by NULLIF(CINTEGER,1), cidx; +select cidx, CINTEGER from datatypetestm order by NULLIF(CINTEGER,3.14), cidx; +select cidx, CINTEGER from datatypetestm order by NULLIF(CINTEGER,CCHAR4), cidx; +select cidx, CINTEGER from datatypetestm order by NULLIF(CINTEGER,CDATE), cidx; +select cidx, CINTEGER from datatypetestm order by NULLIF(CINTEGER,NULL), cidx; +select cidx, CINTEGER from datatypetestm order by NULLIF(CINTEGER,'HELLO WORLD'), cidx; +select cidx, CSMALLINT from datatypetestm order by NULLIF(CSMALLINT,CBIGINT), cidx; +select cidx, CSMALLINT from datatypetestm order by NULLIF(CSMALLINT,CINTEGER), cidx; +select cidx, CSMALLINT from datatypetestm order by NULLIF(CSMALLINT,CDOUBLE), cidx; +select cidx, CSMALLINT from datatypetestm order by NULLIF(CSMALLINT,CDECIMAL9_2), cidx; +select cidx, CSMALLINT from datatypetestm order by NULLIF(CSMALLINT,1), cidx; +select cidx, CSMALLINT from datatypetestm order by NULLIF(CSMALLINT,3.14), cidx; +select cidx, CSMALLINT from datatypetestm order by NULLIF(CSMALLINT,CCHAR4), cidx; +select cidx, CSMALLINT from datatypetestm order by NULLIF(CSMALLINT,CDATE), cidx; +select cidx, CSMALLINT from datatypetestm order by NULLIF(CSMALLINT,NULL), cidx; +select cidx, CSMALLINT from datatypetestm order by NULLIF(CSMALLINT,'HELLO WORLD'), cidx; +select cidx, CTINYINT from datatypetestm order by NULLIF(CTINYINT,CBIGINT), cidx; +select cidx, CTINYINT from datatypetestm order by NULLIF(CTINYINT,CINTEGER), cidx; +select cidx, CTINYINT from datatypetestm order by NULLIF(CTINYINT,CDOUBLE), cidx; +select cidx, CTINYINT from datatypetestm order by NULLIF(CTINYINT,CDECIMAL9_2), cidx; +select cidx, CTINYINT from datatypetestm order by NULLIF(CTINYINT,1), cidx; +select cidx, CTINYINT from datatypetestm order by NULLIF(CTINYINT,3.14), cidx; +select cidx, CTINYINT from datatypetestm order by NULLIF(CTINYINT,CCHAR4), cidx; +select cidx, CTINYINT from datatypetestm order by NULLIF(CTINYINT,CDATE), cidx; +select cidx, CTINYINT from datatypetestm order by NULLIF(CTINYINT,NULL), cidx; +select cidx, CTINYINT from datatypetestm order by NULLIF(CTINYINT,'HELLO WORLD'), cidx; +select cidx, CDOUBLE from datatypetestm order by NULLIF(CDOUBLE,CBIGINT), cidx; +select cidx, CDOUBLE from datatypetestm order by NULLIF(CDOUBLE,CINTEGER), cidx; +select cidx, CDOUBLE from datatypetestm order by NULLIF(CDOUBLE,CDOUBLE), cidx; +select cidx, CDOUBLE from datatypetestm order by NULLIF(CDOUBLE,CDECIMAL9_2), cidx; +select cidx, CDOUBLE from datatypetestm order by NULLIF(CDOUBLE,1), cidx; +select cidx, CDOUBLE from datatypetestm order by NULLIF(CDOUBLE,3.14), cidx; +select cidx, CDOUBLE from datatypetestm order by NULLIF(CDOUBLE,CCHAR4), cidx; +select cidx, CDOUBLE from datatypetestm order by NULLIF(CDOUBLE,CDATE), cidx; +select cidx, CDOUBLE from datatypetestm order by NULLIF(CDOUBLE,NULL), cidx; +select cidx, CDOUBLE from datatypetestm order by NULLIF(CDOUBLE,'HELLO WORLD'), cidx; +select cidx, CFLOAT from datatypetestm order by NULLIF(CFLOAT,CBIGINT), cidx; +select cidx, CFLOAT from datatypetestm order by NULLIF(CFLOAT,CINTEGER), cidx; +select cidx, CFLOAT from datatypetestm order by NULLIF(CFLOAT,CDOUBLE), cidx; +select cidx, CFLOAT from datatypetestm order by NULLIF(CFLOAT,CDECIMAL9_2), cidx; +select cidx, CFLOAT from datatypetestm order by NULLIF(CFLOAT,1), cidx; +select cidx, CFLOAT from datatypetestm order by NULLIF(CFLOAT,3.14), cidx; +select cidx, CFLOAT from datatypetestm order by NULLIF(CFLOAT,CCHAR4), cidx; +select cidx, CFLOAT from datatypetestm order by NULLIF(CFLOAT,CDATE), cidx; +select cidx, CFLOAT from datatypetestm order by NULLIF(CFLOAT,NULL), cidx; +select cidx, CFLOAT from datatypetestm order by NULLIF(CFLOAT,'HELLO WORLD'), cidx; +--enable_warnings diff --git a/mysql-test/columnstore/autopilot/t/mcs4445_function_CNXPP_TIME_TO_SEC_DS.test b/mysql-test/columnstore/autopilot/t/mcs4445_function_CNXPP_TIME_TO_SEC_DS.test index 9c3e67138..3ff33635c 100644 --- a/mysql-test/columnstore/autopilot/t/mcs4445_function_CNXPP_TIME_TO_SEC_DS.test +++ b/mysql-test/columnstore/autopilot/t/mcs4445_function_CNXPP_TIME_TO_SEC_DS.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE autopilot; # diff --git a/mysql-test/columnstore/autopilot/t/mcs4445_function_CNXPP_TIME_TO_SEC_DS_maxscale.test b/mysql-test/columnstore/autopilot/t/mcs4445_function_CNXPP_TIME_TO_SEC_DS_maxscale.test new file mode 100644 index 000000000..ab7525955 --- /dev/null +++ b/mysql-test/columnstore/autopilot/t/mcs4445_function_CNXPP_TIME_TO_SEC_DS_maxscale.test @@ -0,0 +1,22 @@ +# -------------------------------------------------------------- # +# Test case migrated from Autopilot functions test suite +# +# Author: Daniel Lee, daniel.lee@mariadb.com +# -------------------------------------------------------------- # +# +--source ../include/have_columnstore.inc +--source ../include/detect_no_maxscale.inc +--disable_warnings +# +USE autopilot; +# +select cidx, CDATE, TIME_TO_SEC(CDATE) from datatypetestm order by cidx; +select cidx, CDATETIME, TIME_TO_SEC(CDATETIME) from datatypetestm order by cidx; +select cidx, CTIME, TIME_TO_SEC(CTIME) from datatypetestm order by cidx; +select cidx, TIME_TO_SEC('22:23:00') from datatypetestm order by cidx; +select cidx, TIME_TO_SEC('00:39:38') from datatypetestm order by cidx; +select cidx, TIME_TO_SEC('22:23:49 999999') from datatypetestm order by cidx; +select cidx, CDATE from datatypetestm order by TIME_TO_SEC(CDATE), cidx; +select cidx, CDATETIME from datatypetestm order by TIME_TO_SEC(CDATETIME), cidx; +select cidx, CTIME from datatypetestm order by TIME_TO_SEC(CTIME), cidx; +--enable_warnings diff --git a/mysql-test/columnstore/devregression/r/mcs7225_regression_MCOL-3721_maxscale.result b/mysql-test/columnstore/devregression/r/mcs7225_regression_MCOL-3721_maxscale.result new file mode 100644 index 000000000..04cce6a8b --- /dev/null +++ b/mysql-test/columnstore/devregression/r/mcs7225_regression_MCOL-3721_maxscale.result @@ -0,0 +1,41 @@ +USE tpch1; +DROP TABLE IF EXISTS test_collate; +CREATE TABLE test_collate (a INT, b INT) ENGINE=columnstore; +INSERT INTO test_collate VALUES (1,2), (2,4); +SELECT a, b FROM test_collate ORDER BY a COLLATE latin1_german2_ci; +a b +1 2 +2 4 +SHOW WARNINGS; +Level Code Message +Note 1618 COLLATE is ignored in ColumnStore +SELECT a, b FROM test_collate ORDER BY a COLLATE latin1_german2_ci DESC; +a b +1 2 +2 4 +SHOW WARNINGS; +Level Code Message +DROP TABLE IF EXISTS test_collate; +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (col1 CHAR(10)) CHARSET latin1 COLLATE latin1_bin ENGINE=columnstore; +INSERT INTO t1 VALUES ('a'), ('1'), ('-1'); +SELECT col1 FROM t1; +col1 +a +1 +-1 +DESCRIBE t1; +Field Type Null Key Default Extra +col1 char(10) YES NULL +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (col1 CHAR(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci) ENGINE=columnstore; +INSERT INTO t1 VALUES ('a'), ('1'), ('-1'); +SELECT col1 FROM t1; +col1 +a +1 +-1 +DESCRIBE t1; +Field Type Null Key Default Extra +col1 char(10) YES NULL +DROP TABLE IF EXISTS t1; diff --git a/mysql-test/columnstore/devregression/t/mcs7225_regression_MCOL-3721.test b/mysql-test/columnstore/devregression/t/mcs7225_regression_MCOL-3721.test index 6b9895fde..0ff3addab 100644 --- a/mysql-test/columnstore/devregression/t/mcs7225_regression_MCOL-3721.test +++ b/mysql-test/columnstore/devregression/t/mcs7225_regression_MCOL-3721.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE tpch1; # diff --git a/mysql-test/columnstore/devregression/t/mcs7225_regression_MCOL-3721_maxscale.test b/mysql-test/columnstore/devregression/t/mcs7225_regression_MCOL-3721_maxscale.test new file mode 100644 index 000000000..d375f8f35 --- /dev/null +++ b/mysql-test/columnstore/devregression/t/mcs7225_regression_MCOL-3721_maxscale.test @@ -0,0 +1,52 @@ +# -------------------------------------------------------------- # +# Test case migrated from regression test suite: MCOL-3721.sql +# +# Author: Daniel Lee, daniel.lee@mariadb.com +# -------------------------------------------------------------- # +# +--source ../include/have_columnstore.inc +--source ../include/detect_no_maxscale.inc +--disable_warnings +# +USE tpch1; +# +#--Test COLLATE in ORDER BY +--disable_warnings +DROP TABLE IF EXISTS test_collate; +--enable_warnings + +CREATE TABLE test_collate (a INT, b INT) ENGINE=columnstore; +INSERT INTO test_collate VALUES (1,2), (2,4); +SELECT a, b FROM test_collate ORDER BY a COLLATE latin1_german2_ci; +SHOW WARNINGS; +SELECT a, b FROM test_collate ORDER BY a COLLATE latin1_german2_ci DESC; +SHOW WARNINGS; + +--disable_warnings +DROP TABLE IF EXISTS test_collate; +--enable_warnings + +#--Test COLLATE in table definition and column definition +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +CREATE TABLE t1 (col1 CHAR(10)) CHARSET latin1 COLLATE latin1_bin ENGINE=columnstore; +INSERT INTO t1 VALUES ('a'), ('1'), ('-1'); +SELECT col1 FROM t1; +DESCRIBE t1; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +CREATE TABLE t1 (col1 CHAR(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci) ENGINE=columnstore; +INSERT INTO t1 VALUES ('a'), ('1'), ('-1'); +SELECT col1 FROM t1; +DESCRIBE t1; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +# + diff --git a/mysql-test/columnstore/oracle/func_concat_oracle_maxscale.result b/mysql-test/columnstore/oracle/func_concat_oracle_maxscale.result index 2efb6daff..cbc2e0c0e 100644 --- a/mysql-test/columnstore/oracle/func_concat_oracle_maxscale.result +++ b/mysql-test/columnstore/oracle/func_concat_oracle_maxscale.result @@ -3,13 +3,9 @@ SET default_storage_engine=ColumnStore; EXPLAIN EXTENDED SELECT 'a'||'b'||'c'; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used -Warnings: -Note 1003 select concat(concat('a','b'),'c') AS "'a'||'b'||'c'" EXPLAIN EXTENDED SELECT CONCAT('a'||'b'||'c'); id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used -Warnings: -Note 1003 select concat(concat(concat('a','b'),'c')) AS "CONCAT('a'||'b'||'c')" SELECT '' || ''; '' || '' @@ -268,13 +264,9 @@ a EXPLAIN EXTENDED SELECT -1<<1||1 AS a FROM DUAL; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used -Warnings: -Note 1003 select -1 << concat(1,1) AS "a" EXPLAIN EXTENDED SELECT -1||0<<1 AS a FROM DUAL; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used -Warnings: -Note 1003 select concat(-1,0) << 1 AS "a" SELECT -1+1||1 AS a FROM DUAL; a 01 @@ -284,13 +276,9 @@ a EXPLAIN EXTENDED SELECT -1+1||1 AS a FROM DUAL; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used -Warnings: -Note 1003 select concat(-1 + 1,1) AS "a" EXPLAIN EXTENDED SELECT -1||0+1 AS a FROM DUAL; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used -Warnings: -Note 1003 select concat(-1,0) + 1 AS "a" SELECT 1*1||-1 AS a FROM DUAL; a 1-1 @@ -300,13 +288,9 @@ a EXPLAIN EXTENDED SELECT 1*1||-1 AS a FROM DUAL; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used -Warnings: -Note 1003 select concat(1 * 1,-1) AS "a" EXPLAIN EXTENDED SELECT 1||1*-1 AS a FROM DUAL; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used -Warnings: -Note 1003 select concat(1,1 * -1) AS "a" SELECT -1^1||1 AS a FROM DUAL; a 184467440737095516141 @@ -316,13 +300,9 @@ a EXPLAIN EXTENDED SELECT -1^1||1 AS a FROM DUAL; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used -Warnings: -Note 1003 select concat(-1 ^ 1,1) AS "a" EXPLAIN EXTENDED SELECT -1||0^1 AS a FROM DUAL; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used -Warnings: -Note 1003 select concat(-1,0 ^ 1) AS "a" # # MDEV-17359 Concatenation operator || in like expression failed in sql_mode=ORACLE # @@ -332,8 +312,6 @@ SELECT 'abc' LIKE 'a'||'%'; EXPLAIN EXTENDED SELECT 'abc' LIKE 'a'||'%'; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used -Warnings: -Note 1003 select 'abc' like concat('a','%') AS "'abc' LIKE 'a'||'%'" SELECT 'x' FROM DUAL WHERE 11 LIKE 1||1; x x @@ -353,37 +331,27 @@ ab EXPLAIN EXTENDED SELECT c1 FROM t1 WHERE c1 LIKE '%'||'b' ORDER BY ord; id select_type table type possible_keys key key_len ref rows filtered Extra 1 PUSHED SELECT NULL NULL NULL NULL NULL NULL NULL NULL NULL -Warnings: -Note 1003 select "test"."t1"."c1" AS "c1" from "test"."t1" where "test"."t1"."c1" like convert(concat('%','b') using utf8mb3) order by "test"."t1"."ord" SELECT c1 FROM t1 WHERE c1 LIKE c2||'%'||'c' ORDER BY ord; c1 abc EXPLAIN EXTENDED SELECT c1 FROM t1 WHERE c1 LIKE c2||'%'||'c' ORDER BY ord; id select_type table type possible_keys key key_len ref rows filtered Extra 1 PUSHED SELECT NULL NULL NULL NULL NULL NULL NULL NULL NULL -Warnings: -Note 1003 select "test"."t1"."c1" AS "c1" from "test"."t1" where "test"."t1"."c1" like concat(concat("test"."t1"."c2",'%'),'c') order by "test"."t1"."ord" SELECT 'x' FROM t1 WHERE c1||c2 LIKE 'aa%'; x x EXPLAIN EXTENDED SELECT 'x' FROM t1 WHERE c1||c2 LIKE 'aa%'; id select_type table type possible_keys key key_len ref rows filtered Extra 1 PUSHED SELECT NULL NULL NULL NULL NULL NULL NULL NULL NULL -Warnings: -Note 1003 select 'x' AS "x" from "test"."t1" where concat("test"."t1"."c1","test"."t1"."c2") like 'aa%' SELECT 'x' FROM t1 WHERE c1||c2 LIKE c2||c1; x x EXPLAIN EXTENDED SELECT 'x' FROM t1 WHERE c1||c2 LIKE c2||c1; id select_type table type possible_keys key key_len ref rows filtered Extra 1 PUSHED SELECT NULL NULL NULL NULL NULL NULL NULL NULL NULL -Warnings: -Note 1003 select 'x' AS "x" from "test"."t1" where concat("test"."t1"."c1","test"."t1"."c2") like concat("test"."t1"."c2","test"."t1"."c1") CREATE VIEW v1 AS SELECT c1, c2, c1 LIKE c2||'_' FROM t1 ORDER BY ord; EXPLAIN EXTENDED SELECT * FROM v1; id select_type table type possible_keys key key_len ref rows filtered Extra 1 PUSHED SELECT NULL NULL NULL NULL NULL NULL NULL NULL NULL -Warnings: -Note 1003 select "test"."t1"."c1" AS "c1","test"."t1"."c2" AS "c2","test"."t1"."c1" like concat("test"."t1"."c2",'_') AS "c1 LIKE c2||'_'" from ("test"."t1") order by "test"."t1"."ord" DROP VIEW v1; DROP TABLE t1; diff --git a/mysql-test/columnstore/oracle/func_concat_oracle_maxscale.test b/mysql-test/columnstore/oracle/func_concat_oracle_maxscale.test index 571564b8e..75c56dc30 100644 --- a/mysql-test/columnstore/oracle/func_concat_oracle_maxscale.test +++ b/mysql-test/columnstore/oracle/func_concat_oracle_maxscale.test @@ -11,7 +11,6 @@ SET default_storage_engine=ColumnStore; --disable_query_log --disable_warnings DROP VIEW IF EXISTS v1; ---enable_warnings --enable_query_log @@ -197,3 +196,4 @@ EXPLAIN EXTENDED SELECT * FROM v1; DROP VIEW v1; DROP TABLE t1; +--enable_warnings diff --git a/mysql-test/columnstore/oracle/func_decode_oracle.test b/mysql-test/columnstore/oracle/func_decode_oracle.test index 2d381b999..9d044a6f0 100644 --- a/mysql-test/columnstore/oracle/func_decode_oracle.test +++ b/mysql-test/columnstore/oracle/func_decode_oracle.test @@ -1,3 +1,6 @@ +--source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc + SET sql_mode=ORACLE; SET default_storage_engine=ColumnStore; diff --git a/mysql-test/columnstore/oracle/func_decode_oracle_maxscale.result b/mysql-test/columnstore/oracle/func_decode_oracle_maxscale.result new file mode 100644 index 000000000..61890127d --- /dev/null +++ b/mysql-test/columnstore/oracle/func_decode_oracle_maxscale.result @@ -0,0 +1,161 @@ +SET sql_mode=ORACLE; +SET default_storage_engine=ColumnStore; +SELECT DECODE(10); +ERROR 42000: Incorrect parameter count in the call to native function 'DECODE' +SELECT DECODE(10,10); +ERROR 42000: Incorrect parameter count in the call to native function 'DECODE' +SELECT DECODE(10,10,'x10'); +DECODE(10,10,'x10') +x10 +SELECT DECODE(11,10,'x10'); +DECODE(11,10,'x10') +NULL +SELECT DECODE(10,10,'x10','def'); +DECODE(10,10,'x10','def') +x10 +SELECT DECODE(11,10,'x10','def'); +DECODE(11,10,'x10','def') +def +SELECT DECODE(10,10,'x10',11,'x11','def'); +DECODE(10,10,'x10',11,'x11','def') +x10 +SELECT DECODE(11,10,'x10',11,'x11','def'); +DECODE(11,10,'x10',11,'x11','def') +x11 +SELECT DECODE(12,10,'x10',11,'x11','def'); +DECODE(12,10,'x10',11,'x11','def') +def +EXPLAIN EXTENDED SELECT DECODE(12,10,'x10',11,'x11','def'); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +CREATE TABLE decode (decode int); +DROP TABLE decode; +# +# MDEV-13863 sql_mode=ORACLE: DECODE does not treat two NULLs as equivalent +# +SELECT DECODE(10); +ERROR 42000: Incorrect parameter count in the call to native function 'DECODE' +SELECT DECODE(10,10); +ERROR 42000: Incorrect parameter count in the call to native function 'DECODE' +SELECT DECODE_ORACLE(10); +ERROR 42000: Incorrect parameter count in the call to native function 'DECODE_ORACLE' +SELECT DECODE_ORACLE(10,10); +ERROR 42000: Incorrect parameter count in the call to native function 'DECODE_ORACLE' +EXPLAIN EXTENDED SELECT DECODE(12,10,'x10',11,'x11'); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +EXPLAIN EXTENDED SELECT DECODE(12,10,'x10',11,'x11','def'); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +EXPLAIN EXTENDED SELECT DECODE_ORACLE(12,10,'x10',11,'x11'); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +EXPLAIN EXTENDED SELECT DECODE_ORACLE(12,10,'x10',11,'x11','def'); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +CREATE TABLE t1 (a INT); +CREATE VIEW v1 AS +SELECT +DECODE(a,1,'x1',NULL,'xNULL') AS d1, +DECODE(a,1,'x1',NULL,'xNULL','xELSE') AS d2, +DECODE_ORACLE(a,1,'x1',NULL,'xNULL') AS d3, +DECODE_ORACLE(a,1,'x1',NULL,'xNULL','xELSE') AS d4 +FROM t1; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE VIEW "v1" AS select decode("t1"."a",1,'x1',NULL,'xNULL') AS "d1",decode("t1"."a",1,'x1',NULL,'xNULL','xELSE') AS "d2",decode("t1"."a",1,'x1',NULL,'xNULL') AS "d3",decode("t1"."a",1,'x1',NULL,'xNULL','xELSE') AS "d4" from "t1" latin1 latin1_swedish_ci +DROP VIEW v1; +DROP TABLE t1; +SELECT DECODE(TIME'10:20:31','10:20:31','then1','10:20:32','then2','def'); +DECODE(TIME'10:20:31','10:20:31','then1','10:20:32','then2','def') +then1 +SELECT DECODE(TIME'10:20:32','10:20:31','then1','10:20:32','then2','def'); +DECODE(TIME'10:20:32','10:20:31','then1','10:20:32','then2','def') +then2 +SELECT DECODE(TIME'10:20:33','10:20:31','then1',NULL,'then2NULL','10:20:33','then3','def'); +DECODE(TIME'10:20:33','10:20:31','then1',NULL,'then2NULL','10:20:33','then3','def') +then3 +SELECT DECODE(NULL,TIME'10:20:31','then1',NULL,'then2NULL','10:20:33','then3','def'); +DECODE(NULL,TIME'10:20:31','then1',NULL,'then2NULL','10:20:33','then3','def') +then2NULL +SELECT DECODE(TIMESTAMP'2001-01-01 10:20:31','2001-01-01 10:20:31','then1','2001-01-01 10:20:32','then2','def'); +DECODE(TIMESTAMP'2001-01-01 10:20:31','2001-01-01 10:20:31','then1','2001-01-01 10:20:32','then2','def') +then1 +SELECT DECODE(TIMESTAMP'2001-01-01 10:20:32','2001-01-01 10:20:31','then1','2001-01-01 10:20:32','then2','def'); +DECODE(TIMESTAMP'2001-01-01 10:20:32','2001-01-01 10:20:31','then1','2001-01-01 10:20:32','then2','def') +then2 +SELECT DECODE(TIMESTAMP'2001-01-01 10:20:33','2001-01-01 10:20:31','then1',NULL,'then2NULL','2001-01-01 10:20:33','then3','def'); +DECODE(TIMESTAMP'2001-01-01 10:20:33','2001-01-01 10:20:31','then1',NULL,'then2NULL','2001-01-01 10:20:33','then3','def') +then3 +SELECT DECODE(NULL,TIMESTAMP'2001-01-01 10:20:31','then1',NULL,'then2NULL','2001-01-01 10:20:33','then3','def'); +DECODE(NULL,TIMESTAMP'2001-01-01 10:20:31','then1',NULL,'then2NULL','2001-01-01 10:20:33','then3','def') +then2NULL +SELECT DECODE('w1','w1','then1','w2','then2','def'); +DECODE('w1','w1','then1','w2','then2','def') +then1 +SELECT DECODE('w2','w1','then1','w2','then2','def'); +DECODE('w2','w1','then1','w2','then2','def') +then2 +SELECT DECODE('w3','w1','then1',NULL,'then2NULL','w3','then3','def'); +DECODE('w3','w1','then1',NULL,'then2NULL','w3','then3','def') +then3 +SELECT DECODE(NULL,'w1','then1',NULL,'then2NULL','w3','then3','def'); +DECODE(NULL,'w1','then1',NULL,'then2NULL','w3','then3','def') +then2NULL +SELECT DECODE(1,1,'then1',2,'then2','def'); +DECODE(1,1,'then1',2,'then2','def') +then1 +SELECT DECODE(2,1,'then1',2,'then2','def'); +DECODE(2,1,'then1',2,'then2','def') +then2 +SELECT DECODE(3,1,'then1',NULL,'then2NULL',3,'then3','def'); +DECODE(3,1,'then1',NULL,'then2NULL',3,'then3','def') +then3 +SELECT DECODE(NULL,1,'then1',NULL,'then2NULL',3,'then3','def'); +DECODE(NULL,1,'then1',NULL,'then2NULL',3,'then3','def') +then2NULL +SELECT DECODE(CAST(NULL AS SIGNED),1,'then1',NULL,'then2NULL',3,'then3','def'); +DECODE(CAST(NULL AS SIGNED),1,'then1',NULL,'then2NULL',3,'then3','def') +then2NULL +SELECT DECODE(1.0,1.0,'then1',2.0,'then2','def'); +DECODE(1.0,1.0,'then1',2.0,'then2','def') +then1 +SELECT DECODE(2.0,1.0,'then1',2.0,'then2','def'); +DECODE(2.0,1.0,'then1',2.0,'then2','def') +then2 +SELECT DECODE(3.0,1.0,'then1',NULL,'then2NULL',3.0,'then3','def'); +DECODE(3.0,1.0,'then1',NULL,'then2NULL',3.0,'then3','def') +then3 +SELECT DECODE(NULL,1.0,'then1',NULL,'then2NULL',3.0,'then3','def'); +DECODE(NULL,1.0,'then1',NULL,'then2NULL',3.0,'then3','def') +then2NULL +SELECT DECODE(CAST(NULL AS DECIMAL),1.0,'then1',NULL,'then2NULL',3.0,'then3','def'); +DECODE(CAST(NULL AS DECIMAL),1.0,'then1',NULL,'then2NULL',3.0,'then3','def') +then2NULL +SELECT DECODE(1e0,1e0,'then1',2e0,'then2','def'); +DECODE(1e0,1e0,'then1',2e0,'then2','def') +then1 +SELECT DECODE(2e0,1e0,'then1',2e0,'then2','def'); +DECODE(2e0,1e0,'then1',2e0,'then2','def') +then2 +SELECT DECODE(3e0,1e0,'then1',NULL,'then2NULL',3e0,'then3','def'); +DECODE(3e0,1e0,'then1',NULL,'then2NULL',3e0,'then3','def') +then3 +SELECT DECODE(NULL,1e0,'then1',NULL,'then2NULL',3e0,'then3','def'); +DECODE(NULL,1e0,'then1',NULL,'then2NULL',3e0,'then3','def') +then2NULL +SELECT DECODE(CAST(NULL AS DOUBLE),1e0,'then1',NULL,'then2NULL',3e0,'then3','def'); +DECODE(CAST(NULL AS DOUBLE),1e0,'then1',NULL,'then2NULL',3e0,'then3','def') +then2NULL +SELECT DECODE(NULL,NULL,1,2) FROM DUAL; +DECODE(NULL,NULL,1,2) +1 +SELECT DECODE(NULL,10,10,NULL,1,2) FROM DUAL; +DECODE(NULL,10,10,NULL,1,2) +1 +SELECT DECODE_ORACLE(NULL,NULL,1,2) FROM DUAL; +DECODE_ORACLE(NULL,NULL,1,2) +1 +SELECT DECODE_ORACLE(NULL,10,10,NULL,1,2) FROM DUAL; +DECODE_ORACLE(NULL,10,10,NULL,1,2) +1 diff --git a/mysql-test/columnstore/oracle/func_decode_oracle_maxscale.test b/mysql-test/columnstore/oracle/func_decode_oracle_maxscale.test new file mode 100644 index 000000000..bef5cac4b --- /dev/null +++ b/mysql-test/columnstore/oracle/func_decode_oracle_maxscale.test @@ -0,0 +1,104 @@ +--source ../include/have_columnstore.inc +--source ../include/detect_no_maxscale.inc + +SET sql_mode=ORACLE; +SET default_storage_engine=ColumnStore; + +--disable_query_log +--disable_warnings +DROP VIEW IF EXISTS v1; +--enable_query_log + +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT DECODE(10); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT DECODE(10,10); + +SELECT DECODE(10,10,'x10'); +SELECT DECODE(11,10,'x10'); + +SELECT DECODE(10,10,'x10','def'); +SELECT DECODE(11,10,'x10','def'); + +SELECT DECODE(10,10,'x10',11,'x11','def'); +SELECT DECODE(11,10,'x10',11,'x11','def'); +SELECT DECODE(12,10,'x10',11,'x11','def'); + +EXPLAIN EXTENDED SELECT DECODE(12,10,'x10',11,'x11','def'); + +CREATE TABLE decode (decode int); +DROP TABLE decode; + + +--echo # +--echo # MDEV-13863 sql_mode=ORACLE: DECODE does not treat two NULLs as equivalent +--echo # + +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT DECODE(10); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT DECODE(10,10); + +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT DECODE_ORACLE(10); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT DECODE_ORACLE(10,10); + + +EXPLAIN EXTENDED SELECT DECODE(12,10,'x10',11,'x11'); +EXPLAIN EXTENDED SELECT DECODE(12,10,'x10',11,'x11','def'); +EXPLAIN EXTENDED SELECT DECODE_ORACLE(12,10,'x10',11,'x11'); +EXPLAIN EXTENDED SELECT DECODE_ORACLE(12,10,'x10',11,'x11','def'); + +CREATE TABLE t1 (a INT); +CREATE VIEW v1 AS + SELECT + DECODE(a,1,'x1',NULL,'xNULL') AS d1, + DECODE(a,1,'x1',NULL,'xNULL','xELSE') AS d2, + DECODE_ORACLE(a,1,'x1',NULL,'xNULL') AS d3, + DECODE_ORACLE(a,1,'x1',NULL,'xNULL','xELSE') AS d4 + FROM t1; +SHOW CREATE VIEW v1; +DROP VIEW v1; +DROP TABLE t1; + +SELECT DECODE(TIME'10:20:31','10:20:31','then1','10:20:32','then2','def'); +SELECT DECODE(TIME'10:20:32','10:20:31','then1','10:20:32','then2','def'); +SELECT DECODE(TIME'10:20:33','10:20:31','then1',NULL,'then2NULL','10:20:33','then3','def'); +SELECT DECODE(NULL,TIME'10:20:31','then1',NULL,'then2NULL','10:20:33','then3','def'); + +SELECT DECODE(TIMESTAMP'2001-01-01 10:20:31','2001-01-01 10:20:31','then1','2001-01-01 10:20:32','then2','def'); +SELECT DECODE(TIMESTAMP'2001-01-01 10:20:32','2001-01-01 10:20:31','then1','2001-01-01 10:20:32','then2','def'); +SELECT DECODE(TIMESTAMP'2001-01-01 10:20:33','2001-01-01 10:20:31','then1',NULL,'then2NULL','2001-01-01 10:20:33','then3','def'); +SELECT DECODE(NULL,TIMESTAMP'2001-01-01 10:20:31','then1',NULL,'then2NULL','2001-01-01 10:20:33','then3','def'); + +SELECT DECODE('w1','w1','then1','w2','then2','def'); +SELECT DECODE('w2','w1','then1','w2','then2','def'); +SELECT DECODE('w3','w1','then1',NULL,'then2NULL','w3','then3','def'); +SELECT DECODE(NULL,'w1','then1',NULL,'then2NULL','w3','then3','def'); + +SELECT DECODE(1,1,'then1',2,'then2','def'); +SELECT DECODE(2,1,'then1',2,'then2','def'); +SELECT DECODE(3,1,'then1',NULL,'then2NULL',3,'then3','def'); +SELECT DECODE(NULL,1,'then1',NULL,'then2NULL',3,'then3','def'); +SELECT DECODE(CAST(NULL AS SIGNED),1,'then1',NULL,'then2NULL',3,'then3','def'); + +SELECT DECODE(1.0,1.0,'then1',2.0,'then2','def'); +SELECT DECODE(2.0,1.0,'then1',2.0,'then2','def'); +SELECT DECODE(3.0,1.0,'then1',NULL,'then2NULL',3.0,'then3','def'); +SELECT DECODE(NULL,1.0,'then1',NULL,'then2NULL',3.0,'then3','def'); +SELECT DECODE(CAST(NULL AS DECIMAL),1.0,'then1',NULL,'then2NULL',3.0,'then3','def'); + +SELECT DECODE(1e0,1e0,'then1',2e0,'then2','def'); +SELECT DECODE(2e0,1e0,'then1',2e0,'then2','def'); +SELECT DECODE(3e0,1e0,'then1',NULL,'then2NULL',3e0,'then3','def'); +SELECT DECODE(NULL,1e0,'then1',NULL,'then2NULL',3e0,'then3','def'); +SELECT DECODE(CAST(NULL AS DOUBLE),1e0,'then1',NULL,'then2NULL',3e0,'then3','def'); + +SELECT DECODE(NULL,NULL,1,2) FROM DUAL; +SELECT DECODE(NULL,10,10,NULL,1,2) FROM DUAL; + +SELECT DECODE_ORACLE(NULL,NULL,1,2) FROM DUAL; +SELECT DECODE_ORACLE(NULL,10,10,NULL,1,2) FROM DUAL; +--enable_warnings + From 1640e870581e550c7e298c4adb38b1816eb039be Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Mon, 9 Jun 2025 12:42:30 +0300 Subject: [PATCH 22/79] disable tests incompatible with Maxscale --- .../autopilot/t/mcs6721_json_JSON_ARRAY.test | 1 + .../r/MCOL-5744-utf8-in-ddl_maxscale.result | 19 +++++++++++ .../basic/t/MCOL-5744-utf8-in-ddl.test | 3 ++ .../t/MCOL-5744-utf8-in-ddl_maxscale.test | 22 +++++++++++++ .../t/ctype_cmp_char1_latin1_swedish_ci.test | 1 + .../columnstore/basic/t/func_sec_to_time.test | 1 + ...s7225_regression_MCOL-3721_maxscale.result | 5 --- .../t/mcs7062_regression_bug3274.test | 1 + .../t/mcs7132_regression_bug3952.test | 1 + .../t/mcs7168_regression_bug5173.test | 1 + ...mcs7225_regression_MCOL-3721_maxscale.test | 2 -- .../t/mcs7236_regression_MCOL-736.test | 1 + ...cs7522_storedProcedures_sp_autoswitch.test | 1 + .../oracle/func_replace_oracle.test | 4 +++ .../func_replace_oracle_maxscale.result | 31 +++++++++++++++++ .../oracle/func_replace_oracle_maxscale.test | 33 +++++++++++++++++++ .../columnstore/oracle/func_trim_oracle.test | 3 ++ 17 files changed, 123 insertions(+), 7 deletions(-) create mode 100644 mysql-test/columnstore/basic/r/MCOL-5744-utf8-in-ddl_maxscale.result create mode 100644 mysql-test/columnstore/basic/t/MCOL-5744-utf8-in-ddl_maxscale.test create mode 100644 mysql-test/columnstore/oracle/func_replace_oracle_maxscale.result create mode 100644 mysql-test/columnstore/oracle/func_replace_oracle_maxscale.test diff --git a/mysql-test/columnstore/autopilot/t/mcs6721_json_JSON_ARRAY.test b/mysql-test/columnstore/autopilot/t/mcs6721_json_JSON_ARRAY.test index 1670af8ef..c0a196da9 100644 --- a/mysql-test/columnstore/autopilot/t/mcs6721_json_JSON_ARRAY.test +++ b/mysql-test/columnstore/autopilot/t/mcs6721_json_JSON_ARRAY.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE autopilot; # diff --git a/mysql-test/columnstore/basic/r/MCOL-5744-utf8-in-ddl_maxscale.result b/mysql-test/columnstore/basic/r/MCOL-5744-utf8-in-ddl_maxscale.result new file mode 100644 index 000000000..0d59e20a1 --- /dev/null +++ b/mysql-test/columnstore/basic/r/MCOL-5744-utf8-in-ddl_maxscale.result @@ -0,0 +1,19 @@ +DROP DATABASE IF EXISTS MCOL5744; +CREATE DATABASE MCOL5744; +SET old_mode=''; +CREATE TABLE t(x text CHARACTER SET utf8 COLLATE utf8_general_ci) ENGINE=COLUMNSTORE; +SHOW CREATE TABLE t; +Table Create Table +t CREATE TABLE `t` ( + `x` text DEFAULT NULL +) ENGINE=Columnstore DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci +DROP TABLE t; +SET old_mode='UTF8_IS_UTF8MB3'; +CREATE TABLE t(x text CHARACTER SET utf8 COLLATE utf8_general_ci) ENGINE=COLUMNSTORE; +SHOW CREATE TABLE t; +Table Create Table +t CREATE TABLE `t` ( + `x` text DEFAULT NULL +) ENGINE=Columnstore DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci +DROP TABLE t; +DROP DATABASE MCOL5744; diff --git a/mysql-test/columnstore/basic/t/MCOL-5744-utf8-in-ddl.test b/mysql-test/columnstore/basic/t/MCOL-5744-utf8-in-ddl.test index a8d0eb9a5..60713bdc3 100644 --- a/mysql-test/columnstore/basic/t/MCOL-5744-utf8-in-ddl.test +++ b/mysql-test/columnstore/basic/t/MCOL-5744-utf8-in-ddl.test @@ -1,3 +1,6 @@ +--source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc + --disable_warnings DROP DATABASE IF EXISTS MCOL5744; --enable_warnings diff --git a/mysql-test/columnstore/basic/t/MCOL-5744-utf8-in-ddl_maxscale.test b/mysql-test/columnstore/basic/t/MCOL-5744-utf8-in-ddl_maxscale.test new file mode 100644 index 000000000..4fc349088 --- /dev/null +++ b/mysql-test/columnstore/basic/t/MCOL-5744-utf8-in-ddl_maxscale.test @@ -0,0 +1,22 @@ +--source ../include/have_columnstore.inc +--source ../include/detect_no_maxscale.inc + +--disable_warnings +DROP DATABASE IF EXISTS MCOL5744; +--enable_warnings + +CREATE DATABASE MCOL5744; + +SET old_mode=''; + +CREATE TABLE t(x text CHARACTER SET utf8 COLLATE utf8_general_ci) ENGINE=COLUMNSTORE; +SHOW CREATE TABLE t; +DROP TABLE t; + +SET old_mode='UTF8_IS_UTF8MB3'; + +CREATE TABLE t(x text CHARACTER SET utf8 COLLATE utf8_general_ci) ENGINE=COLUMNSTORE; +SHOW CREATE TABLE t; +DROP TABLE t; + +DROP DATABASE MCOL5744; diff --git a/mysql-test/columnstore/basic/t/ctype_cmp_char1_latin1_swedish_ci.test b/mysql-test/columnstore/basic/t/ctype_cmp_char1_latin1_swedish_ci.test index 01d1ca583..b81d5cd7e 100644 --- a/mysql-test/columnstore/basic/t/ctype_cmp_char1_latin1_swedish_ci.test +++ b/mysql-test/columnstore/basic/t/ctype_cmp_char1_latin1_swedish_ci.test @@ -1,4 +1,5 @@ --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --source ctype_cmp_combinations.inc --source ctype_cmp_create.inc diff --git a/mysql-test/columnstore/basic/t/func_sec_to_time.test b/mysql-test/columnstore/basic/t/func_sec_to_time.test index e9524a639..e51506658 100644 --- a/mysql-test/columnstore/basic/t/func_sec_to_time.test +++ b/mysql-test/columnstore/basic/t/func_sec_to_time.test @@ -1,4 +1,5 @@ --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc --source ../include/combinations.myisam-columnstore.inc --echo # diff --git a/mysql-test/columnstore/devregression/r/mcs7225_regression_MCOL-3721_maxscale.result b/mysql-test/columnstore/devregression/r/mcs7225_regression_MCOL-3721_maxscale.result index 04cce6a8b..ff5650ed4 100644 --- a/mysql-test/columnstore/devregression/r/mcs7225_regression_MCOL-3721_maxscale.result +++ b/mysql-test/columnstore/devregression/r/mcs7225_regression_MCOL-3721_maxscale.result @@ -6,15 +6,10 @@ SELECT a, b FROM test_collate ORDER BY a COLLATE latin1_german2_ci; a b 1 2 2 4 -SHOW WARNINGS; -Level Code Message -Note 1618 COLLATE is ignored in ColumnStore SELECT a, b FROM test_collate ORDER BY a COLLATE latin1_german2_ci DESC; a b 1 2 2 4 -SHOW WARNINGS; -Level Code Message DROP TABLE IF EXISTS test_collate; DROP TABLE IF EXISTS t1; CREATE TABLE t1 (col1 CHAR(10)) CHARSET latin1 COLLATE latin1_bin ENGINE=columnstore; diff --git a/mysql-test/columnstore/devregression/t/mcs7062_regression_bug3274.test b/mysql-test/columnstore/devregression/t/mcs7062_regression_bug3274.test index ed3088efa..e64cabda8 100644 --- a/mysql-test/columnstore/devregression/t/mcs7062_regression_bug3274.test +++ b/mysql-test/columnstore/devregression/t/mcs7062_regression_bug3274.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE tpch1; # diff --git a/mysql-test/columnstore/devregression/t/mcs7132_regression_bug3952.test b/mysql-test/columnstore/devregression/t/mcs7132_regression_bug3952.test index ff93cabc9..8010fffa5 100644 --- a/mysql-test/columnstore/devregression/t/mcs7132_regression_bug3952.test +++ b/mysql-test/columnstore/devregression/t/mcs7132_regression_bug3952.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE tpch1; # diff --git a/mysql-test/columnstore/devregression/t/mcs7168_regression_bug5173.test b/mysql-test/columnstore/devregression/t/mcs7168_regression_bug5173.test index 4f3ba58d6..1267679c7 100644 --- a/mysql-test/columnstore/devregression/t/mcs7168_regression_bug5173.test +++ b/mysql-test/columnstore/devregression/t/mcs7168_regression_bug5173.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE tpch1; # diff --git a/mysql-test/columnstore/devregression/t/mcs7225_regression_MCOL-3721_maxscale.test b/mysql-test/columnstore/devregression/t/mcs7225_regression_MCOL-3721_maxscale.test index d375f8f35..fe93e2705 100644 --- a/mysql-test/columnstore/devregression/t/mcs7225_regression_MCOL-3721_maxscale.test +++ b/mysql-test/columnstore/devregression/t/mcs7225_regression_MCOL-3721_maxscale.test @@ -18,9 +18,7 @@ DROP TABLE IF EXISTS test_collate; CREATE TABLE test_collate (a INT, b INT) ENGINE=columnstore; INSERT INTO test_collate VALUES (1,2), (2,4); SELECT a, b FROM test_collate ORDER BY a COLLATE latin1_german2_ci; -SHOW WARNINGS; SELECT a, b FROM test_collate ORDER BY a COLLATE latin1_german2_ci DESC; -SHOW WARNINGS; --disable_warnings DROP TABLE IF EXISTS test_collate; diff --git a/mysql-test/columnstore/devregression/t/mcs7236_regression_MCOL-736.test b/mysql-test/columnstore/devregression/t/mcs7236_regression_MCOL-736.test index 4aa7a1d53..dd534dfe8 100644 --- a/mysql-test/columnstore/devregression/t/mcs7236_regression_MCOL-736.test +++ b/mysql-test/columnstore/devregression/t/mcs7236_regression_MCOL-736.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE tpch1; # diff --git a/mysql-test/columnstore/devregression/t/mcs7522_storedProcedures_sp_autoswitch.test b/mysql-test/columnstore/devregression/t/mcs7522_storedProcedures_sp_autoswitch.test index 79499751f..d5750d20d 100644 --- a/mysql-test/columnstore/devregression/t/mcs7522_storedProcedures_sp_autoswitch.test +++ b/mysql-test/columnstore/devregression/t/mcs7522_storedProcedures_sp_autoswitch.test @@ -6,6 +6,7 @@ # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc USE tpch1; diff --git a/mysql-test/columnstore/oracle/func_replace_oracle.test b/mysql-test/columnstore/oracle/func_replace_oracle.test index dbc43da92..d66f5437e 100644 --- a/mysql-test/columnstore/oracle/func_replace_oracle.test +++ b/mysql-test/columnstore/oracle/func_replace_oracle.test @@ -2,6 +2,10 @@ # Testing replace with null args # +--source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc + + SET sql_mode=ORACLE; SET default_storage_engine=ColumnStore; --echo # diff --git a/mysql-test/columnstore/oracle/func_replace_oracle_maxscale.result b/mysql-test/columnstore/oracle/func_replace_oracle_maxscale.result new file mode 100644 index 000000000..0f5bd66e8 --- /dev/null +++ b/mysql-test/columnstore/oracle/func_replace_oracle_maxscale.result @@ -0,0 +1,31 @@ +SET sql_mode=ORACLE; +SET default_storage_engine=ColumnStore; +# +# MDEV-13003 - Oracle compatibility : Replace function +# +SELECT REPLACE(null,'a','b') ; +REPLACE(null,'a','b') +NULL +SELECT REPLACE('ab',null,'b') ; +REPLACE('ab',null,'b') +ab +SELECT REPLACE('ab','a',null) ; +REPLACE('ab','a',null) +b +SELECT REPLACE('ab',null,null) ; +REPLACE('ab',null,null) +ab +SELECT REPLACE('aaa','a',null) ; +REPLACE('aaa','a',null) +NULL +EXPLAIN EXTENDED SELECT REPLACE('ab','a',null) ; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +CREATE VIEW v1 AS SELECT REPLACE('ab','a',null) ; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE VIEW "v1" AS select replace('ab','a',NULL) AS "REPLACE('ab','a',null)" latin1 latin1_swedish_ci +SELECT * FROM v1; +REPLACE('ab','a',null) +b +DROP VIEW v1; diff --git a/mysql-test/columnstore/oracle/func_replace_oracle_maxscale.test b/mysql-test/columnstore/oracle/func_replace_oracle_maxscale.test new file mode 100644 index 000000000..ac523805f --- /dev/null +++ b/mysql-test/columnstore/oracle/func_replace_oracle_maxscale.test @@ -0,0 +1,33 @@ +# +# Testing replace with null args +# + +--source ../include/have_columnstore.inc +--source ../include/detect_no_maxscale.inc + + +SET sql_mode=ORACLE; +SET default_storage_engine=ColumnStore; +--echo # +--echo # MDEV-13003 - Oracle compatibility : Replace function +--echo # + +--disable_query_log +--disable_warnings +DROP VIEW IF EXISTS v1; +--enable_query_log + + +SELECT REPLACE(null,'a','b') ; +SELECT REPLACE('ab',null,'b') ; +SELECT REPLACE('ab','a',null) ; +SELECT REPLACE('ab',null,null) ; +SELECT REPLACE('aaa','a',null) ; + +EXPLAIN EXTENDED SELECT REPLACE('ab','a',null) ; + +CREATE VIEW v1 AS SELECT REPLACE('ab','a',null) ; +SHOW CREATE VIEW v1; +SELECT * FROM v1; +DROP VIEW v1; +--enable_warnings diff --git a/mysql-test/columnstore/oracle/func_trim_oracle.test b/mysql-test/columnstore/oracle/func_trim_oracle.test index 0ce44a110..b30ecba80 100644 --- a/mysql-test/columnstore/oracle/func_trim_oracle.test +++ b/mysql-test/columnstore/oracle/func_trim_oracle.test @@ -1,3 +1,6 @@ +--source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc + SET sql_mode=ORACLE; SET default_storage_engine=ColumnStore; From 7fd29de377b02f79204bbff04da939cf63d88fe0 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Tue, 10 Jun 2025 18:42:42 +0300 Subject: [PATCH 23/79] More disable tests in case of testing via Maxscale --- mysql-test/columnstore/basic/t/mcs11_show_db_table.test | 1 + .../devregression/t/mcs7139_regression_bug4074.test | 1 + .../devregression/t/mcs7147_regression_bug4388.test | 1 + .../devregression/t/mcs7167_regression_bug5133.test | 1 + .../devregression/t/mcs7199_regression_MCOL-128.test | 2 ++ .../devregression/t/mcs7208_regression_MCOL-1989.test | 1 + .../devregression/t/mcs7213_regression_MCOL-2225.test | 1 + .../t/mcs7225_regression_MCOL-3721_maxscale.test | 8 -------- .../columnstore/oracle/func_decode_oracle_maxscale.result | 3 --- .../columnstore/oracle/func_decode_oracle_maxscale.test | 1 - 10 files changed, 8 insertions(+), 12 deletions(-) diff --git a/mysql-test/columnstore/basic/t/mcs11_show_db_table.test b/mysql-test/columnstore/basic/t/mcs11_show_db_table.test index 2d90ca47d..f5469d63d 100644 --- a/mysql-test/columnstore/basic/t/mcs11_show_db_table.test +++ b/mysql-test/columnstore/basic/t/mcs11_show_db_table.test @@ -2,6 +2,7 @@ #This test verifies show databases and tables with engine=columnstore. # -- source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc -- source include/have_innodb.inc -- source ../include/check_maxscale.inc diff --git a/mysql-test/columnstore/devregression/t/mcs7139_regression_bug4074.test b/mysql-test/columnstore/devregression/t/mcs7139_regression_bug4074.test index 60bdc4486..817d6637a 100644 --- a/mysql-test/columnstore/devregression/t/mcs7139_regression_bug4074.test +++ b/mysql-test/columnstore/devregression/t/mcs7139_regression_bug4074.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE tpch1; # diff --git a/mysql-test/columnstore/devregression/t/mcs7147_regression_bug4388.test b/mysql-test/columnstore/devregression/t/mcs7147_regression_bug4388.test index e2f549960..17250b722 100644 --- a/mysql-test/columnstore/devregression/t/mcs7147_regression_bug4388.test +++ b/mysql-test/columnstore/devregression/t/mcs7147_regression_bug4388.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE tpch1; # diff --git a/mysql-test/columnstore/devregression/t/mcs7167_regression_bug5133.test b/mysql-test/columnstore/devregression/t/mcs7167_regression_bug5133.test index 2241f7939..863c31205 100644 --- a/mysql-test/columnstore/devregression/t/mcs7167_regression_bug5133.test +++ b/mysql-test/columnstore/devregression/t/mcs7167_regression_bug5133.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE tpch1; # diff --git a/mysql-test/columnstore/devregression/t/mcs7199_regression_MCOL-128.test b/mysql-test/columnstore/devregression/t/mcs7199_regression_MCOL-128.test index 1991ca0b1..f2f02c163 100644 --- a/mysql-test/columnstore/devregression/t/mcs7199_regression_MCOL-128.test +++ b/mysql-test/columnstore/devregression/t/mcs7199_regression_MCOL-128.test @@ -5,6 +5,8 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc + # USE tpch1; # diff --git a/mysql-test/columnstore/devregression/t/mcs7208_regression_MCOL-1989.test b/mysql-test/columnstore/devregression/t/mcs7208_regression_MCOL-1989.test index 9a7c378e0..e6fc02913 100644 --- a/mysql-test/columnstore/devregression/t/mcs7208_regression_MCOL-1989.test +++ b/mysql-test/columnstore/devregression/t/mcs7208_regression_MCOL-1989.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE tpch1; # diff --git a/mysql-test/columnstore/devregression/t/mcs7213_regression_MCOL-2225.test b/mysql-test/columnstore/devregression/t/mcs7213_regression_MCOL-2225.test index 88f9f30b5..b08809f75 100644 --- a/mysql-test/columnstore/devregression/t/mcs7213_regression_MCOL-2225.test +++ b/mysql-test/columnstore/devregression/t/mcs7213_regression_MCOL-2225.test @@ -5,6 +5,7 @@ # -------------------------------------------------------------- # # --source ../include/have_columnstore.inc +--source ../include/detect_maxscale.inc # USE tpch1; # diff --git a/mysql-test/columnstore/devregression/t/mcs7225_regression_MCOL-3721_maxscale.test b/mysql-test/columnstore/devregression/t/mcs7225_regression_MCOL-3721_maxscale.test index fe93e2705..64443034d 100644 --- a/mysql-test/columnstore/devregression/t/mcs7225_regression_MCOL-3721_maxscale.test +++ b/mysql-test/columnstore/devregression/t/mcs7225_regression_MCOL-3721_maxscale.test @@ -13,37 +13,29 @@ USE tpch1; #--Test COLLATE in ORDER BY --disable_warnings DROP TABLE IF EXISTS test_collate; ---enable_warnings CREATE TABLE test_collate (a INT, b INT) ENGINE=columnstore; INSERT INTO test_collate VALUES (1,2), (2,4); SELECT a, b FROM test_collate ORDER BY a COLLATE latin1_german2_ci; SELECT a, b FROM test_collate ORDER BY a COLLATE latin1_german2_ci DESC; ---disable_warnings DROP TABLE IF EXISTS test_collate; ---enable_warnings #--Test COLLATE in table definition and column definition ---disable_warnings DROP TABLE IF EXISTS t1; ---enable_warnings CREATE TABLE t1 (col1 CHAR(10)) CHARSET latin1 COLLATE latin1_bin ENGINE=columnstore; INSERT INTO t1 VALUES ('a'), ('1'), ('-1'); SELECT col1 FROM t1; DESCRIBE t1; ---disable_warnings DROP TABLE IF EXISTS t1; ---enable_warnings CREATE TABLE t1 (col1 CHAR(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci) ENGINE=columnstore; INSERT INTO t1 VALUES ('a'), ('1'), ('-1'); SELECT col1 FROM t1; DESCRIBE t1; ---disable_warnings DROP TABLE IF EXISTS t1; --enable_warnings # diff --git a/mysql-test/columnstore/oracle/func_decode_oracle_maxscale.result b/mysql-test/columnstore/oracle/func_decode_oracle_maxscale.result index 61890127d..0937dddf6 100644 --- a/mysql-test/columnstore/oracle/func_decode_oracle_maxscale.result +++ b/mysql-test/columnstore/oracle/func_decode_oracle_maxscale.result @@ -61,9 +61,6 @@ DECODE(a,1,'x1',NULL,'xNULL','xELSE') AS d2, DECODE_ORACLE(a,1,'x1',NULL,'xNULL') AS d3, DECODE_ORACLE(a,1,'x1',NULL,'xNULL','xELSE') AS d4 FROM t1; -SHOW CREATE VIEW v1; -View Create View character_set_client collation_connection -v1 CREATE VIEW "v1" AS select decode("t1"."a",1,'x1',NULL,'xNULL') AS "d1",decode("t1"."a",1,'x1',NULL,'xNULL','xELSE') AS "d2",decode("t1"."a",1,'x1',NULL,'xNULL') AS "d3",decode("t1"."a",1,'x1',NULL,'xNULL','xELSE') AS "d4" from "t1" latin1 latin1_swedish_ci DROP VIEW v1; DROP TABLE t1; SELECT DECODE(TIME'10:20:31','10:20:31','then1','10:20:32','then2','def'); diff --git a/mysql-test/columnstore/oracle/func_decode_oracle_maxscale.test b/mysql-test/columnstore/oracle/func_decode_oracle_maxscale.test index bef5cac4b..c55328620 100644 --- a/mysql-test/columnstore/oracle/func_decode_oracle_maxscale.test +++ b/mysql-test/columnstore/oracle/func_decode_oracle_maxscale.test @@ -58,7 +58,6 @@ CREATE VIEW v1 AS DECODE_ORACLE(a,1,'x1',NULL,'xNULL') AS d3, DECODE_ORACLE(a,1,'x1',NULL,'xNULL','xELSE') AS d4 FROM t1; -SHOW CREATE VIEW v1; DROP VIEW v1; DROP TABLE t1; From 0a84f04e8c4b59fefd8263b0339774d4573b0312 Mon Sep 17 00:00:00 2001 From: Serguey Zefirov Date: Mon, 23 Jun 2025 15:20:40 +0300 Subject: [PATCH 24/79] chore(MCOL-6018) Fix use-after-free in PrimProc This simple patch splits loop which invalidated iterators used, causing use-after-free, potential prodeuction crash and actual crash under ASAN. --- primitives/blockcache/filebuffermgr.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/primitives/blockcache/filebuffermgr.cpp b/primitives/blockcache/filebuffermgr.cpp index 8ddc3d3f3..fbdc2cb68 100644 --- a/primitives/blockcache/filebuffermgr.cpp +++ b/primitives/blockcache/filebuffermgr.cpp @@ -293,9 +293,12 @@ void FileBufferMgr::flushOIDs(const uint32_t* oids, uint32_t count) { fbList.erase(fFBPool[tmpIt->second->poolIdx].listLoc()); fEmptyPoolSlots.push_back(tmpIt->second->poolIdx); - fbSet.erase(tmpIt->second); fCacheSize--; } + for (byLBID_t::iterator tmpIt = itList.first; tmpIt != itList.second; tmpIt++) + { + fbSet.erase(tmpIt->second); + } } } } From 1384cf64aa33aa025158d30f92b93bfc16133dc1 Mon Sep 17 00:00:00 2001 From: Leonid Fedorov <79837786+mariadb-LeonidFedorov@users.noreply.github.com> Date: Tue, 24 Jun 2025 22:18:20 +0400 Subject: [PATCH 25/79] Revert "chore(install): no more deps for awk and ps for postinstall script" This reverts commit a0c861adbb28c1e1c599249c6e0941e3d42a7eb6. --- .../columnstore-post-install.in | 375 ++++++++---------- 1 file changed, 156 insertions(+), 219 deletions(-) diff --git a/oam/install_scripts/columnstore-post-install.in b/oam/install_scripts/columnstore-post-install.in index 4f86eeb86..a25a2eccc 100755 --- a/oam/install_scripts/columnstore-post-install.in +++ b/oam/install_scripts/columnstore-post-install.in @@ -5,76 +5,11 @@ # Post-install steps for columnstore install running_systemd() { - # Check if init process (PID 1) is systemd by reading /proc/1/comm - if [ -r "/proc/1/comm" ]; then - if [ "$(cat /proc/1/comm)" = "systemd" ]; then - echo 0 - return 0 - fi - fi - - # Alternative check using /proc/1/exe symlink - if [ -L "/proc/1/exe" ]; then - local exe_target - exe_target=$(readlink -f "/proc/1/exe") - if [[ "${exe_target##*/}" == "systemd" ]]; then - echo 0 - return 0 - fi - fi - - # Fallback check for systemd presence in /run/systemd - if [ -d "/run/systemd/system" ]; then - echo 0 - return 0 - fi - - echo 1 - return 1 -} - -get_parent_pid() { - local pid=$1 - local ppid - - # Read the stat file for the given PID - if [ -f "/proc/$pid/stat" ]; then - # Read the entire stat file into a variable - read -r stat <"/proc/$pid/stat" - - # Split into array (parent PID is the 4th field) - IFS=' ' read -ra stat_array <<<"$stat" - - # The PPID is the 4th element (0-based index 3) - ppid=${stat_array[3]} - - echo "$ppid" - return 0 - else - echo "Error: Process $pid does not exist" >&2 - return 1 - fi -} - -get_env_var_value() { - local pid=$1 - local var_name=$2 - local env_file="/proc/$pid/environ" - - if [ ! -r "$env_file" ]; then - echo "Error: Cannot read $env_file" >&2 - return 1 - fi - - # Read null-delimited environ file and process each line - while IFS= read -r -d '' line; do - if [[ "$line" == "${var_name}="* ]]; then - echo "${line#*=}" - return 0 - fi - done <"$env_file" - - return 1 + if [ "$(ps --no-headers -o comm 1)" = "systemd" ]; then + echo 0 + else + echo 1 + fi } # This function recursively(up to PID 1) searches for @@ -83,66 +18,67 @@ find_env_var() { env_var_name=$1 pid=$$ ENV_VAR='' - while [ -z "$ENV_VAR" -a "$pid" != 1 ]; do - ppid=$(get_parent_pid $pid) + while [ -z "$ENV_VAR" -a "$pid" != 1 ]; do + ppid=$(ps -oppid -p$pid|tail -1|awk '{print $1}') # This condition is true in containers if [ "$ppid" == 0 ]; then - break + break; fi - ENV_VAR=$(get_env_var_value $ppid $env_var_name) + env=$(strings /proc/$ppid/environ) + ENV_VAR=$(echo "$env"|awk -F= "\$1 == \"$env_var_name\" { print \$2; }") pid=$ppid done echo $ENV_VAR } if [[ -f /etc/mysql/debian.cnf ]]; then - MDB="/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf" + MDB="/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf" else - MDB="/usr/bin/mysql" + MDB="/usr/bin/mysql" fi checkForError() { - # check for password error - grep "ERROR 1045" ${installLogDir}/mysql_install.log >${installLogDir}/error.check - if [ $(cat ${installLogDir}/error.check | wc -c) -ne 0 ]; then - echo "There were authentication issues running install_mcs_mysql.sh \ + # check for password error + grep "ERROR 1045" ${installLogDir}/mysql_install.log > ${installLogDir}/error.check + if [ `cat ${installLogDir}/error.check | wc -c` -ne 0 ]; then + echo "There were authentication issues running install_mcs_mysql.sh \ script. The log is available in ${installLogDir}/mysql_install.log. Please re-run \ columnstore-post-install manually after solving the authentication issues." - rm -f ${installLogDir}/error.check - return 2 - fi + rm -f ${installLogDir}/error.check + return 2; + fi - rm -f ${installLogDir}/error.check + rm -f ${installLogDir}/error.check - #--------------------------------------------------------------------------- - # See if engine columnstore exist - #--------------------------------------------------------------------------- - echo "checking for engine columnstore..." - $MDB --execute="show engines" 2>${installLogDir}/post-mysql-install.log | grep -i columnstore >>${installLogDir}/post-mysql-install.log 2>&1 + #--------------------------------------------------------------------------- + # See if engine columnstore exist + #--------------------------------------------------------------------------- + echo "checking for engine columnstore..." + $MDB --execute="show engines" 2> ${installLogDir}/post-mysql-install.log | grep -i columnstore >> ${installLogDir}/post-mysql-install.log 2>&1 - # - # Add compressiontype column to SYSCOLUMN if applicable - # - if [ $? -ne 0 ]; then - echo "columnstore doesn't exist" - return 1 - fi + # + # Add compressiontype column to SYSCOLUMN if applicable + # + if [ $? -ne 0 ]; then + echo "columnstore doesn't exist" + return 1 + fi - echo "columnstore exists" + echo "columnstore exists" - return 0 + return 0; } rpmmode=install -user=$(whoami 2>/dev/null) +user=`whoami 2>/dev/null` quiet=0 stop_mysqld=0 -if [ -z "$(pgrep -x mariadbd)" ]; then +if [ -z "$(pgrep -x mariadbd)" ];then # Startup mysqld - systemctl cat mariadb.service >/dev/null 2>&1 + systemctl cat mariadb.service > /dev/null 2>&1 if [ $? -eq 0 ] && [ $(running_systemd) -eq 0 ]; then systemctl start mariadb.service else @@ -171,11 +107,12 @@ if [ -f @ENGINE_SYSCONFDIR@/columnstore/Columnstore.xml.rpmsave ]; then fi touch /dev/shm/columnstore-test && rm /dev/shm/columnstore-test -if [ $? -ne 0 ]; then +if [ $? -ne 0 ] ; then echo "User $user will need R/W access to /dev/shm." exit 1 fi + profileFile="/etc/profile.d/columnstoreAlias.sh" /bin/cp -f @ENGINE_SUPPORTDIR@/columnstoreAlias /etc/profile.d/columnstoreAlias.sh chmod 644 /etc/profile.d/columnstoreAlias.sh >/dev/null 2>&1 @@ -187,7 +124,7 @@ test -d @ENGINE_LOGDIR@/trace || mkdir @ENGINE_LOGDIR@/trace >/dev/null 2>&1 test -d @ENGINE_LOGDIR@/cpimport || mkdir @ENGINE_LOGDIR@/cpimport >/dev/null 2>&1 test -d @ENGINE_LOGDIR@/install || mkdir @ENGINE_LOGDIR@/install >/dev/null 2>&1 test -h @ENGINE_LOGDIR@/data && rm -f @ENGINE_LOGDIR@/data -chmod 755 @ENGINE_LOGDIR@/corefiles >/dev/null 2>&1 +chmod 755 @ENGINE_LOGDIR@/corefiles > /dev/null 2>&1 chmod 777 @ENGINE_LOGDIR@/cpimport chmod 777 @ENGINE_LOGDIR@/install installLogDir=@ENGINE_LOGDIR@/install @@ -199,7 +136,7 @@ test -d @ENGINE_DATADIR@/data1/systemFiles/dataTransaction || rmdir @ENGINE_DATA test -d @ENGINE_DATADIR@/data1/systemFiles/dataTransaction/archive || rmdir @ENGINE_DATADIR@/data1/systemFiles/dataTransaction/archive >/dev/null 2>&1 chmod 1755 @ENGINE_DATADIR@/data1 >/dev/null 2>&1 chmod -R 1755 @ENGINE_DATADIR@/data1/systemFiles >/dev/null 2>&1 -chmod 1755 @ENGINE_SYSCONFDIR@/columnstore >/dev/null 2>&1 +chmod 1755 @ENGINE_SYSCONFDIR@/columnstore > /dev/null 2>&1 #create the bulk-load dirs mkdir -p @ENGINE_LOGDIR@/data/bulk/data/import >/dev/null 2>&1 @@ -210,28 +147,28 @@ rm -f @ENGINE_LOGDIR@/data/bulk/tmpjob/* >/dev/null 2>&1 chmod -R 777 @ENGINE_LOGDIR@/data #get columnstore temp file directory name -tmpDir=$(@ENGINE_BINDIR@/mcsGetConfig SystemConfig SystemTempFileDir) -scratchDir=$tmpDir$(@ENGINE_BINDIR@/mcsGetConfig SystemConfig hdfsRdwrScratch) +tmpDir=`@ENGINE_BINDIR@/mcsGetConfig SystemConfig SystemTempFileDir` +scratchDir=$tmpDir`@ENGINE_BINDIR@/mcsGetConfig SystemConfig hdfsRdwrScratch` mkdir $tmpDir >/dev/null 2>&1 mkdir $scratchDir >/dev/null 2>&1 chmod 777 $tmpDir chmod 777 $scratchDir #create mount directories -mkdir /mnt/tmp >/dev/null 2>&1 +mkdir /mnt/tmp > /dev/null 2>&1 if [ $user = "root" ]; then - #setup the columnstore service script + #setup the columnstore service script rm -f /etc/init.d/columnstore >/dev/null 2>&1 rm -f /etc/default/columnstore - systemctl=$(which systemctl 2>/dev/null) + systemctl=`which systemctl 2>/dev/null` if [ -n "$systemctl" ]; then # Removing a separate ExeMgr unit. - if [[ -f /usr/lib/systemd/system/mcs-exemgr.service ]]; then + if [[ -f /usr/lib/systemd/system/mcs-exemgr.service ]]; then rm -f /usr/lib/systemd/system/mcs-exemgr.service fi - if [[ -f /lib/systemd/system/mcs-exemgr.service ]]; then + if [[ -f /lib/systemd/system/mcs-exemgr.service ]]; then rm -f /lib/systemd/system/mcs-exemgr.service fi cp @ENGINE_SUPPORTDIR@/mariadb-columnstore.service /usr/lib/systemd/system/. >/dev/null 2>&1 @@ -244,7 +181,7 @@ if [ $user = "root" ]; then cp @ENGINE_SUPPORTDIR@/mcs-dmlproc.service /lib/systemd/system/. >/dev/null 2>&1 cp @ENGINE_SUPPORTDIR@/mcs-primproc.service /usr/lib/systemd/system/. >/dev/null 2>&1 cp @ENGINE_SUPPORTDIR@/mcs-primproc.service /lib/systemd/system/. >/dev/null 2>&1 - cp @ENGINE_SUPPORTDIR@/mcs-workernode.service /usr/lib/systemd/system/mcs-workernode@.service >/dev/null 2>&1 + cp @ENGINE_SUPPORTDIR@/mcs-workernode.service /usr/lib/systemd/system/mcs-workernode@.service >/dev/null 2>&1 cp @ENGINE_SUPPORTDIR@/mcs-workernode.service /lib/systemd/system/mcs-workernode@.service >/dev/null 2>&1 cp @ENGINE_SUPPORTDIR@/mcs-writeengineserver.service /usr/lib/systemd/system/. >/dev/null 2>&1 cp @ENGINE_SUPPORTDIR@/mcs-writeengineserver.service /lib/systemd/system/. >/dev/null 2>&1 @@ -253,27 +190,27 @@ if [ $user = "root" ]; then cp @ENGINE_SUPPORTDIR@/mcs-storagemanager.service /usr/lib/systemd/system/. >/dev/null 2>&1 cp @ENGINE_SUPPORTDIR@/mcs-storagemanager.service /lib/systemd/system/. >/dev/null 2>&1 systemctl enable mariadb-columnstore >/dev/null 2>&1 - systemctl enable mcs-controllernode >/dev/null 2>&1 - systemctl enable mcs-ddlproc >/dev/null 2>&1 - systemctl enable mcs-dmlproc >/dev/null 2>&1 - systemctl enable mcs-primproc >/dev/null 2>&1 - systemctl enable mcs-workernode@1 >/dev/null 2>&1 - systemctl enable mcs-writeengineserver >/dev/null 2>&1 - systemctl enable mcs-loadbrm >/dev/null 2>&1 - systemctl enable mcs-storagemanager >/dev/null 2>&1 + systemctl enable mcs-controllernode > /dev/null 2>&1 + systemctl enable mcs-ddlproc > /dev/null 2>&1 + systemctl enable mcs-dmlproc > /dev/null 2>&1 + systemctl enable mcs-primproc > /dev/null 2>&1 + systemctl enable mcs-workernode@1 > /dev/null 2>&1 + systemctl enable mcs-writeengineserver > /dev/null 2>&1 + systemctl enable mcs-loadbrm > /dev/null 2>&1 + systemctl enable mcs-storagemanager > /dev/null 2>&1 else - chkconfig=$(which chkconfig 2>/dev/null) + chkconfig=`which chkconfig 2>/dev/null` if [ -n "$chkconfig" ]; then cp @ENGINE_SBINDIR@/columnstore /etc/init.d/. >/dev/null 2>&1 - chkconfig --add columnstore >/dev/null 2>&1 - chkconfig columnstore on >/dev/null 2>&1 + chkconfig --add columnstore > /dev/null 2>&1 + chkconfig columnstore on > /dev/null 2>&1 else cp @ENGINE_SBINDIR@/columnstore /etc/init.d/. >/dev/null 2>&1 - updaterc=$(which update-rc.d 2>/dev/null) + updaterc=`which update-rc.d 2>/dev/null` if [ -n "$updaterc" ]; then - update-rc.d columnstore defaults 99 >/dev/null 2>&1 + update-rc.d columnstore defaults 99 > /dev/null 2>&1 else echo "" echo "Package 'systemctl', 'chkconfig' or 'update-rc.d' not installed, contact your sysadmin if you want to setup to autostart for columnstore" @@ -284,12 +221,12 @@ fi # upgrade the columnstore.cnf file if [ -f @MARIADB_MYCNFDIR@/columnstore.cnf.rpmsave ]; then - cp -f @MARIADB_MYCNFDIR@/columnstore.cnf @MARIADB_MYCNFDIR@/columnstore.cnf.new - cp -f @MARIADB_MYCNFDIR@/columnstore.cnf.rpmsave @MARIADB_MYCNFDIR@/columnstore.cnf + cp -f @MARIADB_MYCNFDIR@/columnstore.cnf @MARIADB_MYCNFDIR@/columnstore.cnf.new + cp -f @MARIADB_MYCNFDIR@/columnstore.cnf.rpmsave @MARIADB_MYCNFDIR@/columnstore.cnf fi if [ $user = "root" ]; then - @ENGINE_BINDIR@/columnstoreSyslogSetup.sh install >$installLogDir/syslog_install.log 2>&1 + @ENGINE_BINDIR@/columnstoreSyslogSetup.sh install > $installLogDir/syslog_install.log 2>&1 #check if MariaDB Columnstore system logging was setup cat $installLogDir/syslog_install.log | grep 'No System Logging' >/dev/null 2>&1 @@ -299,7 +236,7 @@ if [ $user = "root" ]; then else chown $user:$user @ENGINE_SYSCONFDIR@/columnstore/Columnstore.xml - cat </dev/null 2>&1 +systemctl cat mariadb.service > /dev/null 2>&1 if [ $? -eq 0 ] && [ $(running_systemd) -eq 0 ]; then - systemctl restart mariadb.service >/dev/null 2>&1 + systemctl restart mariadb.service > /dev/null 2>&1 else - pkill mysqld >/dev/null 2>&1 - while [ -n "$(pgrep -x mysqld)" ]; do + pkill mysqld > /dev/null 2>&1 + while [ -n "$(pgrep -x mysqld)" ] ; do sleep 1 done /usr/bin/mysqld_safe & @@ -349,88 +286,88 @@ fi $MDB <@ENGINE_SUPPORTDIR@/syscatalog_mysql.sql 2>/dev/null if [ -z "$MCS_USE_S3_STORAGE" ]; then - MCS_USE_S3_STORAGE="$(find_env_var "MCS_USE_S3_STORAGE")" - MCS_S3_BUCKET="$(find_env_var "MCS_S3_BUCKET")" - MCS_S3_ENDPOINT="$(find_env_var "MCS_S3_ENDPOINT")" - MCS_S3_ACCESS_KEY_ID="$(find_env_var "MCS_S3_ACCESS_KEY_ID")" - MCS_S3_SECRET_ACCESS_KEY="$(find_env_var "MCS_S3_SECRET_ACCESS_KEY")" - MCS_S3_REGION="$(find_env_var "MCS_S3_REGION")" - MCS_S3_ROLE_NAME="$(find_env_var "MCS_S3_ROLE_NAME")" - MCS_S3_STS_REGION="$(find_env_var "MCS_S3_STS_REGION")" - MCS_S3_STS_ENDPOINT="$(find_env_var "MCS_S3_STS_ENDPOINT")" - MCS_S3_USE_HTTP="$(find_env_var "MCS_S3_USE_HTTP")" - MCS_S3_NO_SSL_VERIFY="$(find_env_var "MCS_S3_NO_SSL_VERIFY")" - MCS_S3_LIBS3_DEBUG="$(find_env_var "MCS_S3_LIBS3_DEBUG")" + MCS_USE_S3_STORAGE="$(find_env_var "MCS_USE_S3_STORAGE")" + MCS_S3_BUCKET="$(find_env_var "MCS_S3_BUCKET")" + MCS_S3_ENDPOINT="$(find_env_var "MCS_S3_ENDPOINT")" + MCS_S3_ACCESS_KEY_ID="$(find_env_var "MCS_S3_ACCESS_KEY_ID")" + MCS_S3_SECRET_ACCESS_KEY="$(find_env_var "MCS_S3_SECRET_ACCESS_KEY")" + MCS_S3_REGION="$(find_env_var "MCS_S3_REGION")" + MCS_S3_ROLE_NAME="$(find_env_var "MCS_S3_ROLE_NAME")" + MCS_S3_STS_REGION="$(find_env_var "MCS_S3_STS_REGION")" + MCS_S3_STS_ENDPOINT="$(find_env_var "MCS_S3_STS_ENDPOINT")" + MCS_S3_USE_HTTP="$(find_env_var "MCS_S3_USE_HTTP")" + MCS_S3_NO_SSL_VERIFY="$(find_env_var "MCS_S3_NO_SSL_VERIFY")" + MCS_S3_LIBS3_DEBUG="$(find_env_var "MCS_S3_LIBS3_DEBUG")" fi if [ ! -z "$MCS_USE_S3_STORAGE" ] && [ $MCS_USE_S3_STORAGE -eq 1 ]; then - if [ -z "$MCS_S3_BUCKET" ]; then - echo "Environment variable \$MCS_USE_S3_STORAGE is set but there is no \$MCS_S3_BUCKET." - fi - if [ -z "$MCS_S3_ACCESS_KEY_ID" ] && [ -z "$MCS_S3_ROLE_NAME" ]; then - echo "Environment variable \$MCS_USE_S3_STORAGE is set but there is no \$MCS_S3_ACCESS_KEY_ID." - fi - if [ -z "$MCS_S3_SECRET_ACCESS_KEY" ] && [ -z "$MCS_S3_ROLE_NAME" ]; then - echo "Environment variable \$MCS_USE_S3_STORAGE is set but there is no \$MCS_S3_SECRET_ACCESS_KEY." - fi - if [ -z "$MCS_S3_BUCKET" ] || [[ -z "$MCS_S3_ACCESS_KEY_ID" && -z "$MCS_S3_ROLE_NAME" ]] || [[ -z "$MCS_S3_SECRET_ACCESS_KEY" && -z "$MCS_S3_ROLE_NAME" ]]; then - echo "Using local storage." - @ENGINE_BINDIR@/mcsSetConfig -d Installation DBRootStorageType "storagemanager" - @ENGINE_BINDIR@/mcsSetConfig -d StorageManager Enabled "Y" - @ENGINE_BINDIR@/mcsSetConfig -d SystemConfig DataFilePlugin "libcloudio.so" - else - @ENGINE_BINDIR@/mcsSetConfig -d Installation DBRootStorageType "storagemanager" - @ENGINE_BINDIR@/mcsSetConfig -d StorageManager Enabled "Y" - @ENGINE_BINDIR@/mcsSetConfig -d SystemConfig DataFilePlugin "libcloudio.so" - sed -i "s|^service =.*|service = S3|" /etc/columnstore/storagemanager.cnf - if [ ! -z "$MCS_S3_REGION" ]; then - sed -i "s|^region =.*|region = $MCS_S3_REGION|" /etc/columnstore/storagemanager.cnf - fi - if [ ! -z "$MCS_S3_ROLE_NAME" ]; then - sed -i "s|^# iam_role_name =.*|iam_role_name = $MCS_S3_ROLE_NAME|" /etc/columnstore/storagemanager.cnf - fi - if [ ! -z "$MCS_S3_STS_REGION" ]; then - sed -i "s|^# sts_region =.*|sts_region = $MCS_S3_STS_REGION|" /etc/columnstore/storagemanager.cnf - fi - if [ ! -z "$MCS_S3_STS_ENDPOINT" ]; then - sed -i "s|^# sts_endpoint =.*|sts_endpoint = $MCS_S3_STS_ENDPOINT|" /etc/columnstore/storagemanager.cnf - fi - if [ ! -z "$MCS_S3_USE_HTTP" ]; then - sed -i "s|^# use_http =.*|use_http = enabled|" /etc/columnstore/storagemanager.cnf - fi - if [ ! -z "$MCS_S3_NO_SSL_VERIFY" ]; then - sed -i "s|^# ssl_verify =.*|ssl_verify = disabled|" /etc/columnstore/storagemanager.cnf - fi - if [ ! -z "$MCS_S3_LIBS3_DEBUG" ]; then - sed -i "s|^# libs3_debug =.*|libs3_debug = enabled|" /etc/columnstore/storagemanager.cnf - fi - sed -i "s|^bucket =.*|bucket = $MCS_S3_BUCKET|" /etc/columnstore/storagemanager.cnf - sed -i "s|^# endpoint =.*|endpoint = $MCS_S3_ENDPOINT|" /etc/columnstore/storagemanager.cnf - sed -i "s|^# aws_access_key_id =.*|aws_access_key_id = $MCS_S3_ACCESS_KEY_ID|" /etc/columnstore/storagemanager.cnf - sed -i "s|^# aws_secret_access_key =.*|aws_secret_access_key = $MCS_S3_SECRET_ACCESS_KEY|" /etc/columnstore/storagemanager.cnf - @ENGINE_BINDIR@/testS3Connection - if [ $? -ne 0 ]; then - sed -i "s|^iam_role_name =.*|# iam_role_name = |" /etc/columnstore/storagemanager.cnf - sed -i "s|^sts_region =.*|# sts_region = |" /etc/columnstore/storagemanager.cnf - sed -i "s|^sts_endpoint =.*|# sts_endpoint = |" /etc/columnstore/storagemanager.cnf - sed -i "s|^endpoint =.*|# endpoint = |" /etc/columnstore/storagemanager.cnf - sed -i "s|^aws_access_key_id =.*|# aws_access_key_id = |" /etc/columnstore/storagemanager.cnf - sed -i "s|^aws_secret_access_key =.*|# aws_secret_access_key = |" /etc/columnstore/storagemanager.cnf - echo "There was an error validating the settings used to access S3." - echo "The specified user or role must have GET, PUT, HEAD, and DELETE permissions to the bucket." - echo "Verify the following environment variables are correct:" - echo "MCS_S3_BUCKET" - echo "MCS_S3_ENDPOINT" - echo "MCS_S3_ACCESS_KEY_ID" - echo "MCS_S3_SECRET_ACCESS_KEY" - echo "MCS_S3_REGION" - echo "MCS_S3_ROLE_NAME (optional)" - echo "MCS_S3_STS_REGION (optional)" - echo "MCS_S3_STS_ENDPOINT (optional)" - echo "After environment variables are fixed, run command: columnstore-post-install" - exit 1 - fi - fi + if [ -z "$MCS_S3_BUCKET" ]; then + echo "Environment variable \$MCS_USE_S3_STORAGE is set but there is no \$MCS_S3_BUCKET." + fi + if [ -z "$MCS_S3_ACCESS_KEY_ID" ] && [ -z "$MCS_S3_ROLE_NAME" ]; then + echo "Environment variable \$MCS_USE_S3_STORAGE is set but there is no \$MCS_S3_ACCESS_KEY_ID." + fi + if [ -z "$MCS_S3_SECRET_ACCESS_KEY" ] && [ -z "$MCS_S3_ROLE_NAME" ]; then + echo "Environment variable \$MCS_USE_S3_STORAGE is set but there is no \$MCS_S3_SECRET_ACCESS_KEY." + fi + if [ -z "$MCS_S3_BUCKET" ] || [[ -z "$MCS_S3_ACCESS_KEY_ID" && -z "$MCS_S3_ROLE_NAME" ]] || [[ -z "$MCS_S3_SECRET_ACCESS_KEY" && -z "$MCS_S3_ROLE_NAME" ]]; then + echo "Using local storage." + @ENGINE_BINDIR@/mcsSetConfig -d Installation DBRootStorageType "storagemanager" + @ENGINE_BINDIR@/mcsSetConfig -d StorageManager Enabled "Y" + @ENGINE_BINDIR@/mcsSetConfig -d SystemConfig DataFilePlugin "libcloudio.so" + else + @ENGINE_BINDIR@/mcsSetConfig -d Installation DBRootStorageType "storagemanager" + @ENGINE_BINDIR@/mcsSetConfig -d StorageManager Enabled "Y" + @ENGINE_BINDIR@/mcsSetConfig -d SystemConfig DataFilePlugin "libcloudio.so" + sed -i "s|^service =.*|service = S3|" /etc/columnstore/storagemanager.cnf + if [ ! -z "$MCS_S3_REGION" ]; then + sed -i "s|^region =.*|region = $MCS_S3_REGION|" /etc/columnstore/storagemanager.cnf + fi + if [ ! -z "$MCS_S3_ROLE_NAME" ]; then + sed -i "s|^# iam_role_name =.*|iam_role_name = $MCS_S3_ROLE_NAME|" /etc/columnstore/storagemanager.cnf + fi + if [ ! -z "$MCS_S3_STS_REGION" ]; then + sed -i "s|^# sts_region =.*|sts_region = $MCS_S3_STS_REGION|" /etc/columnstore/storagemanager.cnf + fi + if [ ! -z "$MCS_S3_STS_ENDPOINT" ]; then + sed -i "s|^# sts_endpoint =.*|sts_endpoint = $MCS_S3_STS_ENDPOINT|" /etc/columnstore/storagemanager.cnf + fi + if [ ! -z "$MCS_S3_USE_HTTP" ]; then + sed -i "s|^# use_http =.*|use_http = enabled|" /etc/columnstore/storagemanager.cnf + fi + if [ ! -z "$MCS_S3_NO_SSL_VERIFY" ]; then + sed -i "s|^# ssl_verify =.*|ssl_verify = disabled|" /etc/columnstore/storagemanager.cnf + fi + if [ ! -z "$MCS_S3_LIBS3_DEBUG" ]; then + sed -i "s|^# libs3_debug =.*|libs3_debug = enabled|" /etc/columnstore/storagemanager.cnf + fi + sed -i "s|^bucket =.*|bucket = $MCS_S3_BUCKET|" /etc/columnstore/storagemanager.cnf + sed -i "s|^# endpoint =.*|endpoint = $MCS_S3_ENDPOINT|" /etc/columnstore/storagemanager.cnf + sed -i "s|^# aws_access_key_id =.*|aws_access_key_id = $MCS_S3_ACCESS_KEY_ID|" /etc/columnstore/storagemanager.cnf + sed -i "s|^# aws_secret_access_key =.*|aws_secret_access_key = $MCS_S3_SECRET_ACCESS_KEY|" /etc/columnstore/storagemanager.cnf + @ENGINE_BINDIR@/testS3Connection + if [ $? -ne 0 ]; then + sed -i "s|^iam_role_name =.*|# iam_role_name = |" /etc/columnstore/storagemanager.cnf + sed -i "s|^sts_region =.*|# sts_region = |" /etc/columnstore/storagemanager.cnf + sed -i "s|^sts_endpoint =.*|# sts_endpoint = |" /etc/columnstore/storagemanager.cnf + sed -i "s|^endpoint =.*|# endpoint = |" /etc/columnstore/storagemanager.cnf + sed -i "s|^aws_access_key_id =.*|# aws_access_key_id = |" /etc/columnstore/storagemanager.cnf + sed -i "s|^aws_secret_access_key =.*|# aws_secret_access_key = |" /etc/columnstore/storagemanager.cnf + echo "There was an error validating the settings used to access S3." + echo "The specified user or role must have GET, PUT, HEAD, and DELETE permissions to the bucket." + echo "Verify the following environment variables are correct:" + echo "MCS_S3_BUCKET" + echo "MCS_S3_ENDPOINT" + echo "MCS_S3_ACCESS_KEY_ID" + echo "MCS_S3_SECRET_ACCESS_KEY" + echo "MCS_S3_REGION" + echo "MCS_S3_ROLE_NAME (optional)" + echo "MCS_S3_STS_REGION (optional)" + echo "MCS_S3_STS_ENDPOINT (optional)" + echo "After environment variables are fixed, run command: columnstore-post-install" + exit 1 + fi + fi fi #change ownership/permissions to be able to run columnstore as non-root @@ -438,14 +375,14 @@ fi if [ $(running_systemd) -eq 0 ]; then chown -R @DEFAULT_USER@:@DEFAULT_GROUP@ @ENGINE_LOGDIR@ chown -R @DEFAULT_USER@:@DEFAULT_GROUP@ /etc/columnstore - findcmd=$(which find 2>/dev/null) + findcmd=`which find 2>/dev/null` if [ -n "$findcmd" ]; then if [[ $($findcmd @ENGINE_DATADIR@ -maxdepth 3 ! -user @DEFAULT_USER@ -exec echo {} \; -quit 2>/dev/null) ]]; then echo "At least one file is not owned by @DEFAULT_USER@ in @ENGINE_DATADIR@. Running chown..." chown -R @DEFAULT_USER@:@DEFAULT_GROUP@ @ENGINE_DATADIR@ else echo "Confirmed top @ENGINE_DATADIR@ folders owned by @DEFAULT_USER@" - fi + fi else chown -R @DEFAULT_USER@:@DEFAULT_GROUP@ @ENGINE_DATADIR@ fi @@ -453,7 +390,7 @@ if [ $(running_systemd) -eq 0 ]; then chmod 777 /dev/shm fi -systemctl cat mariadb-columnstore.service >/dev/null 2>&1 +systemctl cat mariadb-columnstore.service > /dev/null 2>&1 if [ $? -eq 0 ] && [ $(running_systemd) -eq 0 ]; then # mask mariadb-columnstore service to prevent starting services and dbbuilder @@ -484,13 +421,13 @@ if [ $? -eq 0 ] && [ $(running_systemd) -eq 0 ]; then flock -u "$fd_lock" fi -if [ $stop_mysqld -eq 1 ]; then +if [ $stop_mysqld -eq 1 ];then # Make sure we stop mariadb since it wasn't running prior to columnstore installation - systemctl cat mariadb.service >/dev/null 2>&1 + systemctl cat mariadb.service > /dev/null 2>&1 if [ $? -eq 0 ] && [ $(running_systemd) -eq 0 ]; then - systemctl stop mariadb.service >/dev/null 2>&1 + systemctl stop mariadb.service > /dev/null 2>&1 else - pkill mysqld >/dev/null 2>&1 + pkill mysqld > /dev/null 2>&1 fi fi From 6d1f4186eea7ff61d5be0b86d8ccff08939be17e Mon Sep 17 00:00:00 2001 From: Leonid Fedorov Date: Tue, 24 Jun 2025 19:18:17 +0000 Subject: [PATCH 26/79] chore(ci): disable arms due instability --- .drone.jsonnet | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.drone.jsonnet b/.drone.jsonnet index 1d77c227f..689dbfd5c 100644 --- a/.drone.jsonnet +++ b/.drone.jsonnet @@ -723,8 +723,8 @@ local FinalPipeline(branch, event) = { "failure", ], } + (if event == "cron" then { cron: ["nightly-" + std.strReplace(branch, ".", "-")] } else {}), - depends_on: std.map(function(p) std.join(" ", [branch, p, event, "amd64", "10.6-enterprise", "", ""]), platforms.develop) + - std.map(function(p) std.join(" ", [branch, p, event, "arm64", "10.6-enterprise", "", ""]), platforms_arm.develop), + depends_on: std.map(function(p) std.join(" ", [branch, p, event, "amd64", "10.6-enterprise", "", ""]), platforms.develop), + // +std.map(function(p) std.join(" ", [branch, p, event, "arm64", "10.6-enterprise", "", ""]), platforms_arm.develop), }; [ @@ -734,13 +734,13 @@ local FinalPipeline(branch, event) = { for s in servers[b] for e in events ] + -[ - Pipeline(b, p, e, "arm64", s) - for b in std.objectFields(platforms_arm) - for p in platforms_arm[b] - for s in servers[b] - for e in events -] + +// [ +// Pipeline(b, p, e, "arm64", s) +// for b in std.objectFields(platforms_arm) +// for p in platforms_arm[b] +// for s in servers[b] +// for e in events +// ] + [ FinalPipeline(b, "cron") @@ -751,11 +751,11 @@ local FinalPipeline(branch, event) = { Pipeline(any_branch, p, "custom", "amd64", "10.6-enterprise") for p in platforms_custom ] + -[ - Pipeline(any_branch, p, "custom", "arm64", "10.6-enterprise") - for p in platforms_arm_custom -] -+ +// [ +// Pipeline(any_branch, p, "custom", "arm64", "10.6-enterprise") +// for p in platforms_arm_custom +// ] +// + [ Pipeline(b, platform, triggeringEvent, a, server, "", buildenv) for a in ["amd64"] From 251749297bd8019b93c88dfea1b4094a7852e2de Mon Sep 17 00:00:00 2001 From: Leonid Fedorov Date: Tue, 24 Jun 2025 19:27:58 +0000 Subject: [PATCH 27/79] chore(ci): disable ubuntu 20.04 --- .drone.jsonnet | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.drone.jsonnet b/.drone.jsonnet index 689dbfd5c..8cf14957c 100644 --- a/.drone.jsonnet +++ b/.drone.jsonnet @@ -1,18 +1,18 @@ local events = ["pull_request", "cron"]; + +local current_branch = "stable-23.10"; + local servers = { - develop: ["10.6-enterprise"], "stable-23.10": ["10.6-enterprise"], }; local platforms = { - develop: ["rockylinux:8", "rockylinux:9", "debian:12", "ubuntu:20.04", "ubuntu:22.04", "ubuntu:24.04"], - "stable-23.10": ["rockylinux:8", "rockylinux:9", "debian:12", "ubuntu:20.04", "ubuntu:22.04", "ubuntu:24.04"], + "stable-23.10": ["rockylinux:8", "rockylinux:9", "debian:12", "ubuntu:22.04", "ubuntu:24.04"], }; local platforms_arm = { - develop: ["rockylinux:8", "rockylinux:9", "debian:12", "ubuntu:20.04", "ubuntu:22.04", "ubuntu:24.04"], - "stable-23.10": ["rockylinux:8", "rockylinux:9", "debian:12", "ubuntu:20.04", "ubuntu:22.04", "ubuntu:24.04"], + "stable-23.10": ["rockylinux:8", "rockylinux:9", "debian:12", "ubuntu:22.04", "ubuntu:24.04"], }; local rewrite_ubuntu_mirror = @"sed -i 's|//\\(us\\.\\)\\?archive\\.ubuntu\\.com|//us.archive.ubuntu.com|g' /etc/apt/sources.list || true; " + @@ -56,10 +56,10 @@ local customBootstrapParamsForAdditionalPipelinesMap = { local any_branch = "**"; -local platforms_custom = platforms.develop; -local platforms_arm_custom = platforms_arm.develop; +local platforms_custom = platforms[current_branch]; +local platforms_arm_custom = platforms_arm[current_branch]; -local platforms_mtr = platforms.develop; +local platforms_mtr = platforms[current_branch]; local builddir = "verylongdirnameforverystrangecpackbehavior"; @@ -146,7 +146,7 @@ local Pipeline(branch, platform, event, arch="amd64", server="10.6-enterprise", local socket_path = if (pkg_format == "rpm") then "/var/lib/mysql/mysql.sock" else "/run/mysqld/mysqld.sock", local config_path_prefix = if (pkg_format == "rpm") then "/etc/my.cnf.d/" else "/etc/mysql/mariadb.conf.d/50-", local img = if (platform == "rockylinux:8") then platform else "detravi/" + std.strReplace(platform, "/", "-"), - local branch_ref = if (branch == any_branch) then "stable-23.10" else branch, + local branch_ref = if (branch == any_branch) then current_branch else branch, // local regression_tests = if (std.startsWith(platform, 'debian') || std.startsWith(platform, 'ubuntu:20')) then 'test000.sh' else 'test000.sh,test001.sh', local branchp = if (branch == "**") then "" else branch + "/", @@ -723,7 +723,7 @@ local FinalPipeline(branch, event) = { "failure", ], } + (if event == "cron" then { cron: ["nightly-" + std.strReplace(branch, ".", "-")] } else {}), - depends_on: std.map(function(p) std.join(" ", [branch, p, event, "amd64", "10.6-enterprise", "", ""]), platforms.develop), + depends_on: std.map(function(p) std.join(" ", [branch, p, event, "amd64", "10.6-enterprise", "", ""]), platforms[current_branch]), // +std.map(function(p) std.join(" ", [branch, p, event, "arm64", "10.6-enterprise", "", ""]), platforms_arm.develop), }; @@ -763,5 +763,5 @@ local FinalPipeline(branch, event) = { for platform in ["ubuntu:24.04"] for buildenv in std.objectFields(customEnvCommandsMap) for triggeringEvent in events - for server in servers.develop + for server in servers[current_branch] ] From 3a91cded27052132328df376cc856f59647edfe6 Mon Sep 17 00:00:00 2001 From: Serguey Zefirov Date: Wed, 25 Jun 2025 14:13:29 +0300 Subject: [PATCH 28/79] chore(MCOL-6018) Fix incorrect Field_decimal cast This is a fix of a problem found by UBSAN. MDB changed default type to represent a decimal result, C-style cast did not do proper type checking and this one-liner fixes that. Now we will have an assertion if type changes again. --- dbcon/mysql/ha_mcs_execplan.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dbcon/mysql/ha_mcs_execplan.cpp b/dbcon/mysql/ha_mcs_execplan.cpp index c81a3d39c..e9f69b0d5 100644 --- a/dbcon/mysql/ha_mcs_execplan.cpp +++ b/dbcon/mysql/ha_mcs_execplan.cpp @@ -3213,7 +3213,10 @@ CalpontSystemCatalog::ColType fieldType_MysqlToIDB(const Field* field) case DECIMAL_RESULT: { - Field_decimal* idp = (Field_decimal*)field; + const Field_new_decimal* idp = dynamic_cast(field); + + idbassert(idp); + ct.colDataType = CalpontSystemCatalog::DECIMAL; ct.colWidth = 8; ct.scale = idp->dec; From 79008f4f69194a00944b399de6e145c9e640cc9a Mon Sep 17 00:00:00 2001 From: drrtuy Date: Thu, 5 Jun 2025 10:06:54 +0000 Subject: [PATCH 29/79] feat(CSEP): CSEP printer with indentations to simplify reading + rewriter skeleton + some test binary to describe minimalistic CSEP localy --- dbcon/execplan/CMakeLists.txt | 8 + dbcon/execplan/calpontselectexecutionplan.cpp | 96 +- dbcon/execplan/calpontselectexecutionplan.h | 2 +- dbcon/execplan/calpontsystemcatalog.h | 5 + dbcon/execplan/csep_rewrite.cpp | 87 + dbcon/joblist/subquerytransformer.cpp | 3 - dbcon/mysql/ha_mcs_execplan.cpp | 1688 +++++++++-------- 7 files changed, 1046 insertions(+), 843 deletions(-) create mode 100644 dbcon/execplan/csep_rewrite.cpp diff --git a/dbcon/execplan/CMakeLists.txt b/dbcon/execplan/CMakeLists.txt index 6e1acbb98..a45448bbe 100755 --- a/dbcon/execplan/CMakeLists.txt +++ b/dbcon/execplan/CMakeLists.txt @@ -47,3 +47,11 @@ set(execplan_LIB_SRCS columnstore_library(execplan ${execplan_LIB_SRCS}) columnstore_link(execplan messageqcpp ${NETSNMP_LIBRARIES} ${ENGINE_DT_LIB} pron loggingcpp) + +columnstore_executable(csep_rewrite csep_rewrite.cpp) +columnstore_link(csep_rewrite + ${ENGINE_LDFLAGS} + ${NETSNMP_LIBRARIES} + ${ENGINE_WRITE_LIBS} + loggingcpp +) \ No newline at end of file diff --git a/dbcon/execplan/calpontselectexecutionplan.cpp b/dbcon/execplan/calpontselectexecutionplan.cpp index 6845cf9fd..3265835d6 100644 --- a/dbcon/execplan/calpontselectexecutionplan.cpp +++ b/dbcon/execplan/calpontselectexecutionplan.cpp @@ -193,51 +193,64 @@ void CalpontSelectExecutionPlan::havingTokenList(const FilterTokenList& havingTo having(parser.parse(tokens.begin(), tokens.end())); } -string CalpontSelectExecutionPlan::toString() const +std::string endlWithIndent(const size_t ident) +{ + ostringstream output; + output << endl; + output << std::string(ident, ' '); + return output.str(); +} + +string CalpontSelectExecutionPlan::toString(const size_t ident) const { ostringstream output; - output << ">SELECT "; + output << std::string(ident, ' ') << "SELECT "; if (distinct()) + { output << "DISTINCT "; + } - output << "limit: " << limitStart() << " - " << limitNum() << endl; + output << "limit: " << limitStart() << " - " << limitNum() << endlWithIndent(ident); switch (location()) { - case CalpontSelectExecutionPlan::MAIN: output << "MAIN" << endl; break; + case CalpontSelectExecutionPlan::MAIN: output << "MAIN" << endlWithIndent(ident); break; - case CalpontSelectExecutionPlan::FROM: output << "FROM" << endl; break; + case CalpontSelectExecutionPlan::FROM: output << "FROM" << endlWithIndent(ident); break; - case CalpontSelectExecutionPlan::WHERE: output << "WHERE" << endl; break; + case CalpontSelectExecutionPlan::WHERE: output << "WHERE" << endlWithIndent(ident); break; - case CalpontSelectExecutionPlan::HAVING: output << "HAVING" << endl; break; + case CalpontSelectExecutionPlan::HAVING: output << "HAVING" << endlWithIndent(ident); break; } // Returned Column CalpontSelectExecutionPlan::ReturnedColumnList retCols = returnedCols(); - output << ">>Returned Columns" << endl; + output << ">>Returned Columns" << endlWithIndent(ident); + output << std::string(ident, ' '); + uint32_t seq = 0; for (unsigned int i = 0; i < retCols.size(); i++) { - output << *retCols[i] << endl; + output << *retCols[i] << endlWithIndent(ident); if (retCols[i]->colSource() & SELECT_SUB) { - output << "select sub -- " << endl; + output << "select sub -- " << endlWithIndent(ident); CalpontSelectExecutionPlan* plan = dynamic_cast(fSelectSubList[seq++].get()); if (plan) - output << "{" << *plan << "}" << endl; + output << "{" << plan->toString(ident + 2) << "}" << endlWithIndent(ident); } } // From Clause CalpontSelectExecutionPlan::TableList tables = tableList(); - output << ">>From Tables" << endl; + output << ">>From Tables" << endlWithIndent(ident); + output << std::string(ident, ' '); seq = 0; for (unsigned int i = 0; i < tables.size(); i++) @@ -245,42 +258,55 @@ string CalpontSelectExecutionPlan::toString() const // derived table if (tables[i].schema.length() == 0 && tables[i].table.length() == 0) { - output << "derived table - " << tables[i].alias << endl; + output << "derived table - " << tables[i].alias << endlWithIndent(ident); CalpontSelectExecutionPlan* plan = dynamic_cast(fDerivedTableList[seq++].get()); if (plan) - output << "{" << *plan << "}" << endl; + { + output << "{" << plan->toString(ident + 2) << "}" << endlWithIndent(ident); + } + output << std::string(ident, ' '); + } else { output << tables[i] << endl; + output << std::string(ident, ' '); } } // Filters - output << ">>Filters" << endl; + output << ">>Filters" << endlWithIndent(ident); + output << std::string(ident, ' '); + if (filters() != nullptr) filters()->walk(ParseTree::print, output); else - output << "empty filter tree" << endl; + output << "empty filter tree" << endlWithIndent(ident); + output << std::string(ident, ' '); // Group by columns const CalpontSelectExecutionPlan::GroupByColumnList& gbc = groupByCols(); if (gbc.size() > 0) { - output << ">>Group By Columns" << endl; + output << ">>Group By Columns" << endlWithIndent(ident); + output << std::string(ident, ' '); for (unsigned int i = 0; i < gbc.size(); i++) - output << *gbc[i] << endl; + { + output << *gbc[i] << endlWithIndent(ident); + } + output << std::string(ident, ' '); } // Having if (having() != nullptr) { - output << ">>Having" << endl; + output << ">>Having" << endlWithIndent(ident); + output << std::string(ident, ' '); having()->walk(ParseTree::print, output); } @@ -289,39 +315,39 @@ string CalpontSelectExecutionPlan::toString() const if (obc.size() > 0) { - output << ">>Order By Columns" << endl; + output << ">>Order By Columns" << endlWithIndent(ident); for (unsigned int i = 0; i < obc.size(); i++) - output << *obc[i] << endl; + output << *obc[i] << endlWithIndent(ident); } - output << "SessionID: " << fSessionID << endl; - output << "TxnID: " << fTxnID << endl; - output << "VerID: " << fVerID << endl; - output << "TraceFlags: " << fTraceFlags << endl; - output << "StatementID: " << fStatementID << endl; - output << "DistUnionNum: " << (int)fDistinctUnionNum << endl; - output << "Limit: " << fLimitStart << " - " << fLimitNum << endl; - output << "String table threshold: " << fStringTableThreshold << endl; + output << "SessionID: " << fSessionID << endlWithIndent(ident); + output << "TxnID: " << fTxnID << endlWithIndent(ident); + output << "VerID: " << fVerID << endlWithIndent(ident); + output << "TraceFlags: " << fTraceFlags << endlWithIndent(ident); + output << "StatementID: " << fStatementID << endlWithIndent(ident); + output << "DistUnionNum: " << (int)fDistinctUnionNum << endlWithIndent(ident); + output << "Limit: " << fLimitStart << " - " << fLimitNum << endlWithIndent(ident); + output << "String table threshold: " << fStringTableThreshold << endlWithIndent(ident); - output << "--- Column Map ---" << endl; + output << "--- Column Map ---" << endlWithIndent(ident); CalpontSelectExecutionPlan::ColumnMap::const_iterator iter; for (iter = columnMap().begin(); iter != columnMap().end(); iter++) - output << (*iter).first << " : " << (*iter).second << endl; + output << (*iter).first << " : " << (*iter).second << endlWithIndent(ident); - output << "UUID: " << fUuid << endl; - output << "QueryType: " << queryType() << endl; + output << "UUID: " << fUuid << endlWithIndent(ident); + output << "QueryType: " << queryType() << endlWithIndent(ident); if (!unionVec().empty()) - output << "\n--- Union Unit ---" << endl; + output << "\n--- Union Unit ---" << endlWithIndent(ident); for (unsigned i = 0; i < unionVec().size(); i++) { CalpontSelectExecutionPlan* plan = dynamic_cast(unionVec()[i].get()); if (plan) - output << "{" << *plan << "}\n" << endl; + output << "{" << *plan << "}\n" << endlWithIndent(ident); } return output.str(); diff --git a/dbcon/execplan/calpontselectexecutionplan.h b/dbcon/execplan/calpontselectexecutionplan.h index 0fa8cec96..9dfa4afcd 100644 --- a/dbcon/execplan/calpontselectexecutionplan.h +++ b/dbcon/execplan/calpontselectexecutionplan.h @@ -797,7 +797,7 @@ class CalpontSelectExecutionPlan : public CalpontExecutionPlan * Return a string rep of the CSEP * @return a string */ - virtual std::string toString() const; + virtual std::string toString(const size_t ident = 0) const; /** @brief Is this an internal query? * diff --git a/dbcon/execplan/calpontsystemcatalog.h b/dbcon/execplan/calpontsystemcatalog.h index 1963e7999..dee640c3e 100644 --- a/dbcon/execplan/calpontsystemcatalog.h +++ b/dbcon/execplan/calpontsystemcatalog.h @@ -458,8 +458,13 @@ class CalpontSystemCatalog : public datatypes::SystemCatalog { return !(*this == rhs); } + bool isColumnstore() const + { + return fisColumnStore; + } void serialize(messageqcpp::ByteStream&) const; void unserialize(messageqcpp::ByteStream&); + friend std::ostream& operator<<(std::ostream& os, const TableAliasName& rhs); }; diff --git a/dbcon/execplan/csep_rewrite.cpp b/dbcon/execplan/csep_rewrite.cpp new file mode 100644 index 000000000..4dbac48e0 --- /dev/null +++ b/dbcon/execplan/csep_rewrite.cpp @@ -0,0 +1,87 @@ +#include "execplan/calpontselectexecutionplan.h" +#include "simplecolumn.h" +#include "execplan/calpontsystemcatalog.h" +#include "simplefilter.h" +#include "constantcolumn.h" + +using namespace execplan; +const SOP opeq(new Operator("=")); + + + +int main() +{ + CalpontSelectExecutionPlan csep; + + CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList; + CalpontSelectExecutionPlan::ColumnMap colMap; + + string columnlength = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COLUMNLEN_COL; + + SimpleColumn* col[1]; + col[0] = new SimpleColumn(columnlength, 22222222); + + SRCP srcp; + srcp.reset(col[0]); + colMap.insert({columnlength, srcp}); + csep.columnMapNonStatic(colMap); + srcp.reset(col[0]->clone()); + returnedColumnList.push_back(srcp); + csep.returnedCols(returnedColumnList); + + { + SCSEP csepDerived(new CalpontSelectExecutionPlan()); + CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnListLocal; + CalpontSelectExecutionPlan::ColumnMap colMapLocal; + + string columnlength = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COLUMNLEN_COL; + + SimpleColumn* col[1]; + col[0] = new SimpleColumn(columnlength, 22222222); + + SRCP srcpLocal; + srcpLocal.reset(col[0]); + colMapLocal.insert({columnlength, srcpLocal}); + csepDerived->columnMapNonStatic(colMapLocal); + + srcp.reset(col[0]->clone()); + returnedColumnListLocal.push_back(srcpLocal); + csepDerived->returnedCols(returnedColumnList); + + CalpontSelectExecutionPlan::SelectList derivedTables; + derivedTables.push_back(csepDerived); + csep.derivedTableList(derivedTables); + } + + CalpontSelectExecutionPlan::TableList tableList = {execplan::CalpontSystemCatalog::TableAliasName("", "", "alias")}; + csep.tableList(tableList); + + CalpontSelectExecutionPlan::SelectList unionVec; + + for (size_t i = 0; i < 3; ++i) + { + SCSEP plan(new CalpontSelectExecutionPlan()); + CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnListLocal; + CalpontSelectExecutionPlan::ColumnMap colMapLocal; + + SRCP srcpLocal; + srcpLocal.reset(col[0]); + colMapLocal.insert({columnlength, srcpLocal}); + plan->columnMapNonStatic(colMapLocal); + srcpLocal.reset(col[0]->clone()); + returnedColumnListLocal.push_back(srcpLocal); + plan->returnedCols(returnedColumnListLocal); + + plan->txnID(csep.txnID()); + plan->verID(csep.verID()); + plan->sessionID(csep.sessionID()); + plan->columnMapNonStatic(colMapLocal); + plan->returnedCols(returnedColumnListLocal); + unionVec.push_back(plan); + + // std::cout << plan->toString() << std::endl; + } + + csep.unionVec(unionVec); + std::cout << csep.toString() << std::endl; +} \ No newline at end of file diff --git a/dbcon/joblist/subquerytransformer.cpp b/dbcon/joblist/subquerytransformer.cpp index 1fd364bd8..96562ad93 100644 --- a/dbcon/joblist/subquerytransformer.cpp +++ b/dbcon/joblist/subquerytransformer.cpp @@ -79,9 +79,6 @@ SubQueryTransformer::~SubQueryTransformer() SJSTEP& SubQueryTransformer::makeSubQueryStep(execplan::CalpontSelectExecutionPlan* csep, bool subInFromClause) { - if (fOutJobInfo->trace) - cout << (*csep) << endl; - // Setup job info, job list and error status relation. fSubJobInfo = new JobInfo(fOutJobInfo->rm); fSubJobInfo->sessionId = fOutJobInfo->sessionId; diff --git a/dbcon/mysql/ha_mcs_execplan.cpp b/dbcon/mysql/ha_mcs_execplan.cpp index e9f69b0d5..cb2323228 100644 --- a/dbcon/mysql/ha_mcs_execplan.cpp +++ b/dbcon/mysql/ha_mcs_execplan.cpp @@ -328,12 +328,12 @@ static execplan::Partitions getPartitions(TABLE* table) while ((pe = part_el_it++)) // this is how server does it. { - // TODO: partition names are not just strings in - #if MYSQL_VERSION_ID >= 110501 - result.fPartNames.emplace_back(pe->partition_name.str); - #else - result.fPartNames.emplace_back(pe->partition_name); - #endif +// TODO: partition names are not just strings in +#if MYSQL_VERSION_ID >= 110501 + result.fPartNames.emplace_back(pe->partition_name.str); +#else + result.fPartNames.emplace_back(pe->partition_name); +#endif } } return result; @@ -4593,10 +4593,10 @@ ReturnedColumn* buildFunctionColumnBody(Item_func* ifp, gp_walk_info& gwi, bool& } if (funcName == "last_day") { - CalpontSystemCatalog::ColType ct; - ct.colDataType = CalpontSystemCatalog::DATE; - ct.colWidth = 4; - fc->resultType(ct); + CalpontSystemCatalog::ColType ct; + ct.colDataType = CalpontSystemCatalog::DATE; + ct.colWidth = 4; + fc->resultType(ct); } #if 0 @@ -6598,8 +6598,6 @@ void gp_walk(const Item* item, void* arg) gwip->hasSubSelect = true; gwip->subQuery = existsSub; gwip->ptWorkStack.push(existsSub->transform()); - // MCOL-2178 isUnion member only assigned, never used - // MIGR::infinidb_vtable.isUnion = true; // only temp. bypass the 2nd phase. // recover original gwip->subQuery = orig; gwip->lastSub = existsSub; @@ -6985,8 +6983,6 @@ int processFrom(bool& isUnion, SELECT_LEX& select_lex, gp_walk_info& gwi, SCSEP& gwi.tbList.push_back(tn); CalpontSystemCatalog::TableAliasName tan = make_aliastable("", alias, alias); gwi.tableMap[tan] = make_pair(0, table_ptr); - // MCOL-2178 isUnion member only assigned, never used - // MIGR::infinidb_vtable.isUnion = true; //by-pass the 2nd pass of rnd_init } else if (table_ptr->view) { @@ -7086,8 +7082,6 @@ int processFrom(bool& isUnion, SELECT_LEX& select_lex, gp_walk_info& gwi, SCSEP& if (!isUnion && (!isSelectHandlerTop || isSelectLexUnit) && select_lex.master_unit()->is_unit_op()) { - // MCOL-2178 isUnion member only assigned, never used - // MIGR::infinidb_vtable.isUnion = true; CalpontSelectExecutionPlan::SelectList unionVec; SELECT_LEX* select_cursor = select_lex.master_unit()->first_select(); unionSel = true; @@ -7139,101 +7133,101 @@ int processFrom(bool& isUnion, SELECT_LEX& select_lex, gp_walk_info& gwi, SCSEP& * RETURNS * none ***********************************************************/ - void buildInToExistsFilter(gp_walk_info& gwi, SELECT_LEX& select_lex) - { - RowColumn* rlhs = dynamic_cast(gwi.inSubQueryLHS); - - size_t additionalRetColsBefore = gwi.additionalRetCols.size(); - - if (rlhs) - { - idbassert(gwi.inSubQueryLHSItem->type() == Item::ROW_ITEM); - - Item_row* row = (Item_row*)gwi.inSubQueryLHSItem; - - idbassert(!rlhs->columnVec().empty() && (rlhs->columnVec().size() == gwi.returnedCols.size()) && - row->cols() && (row->cols() == select_lex.item_list.elements) && - (row->cols() == gwi.returnedCols.size())); - - List_iterator_fast it(select_lex.item_list); - Item* item; - - int i = 0; - - ParseTree* rowFilter = nullptr; - - while ((item = it++)) - { - boost::shared_ptr sop(new PredicateOperator("=")); - vector itemList = {row->element_index(i), item}; - ReturnedColumn* rhs = gwi.returnedCols[i]->clone(); - - buildEqualityPredicate(rlhs->columnVec()[i]->clone(), rhs, &gwi, sop, Item_func::EQ_FUNC, itemList, - true); - - if (gwi.fatalParseError) - { - delete rlhs; - return; - } - - ParseTree* tmpFilter = nullptr; - - if (!gwi.ptWorkStack.empty()) - { - tmpFilter = gwi.ptWorkStack.top(); - gwi.ptWorkStack.pop(); - } - - if (i == 0 && tmpFilter) - { - rowFilter = tmpFilter; - } - else if (i != 0 && tmpFilter && rowFilter) - { - ParseTree* ptp = new ParseTree(new LogicOperator("and")); - ptp->left(rowFilter); - ptp->right(tmpFilter); - rowFilter = ptp; - } - - i++; - } - - delete rlhs; - - if (rowFilter) - gwi.ptWorkStack.push(rowFilter); - } - else - { - idbassert((gwi.returnedCols.size() == 1) && (select_lex.item_list.elements == 1)); - - boost::shared_ptr sop(new PredicateOperator("=")); - vector itemList = {gwi.inSubQueryLHSItem, select_lex.item_list.head()}; - ReturnedColumn* rhs = gwi.returnedCols[0]->clone(); - buildEqualityPredicate(gwi.inSubQueryLHS, rhs, &gwi, sop, Item_func::EQ_FUNC, itemList, true); - - if (gwi.fatalParseError) - return; - } - - size_t additionalRetColsAdded = gwi.additionalRetCols.size() - additionalRetColsBefore; - - if (gwi.returnedCols.size() && (gwi.returnedCols.size() == additionalRetColsAdded)) - { - for (size_t i = 0; i < gwi.returnedCols.size(); i++) - { - gwi.returnedCols[i]->expressionId(gwi.additionalRetCols[additionalRetColsBefore + i]->expressionId()); - gwi.returnedCols[i]->colSource(gwi.additionalRetCols[additionalRetColsBefore + i]->colSource()); - } - - // Delete the duplicate copy of the returned cols - auto iter = gwi.additionalRetCols.begin(); - std::advance(iter, additionalRetColsBefore); - gwi.additionalRetCols.erase(iter, gwi.additionalRetCols.end()); - } - } +void buildInToExistsFilter(gp_walk_info& gwi, SELECT_LEX& select_lex) +{ + RowColumn* rlhs = dynamic_cast(gwi.inSubQueryLHS); + + size_t additionalRetColsBefore = gwi.additionalRetCols.size(); + + if (rlhs) + { + idbassert(gwi.inSubQueryLHSItem->type() == Item::ROW_ITEM); + + Item_row* row = (Item_row*)gwi.inSubQueryLHSItem; + + idbassert(!rlhs->columnVec().empty() && (rlhs->columnVec().size() == gwi.returnedCols.size()) && + row->cols() && (row->cols() == select_lex.item_list.elements) && + (row->cols() == gwi.returnedCols.size())); + + List_iterator_fast it(select_lex.item_list); + Item* item; + + int i = 0; + + ParseTree* rowFilter = nullptr; + + while ((item = it++)) + { + boost::shared_ptr sop(new PredicateOperator("=")); + vector itemList = {row->element_index(i), item}; + ReturnedColumn* rhs = gwi.returnedCols[i]->clone(); + + buildEqualityPredicate(rlhs->columnVec()[i]->clone(), rhs, &gwi, sop, Item_func::EQ_FUNC, itemList, + true); + + if (gwi.fatalParseError) + { + delete rlhs; + return; + } + + ParseTree* tmpFilter = nullptr; + + if (!gwi.ptWorkStack.empty()) + { + tmpFilter = gwi.ptWorkStack.top(); + gwi.ptWorkStack.pop(); + } + + if (i == 0 && tmpFilter) + { + rowFilter = tmpFilter; + } + else if (i != 0 && tmpFilter && rowFilter) + { + ParseTree* ptp = new ParseTree(new LogicOperator("and")); + ptp->left(rowFilter); + ptp->right(tmpFilter); + rowFilter = ptp; + } + + i++; + } + + delete rlhs; + + if (rowFilter) + gwi.ptWorkStack.push(rowFilter); + } + else + { + idbassert((gwi.returnedCols.size() == 1) && (select_lex.item_list.elements == 1)); + + boost::shared_ptr sop(new PredicateOperator("=")); + vector itemList = {gwi.inSubQueryLHSItem, select_lex.item_list.head()}; + ReturnedColumn* rhs = gwi.returnedCols[0]->clone(); + buildEqualityPredicate(gwi.inSubQueryLHS, rhs, &gwi, sop, Item_func::EQ_FUNC, itemList, true); + + if (gwi.fatalParseError) + return; + } + + size_t additionalRetColsAdded = gwi.additionalRetCols.size() - additionalRetColsBefore; + + if (gwi.returnedCols.size() && (gwi.returnedCols.size() == additionalRetColsAdded)) + { + for (size_t i = 0; i < gwi.returnedCols.size(); i++) + { + gwi.returnedCols[i]->expressionId(gwi.additionalRetCols[additionalRetColsBefore + i]->expressionId()); + gwi.returnedCols[i]->colSource(gwi.additionalRetCols[additionalRetColsBefore + i]->colSource()); + } + + // Delete the duplicate copy of the returned cols + auto iter = gwi.additionalRetCols.begin(); + std::advance(iter, additionalRetColsBefore); + gwi.additionalRetCols.erase(iter, gwi.additionalRetCols.end()); + } +} /*@brief Process HAVING part of the query or sub-query */ /*********************************************************** @@ -7242,7 +7236,8 @@ int processFrom(bool& isUnion, SELECT_LEX& select_lex, gp_walk_info& gwi, SCSEP& * RETURNS * error id as an int ***********************************************************/ - int processHaving(SELECT_LEX& select_lex, gp_walk_info& gwi, SCSEP& csep, std::unique_ptr& havingFilter) +int processHaving(SELECT_LEX& select_lex, gp_walk_info& gwi, SCSEP& csep, + std::unique_ptr& havingFilter) { gwi.havingDespiteSelect = true; clearStacks(gwi, false, true); @@ -7533,9 +7528,9 @@ int processGroupBy(SELECT_LEX& select_lex, gp_walk_info& gwi, const bool withRol // @bug5638. The group by column is constant but not counter, alias has to match a column // on the select list else if (!groupcol->counter_used && - (groupItem->type() == Item::CONST_ITEM && + (groupItem->type() == Item::CONST_ITEM && (groupItem->cmp_type() == INT_RESULT || groupItem->cmp_type() == STRING_RESULT || - groupItem->cmp_type() == REAL_RESULT || groupItem->cmp_type() == DECIMAL_RESULT))) + groupItem->cmp_type() == REAL_RESULT || groupItem->cmp_type() == DECIMAL_RESULT))) { ReturnedColumn* rc = 0; @@ -8086,8 +8081,6 @@ int processLimitAndOffset(SELECT_LEX& select_lex, gp_walk_info& gwi, SCSEP& csep return 0; } - - /*@brief Process SELECT part of a query or sub-query */ /*********************************************************** * DESCRIPTION: @@ -8095,505 +8088,501 @@ int processLimitAndOffset(SELECT_LEX& select_lex, gp_walk_info& gwi, SCSEP& csep * RETURNS * error id as an int ***********************************************************/ - int processSelect(SELECT_LEX& select_lex, gp_walk_info& gwi, SCSEP& csep, - vector& funcFieldVec, - CalpontSelectExecutionPlan::SelectList& selectSubList) - { - gwi.select_lex = &select_lex; - #ifdef DEBUG_WALK_COND - { - cerr << "------------------- SELECT --------------------" << endl; - List_iterator_fast it(select_lex.item_list); - Item* item; - - while ((item = it++)) - { - debug_walk(item, 0); - } - - cerr << "-----------------------------------------------\n" << endl; - } - #endif - - // analyze SELECT and ORDER BY parts - do they have implicit GROUP BY induced by aggregates? - { - if (select_lex.group_list.first) - { - // we have an explicit GROUP BY. - gwi.implicitExplicitGroupBy = true; - } - else - { - // do we have an implicit GROUP BY? - List_iterator_fast it(select_lex.item_list); - Item* item; - - while ((item = it++)) - { - analyzeForImplicitGroupBy(item, gwi); - } - SQL_I_List order_list = select_lex.order_list; - ORDER* ordercol = static_cast(order_list.first); - - for (; ordercol; ordercol = ordercol->next) - { - analyzeForImplicitGroupBy(*(ordercol->item), gwi); - } - } - } - // populate returnedcolumnlist and columnmap - List_iterator_fast it(select_lex.item_list); - Item* item; - - // empty rcWorkStack and ptWorkStack. They should all be empty by now. - clearStacks(gwi, false, true); - - // indicate the starting pos of scalar returned column, because some join column - // has been inserted to the returned column list. - if (gwi.subQuery) - { - ScalarSub* scalar = dynamic_cast(gwi.subQuery); - - if (scalar) - scalar->returnedColPos(gwi.additionalRetCols.size()); - } - - - while ((item = it++)) - { - string itemAlias = (item->name.length ? item->name.str : ""); - - // @bug 5916. Need to keep checking until getting concret item in case - // of nested view. - Item* baseItem = item; - while (item->type() == Item::REF_ITEM) - { - Item_ref* ref = (Item_ref*)item; - item = (*(ref->ref)); - } - - Item::Type itype = item->type(); - - switch (itype) - { - case Item::FIELD_ITEM: - { - Item_field* ifp = (Item_field*)item; - SimpleColumn* sc = NULL; - - if (ifp->field_name.length && string(ifp->field_name.str) == "*") - { - collectAllCols(gwi, ifp); - break; - } - sc = buildSimpleColumn(ifp, gwi); - - if (sc) - { - string fullname; - String str; - ifp->print(&str, QT_ORDINARY); - fullname = str.c_ptr(); - - if (!ifp->is_explicit_name()) // no alias - { - sc->alias(fullname); - } - else // alias - { - if (!itemAlias.empty()) - sc->alias(itemAlias); - } - - // We need to look into GROUP BY columns to decide if we need to wrap a column. - ReturnedColumn* rc = wrapIntoAggregate(sc, gwi, baseItem); - - SRCP sprc(rc); - pushReturnedCol(gwi, baseItem, sprc); - - gwi.columnMap.insert( - CalpontSelectExecutionPlan::ColumnMap::value_type(string(ifp->field_name.str), sprc)); - TABLE_LIST* tmp = 0; - - if (ifp->cached_table) - tmp = ifp->cached_table; - - gwi.tableMap[make_aliastable(sc->schemaName(), sc->tableName(), sc->tableAlias(), - sc->isColumnStore())] = make_pair(1, tmp); - } - else - { - setError(gwi.thd, ER_INTERNAL_ERROR, gwi.parseErrorText, gwi); - delete sc; - return ER_INTERNAL_ERROR; - } - - break; - } - - // aggregate column - case Item::SUM_FUNC_ITEM: - { - ReturnedColumn* ac = buildAggregateColumn(item, gwi); - - if (gwi.fatalParseError) - { - // e.g., non-support ref column - setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); - delete ac; - return ER_CHECK_NOT_IMPLEMENTED; - } - - // add this agg col to returnedColumnList - boost::shared_ptr spac(ac); - pushReturnedCol(gwi, item, spac); - break; - } - - case Item::FUNC_ITEM: - { - Item_func* ifp = static_cast(item); - - // @bug4383. error out non-support stored function - if (ifp->functype() == Item_func::FUNC_SP) - { - gwi.fatalParseError = true; - gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_SP_FUNCTION_NOT_SUPPORT); - setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); - return ER_CHECK_NOT_IMPLEMENTED; - } - - if (string(ifp->func_name()) == "xor") - { - gwi.fatalParseError = true; - gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_FILTER_COND_EXP); - setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); - return ER_CHECK_NOT_IMPLEMENTED; - } - - uint16_t parseInfo = 0; - vector tmpVec; - bool hasNonSupportItem = false; - parse_item(ifp, tmpVec, hasNonSupportItem, parseInfo, &gwi); - - if (ifp->with_subquery() || string(ifp->func_name()) == string("") || - ifp->functype() == Item_func::NOT_ALL_FUNC || parseInfo & SUB_BIT) - { - gwi.fatalParseError = true; - gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_NON_SUPPORT_SELECT_SUB); - setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); - return ER_CHECK_NOT_IMPLEMENTED; - } - - // if "IN" or "BETWEEN" are in the SELECT clause, build function column - string funcName = ifp->func_name(); - ReturnedColumn* rc; - if (funcName == "in" || funcName == " IN " || funcName == "between") - { - rc = buildFunctionColumn(ifp, gwi, hasNonSupportItem, true); - } - else - { - rc = buildFunctionColumn(ifp, gwi, hasNonSupportItem); - } - - SRCP srcp(rc); - - if (rc) - { - // MCOL-2178 CS has to process determenistic functions with constant arguments. - if (!hasNonSupportItem && ifp->const_item() && !(parseInfo & AF_BIT) && tmpVec.size() == 0) - { - srcp.reset(buildReturnedColumn(item, gwi, gwi.fatalParseError)); - pushReturnedCol(gwi, item, srcp); - - if (ifp->name.length) - srcp->alias(ifp->name.str); - - continue; - } - // FIXME: usage of pushReturnedCol instead of gwi.returnedCols.push_back(srcp) here - // made within MCOL-5776 produced bug MCOL-5932 so, the check of equal columns is disabled - pushReturnedCol(gwi, item, srcp); - } - else // This was a vtable post-process block - { - hasNonSupportItem = false; - uint32_t before_size = funcFieldVec.size(); - parse_item(ifp, funcFieldVec, hasNonSupportItem, parseInfo, &gwi); - uint32_t after_size = funcFieldVec.size(); - - // pushdown handler projection functions - // @bug3881. set_user_var can not be treated as constant function - // @bug5716. Try to avoid post process function for union query. - if (!hasNonSupportItem && (after_size - before_size) == 0 && !(parseInfo & AGG_BIT) && - !(parseInfo & SUB_BIT)) - { - ConstantColumn* cc = buildConstantColumnMaybeNullUsingValStr(ifp, gwi); - - SRCP srcp(cc); - - if (ifp->name.length) - cc->alias(ifp->name.str); - - pushReturnedCol(gwi, ifp, srcp); - - // clear the error set by buildFunctionColumn - gwi.fatalParseError = false; - gwi.parseErrorText = ""; - break; - } - else if (hasNonSupportItem || parseInfo & AGG_BIT || parseInfo & SUB_BIT || - (gwi.fatalParseError && gwi.subQuery)) - { - if (gwi.parseErrorText.empty()) - { - Message::Args args; - args.add(ifp->func_name()); - gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_NON_SUPPORTED_FUNCTION, args); - } - - setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); - return ER_CHECK_NOT_IMPLEMENTED; - } - else if (gwi.subQuery && (isPredicateFunction(ifp, &gwi) || ifp->type() == Item::COND_ITEM)) - { - gwi.fatalParseError = true; - gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_FILTER_COND_EXP); - setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); - return ER_CHECK_NOT_IMPLEMENTED; - } - - //@Bug 3030 Add error check for dml statement - if (ha_mcs_common::isUpdateOrDeleteStatement(gwi.thd->lex->sql_command)) - { - if (after_size - before_size != 0) - { - gwi.parseErrorText = ifp->func_name(); - return -1; - } - } - else - { - Message::Args args; - args.add(ifp->func_name()); - gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_NON_SUPPORTED_FUNCTION, args); - setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); - return ER_CHECK_NOT_IMPLEMENTED; - } - } - - break; - } // End of FUNC_ITEM - - // DRRTUY Replace the whole section with typeid() checks or use - // static_cast here - case Item::CONST_ITEM: - { - switch (item->cmp_type()) - - { - case INT_RESULT: - case STRING_RESULT: - case DECIMAL_RESULT: - case REAL_RESULT: - case TIME_RESULT: - { - if (ha_mcs_common::isUpdateOrDeleteStatement(gwi.thd->lex->sql_command)) - { - } - else - { - // do not push the dummy column (mysql added) to returnedCol - if (item->name.length && string(item->name.str) == "Not_used") - continue; - - // @bug3509. Constant column is sent to ExeMgr now. - SRCP srcp(buildReturnedColumn(item, gwi, gwi.fatalParseError)); - - if (item->name.length) - srcp->alias(item->name.str); - - pushReturnedCol(gwi, item, srcp); - } - - break; - } - // MCOL-2178 This switch doesn't handl - // ROW_ - default: - { - IDEBUG(cerr << "Warning unsupported cmp_type() in projection" << endl); - // noop - } - } - break; - } // CONST_ITEM ends here - - case Item::NULL_ITEM: - { - if (ha_mcs_common::isUpdateOrDeleteStatement(gwi.thd->lex->sql_command)) - { - } - else - { - SRCP srcp(buildReturnedColumn(item, gwi, gwi.fatalParseError)); - pushReturnedCol(gwi, item, srcp); - - if (item->name.length) - srcp->alias(item->name.str); - } - - break; - } - - case Item::SUBSELECT_ITEM: - { - Item_subselect* sub = (Item_subselect*)item; - - if (sub->substype() != Item_subselect::SINGLEROW_SUBS) - { - gwi.fatalParseError = true; - gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_NON_SUPPORT_SELECT_SUB); - setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); - return ER_CHECK_NOT_IMPLEMENTED; - } - - #ifdef DEBUG_WALK_COND - cerr << "SELECT clause SUBSELECT Item: " << sub->substype() << endl; - JOIN* join = sub->get_select_lex()->join; - - if (join) - { - Item_cond* cond = static_cast(join->conds); - - if (cond) - cond->traverse_cond(debug_walk, &gwi, Item::POSTFIX); - } - - cerr << "Finish SELECT clause subselect item traversing" << endl; - #endif - SelectSubQuery* selectSub = new SelectSubQuery(gwi, sub); - // selectSub->gwip(&gwi); - SCSEP ssub = selectSub->transform(); - - if (!ssub || gwi.fatalParseError) - { - if (gwi.parseErrorText.empty()) - gwi.parseErrorText = "Unsupported Item in SELECT subquery."; - - setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); - - return ER_CHECK_NOT_IMPLEMENTED; - } - - selectSubList.push_back(ssub); - SimpleColumn* rc = new SimpleColumn(); - rc->colSource(rc->colSource() | SELECT_SUB); - rc->timeZone(gwi.timeZone); - - if (sub->get_select_lex()->get_table_list()) - { - rc->viewName(getViewName(sub->get_select_lex()->get_table_list()), lower_case_table_names); - } - if (sub->name.length) - rc->alias(sub->name.str); - - gwi.returnedCols.push_back(SRCP(rc)); - - break; - } - - case Item::COND_ITEM: - { - gwi.fatalParseError = true; - gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_FILTER_COND_EXP); - setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); - return ER_CHECK_NOT_IMPLEMENTED; - } - - case Item::EXPR_CACHE_ITEM: - { - printf("EXPR_CACHE_ITEM in getSelectPlan\n"); - gwi.fatalParseError = true; - gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_UNKNOWN_COL); - setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); - return ER_CHECK_NOT_IMPLEMENTED; - } - - case Item::WINDOW_FUNC_ITEM: - { - SRCP srcp(buildWindowFunctionColumn(item, gwi, gwi.fatalParseError)); - - if (!srcp || gwi.fatalParseError) - { - if (gwi.parseErrorText.empty()) - gwi.parseErrorText = "Unsupported Item in SELECT subquery."; - - setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); - return ER_CHECK_NOT_IMPLEMENTED; - } - - pushReturnedCol(gwi, item, srcp); - break; - } - case Item::TYPE_HOLDER: - { - if (!gwi.tbList.size()) - { - gwi.parseErrorText = "subquery with VALUES"; - gwi.fatalParseError = true; - setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); - return ER_CHECK_NOT_IMPLEMENTED; - } - else - { - std::cerr << "********** received TYPE_HOLDER *********" << std::endl; - } - break; - } - - default: - { - break; - } - } - } - - // @bug4388 normalize the project coltypes for union main select list - if (!csep->unionVec().empty()) - { - unsigned int unionedTypeRc = 0; - - for (uint32_t i = 0; i < gwi.returnedCols.size(); i++) - { - vector coltypes; - - for (uint32_t j = 0; j < csep->unionVec().size(); j++) - { - CalpontSelectExecutionPlan* unionCsep = - dynamic_cast(csep->unionVec()[j].get()); - coltypes.push_back(unionCsep->returnedCols()[i]->resultType()); - - // @bug5976. set hasAggregate true for the main column if - // one corresponding union column has aggregate - if (unionCsep->returnedCols()[i]->hasAggregate()) - gwi.returnedCols[i]->hasAggregate(true); - } - - gwi.returnedCols[i]->resultType( - CalpontSystemCatalog::ColType::convertUnionColType(coltypes, unionedTypeRc)); - - if (unionedTypeRc != 0) - { - gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(unionedTypeRc); - setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); - return ER_CHECK_NOT_IMPLEMENTED; - } - } - } - return 0; - } +int processSelect(SELECT_LEX& select_lex, gp_walk_info& gwi, SCSEP& csep, vector& funcFieldVec, + CalpontSelectExecutionPlan::SelectList& selectSubList) +{ + gwi.select_lex = &select_lex; +#ifdef DEBUG_WALK_COND + { + cerr << "------------------- SELECT --------------------" << endl; + List_iterator_fast it(select_lex.item_list); + Item* item; + + while ((item = it++)) + { + debug_walk(item, 0); + } + + cerr << "-----------------------------------------------\n" << endl; + } +#endif + + // analyze SELECT and ORDER BY parts - do they have implicit GROUP BY induced by aggregates? + { + if (select_lex.group_list.first) + { + // we have an explicit GROUP BY. + gwi.implicitExplicitGroupBy = true; + } + else + { + // do we have an implicit GROUP BY? + List_iterator_fast it(select_lex.item_list); + Item* item; + + while ((item = it++)) + { + analyzeForImplicitGroupBy(item, gwi); + } + SQL_I_List order_list = select_lex.order_list; + ORDER* ordercol = static_cast(order_list.first); + + for (; ordercol; ordercol = ordercol->next) + { + analyzeForImplicitGroupBy(*(ordercol->item), gwi); + } + } + } + // populate returnedcolumnlist and columnmap + List_iterator_fast it(select_lex.item_list); + Item* item; + + // empty rcWorkStack and ptWorkStack. They should all be empty by now. + clearStacks(gwi, false, true); + + // indicate the starting pos of scalar returned column, because some join column + // has been inserted to the returned column list. + if (gwi.subQuery) + { + ScalarSub* scalar = dynamic_cast(gwi.subQuery); + + if (scalar) + scalar->returnedColPos(gwi.additionalRetCols.size()); + } + + while ((item = it++)) + { + string itemAlias = (item->name.length ? item->name.str : ""); + + // @bug 5916. Need to keep checking until getting concret item in case + // of nested view. + Item* baseItem = item; + while (item->type() == Item::REF_ITEM) + { + Item_ref* ref = (Item_ref*)item; + item = (*(ref->ref)); + } + + Item::Type itype = item->type(); + + switch (itype) + { + case Item::FIELD_ITEM: + { + Item_field* ifp = (Item_field*)item; + SimpleColumn* sc = NULL; + + if (ifp->field_name.length && string(ifp->field_name.str) == "*") + { + collectAllCols(gwi, ifp); + break; + } + sc = buildSimpleColumn(ifp, gwi); + + if (sc) + { + string fullname; + String str; + ifp->print(&str, QT_ORDINARY); + fullname = str.c_ptr(); + + if (!ifp->is_explicit_name()) // no alias + { + sc->alias(fullname); + } + else // alias + { + if (!itemAlias.empty()) + sc->alias(itemAlias); + } + + // We need to look into GROUP BY columns to decide if we need to wrap a column. + ReturnedColumn* rc = wrapIntoAggregate(sc, gwi, baseItem); + + SRCP sprc(rc); + pushReturnedCol(gwi, baseItem, sprc); + + gwi.columnMap.insert( + CalpontSelectExecutionPlan::ColumnMap::value_type(string(ifp->field_name.str), sprc)); + TABLE_LIST* tmp = 0; + + if (ifp->cached_table) + tmp = ifp->cached_table; + + gwi.tableMap[make_aliastable(sc->schemaName(), sc->tableName(), sc->tableAlias(), + sc->isColumnStore())] = make_pair(1, tmp); + } + else + { + setError(gwi.thd, ER_INTERNAL_ERROR, gwi.parseErrorText, gwi); + delete sc; + return ER_INTERNAL_ERROR; + } + + break; + } + + // aggregate column + case Item::SUM_FUNC_ITEM: + { + ReturnedColumn* ac = buildAggregateColumn(item, gwi); + + if (gwi.fatalParseError) + { + // e.g., non-support ref column + setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); + delete ac; + return ER_CHECK_NOT_IMPLEMENTED; + } + + // add this agg col to returnedColumnList + boost::shared_ptr spac(ac); + pushReturnedCol(gwi, item, spac); + break; + } + + case Item::FUNC_ITEM: + { + Item_func* ifp = static_cast(item); + + // @bug4383. error out non-support stored function + if (ifp->functype() == Item_func::FUNC_SP) + { + gwi.fatalParseError = true; + gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_SP_FUNCTION_NOT_SUPPORT); + setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); + return ER_CHECK_NOT_IMPLEMENTED; + } + + if (string(ifp->func_name()) == "xor") + { + gwi.fatalParseError = true; + gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_FILTER_COND_EXP); + setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); + return ER_CHECK_NOT_IMPLEMENTED; + } + + uint16_t parseInfo = 0; + vector tmpVec; + bool hasNonSupportItem = false; + parse_item(ifp, tmpVec, hasNonSupportItem, parseInfo, &gwi); + + if (ifp->with_subquery() || string(ifp->func_name()) == string("") || + ifp->functype() == Item_func::NOT_ALL_FUNC || parseInfo & SUB_BIT) + { + gwi.fatalParseError = true; + gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_NON_SUPPORT_SELECT_SUB); + setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); + return ER_CHECK_NOT_IMPLEMENTED; + } + + // if "IN" or "BETWEEN" are in the SELECT clause, build function column + string funcName = ifp->func_name(); + ReturnedColumn* rc; + if (funcName == "in" || funcName == " IN " || funcName == "between") + { + rc = buildFunctionColumn(ifp, gwi, hasNonSupportItem, true); + } + else + { + rc = buildFunctionColumn(ifp, gwi, hasNonSupportItem); + } + + SRCP srcp(rc); + + if (rc) + { + // MCOL-2178 CS has to process determenistic functions with constant arguments. + if (!hasNonSupportItem && ifp->const_item() && !(parseInfo & AF_BIT) && tmpVec.size() == 0) + { + srcp.reset(buildReturnedColumn(item, gwi, gwi.fatalParseError)); + pushReturnedCol(gwi, item, srcp); + + if (ifp->name.length) + srcp->alias(ifp->name.str); + + continue; + } + // FIXME: usage of pushReturnedCol instead of gwi.returnedCols.push_back(srcp) here + // made within MCOL-5776 produced bug MCOL-5932 so, the check of equal columns is disabled + pushReturnedCol(gwi, item, srcp); + } + else // This was a vtable post-process block + { + hasNonSupportItem = false; + uint32_t before_size = funcFieldVec.size(); + parse_item(ifp, funcFieldVec, hasNonSupportItem, parseInfo, &gwi); + uint32_t after_size = funcFieldVec.size(); + + // pushdown handler projection functions + // @bug3881. set_user_var can not be treated as constant function + // @bug5716. Try to avoid post process function for union query. + if (!hasNonSupportItem && (after_size - before_size) == 0 && !(parseInfo & AGG_BIT) && + !(parseInfo & SUB_BIT)) + { + ConstantColumn* cc = buildConstantColumnMaybeNullUsingValStr(ifp, gwi); + + SRCP srcp(cc); + + if (ifp->name.length) + cc->alias(ifp->name.str); + + pushReturnedCol(gwi, ifp, srcp); + + // clear the error set by buildFunctionColumn + gwi.fatalParseError = false; + gwi.parseErrorText = ""; + break; + } + else if (hasNonSupportItem || parseInfo & AGG_BIT || parseInfo & SUB_BIT || + (gwi.fatalParseError && gwi.subQuery)) + { + if (gwi.parseErrorText.empty()) + { + Message::Args args; + args.add(ifp->func_name()); + gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_NON_SUPPORTED_FUNCTION, args); + } + + setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); + return ER_CHECK_NOT_IMPLEMENTED; + } + else if (gwi.subQuery && (isPredicateFunction(ifp, &gwi) || ifp->type() == Item::COND_ITEM)) + { + gwi.fatalParseError = true; + gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_FILTER_COND_EXP); + setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); + return ER_CHECK_NOT_IMPLEMENTED; + } + + //@Bug 3030 Add error check for dml statement + if (ha_mcs_common::isUpdateOrDeleteStatement(gwi.thd->lex->sql_command)) + { + if (after_size - before_size != 0) + { + gwi.parseErrorText = ifp->func_name(); + return -1; + } + } + else + { + Message::Args args; + args.add(ifp->func_name()); + gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_NON_SUPPORTED_FUNCTION, args); + setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); + return ER_CHECK_NOT_IMPLEMENTED; + } + } + + break; + } // End of FUNC_ITEM + + // DRRTUY Replace the whole section with typeid() checks or use + // static_cast here + case Item::CONST_ITEM: + { + switch (item->cmp_type()) + + { + case INT_RESULT: + case STRING_RESULT: + case DECIMAL_RESULT: + case REAL_RESULT: + case TIME_RESULT: + { + if (ha_mcs_common::isUpdateOrDeleteStatement(gwi.thd->lex->sql_command)) + { + } + else + { + // do not push the dummy column (mysql added) to returnedCol + if (item->name.length && string(item->name.str) == "Not_used") + continue; + + // @bug3509. Constant column is sent to ExeMgr now. + SRCP srcp(buildReturnedColumn(item, gwi, gwi.fatalParseError)); + + if (item->name.length) + srcp->alias(item->name.str); + + pushReturnedCol(gwi, item, srcp); + } + + break; + } + default: + { + IDEBUG(cerr << "Warning unsupported cmp_type() in projection" << endl); + // noop + } + } + break; + } // CONST_ITEM ends here + + case Item::NULL_ITEM: + { + if (ha_mcs_common::isUpdateOrDeleteStatement(gwi.thd->lex->sql_command)) + { + } + else + { + SRCP srcp(buildReturnedColumn(item, gwi, gwi.fatalParseError)); + pushReturnedCol(gwi, item, srcp); + + if (item->name.length) + srcp->alias(item->name.str); + } + + break; + } + + case Item::SUBSELECT_ITEM: + { + Item_subselect* sub = (Item_subselect*)item; + + if (sub->substype() != Item_subselect::SINGLEROW_SUBS) + { + gwi.fatalParseError = true; + gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_NON_SUPPORT_SELECT_SUB); + setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); + return ER_CHECK_NOT_IMPLEMENTED; + } + +#ifdef DEBUG_WALK_COND + cerr << "SELECT clause SUBSELECT Item: " << sub->substype() << endl; + JOIN* join = sub->get_select_lex()->join; + + if (join) + { + Item_cond* cond = static_cast(join->conds); + + if (cond) + cond->traverse_cond(debug_walk, &gwi, Item::POSTFIX); + } + + cerr << "Finish SELECT clause subselect item traversing" << endl; +#endif + SelectSubQuery* selectSub = new SelectSubQuery(gwi, sub); + // selectSub->gwip(&gwi); + SCSEP ssub = selectSub->transform(); + + if (!ssub || gwi.fatalParseError) + { + if (gwi.parseErrorText.empty()) + gwi.parseErrorText = "Unsupported Item in SELECT subquery."; + + setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); + + return ER_CHECK_NOT_IMPLEMENTED; + } + + selectSubList.push_back(ssub); + SimpleColumn* rc = new SimpleColumn(); + rc->colSource(rc->colSource() | SELECT_SUB); + rc->timeZone(gwi.timeZone); + + if (sub->get_select_lex()->get_table_list()) + { + rc->viewName(getViewName(sub->get_select_lex()->get_table_list()), lower_case_table_names); + } + if (sub->name.length) + rc->alias(sub->name.str); + + gwi.returnedCols.push_back(SRCP(rc)); + + break; + } + + case Item::COND_ITEM: + { + gwi.fatalParseError = true; + gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_FILTER_COND_EXP); + setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); + return ER_CHECK_NOT_IMPLEMENTED; + } + + case Item::EXPR_CACHE_ITEM: + { + printf("EXPR_CACHE_ITEM in getSelectPlan\n"); + gwi.fatalParseError = true; + gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_UNKNOWN_COL); + setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); + return ER_CHECK_NOT_IMPLEMENTED; + } + + case Item::WINDOW_FUNC_ITEM: + { + SRCP srcp(buildWindowFunctionColumn(item, gwi, gwi.fatalParseError)); + + if (!srcp || gwi.fatalParseError) + { + if (gwi.parseErrorText.empty()) + gwi.parseErrorText = "Unsupported Item in SELECT subquery."; + + setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); + return ER_CHECK_NOT_IMPLEMENTED; + } + + pushReturnedCol(gwi, item, srcp); + break; + } + case Item::TYPE_HOLDER: + { + if (!gwi.tbList.size()) + { + gwi.parseErrorText = "subquery with VALUES"; + gwi.fatalParseError = true; + setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); + return ER_CHECK_NOT_IMPLEMENTED; + } + else + { + std::cerr << "********** received TYPE_HOLDER *********" << std::endl; + } + break; + } + + default: + { + break; + } + } + } + + // @bug4388 normalize the project coltypes for union main select list + if (!csep->unionVec().empty()) + { + unsigned int unionedTypeRc = 0; + + for (uint32_t i = 0; i < gwi.returnedCols.size(); i++) + { + vector coltypes; + + for (uint32_t j = 0; j < csep->unionVec().size(); j++) + { + CalpontSelectExecutionPlan* unionCsep = + dynamic_cast(csep->unionVec()[j].get()); + coltypes.push_back(unionCsep->returnedCols()[i]->resultType()); + + // @bug5976. set hasAggregate true for the main column if + // one corresponding union column has aggregate + if (unionCsep->returnedCols()[i]->hasAggregate()) + gwi.returnedCols[i]->hasAggregate(true); + } + + gwi.returnedCols[i]->resultType( + CalpontSystemCatalog::ColType::convertUnionColType(coltypes, unionedTypeRc)); + + if (unionedTypeRc != 0) + { + gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(unionedTypeRc); + setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, gwi.parseErrorText, gwi); + return ER_CHECK_NOT_IMPLEMENTED; + } + } + } + return 0; +} /*@brief Process ORDER BY part of a query or sub-query */ /*********************************************************** @@ -8602,143 +8591,177 @@ int processLimitAndOffset(SELECT_LEX& select_lex, gp_walk_info& gwi, SCSEP& csep * RETURNS * error id as an int ***********************************************************/ -int processOrderBy(SELECT_LEX& select_lex, - gp_walk_info& gwi, - SCSEP& csep, - boost::shared_ptr& csc, - SRCP& minSc, - const bool isUnion, - const bool unionSel) +int processOrderBy(SELECT_LEX& select_lex, gp_walk_info& gwi, SCSEP& csep, + boost::shared_ptr& csc, SRCP& minSc, const bool isUnion, + const bool unionSel) { - SQL_I_List order_list = select_lex.order_list; - ORDER* ordercol = static_cast(order_list.first); + SQL_I_List order_list = select_lex.order_list; + ORDER* ordercol = static_cast(order_list.first); - // check if window functions are in order by. InfiniDB process order by list if - // window functions are involved, either in order by or projection. - for (; ordercol; ordercol = ordercol->next) + // check if window functions are in order by. InfiniDB process order by list if + // window functions are involved, either in order by or projection. + for (; ordercol; ordercol = ordercol->next) + { + if ((*(ordercol->item))->type() == Item::WINDOW_FUNC_ITEM) + gwi.hasWindowFunc = true; + // XXX: TODO: implement a proper analysis of what we support. + // MCOL-2166 Looking for this sorting item in GROUP_BY items list. + // Shouldn't look into this if query doesn't have GROUP BY or + // aggregations + if (select_lex.agg_func_used() && select_lex.group_list.first && + !sortItemIsInGrouping(*ordercol->item, select_lex.group_list.first)) { - if ((*(ordercol->item))->type() == Item::WINDOW_FUNC_ITEM) - gwi.hasWindowFunc = true; - // XXX: TODO: implement a proper analysis of what we support. - // MCOL-2166 Looking for this sorting item in GROUP_BY items list. - // Shouldn't look into this if query doesn't have GROUP BY or - // aggregations - if (select_lex.agg_func_used() && select_lex.group_list.first && - !sortItemIsInGrouping(*ordercol->item, select_lex.group_list.first)) + std::ostringstream ostream; + std::ostringstream& osr = ostream; + getColNameFromItem(osr, *ordercol->item); + Message::Args args; + args.add(ostream.str()); + string emsg = IDBErrorInfo::instance()->errorMsg(ERR_NOT_SUPPORTED_GROUPBY_ORDERBY_EXPRESSION, args); + gwi.parseErrorText = emsg; + setError(gwi.thd, ER_INTERNAL_ERROR, emsg, gwi); + return ERR_NOT_SUPPORTED_GROUPBY_ORDERBY_EXPRESSION; + } + } + + // re-visit the first of ordercol list + ordercol = static_cast(order_list.first); + + for (; ordercol; ordercol = ordercol->next) + { + ReturnedColumn* rc = NULL; + + if (ordercol->in_field_list && ordercol->counter_used) + { + rc = gwi.returnedCols[ordercol->counter - 1]->clone(); + rc->orderPos(ordercol->counter - 1); + // can not be optimized off if used in order by with counter. + // set with self derived table alias if it's derived table + gwi.returnedCols[ordercol->counter - 1]->incRefCount(); + } + else + { + Item* ord_item = *(ordercol->item); + + // ignore not_used column on order by. + if ((ord_item->type() == Item::CONST_ITEM && ord_item->cmp_type() == INT_RESULT) && + ord_item->full_name() && !strcmp(ord_item->full_name(), "Not_used")) { - std::ostringstream ostream; - std::ostringstream& osr = ostream; - getColNameFromItem(osr, *ordercol->item); - Message::Args args; - args.add(ostream.str()); - string emsg = IDBErrorInfo::instance()->errorMsg(ERR_NOT_SUPPORTED_GROUPBY_ORDERBY_EXPRESSION, args); + continue; + } + else if (ord_item->type() == Item::CONST_ITEM && ord_item->cmp_type() == INT_RESULT) + { + // DRRTUY This section looks useless b/c there is no + // way to put constant INT into an ORDER BY list + rc = gwi.returnedCols[((Item_int*)ord_item)->val_int() - 1]->clone(); + } + else if (ord_item->type() == Item::SUBSELECT_ITEM) + { + gwi.fatalParseError = true; + } + else if ((ord_item->type() == Item::FUNC_ITEM) && + (((Item_func*)ord_item)->functype() == Item_func::COLLATE_FUNC)) + { + push_warning(gwi.thd, Sql_condition::WARN_LEVEL_NOTE, WARN_OPTION_IGNORED, + "COLLATE is ignored in ColumnStore"); + continue; + } + else + { + rc = buildReturnedColumn(ord_item, gwi, gwi.fatalParseError); + + rc = wrapIntoAggregate(rc, gwi, ord_item); + } + // @bug5501 try item_ptr if item can not be fixed. For some + // weird dml statement state, item can not be fixed but the + // infomation is available in item_ptr. + if (!rc || gwi.fatalParseError) + { + Item* item_ptr = ordercol->item_ptr; + + while (item_ptr->type() == Item::REF_ITEM) + item_ptr = *(((Item_ref*)item_ptr)->ref); + + rc = buildReturnedColumn(item_ptr, gwi, gwi.fatalParseError); + } + + if (!rc) + { + string emsg = IDBErrorInfo::instance()->errorMsg(ERR_NON_SUPPORT_ORDER_BY); gwi.parseErrorText = emsg; - setError(gwi.thd, ER_INTERNAL_ERROR, emsg, gwi); - return ERR_NOT_SUPPORTED_GROUPBY_ORDERBY_EXPRESSION; + setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, emsg, gwi); + return ER_CHECK_NOT_IMPLEMENTED; } } - // re-visit the first of ordercol list - ordercol = static_cast(order_list.first); + if (ordercol->direction == ORDER::ORDER_ASC) + rc->asc(true); + else + rc->asc(false); - for (; ordercol; ordercol = ordercol->next) + gwi.orderByCols.push_back(SRCP(rc)); + } + + // make sure columnmap, returnedcols and count(*) arg_list are not empty + TableMap::iterator tb_iter = gwi.tableMap.begin(); + + try + { + for (; tb_iter != gwi.tableMap.end(); tb_iter++) { - ReturnedColumn* rc = NULL; + if ((*tb_iter).second.first == 1) + continue; - if (ordercol->in_field_list && ordercol->counter_used) - { - rc = gwi.returnedCols[ordercol->counter - 1]->clone(); - rc->orderPos(ordercol->counter - 1); - // can not be optimized off if used in order by with counter. - // set with self derived table alias if it's derived table - gwi.returnedCols[ordercol->counter - 1]->incRefCount(); - } - else - { - Item* ord_item = *(ordercol->item); - - // ignore not_used column on order by. - if ((ord_item->type() == Item::CONST_ITEM && ord_item->cmp_type() == INT_RESULT) && - ord_item->full_name() && !strcmp(ord_item->full_name(), "Not_used")) - { - continue; - } - else if (ord_item->type() == Item::CONST_ITEM && ord_item->cmp_type() == INT_RESULT) - { - // DRRTUY This section looks useless b/c there is no - // way to put constant INT into an ORDER BY list - rc = gwi.returnedCols[((Item_int*)ord_item)->val_int() - 1]->clone(); - } - else if (ord_item->type() == Item::SUBSELECT_ITEM) - { - gwi.fatalParseError = true; - } - else if ((ord_item->type() == Item::FUNC_ITEM) && - (((Item_func*)ord_item)->functype() == Item_func::COLLATE_FUNC)) - { - push_warning(gwi.thd, Sql_condition::WARN_LEVEL_NOTE, WARN_OPTION_IGNORED, - "COLLATE is ignored in ColumnStore"); - continue; - } - else - { - rc = buildReturnedColumn(ord_item, gwi, gwi.fatalParseError); - - rc = wrapIntoAggregate(rc, gwi, ord_item); - } - // @bug5501 try item_ptr if item can not be fixed. For some - // weird dml statement state, item can not be fixed but the - // infomation is available in item_ptr. - if (!rc || gwi.fatalParseError) - { - Item* item_ptr = ordercol->item_ptr; - - while (item_ptr->type() == Item::REF_ITEM) - item_ptr = *(((Item_ref*)item_ptr)->ref); - - rc = buildReturnedColumn(item_ptr, gwi, gwi.fatalParseError); - } - - if (!rc) - { - string emsg = IDBErrorInfo::instance()->errorMsg(ERR_NON_SUPPORT_ORDER_BY); - gwi.parseErrorText = emsg; - setError(gwi.thd, ER_CHECK_NOT_IMPLEMENTED, emsg, gwi); - return ER_CHECK_NOT_IMPLEMENTED; - } - } - - if (ordercol->direction == ORDER::ORDER_ASC) - rc->asc(true); - else - rc->asc(false); - - gwi.orderByCols.push_back(SRCP(rc)); + CalpontSystemCatalog::TableAliasName tan = (*tb_iter).first; + CalpontSystemCatalog::TableName tn = make_table((*tb_iter).first.schema, (*tb_iter).first.table); + SimpleColumn* sc = getSmallestColumn(csc, tn, tan, (*tb_iter).second.second->table, gwi); + SRCP srcp(sc); + gwi.columnMap.insert(CalpontSelectExecutionPlan::ColumnMap::value_type(sc->columnName(), srcp)); + (*tb_iter).second.first = 1; } + } + catch (runtime_error& e) + { + setError(gwi.thd, ER_INTERNAL_ERROR, e.what(), gwi); + return ER_INTERNAL_ERROR; + } + catch (...) + { + string emsg = IDBErrorInfo::instance()->errorMsg(ERR_LOST_CONN_EXEMGR); + setError(gwi.thd, ER_INTERNAL_ERROR, emsg, gwi); + return ER_INTERNAL_ERROR; + } - // make sure columnmap, returnedcols and count(*) arg_list are not empty - TableMap::iterator tb_iter = gwi.tableMap.begin(); + if (!gwi.count_asterisk_list.empty() || !gwi.no_parm_func_list.empty() || gwi.returnedCols.empty()) + { + // get the smallest column from colmap + CalpontSelectExecutionPlan::ColumnMap::const_iterator iter; + int minColWidth = 0; + CalpontSystemCatalog::ColType ct; try { - for (; tb_iter != gwi.tableMap.end(); tb_iter++) + for (iter = gwi.columnMap.begin(); iter != gwi.columnMap.end(); ++iter) { - if ((*tb_iter).second.first == 1) - continue; + // should always not null + SimpleColumn* sc = dynamic_cast(iter->second.get()); - CalpontSystemCatalog::TableAliasName tan = (*tb_iter).first; - CalpontSystemCatalog::TableName tn = make_table((*tb_iter).first.schema, (*tb_iter).first.table); - SimpleColumn* sc = getSmallestColumn(csc, tn, tan, (*tb_iter).second.second->table, gwi); - SRCP srcp(sc); - gwi.columnMap.insert(CalpontSelectExecutionPlan::ColumnMap::value_type(sc->columnName(), srcp)); - (*tb_iter).second.first = 1; + if (sc && !(sc->joinInfo() & JOIN_CORRELATED)) + { + ct = csc->colType(sc->oid()); + + if (minColWidth == 0) + { + minColWidth = ct.colWidth; + minSc = iter->second; + } + else if (ct.colWidth < minColWidth) + { + minColWidth = ct.colWidth; + minSc = iter->second; + } + } } } - catch (runtime_error& e) - { - setError(gwi.thd, ER_INTERNAL_ERROR, e.what(), gwi); - return ER_INTERNAL_ERROR; - } catch (...) { string emsg = IDBErrorInfo::instance()->errorMsg(ERR_LOST_CONN_EXEMGR); @@ -8746,89 +8769,51 @@ int processOrderBy(SELECT_LEX& select_lex, return ER_INTERNAL_ERROR; } - if (!gwi.count_asterisk_list.empty() || !gwi.no_parm_func_list.empty() || gwi.returnedCols.empty()) + if (gwi.returnedCols.empty() && gwi.additionalRetCols.empty() && minSc) + gwi.returnedCols.push_back(minSc); + } + + // ORDER BY translation part + if (!isUnion && !gwi.hasWindowFunc && gwi.subSelectType == CalpontSelectExecutionPlan::MAIN_SELECT) + { { - // get the smallest column from colmap - CalpontSelectExecutionPlan::ColumnMap::const_iterator iter; - int minColWidth = 0; - CalpontSystemCatalog::ColType ct; + if (unionSel) + order_list = select_lex.master_unit()->global_parameters()->order_list; - try + ordercol = static_cast(order_list.first); + + for (; ordercol; ordercol = ordercol->next) { - for (iter = gwi.columnMap.begin(); iter != gwi.columnMap.end(); ++iter) + Item* ord_item = *(ordercol->item); + + if (ord_item->name.length) { - // should always not null - SimpleColumn* sc = dynamic_cast(iter->second.get()); - - if (sc && !(sc->joinInfo() & JOIN_CORRELATED)) + // for union order by 1 case. For unknown reason, it doesn't show in_field_list + if (ord_item->type() == Item::CONST_ITEM && ord_item->cmp_type() == INT_RESULT) + { + } + else if (ord_item->type() == Item::SUBSELECT_ITEM) + { + } + else { - ct = csc->colType(sc->oid()); - - if (minColWidth == 0) - { - minColWidth = ct.colWidth; - minSc = iter->second; - } - else if (ct.colWidth < minColWidth) - { - minColWidth = ct.colWidth; - minSc = iter->second; - } } } } - catch (...) - { - string emsg = IDBErrorInfo::instance()->errorMsg(ERR_LOST_CONN_EXEMGR); - setError(gwi.thd, ER_INTERNAL_ERROR, emsg, gwi); - return ER_INTERNAL_ERROR; - } - - if (gwi.returnedCols.empty() && gwi.additionalRetCols.empty() && minSc) - gwi.returnedCols.push_back(minSc); } - // ORDER BY translation part - if (!isUnion && !gwi.hasWindowFunc && gwi.subSelectType == CalpontSelectExecutionPlan::MAIN_SELECT) + if (gwi.orderByCols.size()) // has order by { - { - if (unionSel) - order_list = select_lex.master_unit()->global_parameters()->order_list; - - ordercol = static_cast(order_list.first); - - for (; ordercol; ordercol = ordercol->next) - { - Item* ord_item = *(ordercol->item); - - if (ord_item->name.length) - { - // for union order by 1 case. For unknown reason, it doesn't show in_field_list - if (ord_item->type() == Item::CONST_ITEM && ord_item->cmp_type() == INT_RESULT) - { - } - else if (ord_item->type() == Item::SUBSELECT_ITEM) - { - } - else - { - } - } - } - } - - if (gwi.orderByCols.size()) // has order by - { - csep->hasOrderBy(true); - // To activate LimitedOrderBy - csep->orderByThreads(get_orderby_threads(gwi.thd)); - csep->specHandlerProcessed(true); - } + csep->hasOrderBy(true); + // To activate LimitedOrderBy + csep->orderByThreads(get_orderby_threads(gwi.thd)); + csep->specHandlerProcessed(true); } + } - return 0; + return 0; } - + /*@brief Translates SELECT_LEX into CSEP */ /*********************************************************** * DESCRIPTION: @@ -8979,7 +8964,7 @@ int getSelectPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, SCSEP& csep, bool i } } - if ((rc = processOrderBy(select_lex, gwi, csep, csc, minSc, isUnion, unionSel))) + if ((rc = processOrderBy(select_lex, gwi, csep, csc, minSc, isUnion, unionSel))) { CalpontSystemCatalog::removeCalpontSystemCatalog(sessionID); return rc; @@ -9069,8 +9054,7 @@ int getSelectPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, SCSEP& csep, bool i gwi.select_lex = originalSelectLex; // append additionalRetCols to returnedCols gwi.returnedCols.insert(gwi.returnedCols.begin(), gwi.additionalRetCols.begin(), - gwi.additionalRetCols.end( -)); + gwi.additionalRetCols.end()); csep->groupByCols(gwi.groupByCols); csep->withRollup(withRollup); @@ -9222,6 +9206,88 @@ int cs_get_derived_plan(ha_columnstore_derived_handler* handler, THD* /*thd*/, S return 0; } +bool matchParallelCES(CalpontSelectExecutionPlan& csep) +{ + std::cout << csep.toString() << std::endl; + auto tables = csep.tableList(); + // This is leaf and there are no other tables at this level. + for (auto& table : tables) + { + if (!table.isColumnstore()) + { + return true; + } + } + + return false; +} + +// CalpontSelectExecutionPlan tableIntoUnion(CalpontSelectExecutionPlan& table, CalpontSelectExecutionPlan& csep) +// { +// auto* unionCSEP = {new CalpontSelectExecutionPlan()}; +// CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList; +// CalpontSelectExecutionPlan::ColumnMap colMap; + +// unionSCEP.unionVec({csep}); +// return unionSCEP; +// } + +void applyParallelCES(CalpontSelectExecutionPlan& csep) +{ + auto tables = csep.tableList(); + for (auto it = tables.begin(); it != tables.end(); ++it) + { + if (!it->isColumnstore()) + { + // auto unionSCEP = tableIntoUnion(*it, csep); + // tables.erase(it); + // csep.unionVec().push_back(unionSCEP); + } + } +} + +struct Rule +{ + Rule(std::string&& name, bool (*match)(CalpontSelectExecutionPlan&), + void (*apply)(CalpontSelectExecutionPlan&)) + : name(name), match(match), apply(apply) {}; + + std::string name; + bool (*match)(CalpontSelectExecutionPlan&); + void (*apply)(CalpontSelectExecutionPlan&); + bool walk(CalpontSelectExecutionPlan& csep) + { + for (auto& table : csep.derivedTableList()) + { + auto csepLocal = *dynamic_cast(table.get()); + if (match(csepLocal)) + { + apply(csepLocal); + return true; + } + } + + for (auto& unionUnit : csep.unionVec()) + { + auto unionUnitLocal = *dynamic_cast(unionUnit.get()); + + if (match(unionUnitLocal)) + { + apply(unionUnitLocal); + return true; + } + } + + if (match(csep)) + { + apply(csep); + return true; + } + + return false; + } +}; + int cs_get_select_plan(ha_columnstore_select_handler* handler, THD* /*thd*/, SCSEP& csep, gp_walk_info& gwi, bool isSelectLexUnit) { @@ -9252,6 +9318,20 @@ int cs_get_select_plan(ha_columnstore_select_handler* handler, THD* /*thd*/, SCS // Derived table projection and filter optimization. derivedTableOptimization(&gwi, csep); + // static const Rule rules[] = { + // {"paralliseCES", matchparalliseCES, applyParalliseCES}, + // /* add more here */ + // }; + + // auto matchParallelCES = [](CalpontSelectExecutionPlan&){return false;}; + // auto applyParallelCES = [](CalpontSelectExecutionPlan&){ return;}; + + Rule parallelCES{"parallelCES", matchParallelCES, applyParallelCES}; + + { + parallelCES.walk(*csep); + } + return 0; } From e73e5834abfed7676802845988f6df8f412a1cc2 Mon Sep 17 00:00:00 2001 From: drrtuy Date: Mon, 9 Jun 2025 18:51:52 +0000 Subject: [PATCH 30/79] feat(optimizer): first cut for rewrite foreign table into UNION rule --- dbcon/execplan/calpontselectexecutionplan.cpp | 155 +++++++++++++++++- dbcon/execplan/calpontselectexecutionplan.h | 1 + dbcon/mysql/ha_mcs_execplan.cpp | 64 ++++++-- 3 files changed, 200 insertions(+), 20 deletions(-) diff --git a/dbcon/execplan/calpontselectexecutionplan.cpp b/dbcon/execplan/calpontselectexecutionplan.cpp index 3265835d6..feefab04d 100644 --- a/dbcon/execplan/calpontselectexecutionplan.cpp +++ b/dbcon/execplan/calpontselectexecutionplan.cpp @@ -205,7 +205,7 @@ string CalpontSelectExecutionPlan::toString(const size_t ident) const { ostringstream output; - output << std::string(ident, ' ') << "SELECT "; + output << "SELECT "; if (distinct()) { @@ -340,14 +340,16 @@ string CalpontSelectExecutionPlan::toString(const size_t ident) const output << "QueryType: " << queryType() << endlWithIndent(ident); if (!unionVec().empty()) - output << "\n--- Union Unit ---" << endlWithIndent(ident); + { + output << "--- Union Unit ---"; + } for (unsigned i = 0; i < unionVec().size(); i++) { CalpontSelectExecutionPlan* plan = dynamic_cast(unionVec()[i].get()); if (plan) - output << "{" << *plan << "}\n" << endlWithIndent(ident); + output << endlWithIndent(ident) << "{" << plan->toString(ident + 2) << "}\n" << endlWithIndent(ident); } return output.str(); @@ -858,4 +860,151 @@ void CalpontSelectExecutionPlan::pron(std::string&& pron) fPron = pron; } +execplan::SCSEP CalpontSelectExecutionPlan::cloneWORecursiveSelects() +{ + execplan::SCSEP newPlan(new CalpontSelectExecutionPlan(fLocation)); + + // Copy simple members + newPlan->fLocalQuery = fLocalQuery; + newPlan->fTableAlias = fTableAlias; + newPlan->fLocation = fLocation; + newPlan->fDependent = fDependent; + newPlan->fData = fData; + newPlan->fSessionID = fSessionID; + newPlan->fTxnID = fTxnID; + newPlan->fVerID = fVerID; + newPlan->fSchemaName = fSchemaName; + newPlan->fTableName = fTableName; + newPlan->fTraceFlags = fTraceFlags; + newPlan->fStatementID = fStatementID; + newPlan->fDistinct = fDistinct; + newPlan->fOverrideLargeSideEstimate = fOverrideLargeSideEstimate; + newPlan->fDistinctUnionNum = fDistinctUnionNum; + newPlan->fSubType = fSubType; + newPlan->fDerivedTbAlias = fDerivedTbAlias; + newPlan->fDerivedTbView = fDerivedTbView; + newPlan->fLimitStart = fLimitStart; + newPlan->fLimitNum = fLimitNum; + newPlan->fHasOrderBy = fHasOrderBy; + newPlan->fStringScanThreshold = fStringScanThreshold; + newPlan->fQueryType = fQueryType; + newPlan->fPriority = fPriority; + newPlan->fStringTableThreshold = fStringTableThreshold; + newPlan->fSpecHandlerProcessed = fSpecHandlerProcessed; + newPlan->fOrderByThreads = fOrderByThreads; + newPlan->fUuid = fUuid; + newPlan->fDJSSmallSideLimit = fDJSSmallSideLimit; + newPlan->fDJSLargeSideLimit = fDJSLargeSideLimit; + newPlan->fDJSPartitionSize = fDJSPartitionSize; + newPlan->fDJSMaxPartitionTreeDepth = fDJSMaxPartitionTreeDepth; + newPlan->fDJSForceRun = fDJSForceRun; + newPlan->fMaxPmJoinResultCount = fMaxPmJoinResultCount; + newPlan->fUMMemLimit = fUMMemLimit; + newPlan->fIsDML = fIsDML; + newPlan->fTimeZone = fTimeZone; + newPlan->fPron = fPron; + newPlan->fWithRollup = fWithRollup; + + // Deep copy of ReturnedColumnList + ReturnedColumnList newReturnedCols; + for (const auto& col : fReturnedCols) + { + if (col) + newReturnedCols.push_back(SRCP(col->clone())); + } + newPlan->returnedCols(newReturnedCols); + + // Deep copy of filters + if (fFilters) + newPlan->filters(new ParseTree(*fFilters)); + + // Deep copy of filter token list + newPlan->filterTokenList(fFilterTokenList); + newPlan->havingTokenList(fHavingTokenList); + + // Deep copy of subselects + // SelectList newSubSelects; + // for (const auto& sel : fSubSelects) + // { + // if (sel) + // newSubSelects.push_back(SCEP(sel->clone())); + // } + // newPlan->subSelects(newSubSelects); + + // Deep copy of group by columns + GroupByColumnList newGroupByCols; + for (const auto& col : fGroupByCols) + { + if (col) + newGroupByCols.push_back(SRCP(col->clone())); + } + newPlan->groupByCols(newGroupByCols); + + // Deep copy of having clause + if (fHaving) + newPlan->having(new ParseTree(*fHaving)); + + // Deep copy of order by columns + OrderByColumnList newOrderByCols; + for (const auto& col : fOrderByCols) + { + if (col) + newOrderByCols.push_back(SRCP(col->clone())); + } + newPlan->orderByCols(newOrderByCols); + + // Deep copy of column map + ColumnMap newColumnMap; + for (const auto& entry : fColumnMap) + { + if (entry.second) + newColumnMap.insert(ColumnMap::value_type(entry.first, SRCP(entry.second->clone()))); + } + newPlan->columnMap(newColumnMap); + + // Copy RM parameters + newPlan->rmParms(frmParms); + + // Deep copy of table list + newPlan->tableList(fTableList); + + // // Deep copy of derived table list + // SelectList newDerivedTableList; + // for (const auto& sel : fDerivedTableList) + // { + // if (sel) + // newDerivedTableList.push_back(SCEP(sel->clone())); + // } + // newPlan->derivedTableList(newDerivedTableList); + + // // Deep copy of union vector + // SelectList newUnionVec; + // for (const auto& sel : fUnionVec) + // { + // if (sel) + // newUnionVec.push_back(SCEP(sel->clone())); + // } + // newPlan->unionVec(newUnionVec); + + // // Deep copy of select subqueries + // SelectList newSelectSubList; + // for (const auto& sel : fSelectSubList) + // { + // if (sel) + // newSelectSubList.push_back(SCEP(sel->clone())); + // } + // newPlan->selectSubList(newSelectSubList); + + // // Deep copy of subquery list + // std::vector newSubSelectList; + // for (const auto& sel : fSubSelectList) + // { + // if (sel) + // newSubSelectList.push_back(SCSEP(sel->clone())); + // } + // newPlan->subSelectList(newSubSelectList); + + return newPlan; +} + } // namespace execplan diff --git a/dbcon/execplan/calpontselectexecutionplan.h b/dbcon/execplan/calpontselectexecutionplan.h index 9dfa4afcd..a84a3b4bb 100644 --- a/dbcon/execplan/calpontselectexecutionplan.h +++ b/dbcon/execplan/calpontselectexecutionplan.h @@ -159,6 +159,7 @@ class CalpontSelectExecutionPlan : public CalpontExecutionPlan */ ~CalpontSelectExecutionPlan() override; + execplan::SCSEP cloneWORecursiveSelects(); /** * Access and mutator methods */ diff --git a/dbcon/mysql/ha_mcs_execplan.cpp b/dbcon/mysql/ha_mcs_execplan.cpp index cb2323228..d42c1a23f 100644 --- a/dbcon/mysql/ha_mcs_execplan.cpp +++ b/dbcon/mysql/ha_mcs_execplan.cpp @@ -9206,14 +9206,26 @@ int cs_get_derived_plan(ha_columnstore_derived_handler* handler, THD* /*thd*/, S return 0; } +bool tableIsInUnion(const execplan::CalpontSystemCatalog::TableAliasName& table, CalpontSelectExecutionPlan& csep) +{ + return std::any_of(csep.unionVec().begin(), csep.unionVec().end(), + [&table](const auto& unionUnit) { + auto unionUnitLocal = *dynamic_cast(unionUnit.get()); + bool tableIsPresented = std::any_of(unionUnitLocal.tableList().begin(), unionUnitLocal.tableList().end(), + [&table](const auto& unionTable) { + return unionTable == table; + }); + return tableIsPresented; + }); +} + bool matchParallelCES(CalpontSelectExecutionPlan& csep) { - std::cout << csep.toString() << std::endl; auto tables = csep.tableList(); // This is leaf and there are no other tables at this level. for (auto& table : tables) { - if (!table.isColumnstore()) + if (!table.isColumnstore() && !tableIsInUnion(table, csep)) { return true; } @@ -9222,28 +9234,37 @@ bool matchParallelCES(CalpontSelectExecutionPlan& csep) return false; } -// CalpontSelectExecutionPlan tableIntoUnion(CalpontSelectExecutionPlan& table, CalpontSelectExecutionPlan& csep) -// { -// auto* unionCSEP = {new CalpontSelectExecutionPlan()}; -// CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList; -// CalpontSelectExecutionPlan::ColumnMap colMap; +CalpontSelectExecutionPlan::SelectList makeUnionFromTable(const size_t numberOfLegs, + CalpontSelectExecutionPlan& csep) +{ + CalpontSelectExecutionPlan::SelectList unionVec; + unionVec.reserve(numberOfLegs); + for (size_t i = 0; i < numberOfLegs; ++i) + { + unionVec.emplace_back(csep.cloneWORecursiveSelects()); + } -// unionSCEP.unionVec({csep}); -// return unionSCEP; -// } + return unionVec; +} void applyParallelCES(CalpontSelectExecutionPlan& csep) { + std::cout << "applyParallelCES" << std::endl; + std::cout << "original unionVec size " << csep.unionVec().size() << std::endl; + auto tables = csep.tableList(); for (auto it = tables.begin(); it != tables.end(); ++it) { if (!it->isColumnstore()) { - // auto unionSCEP = tableIntoUnion(*it, csep); - // tables.erase(it); - // csep.unionVec().push_back(unionSCEP); + size_t parallelFactor = 2; + auto additionalUnionVec = makeUnionFromTable(parallelFactor, csep); + csep.unionVec().insert(csep.unionVec().end(), additionalUnionVec.begin(), additionalUnionVec.end()); } } + + std::cout << "modified CSEP" << std::endl; + std::cout << "unionVec size " << csep.unionVec().size() << std::endl; } struct Rule @@ -9257,13 +9278,18 @@ struct Rule void (*apply)(CalpontSelectExecutionPlan&); bool walk(CalpontSelectExecutionPlan& csep) { + bool rewrite = false; for (auto& table : csep.derivedTableList()) { auto csepLocal = *dynamic_cast(table.get()); if (match(csepLocal)) { apply(csepLocal); - return true; + rewrite = true; + } + else + { + rewrite |= walk(csepLocal); } } @@ -9274,17 +9300,21 @@ struct Rule if (match(unionUnitLocal)) { apply(unionUnitLocal); - return true; + rewrite = true; + } + else + { + rewrite |= walk(unionUnitLocal); } } if (match(csep)) { apply(csep); - return true; + rewrite = true; } - return false; + return rewrite; } }; From 021a95c683571435a016feffe031b938181ae639 Mon Sep 17 00:00:00 2001 From: drrtuy Date: Mon, 9 Jun 2025 18:52:57 +0000 Subject: [PATCH 31/79] feat(optimizer): rewrite rule refactoring --- dbcon/mysql/ha_mcs_execplan.cpp | 52 ++++++++++++++++----------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/dbcon/mysql/ha_mcs_execplan.cpp b/dbcon/mysql/ha_mcs_execplan.cpp index d42c1a23f..a76fd5b22 100644 --- a/dbcon/mysql/ha_mcs_execplan.cpp +++ b/dbcon/mysql/ha_mcs_execplan.cpp @@ -9241,7 +9241,7 @@ CalpontSelectExecutionPlan::SelectList makeUnionFromTable(const size_t numberOfL unionVec.reserve(numberOfLegs); for (size_t i = 0; i < numberOfLegs; ++i) { - unionVec.emplace_back(csep.cloneWORecursiveSelects()); + unionVec.push_back(csep.cloneWORecursiveSelects()); } return unionVec; @@ -9249,9 +9249,6 @@ CalpontSelectExecutionPlan::SelectList makeUnionFromTable(const size_t numberOfL void applyParallelCES(CalpontSelectExecutionPlan& csep) { - std::cout << "applyParallelCES" << std::endl; - std::cout << "original unionVec size " << csep.unionVec().size() << std::endl; - auto tables = csep.tableList(); for (auto it = tables.begin(); it != tables.end(); ++it) { @@ -9262,53 +9259,49 @@ void applyParallelCES(CalpontSelectExecutionPlan& csep) csep.unionVec().insert(csep.unionVec().end(), additionalUnionVec.begin(), additionalUnionVec.end()); } } - - std::cout << "modified CSEP" << std::endl; - std::cout << "unionVec size " << csep.unionVec().size() << std::endl; } - struct Rule { - Rule(std::string&& name, bool (*match)(CalpontSelectExecutionPlan&), - void (*apply)(CalpontSelectExecutionPlan&)) - : name(name), match(match), apply(apply) {}; + Rule(std::string&& name, bool (*matchRule)(CalpontSelectExecutionPlan&), + void (*applyRule)(CalpontSelectExecutionPlan&)) + : name(name), matchRule(matchRule), applyRule(applyRule) {}; std::string name; - bool (*match)(CalpontSelectExecutionPlan&); - void (*apply)(CalpontSelectExecutionPlan&); - bool walk(CalpontSelectExecutionPlan& csep) + bool (*matchRule)(CalpontSelectExecutionPlan&); + void (*applyRule)(CalpontSelectExecutionPlan&); + bool apply(CalpontSelectExecutionPlan& csep) { bool rewrite = false; for (auto& table : csep.derivedTableList()) { - auto csepLocal = *dynamic_cast(table.get()); - if (match(csepLocal)) + auto& csepLocal = *dynamic_cast(table.get()); + if (matchRule(csepLocal)) { - apply(csepLocal); + applyRule(csepLocal); rewrite = true; } else { - rewrite |= walk(csepLocal); + rewrite |= apply(csepLocal); } } for (auto& unionUnit : csep.unionVec()) { - auto unionUnitLocal = *dynamic_cast(unionUnit.get()); + auto& unionUnitLocal = *dynamic_cast(unionUnit.get()); - if (match(unionUnitLocal)) + if (matchRule(unionUnitLocal)) { - apply(unionUnitLocal); + applyRule(unionUnitLocal); rewrite = true; } else { - rewrite |= walk(unionUnitLocal); + rewrite |= apply(unionUnitLocal); } } - if (match(csep)) + if (matchRule(csep)) { apply(csep); rewrite = true; @@ -9341,9 +9334,9 @@ int cs_get_select_plan(ha_columnstore_select_handler* handler, THD* /*thd*/, SCS return status; #ifdef DEBUG_WALK_COND - cerr << "---------------- cs_get_select_plan EXECUTION PLAN ----------------" << endl; - cerr << *csep << endl; - cerr << "-------------- EXECUTION PLAN END --------------\n" << endl; + // cerr << "---------------- cs_get_select_plan EXECUTION PLAN ----------------" << endl; + // cerr << *csep << endl; + // cerr << "-------------- EXECUTION PLAN END --------------\n" << endl; #endif // Derived table projection and filter optimization. derivedTableOptimization(&gwi, csep); @@ -9359,9 +9352,14 @@ int cs_get_select_plan(ha_columnstore_select_handler* handler, THD* /*thd*/, SCS Rule parallelCES{"parallelCES", matchParallelCES, applyParallelCES}; { - parallelCES.walk(*csep); + parallelCES.apply(*csep); } + cerr << "---------------- cs_get_select_plan rewritten EXECUTION PLAN ----------------" << endl; + cerr << *csep << endl; + cerr << "-------------- EXECUTION PLAN END --------------\n" << endl; + + return 0; } From e8dc93b46da96779cc9d1b9b4c6668292035c44e Mon Sep 17 00:00:00 2001 From: drrtuy Date: Mon, 9 Jun 2025 18:53:26 +0000 Subject: [PATCH 32/79] feat(optimizer): better CSEP printer + shallow CSEP copy --- dbcon/execplan/calpontselectexecutionplan.cpp | 44 +++++++++---------- dbcon/execplan/calpontselectexecutionplan.h | 1 + 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/dbcon/execplan/calpontselectexecutionplan.cpp b/dbcon/execplan/calpontselectexecutionplan.cpp index feefab04d..25b848f00 100644 --- a/dbcon/execplan/calpontselectexecutionplan.cpp +++ b/dbcon/execplan/calpontselectexecutionplan.cpp @@ -201,6 +201,17 @@ std::string endlWithIndent(const size_t ident) return output.str(); } +void CalpontSelectExecutionPlan::printSubCSEP(const size_t& ident, ostringstream& output, + CalpontSelectExecutionPlan*& plan) const +{ + if (plan) + { + output << endlWithIndent(ident) << "{" << endlWithIndent(ident + 2) << plan->toString(ident + 2); + // remove last two spaces from the stream. + output.seekp(-2, std::ios::cur); + output << "}" << std::endl << endlWithIndent(ident); + } +} string CalpontSelectExecutionPlan::toString(const size_t ident) const { ostringstream output; @@ -228,29 +239,26 @@ string CalpontSelectExecutionPlan::toString(const size_t ident) const // Returned Column CalpontSelectExecutionPlan::ReturnedColumnList retCols = returnedCols(); output << ">>Returned Columns" << endlWithIndent(ident); - output << std::string(ident, ' '); uint32_t seq = 0; for (unsigned int i = 0; i < retCols.size(); i++) { - output << *retCols[i] << endlWithIndent(ident); + output << *retCols[i] << endlWithIndent(ident+2); // WIP replace with constant if (retCols[i]->colSource() & SELECT_SUB) { - output << "select sub -- " << endlWithIndent(ident); + output << "select sub -- " << endlWithIndent(ident + 2); CalpontSelectExecutionPlan* plan = dynamic_cast(fSelectSubList[seq++].get()); - if (plan) - output << "{" << plan->toString(ident + 2) << "}" << endlWithIndent(ident); + printSubCSEP(ident, output, plan); } } // From Clause CalpontSelectExecutionPlan::TableList tables = tableList(); - output << ">>From Tables" << endlWithIndent(ident); - output << std::string(ident, ' '); + output << ">>From Tables" << endlWithIndent(ident + 2); seq = 0; for (unsigned int i = 0; i < tables.size(); i++) @@ -258,34 +266,25 @@ string CalpontSelectExecutionPlan::toString(const size_t ident) const // derived table if (tables[i].schema.length() == 0 && tables[i].table.length() == 0) { - output << "derived table - " << tables[i].alias << endlWithIndent(ident); + output << "derived table - " << tables[i].alias << endlWithIndent(ident+2); CalpontSelectExecutionPlan* plan = dynamic_cast(fDerivedTableList[seq++].get()); - if (plan) - { - output << "{" << plan->toString(ident + 2) << "}" << endlWithIndent(ident); - } - output << std::string(ident, ' '); - + printSubCSEP(ident, output, plan); } else { - output << tables[i] << endl; - output << std::string(ident, ' '); + output << tables[i] << endlWithIndent(ident+2); } } // Filters output << ">>Filters" << endlWithIndent(ident); - output << std::string(ident, ' '); - if (filters() != nullptr) filters()->walk(ParseTree::print, output); else output << "empty filter tree" << endlWithIndent(ident); - output << std::string(ident, ' '); // Group by columns const CalpontSelectExecutionPlan::GroupByColumnList& gbc = groupByCols(); @@ -348,8 +347,7 @@ string CalpontSelectExecutionPlan::toString(const size_t ident) const { CalpontSelectExecutionPlan* plan = dynamic_cast(unionVec()[i].get()); - if (plan) - output << endlWithIndent(ident) << "{" << plan->toString(ident + 2) << "}\n" << endlWithIndent(ident); + printSubCSEP(ident, output, plan); } return output.str(); @@ -915,8 +913,8 @@ execplan::SCSEP CalpontSelectExecutionPlan::cloneWORecursiveSelects() newPlan->returnedCols(newReturnedCols); // Deep copy of filters - if (fFilters) - newPlan->filters(new ParseTree(*fFilters)); + // if (fFilters) + // newPlan->filters(new ParseTree(*fFilters)); // Deep copy of filter token list newPlan->filterTokenList(fFilterTokenList); diff --git a/dbcon/execplan/calpontselectexecutionplan.h b/dbcon/execplan/calpontselectexecutionplan.h index a84a3b4bb..0914acb86 100644 --- a/dbcon/execplan/calpontselectexecutionplan.h +++ b/dbcon/execplan/calpontselectexecutionplan.h @@ -798,6 +798,7 @@ class CalpontSelectExecutionPlan : public CalpontExecutionPlan * Return a string rep of the CSEP * @return a string */ + void printSubCSEP(const size_t& ident, ostringstream& output, CalpontSelectExecutionPlan*& plan) const; virtual std::string toString(const size_t ident = 0) const; /** @brief Is this an internal query? From 1baaf878d006d61262962bfacb29ad6e152a167d Mon Sep 17 00:00:00 2001 From: drrtuy Date: Wed, 11 Jun 2025 21:52:23 +0000 Subject: [PATCH 33/79] feat(optimizer): basic rewrite Union unit into Sub with union --- dbcon/execplan/calpontselectexecutionplan.cpp | 8 +- dbcon/mysql/ha_mcs_execplan.cpp | 84 ++++++++++++++----- 2 files changed, 70 insertions(+), 22 deletions(-) diff --git a/dbcon/execplan/calpontselectexecutionplan.cpp b/dbcon/execplan/calpontselectexecutionplan.cpp index 25b848f00..a09aee082 100644 --- a/dbcon/execplan/calpontselectexecutionplan.cpp +++ b/dbcon/execplan/calpontselectexecutionplan.cpp @@ -282,9 +282,13 @@ string CalpontSelectExecutionPlan::toString(const size_t ident) const output << ">>Filters" << endlWithIndent(ident); if (filters() != nullptr) + { filters()->walk(ParseTree::print, output); + } else + { output << "empty filter tree" << endlWithIndent(ident); + } // Group by columns const CalpontSelectExecutionPlan::GroupByColumnList& gbc = groupByCols(); @@ -913,8 +917,8 @@ execplan::SCSEP CalpontSelectExecutionPlan::cloneWORecursiveSelects() newPlan->returnedCols(newReturnedCols); // Deep copy of filters - // if (fFilters) - // newPlan->filters(new ParseTree(*fFilters)); + if (fFilters) + newPlan->filters(new ParseTree(*fFilters)); // Deep copy of filter token list newPlan->filterTokenList(fFilterTokenList); diff --git a/dbcon/mysql/ha_mcs_execplan.cpp b/dbcon/mysql/ha_mcs_execplan.cpp index a76fd5b22..25e6ccc42 100644 --- a/dbcon/mysql/ha_mcs_execplan.cpp +++ b/dbcon/mysql/ha_mcs_execplan.cpp @@ -9210,8 +9210,8 @@ bool tableIsInUnion(const execplan::CalpontSystemCatalog::TableAliasName& table, { return std::any_of(csep.unionVec().begin(), csep.unionVec().end(), [&table](const auto& unionUnit) { - auto unionUnitLocal = *dynamic_cast(unionUnit.get()); - bool tableIsPresented = std::any_of(unionUnitLocal.tableList().begin(), unionUnitLocal.tableList().end(), + execplan::CalpontSelectExecutionPlan* unionUnitLocal = dynamic_cast(unionUnit.get()); + bool tableIsPresented = std::any_of(unionUnitLocal->tableList().begin(), unionUnitLocal->tableList().end(), [&table](const auto& unionTable) { return unionTable == table; }); @@ -9223,15 +9223,9 @@ bool matchParallelCES(CalpontSelectExecutionPlan& csep) { auto tables = csep.tableList(); // This is leaf and there are no other tables at this level. - for (auto& table : tables) - { - if (!table.isColumnstore() && !tableIsInUnion(table, csep)) - { - return true; - } - } - - return false; + // WIP filter out CSEPs with orderBy, groupBy, having + // WIP filter out CSEPs with nonSimpleColumns in projection + return tables.size() == 1 && !tables[0].isColumnstore() && !tableIsInUnion(tables[0], csep); } CalpontSelectExecutionPlan::SelectList makeUnionFromTable(const size_t numberOfLegs, @@ -9247,19 +9241,69 @@ CalpontSelectExecutionPlan::SelectList makeUnionFromTable(const size_t numberOfL return unionVec; } +// void applyParallelCES(CalpontSelectExecutionPlan& csep) +// { +// auto tables = csep.tableList(); +// for (auto it = tables.begin(); it != tables.end(); ++it) +// { +// if (!it->isColumnstore()) +// { +// size_t parallelFactor = 2; +// auto additionalUnionVec = makeUnionFromTable(parallelFactor, csep); +// csep.unionVec().insert(csep.unionVec().end(), additionalUnionVec.begin(), additionalUnionVec.end()); +// } +// } +// } + void applyParallelCES(CalpontSelectExecutionPlan& csep) { auto tables = csep.tableList(); - for (auto it = tables.begin(); it != tables.end(); ++it) + CalpontSelectExecutionPlan::TableList newTableList; + CalpontSelectExecutionPlan::SelectList newDerivedTableList; + static const std::string aliasPrefix = "subQ"; + + // ATM Must be only 1 table + for (auto& table: tables) { - if (!it->isColumnstore()) + if (!table.isColumnstore()) { + auto derivedSCEP = csep.cloneWORecursiveSelects(); + std::string alias = aliasPrefix + table.schema + "_" + table.table; + + derivedSCEP->location(CalpontSelectExecutionPlan::FROM); + derivedSCEP->subType(CalpontSelectExecutionPlan::FROM_SUBS); + derivedSCEP->derivedTbAlias(alias); + size_t parallelFactor = 2; auto additionalUnionVec = makeUnionFromTable(parallelFactor, csep); - csep.unionVec().insert(csep.unionVec().end(), additionalUnionVec.begin(), additionalUnionVec.end()); + derivedSCEP->unionVec().insert(derivedSCEP->unionVec().end(), additionalUnionVec.begin(), additionalUnionVec.end()); + + // change parent to derived table columns + for (auto& rc : csep.returnedCols()) + { + auto* sc = dynamic_cast(rc.get()); + if (sc) + { + sc->tableName(""); + sc->schemaName(""); + sc->tableAlias(alias); + } + } + + + + // WIP need to work with existing derived tables + newDerivedTableList.push_back(derivedSCEP); + // WIP + CalpontSystemCatalog::TableAliasName tn = make_aliasview("", "", alias, ""); + newTableList.push_back(tn); } } + + csep.derivedTableList(newDerivedTableList); + csep.tableList(newTableList); } + struct Rule { Rule(std::string&& name, bool (*matchRule)(CalpontSelectExecutionPlan&), @@ -9303,7 +9347,7 @@ struct Rule if (matchRule(csep)) { - apply(csep); + applyRule(csep); rewrite = true; } @@ -9333,11 +9377,11 @@ int cs_get_select_plan(ha_columnstore_select_handler* handler, THD* /*thd*/, SCS else if (status < 0) return status; -#ifdef DEBUG_WALK_COND - // cerr << "---------------- cs_get_select_plan EXECUTION PLAN ----------------" << endl; - // cerr << *csep << endl; - // cerr << "-------------- EXECUTION PLAN END --------------\n" << endl; -#endif +// #ifdef DEBUG_WALK_COND + cerr << "---------------- cs_get_select_plan EXECUTION PLAN ----------------" << endl; + cerr << *csep << endl; + cerr << "-------------- EXECUTION PLAN END --------------\n" << endl; +// #endif // Derived table projection and filter optimization. derivedTableOptimization(&gwi, csep); From e07e85b750b680c52971474bd96d4ec44a511d7f Mon Sep 17 00:00:00 2001 From: drrtuy Date: Fri, 13 Jun 2025 20:08:13 +0000 Subject: [PATCH 34/79] feat(optimizer): into derived CSEP rewrite with hardcoded tables --- dbcon/mysql/ha_mcs_execplan.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/dbcon/mysql/ha_mcs_execplan.cpp b/dbcon/mysql/ha_mcs_execplan.cpp index 25e6ccc42..8685b01f1 100644 --- a/dbcon/mysql/ha_mcs_execplan.cpp +++ b/dbcon/mysql/ha_mcs_execplan.cpp @@ -9260,7 +9260,7 @@ void applyParallelCES(CalpontSelectExecutionPlan& csep) auto tables = csep.tableList(); CalpontSelectExecutionPlan::TableList newTableList; CalpontSelectExecutionPlan::SelectList newDerivedTableList; - static const std::string aliasPrefix = "subQ"; + static const std::string aliasPrefix = "$sub_"; // ATM Must be only 1 table for (auto& table: tables) @@ -9268,6 +9268,7 @@ void applyParallelCES(CalpontSelectExecutionPlan& csep) if (!table.isColumnstore()) { auto derivedSCEP = csep.cloneWORecursiveSelects(); + // need to intro a level std::string alias = aliasPrefix + table.schema + "_" + table.table; derivedSCEP->location(CalpontSelectExecutionPlan::FROM); @@ -9287,11 +9288,10 @@ void applyParallelCES(CalpontSelectExecutionPlan& csep) sc->tableName(""); sc->schemaName(""); sc->tableAlias(alias); + sc->colPosition(0); } } - - // WIP need to work with existing derived tables newDerivedTableList.push_back(derivedSCEP); // WIP @@ -9300,6 +9300,14 @@ void applyParallelCES(CalpontSelectExecutionPlan& csep) } } + // SimpleColumn* sc = new SimpleColumn("test", "i1", "i", false, csep.sessionID()); + // string alias(table->alias.c_ptr()); + // sc->timeZone(csep.timeZone()); + // sc->partitions(getPartitions(table)); + // boost::shared_ptr spsc(sc); + + // csep.columnMap().insert({"`test`.`i1`.`i`", spsc}); + csep.derivedTableList(newDerivedTableList); csep.tableList(newTableList); } @@ -9402,7 +9410,7 @@ int cs_get_select_plan(ha_columnstore_select_handler* handler, THD* /*thd*/, SCS cerr << "---------------- cs_get_select_plan rewritten EXECUTION PLAN ----------------" << endl; cerr << *csep << endl; cerr << "-------------- EXECUTION PLAN END --------------\n" << endl; - + return 0; } From ab6063bec44a50b481248bb773109412b591de82 Mon Sep 17 00:00:00 2001 From: drrtuy Date: Mon, 16 Jun 2025 12:39:20 +0000 Subject: [PATCH 35/79] feat(optimizer): moved related code into a separate unit --- dbcon/mysql/CMakeLists.txt | 1 + dbcon/mysql/ha_mcs_execplan.cpp | 167 +--------------------------- dbcon/mysql/rulebased_optimizer.cpp | 158 ++++++++++++++++++++++++++ dbcon/mysql/rulebased_optimizer.h | 40 +++++++ 4 files changed, 201 insertions(+), 165 deletions(-) create mode 100644 dbcon/mysql/rulebased_optimizer.cpp create mode 100644 dbcon/mysql/rulebased_optimizer.h diff --git a/dbcon/mysql/CMakeLists.txt b/dbcon/mysql/CMakeLists.txt index 7bd6ed78b..cb176f371 100644 --- a/dbcon/mysql/CMakeLists.txt +++ b/dbcon/mysql/CMakeLists.txt @@ -40,6 +40,7 @@ set(libcalmysql_SRCS is_columnstore_files.cpp is_columnstore_extents.cpp columnstore_dataload.cpp + rulebased_optimizer.cpp ) set_source_files_properties(ha_mcs.cpp PROPERTIES COMPILE_FLAGS "-fno-implicit-templates") diff --git a/dbcon/mysql/ha_mcs_execplan.cpp b/dbcon/mysql/ha_mcs_execplan.cpp index 8685b01f1..e23cf47e6 100644 --- a/dbcon/mysql/ha_mcs_execplan.cpp +++ b/dbcon/mysql/ha_mcs_execplan.cpp @@ -78,6 +78,7 @@ using namespace cal_impl_if; #include "predicateoperator.h" #include "rewrites.h" #include "rowcolumn.h" +#include "rulebased_optimizer.h" #include "selectfilter.h" #include "simplecolumn_decimal.h" #include "simplecolumn_int.h" @@ -9206,162 +9207,6 @@ int cs_get_derived_plan(ha_columnstore_derived_handler* handler, THD* /*thd*/, S return 0; } -bool tableIsInUnion(const execplan::CalpontSystemCatalog::TableAliasName& table, CalpontSelectExecutionPlan& csep) -{ - return std::any_of(csep.unionVec().begin(), csep.unionVec().end(), - [&table](const auto& unionUnit) { - execplan::CalpontSelectExecutionPlan* unionUnitLocal = dynamic_cast(unionUnit.get()); - bool tableIsPresented = std::any_of(unionUnitLocal->tableList().begin(), unionUnitLocal->tableList().end(), - [&table](const auto& unionTable) { - return unionTable == table; - }); - return tableIsPresented; - }); -} - -bool matchParallelCES(CalpontSelectExecutionPlan& csep) -{ - auto tables = csep.tableList(); - // This is leaf and there are no other tables at this level. - // WIP filter out CSEPs with orderBy, groupBy, having - // WIP filter out CSEPs with nonSimpleColumns in projection - return tables.size() == 1 && !tables[0].isColumnstore() && !tableIsInUnion(tables[0], csep); -} - -CalpontSelectExecutionPlan::SelectList makeUnionFromTable(const size_t numberOfLegs, - CalpontSelectExecutionPlan& csep) -{ - CalpontSelectExecutionPlan::SelectList unionVec; - unionVec.reserve(numberOfLegs); - for (size_t i = 0; i < numberOfLegs; ++i) - { - unionVec.push_back(csep.cloneWORecursiveSelects()); - } - - return unionVec; -} - -// void applyParallelCES(CalpontSelectExecutionPlan& csep) -// { -// auto tables = csep.tableList(); -// for (auto it = tables.begin(); it != tables.end(); ++it) -// { -// if (!it->isColumnstore()) -// { -// size_t parallelFactor = 2; -// auto additionalUnionVec = makeUnionFromTable(parallelFactor, csep); -// csep.unionVec().insert(csep.unionVec().end(), additionalUnionVec.begin(), additionalUnionVec.end()); -// } -// } -// } - -void applyParallelCES(CalpontSelectExecutionPlan& csep) -{ - auto tables = csep.tableList(); - CalpontSelectExecutionPlan::TableList newTableList; - CalpontSelectExecutionPlan::SelectList newDerivedTableList; - static const std::string aliasPrefix = "$sub_"; - - // ATM Must be only 1 table - for (auto& table: tables) - { - if (!table.isColumnstore()) - { - auto derivedSCEP = csep.cloneWORecursiveSelects(); - // need to intro a level - std::string alias = aliasPrefix + table.schema + "_" + table.table; - - derivedSCEP->location(CalpontSelectExecutionPlan::FROM); - derivedSCEP->subType(CalpontSelectExecutionPlan::FROM_SUBS); - derivedSCEP->derivedTbAlias(alias); - - size_t parallelFactor = 2; - auto additionalUnionVec = makeUnionFromTable(parallelFactor, csep); - derivedSCEP->unionVec().insert(derivedSCEP->unionVec().end(), additionalUnionVec.begin(), additionalUnionVec.end()); - - // change parent to derived table columns - for (auto& rc : csep.returnedCols()) - { - auto* sc = dynamic_cast(rc.get()); - if (sc) - { - sc->tableName(""); - sc->schemaName(""); - sc->tableAlias(alias); - sc->colPosition(0); - } - } - - // WIP need to work with existing derived tables - newDerivedTableList.push_back(derivedSCEP); - // WIP - CalpontSystemCatalog::TableAliasName tn = make_aliasview("", "", alias, ""); - newTableList.push_back(tn); - } - } - - // SimpleColumn* sc = new SimpleColumn("test", "i1", "i", false, csep.sessionID()); - // string alias(table->alias.c_ptr()); - // sc->timeZone(csep.timeZone()); - // sc->partitions(getPartitions(table)); - // boost::shared_ptr spsc(sc); - - // csep.columnMap().insert({"`test`.`i1`.`i`", spsc}); - - csep.derivedTableList(newDerivedTableList); - csep.tableList(newTableList); -} - -struct Rule -{ - Rule(std::string&& name, bool (*matchRule)(CalpontSelectExecutionPlan&), - void (*applyRule)(CalpontSelectExecutionPlan&)) - : name(name), matchRule(matchRule), applyRule(applyRule) {}; - - std::string name; - bool (*matchRule)(CalpontSelectExecutionPlan&); - void (*applyRule)(CalpontSelectExecutionPlan&); - bool apply(CalpontSelectExecutionPlan& csep) - { - bool rewrite = false; - for (auto& table : csep.derivedTableList()) - { - auto& csepLocal = *dynamic_cast(table.get()); - if (matchRule(csepLocal)) - { - applyRule(csepLocal); - rewrite = true; - } - else - { - rewrite |= apply(csepLocal); - } - } - - for (auto& unionUnit : csep.unionVec()) - { - auto& unionUnitLocal = *dynamic_cast(unionUnit.get()); - - if (matchRule(unionUnitLocal)) - { - applyRule(unionUnitLocal); - rewrite = true; - } - else - { - rewrite |= apply(unionUnitLocal); - } - } - - if (matchRule(csep)) - { - applyRule(csep); - rewrite = true; - } - - return rewrite; - } -}; int cs_get_select_plan(ha_columnstore_select_handler* handler, THD* /*thd*/, SCSEP& csep, gp_walk_info& gwi, bool isSelectLexUnit) @@ -9393,15 +9238,7 @@ int cs_get_select_plan(ha_columnstore_select_handler* handler, THD* /*thd*/, SCS // Derived table projection and filter optimization. derivedTableOptimization(&gwi, csep); - // static const Rule rules[] = { - // {"paralliseCES", matchparalliseCES, applyParalliseCES}, - // /* add more here */ - // }; - - // auto matchParallelCES = [](CalpontSelectExecutionPlan&){return false;}; - // auto applyParallelCES = [](CalpontSelectExecutionPlan&){ return;}; - - Rule parallelCES{"parallelCES", matchParallelCES, applyParallelCES}; + optimizer::Rule parallelCES{"parallelCES", optimizer::matchParallelCES, optimizer::applyParallelCES}; { parallelCES.apply(*csep); diff --git a/dbcon/mysql/rulebased_optimizer.cpp b/dbcon/mysql/rulebased_optimizer.cpp new file mode 100644 index 000000000..f91777c7f --- /dev/null +++ b/dbcon/mysql/rulebased_optimizer.cpp @@ -0,0 +1,158 @@ +/* Copyright (C) 2025 MariaDB Corporation + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; version 2 of + the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#include "execplan/calpontselectexecutionplan.h" +#include "execplan/simplecolumn.h" +#include "rulebased_optimizer.h" + +namespace optimizer { + +bool Rule::apply(execplan::CalpontSelectExecutionPlan& csep) +{ + bool rewrite = false; + for (auto& table : csep.derivedTableList()) + { + auto& csepLocal = *dynamic_cast(table.get()); + if (matchRule(csepLocal)) + { + applyRule(csepLocal); + rewrite = true; + } + else + { + rewrite |= apply(csepLocal); + } + } + + for (auto& unionUnit : csep.unionVec()) + { + auto& unionUnitLocal = *dynamic_cast(unionUnit.get()); + + if (matchRule(unionUnitLocal)) + { + applyRule(unionUnitLocal); + rewrite = true; + } + else + { + rewrite |= apply(unionUnitLocal); + } + } + + if (matchRule(csep)) + { + applyRule(csep); + rewrite = true; + } + + return rewrite; +} + + +bool tableIsInUnion(const execplan::CalpontSystemCatalog::TableAliasName& table, execplan::CalpontSelectExecutionPlan& csep) +{ + return std::any_of(csep.unionVec().begin(), csep.unionVec().end(), + [&table](const auto& unionUnit) { + execplan::CalpontSelectExecutionPlan* unionUnitLocal = dynamic_cast(unionUnit.get()); + bool tableIsPresented = std::any_of(unionUnitLocal->tableList().begin(), unionUnitLocal->tableList().end(), + [&table](const auto& unionTable) { + return unionTable == table; + }); + return tableIsPresented; + }); +} + +bool matchParallelCES(execplan::CalpontSelectExecutionPlan& csep) +{ + auto tables = csep.tableList(); + // This is leaf and there are no other tables at this level. + // WIP filter out CSEPs with orderBy, groupBy, having + // WIP filter out CSEPs with nonSimpleColumns in projection + return tables.size() == 1 && !tables[0].isColumnstore() && !tableIsInUnion(tables[0], csep); +} + +execplan::CalpontSelectExecutionPlan::SelectList makeUnionFromTable(const size_t numberOfLegs, + execplan::CalpontSelectExecutionPlan& csep) +{ + execplan::CalpontSelectExecutionPlan::SelectList unionVec; + unionVec.reserve(numberOfLegs); + for (size_t i = 0; i < numberOfLegs; ++i) + { + unionVec.push_back(csep.cloneWORecursiveSelects()); + } + + return unionVec; +} + +void applyParallelCES(execplan::CalpontSelectExecutionPlan& csep) +{ + auto tables = csep.tableList(); + execplan::CalpontSelectExecutionPlan::TableList newTableList; + execplan::CalpontSelectExecutionPlan::SelectList newDerivedTableList; + static const std::string aliasPrefix = "$sub_"; + + // ATM Must be only 1 table + for (auto& table: tables) + { + if (!table.isColumnstore()) + { + auto derivedSCEP = csep.cloneWORecursiveSelects(); + // need to intro a level + std::string alias = aliasPrefix + table.schema + "_" + table.table; + + derivedSCEP->location(execplan::CalpontSelectExecutionPlan::FROM); + derivedSCEP->subType(execplan::CalpontSelectExecutionPlan::FROM_SUBS); + derivedSCEP->derivedTbAlias(alias); + + size_t parallelFactor = 2; + auto additionalUnionVec = makeUnionFromTable(parallelFactor, csep); + derivedSCEP->unionVec().insert(derivedSCEP->unionVec().end(), additionalUnionVec.begin(), additionalUnionVec.end()); + + // change parent to derived table columns + for (auto& rc : csep.returnedCols()) + { + auto* sc = dynamic_cast(rc.get()); + if (sc) + { + sc->tableName(""); + sc->schemaName(""); + sc->tableAlias(alias); + sc->colPosition(0); + } + } + + // WIP need to work with existing derived tables + newDerivedTableList.push_back(derivedSCEP); + // WIP + execplan::CalpontSystemCatalog::TableAliasName tn = execplan::make_aliasview("", "", alias, ""); + newTableList.push_back(tn); + } + } + + // SimpleColumn* sc = new SimpleColumn("test", "i1", "i", false, csep.sessionID()); + // string alias(table->alias.c_ptr()); + // sc->timeZone(csep.timeZone()); + // sc->partitions(getPartitions(table)); + // boost::shared_ptr spsc(sc); + + // csep.columnMap().insert({"`test`.`i1`.`i`", spsc}); + + csep.derivedTableList(newDerivedTableList); + csep.tableList(newTableList); +} +} + diff --git a/dbcon/mysql/rulebased_optimizer.h b/dbcon/mysql/rulebased_optimizer.h new file mode 100644 index 000000000..3f0a3e10f --- /dev/null +++ b/dbcon/mysql/rulebased_optimizer.h @@ -0,0 +1,40 @@ +/* Copyright (C) 2025 MariaDB Corporation + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; version 2 of + the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#pragma once + +#include +#include "execplan/calpontselectexecutionplan.h" + +namespace optimizer { + +struct Rule +{ + Rule(std::string&& name, bool (*matchRule)(execplan::CalpontSelectExecutionPlan&), + void (*applyRule)(execplan::CalpontSelectExecutionPlan&)) + : name(name), matchRule(matchRule), applyRule(applyRule) {}; + + std::string name; + bool (*matchRule)(execplan::CalpontSelectExecutionPlan&); + void (*applyRule)(execplan::CalpontSelectExecutionPlan&); + bool apply(execplan::CalpontSelectExecutionPlan& csep); +}; + +bool matchParallelCES(execplan::CalpontSelectExecutionPlan& csep); +void applyParallelCES(execplan::CalpontSelectExecutionPlan& csep); + +} \ No newline at end of file From 25c7d23c21590149bbb436202827917f51ef22b9 Mon Sep 17 00:00:00 2001 From: drrtuy Date: Mon, 16 Jun 2025 13:26:11 +0000 Subject: [PATCH 36/79] feat(optimizer): add session switch to optionally enable optimizer --- dbcon/mysql/ha_mcs_execplan.cpp | 36 +++++++++---------- dbcon/mysql/ha_mcs_sysvars.cpp | 13 ++++++- dbcon/mysql/rulebased_optimizer.cpp | 54 +++++++++++++++++++---------- dbcon/mysql/rulebased_optimizer.h | 3 +- 4 files changed, 67 insertions(+), 39 deletions(-) diff --git a/dbcon/mysql/ha_mcs_execplan.cpp b/dbcon/mysql/ha_mcs_execplan.cpp index e23cf47e6..b01e40c16 100644 --- a/dbcon/mysql/ha_mcs_execplan.cpp +++ b/dbcon/mysql/ha_mcs_execplan.cpp @@ -9197,11 +9197,12 @@ int cs_get_derived_plan(ha_columnstore_derived_handler* handler, THD* /*thd*/, S else if (status < 0) return status; -#ifdef DEBUG_WALK_COND - cerr << "---------------- cs_get_derived_plan EXECUTION PLAN ----------------" << endl; - cerr << *csep << endl; - cerr << "-------------- EXECUTION PLAN END --------------\n" << endl; -#endif + if (csep->traceOn()) + { + cerr << "---------------- cs_get_derived_plan EXECUTION PLAN ----------------" << endl; + cerr << *csep << endl; + cerr << "-------------- EXECUTION PLAN END --------------\n" << endl; + } // Derived table projection and filter optimization. derivedTableOptimization(&gwi, csep); return 0; @@ -9230,25 +9231,24 @@ int cs_get_select_plan(ha_columnstore_select_handler* handler, THD* /*thd*/, SCS else if (status < 0) return status; -// #ifdef DEBUG_WALK_COND - cerr << "---------------- cs_get_select_plan EXECUTION PLAN ----------------" << endl; - cerr << *csep << endl; - cerr << "-------------- EXECUTION PLAN END --------------\n" << endl; -// #endif + if (csep->traceOn()) + { + cerr << "---------------- cs_get_select_plan EXECUTION PLAN ----------------" << endl; + cerr << *csep << endl; + cerr << "-------------- EXECUTION PLAN END --------------\n" << endl; + } + // Derived table projection and filter optimization. derivedTableOptimization(&gwi, csep); - optimizer::Rule parallelCES{"parallelCES", optimizer::matchParallelCES, optimizer::applyParallelCES}; - + bool csepWasOptimized = optimizer::optimizeCSEP(*csep); + if (csep->traceOn() && csepWasOptimized) { - parallelCES.apply(*csep); + cerr << "---------------- cs_get_select_plan optimized EXECUTION PLAN ----------------" << endl; + cerr << *csep << endl; + cerr << "-------------- EXECUTION PLAN END --------------\n" << endl; } - cerr << "---------------- cs_get_select_plan rewritten EXECUTION PLAN ----------------" << endl; - cerr << *csep << endl; - cerr << "-------------- EXECUTION PLAN END --------------\n" << endl; - - return 0; } diff --git a/dbcon/mysql/ha_mcs_sysvars.cpp b/dbcon/mysql/ha_mcs_sysvars.cpp index 04fdbdaed..6829877c0 100644 --- a/dbcon/mysql/ha_mcs_sysvars.cpp +++ b/dbcon/mysql/ha_mcs_sysvars.cpp @@ -224,7 +224,9 @@ static my_bool innodb_queries_use_mcs; static MYSQL_SYSVAR_BOOL(innodb_queries_use_mcs, innodb_queries_use_mcs, PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_READONLY, "Direct all InnoDB-only queries into MCS via Select Handler.", NULL, NULL, FALSE); - +static MYSQL_THDVAR_BOOL(unstable_optimizer, PLUGIN_VAR_RQCMDARG, + "Apply optimizer rules after translation from SELECT_LEX/UNION", NULL, NULL, FALSE); + st_mysql_sys_var* mcs_system_variables[] = { MYSQL_SYSVAR(compression_type), MYSQL_SYSVAR(fe_conn_info_ptr), @@ -663,6 +665,15 @@ void set_max_allowed_in_values(THD* thd, ulong value) THDVAR(thd, max_allowed_in_values) = value; } +bool get_unstable_optimizer(THD* thd) +{ + return (thd == NULL) ? 0 : THDVAR(thd, unstable_optimizer); +} +void set_unstable_optimizer(THD* thd, bool value) +{ + THDVAR(thd, unstable_optimizer) = value; +} + bool get_innodb_queries_uses_mcs() { return SYSVAR(innodb_queries_use_mcs); diff --git a/dbcon/mysql/rulebased_optimizer.cpp b/dbcon/mysql/rulebased_optimizer.cpp index f91777c7f..d3de06055 100644 --- a/dbcon/mysql/rulebased_optimizer.cpp +++ b/dbcon/mysql/rulebased_optimizer.cpp @@ -21,36 +21,52 @@ namespace optimizer { -bool Rule::apply(execplan::CalpontSelectExecutionPlan& csep) +bool optimizeCSEPWithRules(execplan::CalpontSelectExecutionPlan& root, const std::vector& rules) { + + bool changed = false; + for (const auto& rule : rules) + { + changed |= rule.apply(root); + } + return changed; +} + +bool optimizeCSEP(execplan::CalpontSelectExecutionPlan& root) +{ + optimizer::Rule parallelCES{"parallelCES", optimizer::matchParallelCES, optimizer::applyParallelCES}; + + std::vector rules = {parallelCES}; + + return optimizeCSEPWithRules(root, rules); +} + +// DFS walk +bool Rule::apply(execplan::CalpontSelectExecutionPlan& csep) const { bool rewrite = false; + for (auto& table : csep.derivedTableList()) { - auto& csepLocal = *dynamic_cast(table.get()); - if (matchRule(csepLocal)) + auto* csepPtr = dynamic_cast(table.get()); + if (!csepPtr) { - applyRule(csepLocal); - rewrite = true; - } - else - { - rewrite |= apply(csepLocal); + continue; } + + auto& csepLocal = *csepPtr; + rewrite |= apply(csepLocal); } for (auto& unionUnit : csep.unionVec()) { - auto& unionUnitLocal = *dynamic_cast(unionUnit.get()); + auto* unionUnitPtr = dynamic_cast(unionUnit.get()); + if (!unionUnitPtr) + { + continue; + } - if (matchRule(unionUnitLocal)) - { - applyRule(unionUnitLocal); - rewrite = true; - } - else - { - rewrite |= apply(unionUnitLocal); - } + auto& unionUnitLocal = *unionUnitPtr; + rewrite |= apply(unionUnitLocal); } if (matchRule(csep)) diff --git a/dbcon/mysql/rulebased_optimizer.h b/dbcon/mysql/rulebased_optimizer.h index 3f0a3e10f..65fa3f359 100644 --- a/dbcon/mysql/rulebased_optimizer.h +++ b/dbcon/mysql/rulebased_optimizer.h @@ -31,10 +31,11 @@ struct Rule std::string name; bool (*matchRule)(execplan::CalpontSelectExecutionPlan&); void (*applyRule)(execplan::CalpontSelectExecutionPlan&); - bool apply(execplan::CalpontSelectExecutionPlan& csep); + bool apply(execplan::CalpontSelectExecutionPlan& csep) const; }; bool matchParallelCES(execplan::CalpontSelectExecutionPlan& csep); void applyParallelCES(execplan::CalpontSelectExecutionPlan& csep); +bool optimizeCSEP(execplan::CalpontSelectExecutionPlan& root); } \ No newline at end of file From 98cb6dddeea43ce6ddbe26153087f8167f3f245b Mon Sep 17 00:00:00 2001 From: drrtuy Date: Mon, 16 Jun 2025 13:59:29 +0000 Subject: [PATCH 37/79] feat(optimizer): replace simple walk with iterative DFS with convergence --- dbcon/execplan/calpontselectexecutionplan.h | 3 +++ dbcon/mysql/rulebased_optimizer.cpp | 21 ++++++++++++++++++--- dbcon/mysql/rulebased_optimizer.h | 1 + 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/dbcon/execplan/calpontselectexecutionplan.h b/dbcon/execplan/calpontselectexecutionplan.h index 0914acb86..e9425ed45 100644 --- a/dbcon/execplan/calpontselectexecutionplan.h +++ b/dbcon/execplan/calpontselectexecutionplan.h @@ -159,6 +159,9 @@ class CalpontSelectExecutionPlan : public CalpontExecutionPlan */ ~CalpontSelectExecutionPlan() override; + /** + * Clones this CSEP without recursive selects for optimizer purposes + */ execplan::SCSEP cloneWORecursiveSelects(); /** * Access and mutator methods diff --git a/dbcon/mysql/rulebased_optimizer.cpp b/dbcon/mysql/rulebased_optimizer.cpp index d3de06055..4e9c22b96 100644 --- a/dbcon/mysql/rulebased_optimizer.cpp +++ b/dbcon/mysql/rulebased_optimizer.cpp @@ -21,6 +21,7 @@ namespace optimizer { +// Apply a list of rules to a CSEP bool optimizeCSEPWithRules(execplan::CalpontSelectExecutionPlan& root, const std::vector& rules) { bool changed = false; @@ -31,6 +32,7 @@ bool optimizeCSEPWithRules(execplan::CalpontSelectExecutionPlan& root, const std return changed; } +// high level API call for optimizer bool optimizeCSEP(execplan::CalpontSelectExecutionPlan& root) { optimizer::Rule parallelCES{"parallelCES", optimizer::matchParallelCES, optimizer::applyParallelCES}; @@ -40,8 +42,22 @@ bool optimizeCSEP(execplan::CalpontSelectExecutionPlan& root) return optimizeCSEPWithRules(root, rules); } -// DFS walk -bool Rule::apply(execplan::CalpontSelectExecutionPlan& csep) const +// Apply iteratively until CSEP is converged by rule +bool Rule::apply(execplan::CalpontSelectExecutionPlan& root) const +{ + bool changedThisRound = false; + bool hasBeenApplied = false; + do + { + changedThisRound = walk(root); + hasBeenApplied = changedThisRound; + } while (changedThisRound); + + return hasBeenApplied; +} + +// DFS walk to match CSEP and apply rules if match +bool Rule::walk(execplan::CalpontSelectExecutionPlan& csep) const { bool rewrite = false; @@ -78,7 +94,6 @@ bool Rule::apply(execplan::CalpontSelectExecutionPlan& csep) const return rewrite; } - bool tableIsInUnion(const execplan::CalpontSystemCatalog::TableAliasName& table, execplan::CalpontSelectExecutionPlan& csep) { return std::any_of(csep.unionVec().begin(), csep.unionVec().end(), diff --git a/dbcon/mysql/rulebased_optimizer.h b/dbcon/mysql/rulebased_optimizer.h index 65fa3f359..9296f2002 100644 --- a/dbcon/mysql/rulebased_optimizer.h +++ b/dbcon/mysql/rulebased_optimizer.h @@ -32,6 +32,7 @@ struct Rule bool (*matchRule)(execplan::CalpontSelectExecutionPlan&); void (*applyRule)(execplan::CalpontSelectExecutionPlan&); bool apply(execplan::CalpontSelectExecutionPlan& csep) const; + bool walk(execplan::CalpontSelectExecutionPlan& csep) const; }; bool matchParallelCES(execplan::CalpontSelectExecutionPlan& csep); From e57832ee64a5bcec3653df6fbed6e5a1945d9486 Mon Sep 17 00:00:00 2001 From: drrtuy Date: Mon, 16 Jun 2025 16:37:03 +0000 Subject: [PATCH 38/79] feat(optimizer): temporary shield optimizer with a session variable --- dbcon/execplan/calpontselectexecutionplan.cpp | 79 ++++++++++--------- dbcon/mysql/ha_mcs_execplan.cpp | 15 ++-- dbcon/mysql/ha_mcs_sysvars.cpp | 1 + dbcon/mysql/ha_mcs_sysvars.h | 5 +- dbcon/mysql/rulebased_optimizer.cpp | 17 ++-- 5 files changed, 59 insertions(+), 58 deletions(-) diff --git a/dbcon/execplan/calpontselectexecutionplan.cpp b/dbcon/execplan/calpontselectexecutionplan.cpp index a09aee082..ded936ea0 100644 --- a/dbcon/execplan/calpontselectexecutionplan.cpp +++ b/dbcon/execplan/calpontselectexecutionplan.cpp @@ -206,59 +206,58 @@ void CalpontSelectExecutionPlan::printSubCSEP(const size_t& ident, ostringstream { if (plan) { - output << endlWithIndent(ident) << "{" << endlWithIndent(ident + 2) << plan->toString(ident + 2); - // remove last two spaces from the stream. - output.seekp(-2, std::ios::cur); - output << "}" << std::endl << endlWithIndent(ident); + output << endlWithIndent(ident) << "{"; + output << plan->toString(ident + 2); + output << endlWithIndent(ident) << "}"; } } string CalpontSelectExecutionPlan::toString(const size_t ident) const { ostringstream output; - output << "SELECT "; + output << endlWithIndent(ident) << "SELECT "; if (distinct()) { - output << "DISTINCT "; + output << endlWithIndent(ident) << "DISTINCT "; } - output << "limit: " << limitStart() << " - " << limitNum() << endlWithIndent(ident); + output << endlWithIndent(ident) << "limit: " << limitStart() << " - " << limitNum(); switch (location()) { - case CalpontSelectExecutionPlan::MAIN: output << "MAIN" << endlWithIndent(ident); break; + case CalpontSelectExecutionPlan::MAIN: output << endlWithIndent(ident) << "MAIN"; break; - case CalpontSelectExecutionPlan::FROM: output << "FROM" << endlWithIndent(ident); break; + case CalpontSelectExecutionPlan::FROM: output << endlWithIndent(ident) << "FROM"; break; - case CalpontSelectExecutionPlan::WHERE: output << "WHERE" << endlWithIndent(ident); break; + case CalpontSelectExecutionPlan::WHERE: output << endlWithIndent(ident) << "WHERE"; break; case CalpontSelectExecutionPlan::HAVING: output << "HAVING" << endlWithIndent(ident); break; } // Returned Column CalpontSelectExecutionPlan::ReturnedColumnList retCols = returnedCols(); - output << ">>Returned Columns" << endlWithIndent(ident); + output << endlWithIndent(ident) << ">>Returned Columns"; uint32_t seq = 0; for (unsigned int i = 0; i < retCols.size(); i++) { - output << *retCols[i] << endlWithIndent(ident+2); // WIP replace with constant + output << endlWithIndent(ident+2) << *retCols[i]; // WIP replace with constant if (retCols[i]->colSource() & SELECT_SUB) { - output << "select sub -- " << endlWithIndent(ident + 2); + output << endlWithIndent(ident + 2) << "select sub -- "; CalpontSelectExecutionPlan* plan = dynamic_cast(fSelectSubList[seq++].get()); - printSubCSEP(ident, output, plan); + printSubCSEP(ident + 2, output, plan); } } // From Clause CalpontSelectExecutionPlan::TableList tables = tableList(); - output << ">>From Tables" << endlWithIndent(ident + 2); + output << endlWithIndent(ident) <<">>From Tables"; seq = 0; for (unsigned int i = 0; i < tables.size(); i++) @@ -266,28 +265,29 @@ string CalpontSelectExecutionPlan::toString(const size_t ident) const // derived table if (tables[i].schema.length() == 0 && tables[i].table.length() == 0) { - output << "derived table - " << tables[i].alias << endlWithIndent(ident+2); + output << endlWithIndent(ident+2) << "derived table - " << tables[i].alias; CalpontSelectExecutionPlan* plan = dynamic_cast(fDerivedTableList[seq++].get()); - printSubCSEP(ident, output, plan); + printSubCSEP(ident + 2, output, plan); } else { - output << tables[i] << endlWithIndent(ident+2); + output << endlWithIndent(ident+2) << tables[i]; } } // Filters - output << ">>Filters" << endlWithIndent(ident); + output << endlWithIndent(ident) << ">>Filters"; if (filters() != nullptr) { + output << endlWithIndent(ident + 2); filters()->walk(ParseTree::print, output); } else { - output << "empty filter tree" << endlWithIndent(ident); + output << endlWithIndent(ident + 2) << "empty filter tree"; } // Group by columns @@ -295,12 +295,12 @@ string CalpontSelectExecutionPlan::toString(const size_t ident) const if (gbc.size() > 0) { - output << ">>Group By Columns" << endlWithIndent(ident); + output << endlWithIndent(ident) << ">>Group By Columns"; output << std::string(ident, ' '); for (unsigned int i = 0; i < gbc.size(); i++) { - output << *gbc[i] << endlWithIndent(ident); + output << endlWithIndent(ident + 2) << *gbc[i]; } output << std::string(ident, ' '); } @@ -308,8 +308,7 @@ string CalpontSelectExecutionPlan::toString(const size_t ident) const // Having if (having() != nullptr) { - output << ">>Having" << endlWithIndent(ident); - output << std::string(ident, ' '); + output << endlWithIndent(ident) << ">>Having" << endlWithIndent(ident + 2); having()->walk(ParseTree::print, output); } @@ -318,33 +317,35 @@ string CalpontSelectExecutionPlan::toString(const size_t ident) const if (obc.size() > 0) { - output << ">>Order By Columns" << endlWithIndent(ident); + output << endlWithIndent(ident) << ">>Order By Columns"; for (unsigned int i = 0; i < obc.size(); i++) - output << *obc[i] << endlWithIndent(ident); + output << endlWithIndent(ident + 2) << *obc[i]; } - output << "SessionID: " << fSessionID << endlWithIndent(ident); - output << "TxnID: " << fTxnID << endlWithIndent(ident); - output << "VerID: " << fVerID << endlWithIndent(ident); - output << "TraceFlags: " << fTraceFlags << endlWithIndent(ident); - output << "StatementID: " << fStatementID << endlWithIndent(ident); - output << "DistUnionNum: " << (int)fDistinctUnionNum << endlWithIndent(ident); - output << "Limit: " << fLimitStart << " - " << fLimitNum << endlWithIndent(ident); - output << "String table threshold: " << fStringTableThreshold << endlWithIndent(ident); + output << endlWithIndent(ident) << "SessionID: " << fSessionID; + output << endlWithIndent(ident) << "TxnID: " << fTxnID; + output << endlWithIndent(ident) << "VerID: " << fVerID; + output << endlWithIndent(ident) << "TraceFlags: " << fTraceFlags; + output << endlWithIndent(ident) << "StatementID: " << fStatementID; + output << endlWithIndent(ident) << "DistUnionNum: " << (int)fDistinctUnionNum; + output << endlWithIndent(ident) << "Limit: " << fLimitStart << " - " << fLimitNum; + output << endlWithIndent(ident) << "String table threshold: " << fStringTableThreshold; - output << "--- Column Map ---" << endlWithIndent(ident); + output << endlWithIndent(ident) << "--- Column Map ---"; CalpontSelectExecutionPlan::ColumnMap::const_iterator iter; for (iter = columnMap().begin(); iter != columnMap().end(); iter++) - output << (*iter).first << " : " << (*iter).second << endlWithIndent(ident); + { + output << endlWithIndent(ident + 2) << (*iter).first << " : " << (*iter).second; + } - output << "UUID: " << fUuid << endlWithIndent(ident); - output << "QueryType: " << queryType() << endlWithIndent(ident); + output << endlWithIndent(ident) << "UUID: " << fUuid; + output << endlWithIndent(ident) << "QueryType: " << queryType(); if (!unionVec().empty()) { - output << "--- Union Unit ---"; + output << endlWithIndent(ident) << "--- Union Unit ---"; } for (unsigned i = 0; i < unionVec().size(); i++) diff --git a/dbcon/mysql/ha_mcs_execplan.cpp b/dbcon/mysql/ha_mcs_execplan.cpp index b01e40c16..dcbcdcfd8 100644 --- a/dbcon/mysql/ha_mcs_execplan.cpp +++ b/dbcon/mysql/ha_mcs_execplan.cpp @@ -9209,7 +9209,7 @@ int cs_get_derived_plan(ha_columnstore_derived_handler* handler, THD* /*thd*/, S } -int cs_get_select_plan(ha_columnstore_select_handler* handler, THD* /*thd*/, SCSEP& csep, gp_walk_info& gwi, +int cs_get_select_plan(ha_columnstore_select_handler* handler, THD* thd, SCSEP& csep, gp_walk_info& gwi, bool isSelectLexUnit) { SELECT_LEX& select_lex = handler->select_lex ? *handler->select_lex : *handler->lex_unit->first_select(); @@ -9241,12 +9241,15 @@ int cs_get_select_plan(ha_columnstore_select_handler* handler, THD* /*thd*/, SCS // Derived table projection and filter optimization. derivedTableOptimization(&gwi, csep); - bool csepWasOptimized = optimizer::optimizeCSEP(*csep); - if (csep->traceOn() && csepWasOptimized) + if (get_unstable_optimizer(thd)) { - cerr << "---------------- cs_get_select_plan optimized EXECUTION PLAN ----------------" << endl; - cerr << *csep << endl; - cerr << "-------------- EXECUTION PLAN END --------------\n" << endl; + bool csepWasOptimized = optimizer::optimizeCSEP(*csep); + if (csep->traceOn() && csepWasOptimized) + { + cerr << "---------------- cs_get_select_plan optimized EXECUTION PLAN ----------------" << endl; + cerr << *csep << endl; + cerr << "-------------- EXECUTION PLAN END --------------\n" << endl; + } } return 0; diff --git a/dbcon/mysql/ha_mcs_sysvars.cpp b/dbcon/mysql/ha_mcs_sysvars.cpp index 6829877c0..551f1586b 100644 --- a/dbcon/mysql/ha_mcs_sysvars.cpp +++ b/dbcon/mysql/ha_mcs_sysvars.cpp @@ -269,6 +269,7 @@ st_mysql_sys_var* mcs_system_variables[] = { MYSQL_SYSVAR(pron), MYSQL_SYSVAR(max_allowed_in_values), MYSQL_SYSVAR(innodb_queries_use_mcs), + MYSQL_SYSVAR(unstable_optimizer), NULL}; st_mysql_show_var mcs_status_variables[] = {{"columnstore_version", (char*)&cs_version, SHOW_CHAR}, diff --git a/dbcon/mysql/ha_mcs_sysvars.h b/dbcon/mysql/ha_mcs_sysvars.h index 92612bb53..4675eb2a0 100644 --- a/dbcon/mysql/ha_mcs_sysvars.h +++ b/dbcon/mysql/ha_mcs_sysvars.h @@ -175,4 +175,7 @@ const char* get_pron(THD* thd); void set_pron(THD* thd, char* value); ulong get_max_allowed_in_values(THD* thd); -void set_max_allowed_in_values(THD* thd, ulong value); \ No newline at end of file +void set_max_allowed_in_values(THD* thd, ulong value); + +bool get_unstable_optimizer(THD* thd); +void set_unstable_optimizer(THD* thd, bool value); diff --git a/dbcon/mysql/rulebased_optimizer.cpp b/dbcon/mysql/rulebased_optimizer.cpp index 4e9c22b96..b4c926b26 100644 --- a/dbcon/mysql/rulebased_optimizer.cpp +++ b/dbcon/mysql/rulebased_optimizer.cpp @@ -110,7 +110,7 @@ bool tableIsInUnion(const execplan::CalpontSystemCatalog::TableAliasName& table, bool matchParallelCES(execplan::CalpontSelectExecutionPlan& csep) { auto tables = csep.tableList(); - // This is leaf and there are no other tables at this level. + // This is leaf and there are no other tables at this level in neither UNION, nor derived table. // WIP filter out CSEPs with orderBy, groupBy, having // WIP filter out CSEPs with nonSimpleColumns in projection return tables.size() == 1 && !tables[0].isColumnstore() && !tableIsInUnion(tables[0], csep); @@ -142,13 +142,14 @@ void applyParallelCES(execplan::CalpontSelectExecutionPlan& csep) if (!table.isColumnstore()) { auto derivedSCEP = csep.cloneWORecursiveSelects(); - // need to intro a level + // need to add a level here std::string alias = aliasPrefix + table.schema + "_" + table.table; derivedSCEP->location(execplan::CalpontSelectExecutionPlan::FROM); derivedSCEP->subType(execplan::CalpontSelectExecutionPlan::FROM_SUBS); derivedSCEP->derivedTbAlias(alias); + // TODO: hardcoded for now size_t parallelFactor = 2; auto additionalUnionVec = makeUnionFromTable(parallelFactor, csep); derivedSCEP->unionVec().insert(derivedSCEP->unionVec().end(), additionalUnionVec.begin(), additionalUnionVec.end()); @@ -166,23 +167,15 @@ void applyParallelCES(execplan::CalpontSelectExecutionPlan& csep) } } - // WIP need to work with existing derived tables newDerivedTableList.push_back(derivedSCEP); - // WIP execplan::CalpontSystemCatalog::TableAliasName tn = execplan::make_aliasview("", "", alias, ""); newTableList.push_back(tn); } } - // SimpleColumn* sc = new SimpleColumn("test", "i1", "i", false, csep.sessionID()); - // string alias(table->alias.c_ptr()); - // sc->timeZone(csep.timeZone()); - // sc->partitions(getPartitions(table)); - // boost::shared_ptr spsc(sc); - - // csep.columnMap().insert({"`test`.`i1`.`i`", spsc}); - + // There must be no derived at this point. csep.derivedTableList(newDerivedTableList); + // Replace table list with new table list populated with union units csep.tableList(newTableList); } } From 327231276d1e1c1d3ce307b0bac107f1fb5d8888 Mon Sep 17 00:00:00 2001 From: drrtuy Date: Tue, 17 Jun 2025 20:25:32 +0000 Subject: [PATCH 39/79] chore(): remove unused standalone unit test --- dbcon/execplan/csep_rewrite.cpp | 87 --------------------------------- 1 file changed, 87 deletions(-) delete mode 100644 dbcon/execplan/csep_rewrite.cpp diff --git a/dbcon/execplan/csep_rewrite.cpp b/dbcon/execplan/csep_rewrite.cpp deleted file mode 100644 index 4dbac48e0..000000000 --- a/dbcon/execplan/csep_rewrite.cpp +++ /dev/null @@ -1,87 +0,0 @@ -#include "execplan/calpontselectexecutionplan.h" -#include "simplecolumn.h" -#include "execplan/calpontsystemcatalog.h" -#include "simplefilter.h" -#include "constantcolumn.h" - -using namespace execplan; -const SOP opeq(new Operator("=")); - - - -int main() -{ - CalpontSelectExecutionPlan csep; - - CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList; - CalpontSelectExecutionPlan::ColumnMap colMap; - - string columnlength = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COLUMNLEN_COL; - - SimpleColumn* col[1]; - col[0] = new SimpleColumn(columnlength, 22222222); - - SRCP srcp; - srcp.reset(col[0]); - colMap.insert({columnlength, srcp}); - csep.columnMapNonStatic(colMap); - srcp.reset(col[0]->clone()); - returnedColumnList.push_back(srcp); - csep.returnedCols(returnedColumnList); - - { - SCSEP csepDerived(new CalpontSelectExecutionPlan()); - CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnListLocal; - CalpontSelectExecutionPlan::ColumnMap colMapLocal; - - string columnlength = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COLUMNLEN_COL; - - SimpleColumn* col[1]; - col[0] = new SimpleColumn(columnlength, 22222222); - - SRCP srcpLocal; - srcpLocal.reset(col[0]); - colMapLocal.insert({columnlength, srcpLocal}); - csepDerived->columnMapNonStatic(colMapLocal); - - srcp.reset(col[0]->clone()); - returnedColumnListLocal.push_back(srcpLocal); - csepDerived->returnedCols(returnedColumnList); - - CalpontSelectExecutionPlan::SelectList derivedTables; - derivedTables.push_back(csepDerived); - csep.derivedTableList(derivedTables); - } - - CalpontSelectExecutionPlan::TableList tableList = {execplan::CalpontSystemCatalog::TableAliasName("", "", "alias")}; - csep.tableList(tableList); - - CalpontSelectExecutionPlan::SelectList unionVec; - - for (size_t i = 0; i < 3; ++i) - { - SCSEP plan(new CalpontSelectExecutionPlan()); - CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnListLocal; - CalpontSelectExecutionPlan::ColumnMap colMapLocal; - - SRCP srcpLocal; - srcpLocal.reset(col[0]); - colMapLocal.insert({columnlength, srcpLocal}); - plan->columnMapNonStatic(colMapLocal); - srcpLocal.reset(col[0]->clone()); - returnedColumnListLocal.push_back(srcpLocal); - plan->returnedCols(returnedColumnListLocal); - - plan->txnID(csep.txnID()); - plan->verID(csep.verID()); - plan->sessionID(csep.sessionID()); - plan->columnMapNonStatic(colMapLocal); - plan->returnedCols(returnedColumnListLocal); - unionVec.push_back(plan); - - // std::cout << plan->toString() << std::endl; - } - - csep.unionVec(unionVec); - std::cout << csep.toString() << std::endl; -} \ No newline at end of file From 464b9a1ca35a0be0453c54f374371d78efd1dc96 Mon Sep 17 00:00:00 2001 From: drrtuy Date: Thu, 19 Jun 2025 15:01:11 +0000 Subject: [PATCH 40/79] chore(review): clean up leftovers --- dbcon/execplan/CMakeLists.txt | 8 -------- 1 file changed, 8 deletions(-) diff --git a/dbcon/execplan/CMakeLists.txt b/dbcon/execplan/CMakeLists.txt index a45448bbe..6e1acbb98 100755 --- a/dbcon/execplan/CMakeLists.txt +++ b/dbcon/execplan/CMakeLists.txt @@ -47,11 +47,3 @@ set(execplan_LIB_SRCS columnstore_library(execplan ${execplan_LIB_SRCS}) columnstore_link(execplan messageqcpp ${NETSNMP_LIBRARIES} ${ENGINE_DT_LIB} pron loggingcpp) - -columnstore_executable(csep_rewrite csep_rewrite.cpp) -columnstore_link(csep_rewrite - ${ENGINE_LDFLAGS} - ${NETSNMP_LIBRARIES} - ${ENGINE_WRITE_LIBS} - loggingcpp -) \ No newline at end of file From 3bf4394456ce3d29d90fd91268f52dc2adce760f Mon Sep 17 00:00:00 2001 From: drrtuy Date: Mon, 23 Jun 2025 22:17:09 +0000 Subject: [PATCH 41/79] feat(optimizer): rewrite rule does not descent into a freshly created UNION unit. --- dbcon/mysql/rulebased_optimizer.cpp | 43 +++++++++++++++++------------ dbcon/mysql/rulebased_optimizer.h | 19 ++++++++++--- 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/dbcon/mysql/rulebased_optimizer.cpp b/dbcon/mysql/rulebased_optimizer.cpp index b4c926b26..935f55d90 100644 --- a/dbcon/mysql/rulebased_optimizer.cpp +++ b/dbcon/mysql/rulebased_optimizer.cpp @@ -21,6 +21,8 @@ namespace optimizer { +static const std::string RewrittenSubTableAliasPrefix = "$added_sub_"; + // Apply a list of rules to a CSEP bool optimizeCSEPWithRules(execplan::CalpontSelectExecutionPlan& root, const std::vector& rules) { @@ -47,9 +49,9 @@ bool Rule::apply(execplan::CalpontSelectExecutionPlan& root) const { bool changedThisRound = false; bool hasBeenApplied = false; - do + do { - changedThisRound = walk(root); + changedThisRound = walk(root) && !applyOnlyOnce; hasBeenApplied = changedThisRound; } while (changedThisRound); @@ -70,7 +72,7 @@ bool Rule::walk(execplan::CalpontSelectExecutionPlan& csep) const } auto& csepLocal = *csepPtr; - rewrite |= apply(csepLocal); + rewrite |= walk(csepLocal); } for (auto& unionUnit : csep.unionVec()) @@ -82,7 +84,7 @@ bool Rule::walk(execplan::CalpontSelectExecutionPlan& csep) const } auto& unionUnitLocal = *unionUnitPtr; - rewrite |= apply(unionUnitLocal); + rewrite |= walk(unionUnitLocal); } if (matchRule(csep)) @@ -112,7 +114,7 @@ bool matchParallelCES(execplan::CalpontSelectExecutionPlan& csep) auto tables = csep.tableList(); // This is leaf and there are no other tables at this level in neither UNION, nor derived table. // WIP filter out CSEPs with orderBy, groupBy, having - // WIP filter out CSEPs with nonSimpleColumns in projection + // Filter out tables that were re-written. return tables.size() == 1 && !tables[0].isColumnstore() && !tableIsInUnion(tables[0], csep); } @@ -134,7 +136,7 @@ void applyParallelCES(execplan::CalpontSelectExecutionPlan& csep) auto tables = csep.tableList(); execplan::CalpontSelectExecutionPlan::TableList newTableList; execplan::CalpontSelectExecutionPlan::SelectList newDerivedTableList; - static const std::string aliasPrefix = "$sub_"; + execplan::CalpontSelectExecutionPlan::ReturnedColumnList newReturnedColumns; // ATM Must be only 1 table for (auto& table: tables) @@ -143,32 +145,35 @@ void applyParallelCES(execplan::CalpontSelectExecutionPlan& csep) { auto derivedSCEP = csep.cloneWORecursiveSelects(); // need to add a level here - std::string alias = aliasPrefix + table.schema + "_" + table.table; + std::string tableAlias = RewrittenSubTableAliasPrefix + table.schema + "_" + table.table; derivedSCEP->location(execplan::CalpontSelectExecutionPlan::FROM); derivedSCEP->subType(execplan::CalpontSelectExecutionPlan::FROM_SUBS); - derivedSCEP->derivedTbAlias(alias); + derivedSCEP->derivedTbAlias(tableAlias); // TODO: hardcoded for now size_t parallelFactor = 2; auto additionalUnionVec = makeUnionFromTable(parallelFactor, csep); derivedSCEP->unionVec().insert(derivedSCEP->unionVec().end(), additionalUnionVec.begin(), additionalUnionVec.end()); + size_t colPosition = 0; // change parent to derived table columns for (auto& rc : csep.returnedCols()) { - auto* sc = dynamic_cast(rc.get()); - if (sc) - { - sc->tableName(""); - sc->schemaName(""); - sc->tableAlias(alias); - sc->colPosition(0); - } + auto rc_ = boost::make_shared(*rc); + // TODO timezone and result type are not copied + // TODO add specific ctor for this functionality + rc_->tableName(""); + rc_->schemaName(""); + rc_->tableAlias(tableAlias); + rc_->colPosition(colPosition++); + rc_->resultType(rc->resultType()); + + newReturnedColumns.push_back(rc_); } newDerivedTableList.push_back(derivedSCEP); - execplan::CalpontSystemCatalog::TableAliasName tn = execplan::make_aliasview("", "", alias, ""); + execplan::CalpontSystemCatalog::TableAliasName tn = execplan::make_aliasview("", "", tableAlias, ""); newTableList.push_back(tn); } } @@ -177,6 +182,8 @@ void applyParallelCES(execplan::CalpontSelectExecutionPlan& csep) csep.derivedTableList(newDerivedTableList); // Replace table list with new table list populated with union units csep.tableList(newTableList); -} + csep.returnedCols(newReturnedColumns); +} + } diff --git a/dbcon/mysql/rulebased_optimizer.h b/dbcon/mysql/rulebased_optimizer.h index 9296f2002..df0fa8556 100644 --- a/dbcon/mysql/rulebased_optimizer.h +++ b/dbcon/mysql/rulebased_optimizer.h @@ -24,13 +24,24 @@ namespace optimizer { struct Rule { - Rule(std::string&& name, bool (*matchRule)(execplan::CalpontSelectExecutionPlan&), - void (*applyRule)(execplan::CalpontSelectExecutionPlan&)) + using RuleMatcher = bool (*)(execplan::CalpontSelectExecutionPlan&); + using RuleApplier = void (*)(execplan::CalpontSelectExecutionPlan&); + + Rule(std::string&& name, RuleMatcher matchRule, RuleApplier applyRule) : name(name), matchRule(matchRule), applyRule(applyRule) {}; std::string name; - bool (*matchRule)(execplan::CalpontSelectExecutionPlan&); - void (*applyRule)(execplan::CalpontSelectExecutionPlan&); + RuleMatcher matchRule; + RuleApplier applyRule; + // TODO Wrap CSEP into Nodes to be able to navigate up and down the tree and remove this flag + bool applyOnlyOnce = true; + + Rule() = default; + Rule(const Rule&) = default; + Rule(Rule&&) = default; + Rule& operator=(const Rule&) = default; + Rule& operator=(Rule&&) = default; + bool apply(execplan::CalpontSelectExecutionPlan& csep) const; bool walk(execplan::CalpontSelectExecutionPlan& csep) const; }; From 8a2ae35918efd33aa89b462664ace9d5bd8f7106 Mon Sep 17 00:00:00 2001 From: drrtuy Date: Tue, 24 Jun 2025 11:47:53 +0000 Subject: [PATCH 42/79] chore(): review fixes --- dbcon/execplan/calpontselectexecutionplan.cpp | 46 +------------------ dbcon/mysql/rulebased_optimizer.cpp | 6 +-- 2 files changed, 4 insertions(+), 48 deletions(-) diff --git a/dbcon/execplan/calpontselectexecutionplan.cpp b/dbcon/execplan/calpontselectexecutionplan.cpp index ded936ea0..fd48ebb3c 100644 --- a/dbcon/execplan/calpontselectexecutionplan.cpp +++ b/dbcon/execplan/calpontselectexecutionplan.cpp @@ -863,6 +863,7 @@ void CalpontSelectExecutionPlan::pron(std::string&& pron) fPron = pron; } +// This routine doesn't copy derived table list, union vector, select subqueries, subquery list, and subselects. execplan::SCSEP CalpontSelectExecutionPlan::cloneWORecursiveSelects() { execplan::SCSEP newPlan(new CalpontSelectExecutionPlan(fLocation)); @@ -925,15 +926,6 @@ execplan::SCSEP CalpontSelectExecutionPlan::cloneWORecursiveSelects() newPlan->filterTokenList(fFilterTokenList); newPlan->havingTokenList(fHavingTokenList); - // Deep copy of subselects - // SelectList newSubSelects; - // for (const auto& sel : fSubSelects) - // { - // if (sel) - // newSubSelects.push_back(SCEP(sel->clone())); - // } - // newPlan->subSelects(newSubSelects); - // Deep copy of group by columns GroupByColumnList newGroupByCols; for (const auto& col : fGroupByCols) @@ -971,42 +963,6 @@ execplan::SCSEP CalpontSelectExecutionPlan::cloneWORecursiveSelects() // Deep copy of table list newPlan->tableList(fTableList); - // // Deep copy of derived table list - // SelectList newDerivedTableList; - // for (const auto& sel : fDerivedTableList) - // { - // if (sel) - // newDerivedTableList.push_back(SCEP(sel->clone())); - // } - // newPlan->derivedTableList(newDerivedTableList); - - // // Deep copy of union vector - // SelectList newUnionVec; - // for (const auto& sel : fUnionVec) - // { - // if (sel) - // newUnionVec.push_back(SCEP(sel->clone())); - // } - // newPlan->unionVec(newUnionVec); - - // // Deep copy of select subqueries - // SelectList newSelectSubList; - // for (const auto& sel : fSelectSubList) - // { - // if (sel) - // newSelectSubList.push_back(SCEP(sel->clone())); - // } - // newPlan->selectSubList(newSelectSubList); - - // // Deep copy of subquery list - // std::vector newSubSelectList; - // for (const auto& sel : fSubSelectList) - // { - // if (sel) - // newSubSelectList.push_back(SCSEP(sel->clone())); - // } - // newPlan->subSelectList(newSubSelectList); - return newPlan; } diff --git a/dbcon/mysql/rulebased_optimizer.cpp b/dbcon/mysql/rulebased_optimizer.cpp index 935f55d90..3388ad01d 100644 --- a/dbcon/mysql/rulebased_optimizer.cpp +++ b/dbcon/mysql/rulebased_optimizer.cpp @@ -51,9 +51,9 @@ bool Rule::apply(execplan::CalpontSelectExecutionPlan& root) const bool hasBeenApplied = false; do { - changedThisRound = walk(root) && !applyOnlyOnce; - hasBeenApplied = changedThisRound; - } while (changedThisRound); + changedThisRound = walk(root); + hasBeenApplied |= changedThisRound; + } while (changedThisRound && !applyOnlyOnce); return hasBeenApplied; } From 9da9144343df88675676f9c5c73d2f8e6b17d30a Mon Sep 17 00:00:00 2001 From: drrtuy Date: Wed, 25 Jun 2025 22:50:38 +0000 Subject: [PATCH 43/79] feat(optimizer): UNION units now have origin filters pushdown AND partition boundaries filters --- dbcon/mysql/ha_mcs_impl.cpp | 13 --- dbcon/mysql/rulebased_optimizer.cpp | 121 +++++++++++++++++++++------- 2 files changed, 92 insertions(+), 42 deletions(-) diff --git a/dbcon/mysql/ha_mcs_impl.cpp b/dbcon/mysql/ha_mcs_impl.cpp index d5f4925e7..797ac40c4 100644 --- a/dbcon/mysql/ha_mcs_impl.cpp +++ b/dbcon/mysql/ha_mcs_impl.cpp @@ -4248,19 +4248,6 @@ int ha_mcs_impl_pushdown_init(mcs_handler_info* handler_info, TABLE* table, bool ifs.close(); csep->unserialize(bs1); #endif - - if (ci->traceFlags & 1) - { - cerr << "---------------- EXECUTION PLAN ----------------" << endl; - cerr << *csep << endl; - cerr << "-------------- EXECUTION PLAN END --------------\n" << endl; - } - else - { - IDEBUG(cout << "---------------- EXECUTION PLAN ----------------" << endl); - IDEBUG(cerr << *csep << endl); - IDEBUG(cout << "-------------- EXECUTION PLAN END --------------\n" << endl); - } } } // end of execution plan generation diff --git a/dbcon/mysql/rulebased_optimizer.cpp b/dbcon/mysql/rulebased_optimizer.cpp index 3388ad01d..b2107c497 100644 --- a/dbcon/mysql/rulebased_optimizer.cpp +++ b/dbcon/mysql/rulebased_optimizer.cpp @@ -15,17 +15,23 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#include "constantcolumn.h" #include "execplan/calpontselectexecutionplan.h" #include "execplan/simplecolumn.h" +#include "logicoperator.h" +#include "operator.h" +#include "predicateoperator.h" +#include "simplefilter.h" #include "rulebased_optimizer.h" -namespace optimizer { +namespace optimizer +{ static const std::string RewrittenSubTableAliasPrefix = "$added_sub_"; // Apply a list of rules to a CSEP -bool optimizeCSEPWithRules(execplan::CalpontSelectExecutionPlan& root, const std::vector& rules) { - +bool optimizeCSEPWithRules(execplan::CalpontSelectExecutionPlan& root, const std::vector& rules) +{ bool changed = false; for (const auto& rule : rules) { @@ -38,7 +44,7 @@ bool optimizeCSEPWithRules(execplan::CalpontSelectExecutionPlan& root, const std bool optimizeCSEP(execplan::CalpontSelectExecutionPlan& root) { optimizer::Rule parallelCES{"parallelCES", optimizer::matchParallelCES, optimizer::applyParallelCES}; - + std::vector rules = {parallelCES}; return optimizeCSEPWithRules(root, rules); @@ -96,17 +102,19 @@ bool Rule::walk(execplan::CalpontSelectExecutionPlan& csep) const return rewrite; } -bool tableIsInUnion(const execplan::CalpontSystemCatalog::TableAliasName& table, execplan::CalpontSelectExecutionPlan& csep) +bool tableIsInUnion(const execplan::CalpontSystemCatalog::TableAliasName& table, + execplan::CalpontSelectExecutionPlan& csep) { - return std::any_of(csep.unionVec().begin(), csep.unionVec().end(), - [&table](const auto& unionUnit) { - execplan::CalpontSelectExecutionPlan* unionUnitLocal = dynamic_cast(unionUnit.get()); - bool tableIsPresented = std::any_of(unionUnitLocal->tableList().begin(), unionUnitLocal->tableList().end(), - [&table](const auto& unionTable) { - return unionTable == table; - }); - return tableIsPresented; - }); + return std::any_of(csep.unionVec().begin(), csep.unionVec().end(), + [&table](const auto& unionUnit) + { + execplan::CalpontSelectExecutionPlan* unionUnitLocal = + dynamic_cast(unionUnit.get()); + bool tableIsPresented = + std::any_of(unionUnitLocal->tableList().begin(), unionUnitLocal->tableList().end(), + [&table](const auto& unionTable) { return unionTable == table; }); + return tableIsPresented; + }); } bool matchParallelCES(execplan::CalpontSelectExecutionPlan& csep) @@ -118,14 +126,65 @@ bool matchParallelCES(execplan::CalpontSelectExecutionPlan& csep) return tables.size() == 1 && !tables[0].isColumnstore() && !tableIsInUnion(tables[0], csep); } -execplan::CalpontSelectExecutionPlan::SelectList makeUnionFromTable(const size_t numberOfLegs, - execplan::CalpontSelectExecutionPlan& csep) +// This routine produces a new ParseTree that is AND(lowerBand <= column, column <= upperBand) +// TODO add engine-independent statistics-derived ranges +execplan::ParseTree* filtersWithNewRangeAddedIfNeeded(execplan::SCSEP& csep) +{ + // INV this is SimpleColumn we supply as an argument + // TODO find the suitable column using EI statistics. + auto* column = dynamic_cast(csep->returnedCols().front().get()); + assert(column); + + auto tableKeyColumnLeftOp = new execplan::SimpleColumn(*column); + tableKeyColumnLeftOp->resultType(column->resultType()); + + // TODO Nobody owns this allocation and cleanup only depends on delete in ParseTree nodes' dtors. + auto* filterColLeftOp = new execplan::ConstantColumnUInt(42ULL, 0, 0); + // set TZ + // There is a question with ownership of the const column + execplan::SOP ltOp = boost::make_shared(execplan::PredicateOperator("<=")); + ltOp->setOpType(filterColLeftOp->resultType(), tableKeyColumnLeftOp->resultType()); + ltOp->resultType(ltOp->operationType()); + + auto* sfr = new execplan::SimpleFilter(ltOp, tableKeyColumnLeftOp, filterColLeftOp); + // auto tableKeyColumn = derivedSCEP->returnedCols().front(); + auto tableKeyColumnRightOp = new execplan::SimpleColumn(*column); + tableKeyColumnRightOp->resultType(column->resultType()); + // TODO hardcoded column type and value + auto* filterColRightOp = new execplan::ConstantColumnUInt(30ULL, 0, 0); + + execplan::SOP gtOp = boost::make_shared(execplan::PredicateOperator(">=")); + gtOp->setOpType(filterColRightOp->resultType(), tableKeyColumnRightOp->resultType()); + gtOp->resultType(gtOp->operationType()); + + auto* sfl = new execplan::SimpleFilter(gtOp, tableKeyColumnRightOp, filterColRightOp); + + execplan::ParseTree* ptp = new execplan::ParseTree(new execplan::LogicOperator("and")); + ptp->right(sfr); + ptp->left(sfl); + + auto* currentFilters = csep->filters(); + if (currentFilters) + { + execplan::ParseTree* andWithExistingFilters = + new execplan::ParseTree(new execplan::LogicOperator("and"), currentFilters, ptp); + return andWithExistingFilters; + } + + return ptp; +} + +execplan::CalpontSelectExecutionPlan::SelectList makeUnionFromTable( + const size_t numberOfLegs, execplan::CalpontSelectExecutionPlan& csep) { execplan::CalpontSelectExecutionPlan::SelectList unionVec; unionVec.reserve(numberOfLegs); for (size_t i = 0; i < numberOfLegs; ++i) { - unionVec.push_back(csep.cloneWORecursiveSelects()); + auto clonedCSEP = csep.cloneWORecursiveSelects(); + // Add BETWEEN based on key column range + clonedCSEP->filters(filtersWithNewRangeAddedIfNeeded(clonedCSEP)); + unionVec.push_back(clonedCSEP); } return unionVec; @@ -139,7 +198,7 @@ void applyParallelCES(execplan::CalpontSelectExecutionPlan& csep) execplan::CalpontSelectExecutionPlan::ReturnedColumnList newReturnedColumns; // ATM Must be only 1 table - for (auto& table: tables) + for (auto& table : tables) { if (!table.isColumnstore()) { @@ -153,31 +212,36 @@ void applyParallelCES(execplan::CalpontSelectExecutionPlan& csep) // TODO: hardcoded for now size_t parallelFactor = 2; + // Create a copy of the current leaf CSEP with additional filters to partition the key column auto additionalUnionVec = makeUnionFromTable(parallelFactor, csep); - derivedSCEP->unionVec().insert(derivedSCEP->unionVec().end(), additionalUnionVec.begin(), additionalUnionVec.end()); + derivedSCEP->unionVec().insert(derivedSCEP->unionVec().end(), additionalUnionVec.begin(), + additionalUnionVec.end()); size_t colPosition = 0; // change parent to derived table columns for (auto& rc : csep.returnedCols()) { - auto rc_ = boost::make_shared(*rc); + auto rcCloned = boost::make_shared(*rc); // TODO timezone and result type are not copied // TODO add specific ctor for this functionality - rc_->tableName(""); - rc_->schemaName(""); - rc_->tableAlias(tableAlias); - rc_->colPosition(colPosition++); - rc_->resultType(rc->resultType()); + rcCloned->tableName(""); + rcCloned->schemaName(""); + rcCloned->tableAlias(tableAlias); + rcCloned->colPosition(colPosition++); + rcCloned->resultType(rc->resultType()); - newReturnedColumns.push_back(rc_); + newReturnedColumns.push_back(rcCloned); } newDerivedTableList.push_back(derivedSCEP); execplan::CalpontSystemCatalog::TableAliasName tn = execplan::make_aliasview("", "", tableAlias, ""); newTableList.push_back(tn); + // Remove the filters as they were pushed down to union units + derivedSCEP->filters(nullptr); } } - + // Remove the filters as they were pushed down to union units + csep.filters(nullptr); // There must be no derived at this point. csep.derivedTableList(newDerivedTableList); // Replace table list with new table list populated with union units @@ -185,5 +249,4 @@ void applyParallelCES(execplan::CalpontSelectExecutionPlan& csep) csep.returnedCols(newReturnedColumns); } -} - +} // namespace optimizer From 2d7821d141f52a198ed0aed6ef2225ea5b07ef05 Mon Sep 17 00:00:00 2001 From: Leonid Fedorov Date: Thu, 26 Jun 2025 21:05:52 +0000 Subject: [PATCH 44/79] fix(ub): logger was null ptr in configListener --- storage-manager/src/Downloader.cpp | 2 +- storage-manager/src/SMLogging.cpp | 9 ++------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/storage-manager/src/Downloader.cpp b/storage-manager/src/Downloader.cpp index 4e914ce61..ea0ff26d2 100644 --- a/storage-manager/src/Downloader.cpp +++ b/storage-manager/src/Downloader.cpp @@ -30,11 +30,11 @@ namespace storagemanager { Downloader::Downloader() : maxDownloads(0) { + logger = SMLogging::get(); storage = CloudStorage::get(); configListener(); Config::get()->addConfigListener(this); workers.setName("Downloader"); - logger = SMLogging::get(); tmpPath = "downloading"; bytesDownloaded = 0; } diff --git a/storage-manager/src/SMLogging.cpp b/storage-manager/src/SMLogging.cpp index d69811821..b69245f9c 100644 --- a/storage-manager/src/SMLogging.cpp +++ b/storage-manager/src/SMLogging.cpp @@ -44,13 +44,8 @@ SMLogging::~SMLogging() SMLogging* SMLogging::get() { - if (smLog) - return smLog; - boost::mutex::scoped_lock s(m); - if (smLog) - return smLog; - smLog = new SMLogging(); - return smLog; + static SMLogging smLog; + return &smLog; } void SMLogging::log(int priority, const char* format, ...) From 568a0744967ab10ca814b0da98d70745f6f48e40 Mon Sep 17 00:00:00 2001 From: Leonid Fedorov <79837786+mariadb-LeonidFedorov@users.noreply.github.com> Date: Fri, 27 Jun 2025 01:27:49 +0400 Subject: [PATCH 45/79] remove unused globals --- storage-manager/src/SMLogging.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/storage-manager/src/SMLogging.cpp b/storage-manager/src/SMLogging.cpp index b69245f9c..02d5a6d17 100644 --- a/storage-manager/src/SMLogging.cpp +++ b/storage-manager/src/SMLogging.cpp @@ -21,12 +21,6 @@ using namespace std; -namespace -{ -storagemanager::SMLogging* smLog = NULL; -boost::mutex m; -}; // namespace - namespace storagemanager { SMLogging::SMLogging() From 70547c735860f45a757d5482d1833e20b407bb03 Mon Sep 17 00:00:00 2001 From: drrtuy Date: Fri, 27 Jun 2025 10:40:56 +0000 Subject: [PATCH 46/79] chore(plugin): translator walks are now in separate units --- dbcon/mysql/CMakeLists.txt | 2 + dbcon/mysql/ha_mcs_execplan.cpp | 1801 +----------------- dbcon/mysql/ha_mcs_execplan_helpers.cpp | 189 ++ dbcon/mysql/ha_mcs_execplan_helpers.h | 58 + dbcon/mysql/ha_mcs_execplan_parseinfo_bits.h | 28 + dbcon/mysql/ha_mcs_execplan_walks.cpp | 1636 ++++++++++++++++ dbcon/mysql/ha_mcs_execplan_walks.h | 28 + 7 files changed, 1944 insertions(+), 1798 deletions(-) create mode 100644 dbcon/mysql/ha_mcs_execplan_helpers.cpp create mode 100644 dbcon/mysql/ha_mcs_execplan_helpers.h create mode 100644 dbcon/mysql/ha_mcs_execplan_parseinfo_bits.h create mode 100644 dbcon/mysql/ha_mcs_execplan_walks.cpp create mode 100644 dbcon/mysql/ha_mcs_execplan_walks.h diff --git a/dbcon/mysql/CMakeLists.txt b/dbcon/mysql/CMakeLists.txt index cb176f371..711c0a188 100644 --- a/dbcon/mysql/CMakeLists.txt +++ b/dbcon/mysql/CMakeLists.txt @@ -23,6 +23,8 @@ set(libcalmysql_SRCS ha_mcs_impl.cpp ha_mcs_dml.cpp ha_mcs_ddl.cpp + ha_mcs_execplan_helpers.cpp + ha_mcs_execplan_walks.cpp ha_mcs_execplan.cpp ha_scalar_sub.cpp ha_in_sub.cpp diff --git a/dbcon/mysql/ha_mcs_execplan.cpp b/dbcon/mysql/ha_mcs_execplan.cpp index dcbcdcfd8..6e19dda44 100644 --- a/dbcon/mysql/ha_mcs_execplan.cpp +++ b/dbcon/mysql/ha_mcs_execplan.cpp @@ -54,6 +54,9 @@ using namespace logging; #include "mcsv1_udaf.h" +#include "ha_mcs_execplan_walks.h" +#include "ha_mcs_execplan_parseinfo_bits.h" +#include "ha_mcs_execplan_helpers.h" #include "ha_mcs_impl_if.h" #include "ha_mcs_sysvars.h" #include "ha_subquery.h" @@ -93,50 +96,6 @@ using namespace funcexp; #include "vlarray.h" -const uint64_t AGG_BIT = 0x01; -const uint64_t SUB_BIT = 0x02; -const uint64_t AF_BIT = 0x04; -const uint64_t CORRELATED = 0x08; - -// In certain cases, gp_walk is called recursively. When done so, -// we need to bookmark the rcWorkStack for those cases where a constant -// expression such as 1=1 is used in an if statement or function call. -// This is a seriously bad kludge for MariaDB bug 750. -// -// BM => BookMark -// HWM => HighWaterMark -class RecursionCounter -{ - private: - RecursionCounter() - { - } - - public: - RecursionCounter(gp_walk_info* gwip) : fgwip(gwip) - { - ++fgwip->recursionLevel; - - if (fgwip->recursionLevel > fgwip->recursionHWM) - { - fgwip->rcBookMarkStack.push(fgwip->rcWorkStack.size()); - fgwip->recursionHWM = fgwip->recursionLevel; - } - } - ~RecursionCounter() - { - --fgwip->recursionLevel; - - if (fgwip->recursionLevel < fgwip->recursionHWM - 1) - { - fgwip->rcBookMarkStack.pop(); - --fgwip->recursionHWM; - } - } - - gp_walk_info* fgwip; -}; - #include "ha_view.h" namespace cal_impl_if @@ -455,21 +414,6 @@ void clearDeleteStacks(gp_walk_info& gwi) gwi.viewList.clear(); } -bool nonConstFunc(Item_func* ifp) -{ - if (strcasecmp(ifp->func_name(), "rand") == 0 || strcasecmp(ifp->func_name(), "sysdate") == 0 || - strcasecmp(ifp->func_name(), "idblocalpm") == 0) - return true; - - for (uint32_t i = 0; i < ifp->argument_count(); i++) - { - if (ifp->arguments()[i]->type() == Item::FUNC_ITEM && nonConstFunc(((Item_func*)ifp->arguments()[i]))) - return true; - } - - return false; -} - /*@brief getColNameFromItem - builds a name from an Item */ /*********************************************************** * DESCRIPTION: @@ -810,659 +754,6 @@ string getViewName(TABLE_LIST* table_ptr) return viewName; } -#ifdef DEBUG_WALK_COND -void debug_walk(const Item* item, void* arg) -{ - switch (item->type()) - { - case Item::FIELD_ITEM: - { - Item_field* ifp = (Item_field*)item; - cerr << "FIELD_ITEM: " << (ifp->db_name.str ? ifp->db_name.str : "") << '.' << bestTableName(ifp) << '.' - << ifp->field_name.str << endl; - break; - } - case Item::CONST_ITEM: - { - switch (item->cmp_type()) - { - case INT_RESULT: - { - Item_int* iip = (Item_int*)item; - cerr << "INT_ITEM: "; - - if (iip->name.length) - cerr << iip->name.str << " (from name string)" << endl; - else - cerr << iip->val_int() << endl; - - break; - } - case STRING_RESULT: - { - Item_string* isp = (Item_string*)item; - String val, *str = isp->val_str(&val); - string valStr; - valStr.assign(str->ptr(), str->length()); - cerr << "STRING_ITEM: >" << valStr << '<' << endl; - break; - } - case REAL_RESULT: - { - cerr << "REAL_ITEM" << endl; - break; - } - case DECIMAL_RESULT: - { - cerr << "DECIMAL_ITEM" << endl; - break; - } - case TIME_RESULT: - { - String val, *str = NULL; - Item_temporal_literal* itp = (Item_temporal_literal*)item; - str = itp->val_str(&val); - cerr << "DATE ITEM: "; - - if (str) - cerr << ": (" << str->ptr() << ')' << endl; - else - cerr << ": " << endl; - - break; - } - default: - { - cerr << ": Unknown cmp_type" << endl; - break; - } - } - break; - } - case Item::FUNC_ITEM: - { - Item_func* ifp = (Item_func*)item; - Item_func_opt_neg* inp; - cerr << "FUNC_ITEM: "; - - switch (ifp->functype()) - { - case Item_func::UNKNOWN_FUNC: // 0 - cerr << ifp->func_name() << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::GT_FUNC: // 7 - cerr << '>' << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::EQ_FUNC: // 1 - cerr << '=' << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::GE_FUNC: cerr << ">=" << " (" << ifp->functype() << ")" << endl; break; - - case Item_func::LE_FUNC: cerr << "<=" << " (" << ifp->functype() << ")" << endl; break; - - case Item_func::LT_FUNC: cerr << '<' << " (" << ifp->functype() << ")" << endl; break; - - case Item_func::NE_FUNC: cerr << "<>" << " (" << ifp->functype() << ")" << endl; break; - - case Item_func::NEG_FUNC: // 45 - cerr << "unary minus" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::IN_FUNC: // 16 - inp = (Item_func_opt_neg*)ifp; - - if (inp->negated) - cerr << "not "; - - cerr << "in" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::BETWEEN: - inp = (Item_func_opt_neg*)ifp; - - if (inp->negated) - cerr << "not "; - - cerr << "between" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::ISNULL_FUNC: // 10 - cerr << "is null" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::ISNOTNULL_FUNC: // 11 - cerr << "is not null" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::NOT_ALL_FUNC: cerr << "not_all" << " (" << ifp->functype() << ")" << endl; break; - - case Item_func::NOT_FUNC: cerr << "not_func" << " (" << ifp->functype() << ")" << endl; break; - - case Item_func::TRIG_COND_FUNC: - cerr << "trig_cond_func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::ISNOTNULLTEST_FUNC: - cerr << "isnotnulltest_func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::MULT_EQUAL_FUNC: - { - cerr << "mult_equal_func:" << " (" << ifp->functype() << ")" << endl; - Item_equal* item_eq = (Item_equal*)ifp; - Item_equal_fields_iterator it(*item_eq); - Item* item; - - while ((item = it++)) - { - Field* equal_field = it.get_curr_field(); - cerr << equal_field->field_name.str << endl; - } - - break; - } - - case Item_func::EQUAL_FUNC: cerr << "equal func" << " (" << ifp->functype() << ")" << endl; break; - - case Item_func::FT_FUNC: cerr << "ft func" << " (" << ifp->functype() << ")" << endl; break; - - case Item_func::LIKE_FUNC: cerr << "like func" << " (" << ifp->functype() << ")" << endl; break; - - case Item_func::COND_AND_FUNC: - cerr << "cond and func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::COND_OR_FUNC: cerr << "cond or func" << " (" << ifp->functype() << ")" << endl; break; - - case Item_func::XOR_FUNC: cerr << "xor func" << " (" << ifp->functype() << ")" << endl; break; - - case Item_func::INTERVAL_FUNC: - cerr << "interval func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::SP_EQUALS_FUNC: - cerr << "sp equals func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::SP_DISJOINT_FUNC: - cerr << "sp disjoint func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::SP_INTERSECTS_FUNC: - cerr << "sp intersects func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::SP_TOUCHES_FUNC: - cerr << "sp touches func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::SP_CROSSES_FUNC: - cerr << "sp crosses func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::SP_WITHIN_FUNC: - cerr << "sp within func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::SP_CONTAINS_FUNC: - cerr << "sp contains func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::SP_OVERLAPS_FUNC: - cerr << "sp overlaps func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::SP_STARTPOINT: - cerr << "sp startpoint func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::SP_ENDPOINT: - cerr << "sp endpoint func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::SP_EXTERIORRING: - cerr << "sp exteriorring func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::SP_POINTN: cerr << "sp pointn func" << " (" << ifp->functype() << ")" << endl; break; - - case Item_func::SP_GEOMETRYN: - cerr << "sp geometryn func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::SP_INTERIORRINGN: - cerr << "sp exteriorringn func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::SP_RELATE_FUNC: - cerr << "sp relate func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::NOW_FUNC: cerr << "now func" << " (" << ifp->functype() << ")" << endl; break; - - case Item_func::SUSERVAR_FUNC: - cerr << "suservar func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::GUSERVAR_FUNC: - cerr << "guservar func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::COLLATE_FUNC: cerr << "collate func" << " (" << ifp->functype() << ")" << endl; break; - - case Item_func::EXTRACT_FUNC: cerr << "extract func" << " (" << ifp->functype() << ")" << endl; break; - - case Item_func::CHAR_TYPECAST_FUNC: - cerr << "char typecast func" << " (" << ifp->functype() << ")" << endl; - break; - - case Item_func::FUNC_SP: cerr << "func sp func" << " (" << ifp->functype() << ")" << endl; break; - - case Item_func::UDF_FUNC: cerr << "udf func" << " (" << ifp->functype() << ")" << endl; break; - - case Item_func::GSYSVAR_FUNC: cerr << "gsysvar func" << " (" << ifp->functype() << ")" << endl; break; - - case Item_func::DYNCOL_FUNC: cerr << "dyncol func" << " (" << ifp->functype() << ")" << endl; break; - - default: cerr << "type=" << ifp->functype() << endl; break; - } - - break; - } - - case Item::COND_ITEM: - { - Item_cond* icp = (Item_cond*)item; - cerr << "COND_ITEM: " << icp->func_name() << endl; - break; - } - - case Item::SUM_FUNC_ITEM: - { - Item_sum* isp = (Item_sum*)item; - char* item_name = const_cast(item->name.str); - - // MCOL-1052 This is an extended SELECT list item - if (!item_name && isp->get_arg_count() && isp->get_arg(0)->name.length) - { - item_name = const_cast(isp->get_arg(0)->name.str); - } - else if (!item_name && isp->get_arg_count() && isp->get_arg(0)->type() == Item::CONST_ITEM && - isp->get_arg(0)->cmp_type() == INT_RESULT) - { - item_name = (char*)"INT||*"; - } - else if (!item_name) - { - item_name = (char*)""; - } - - switch (isp->sum_func()) - { - case Item_sum::SUM_FUNC: cerr << "SUM_FUNC: " << item_name << endl; break; - - case Item_sum::SUM_DISTINCT_FUNC: cerr << "SUM_DISTINCT_FUNC: " << item_name << endl; break; - - case Item_sum::AVG_FUNC: cerr << "AVG_FUNC: " << item_name << endl; break; - - case Item_sum::COUNT_FUNC: cerr << "COUNT_FUNC: " << item_name << endl; break; - - case Item_sum::COUNT_DISTINCT_FUNC: cerr << "COUNT_DISTINCT_FUNC: " << item_name << endl; break; - - case Item_sum::MIN_FUNC: cerr << "MIN_FUNC: " << item_name << endl; break; - - case Item_sum::MAX_FUNC: cerr << "MAX_FUNC: " << item_name << endl; break; - - case Item_sum::UDF_SUM_FUNC: cerr << "UDAF_FUNC: " << item_name << endl; break; - - default: cerr << "SUM_FUNC_ITEM type=" << isp->sum_func() << endl; break; - } - - break; - } - - case Item::SUBSELECT_ITEM: - { - Item_subselect* sub = (Item_subselect*)item; - cerr << "SUBSELECT Item: "; - - switch (sub->substype()) - { - case Item_subselect::EXISTS_SUBS: cerr << "EXISTS"; break; - - case Item_subselect::IN_SUBS: cerr << "IN"; break; - - default: cerr << sub->substype(); break; - } - - cerr << endl; - JOIN* join = sub->get_select_lex()->join; - - if (join) - { - Item_cond* cond = static_cast(join->conds); - - if (cond) - cond->traverse_cond(debug_walk, arg, Item::POSTFIX); - } - - cerr << "Finish subselect item traversing" << endl; - break; - } - - case Item::REF_ITEM: - { - Item_ref* ref = (Item_ref*)item; - - if (ref->real_item()->type() == Item::CACHE_ITEM) - { - Item* field = ((Item_cache*)ref->real_item())->get_example(); - - if (field->type() == Item::FIELD_ITEM) - { - Item_field* ifp = (Item_field*)field; - // ifp->cached_table->select_lex->select_number gives the select level. - // could be used on alias. - // could also be used to tell correlated join (equal level). - cerr << "CACHED REF FIELD_ITEM: " << ifp->db_name.str << '.' << bestTableName(ifp) << '.' - << ifp->field_name.str << endl; - break; - } - else if (field->type() == Item::FUNC_ITEM) - { - Item_func* ifp = (Item_func*)field; - cerr << "CACHED REF FUNC_ITEM " << ifp->func_name() << endl; - } - else if (field->type() == Item::REF_ITEM) - { - Item_ref* ifr = (Item_ref*)field; - string refType; - string realType; - - switch (ifr->ref_type()) - { - case Item_ref::REF: refType = "REF"; break; - - case Item_ref::DIRECT_REF: refType = "DIRECT_REF"; break; - - case Item_ref::VIEW_REF: refType = "VIEW_REF"; break; - - case Item_ref::OUTER_REF: refType = "OUTER_REF"; break; - - case Item_ref::AGGREGATE_REF: refType = "AGGREGATE_REF"; break; - - default: refType = "UNKNOWN"; break; - } - - switch (ifr->real_type()) - { - case Item::FIELD_ITEM: - { - Item_field* ifp = (Item_field*)(*(ifr->ref)); - realType = "FIELD_ITEM "; - realType += ifp->db_name.str; - realType += '.'; - realType += bestTableName(ifp); - realType += '.'; - realType += ifp->field_name.str; - break; - } - - case Item::SUM_FUNC_ITEM: - { - Item_sum* isp = (Item_sum*)(*(ifr->ref)); - - if (isp->sum_func() == Item_sum::GROUP_CONCAT_FUNC) - realType = "GROUP_CONCAT_FUNC"; - else - realType = "SUM_FUNC_ITEM"; - - break; - } - - case Item::REF_ITEM: - // Need recursion here - realType = "REF_ITEM"; - break; - - case Item::FUNC_ITEM: - { - Item_func* ifp = (Item_func*)(*(ifr->ref)); - realType = "FUNC_ITEM "; - realType += ifp->func_name(); - break; - } - - default: - { - realType = "UNKNOWN"; - } - } - - cerr << "CACHED REF_ITEM: ref type " << refType.c_str() << " real type " << realType.c_str() - << endl; - break; - } - else - { - cerr << "REF_ITEM with CACHE_ITEM type unknown " << field->type() << endl; - } - } - else if (ref->real_item()->type() == Item::FIELD_ITEM) - { - Item_field* ifp = (Item_field*)ref->real_item(); - - // MCOL-1052 The field referenced presumable came from - // extended SELECT list. - if (!ifp->field_name.str) - { - cerr << "REF extra FIELD_ITEM: " << ifp->name.str << endl; - } - else - { - cerr << "REF FIELD_ITEM: " << ifp->db_name.str << '.' << bestTableName(ifp) << '.' - << ifp->field_name.str << endl; - } - - break; - } - else if (ref->real_item()->type() == Item::FUNC_ITEM) - { - Item_func* ifp = (Item_func*)ref->real_item(); - cerr << "REF FUNC_ITEM " << ifp->func_name() << endl; - } - else if (ref->real_item()->type() == Item::WINDOW_FUNC_ITEM) - { - Item_window_func* ifp = (Item_window_func*)ref->real_item(); - cerr << "REF WINDOW_FUNC_ITEM " << ifp->window_func()->func_name() << endl; - } - else - { - cerr << "UNKNOWN REF ITEM type " << ref->real_item()->type() << endl; - } - - break; - } - - case Item::ROW_ITEM: - { - Item_row* row = (Item_row*)item; - cerr << "ROW_ITEM: " << endl; - - for (uint32_t i = 0; i < row->cols(); i++) - debug_walk(row->element_index(i), 0); - - break; - } - - case Item::EXPR_CACHE_ITEM: - { - cerr << "Expr Cache Item" << endl; - ((Item_cache_wrapper*)item)->get_orig_item()->traverse_cond(debug_walk, arg, Item::POSTFIX); - break; - } - - case Item::CACHE_ITEM: - { - Item_cache* isp = (Item_cache*)item; - // MCOL-46 isp->val_str() can cause a call to execute a subquery. We're not set up - // to execute yet. -#if 0 - - switch (item->result_type()) - { - case STRING_RESULT: - cerr << "CACHE_STRING_ITEM" << endl; - break; - - case REAL_RESULT: - cerr << "CACHE_REAL_ITEM " << isp->val_real() << endl; - break; - - case INT_RESULT: - cerr << "CACHE_INT_ITEM " << isp->val_int() << endl; - break; - - case ROW_RESULT: - cerr << "CACHE_ROW_ITEM" << endl; - break; - - case DECIMAL_RESULT: - cerr << "CACHE_DECIMAL_ITEM " << isp->val_decimal() << endl; - break; - - default: - cerr << "CACHE_UNKNOWN_ITEM" << endl; - break; - } - -#endif - Item* field = isp->get_example(); - - if (field->type() == Item::FIELD_ITEM) - { - Item_field* ifp = (Item_field*)field; - // ifp->cached_table->select_lex->select_number gives the select level. - // could be used on alias. - // could also be used to tell correlated join (equal level). - cerr << "CACHED FIELD_ITEM: " << ifp->db_name.str << '.' << bestTableName(ifp) << '.' - << ifp->field_name.str << endl; - break; - } - else if (field->type() == Item::REF_ITEM) - { - Item_ref* ifr = (Item_ref*)field; - string refType; - string realType; - - switch (ifr->ref_type()) - { - case Item_ref::REF: refType = "REF"; break; - - case Item_ref::DIRECT_REF: refType = "DIRECT_REF"; break; - - case Item_ref::VIEW_REF: refType = "VIEW_REF"; break; - - case Item_ref::OUTER_REF: refType = "OUTER_REF"; break; - - case Item_ref::AGGREGATE_REF: refType = "AGGREGATE_REF"; break; - - default: refType = "UNKNOWN"; break; - } - - switch (ifr->real_type()) - { - case Item::FIELD_ITEM: - { - Item_field* ifp = (Item_field*)(*(ifr->ref)); - realType = "FIELD_ITEM "; - realType += ifp->db_name.str; - realType += '.'; - realType += bestTableName(ifp); - realType += '.'; - realType += ifp->field_name.str; - break; - } - - case Item::SUM_FUNC_ITEM: - { - Item_sum* isp = (Item_sum*)(*(ifr->ref)); - - if (isp->sum_func() == Item_sum::GROUP_CONCAT_FUNC) - realType = "GROUP_CONCAT_FUNC"; - else - realType = "SUM_FUNC_ITEM"; - - break; - } - - case Item::REF_ITEM: - // Need recursion here - realType = "REF_ITEM"; - break; - - case Item::FUNC_ITEM: - { - Item_func* ifp = (Item_func*)(*(ifr->ref)); - realType = "FUNC_ITEM "; - realType += ifp->func_name(); - break; - } - - default: - { - realType = "UNKNOWN"; - } - } - - cerr << "CACHE_ITEM ref type " << refType.c_str() << " real type " << realType.c_str() << endl; - break; - } - else if (field->type() == Item::FUNC_ITEM) - { - Item_func* ifp = (Item_func*)field; - cerr << "CACHE_ITEM FUNC_ITEM " << ifp->func_name() << endl; - break; - } - else - { - cerr << "CACHE_ITEM type unknown " << field->type() << endl; - } - - break; - } - - case Item::WINDOW_FUNC_ITEM: - { - Item_window_func* ifp = (Item_window_func*)item; - cerr << "Window Function Item " << ifp->window_func()->func_name() << endl; - break; - } - - case Item::NULL_ITEM: - { - cerr << "NULL item" << endl; - break; - } - - case Item::TYPE_HOLDER: - { - cerr << "TYPE_HOLDER item with cmp_type " << item->cmp_type() << endl; - break; - } - - default: - { - cerr << "UNKNOWN_ITEM type " << item->type() << endl; - break; - } - } -} -#endif - void buildNestedJoinLeafTables(List& join_list, std::set& leafTables) { @@ -3441,162 +2732,6 @@ ReturnedColumn* buildReturnedColumnNull(gp_walk_info& gwi) return rc; } -class ValStrStdString : public string -{ - bool mIsNull; - - public: - ValStrStdString(Item* item) - { - String val, *str = item->val_str(&val); - mIsNull = (str == nullptr); - DBUG_ASSERT(mIsNull == item->null_value); - if (!mIsNull) - assign(str->ptr(), str->length()); - } - bool isNull() const - { - return mIsNull; - } -}; - -/* - Create a ConstantColumn according to cmp_type(). - But do not set the time zone yet. - - Handles NOT NULL values. - - Three ways of value extraction are used depending on the data type: - 1. Using a native val_xxx(). - 2. Using val_str() with further convertion to the native representation. - 3. Using both val_str() and a native val_xxx(). - - We should eventually get rid of N2 and N3 and use N1 for all data types: - - N2 contains a redundant code for str->native conversion. - It should be replaced to an existing code (a Type_handler method call?). - - N3 performs double evalation of the value, which may cause - various negative effects (double side effects or double warnings). -*/ -static ConstantColumn* newConstantColumnNotNullUsingValNativeNoTz(Item* item, gp_walk_info& gwi) -{ - DBUG_ASSERT(item->const_item()); - - switch (item->cmp_type()) - { - case INT_RESULT: - { - if (item->unsigned_flag) - return new ConstantColumnUInt((uint64_t)item->val_uint(), (int8_t)item->decimal_scale(), - (uint8_t)item->decimal_precision()); - ValStrStdString str(item); - DBUG_ASSERT(!str.isNull()); - return new ConstantColumnSInt(colType_MysqlToIDB(item), str, (int64_t)item->val_int()); - } - case STRING_RESULT: - { - // Special handling for 0xHHHH literals - if (item->type_handler() == &type_handler_hex_hybrid) - return new ConstantColumn((int64_t)item->val_int(), ConstantColumn::NUM); - ValStrStdString str(item); - DBUG_ASSERT(!str.isNull()); - return new ConstantColumnString(str); - } - case REAL_RESULT: - { - ValStrStdString str(item); - DBUG_ASSERT(!str.isNull()); - return new ConstantColumnReal(colType_MysqlToIDB(item), str, item->val_real()); - } - case DECIMAL_RESULT: - { - ValStrStdString str(item); - DBUG_ASSERT(!str.isNull()); - return buildDecimalColumn(item, str, gwi); - } - case TIME_RESULT: - { - ValStrStdString str(item); - DBUG_ASSERT(!str.isNull()); - return new ConstantColumnTemporal(colType_MysqlToIDB(item), str); - } - default: - { - gwi.fatalParseError = true; - gwi.parseErrorText = "Unknown item type"; - break; - } - } - - return nullptr; -} - -/* - Create a ConstantColumn according to cmp_type(). - But do not set the time zone yet. - - Handles NULL and NOT NULL values. - - Uses a simplified logic regarding to data types: - always extracts the value through val_str(). - - Should probably be joined with the previous function, to have - a single function which can at the same time: - a. handle both NULL and NOT NULL values - b. extract values using a native val_xxx() method, - to avoid possible negative effects mentioned in the comments - to newConstantColumnNotNullUsingValNativeNoTz(). -*/ -static ConstantColumn* newConstantColumnMaybeNullFromValStrNoTz(const Item* item, - const ValStrStdString& valStr, - gp_walk_info& gwi) -{ - if (valStr.isNull()) - return new ConstantColumnNull(); - - switch (item->result_type()) - { - case STRING_RESULT: return new ConstantColumnString(valStr); - case DECIMAL_RESULT: return buildDecimalColumn(item, valStr, gwi); - case TIME_RESULT: - case INT_RESULT: - case REAL_RESULT: - case ROW_RESULT: return new ConstantColumnNum(colType_MysqlToIDB(item), valStr); - } - return nullptr; -} - -// Create a ConstantColumn from a previously evaluated val_str() result, -// Supports both NULL and NOT NULL values. -// Sets the time zone according to gwi. - -static ConstantColumn* buildConstantColumnMaybeNullFromValStr(const Item* item, const ValStrStdString& valStr, - gp_walk_info& gwi) -{ - ConstantColumn* rc = newConstantColumnMaybeNullFromValStrNoTz(item, valStr, gwi); - if (rc) - rc->timeZone(gwi.timeZone); - return rc; -} - -// Create a ConstantColumn by calling val_str(). -// Supports both NULL and NOT NULL values. -// Sets the time zone according to gwi. - -static ConstantColumn* buildConstantColumnMaybeNullUsingValStr(Item* item, gp_walk_info& gwi) -{ - return buildConstantColumnMaybeNullFromValStr(item, ValStrStdString(item), gwi); -} - -// Create a ConstantColumn for a NOT NULL expression. -// Sets the time zone according to gwi. -static ConstantColumn* buildConstantColumnNotNullUsingValNative(Item* item, gp_walk_info& gwi) -{ - ConstantColumn* rc = newConstantColumnNotNullUsingValNativeNoTz(item, gwi); - if (rc) - rc->timeZone(gwi.timeZone); - return rc; -} - ReturnedColumn* buildReturnedColumnBody(Item* item, gp_walk_info& gwi, bool& nonSupport, bool /*isRefItem*/) { ReturnedColumn* rc = NULL; @@ -5092,21 +4227,6 @@ class ConstArgParam } }; -static bool isSupportedAggregateWithOneConstArg(const Item_sum* item, Item** orig_args) -{ - if (item->argument_count() != 1 || !orig_args[0]->const_item()) - return false; - switch (orig_args[0]->cmp_type()) - { - case INT_RESULT: - case STRING_RESULT: - case REAL_RESULT: - case DECIMAL_RESULT: return true; - default: break; - } - return false; -} - static void processAggregateColumnConstArg(gp_walk_info& gwi, SRCP& parm, AggregateColumn* ac, Item* sfitemp, ConstArgParam& constParam) { @@ -5961,921 +5081,6 @@ void castTypeArgs(gp_walk_info* gwip, Item_func* ifp, FunctionParm& functionParm functionParms.push_back(sptp); } -bool isSecondArgumentConstItem(Item_func* ifp) -{ - return (ifp->argument_count() == 2 && ifp->arguments()[1]->type() == Item::CONST_ITEM); -} - -// SELECT ... WHERE NOT IN (SELECT ); -bool isNotFuncAndConstScalarSubSelect(Item_func* ifp, const std::string& funcName) -{ - return (ifp->with_subquery() && funcName == "not" && ifp->argument_count() == 1 && - ifp->arguments()[0]->type() == Item::FUNC_ITEM && - std::string(((Item_func*)ifp->arguments()[0])->func_name()) == "=" && - isSecondArgumentConstItem((Item_func*)ifp->arguments()[0])); -} - -void gp_walk(const Item* item, void* arg) -{ - gp_walk_info* gwip = static_cast(arg); - idbassert(gwip); - - // Bailout... - if (gwip->fatalParseError) - return; - - RecursionCounter r(gwip); // Increments and auto-decrements upon exit. - - Item::Type itype = item->type(); - - // Allow to process XOR(which is Item_func) like other logical operators (which are Item_cond) - if (itype == Item::FUNC_ITEM && ((Item_func*)item)->functype() == Item_func::XOR_FUNC) - itype = Item::COND_ITEM; - - switch (itype) - { - case Item::CACHE_ITEM: - { - // The item or condition is cached as per MariaDB server view but - // for InfiniDB it need to be parsed and executed. - // MCOL-1188 and MCOL-1029 - Item* orig_item = ((Item_cache*)item)->get_example(); - orig_item->traverse_cond(gp_walk, gwip, Item::POSTFIX); - break; - } - case Item::FIELD_ITEM: - { - Item_field* ifp = (Item_field*)item; - - if (ifp) - { - // XXX: this looks awfuly wrong. - SimpleColumn* scp = buildSimpleColumn(ifp, *gwip); - - if (!scp) - break; - - string aliasTableName(scp->tableAlias()); - scp->tableAlias(aliasTableName); - gwip->rcWorkStack.push(scp->clone()); - boost::shared_ptr scsp(scp); - gwip->scsp = scsp; - - gwip->funcName.clear(); - gwip->columnMap.insert( - CalpontSelectExecutionPlan::ColumnMap::value_type(string(ifp->field_name.str), scsp)); - - //@bug4636 take where clause column as dummy projection column, but only on local column. - // varbinary aggregate is not supported yet, so rule it out - if (!((scp->joinInfo() & JOIN_CORRELATED) || - scp->colType().colDataType == CalpontSystemCatalog::VARBINARY)) - { - TABLE_LIST* tmp = (ifp->cached_table ? ifp->cached_table : 0); - gwip->tableMap[make_aliastable(scp->schemaName(), scp->tableName(), scp->tableAlias(), - scp->isColumnStore())] = make_pair(1, tmp); - } - } - - break; - } - - case Item::CONST_ITEM: - { - switch (item->cmp_type()) - { - case INT_RESULT: - { - Item* non_const_item = const_cast(item); - gwip->rcWorkStack.push(buildReturnedColumn(non_const_item, *gwip, gwip->fatalParseError)); - break; - } - - case STRING_RESULT: - { - // Special handling for 0xHHHH literals - if (item->type_handler() == &type_handler_hex_hybrid) - { - Item_hex_hybrid* hip = static_cast(const_cast(item)); - gwip->rcWorkStack.push(new ConstantColumn((int64_t)hip->val_int(), ConstantColumn::NUM)); - ConstantColumn* cc = dynamic_cast(gwip->rcWorkStack.top()); - cc->timeZone(gwip->timeZone); - break; - } - - if (item->result_type() == STRING_RESULT) - { - // dangerous cast here - Item* isp = const_cast(item); - String val, *str = isp->val_str(&val); - if (str) - { - string cval; - - if (str->ptr()) - { - cval.assign(str->ptr(), str->length()); - } - - gwip->rcWorkStack.push(new ConstantColumn(cval)); - (dynamic_cast(gwip->rcWorkStack.top()))->timeZone(gwip->timeZone); - break; - } - else - { - gwip->rcWorkStack.push(new ConstantColumn("", ConstantColumn::NULLDATA)); - (dynamic_cast(gwip->rcWorkStack.top()))->timeZone(gwip->timeZone); - break; - } - - gwip->rcWorkStack.push(buildReturnedColumn(isp, *gwip, gwip->fatalParseError)); - } - break; - } - - case REAL_RESULT: - case DECIMAL_RESULT: - case TIME_RESULT: - { - Item* nonConstItem = const_cast(item); - gwip->rcWorkStack.push(buildReturnedColumn(nonConstItem, *gwip, gwip->fatalParseError)); - break; - } - - default: - { - if (gwip->condPush) - { - // push noop for unhandled item - SimpleColumn* rc = new SimpleColumn("noop"); - rc->timeZone(gwip->timeZone); - gwip->rcWorkStack.push(rc); - break; - } - - ostringstream oss; - oss << "Unhandled Item type(): " << item->type(); - gwip->parseErrorText = oss.str(); - gwip->fatalParseError = true; - break; - } - } - break; - } - case Item::NULL_ITEM: - { - if (gwip->condPush) - { - // push noop for unhandled item - SimpleColumn* rc = new SimpleColumn("noop"); - rc->timeZone(gwip->timeZone); - gwip->rcWorkStack.push(rc); - break; - } - - gwip->rcWorkStack.push(new ConstantColumn("", ConstantColumn::NULLDATA)); - (dynamic_cast(gwip->rcWorkStack.top()))->timeZone(gwip->timeZone); - break; - } - - case Item::FUNC_ITEM: - { - Item* ncitem = const_cast(item); - Item_func* ifp = static_cast(ncitem); - - string funcName = ifp->func_name(); - - if (!gwip->condPush) - { - if (!ifp->fixed()) - { - ifp->fix_fields(gwip->thd, &ncitem); - } - - // Special handling for queries of the form: - // SELECT ... WHERE col1 NOT IN (SELECT ); - if (isNotFuncAndConstScalarSubSelect(ifp, funcName)) - { - idbassert(!gwip->ptWorkStack.empty()); - ParseTree* pt = gwip->ptWorkStack.top(); - SimpleFilter* sf = dynamic_cast(pt->data()); - - if (sf) - { - boost::shared_ptr sop(new PredicateOperator("<>")); - sf->op(sop); - return; - } - } - - // Do not call buildSubselectFunc() if the subquery is a const scalar - // subselect of the form: - // (SELECT ) - // As an example: SELECT col1 FROM t1 WHERE col2 = (SELECT 2); - if ((ifp->with_subquery() && !isSecondArgumentConstItem(ifp)) || funcName == "") - { - buildSubselectFunc(ifp, gwip); - return; - } - - if (ifp->argument_count() > 0 && ifp->arguments()) - { - for (uint32_t i = 0; i < ifp->argument_count(); i++) - { - if (ifp->arguments()[i]->type() == Item::SUBSELECT_ITEM) - { - // This is probably NOT IN subquery with derived table in it. - // for some reason, MySQL has not fully optimized the plan at this point. - // noop here, and eventually MySQL will continue its optimization and get - // to rnd_init again. - if (ifp->functype() == Item_func::NOT_FUNC) - return; - - buildSubselectFunc(ifp, gwip); - return; - } - } - } - - if (ifp->functype() == Item_func::TRIG_COND_FUNC && gwip->subQuery) - { - gwip->subQuery->handleFunc(gwip, ifp); - break; - } - - // having clause null function added by MySQL - if (ifp->functype() == Item_func::ISNOTNULLTEST_FUNC) - { - // @bug 4215. remove the argument in rcWorkStack. - if (!gwip->rcWorkStack.empty()) - { - delete gwip->rcWorkStack.top(); - gwip->rcWorkStack.pop(); - } - - break; - } - } - - // try to evaluate const F&E - vector tmpVec; - uint16_t parseInfo = 0; - parse_item(ifp, tmpVec, gwip->fatalParseError, parseInfo, gwip); - - // table mode takes only one table filter - if (gwip->condPush) - { - set tableSet; - - for (uint32_t i = 0; i < tmpVec.size(); i++) - { - if (tmpVec[i]->table_name.str) - tableSet.insert(tmpVec[i]->table_name.str); - } - - if (tableSet.size() > 1) - break; - } - - if (!gwip->fatalParseError && !(parseInfo & AGG_BIT) && !(parseInfo & SUB_BIT) && !nonConstFunc(ifp) && - !(parseInfo & AF_BIT) && tmpVec.size() == 0 && ifp->functype() != Item_func::MULT_EQUAL_FUNC) - { - ValStrStdString valStr(ifp); - - ConstantColumn* cc = buildConstantColumnMaybeNullFromValStr(ifp, valStr, *gwip); - - for (uint32_t i = 0; i < ifp->argument_count() && !gwip->rcWorkStack.empty(); i++) - { - delete gwip->rcWorkStack.top(); - gwip->rcWorkStack.pop(); - } - - // bug 3137. If filter constant like 1=0, put it to ptWorkStack - // MariaDB bug 750. Breaks if compare is an argument to a function. - // if ((int32_t)gwip->rcWorkStack.size() <= - //(gwip->rcBookMarkStack.empty() - //? - // 0 - //: gwip->rcBookMarkStack.top()) - // && isPredicateFunction(ifp, gwip)) - if (isPredicateFunction(ifp, gwip)) - gwip->ptWorkStack.push(new ParseTree(cc)); - else - gwip->rcWorkStack.push(cc); - - if (!valStr.isNull()) - IDEBUG(cerr << "Const F&E " << item->full_name() << " evaluate: " << valStr << endl); - - break; - } - - ReturnedColumn* rc = NULL; - - // @bug4488. Process function for table mode also, not just vtable mode. - rc = buildFunctionColumn(ifp, *gwip, gwip->fatalParseError); - - if (gwip->fatalParseError) - { - if (gwip->clauseType == SELECT) - return; - - // @bug 2585 - if (gwip->parseErrorText.empty()) - { - Message::Args args; - args.add(funcName); - gwip->parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_NON_SUPPORTED_FUNCTION, args); - } - - return; - } - - // predicate operators fall in the old path - if (rc) - { - // @bug 2383. For some reason func_name() for "in" gives " IN " always - if (funcName == "between" || funcName == "in" || funcName == " IN ") - gwip->ptWorkStack.push(new ParseTree(rc)); - else - gwip->rcWorkStack.push(rc); - } - else - { - // push to pt or rc stack is handled inside the function - buildPredicateItem(ifp, gwip); - } - - break; - } - - case Item::SUM_FUNC_ITEM: - { - Item_sum* isp = (Item_sum*)item; - ReturnedColumn* rc = buildAggregateColumn(isp, *gwip); - - if (rc) - gwip->rcWorkStack.push(rc); - - break; - } - - case Item::COND_ITEM: - { - // All logical functions are handled here, most of them are Item_cond, - // but XOR (it is Item_func_boolean2) - Item_func* func = (Item_func*)item; - - enum Item_func::Functype ftype = func->functype(); - bool isOr = (ftype == Item_func::COND_OR_FUNC); - bool isXor = (ftype == Item_func::XOR_FUNC); - - List* argumentList; - List xorArgumentList; - - if (isXor) - { - for (unsigned i = 0; i < func->argument_count(); i++) - { - xorArgumentList.push_back(func->arguments()[i]); - } - - argumentList = &xorArgumentList; - } - else - { - argumentList = ((Item_cond*)item)->argument_list(); - } - - // @bug2932. if ptWorkStack contains less items than the condition's arguments, - // the missing one should be in the rcWorkStack, unless the it's subselect. - // @todo need to figure out a way to combine these two stacks while walking. - // if (gwip->ptWorkStack.size() < icp->argument_list()->elements) - { - List_iterator_fast li(*argumentList); - - while (Item* it = li++) - { - //@bug3495, @bug5865 error out non-supported OR with correlated subquery - if (isOr) - { - vector fieldVec; - uint16_t parseInfo = 0; - parse_item(it, fieldVec, gwip->fatalParseError, parseInfo, gwip); - - if (parseInfo & CORRELATED) - { - gwip->fatalParseError = true; - gwip->parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_CORRELATED_SUB_OR); - return; - } - } - - if ((it->type() == Item::FIELD_ITEM || - (it->type() == Item::CONST_ITEM && - (it->cmp_type() == INT_RESULT || it->cmp_type() == DECIMAL_RESULT || - it->cmp_type() == STRING_RESULT || it->cmp_type() == REAL_RESULT)) || - it->type() == Item::NULL_ITEM || - (it->type() == Item::FUNC_ITEM && !isPredicateFunction(it, gwip))) && - !gwip->rcWorkStack.empty()) - { - gwip->ptWorkStack.push(new ParseTree(gwip->rcWorkStack.top())); - gwip->rcWorkStack.pop(); - } - } - } - - // @bug1603. MySQL's filter tree is a multi-tree grouped by operator. So more than - // two filters saved on the stack so far might belong to this operator. - uint32_t leftInStack = gwip->ptWorkStack.size() - argumentList->elements + 1; - - while (true) - { - if (gwip->ptWorkStack.size() < 2) - break; - - ParseTree* lhs = gwip->ptWorkStack.top(); - gwip->ptWorkStack.pop(); - SimpleFilter* lsf = dynamic_cast(lhs->data()); - - if (lsf && lsf->op()->data() == "noop") - { - if (isOr) - { - gwip->parseErrorText = "Unhandled item in WHERE or HAVING clause"; - gwip->fatalParseError = true; - break; - } - else - continue; - } - - ParseTree* rhs = gwip->ptWorkStack.top(); - gwip->ptWorkStack.pop(); - SimpleFilter* rsf = dynamic_cast(rhs->data()); - - if (rsf && rsf->op()->data() == "noop") - { - if (isOr) - { - gwip->parseErrorText = "Unhandled item in WHERE or HAVING clause"; - gwip->fatalParseError = true; - break; - } - else - { - delete rhs; - gwip->ptWorkStack.push(lhs); - continue; - } - } - - Operator* op = new LogicOperator(func->func_name()); - ParseTree* ptp = new ParseTree(op); - ptp->left(lhs); - ptp->right(rhs); - gwip->ptWorkStack.push(ptp); - - if (gwip->ptWorkStack.size() == leftInStack) - break; - } - - // special handling for subquery with aggregate. MySQL adds isnull function to the selected - // column. InfiniDB will remove it and set nullmatch flag if it's NOT_IN sub. - // @todo need more checking here to make sure it's not a user input OR operator - if (isOr && gwip->subQuery) - gwip->subQuery->handleFunc(gwip, func); - - break; - } - - case Item::REF_ITEM: - { - Item* col = *(((Item_ref*)item)->ref); - ReturnedColumn* rc = NULL; - // ref item is not pre-walked. force clause type to SELECT - ClauseType clauseType = gwip->clauseType; - gwip->clauseType = SELECT; - - if (col->type() != Item::COND_ITEM) - { - rc = buildReturnedColumn(col, *gwip, gwip->fatalParseError, true); - - if (col->type() == Item::FIELD_ITEM) - gwip->fatalParseError = false; - } - - SimpleColumn* sc = clauseType == HAVING ? nullptr : dynamic_cast(rc); - - if (sc) - { - boost::shared_ptr scsp(sc->clone()); - gwip->scsp = scsp; - - if (col->type() == Item::FIELD_ITEM) - { - const Item_ident* ident_field = dynamic_cast(item); - if (ident_field) - { - const auto& field_name = string(ident_field->field_name.str); - auto colMap = CalpontSelectExecutionPlan::ColumnMap::value_type(field_name, scsp); - gwip->columnMap.insert(colMap); - } - } - } - - bool cando = true; - gwip->clauseType = clauseType; - - if (rc) - { - if (((Item_ref*)item)->depended_from) - { - rc->joinInfo(rc->joinInfo() | JOIN_CORRELATED); - - if (gwip->subQuery) - gwip->subQuery->correlated(true); - - SimpleColumn* scp = dynamic_cast(rc); - - if (scp) - gwip->correlatedTbNameVec.push_back( - make_aliastable(scp->schemaName(), scp->tableName(), scp->tableAlias())); - - if (gwip->subSelectType == CalpontSelectExecutionPlan::SINGLEROW_SUBS) - rc->joinInfo(rc->joinInfo() | JOIN_SCALAR | JOIN_SEMI); - - if (gwip->subSelectType == CalpontSelectExecutionPlan::SELECT_SUBS) - rc->joinInfo(rc->joinInfo() | JOIN_SCALAR | JOIN_OUTER_SELECT); - } - - gwip->rcWorkStack.push(rc); - } - else if (col->type() == Item::FUNC_ITEM) - { - // sometimes mysql treat having filter items inconsistently. In such cases, - // which are always predicate operator, the function (gp_key>3) comes in as - // one item. - Item_func* ifp = (Item_func*)col; - - for (uint32_t i = 0; i < ifp->argument_count(); i++) - { - ReturnedColumn* operand = NULL; - - if (ifp->arguments()[i]->type() == Item::REF_ITEM) - { - Item* op = *(((Item_ref*)ifp->arguments()[i])->ref); - operand = buildReturnedColumn(op, *gwip, gwip->fatalParseError); - } - else - operand = buildReturnedColumn(ifp->arguments()[i], *gwip, gwip->fatalParseError); - - if (operand) - { - gwip->rcWorkStack.push(operand); - if (i == 0 && gwip->scsp == NULL) // first item is the WHEN LHS - { - SimpleColumn* sc = dynamic_cast(operand); - if (sc) - { - gwip->scsp.reset(sc->clone()); // We need to clone else sc gets double deleted. This code is - // rarely executed so the cost is acceptable. - } - } - } - else - { - cando = false; - break; - } - } - - if (cando) - buildPredicateItem(ifp, gwip); - } - else if (col->type() == Item::COND_ITEM) - { - gwip->ptWorkStack.push(buildParseTree(col, *gwip, gwip->fatalParseError)); - } - else if (col->type() == Item::FIELD_ITEM && gwip->clauseType == HAVING) - { - // ReturnedColumn* rc = buildAggFrmTempField(const_cast(item), *gwip); - ReturnedColumn* rc = buildReturnedColumn(const_cast(item), *gwip, gwip->fatalParseError); - if (rc) - gwip->rcWorkStack.push(rc); - - break; - } - else - { - cando = false; - } - - SimpleColumn* thisSC = dynamic_cast(rc); - if (thisSC) - { - gwip->scsp.reset(thisSC->clone()); - } - if (!rc && !cando) - { - ostringstream oss; - oss << "Unhandled Item type(): " << item->type(); - gwip->parseErrorText = oss.str(); - gwip->fatalParseError = true; - } - - break; - } - - case Item::SUBSELECT_ITEM: - { - if (gwip->condPush) // table mode - break; - - Item_subselect* sub = (Item_subselect*)item; - - if (sub->substype() == Item_subselect::EXISTS_SUBS) - { - SubQuery* orig = gwip->subQuery; - ExistsSub* existsSub = new ExistsSub(*gwip, sub); - gwip->hasSubSelect = true; - gwip->subQuery = existsSub; - gwip->ptWorkStack.push(existsSub->transform()); - // recover original - gwip->subQuery = orig; - gwip->lastSub = existsSub; - } - else if (sub->substype() == Item_subselect::IN_SUBS) - { - if (!((Item_in_subselect*)sub)->optimizer && gwip->thd->derived_tables_processing) - { - ostringstream oss; - oss << "Invalid In_optimizer: " << item->type(); - gwip->parseErrorText = oss.str(); - gwip->fatalParseError = true; - break; - } - } - - // store a dummy subselect object. the transform is handled in item_func. - SubSelect* subselect = new SubSelect(); - gwip->rcWorkStack.push(subselect); - break; - } - - case Item::ROW_ITEM: - { - Item_row* row = (Item_row*)item; - RowColumn* rowCol = new RowColumn(); - vector cols; - // temp change clause type because the elements of row column are not walked yet - gwip->clauseType = SELECT; - for (uint32_t i = 0; i < row->cols(); i++) - cols.push_back(SRCP(buildReturnedColumn(row->element_index(i), *gwip, gwip->fatalParseError))); - - gwip->clauseType = WHERE; - rowCol->columnVec(cols); - gwip->rcWorkStack.push(rowCol); - break; - } - - case Item::EXPR_CACHE_ITEM: - { - ((Item_cache_wrapper*)item)->get_orig_item()->traverse_cond(gp_walk, arg, Item::POSTFIX); - break; - } - - case Item::WINDOW_FUNC_ITEM: - { - gwip->hasWindowFunc = true; - Item_window_func* ifa = (Item_window_func*)item; - ReturnedColumn* af = buildWindowFunctionColumn(ifa, *gwip, gwip->fatalParseError); - - if (af) - gwip->rcWorkStack.push(af); - - break; - } - - case Item::COPY_STR_ITEM: printf("********** received COPY_STR_ITEM *********\n"); break; - - case Item::FIELD_AVG_ITEM: printf("********** received FIELD_AVG_ITEM *********\n"); break; - - case Item::DEFAULT_VALUE_ITEM: printf("********** received DEFAULT_VALUE_ITEM *********\n"); break; - - case Item::PROC_ITEM: printf("********** received PROC_ITEM *********\n"); break; - - case Item::FIELD_STD_ITEM: printf("********** received FIELD_STD_ITEM *********\n"); break; - - case Item::FIELD_VARIANCE_ITEM: printf("********** received FIELD_VARIANCE_ITEM *********\n"); break; - - case Item::INSERT_VALUE_ITEM: printf("********** received INSERT_VALUE_ITEM *********\n"); break; - - case Item::PARAM_ITEM: printf("********** received PARAM_ITEM *********\n"); break; - - case Item::TRIGGER_FIELD_ITEM: printf("********** received TRIGGER_FIELD_ITEM *********\n"); break; - - case Item::TYPE_HOLDER: std::cerr << "********** received TYPE_HOLDER *********" << std::endl; break; - default: - { - if (gwip->condPush) - { - // push noop for unhandled item - SimpleColumn* rc = new SimpleColumn("noop"); - rc->timeZone(gwip->timeZone); - gwip->rcWorkStack.push(rc); - break; - } - - ostringstream oss; - oss << "Unhandled Item type (2): " << item->type(); - gwip->parseErrorText = oss.str(); - gwip->fatalParseError = true; - break; - } - } - - return; -} - -/** @info this function recursivly walks an item's arguments and push all - * the involved item_fields to the passed in vector. It's used in parsing - * functions or arithmetic expressions for vtable post process. - */ -void parse_item(Item* item, vector& field_vec, bool& hasNonSupportItem, uint16_t& parseInfo, - gp_walk_info* gwi) -{ - Item::Type itype = item->type(); - - switch (itype) - { - case Item::FIELD_ITEM: - { - Item_field* ifp = static_cast(item); - field_vec.push_back(ifp); - return; - } - - case Item::SUM_FUNC_ITEM: - { - // hasAggColumn = true; - parseInfo |= AGG_BIT; - Item_sum* isp = static_cast(item); - Item** sfitempp = isp->arguments(); - - for (uint32_t i = 0; i < isp->argument_count(); i++) - parse_item(sfitempp[i], field_vec, hasNonSupportItem, parseInfo, gwi); - - break; - } - - case Item::FUNC_ITEM: - { - Item_func* isp = static_cast(item); - - if (string(isp->func_name()) == "") - { - parseInfo |= SUB_BIT; - parseInfo |= CORRELATED; - break; - } - - for (uint32_t i = 0; i < isp->argument_count(); i++) - parse_item(isp->arguments()[i], field_vec, hasNonSupportItem, parseInfo, gwi); - - break; - } - - case Item::COND_ITEM: - { - Item_cond* icp = static_cast(item); - List_iterator_fast it(*(icp->argument_list())); - Item* cond_item; - - while ((cond_item = it++)) - parse_item(cond_item, field_vec, hasNonSupportItem, parseInfo, gwi); - - break; - } - - case Item::REF_ITEM: - { - Item_ref* ref = (Item_ref*)item; - if (ref->ref_type() == Item_ref::DIRECT_REF) - { - parse_item(ref->real_item(), field_vec, hasNonSupportItem, parseInfo, gwi); - break; - } - while (true) - { - ref = (Item_ref*)item; - if ((*(ref->ref))->type() == Item::SUM_FUNC_ITEM) - { - parseInfo |= AGG_BIT; - Item_sum* isp = static_cast(*(ref->ref)); - Item** sfitempp = isp->arguments(); - - // special handling for count(*). This should not be treated as constant. - if (isSupportedAggregateWithOneConstArg(isp, sfitempp)) - { - field_vec.push_back(nullptr); // dummy - } - - for (uint32_t i = 0; i < isp->argument_count(); i++) - parse_item(sfitempp[i], field_vec, hasNonSupportItem, parseInfo, gwi); - - break; - } - else if ((*(ref->ref))->type() == Item::FIELD_ITEM) - { - // MCOL-1510. This could be a non-supported function - // argument in form of a temp_table_field, so check - // and set hasNonSupportItem if it is so. - // ReturnedColumn* rc = NULL; - // if (gwi) - // rc = buildAggFrmTempField(ref, *gwi); - - // if (!rc) - //{ - Item_field* ifp = static_cast(*(ref->ref)); - field_vec.push_back(ifp); - //} - break; - } - else if ((*(ref->ref))->type() == Item::FUNC_ITEM) - { - Item_func* isp = static_cast(*(ref->ref)); - Item** sfitempp = isp->arguments(); - - for (uint32_t i = 0; i < isp->argument_count(); i++) - parse_item(sfitempp[i], field_vec, hasNonSupportItem, parseInfo, gwi); - - break; - } - else if ((*(ref->ref))->type() == Item::CACHE_ITEM) - { - Item_cache* isp = static_cast(*(ref->ref)); - parse_item(isp->get_example(), field_vec, hasNonSupportItem, parseInfo, gwi); - break; - } - else if ((*(ref->ref))->type() == Item::REF_ITEM) - { - item = (*(ref->ref)); - continue; - } - else if ((*(ref->ref))->type() == Item::WINDOW_FUNC_ITEM) - { - parseInfo |= AF_BIT; - break; - } - else - { - cerr << "UNKNOWN REF Item" << endl; - break; - } - } - - break; - } - - case Item::SUBSELECT_ITEM: - { - parseInfo |= SUB_BIT; - Item_subselect* sub = (Item_subselect*)item; - - if (sub->is_correlated) - parseInfo |= CORRELATED; - - break; - } - - case Item::ROW_ITEM: - { - Item_row* row = (Item_row*)item; - - for (uint32_t i = 0; i < row->cols(); i++) - parse_item(row->element_index(i), field_vec, hasNonSupportItem, parseInfo, gwi); - - break; - } - - case Item::EXPR_CACHE_ITEM: - { - // item is a Item_cache_wrapper. Shouldn't get here. - // DRRTUY TODO Why - IDEBUG(std::cerr << "EXPR_CACHE_ITEM in parse_item\n" << std::endl); - gwi->fatalParseError = true; - // DRRTUY The questionable error text. I've seen - // ERR_CORRELATED_SUB_OR - string parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_NON_SUPPORT_SUB_QUERY_TYPE); - setError(gwi->thd, ER_CHECK_NOT_IMPLEMENTED, parseErrorText); - break; - } - - case Item::WINDOW_FUNC_ITEM: parseInfo |= AF_BIT; break; - - default: break; - } -} - /*@brief set some runtime params to run the query */ /*********************************************************** * DESCRIPTION: diff --git a/dbcon/mysql/ha_mcs_execplan_helpers.cpp b/dbcon/mysql/ha_mcs_execplan_helpers.cpp new file mode 100644 index 000000000..66ffa35be --- /dev/null +++ b/dbcon/mysql/ha_mcs_execplan_helpers.cpp @@ -0,0 +1,189 @@ +/* Copyright (C) 2025 MariaDB Corporation + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; version 2 of + the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#include "ha_mcs_execplan_helpers.h" +#include "constantcolumn.h" + +namespace cal_impl_if +{ +bool nonConstFunc(Item_func* ifp) +{ + if (strcasecmp(ifp->func_name(), "rand") == 0 || strcasecmp(ifp->func_name(), "sysdate") == 0 || + strcasecmp(ifp->func_name(), "idblocalpm") == 0) + return true; + + for (uint32_t i = 0; i < ifp->argument_count(); i++) + { + if (ifp->arguments()[i]->type() == Item::FUNC_ITEM && nonConstFunc(((Item_func*)ifp->arguments()[i]))) + return true; + } + + return false; +} + +/* + Create a ConstantColumn according to cmp_type(). + But do not set the time zone yet. + + Handles NULL and NOT NULL values. + + Uses a simplified logic regarding to data types: + always extracts the value through val_str(). + + Should probably be joined with the previous function, to have + a single function which can at the same time: + a. handle both NULL and NOT NULL values + b. extract values using a native val_xxx() method, + to avoid possible negative effects mentioned in the comments + to newConstantColumnNotNullUsingValNativeNoTz(). +*/ +execplan::ConstantColumn* newConstantColumnMaybeNullFromValStrNoTz(const Item* item, + const ValStrStdString& valStr, + gp_walk_info& gwi) +{ + if (valStr.isNull()) + return new execplan::ConstantColumnNull(); + + switch (item->result_type()) + { + case STRING_RESULT: return new execplan::ConstantColumnString(valStr); + case DECIMAL_RESULT: return buildDecimalColumn(item, valStr, gwi); + case TIME_RESULT: + case INT_RESULT: + case REAL_RESULT: + case ROW_RESULT: return new execplan::ConstantColumnNum(colType_MysqlToIDB(item), valStr); + } + return nullptr; +} + +// Create a ConstantColumn from a previously evaluated val_str() result, +// Supports both NULL and NOT NULL values. +// Sets the time zone according to gwi. +execplan::ConstantColumn* buildConstantColumnMaybeNullFromValStr(const Item* item, const ValStrStdString& valStr, + gp_walk_info& gwi) +{ + execplan::ConstantColumn* rc = newConstantColumnMaybeNullFromValStrNoTz(item, valStr, gwi); + if (rc) + rc->timeZone(gwi.timeZone); + return rc; +} + +// Create a ConstantColumn by calling val_str(). +// Supports both NULL and NOT NULL values. +// Sets the time zone according to gwi. + +execplan::ConstantColumn* buildConstantColumnMaybeNullUsingValStr(Item* item, gp_walk_info& gwi) +{ + return buildConstantColumnMaybeNullFromValStr(item, ValStrStdString(item), gwi); +} + +// Create a ConstantColumn for a NOT NULL expression. +// Sets the time zone according to gwi. +execplan::ConstantColumn* buildConstantColumnNotNullUsingValNative(Item* item, gp_walk_info& gwi) +{ + execplan::ConstantColumn* rc = newConstantColumnNotNullUsingValNativeNoTz(item, gwi); + if (rc) + rc->timeZone(gwi.timeZone); + return rc; +} + +/* + Create a ConstantColumn according to cmp_type(). + But do not set the time zone yet. + + Handles NOT NULL values. + + Three ways of value extraction are used depending on the data type: + 1. Using a native val_xxx(). + 2. Using val_str() with further convertion to the native representation. + 3. Using both val_str() and a native val_xxx(). + + We should eventually get rid of N2 and N3 and use N1 for all data types: + - N2 contains a redundant code for str->native conversion. + It should be replaced to an existing code (a Type_handler method call?). + - N3 performs double evalation of the value, which may cause + various negative effects (double side effects or double warnings). +*/ +execplan::ConstantColumn* newConstantColumnNotNullUsingValNativeNoTz(Item* item, gp_walk_info& gwi) +{ + DBUG_ASSERT(item->const_item()); + + switch (item->cmp_type()) + { + case INT_RESULT: + { + if (item->unsigned_flag) + return new execplan::ConstantColumnUInt((uint64_t)item->val_uint(), (int8_t)item->decimal_scale(), + (uint8_t)item->decimal_precision()); + ValStrStdString str(item); + DBUG_ASSERT(!str.isNull()); + return new execplan::ConstantColumnSInt(colType_MysqlToIDB(item), str, (int64_t)item->val_int()); + } + case STRING_RESULT: + { + // Special handling for 0xHHHH literals + if (item->type_handler() == &type_handler_hex_hybrid) + return new execplan::ConstantColumn((int64_t)item->val_int(), execplan::ConstantColumn::NUM); + ValStrStdString str(item); + DBUG_ASSERT(!str.isNull()); + return new execplan::ConstantColumnString(str); + } + case REAL_RESULT: + { + ValStrStdString str(item); + DBUG_ASSERT(!str.isNull()); + return new execplan::ConstantColumnReal(colType_MysqlToIDB(item), str, item->val_real()); + } + case DECIMAL_RESULT: + { + ValStrStdString str(item); + DBUG_ASSERT(!str.isNull()); + return buildDecimalColumn(item, str, gwi); + } + case TIME_RESULT: + { + ValStrStdString str(item); + DBUG_ASSERT(!str.isNull()); + return new execplan::ConstantColumnTemporal(colType_MysqlToIDB(item), str); + } + default: + { + gwi.fatalParseError = true; + gwi.parseErrorText = "Unknown item type"; + break; + } + } + + return nullptr; +} + +bool isSupportedAggregateWithOneConstArg(const Item_sum* item, Item** orig_args) +{ + if (item->argument_count() != 1 || !orig_args[0]->const_item()) + return false; + switch (orig_args[0]->cmp_type()) + { + case INT_RESULT: + case STRING_RESULT: + case REAL_RESULT: + case DECIMAL_RESULT: return true; + default: break; + } + return false; +} + +} // namespace cal_impl_if \ No newline at end of file diff --git a/dbcon/mysql/ha_mcs_execplan_helpers.h b/dbcon/mysql/ha_mcs_execplan_helpers.h new file mode 100644 index 000000000..178e3a45c --- /dev/null +++ b/dbcon/mysql/ha_mcs_execplan_helpers.h @@ -0,0 +1,58 @@ +/* Copyright (C) 2025 MariaDB Corporation + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; version 2 of + the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#pragma once + + +#define PREFER_MY_CONFIG_H +#include +#include "idb_mysql.h" + +#include "constantcolumn.h" +#include "ha_mcs_impl_if.h" + +namespace cal_impl_if +{ + +class ValStrStdString : public std::string +{ + bool mIsNull; + + public: + ValStrStdString(Item* item) + { + String val, *str = item->val_str(&val); + mIsNull = (str == nullptr); + DBUG_ASSERT(mIsNull == item->null_value); + if (!mIsNull) + assign(str->ptr(), str->length()); + } + bool isNull() const + { + return mIsNull; + } +}; + +bool nonConstFunc(Item_func* ifp); +// Note: This function might be unused currently but is kept for future compatibility. +execplan::ConstantColumn* buildConstantColumnMaybeNullFromValStr(const Item* item, const ValStrStdString& valStr, + cal_impl_if::gp_walk_info& gwi); +execplan::ConstantColumn* newConstantColumnNotNullUsingValNativeNoTz(Item* item, gp_walk_info& gwi); +bool isSupportedAggregateWithOneConstArg(const Item_sum* item, Item** orig_args); +execplan::ConstantColumn* buildConstantColumnNotNullUsingValNative(Item* item, gp_walk_info& gwi); +execplan::ConstantColumn* buildConstantColumnMaybeNullUsingValStr(Item* item, gp_walk_info& gwi); +} diff --git a/dbcon/mysql/ha_mcs_execplan_parseinfo_bits.h b/dbcon/mysql/ha_mcs_execplan_parseinfo_bits.h new file mode 100644 index 000000000..0ef458b7a --- /dev/null +++ b/dbcon/mysql/ha_mcs_execplan_parseinfo_bits.h @@ -0,0 +1,28 @@ +/* Copyright (C) 2025 MariaDB Corporation + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; version 2 of + the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#pragma once + +#include + +namespace cal_impl_if +{ + const uint64_t AGG_BIT = 0x01; + const uint64_t SUB_BIT = 0x02; + const uint64_t AF_BIT = 0x04; + const uint64_t CORRELATED = 0x08; +} \ No newline at end of file diff --git a/dbcon/mysql/ha_mcs_execplan_walks.cpp b/dbcon/mysql/ha_mcs_execplan_walks.cpp new file mode 100644 index 000000000..55f66e1dc --- /dev/null +++ b/dbcon/mysql/ha_mcs_execplan_walks.cpp @@ -0,0 +1,1636 @@ +/* Copyright (C) 2025 MariaDB Corporation + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; version 2 of + the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#include "ha_mcs_execplan_helpers.h" +#include "ha_mcs_execplan_parseinfo_bits.h" +#include "ha_mcs_execplan_walks.h" +#include "ha_mcs_impl_if.h" +#include "ha_subquery.h" + +#include "constantcolumn.h" +#include "logicoperator.h" +#include "rowcolumn.h" +#include "simplefilter.h" + +namespace cal_impl_if +{ +// In certain cases, gp_walk is called recursively. When done so, +// we need to bookmark the rcWorkStack for those cases where a constant +// expression such as 1=1 is used in an if statement or function call. +// This is a seriously bad kludge for MariaDB bug 750. +// +// BM => BookMark +// HWM => HighWaterMark +class RecursionCounter +{ + private: + RecursionCounter() + { + } + + public: + RecursionCounter(cal_impl_if::gp_walk_info* gwip) : fgwip(gwip) + { + ++fgwip->recursionLevel; + + if (fgwip->recursionLevel > fgwip->recursionHWM) + { + fgwip->rcBookMarkStack.push(fgwip->rcWorkStack.size()); + fgwip->recursionHWM = fgwip->recursionLevel; + } + } + ~RecursionCounter() + { + --fgwip->recursionLevel; + + if (fgwip->recursionLevel < fgwip->recursionHWM - 1) + { + fgwip->rcBookMarkStack.pop(); + --fgwip->recursionHWM; + } + } + + cal_impl_if::gp_walk_info* fgwip; +}; + +bool isSecondArgumentConstItem(Item_func* ifp) +{ + return (ifp->argument_count() == 2 && ifp->arguments()[1]->type() == Item::CONST_ITEM); +} + +// SELECT ... WHERE NOT IN (SELECT ); +bool isNotFuncAndConstScalarSubSelect(Item_func* ifp, const std::string& funcName) +{ + return (ifp->with_subquery() && funcName == "not" && ifp->argument_count() == 1 && + ifp->arguments()[0]->type() == Item::FUNC_ITEM && + std::string(((Item_func*)ifp->arguments()[0])->func_name()) == "=" && + isSecondArgumentConstItem((Item_func*)ifp->arguments()[0])); +} + +void gp_walk(const Item* item, void* arg) +{ + cal_impl_if::gp_walk_info* gwip = static_cast(arg); + idbassert(gwip); + + // Bailout... + if (gwip->fatalParseError) + return; + + RecursionCounter r(gwip); // Increments and auto-decrements upon exit. + + Item::Type itype = item->type(); + + // Allow to process XOR(which is Item_func) like other logical operators (which are Item_cond) + if (itype == Item::FUNC_ITEM && ((Item_func*)item)->functype() == Item_func::XOR_FUNC) + itype = Item::COND_ITEM; + + switch (itype) + { + case Item::CACHE_ITEM: + { + // The item or condition is cached as per MariaDB server view but + // for InfiniDB it need to be parsed and executed. + // MCOL-1188 and MCOL-1029 + Item* orig_item = ((Item_cache*)item)->get_example(); + orig_item->traverse_cond(gp_walk, gwip, Item::POSTFIX); + break; + } + case Item::FIELD_ITEM: + { + Item_field* ifp = (Item_field*)item; + + if (ifp) + { + // XXX: this looks awfuly wrong. + execplan::SimpleColumn* scp = buildSimpleColumn(ifp, *gwip); + + if (!scp) + break; + + string aliasTableName(scp->tableAlias()); + scp->tableAlias(aliasTableName); + gwip->rcWorkStack.push(scp->clone()); + boost::shared_ptr scsp(scp); + gwip->scsp = scsp; + + gwip->funcName.clear(); + gwip->columnMap.insert( + execplan::CalpontSelectExecutionPlan::ColumnMap::value_type(string(ifp->field_name.str), scsp)); + + //@bug4636 take where clause column as dummy projection column, but only on local column. + // varbinary aggregate is not supported yet, so rule it out + if (!((scp->joinInfo() & execplan::JOIN_CORRELATED) || + scp->colType().colDataType == execplan::CalpontSystemCatalog::VARBINARY)) + { + TABLE_LIST* tmp = (ifp->cached_table ? ifp->cached_table : 0); + gwip->tableMap[execplan::make_aliastable(scp->schemaName(), scp->tableName(), scp->tableAlias(), + scp->isColumnStore())] = make_pair(1, tmp); + } + } + + break; + } + + case Item::CONST_ITEM: + { + switch (item->cmp_type()) + { + case INT_RESULT: + { + Item* non_const_item = const_cast(item); + gwip->rcWorkStack.push(buildReturnedColumn(non_const_item, *gwip, gwip->fatalParseError)); + break; + } + + case STRING_RESULT: + { + // Special handling for 0xHHHH literals + if (item->type_handler() == &type_handler_hex_hybrid) + { + Item_hex_hybrid* hip = static_cast(const_cast(item)); + gwip->rcWorkStack.push(new execplan::ConstantColumn((int64_t)hip->val_int(), execplan::ConstantColumn::NUM)); + execplan::ConstantColumn* cc = dynamic_cast(gwip->rcWorkStack.top()); + cc->timeZone(gwip->timeZone); + break; + } + + if (item->result_type() == STRING_RESULT) + { + // dangerous cast here + Item* isp = const_cast(item); + String val, *str = isp->val_str(&val); + if (str) + { + string cval; + + if (str->ptr()) + { + cval.assign(str->ptr(), str->length()); + } + + gwip->rcWorkStack.push(new execplan::ConstantColumn(cval)); + (dynamic_cast(gwip->rcWorkStack.top()))->timeZone(gwip->timeZone); + break; + } + else + { + gwip->rcWorkStack.push(new execplan::ConstantColumn("", execplan::ConstantColumn::NULLDATA)); + (dynamic_cast(gwip->rcWorkStack.top()))->timeZone(gwip->timeZone); + break; + } + + gwip->rcWorkStack.push(buildReturnedColumn(isp, *gwip, gwip->fatalParseError)); + } + break; + } + + case REAL_RESULT: + case DECIMAL_RESULT: + case TIME_RESULT: + { + Item* nonConstItem = const_cast(item); + gwip->rcWorkStack.push(buildReturnedColumn(nonConstItem, *gwip, gwip->fatalParseError)); + break; + } + + default: + { + if (gwip->condPush) + { + // push noop for unhandled item + execplan::SimpleColumn* rc = new execplan::SimpleColumn("noop"); + rc->timeZone(gwip->timeZone); + gwip->rcWorkStack.push(rc); + break; + } + + ostringstream oss; + oss << "Unhandled Item type(): " << item->type(); + gwip->parseErrorText = oss.str(); + gwip->fatalParseError = true; + break; + } + } + break; + } + case Item::NULL_ITEM: + { + if (gwip->condPush) + { + // push noop for unhandled item + execplan::SimpleColumn* rc = new execplan::SimpleColumn("noop"); + rc->timeZone(gwip->timeZone); + gwip->rcWorkStack.push(rc); + break; + } + + gwip->rcWorkStack.push(new execplan::ConstantColumn("", execplan::ConstantColumn::NULLDATA)); + (dynamic_cast(gwip->rcWorkStack.top()))->timeZone(gwip->timeZone); + break; + } + + case Item::FUNC_ITEM: + { + Item* ncitem = const_cast(item); + Item_func* ifp = static_cast(ncitem); + + string funcName = ifp->func_name(); + + if (!gwip->condPush) + { + if (!ifp->fixed()) + { + ifp->fix_fields(gwip->thd, &ncitem); + } + + // Special handling for queries of the form: + // SELECT ... WHERE col1 NOT IN (SELECT ); + if (isNotFuncAndConstScalarSubSelect(ifp, funcName)) + { + idbassert(!gwip->ptWorkStack.empty()); + execplan::ParseTree* pt = gwip->ptWorkStack.top(); + execplan::SimpleFilter* sf = dynamic_cast(pt->data()); + + if (sf) + { + boost::shared_ptr sop(new execplan::PredicateOperator("<>")); + sf->op(sop); + return; + } + } + + // Do not call buildSubselectFunc() if the subquery is a const scalar + // subselect of the form: + // (SELECT ) + // As an example: SELECT col1 FROM t1 WHERE col2 = (SELECT 2); + if ((ifp->with_subquery() && !isSecondArgumentConstItem(ifp)) || funcName == "") + { + buildSubselectFunc(ifp, gwip); + return; + } + + if (ifp->argument_count() > 0 && ifp->arguments()) + { + for (uint32_t i = 0; i < ifp->argument_count(); i++) + { + if (ifp->arguments()[i]->type() == Item::SUBSELECT_ITEM) + { + // This is probably NOT IN subquery with derived table in it. + // for some reason, MySQL has not fully optimized the plan at this point. + // noop here, and eventually MySQL will continue its optimization and get + // to rnd_init again. + if (ifp->functype() == Item_func::NOT_FUNC) + return; + + buildSubselectFunc(ifp, gwip); + return; + } + } + } + + if (ifp->functype() == Item_func::TRIG_COND_FUNC && gwip->subQuery) + { + gwip->subQuery->handleFunc(gwip, ifp); + break; + } + + // having clause null function added by MySQL + if (ifp->functype() == Item_func::ISNOTNULLTEST_FUNC) + { + // @bug 4215. remove the argument in rcWorkStack. + if (!gwip->rcWorkStack.empty()) + { + delete gwip->rcWorkStack.top(); + gwip->rcWorkStack.pop(); + } + + break; + } + } + + // try to evaluate const F&E + vector tmpVec; + uint16_t parseInfo = 0; + parse_item(ifp, tmpVec, gwip->fatalParseError, parseInfo, gwip); + + // table mode takes only one table filter + if (gwip->condPush) + { + set tableSet; + + for (uint32_t i = 0; i < tmpVec.size(); i++) + { + if (tmpVec[i]->table_name.str) + tableSet.insert(tmpVec[i]->table_name.str); + } + + if (tableSet.size() > 1) + break; + } + + if (!gwip->fatalParseError && !(parseInfo & AGG_BIT) && !(parseInfo & SUB_BIT) && !nonConstFunc(ifp) && + !(parseInfo & AF_BIT) && tmpVec.size() == 0 && ifp->functype() != Item_func::MULT_EQUAL_FUNC) + { + ValStrStdString valStr(ifp); + + execplan::ConstantColumn* cc = buildConstantColumnMaybeNullFromValStr(ifp, valStr, *gwip); + + for (uint32_t i = 0; i < ifp->argument_count() && !gwip->rcWorkStack.empty(); i++) + { + delete gwip->rcWorkStack.top(); + gwip->rcWorkStack.pop(); + } + + // bug 3137. If filter constant like 1=0, put it to ptWorkStack + // MariaDB bug 750. Breaks if compare is an argument to a function. + // if ((int32_t)gwip->rcWorkStack.size() <= + //(gwip->rcBookMarkStack.empty() + //? + // 0 + //: gwip->rcBookMarkStack.top()) + // && isPredicateFunction(ifp, gwip)) + if (isPredicateFunction(ifp, gwip)) + gwip->ptWorkStack.push(new execplan::ParseTree(cc)); + else + gwip->rcWorkStack.push(cc); + + if (!valStr.isNull()) + IDEBUG(cerr << "Const F&E " << item->full_name() << " evaluate: " << valStr << endl); + + break; + } + + execplan::ReturnedColumn* rc = NULL; + + // @bug4488. Process function for table mode also, not just vtable mode. + rc = buildFunctionColumn(ifp, *gwip, gwip->fatalParseError); + + if (gwip->fatalParseError) + { + if (gwip->clauseType == SELECT) + return; + + // @bug 2585 + if (gwip->parseErrorText.empty()) + { + logging::Message::Args args; + args.add(funcName); + gwip->parseErrorText = logging::IDBErrorInfo::instance()->errorMsg(logging::ERR_NON_SUPPORTED_FUNCTION, args); + } + + return; + } + + // predicate operators fall in the old path + if (rc) + { + // @bug 2383. For some reason func_name() for "in" gives " IN " always + if (funcName == "between" || funcName == "in" || funcName == " IN ") + gwip->ptWorkStack.push(new execplan::ParseTree(rc)); + else + gwip->rcWorkStack.push(rc); + } + else + { + // push to pt or rc stack is handled inside the function + buildPredicateItem(ifp, gwip); + } + + break; + } + + case Item::SUM_FUNC_ITEM: + { + Item_sum* isp = (Item_sum*)item; + execplan::ReturnedColumn* rc = buildAggregateColumn(isp, *gwip); + + if (rc) + gwip->rcWorkStack.push(rc); + + break; + } + + case Item::COND_ITEM: + { + // All logical functions are handled here, most of them are Item_cond, + // but XOR (it is Item_func_boolean2) + Item_func* func = (Item_func*)item; + + enum Item_func::Functype ftype = func->functype(); + bool isOr = (ftype == Item_func::COND_OR_FUNC); + bool isXor = (ftype == Item_func::XOR_FUNC); + + List* argumentList; + List xorArgumentList; + + if (isXor) + { + for (unsigned i = 0; i < func->argument_count(); i++) + { + xorArgumentList.push_back(func->arguments()[i]); + } + + argumentList = &xorArgumentList; + } + else + { + argumentList = ((Item_cond*)item)->argument_list(); + } + + // @bug2932. if ptWorkStack contains less items than the condition's arguments, + // the missing one should be in the rcWorkStack, unless the it's subselect. + // @todo need to figure out a way to combine these two stacks while walking. + // if (gwip->ptWorkStack.size() < icp->argument_list()->elements) + { + List_iterator_fast li(*argumentList); + + while (Item* it = li++) + { + //@bug3495, @bug5865 error out non-supported OR with correlated subquery + if (isOr) + { + vector fieldVec; + uint16_t parseInfo = 0; + parse_item(it, fieldVec, gwip->fatalParseError, parseInfo, gwip); + + if (parseInfo & CORRELATED) + { + gwip->fatalParseError = true; + gwip->parseErrorText = logging::IDBErrorInfo::instance()->errorMsg(logging::ERR_CORRELATED_SUB_OR); + return; + } + } + + if ((it->type() == Item::FIELD_ITEM || + (it->type() == Item::CONST_ITEM && + (it->cmp_type() == INT_RESULT || it->cmp_type() == DECIMAL_RESULT || + it->cmp_type() == STRING_RESULT || it->cmp_type() == REAL_RESULT)) || + it->type() == Item::NULL_ITEM || + (it->type() == Item::FUNC_ITEM && !isPredicateFunction(it, gwip))) && + !gwip->rcWorkStack.empty()) + { + gwip->ptWorkStack.push(new execplan::ParseTree(gwip->rcWorkStack.top())); + gwip->rcWorkStack.pop(); + } + } + } + + // @bug1603. MySQL's filter tree is a multi-tree grouped by operator. So more than + // two filters saved on the stack so far might belong to this operator. + uint32_t leftInStack = gwip->ptWorkStack.size() - argumentList->elements + 1; + + while (true) + { + if (gwip->ptWorkStack.size() < 2) + break; + + execplan::ParseTree* lhs = gwip->ptWorkStack.top(); + gwip->ptWorkStack.pop(); + execplan::SimpleFilter* lsf = dynamic_cast(lhs->data()); + + if (lsf && lsf->op()->data() == "noop") + { + if (isOr) + { + gwip->parseErrorText = "Unhandled item in WHERE or HAVING clause"; + gwip->fatalParseError = true; + break; + } + else + continue; + } + + execplan::ParseTree* rhs = gwip->ptWorkStack.top(); + gwip->ptWorkStack.pop(); + execplan::SimpleFilter* rsf = dynamic_cast(rhs->data()); + + if (rsf && rsf->op()->data() == "noop") + { + if (isOr) + { + gwip->parseErrorText = "Unhandled item in WHERE or HAVING clause"; + gwip->fatalParseError = true; + break; + } + else + { + delete rhs; + gwip->ptWorkStack.push(lhs); + continue; + } + } + + execplan::Operator* op = new execplan::LogicOperator(func->func_name()); + execplan::ParseTree* ptp = new execplan::ParseTree(op); + ptp->left(lhs); + ptp->right(rhs); + gwip->ptWorkStack.push(ptp); + + if (gwip->ptWorkStack.size() == leftInStack) + break; + } + + // special handling for subquery with aggregate. MySQL adds isnull function to the selected + // column. InfiniDB will remove it and set nullmatch flag if it's NOT_IN sub. + // @todo need more checking here to make sure it's not a user input OR operator + if (isOr && gwip->subQuery) + gwip->subQuery->handleFunc(gwip, func); + + break; + } + + case Item::REF_ITEM: + { + Item* col = *(((Item_ref*)item)->ref); + execplan::ReturnedColumn* rc = NULL; + // ref item is not pre-walked. force clause type to SELECT + ClauseType clauseType = gwip->clauseType; + gwip->clauseType = SELECT; + + if (col->type() != Item::COND_ITEM) + { + rc = buildReturnedColumn(col, *gwip, gwip->fatalParseError, true); + + if (col->type() == Item::FIELD_ITEM) + gwip->fatalParseError = false; + } + + execplan::SimpleColumn* sc = clauseType == HAVING ? nullptr : dynamic_cast(rc); + + if (sc) + { + boost::shared_ptr scsp(sc->clone()); + gwip->scsp = scsp; + + if (col->type() == Item::FIELD_ITEM) + { + const Item_ident* ident_field = dynamic_cast(item); + if (ident_field) + { + const auto& field_name = string(ident_field->field_name.str); + auto colMap = execplan::CalpontSelectExecutionPlan::ColumnMap::value_type(field_name, scsp); + gwip->columnMap.insert(colMap); + } + } + } + + bool cando = true; + gwip->clauseType = clauseType; + + if (rc) + { + if (((Item_ref*)item)->depended_from) + { + rc->joinInfo(rc->joinInfo() | execplan::JOIN_CORRELATED); + + if (gwip->subQuery) + gwip->subQuery->correlated(true); + + execplan::SimpleColumn* scp = dynamic_cast(rc); + + if (scp) + gwip->correlatedTbNameVec.push_back( + execplan::make_aliastable(scp->schemaName(), scp->tableName(), scp->tableAlias())); + + if (gwip->subSelectType == execplan::CalpontSelectExecutionPlan::SINGLEROW_SUBS) + rc->joinInfo(rc->joinInfo() | execplan::JOIN_SCALAR | execplan::JOIN_SEMI); + + if (gwip->subSelectType == execplan::CalpontSelectExecutionPlan::SELECT_SUBS) + rc->joinInfo(rc->joinInfo() | execplan::JOIN_SCALAR | execplan::JOIN_OUTER_SELECT); + } + + gwip->rcWorkStack.push(rc); + } + else if (col->type() == Item::FUNC_ITEM) + { + // sometimes mysql treat having filter items inconsistently. In such cases, + // which are always predicate operator, the function (gp_key>3) comes in as + // one item. + Item_func* ifp = (Item_func*)col; + + for (uint32_t i = 0; i < ifp->argument_count(); i++) + { + execplan::ReturnedColumn* operand = NULL; + + if (ifp->arguments()[i]->type() == Item::REF_ITEM) + { + Item* op = *(((Item_ref*)ifp->arguments()[i])->ref); + operand = buildReturnedColumn(op, *gwip, gwip->fatalParseError); + } + else + operand = buildReturnedColumn(ifp->arguments()[i], *gwip, gwip->fatalParseError); + + if (operand) + { + gwip->rcWorkStack.push(operand); + if (i == 0 && gwip->scsp == NULL) // first item is the WHEN LHS + { + execplan::SimpleColumn* sc = dynamic_cast(operand); + if (sc) + { + gwip->scsp.reset(sc->clone()); // We need to clone else sc gets double deleted. This code is + // rarely executed so the cost is acceptable. + } + } + } + else + { + cando = false; + break; + } + } + + if (cando) + buildPredicateItem(ifp, gwip); + } + else if (col->type() == Item::COND_ITEM) + { + gwip->ptWorkStack.push(buildParseTree(col, *gwip, gwip->fatalParseError)); + } + else if (col->type() == Item::FIELD_ITEM && gwip->clauseType == HAVING) + { + // ReturnedColumn* rc = buildAggFrmTempField(const_cast(item), *gwip); + execplan::ReturnedColumn* rc = buildReturnedColumn(const_cast(item), *gwip, gwip->fatalParseError); + if (rc) + gwip->rcWorkStack.push(rc); + + break; + } + else + { + cando = false; + } + + execplan::SimpleColumn* thisSC = dynamic_cast(rc); + if (thisSC) + { + gwip->scsp.reset(thisSC->clone()); + } + if (!rc && !cando) + { + ostringstream oss; + oss << "Unhandled Item type(): " << item->type(); + gwip->parseErrorText = oss.str(); + gwip->fatalParseError = true; + } + + break; + } + + case Item::SUBSELECT_ITEM: + { + if (gwip->condPush) // table mode + break; + + Item_subselect* sub = (Item_subselect*)item; + + if (sub->substype() == Item_subselect::EXISTS_SUBS) + { + SubQuery* orig = gwip->subQuery; + ExistsSub* existsSub = new ExistsSub(*gwip, sub); + gwip->hasSubSelect = true; + gwip->subQuery = existsSub; + gwip->ptWorkStack.push(existsSub->transform()); + // recover original + gwip->subQuery = orig; + gwip->lastSub = existsSub; + } + else if (sub->substype() == Item_subselect::IN_SUBS) + { + if (!((Item_in_subselect*)sub)->optimizer && gwip->thd->derived_tables_processing) + { + ostringstream oss; + oss << "Invalid In_optimizer: " << item->type(); + gwip->parseErrorText = oss.str(); + gwip->fatalParseError = true; + break; + } + } + + // store a dummy subselect object. the transform is handled in item_func. + execplan::SubSelect* subselect = new execplan::SubSelect(); + gwip->rcWorkStack.push(subselect); + break; + } + + case Item::ROW_ITEM: + { + Item_row* row = (Item_row*)item; + execplan::RowColumn* rowCol = new execplan::RowColumn(); + vector cols; + // temp change clause type because the elements of row column are not walked yet + gwip->clauseType = SELECT; + for (uint32_t i = 0; i < row->cols(); i++) + cols.push_back(execplan::SRCP(buildReturnedColumn(row->element_index(i), *gwip, gwip->fatalParseError))); + + gwip->clauseType = WHERE; + rowCol->columnVec(cols); + gwip->rcWorkStack.push(rowCol); + break; + } + + case Item::EXPR_CACHE_ITEM: + { + ((Item_cache_wrapper*)item)->get_orig_item()->traverse_cond(gp_walk, arg, Item::POSTFIX); + break; + } + + case Item::WINDOW_FUNC_ITEM: + { + gwip->hasWindowFunc = true; + Item_window_func* ifa = (Item_window_func*)item; + execplan::ReturnedColumn* af = buildWindowFunctionColumn(ifa, *gwip, gwip->fatalParseError); + + if (af) + gwip->rcWorkStack.push(af); + + break; + } + + case Item::COPY_STR_ITEM: printf("********** received COPY_STR_ITEM *********\n"); break; + + case Item::FIELD_AVG_ITEM: printf("********** received FIELD_AVG_ITEM *********\n"); break; + + case Item::DEFAULT_VALUE_ITEM: printf("********** received DEFAULT_VALUE_ITEM *********\n"); break; + + case Item::PROC_ITEM: printf("********** received PROC_ITEM *********\n"); break; + + case Item::FIELD_STD_ITEM: printf("********** received FIELD_STD_ITEM *********\n"); break; + + case Item::FIELD_VARIANCE_ITEM: printf("********** received FIELD_VARIANCE_ITEM *********\n"); break; + + case Item::INSERT_VALUE_ITEM: printf("********** received INSERT_VALUE_ITEM *********\n"); break; + + case Item::PARAM_ITEM: printf("********** received PARAM_ITEM *********\n"); break; + + case Item::TRIGGER_FIELD_ITEM: printf("********** received TRIGGER_FIELD_ITEM *********\n"); break; + + case Item::TYPE_HOLDER: std::cerr << "********** received TYPE_HOLDER *********" << std::endl; break; + default: + { + if (gwip->condPush) + { + // push noop for unhandled item + execplan::SimpleColumn* rc = new execplan::SimpleColumn("noop"); + rc->timeZone(gwip->timeZone); + gwip->rcWorkStack.push(rc); + break; + } + + ostringstream oss; + oss << "Unhandled Item type (2): " << item->type(); + gwip->parseErrorText = oss.str(); + gwip->fatalParseError = true; + break; + } + } + + return; +} + +/** @info this function recursivly walks an item's arguments and push all + * the involved item_fields to the passed in vector. It's used in parsing + * functions or arithmetic expressions for vtable post process. + */ +void parse_item(Item* item, vector& field_vec, bool& hasNonSupportItem, uint16_t& parseInfo, + gp_walk_info* gwi) +{ + Item::Type itype = item->type(); + + switch (itype) + { + case Item::FIELD_ITEM: + { + Item_field* ifp = static_cast(item); + field_vec.push_back(ifp); + return; + } + + case Item::SUM_FUNC_ITEM: + { + // hasAggColumn = true; + parseInfo |= AGG_BIT; + Item_sum* isp = static_cast(item); + Item** sfitempp = isp->arguments(); + + for (uint32_t i = 0; i < isp->argument_count(); i++) + parse_item(sfitempp[i], field_vec, hasNonSupportItem, parseInfo, gwi); + + break; + } + + case Item::FUNC_ITEM: + { + Item_func* isp = static_cast(item); + + if (string(isp->func_name()) == "") + { + parseInfo |= SUB_BIT; + parseInfo |= CORRELATED; + break; + } + + for (uint32_t i = 0; i < isp->argument_count(); i++) + parse_item(isp->arguments()[i], field_vec, hasNonSupportItem, parseInfo, gwi); + + break; + } + + case Item::COND_ITEM: + { + Item_cond* icp = static_cast(item); + List_iterator_fast it(*(icp->argument_list())); + Item* cond_item; + + while ((cond_item = it++)) + parse_item(cond_item, field_vec, hasNonSupportItem, parseInfo, gwi); + + break; + } + + case Item::REF_ITEM: + { + Item_ref* ref = (Item_ref*)item; + if (ref->ref_type() == Item_ref::DIRECT_REF) + { + parse_item(ref->real_item(), field_vec, hasNonSupportItem, parseInfo, gwi); + break; + } + while (true) + { + ref = (Item_ref*)item; + if ((*(ref->ref))->type() == Item::SUM_FUNC_ITEM) + { + parseInfo |= AGG_BIT; + Item_sum* isp = static_cast(*(ref->ref)); + Item** sfitempp = isp->arguments(); + + // special handling for count(*). This should not be treated as constant. + if (isSupportedAggregateWithOneConstArg(isp, sfitempp)) + { + field_vec.push_back(nullptr); // dummy + } + + for (uint32_t i = 0; i < isp->argument_count(); i++) + parse_item(sfitempp[i], field_vec, hasNonSupportItem, parseInfo, gwi); + + break; + } + else if ((*(ref->ref))->type() == Item::FIELD_ITEM) + { + // MCOL-1510. This could be a non-supported function + // argument in form of a temp_table_field, so check + // and set hasNonSupportItem if it is so. + // ReturnedColumn* rc = NULL; + // if (gwi) + // rc = buildAggFrmTempField(ref, *gwi); + + // if (!rc) + //{ + Item_field* ifp = static_cast(*(ref->ref)); + field_vec.push_back(ifp); + //} + break; + } + else if ((*(ref->ref))->type() == Item::FUNC_ITEM) + { + Item_func* isp = static_cast(*(ref->ref)); + Item** sfitempp = isp->arguments(); + + for (uint32_t i = 0; i < isp->argument_count(); i++) + parse_item(sfitempp[i], field_vec, hasNonSupportItem, parseInfo, gwi); + + break; + } + else if ((*(ref->ref))->type() == Item::CACHE_ITEM) + { + Item_cache* isp = static_cast(*(ref->ref)); + parse_item(isp->get_example(), field_vec, hasNonSupportItem, parseInfo, gwi); + break; + } + else if ((*(ref->ref))->type() == Item::REF_ITEM) + { + item = (*(ref->ref)); + continue; + } + else if ((*(ref->ref))->type() == Item::WINDOW_FUNC_ITEM) + { + parseInfo |= AF_BIT; + break; + } + else + { + cerr << "UNKNOWN REF Item" << endl; + break; + } + } + + break; + } + + case Item::SUBSELECT_ITEM: + { + parseInfo |= SUB_BIT; + Item_subselect* sub = (Item_subselect*)item; + + if (sub->is_correlated) + parseInfo |= CORRELATED; + + break; + } + + case Item::ROW_ITEM: + { + Item_row* row = (Item_row*)item; + + for (uint32_t i = 0; i < row->cols(); i++) + parse_item(row->element_index(i), field_vec, hasNonSupportItem, parseInfo, gwi); + + break; + } + + case Item::EXPR_CACHE_ITEM: + { + // item is a Item_cache_wrapper. Shouldn't get here. + // DRRTUY TODO Why + IDEBUG(std::cerr << "EXPR_CACHE_ITEM in parse_item\n" << std::endl); + gwi->fatalParseError = true; + // DRRTUY The questionable error text. I've seen + // ERR_CORRELATED_SUB_OR + string parseErrorText = logging::IDBErrorInfo::instance()->errorMsg(logging::ERR_NON_SUPPORT_SUB_QUERY_TYPE); + setError(gwi->thd, ER_CHECK_NOT_IMPLEMENTED, parseErrorText); + break; + } + + case Item::WINDOW_FUNC_ITEM: parseInfo |= AF_BIT; break; + + default: break; + } +} + +void debug_walk(const Item* item, void* arg) +{ + switch (item->type()) + { + case Item::FIELD_ITEM: + { + Item_field* ifp = (Item_field*)item; + cerr << "FIELD_ITEM: " << (ifp->db_name.str ? ifp->db_name.str : "") << '.' << bestTableName(ifp) << '.' + << ifp->field_name.str << endl; + break; + } + case Item::CONST_ITEM: + { + switch (item->cmp_type()) + { + case INT_RESULT: + { + Item_int* iip = (Item_int*)item; + cerr << "INT_ITEM: "; + + if (iip->name.length) + cerr << iip->name.str << " (from name string)" << endl; + else + cerr << iip->val_int() << endl; + + break; + } + case STRING_RESULT: + { + Item_string* isp = (Item_string*)item; + String val, *str = isp->val_str(&val); + string valStr; + valStr.assign(str->ptr(), str->length()); + cerr << "STRING_ITEM: >" << valStr << '<' << endl; + break; + } + case REAL_RESULT: + { + cerr << "REAL_ITEM" << endl; + break; + } + case DECIMAL_RESULT: + { + cerr << "DECIMAL_ITEM" << endl; + break; + } + case TIME_RESULT: + { + String val, *str = NULL; + Item_temporal_literal* itp = (Item_temporal_literal*)item; + str = itp->val_str(&val); + cerr << "DATE ITEM: "; + + if (str) + cerr << ": (" << str->ptr() << ')' << endl; + else + cerr << ": " << endl; + + break; + } + default: + { + cerr << ": Unknown cmp_type" << endl; + break; + } + } + break; + } + case Item::FUNC_ITEM: + { + Item_func* ifp = (Item_func*)item; + Item_func_opt_neg* inp; + cerr << "FUNC_ITEM: "; + + switch (ifp->functype()) + { + case Item_func::UNKNOWN_FUNC: // 0 + cerr << ifp->func_name() << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::GT_FUNC: // 7 + cerr << '>' << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::EQ_FUNC: // 1 + cerr << '=' << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::GE_FUNC: cerr << ">=" << " (" << ifp->functype() << ")" << endl; break; + + case Item_func::LE_FUNC: cerr << "<=" << " (" << ifp->functype() << ")" << endl; break; + + case Item_func::LT_FUNC: cerr << '<' << " (" << ifp->functype() << ")" << endl; break; + + case Item_func::NE_FUNC: cerr << "<>" << " (" << ifp->functype() << ")" << endl; break; + + case Item_func::NEG_FUNC: // 45 + cerr << "unary minus" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::IN_FUNC: // 16 + inp = (Item_func_opt_neg*)ifp; + + if (inp->negated) + cerr << "not "; + + cerr << "in" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::BETWEEN: + inp = (Item_func_opt_neg*)ifp; + + if (inp->negated) + cerr << "not "; + + cerr << "between" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::ISNULL_FUNC: // 10 + cerr << "is null" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::ISNOTNULL_FUNC: // 11 + cerr << "is not null" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::NOT_ALL_FUNC: cerr << "not_all" << " (" << ifp->functype() << ")" << endl; break; + + case Item_func::NOT_FUNC: cerr << "not_func" << " (" << ifp->functype() << ")" << endl; break; + + case Item_func::TRIG_COND_FUNC: + cerr << "trig_cond_func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::ISNOTNULLTEST_FUNC: + cerr << "isnotnulltest_func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::MULT_EQUAL_FUNC: + { + cerr << "mult_equal_func:" << " (" << ifp->functype() << ")" << endl; + Item_equal* item_eq = (Item_equal*)ifp; + Item_equal_fields_iterator it(*item_eq); + Item* item; + + while ((item = it++)) + { + Field* equal_field = it.get_curr_field(); + cerr << equal_field->field_name.str << endl; + } + + break; + } + + case Item_func::EQUAL_FUNC: cerr << "equal func" << " (" << ifp->functype() << ")" << endl; break; + + case Item_func::FT_FUNC: cerr << "ft func" << " (" << ifp->functype() << ")" << endl; break; + + case Item_func::LIKE_FUNC: cerr << "like func" << " (" << ifp->functype() << ")" << endl; break; + + case Item_func::COND_AND_FUNC: + cerr << "cond and func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::COND_OR_FUNC: cerr << "cond or func" << " (" << ifp->functype() << ")" << endl; break; + + case Item_func::XOR_FUNC: cerr << "xor func" << " (" << ifp->functype() << ")" << endl; break; + + case Item_func::INTERVAL_FUNC: + cerr << "interval func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::SP_EQUALS_FUNC: + cerr << "sp equals func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::SP_DISJOINT_FUNC: + cerr << "sp disjoint func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::SP_INTERSECTS_FUNC: + cerr << "sp intersects func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::SP_TOUCHES_FUNC: + cerr << "sp touches func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::SP_CROSSES_FUNC: + cerr << "sp crosses func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::SP_WITHIN_FUNC: + cerr << "sp within func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::SP_CONTAINS_FUNC: + cerr << "sp contains func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::SP_OVERLAPS_FUNC: + cerr << "sp overlaps func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::SP_STARTPOINT: + cerr << "sp startpoint func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::SP_ENDPOINT: + cerr << "sp endpoint func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::SP_EXTERIORRING: + cerr << "sp exteriorring func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::SP_POINTN: cerr << "sp pointn func" << " (" << ifp->functype() << ")" << endl; break; + + case Item_func::SP_GEOMETRYN: + cerr << "sp geometryn func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::SP_INTERIORRINGN: + cerr << "sp exteriorringn func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::SP_RELATE_FUNC: + cerr << "sp relate func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::NOW_FUNC: cerr << "now func" << " (" << ifp->functype() << ")" << endl; break; + + case Item_func::SUSERVAR_FUNC: + cerr << "suservar func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::GUSERVAR_FUNC: + cerr << "guservar func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::COLLATE_FUNC: cerr << "collate func" << " (" << ifp->functype() << ")" << endl; break; + + case Item_func::EXTRACT_FUNC: cerr << "extract func" << " (" << ifp->functype() << ")" << endl; break; + + case Item_func::CHAR_TYPECAST_FUNC: + cerr << "char typecast func" << " (" << ifp->functype() << ")" << endl; + break; + + case Item_func::FUNC_SP: cerr << "func sp func" << " (" << ifp->functype() << ")" << endl; break; + + case Item_func::UDF_FUNC: cerr << "udf func" << " (" << ifp->functype() << ")" << endl; break; + + case Item_func::GSYSVAR_FUNC: cerr << "gsysvar func" << " (" << ifp->functype() << ")" << endl; break; + + case Item_func::DYNCOL_FUNC: cerr << "dyncol func" << " (" << ifp->functype() << ")" << endl; break; + + default: cerr << "type=" << ifp->functype() << endl; break; + } + + break; + } + + case Item::COND_ITEM: + { + Item_cond* icp = (Item_cond*)item; + cerr << "COND_ITEM: " << icp->func_name() << endl; + break; + } + + case Item::SUM_FUNC_ITEM: + { + Item_sum* isp = (Item_sum*)item; + char* item_name = const_cast(item->name.str); + + // MCOL-1052 This is an extended SELECT list item + if (!item_name && isp->get_arg_count() && isp->get_arg(0)->name.length) + { + item_name = const_cast(isp->get_arg(0)->name.str); + } + else if (!item_name && isp->get_arg_count() && isp->get_arg(0)->type() == Item::CONST_ITEM && + isp->get_arg(0)->cmp_type() == INT_RESULT) + { + item_name = (char*)"INT||*"; + } + else if (!item_name) + { + item_name = (char*)""; + } + + switch (isp->sum_func()) + { + case Item_sum::SUM_FUNC: cerr << "SUM_FUNC: " << item_name << endl; break; + + case Item_sum::SUM_DISTINCT_FUNC: cerr << "SUM_DISTINCT_FUNC: " << item_name << endl; break; + + case Item_sum::AVG_FUNC: cerr << "AVG_FUNC: " << item_name << endl; break; + + case Item_sum::COUNT_FUNC: cerr << "COUNT_FUNC: " << item_name << endl; break; + + case Item_sum::COUNT_DISTINCT_FUNC: cerr << "COUNT_DISTINCT_FUNC: " << item_name << endl; break; + + case Item_sum::MIN_FUNC: cerr << "MIN_FUNC: " << item_name << endl; break; + + case Item_sum::MAX_FUNC: cerr << "MAX_FUNC: " << item_name << endl; break; + + case Item_sum::UDF_SUM_FUNC: cerr << "UDAF_FUNC: " << item_name << endl; break; + + default: cerr << "SUM_FUNC_ITEM type=" << isp->sum_func() << endl; break; + } + + break; + } + + case Item::SUBSELECT_ITEM: + { + Item_subselect* sub = (Item_subselect*)item; + cerr << "SUBSELECT Item: "; + + switch (sub->substype()) + { + case Item_subselect::EXISTS_SUBS: cerr << "EXISTS"; break; + + case Item_subselect::IN_SUBS: cerr << "IN"; break; + + default: cerr << sub->substype(); break; + } + + cerr << endl; + JOIN* join = sub->get_select_lex()->join; + + if (join) + { + Item_cond* cond = static_cast(join->conds); + + if (cond) + cond->traverse_cond(debug_walk, arg, Item::POSTFIX); + } + + cerr << "Finish subselect item traversing" << endl; + break; + } + + case Item::REF_ITEM: + { + Item_ref* ref = (Item_ref*)item; + + if (ref->real_item()->type() == Item::CACHE_ITEM) + { + Item* field = ((Item_cache*)ref->real_item())->get_example(); + + if (field->type() == Item::FIELD_ITEM) + { + Item_field* ifp = (Item_field*)field; + // ifp->cached_table->select_lex->select_number gives the select level. + // could be used on alias. + // could also be used to tell correlated join (equal level). + cerr << "CACHED REF FIELD_ITEM: " << ifp->db_name.str << '.' << bestTableName(ifp) << '.' + << ifp->field_name.str << endl; + break; + } + else if (field->type() == Item::FUNC_ITEM) + { + Item_func* ifp = (Item_func*)field; + cerr << "CACHED REF FUNC_ITEM " << ifp->func_name() << endl; + } + else if (field->type() == Item::REF_ITEM) + { + Item_ref* ifr = (Item_ref*)field; + string refType; + string realType; + + switch (ifr->ref_type()) + { + case Item_ref::REF: refType = "REF"; break; + + case Item_ref::DIRECT_REF: refType = "DIRECT_REF"; break; + + case Item_ref::VIEW_REF: refType = "VIEW_REF"; break; + + case Item_ref::OUTER_REF: refType = "OUTER_REF"; break; + + case Item_ref::AGGREGATE_REF: refType = "AGGREGATE_REF"; break; + + default: refType = "UNKNOWN"; break; + } + + switch (ifr->real_type()) + { + case Item::FIELD_ITEM: + { + Item_field* ifp = (Item_field*)(*(ifr->ref)); + realType = "FIELD_ITEM "; + realType += ifp->db_name.str; + realType += '.'; + realType += bestTableName(ifp); + realType += '.'; + realType += ifp->field_name.str; + break; + } + + case Item::SUM_FUNC_ITEM: + { + Item_sum* isp = (Item_sum*)(*(ifr->ref)); + + if (isp->sum_func() == Item_sum::GROUP_CONCAT_FUNC) + realType = "GROUP_CONCAT_FUNC"; + else + realType = "SUM_FUNC_ITEM"; + + break; + } + + case Item::REF_ITEM: + // Need recursion here + realType = "REF_ITEM"; + break; + + case Item::FUNC_ITEM: + { + Item_func* ifp = (Item_func*)(*(ifr->ref)); + realType = "FUNC_ITEM "; + realType += ifp->func_name(); + break; + } + + default: + { + realType = "UNKNOWN"; + } + } + + cerr << "CACHED REF_ITEM: ref type " << refType.c_str() << " real type " << realType.c_str() + << endl; + break; + } + else + { + cerr << "REF_ITEM with CACHE_ITEM type unknown " << field->type() << endl; + } + } + else if (ref->real_item()->type() == Item::FIELD_ITEM) + { + Item_field* ifp = (Item_field*)ref->real_item(); + + // MCOL-1052 The field referenced presumable came from + // extended SELECT list. + if (!ifp->field_name.str) + { + cerr << "REF extra FIELD_ITEM: " << ifp->name.str << endl; + } + else + { + cerr << "REF FIELD_ITEM: " << ifp->db_name.str << '.' << bestTableName(ifp) << '.' + << ifp->field_name.str << endl; + } + + break; + } + else if (ref->real_item()->type() == Item::FUNC_ITEM) + { + Item_func* ifp = (Item_func*)ref->real_item(); + cerr << "REF FUNC_ITEM " << ifp->func_name() << endl; + } + else if (ref->real_item()->type() == Item::WINDOW_FUNC_ITEM) + { + Item_window_func* ifp = (Item_window_func*)ref->real_item(); + cerr << "REF WINDOW_FUNC_ITEM " << ifp->window_func()->func_name() << endl; + } + else + { + cerr << "UNKNOWN REF ITEM type " << ref->real_item()->type() << endl; + } + + break; + } + + case Item::ROW_ITEM: + { + Item_row* row = (Item_row*)item; + cerr << "ROW_ITEM: " << endl; + + for (uint32_t i = 0; i < row->cols(); i++) + debug_walk(row->element_index(i), 0); + + break; + } + + case Item::EXPR_CACHE_ITEM: + { + cerr << "Expr Cache Item" << endl; + ((Item_cache_wrapper*)item)->get_orig_item()->traverse_cond(debug_walk, arg, Item::POSTFIX); + break; + } + + case Item::CACHE_ITEM: + { + Item_cache* isp = (Item_cache*)item; + // MCOL-46 isp->val_str() can cause a call to execute a subquery. We're not set up + // to execute yet. +#if 0 + + switch (item->result_type()) + { + case STRING_RESULT: + cerr << "CACHE_STRING_ITEM" << endl; + break; + + case REAL_RESULT: + cerr << "CACHE_REAL_ITEM " << isp->val_real() << endl; + break; + + case INT_RESULT: + cerr << "CACHE_INT_ITEM " << isp->val_int() << endl; + break; + + case ROW_RESULT: + cerr << "CACHE_ROW_ITEM" << endl; + break; + + case DECIMAL_RESULT: + cerr << "CACHE_DECIMAL_ITEM " << isp->val_decimal() << endl; + break; + + default: + cerr << "CACHE_UNKNOWN_ITEM" << endl; + break; + } + +#endif + Item* field = isp->get_example(); + + if (field->type() == Item::FIELD_ITEM) + { + Item_field* ifp = (Item_field*)field; + // ifp->cached_table->select_lex->select_number gives the select level. + // could be used on alias. + // could also be used to tell correlated join (equal level). + cerr << "CACHED FIELD_ITEM: " << ifp->db_name.str << '.' << bestTableName(ifp) << '.' + << ifp->field_name.str << endl; + break; + } + else if (field->type() == Item::REF_ITEM) + { + Item_ref* ifr = (Item_ref*)field; + string refType; + string realType; + + switch (ifr->ref_type()) + { + case Item_ref::REF: refType = "REF"; break; + + case Item_ref::DIRECT_REF: refType = "DIRECT_REF"; break; + + case Item_ref::VIEW_REF: refType = "VIEW_REF"; break; + + case Item_ref::OUTER_REF: refType = "OUTER_REF"; break; + + case Item_ref::AGGREGATE_REF: refType = "AGGREGATE_REF"; break; + + default: refType = "UNKNOWN"; break; + } + + switch (ifr->real_type()) + { + case Item::FIELD_ITEM: + { + Item_field* ifp = (Item_field*)(*(ifr->ref)); + realType = "FIELD_ITEM "; + realType += ifp->db_name.str; + realType += '.'; + realType += bestTableName(ifp); + realType += '.'; + realType += ifp->field_name.str; + break; + } + + case Item::SUM_FUNC_ITEM: + { + Item_sum* isp = (Item_sum*)(*(ifr->ref)); + + if (isp->sum_func() == Item_sum::GROUP_CONCAT_FUNC) + realType = "GROUP_CONCAT_FUNC"; + else + realType = "SUM_FUNC_ITEM"; + + break; + } + + case Item::REF_ITEM: + // Need recursion here + realType = "REF_ITEM"; + break; + + case Item::FUNC_ITEM: + { + Item_func* ifp = (Item_func*)(*(ifr->ref)); + realType = "FUNC_ITEM "; + realType += ifp->func_name(); + break; + } + + default: + { + realType = "UNKNOWN"; + } + } + + cerr << "CACHE_ITEM ref type " << refType.c_str() << " real type " << realType.c_str() << endl; + break; + } + else if (field->type() == Item::FUNC_ITEM) + { + Item_func* ifp = (Item_func*)field; + cerr << "CACHE_ITEM FUNC_ITEM " << ifp->func_name() << endl; + break; + } + else + { + cerr << "CACHE_ITEM type unknown " << field->type() << endl; + } + + break; + } + + case Item::WINDOW_FUNC_ITEM: + { + Item_window_func* ifp = (Item_window_func*)item; + cerr << "Window Function Item " << ifp->window_func()->func_name() << endl; + break; + } + + case Item::NULL_ITEM: + { + cerr << "NULL item" << endl; + break; + } + + case Item::TYPE_HOLDER: + { + cerr << "TYPE_HOLDER item with cmp_type " << item->cmp_type() << endl; + break; + } + + default: + { + cerr << "UNKNOWN_ITEM type " << item->type() << endl; + break; + } + } +} + +} \ No newline at end of file diff --git a/dbcon/mysql/ha_mcs_execplan_walks.h b/dbcon/mysql/ha_mcs_execplan_walks.h new file mode 100644 index 000000000..f3efd9e3c --- /dev/null +++ b/dbcon/mysql/ha_mcs_execplan_walks.h @@ -0,0 +1,28 @@ +/* Copyright (C) 2025 MariaDB Corporation + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; version 2 of + the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#pragma once + +#define PREFER_MY_CONFIG_H +#include +#include "idb_mysql.h" + +namespace cal_impl_if +{ +void debug_walk(const Item* item, void* arg); +void gp_walk(const Item* item, void* arg); +} \ No newline at end of file From 68f60cd695333372ff602b3030f5d6b7399ec375 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Tue, 17 Jun 2025 00:18:38 +0300 Subject: [PATCH 47/79] Add functions including into MTR tests --- .../t/MCOL-5572-autoincrement-filtering.test | 1 + .../columnstore/basic/t/cal_named_udfs.test | 1 + .../basic/t/mcs98_moda_function.test | 1 + .../columnstore/bugfixes/mcol_4465.test | 1 + mysql-test/columnstore/include/functions.inc | 63 +++++++++++++++++++ 5 files changed, 67 insertions(+) create mode 100644 mysql-test/columnstore/include/functions.inc diff --git a/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test b/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test index 513d41df7..de9d88014 100644 --- a/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test +++ b/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test @@ -1,4 +1,5 @@ --source ../include/have_columnstore.inc +--source ../include/functions.inc SET default_storage_engine=columnstore; diff --git a/mysql-test/columnstore/basic/t/cal_named_udfs.test b/mysql-test/columnstore/basic/t/cal_named_udfs.test index f127716d2..d097511b8 100644 --- a/mysql-test/columnstore/basic/t/cal_named_udfs.test +++ b/mysql-test/columnstore/basic/t/cal_named_udfs.test @@ -1,4 +1,5 @@ -- source ../include/have_columnstore.inc +--source ../include/functions.inc --disable_warnings DROP DATABASE IF EXISTS cal_test_db; diff --git a/mysql-test/columnstore/basic/t/mcs98_moda_function.test b/mysql-test/columnstore/basic/t/mcs98_moda_function.test index 5d70bf61a..148f355b4 100644 --- a/mysql-test/columnstore/basic/t/mcs98_moda_function.test +++ b/mysql-test/columnstore/basic/t/mcs98_moda_function.test @@ -4,6 +4,7 @@ # # Test MODA with various numeric types -- source ../include/have_columnstore.inc +--source ../include/functions.inc --disable_warnings DROP DATABASE IF EXISTS mcs98_db; --enable_warnings diff --git a/mysql-test/columnstore/bugfixes/mcol_4465.test b/mysql-test/columnstore/bugfixes/mcol_4465.test index 59f078ca1..25503f6d5 100644 --- a/mysql-test/columnstore/bugfixes/mcol_4465.test +++ b/mysql-test/columnstore/bugfixes/mcol_4465.test @@ -1,4 +1,5 @@ --source ../include/have_columnstore.inc +--source ../include/functions.inc --disable_warnings DROP DATABASE IF EXISTS mcol_4465; --enable_warnings diff --git a/mysql-test/columnstore/include/functions.inc b/mysql-test/columnstore/include/functions.inc new file mode 100644 index 000000000..9d9602aa3 --- /dev/null +++ b/mysql-test/columnstore/include/functions.inc @@ -0,0 +1,63 @@ +--disable_query_log +CREATE OR REPLACE FUNCTION mcsgetstats RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION calgetstats RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION mcssettrace RETURNS INTEGER SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION calsettrace RETURNS INTEGER SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION mcssetparms RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION calsetparms RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION mcsflushcache RETURNS INTEGER SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION calflushcache RETURNS INTEGER SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION mcsgettrace RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION calgettrace RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION mcsgetversion RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION calgetversion RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION calonlinealter RETURNS INTEGER SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION mcsviewtablelock RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION calviewtablelock RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION mcscleartablelock RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION calcleartablelock RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION mcslastinsertid RETURNS INTEGER SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION callastinsertid RETURNS INTEGER SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION mcsgetsqlcount RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION calgetsqlcount RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION idbpm RETURNS INTEGER SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION idbdbroot RETURNS INTEGER SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION idbsegment RETURNS INTEGER SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION idbsegmentdir RETURNS INTEGER SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION idbextentrelativerid RETURNS INTEGER SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION idbblockid RETURNS INTEGER SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION idbextentid RETURNS INTEGER SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION idbextentmin RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION idbextentmax RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION idbpartition RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION idblocalpm RETURNS INTEGER SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION mcssystemready RETURNS INTEGER SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION mcssystemreadonly RETURNS INTEGER SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION mcssystemprimary RETURNS INTEGER SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION mcs_emindex_size RETURNS INTEGER SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION mcs_emindex_free RETURNS INTEGER SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION columnstore_dataload RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE AGGREGATE FUNCTION regr_avgx RETURNS REAL SONAME 'libregr_mysql.so'; +CREATE OR REPLACE AGGREGATE FUNCTION regr_avgy RETURNS REAL SONAME 'libregr_mysql.so'; +CREATE OR REPLACE AGGREGATE FUNCTION regr_count RETURNS INTEGER SONAME 'libregr_mysql.so'; +CREATE OR REPLACE AGGREGATE FUNCTION regr_slope RETURNS REAL SONAME 'libregr_mysql.so'; +CREATE OR REPLACE AGGREGATE FUNCTION regr_intercept RETURNS REAL SONAME 'libregr_mysql.so'; +CREATE OR REPLACE AGGREGATE FUNCTION regr_r2 RETURNS REAL SONAME 'libregr_mysql.so'; +CREATE OR REPLACE AGGREGATE FUNCTION corr RETURNS REAL SONAME 'libregr_mysql.so'; +CREATE OR REPLACE AGGREGATE FUNCTION regr_sxx RETURNS REAL SONAME 'libregr_mysql.so'; +CREATE OR REPLACE AGGREGATE FUNCTION regr_syy RETURNS REAL SONAME 'libregr_mysql.so'; +CREATE OR REPLACE AGGREGATE FUNCTION regr_sxy RETURNS REAL SONAME 'libregr_mysql.so'; +CREATE OR REPLACE AGGREGATE FUNCTION covar_pop RETURNS REAL SONAME 'libregr_mysql.so'; +CREATE OR REPLACE AGGREGATE FUNCTION covar_samp RETURNS REAL SONAME 'libregr_mysql.so'; +CREATE OR REPLACE AGGREGATE FUNCTION distinct_count RETURNS INTEGER SONAME 'libudf_mysql.so'; +CREATE OR REPLACE FUNCTION caldisablepartitions RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION calenablepartitions RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION caldroppartitions RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION calshowpartitions RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION caldroppartitionsbyvalue RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION caldisablepartitionsbyvalue RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION calenablepartitionsbyvalue RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE FUNCTION calshowpartitionsbyvalue RETURNS STRING SONAME 'ha_columnstore.so'; +CREATE OR REPLACE AGGREGATE FUNCTION moda RETURNS STRING SONAME 'libregr_mysql.so'; +CREATE OR REPLACE FUNCTION mcs_set_ddldebug_level RETURNS STRING SONAME 'ha_columnstore.so'; +--enable_query_log From 38a5a7edec03f6a0fe25b9b317221b73fdbd27ab Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Wed, 18 Jun 2025 18:01:51 +0300 Subject: [PATCH 48/79] Fix charset in MTR --- .../basic/r/MCOL-5744-utf8-in-ddl.result | 1 + .../basic/r/mcol641-aggregate.result | 1 + .../basic/r/mcs19_grant_revoke.result | 2 +- .../t/MCOL-5572-autoincrement-filtering.test | 1 + .../basic/t/MCOL-5744-utf8-in-ddl.test | 2 + ...artitioned-tables-in-crossengine-steps.opt | 1 + .../columnstore/basic/t/func_json_quote.test | 2 + mysql-test/columnstore/basic/t/mcol-5005.test | 1 + .../basic/t/mcol641-aggregate.test | 1 + .../columnstore/basic/t/mcol641-insert.opt | 1 + mysql-test/columnstore/basic/t/mcol_2000.test | 1 + .../basic/t/mcs117_create_utf8.test | 1 + .../basic/t/mcs12_alter_table.test | 2 +- .../basic/t/mcs13_alter_table_negative.test | 2 +- .../basic/t/mcs169_bin_functions.test | 1 + .../basic/t/mcs171_null_functions.test | 1 + .../basic/t/mcs173_coalesce_function.test | 1 + .../basic/t/mcs174_case_function.test | 1 + .../basic/t/mcs175_convert_functions.test | 1 + .../basic/t/mcs176_if_function.test | 1 + .../basic/t/mcs178_adddate_function.test | 1 + .../basic/t/mcs179_addtime_function.test | 1 + .../basic/t/mcs180_ascii_function.test | 1 + .../basic/t/mcs181_between_and.test | 1 + .../basic/t/mcs182_char_length_function.test | 1 + .../basic/t/mcs183_date_function.test | 1 + .../basic/t/mcs184_day_function.test | 1 + .../basic/t/mcs185_dayname_function.test | 1 + .../basic/t/mcs186_dayofyear_function.test | 1 + .../basic/t/mcs187_dayofmonth_function.test | 1 + .../basic/t/mcs19_grant_revoke.test | 4 +- .../basic/t/mcs1_create_table_data_types.test | 1 + .../basic/t/mcs229_data_compression_type.test | 1 + .../basic/t/mcs28_load_data_local_infile.test | 1 + .../mcs5_create_table_from_other_tables.test | 1 + .../basic/t/mcs74_check_constraint.test | 1 + .../t/mcs7_create_table_with_metadata.test | 1 + .../t/mcs8_create_table_with_constraints.test | 1 + mysql-test/columnstore/include/charset.inc | 5 ++ .../columnstore/include/syscatalog_mysql.sql | 46 +++++++++++++++++++ 40 files changed, 92 insertions(+), 5 deletions(-) create mode 100644 mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.opt create mode 100644 mysql-test/columnstore/basic/t/mcol641-insert.opt create mode 100644 mysql-test/columnstore/include/charset.inc create mode 100644 mysql-test/columnstore/include/syscatalog_mysql.sql diff --git a/mysql-test/columnstore/basic/r/MCOL-5744-utf8-in-ddl.result b/mysql-test/columnstore/basic/r/MCOL-5744-utf8-in-ddl.result index dfd4742cd..97a184f2e 100644 --- a/mysql-test/columnstore/basic/r/MCOL-5744-utf8-in-ddl.result +++ b/mysql-test/columnstore/basic/r/MCOL-5744-utf8-in-ddl.result @@ -1,5 +1,6 @@ DROP DATABASE IF EXISTS MCOL5744; CREATE DATABASE MCOL5744; +USE MCOL5744; SET old_mode=''; CREATE TABLE t(x text CHARACTER SET utf8 COLLATE utf8_general_ci) ENGINE=COLUMNSTORE; SHOW CREATE TABLE t; diff --git a/mysql-test/columnstore/basic/r/mcol641-aggregate.result b/mysql-test/columnstore/basic/r/mcol641-aggregate.result index 97f74000b..b16f2123d 100644 --- a/mysql-test/columnstore/basic/r/mcol641-aggregate.result +++ b/mysql-test/columnstore/basic/r/mcol641-aggregate.result @@ -497,3 +497,4 @@ DROP TABLE cs2; DROP TABLE cs3; DROP TABLE cs4; DROP TABLE cs5; +DROP DATABASE IF EXISTS test_mcol641_aggregate; diff --git a/mysql-test/columnstore/basic/r/mcs19_grant_revoke.result b/mysql-test/columnstore/basic/r/mcs19_grant_revoke.result index 6ab1854c4..9a7880b83 100644 --- a/mysql-test/columnstore/basic/r/mcs19_grant_revoke.result +++ b/mysql-test/columnstore/basic/r/mcs19_grant_revoke.result @@ -41,7 +41,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `col` int(11) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci +) ENGINE=InnoDB INSERT INTO t1 VALUES(1); SELECT * FROM t1; col diff --git a/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test b/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test index de9d88014..8d331cf40 100644 --- a/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test +++ b/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test @@ -1,5 +1,6 @@ --source ../include/have_columnstore.inc --source ../include/functions.inc +--source ../include/syscatalog_mysql.sql SET default_storage_engine=columnstore; diff --git a/mysql-test/columnstore/basic/t/MCOL-5744-utf8-in-ddl.test b/mysql-test/columnstore/basic/t/MCOL-5744-utf8-in-ddl.test index 60713bdc3..d7f83fe25 100644 --- a/mysql-test/columnstore/basic/t/MCOL-5744-utf8-in-ddl.test +++ b/mysql-test/columnstore/basic/t/MCOL-5744-utf8-in-ddl.test @@ -4,8 +4,10 @@ --disable_warnings DROP DATABASE IF EXISTS MCOL5744; --enable_warnings +--source ../include/charset.inc CREATE DATABASE MCOL5744; +USE MCOL5744; SET old_mode=''; diff --git a/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.opt b/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.opt new file mode 100644 index 000000000..d9562aa81 --- /dev/null +++ b/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.opt @@ -0,0 +1 @@ +--skip-partition=0 diff --git a/mysql-test/columnstore/basic/t/func_json_quote.test b/mysql-test/columnstore/basic/t/func_json_quote.test index cf08dae8e..8f87df9f4 100644 --- a/mysql-test/columnstore/basic/t/func_json_quote.test +++ b/mysql-test/columnstore/basic/t/func_json_quote.test @@ -1,4 +1,6 @@ --source ../include/have_columnstore.inc +--source ../include/charset.inc + --disable_warnings DROP DATABASE IF EXISTS json_quote_db; diff --git a/mysql-test/columnstore/basic/t/mcol-5005.test b/mysql-test/columnstore/basic/t/mcol-5005.test index 988a4ab16..fde196e9f 100644 --- a/mysql-test/columnstore/basic/t/mcol-5005.test +++ b/mysql-test/columnstore/basic/t/mcol-5005.test @@ -4,6 +4,7 @@ # --source ../include/have_columnstore.inc --source include/have_innodb.inc +--source ../include/charset.inc # # If the calpontsys database does not exist, let's create it. diff --git a/mysql-test/columnstore/basic/t/mcol641-aggregate.test b/mysql-test/columnstore/basic/t/mcol641-aggregate.test index fb0203088..642287152 100644 --- a/mysql-test/columnstore/basic/t/mcol641-aggregate.test +++ b/mysql-test/columnstore/basic/t/mcol641-aggregate.test @@ -221,3 +221,4 @@ DROP TABLE cs2; DROP TABLE cs3; DROP TABLE cs4; DROP TABLE cs5; +DROP DATABASE test_mcol641_aggregate; diff --git a/mysql-test/columnstore/basic/t/mcol641-insert.opt b/mysql-test/columnstore/basic/t/mcol641-insert.opt new file mode 100644 index 000000000..0b781d76f --- /dev/null +++ b/mysql-test/columnstore/basic/t/mcol641-insert.opt @@ -0,0 +1 @@ +--secure-file-priv='' diff --git a/mysql-test/columnstore/basic/t/mcol_2000.test b/mysql-test/columnstore/basic/t/mcol_2000.test index 42e9c5e0e..5dc47ad55 100644 --- a/mysql-test/columnstore/basic/t/mcol_2000.test +++ b/mysql-test/columnstore/basic/t/mcol_2000.test @@ -4,6 +4,7 @@ -- source ../include/have_columnstore.inc -- source include/have_innodb.inc +--source ../include/charset.inc -- disable_warnings drop database if exists test_mcol2000; diff --git a/mysql-test/columnstore/basic/t/mcs117_create_utf8.test b/mysql-test/columnstore/basic/t/mcs117_create_utf8.test index 0c11cab5b..3f7894408 100644 --- a/mysql-test/columnstore/basic/t/mcs117_create_utf8.test +++ b/mysql-test/columnstore/basic/t/mcs117_create_utf8.test @@ -4,6 +4,7 @@ # -- source ../include/have_columnstore.inc -- source ../include/detect_maxscale.inc +--source ../include/charset.inc set names utf8; diff --git a/mysql-test/columnstore/basic/t/mcs12_alter_table.test b/mysql-test/columnstore/basic/t/mcs12_alter_table.test index 69fa2c1ff..175086f43 100644 --- a/mysql-test/columnstore/basic/t/mcs12_alter_table.test +++ b/mysql-test/columnstore/basic/t/mcs12_alter_table.test @@ -4,7 +4,7 @@ -- source ../include/have_columnstore.inc -- source include/have_innodb.inc -- source ../include/check_maxscale.inc - +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs12_db1; diff --git a/mysql-test/columnstore/basic/t/mcs13_alter_table_negative.test b/mysql-test/columnstore/basic/t/mcs13_alter_table_negative.test index 0c4b86415..ade63563a 100644 --- a/mysql-test/columnstore/basic/t/mcs13_alter_table_negative.test +++ b/mysql-test/columnstore/basic/t/mcs13_alter_table_negative.test @@ -3,7 +3,7 @@ # -- source ../include/have_columnstore.inc -- source ../include/check_maxscale.inc - +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs13_db1; diff --git a/mysql-test/columnstore/basic/t/mcs169_bin_functions.test b/mysql-test/columnstore/basic/t/mcs169_bin_functions.test index e8722e85f..7c10c3ace 100644 --- a/mysql-test/columnstore/basic/t/mcs169_bin_functions.test +++ b/mysql-test/columnstore/basic/t/mcs169_bin_functions.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs169_db; diff --git a/mysql-test/columnstore/basic/t/mcs171_null_functions.test b/mysql-test/columnstore/basic/t/mcs171_null_functions.test index 6f814dd36..997678a13 100644 --- a/mysql-test/columnstore/basic/t/mcs171_null_functions.test +++ b/mysql-test/columnstore/basic/t/mcs171_null_functions.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs171_db; diff --git a/mysql-test/columnstore/basic/t/mcs173_coalesce_function.test b/mysql-test/columnstore/basic/t/mcs173_coalesce_function.test index 8a8df2c0e..424d447ea 100644 --- a/mysql-test/columnstore/basic/t/mcs173_coalesce_function.test +++ b/mysql-test/columnstore/basic/t/mcs173_coalesce_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs173_db; diff --git a/mysql-test/columnstore/basic/t/mcs174_case_function.test b/mysql-test/columnstore/basic/t/mcs174_case_function.test index 72afc4e7c..774461e89 100644 --- a/mysql-test/columnstore/basic/t/mcs174_case_function.test +++ b/mysql-test/columnstore/basic/t/mcs174_case_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs174_db; diff --git a/mysql-test/columnstore/basic/t/mcs175_convert_functions.test b/mysql-test/columnstore/basic/t/mcs175_convert_functions.test index f6e7c34c5..8d2830532 100644 --- a/mysql-test/columnstore/basic/t/mcs175_convert_functions.test +++ b/mysql-test/columnstore/basic/t/mcs175_convert_functions.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs175_db; diff --git a/mysql-test/columnstore/basic/t/mcs176_if_function.test b/mysql-test/columnstore/basic/t/mcs176_if_function.test index 6add1bffe..1889804dc 100644 --- a/mysql-test/columnstore/basic/t/mcs176_if_function.test +++ b/mysql-test/columnstore/basic/t/mcs176_if_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs176_db; diff --git a/mysql-test/columnstore/basic/t/mcs178_adddate_function.test b/mysql-test/columnstore/basic/t/mcs178_adddate_function.test index 71d278b50..d788f9bbb 100644 --- a/mysql-test/columnstore/basic/t/mcs178_adddate_function.test +++ b/mysql-test/columnstore/basic/t/mcs178_adddate_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs178_db; diff --git a/mysql-test/columnstore/basic/t/mcs179_addtime_function.test b/mysql-test/columnstore/basic/t/mcs179_addtime_function.test index 9fa1372b7..4081c3d98 100644 --- a/mysql-test/columnstore/basic/t/mcs179_addtime_function.test +++ b/mysql-test/columnstore/basic/t/mcs179_addtime_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs179_db; diff --git a/mysql-test/columnstore/basic/t/mcs180_ascii_function.test b/mysql-test/columnstore/basic/t/mcs180_ascii_function.test index b39ad622c..2904cd22e 100644 --- a/mysql-test/columnstore/basic/t/mcs180_ascii_function.test +++ b/mysql-test/columnstore/basic/t/mcs180_ascii_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs180_db; diff --git a/mysql-test/columnstore/basic/t/mcs181_between_and.test b/mysql-test/columnstore/basic/t/mcs181_between_and.test index a11282789..6a949a261 100644 --- a/mysql-test/columnstore/basic/t/mcs181_between_and.test +++ b/mysql-test/columnstore/basic/t/mcs181_between_and.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs181_db; diff --git a/mysql-test/columnstore/basic/t/mcs182_char_length_function.test b/mysql-test/columnstore/basic/t/mcs182_char_length_function.test index b46523fe8..a1de4382e 100644 --- a/mysql-test/columnstore/basic/t/mcs182_char_length_function.test +++ b/mysql-test/columnstore/basic/t/mcs182_char_length_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs182_db; diff --git a/mysql-test/columnstore/basic/t/mcs183_date_function.test b/mysql-test/columnstore/basic/t/mcs183_date_function.test index 322ffdc29..1a937f4c2 100644 --- a/mysql-test/columnstore/basic/t/mcs183_date_function.test +++ b/mysql-test/columnstore/basic/t/mcs183_date_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs183_db; diff --git a/mysql-test/columnstore/basic/t/mcs184_day_function.test b/mysql-test/columnstore/basic/t/mcs184_day_function.test index 74fcd3837..d23b3d4ea 100644 --- a/mysql-test/columnstore/basic/t/mcs184_day_function.test +++ b/mysql-test/columnstore/basic/t/mcs184_day_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs184_db; diff --git a/mysql-test/columnstore/basic/t/mcs185_dayname_function.test b/mysql-test/columnstore/basic/t/mcs185_dayname_function.test index 65f8bcbbb..4c0a61314 100644 --- a/mysql-test/columnstore/basic/t/mcs185_dayname_function.test +++ b/mysql-test/columnstore/basic/t/mcs185_dayname_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs185_db; diff --git a/mysql-test/columnstore/basic/t/mcs186_dayofyear_function.test b/mysql-test/columnstore/basic/t/mcs186_dayofyear_function.test index 9e0b2c274..afa475c38 100644 --- a/mysql-test/columnstore/basic/t/mcs186_dayofyear_function.test +++ b/mysql-test/columnstore/basic/t/mcs186_dayofyear_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs186_db; diff --git a/mysql-test/columnstore/basic/t/mcs187_dayofmonth_function.test b/mysql-test/columnstore/basic/t/mcs187_dayofmonth_function.test index bcd51b27a..4686b7480 100644 --- a/mysql-test/columnstore/basic/t/mcs187_dayofmonth_function.test +++ b/mysql-test/columnstore/basic/t/mcs187_dayofmonth_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs187_db; diff --git a/mysql-test/columnstore/basic/t/mcs19_grant_revoke.test b/mysql-test/columnstore/basic/t/mcs19_grant_revoke.test index f514756ef..4ae71180d 100644 --- a/mysql-test/columnstore/basic/t/mcs19_grant_revoke.test +++ b/mysql-test/columnstore/basic/t/mcs19_grant_revoke.test @@ -5,7 +5,7 @@ -- source ../include/have_columnstore.inc -- source include/have_innodb.inc -- source ../include/check_maxscale.inc - +--source ../include/charset.inc SET default_storage_engine=InnoDB; @@ -50,7 +50,7 @@ USE mcs19_db; --error ER_DBACCESS_DENIED_ERROR CREATE DATABASE mcs19_db1; CREATE TABLE t1(col INT) ENGINE=InnoDB; ---replace_regex /( COLLATE=latin1_swedish_ci)// +--replace_regex /(\ DEFAULT CHARSET(.*))// SHOW CREATE TABLE t1; INSERT INTO t1 VALUES(1); SELECT * FROM t1; diff --git a/mysql-test/columnstore/basic/t/mcs1_create_table_data_types.test b/mysql-test/columnstore/basic/t/mcs1_create_table_data_types.test index e0e630333..bacda2ef9 100644 --- a/mysql-test/columnstore/basic/t/mcs1_create_table_data_types.test +++ b/mysql-test/columnstore/basic/t/mcs1_create_table_data_types.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs1_db; diff --git a/mysql-test/columnstore/basic/t/mcs229_data_compression_type.test b/mysql-test/columnstore/basic/t/mcs229_data_compression_type.test index 3737eaa68..8e4e60ff3 100644 --- a/mysql-test/columnstore/basic/t/mcs229_data_compression_type.test +++ b/mysql-test/columnstore/basic/t/mcs229_data_compression_type.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/charset.inc # # If the calpontsys database does not exist, let's create it. diff --git a/mysql-test/columnstore/basic/t/mcs28_load_data_local_infile.test b/mysql-test/columnstore/basic/t/mcs28_load_data_local_infile.test index af2e11e78..6ab41785a 100755 --- a/mysql-test/columnstore/basic/t/mcs28_load_data_local_infile.test +++ b/mysql-test/columnstore/basic/t/mcs28_load_data_local_infile.test @@ -4,6 +4,7 @@ # -- source ../include/have_columnstore.inc --source ../include/detect_maxscale.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs28_db1; diff --git a/mysql-test/columnstore/basic/t/mcs5_create_table_from_other_tables.test b/mysql-test/columnstore/basic/t/mcs5_create_table_from_other_tables.test index c08c3aed3..acf966a28 100644 --- a/mysql-test/columnstore/basic/t/mcs5_create_table_from_other_tables.test +++ b/mysql-test/columnstore/basic/t/mcs5_create_table_from_other_tables.test @@ -3,6 +3,7 @@ # -- source ../include/have_columnstore.inc -- source include/have_innodb.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs5_db; diff --git a/mysql-test/columnstore/basic/t/mcs74_check_constraint.test b/mysql-test/columnstore/basic/t/mcs74_check_constraint.test index f1620cdc2..e25e9cf5c 100644 --- a/mysql-test/columnstore/basic/t/mcs74_check_constraint.test +++ b/mysql-test/columnstore/basic/t/mcs74_check_constraint.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs74_db; diff --git a/mysql-test/columnstore/basic/t/mcs7_create_table_with_metadata.test b/mysql-test/columnstore/basic/t/mcs7_create_table_with_metadata.test index dabd48eb0..3e511991a 100644 --- a/mysql-test/columnstore/basic/t/mcs7_create_table_with_metadata.test +++ b/mysql-test/columnstore/basic/t/mcs7_create_table_with_metadata.test @@ -2,6 +2,7 @@ #Test CREATE TABLE with metadata # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs7_db; diff --git a/mysql-test/columnstore/basic/t/mcs8_create_table_with_constraints.test b/mysql-test/columnstore/basic/t/mcs8_create_table_with_constraints.test index d5ef1fcf1..4144423d0 100644 --- a/mysql-test/columnstore/basic/t/mcs8_create_table_with_constraints.test +++ b/mysql-test/columnstore/basic/t/mcs8_create_table_with_constraints.test @@ -2,6 +2,7 @@ #Test CREATE TABLE with all supported constraints in Columnstore # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs8_db; diff --git a/mysql-test/columnstore/include/charset.inc b/mysql-test/columnstore/include/charset.inc new file mode 100644 index 000000000..15c273e8e --- /dev/null +++ b/mysql-test/columnstore/include/charset.inc @@ -0,0 +1,5 @@ +--disable_query_log +SET character_set_server = 'utf8mb3'; +SET collation_server = 'utf8mb3_general_ci'; +--enable_query_log + diff --git a/mysql-test/columnstore/include/syscatalog_mysql.sql b/mysql-test/columnstore/include/syscatalog_mysql.sql new file mode 100644 index 000000000..551efa69f --- /dev/null +++ b/mysql-test/columnstore/include/syscatalog_mysql.sql @@ -0,0 +1,46 @@ +--disable_query_log +create database if not exists calpontsys; + +use calpontsys; + +drop table if exists systable restrict; +drop table if exists syscolumn restrict; + +create table if not exists systable (tablename varchar(128), + `schema` varchar(128), + objectid int, + createdate date, + lastupdate date, + init int, + next int, + numofrows int, + avgrowlen int, + numofblocks int, + autoincrement int, + auxcolumnoid int not null default 0) engine=columnstore comment='SCHEMA SYNC ONLY'; + +create table if not exists syscolumn (`schema` varchar(128), + tablename varchar(128), + columnname varchar(128), + objectid integer, + dictobjectid integer, + listobjectid integer, + treeobjectid integer, + datatype integer, + columnlength integer, + columnposition integer, + lastupdate date, + defaultvalue varchar(64), + nullable integer, + scale integer, + prec integer, + autoincrement char(1), + distcount integer, + nullcount integer, + minvalue varchar(64), + `maxvalue` varchar(64), + compressiontype integer, + nextvalue bigint, + charsetnum int not null default 0) engine=columnstore comment='SCHEMA SYNC ONLY'; + +--enable_query_log From 2d400d919d5b36a2e38382b16abb7facf8d8df64 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Thu, 19 Jun 2025 15:02:46 +0300 Subject: [PATCH 49/79] add have_inndb to MTR --- mysql-test/columnstore/basic/r/mcol641-aggregate.result | 2 +- ...COL-5886-use-of-partitioned-tables-in-crossengine-steps.test | 2 ++ mysql-test/columnstore/basic/t/mcs22_insert_ignore.test | 1 + mysql-test/columnstore/basic/t/mcs_named_udfs.test | 2 ++ mysql-test/columnstore/bugfixes/mcol_4622.test | 1 + 5 files changed, 7 insertions(+), 1 deletion(-) diff --git a/mysql-test/columnstore/basic/r/mcol641-aggregate.result b/mysql-test/columnstore/basic/r/mcol641-aggregate.result index b16f2123d..bf2ec4f80 100644 --- a/mysql-test/columnstore/basic/r/mcol641-aggregate.result +++ b/mysql-test/columnstore/basic/r/mcol641-aggregate.result @@ -497,4 +497,4 @@ DROP TABLE cs2; DROP TABLE cs3; DROP TABLE cs4; DROP TABLE cs5; -DROP DATABASE IF EXISTS test_mcol641_aggregate; +DROP DATABASE test_mcol641_aggregate; diff --git a/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.test b/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.test index 64ff80efa..ea4726ca9 100644 --- a/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.test +++ b/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.test @@ -1,3 +1,5 @@ +-- source ../include/have_columnstore.inc +--source include/have_innodb.inc --disable_warnings DROP DATABASE IF EXISTS MCOL5886; --enable_warnings diff --git a/mysql-test/columnstore/basic/t/mcs22_insert_ignore.test b/mysql-test/columnstore/basic/t/mcs22_insert_ignore.test index b0120cf5e..8e15e1b6f 100644 --- a/mysql-test/columnstore/basic/t/mcs22_insert_ignore.test +++ b/mysql-test/columnstore/basic/t/mcs22_insert_ignore.test @@ -3,6 +3,7 @@ # Author: Susil, susil.behera@mariadb.com # -- source ../include/have_columnstore.inc +--source include/have_innodb.inc --disable_warnings DROP DATABASE IF EXISTS mcs22_db; diff --git a/mysql-test/columnstore/basic/t/mcs_named_udfs.test b/mysql-test/columnstore/basic/t/mcs_named_udfs.test index d8ab21388..84859b2c6 100644 --- a/mysql-test/columnstore/basic/t/mcs_named_udfs.test +++ b/mysql-test/columnstore/basic/t/mcs_named_udfs.test @@ -1,4 +1,6 @@ -- source ../include/have_columnstore.inc +--source ../include/functions.inc + --disable_warnings DROP DATABASE IF EXISTS cal_test_db; diff --git a/mysql-test/columnstore/bugfixes/mcol_4622.test b/mysql-test/columnstore/bugfixes/mcol_4622.test index 862f43239..b4b164fad 100644 --- a/mysql-test/columnstore/bugfixes/mcol_4622.test +++ b/mysql-test/columnstore/bugfixes/mcol_4622.test @@ -1,4 +1,5 @@ -- source ../include/have_columnstore.inc +--source include/have_innodb.inc --disable_warnings DROP DATABASE IF EXISTS mcol_4622; --enable_warnings From e9c6c6b5d34163a001b054a9d0dd7d01b996c826 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Thu, 19 Jun 2025 18:37:54 +0300 Subject: [PATCH 50/79] enable sequence engine in the mcol-4786 test --- mysql-test/columnstore/basic/r/analyze_table.result | 6 ++++++ ...886-use-of-partitioned-tables-in-crossengine-steps.opt | 2 ++ mysql-test/columnstore/basic/t/analyze_table.test | 8 ++++---- mysql-test/columnstore/bugfixes/mcol-4786.opt | 1 + 4 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 mysql-test/columnstore/bugfixes/mcol-4786.opt diff --git a/mysql-test/columnstore/basic/r/analyze_table.result b/mysql-test/columnstore/basic/r/analyze_table.result index 65fd380e0..0086a049d 100644 --- a/mysql-test/columnstore/basic/r/analyze_table.result +++ b/mysql-test/columnstore/basic/r/analyze_table.result @@ -6,20 +6,26 @@ insert into t1 values (1, 2, 3), (2, 2, 2), (2, 3, 4); analyze table t1; Table Op Msg_type Msg_text analyze_table_db.t1 analyze status OK +analyze_table_db.t1 analyze status Engine-independent statistics collected create table t2 (a int, b double) engine=columnstore; insert into t2 values (2, 3), (3, 4); analyze table t2; Table Op Msg_type Msg_text analyze_table_db.t2 analyze status OK +analyze_table_db.t2 analyze status Engine-independent statistics collected create table t3 (a varchar(25)) engine=columnstore; insert into t3 values ("a"), ("b"); analyze table t3; Table Op Msg_type Msg_text +analyze_table_db.t3 analyze status Engine-independent statistics collected analyze_table_db.t3 analyze status OK analyze table t1, t2, t3; Table Op Msg_type Msg_text +analyze_table_db.t1 analyze status Engine-independent statistics collected analyze_table_db.t1 analyze status OK +analyze_table_db.t2 analyze status Engine-independent statistics collected analyze_table_db.t2 analyze status OK +analyze_table_db.t3 analyze status Engine-independent statistics collected analyze_table_db.t3 analyze status OK DROP TABLE t1; DROP TABLE t2; diff --git a/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.opt b/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.opt index d9562aa81..02b69515b 100644 --- a/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.opt +++ b/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.opt @@ -1 +1,3 @@ --skip-partition=0 +--skip-sequence=0 + diff --git a/mysql-test/columnstore/basic/t/analyze_table.test b/mysql-test/columnstore/basic/t/analyze_table.test index 217b24920..a65ec3711 100644 --- a/mysql-test/columnstore/basic/t/analyze_table.test +++ b/mysql-test/columnstore/basic/t/analyze_table.test @@ -9,18 +9,18 @@ USE analyze_table_db; create table t1 (a int, b int, c int) engine=columnstore; insert into t1 values (1, 2, 3), (2, 2, 2), (2, 3, 4); -analyze table t1; +analyze table t1 PERSISTENT FOR ALL; create table t2 (a int, b double) engine=columnstore; insert into t2 values (2, 3), (3, 4); -analyze table t2; +analyze table t2 PERSISTENT FOR ALL; create table t3 (a varchar(25)) engine=columnstore; insert into t3 values ("a"), ("b"); -analyze table t3; +analyze table t3 PERSISTENT FOR ALL; -analyze table t1, t2, t3; +analyze table t1, t2, t3 PERSISTENT FOR ALL; DROP TABLE t1; DROP TABLE t2; diff --git a/mysql-test/columnstore/bugfixes/mcol-4786.opt b/mysql-test/columnstore/bugfixes/mcol-4786.opt new file mode 100644 index 000000000..bedbaf7de --- /dev/null +++ b/mysql-test/columnstore/bugfixes/mcol-4786.opt @@ -0,0 +1 @@ +--skip-sequence=0 From 5831f578fe616a1efc8d438eb331fb6ce058b0f1 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Fri, 20 Jun 2025 01:08:57 +0300 Subject: [PATCH 51/79] set charset in the mcs271_substring_index_function MTR test --- .../columnstore/basic/t/mcs271_substring_index_function.test | 1 + 1 file changed, 1 insertion(+) diff --git a/mysql-test/columnstore/basic/t/mcs271_substring_index_function.test b/mysql-test/columnstore/basic/t/mcs271_substring_index_function.test index 9ae4e0409..478b73def 100644 --- a/mysql-test/columnstore/basic/t/mcs271_substring_index_function.test +++ b/mysql-test/columnstore/basic/t/mcs271_substring_index_function.test @@ -3,6 +3,7 @@ # Author: Bharath, bharath.bokka@mariadb.com # -- source ../include/have_columnstore.inc +--source ../include/charset.inc --disable_warnings DROP DATABASE IF EXISTS mcs271_db; From 9d4173e3a879e149a5924304c4a6d902658d3c4e Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Fri, 20 Jun 2025 01:31:10 +0300 Subject: [PATCH 52/79] enable engnes for the test MCOL-5776-GROUP-BY-HAVING-functions-use --- .../bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.opt | 3 +++ .../bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.opt diff --git a/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.opt b/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.opt new file mode 100644 index 000000000..02b69515b --- /dev/null +++ b/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.opt @@ -0,0 +1,3 @@ +--skip-partition=0 +--skip-sequence=0 + diff --git a/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test b/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test index 129bfcbc2..7efed5121 100644 --- a/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test +++ b/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test @@ -1,3 +1,6 @@ +--source ../include/have_columnstore.inc +--source include/have_innodb.inc + --disable_warnings DROP DATABASE IF EXISTS MCOL5776; --enable_warnings From c0307b66367870367f637911ac8432348031ad07 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Fri, 20 Jun 2025 14:14:28 +0300 Subject: [PATCH 53/79] Fix analize_table test --- mysql-test/columnstore/basic/r/analyze_table.result | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mysql-test/columnstore/basic/r/analyze_table.result b/mysql-test/columnstore/basic/r/analyze_table.result index 0086a049d..08d8031e0 100644 --- a/mysql-test/columnstore/basic/r/analyze_table.result +++ b/mysql-test/columnstore/basic/r/analyze_table.result @@ -3,23 +3,23 @@ CREATE DATABASE analyze_table_db; USE analyze_table_db; create table t1 (a int, b int, c int) engine=columnstore; insert into t1 values (1, 2, 3), (2, 2, 2), (2, 3, 4); -analyze table t1; +analyze table t1 PERSISTENT FOR ALL; Table Op Msg_type Msg_text -analyze_table_db.t1 analyze status OK analyze_table_db.t1 analyze status Engine-independent statistics collected +analyze_table_db.t1 analyze status OK create table t2 (a int, b double) engine=columnstore; insert into t2 values (2, 3), (3, 4); -analyze table t2; +analyze table t2 PERSISTENT FOR ALL; Table Op Msg_type Msg_text -analyze_table_db.t2 analyze status OK analyze_table_db.t2 analyze status Engine-independent statistics collected +analyze_table_db.t2 analyze status OK create table t3 (a varchar(25)) engine=columnstore; insert into t3 values ("a"), ("b"); -analyze table t3; +analyze table t3 PERSISTENT FOR ALL; Table Op Msg_type Msg_text analyze_table_db.t3 analyze status Engine-independent statistics collected analyze_table_db.t3 analyze status OK -analyze table t1, t2, t3; +analyze table t1, t2, t3 PERSISTENT FOR ALL; Table Op Msg_type Msg_text analyze_table_db.t1 analyze status Engine-independent statistics collected analyze_table_db.t1 analyze status OK From a61325f780654150dea0a38639c3f417140c5b02 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Fri, 20 Jun 2025 18:00:35 +0300 Subject: [PATCH 54/79] dusable warings in the includes for MTR --- mysql-test/columnstore/include/syscatalog_mysql.sql | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mysql-test/columnstore/include/syscatalog_mysql.sql b/mysql-test/columnstore/include/syscatalog_mysql.sql index 551efa69f..ef2b22039 100644 --- a/mysql-test/columnstore/include/syscatalog_mysql.sql +++ b/mysql-test/columnstore/include/syscatalog_mysql.sql @@ -1,4 +1,5 @@ --disable_query_log +--disable_warnings create database if not exists calpontsys; use calpontsys; @@ -43,4 +44,6 @@ create table if not exists syscolumn (`schema` varchar(128), nextvalue bigint, charsetnum int not null default 0) engine=columnstore comment='SCHEMA SYNC ONLY'; +--enable_warnings --enable_query_log + From 7f7552e896432d2b72cbe9cc76f4198423b604e3 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Fri, 20 Jun 2025 18:18:46 +0300 Subject: [PATCH 55/79] add functions loading to the MCOL-5776-GROUP-BY-HAVING-functions test --- .../bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test | 1 + 1 file changed, 1 insertion(+) diff --git a/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test b/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test index 7efed5121..99c91b68d 100644 --- a/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test +++ b/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test @@ -1,5 +1,6 @@ --source ../include/have_columnstore.inc --source include/have_innodb.inc +--source ../include/functions.inc --disable_warnings DROP DATABASE IF EXISTS MCOL5776; From 3d64026d0a5c8ed89d167e7cb1e051f06a8c6574 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Sun, 22 Jun 2025 00:47:44 +0300 Subject: [PATCH 56/79] add cleanups to MTR --- .../MCOL-5572-autoincrement-filtering.result | 1 + .../basic/r/mcs13_alter_table_negative.result | 1 + .../t/MCOL-5572-autoincrement-filtering.test | 3 +- .../columnstore/basic/t/cal_named_udfs.test | 1 + .../basic/t/mcs13_alter_table_negative.test | 1 + .../basic/t/mcs98_moda_function.test | 2 +- .../columnstore/basic/t/mcs_named_udfs.test | 1 + ...OL-5776-GROUP-BY-HAVING-functions-use.test | 1 + ...ol-4741-strings-ranges-are-unsigned.result | 1 + ...mcol-4741-strings-ranges-are-unsigned.test | 2 +- .../columnstore/bugfixes/mcol-5074.result | 1 + .../columnstore/bugfixes/mcol-5074.test | 1 + .../columnstore/bugfixes/mcol-5669.result | 1 + .../columnstore/bugfixes/mcol-5669.test | 1 + .../columnstore/bugfixes/mcol_4465.test | 1 + .../columnstore/include/drop_functions.inc | 63 +++++++++++++++++++ 16 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 mysql-test/columnstore/include/drop_functions.inc diff --git a/mysql-test/columnstore/basic/r/MCOL-5572-autoincrement-filtering.result b/mysql-test/columnstore/basic/r/MCOL-5572-autoincrement-filtering.result index f638c9e48..63263c955 100644 --- a/mysql-test/columnstore/basic/r/MCOL-5572-autoincrement-filtering.result +++ b/mysql-test/columnstore/basic/r/MCOL-5572-autoincrement-filtering.result @@ -18,3 +18,4 @@ select tablename, autoincrement, nextvalue from calpontsys.syscolumn where autoi tablename autoincrement nextvalue foo n 1 DROP DATABASE mcol5572; +DROP DATABASE calpontsys; diff --git a/mysql-test/columnstore/basic/r/mcs13_alter_table_negative.result b/mysql-test/columnstore/basic/r/mcs13_alter_table_negative.result index 288952088..2ce6f1013 100644 --- a/mysql-test/columnstore/basic/r/mcs13_alter_table_negative.result +++ b/mysql-test/columnstore/basic/r/mcs13_alter_table_negative.result @@ -58,3 +58,4 @@ a c1 disconnect addconroot1; disconnect addconroot2; DROP DATABASE mcs13_db1; +DROP DATABASE mcs13_db2; diff --git a/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test b/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test index 8d331cf40..bee2d5a99 100644 --- a/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test +++ b/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test @@ -21,4 +21,5 @@ select tablename, autoincrement, nextvalue from calpontsys.syscolumn where autoi select tablename, autoincrement, nextvalue from calpontsys.syscolumn where autoincrement = 'n' and `schema`='mcol5572' and tablename='foo'; DROP DATABASE mcol5572; - +--source ../include/drop_functions.inc +DROP DATABASE calpontsys; diff --git a/mysql-test/columnstore/basic/t/cal_named_udfs.test b/mysql-test/columnstore/basic/t/cal_named_udfs.test index d097511b8..bd03af5bc 100644 --- a/mysql-test/columnstore/basic/t/cal_named_udfs.test +++ b/mysql-test/columnstore/basic/t/cal_named_udfs.test @@ -24,3 +24,4 @@ select calgetsqlcount(); DROP TABLE t1; DROP DATABASE cal_test_db; +--source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/basic/t/mcs13_alter_table_negative.test b/mysql-test/columnstore/basic/t/mcs13_alter_table_negative.test index ade63563a..52d08f77c 100644 --- a/mysql-test/columnstore/basic/t/mcs13_alter_table_negative.test +++ b/mysql-test/columnstore/basic/t/mcs13_alter_table_negative.test @@ -83,6 +83,7 @@ disconnect addconroot2; --disable_warnings DROP DATABASE mcs13_db1; +DROP DATABASE mcs13_db2; --enable_warnings # diff --git a/mysql-test/columnstore/basic/t/mcs98_moda_function.test b/mysql-test/columnstore/basic/t/mcs98_moda_function.test index 148f355b4..9b02a79a2 100644 --- a/mysql-test/columnstore/basic/t/mcs98_moda_function.test +++ b/mysql-test/columnstore/basic/t/mcs98_moda_function.test @@ -101,4 +101,4 @@ SELECT moda(floor(rl)) FROM t2; SELECT t, moda(tu) 'q1' FROM t2 GROUP BY t HAVING moda(tu) > 5; # Clean UP DROP DATABASE mcs98_db; - +--source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/basic/t/mcs_named_udfs.test b/mysql-test/columnstore/basic/t/mcs_named_udfs.test index 84859b2c6..00ca03aa5 100644 --- a/mysql-test/columnstore/basic/t/mcs_named_udfs.test +++ b/mysql-test/columnstore/basic/t/mcs_named_udfs.test @@ -25,3 +25,4 @@ select mcslastinsertid("t1"); DROP TABLE t1; DROP DATABASE cal_test_db; +--source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test b/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test index 99c91b68d..0edfd7823 100644 --- a/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test +++ b/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test @@ -103,3 +103,4 @@ INSERT INTO t(k) VALUES (1), (2), (2), (3), (3), (4), (4),(4),(4),(4),(995), (NU SELECT k + k a FROM t GROUP BY a HAVING a >= 8; DROP DATABASE MCOL5776; +--source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.result b/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.result index c9e2db639..b3dcfdb62 100644 --- a/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.result +++ b/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.result @@ -10,3 +10,4 @@ LOAD DATA LOCAL infile 'MTR_SUITE_DIR/../std_data/mcol-4741-part-2-empty-strings SELECT COUNT(*) FROM t WHERE x='val'; COUNT(*) 2 +DROP DATABASE db4741; diff --git a/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.test b/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.test index 31311d992..a3d2222a9 100644 --- a/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.test +++ b/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.test @@ -16,4 +16,4 @@ SELECT COUNT(*) FROM t WHERE x='val'; --eval LOAD DATA LOCAL infile '$MTR_SUITE_DIR/../std_data/mcol-4741-part-2-empty-strings.txt' INTO TABLE t SELECT COUNT(*) FROM t WHERE x='val'; - +DROP DATABASE db4741; diff --git a/mysql-test/columnstore/bugfixes/mcol-5074.result b/mysql-test/columnstore/bugfixes/mcol-5074.result index 772bf7a21..87c51361d 100644 --- a/mysql-test/columnstore/bugfixes/mcol-5074.result +++ b/mysql-test/columnstore/bugfixes/mcol-5074.result @@ -32,3 +32,4 @@ Partner 5 2021-12-11 2 NULL NULL NULL Person Focal Group 4 2021-12-11 NULL NULL NULL 4 PFG 4 2021-12-11 NULL NULL NULL NULL Retail 4 2021-12-12 NULL 1 NULL NULL +DROP DATABASE mcol_5074_db; diff --git a/mysql-test/columnstore/bugfixes/mcol-5074.test b/mysql-test/columnstore/bugfixes/mcol-5074.test index aed1ff750..949210734 100644 --- a/mysql-test/columnstore/bugfixes/mcol-5074.test +++ b/mysql-test/columnstore/bugfixes/mcol-5074.test @@ -40,4 +40,5 @@ select case when da.mtn in ('PFG','Person Focal Group') then count( acct_id) end + case when da.mtn = 'Person Focal Group' then count( acct_id) end as PFG_active_accounts from accnt da group by mtn, accts, act_created_dt order by mtn; + DROP DATABASE mcol_5074_db; diff --git a/mysql-test/columnstore/bugfixes/mcol-5669.result b/mysql-test/columnstore/bugfixes/mcol-5669.result index 661bd51c2..bb99111c4 100644 --- a/mysql-test/columnstore/bugfixes/mcol-5669.result +++ b/mysql-test/columnstore/bugfixes/mcol-5669.result @@ -111,3 +111,4 @@ di_source_id brand_sku_id adjusted_dtm is_sit sit_uom sales_uom_daily_average 5304 1004 2024-01-01 1 0.2434 0.00000000 5389 1004 2024-01-01 1 0.2074 0.00000000 DROP DATABASE mcol_5669; +REVOKE ALL PRIVILEGES ON *.* FROM 'cejuser'@'localhost'; diff --git a/mysql-test/columnstore/bugfixes/mcol-5669.test b/mysql-test/columnstore/bugfixes/mcol-5669.test index 70f1b21d5..1506e0a34 100644 --- a/mysql-test/columnstore/bugfixes/mcol-5669.test +++ b/mysql-test/columnstore/bugfixes/mcol-5669.test @@ -110,3 +110,4 @@ INSERT INTO `zzz_999999` VALUES ('2023-12-18',5298,684963,1004,1,1,2166,1.000),( ) as z; DROP DATABASE mcol_5669; +REVOKE ALL PRIVILEGES ON *.* FROM 'cejuser'@'localhost'; diff --git a/mysql-test/columnstore/bugfixes/mcol_4465.test b/mysql-test/columnstore/bugfixes/mcol_4465.test index 25503f6d5..6339eced9 100644 --- a/mysql-test/columnstore/bugfixes/mcol_4465.test +++ b/mysql-test/columnstore/bugfixes/mcol_4465.test @@ -10,3 +10,4 @@ INSERT INTO cs1 VALUES('i',0),('i',0),('ii',0); SELECT c,regr_count(d,length(c)) f FROM cs1 GROUP BY 1 ORDER BY 1; SELECT * FROM (SELECT c,regr_count(d,length(c)) f FROM cs1 GROUP BY 1 ORDER BY 1)a; DROP DATABASE mcol_4465; +--source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/include/drop_functions.inc b/mysql-test/columnstore/include/drop_functions.inc new file mode 100644 index 000000000..a55af261c --- /dev/null +++ b/mysql-test/columnstore/include/drop_functions.inc @@ -0,0 +1,63 @@ +--disable_query_log +DROP FUNCTION mcsgetstats; +DROP FUNCTION calgetstats; +DROP FUNCTION mcssettrace; +DROP FUNCTION calsettrace; +DROP FUNCTION mcssetparms; +DROP FUNCTION calsetparms; +DROP FUNCTION mcsflushcache; +DROP FUNCTION calflushcache; +DROP FUNCTION mcsgettrace; +DROP FUNCTION calgettrace; +DROP FUNCTION mcsgetversion; +DROP FUNCTION calgetversion; +DROP FUNCTION calonlinealter; +DROP FUNCTION mcsviewtablelock; +DROP FUNCTION calviewtablelock; +DROP FUNCTION mcscleartablelock; +DROP FUNCTION calcleartablelock; +DROP FUNCTION mcslastinsertid; +DROP FUNCTION callastinsertid; +DROP FUNCTION mcsgetsqlcount; +DROP FUNCTION calgetsqlcount; +DROP FUNCTION idbpm; +DROP FUNCTION idbdbroot; +DROP FUNCTION idbsegment; +DROP FUNCTION idbsegmentdir; +DROP FUNCTION idbextentrelativerid; +DROP FUNCTION idbblockid; +DROP FUNCTION idbextentid; +DROP FUNCTION idbextentmin; +DROP FUNCTION idbextentmax; +DROP FUNCTION idbpartition; +DROP FUNCTION idblocalpm; +DROP FUNCTION mcssystemready; +DROP FUNCTION mcssystemreadonly; +DROP FUNCTION mcssystemprimary; +DROP FUNCTION mcs_emindex_size; +DROP FUNCTION mcs_emindex_free; +DROP FUNCTION columnstore_dataload; +DROP FUNCTION regr_avgx; +DROP FUNCTION regr_avgy; +DROP FUNCTION regr_count; +DROP FUNCTION regr_slope; +DROP FUNCTION regr_intercept; +DROP FUNCTION regr_r2; +DROP FUNCTION corr; +DROP FUNCTION regr_sxx; +DROP FUNCTION regr_syy; +DROP FUNCTION regr_sxy; +DROP FUNCTION covar_pop; +DROP FUNCTION covar_samp; +DROP FUNCTION distinct_count; +DROP FUNCTION caldisablepartitions; +DROP FUNCTION calenablepartitions; +DROP FUNCTION caldroppartitions; +DROP FUNCTION calshowpartitions; +DROP FUNCTION caldroppartitionsbyvalue; +DROP FUNCTION caldisablepartitionsbyvalue; +DROP FUNCTION calenablepartitionsbyvalue; +DROP FUNCTION calshowpartitionsbyvalue; +DROP FUNCTION moda; +DROP FUNCTION mcs_set_ddldebug_level; +--enable_query_log From bdf0a956ffdda9be8ef37e454d6d1b5d821d14fd Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Mon, 23 Jun 2025 15:06:25 +0300 Subject: [PATCH 57/79] Fix MCOL-5572-autoincrement-filtering test --- .../columnstore/basic/r/MCOL-5572-autoincrement-filtering.result | 1 - .../columnstore/basic/t/MCOL-5572-autoincrement-filtering.test | 1 - 2 files changed, 2 deletions(-) diff --git a/mysql-test/columnstore/basic/r/MCOL-5572-autoincrement-filtering.result b/mysql-test/columnstore/basic/r/MCOL-5572-autoincrement-filtering.result index 63263c955..f638c9e48 100644 --- a/mysql-test/columnstore/basic/r/MCOL-5572-autoincrement-filtering.result +++ b/mysql-test/columnstore/basic/r/MCOL-5572-autoincrement-filtering.result @@ -18,4 +18,3 @@ select tablename, autoincrement, nextvalue from calpontsys.syscolumn where autoi tablename autoincrement nextvalue foo n 1 DROP DATABASE mcol5572; -DROP DATABASE calpontsys; diff --git a/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test b/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test index bee2d5a99..aef1b6f75 100644 --- a/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test +++ b/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test @@ -22,4 +22,3 @@ select tablename, autoincrement, nextvalue from calpontsys.syscolumn where autoi DROP DATABASE mcol5572; --source ../include/drop_functions.inc -DROP DATABASE calpontsys; From f277a1f3d0e4dd7039db7e191258b421e3ccecbd Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Mon, 23 Jun 2025 17:34:26 +0300 Subject: [PATCH 58/79] fix MCOL-5886-use-of-partitioned-tables-in-crossengine-steps test --- ...5886-use-of-partitioned-tables-in-crossengine-steps.result | 2 ++ ...OL-5886-use-of-partitioned-tables-in-crossengine-steps.opt | 1 - ...L-5886-use-of-partitioned-tables-in-crossengine-steps.test | 4 +++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/mysql-test/columnstore/basic/r/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.result b/mysql-test/columnstore/basic/r/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.result index 07db35568..7676dc807 100644 --- a/mysql-test/columnstore/basic/r/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.result +++ b/mysql-test/columnstore/basic/r/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.result @@ -13,3 +13,5 @@ COUNT(*) SELECT COUNT(*) FROM (SELECT * FROM t2 UNION ALL SELECT * FROM t1 PARTITION (p0)) tt; COUNT(*) 20 +REVOKE ALL PRIVILEGES ON *.* FROM 'cejuser'@'localhost'; +DROP DATABASE MCOL5886; diff --git a/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.opt b/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.opt index 02b69515b..ba0d1d133 100644 --- a/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.opt +++ b/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.opt @@ -1,3 +1,2 @@ --skip-partition=0 --skip-sequence=0 - diff --git a/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.test b/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.test index ea4726ca9..af3fbff86 100644 --- a/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.test +++ b/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.test @@ -8,6 +8,7 @@ USE MCOL5886; --exec $MCS_MCSSETCONFIG CrossEngineSupport User 'cejuser' --exec $MCS_MCSSETCONFIG CrossEngineSupport Password 'Vagrant1|0000001' +--exec $MCS_MCSSETCONFIG CrossEngineSupport Port $MASTER_MYPORT --disable_warnings CREATE USER IF NOT EXISTS'cejuser'@'localhost' IDENTIFIED BY 'Vagrant1|0000001'; @@ -23,4 +24,5 @@ CREATE TABLE IF NOT EXISTS t2 ( a DECIMAL(12, 2), b int ) ENGINE=COLUMNSTORE; SELECT COUNT(*) FROM (SELECT * FROM t1 PARTITION (p0)) tt; SELECT COUNT(*) FROM (SELECT * FROM t2 UNION ALL SELECT * FROM t1 PARTITION (p0)) tt; - +REVOKE ALL PRIVILEGES ON *.* FROM 'cejuser'@'localhost'; +DROP DATABASE MCOL5886; From 069bdf47f57401a1ba22ef39a50c24f30e991fdd Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Mon, 23 Jun 2025 23:17:33 +0300 Subject: [PATCH 59/79] fix MCOL-5572-autoincrement-filtering and mcol-5669 tests --- ...-5886-use-of-partitioned-tables-in-crossengine-steps.result | 1 + ...OL-5886-use-of-partitioned-tables-in-crossengine-steps.test | 1 + mysql-test/columnstore/bugfixes/mcol-5669.result | 2 ++ mysql-test/columnstore/bugfixes/mcol-5669.test | 3 +++ 4 files changed, 7 insertions(+) diff --git a/mysql-test/columnstore/basic/r/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.result b/mysql-test/columnstore/basic/r/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.result index 7676dc807..a7e29c42a 100644 --- a/mysql-test/columnstore/basic/r/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.result +++ b/mysql-test/columnstore/basic/r/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.result @@ -14,4 +14,5 @@ SELECT COUNT(*) FROM (SELECT * FROM t2 UNION ALL SELECT * FROM t1 PARTITION (p0) COUNT(*) 20 REVOKE ALL PRIVILEGES ON *.* FROM 'cejuser'@'localhost'; +DROP USER 'cejuser'@'localhost'; DROP DATABASE MCOL5886; diff --git a/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.test b/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.test index af3fbff86..fbd3b3041 100644 --- a/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.test +++ b/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.test @@ -25,4 +25,5 @@ SELECT COUNT(*) FROM (SELECT * FROM t1 PARTITION (p0)) tt; SELECT COUNT(*) FROM (SELECT * FROM t2 UNION ALL SELECT * FROM t1 PARTITION (p0)) tt; REVOKE ALL PRIVILEGES ON *.* FROM 'cejuser'@'localhost'; +DROP USER 'cejuser'@'localhost'; DROP DATABASE MCOL5886; diff --git a/mysql-test/columnstore/bugfixes/mcol-5669.result b/mysql-test/columnstore/bugfixes/mcol-5669.result index bb99111c4..33eabaf91 100644 --- a/mysql-test/columnstore/bugfixes/mcol-5669.result +++ b/mysql-test/columnstore/bugfixes/mcol-5669.result @@ -112,3 +112,5 @@ di_source_id brand_sku_id adjusted_dtm is_sit sit_uom sales_uom_daily_average 5389 1004 2024-01-01 1 0.2074 0.00000000 DROP DATABASE mcol_5669; REVOKE ALL PRIVILEGES ON *.* FROM 'cejuser'@'localhost'; +DROP USER 'cejuser'@'localhost'; + diff --git a/mysql-test/columnstore/bugfixes/mcol-5669.test b/mysql-test/columnstore/bugfixes/mcol-5669.test index 1506e0a34..890d750d7 100644 --- a/mysql-test/columnstore/bugfixes/mcol-5669.test +++ b/mysql-test/columnstore/bugfixes/mcol-5669.test @@ -111,3 +111,6 @@ INSERT INTO `zzz_999999` VALUES ('2023-12-18',5298,684963,1004,1,1,2166,1.000),( DROP DATABASE mcol_5669; REVOKE ALL PRIVILEGES ON *.* FROM 'cejuser'@'localhost'; +DROP USER 'cejuser'@'localhost'; + + From ce8368defd7c43003073ccacf6ef813bf789924b Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Tue, 24 Jun 2025 10:57:08 +0300 Subject: [PATCH 60/79] Revert "add cleanups to MTR" This reverts commit 9dafef641a785507d447d3dbce81e8ba5a60a1f0. --- .../t/MCOL-5572-autoincrement-filtering.test | 2 +- .../columnstore/basic/t/cal_named_udfs.test | 1 - .../basic/t/mcs98_moda_function.test | 2 +- .../columnstore/basic/t/mcs_named_udfs.test | 1 - ...OL-5776-GROUP-BY-HAVING-functions-use.test | 1 - ...ol-4741-strings-ranges-are-unsigned.result | 1 - ...mcol-4741-strings-ranges-are-unsigned.test | 2 +- .../columnstore/bugfixes/mcol-5074.test | 1 - .../columnstore/bugfixes/mcol-5669.test | 2 - .../columnstore/bugfixes/mcol_4465.test | 1 - .../columnstore/include/drop_functions.inc | 63 ------------------- 11 files changed, 3 insertions(+), 74 deletions(-) delete mode 100644 mysql-test/columnstore/include/drop_functions.inc diff --git a/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test b/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test index aef1b6f75..8d331cf40 100644 --- a/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test +++ b/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test @@ -21,4 +21,4 @@ select tablename, autoincrement, nextvalue from calpontsys.syscolumn where autoi select tablename, autoincrement, nextvalue from calpontsys.syscolumn where autoincrement = 'n' and `schema`='mcol5572' and tablename='foo'; DROP DATABASE mcol5572; ---source ../include/drop_functions.inc + diff --git a/mysql-test/columnstore/basic/t/cal_named_udfs.test b/mysql-test/columnstore/basic/t/cal_named_udfs.test index bd03af5bc..d097511b8 100644 --- a/mysql-test/columnstore/basic/t/cal_named_udfs.test +++ b/mysql-test/columnstore/basic/t/cal_named_udfs.test @@ -24,4 +24,3 @@ select calgetsqlcount(); DROP TABLE t1; DROP DATABASE cal_test_db; ---source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/basic/t/mcs98_moda_function.test b/mysql-test/columnstore/basic/t/mcs98_moda_function.test index 9b02a79a2..148f355b4 100644 --- a/mysql-test/columnstore/basic/t/mcs98_moda_function.test +++ b/mysql-test/columnstore/basic/t/mcs98_moda_function.test @@ -101,4 +101,4 @@ SELECT moda(floor(rl)) FROM t2; SELECT t, moda(tu) 'q1' FROM t2 GROUP BY t HAVING moda(tu) > 5; # Clean UP DROP DATABASE mcs98_db; ---source ../include/drop_functions.inc + diff --git a/mysql-test/columnstore/basic/t/mcs_named_udfs.test b/mysql-test/columnstore/basic/t/mcs_named_udfs.test index 00ca03aa5..84859b2c6 100644 --- a/mysql-test/columnstore/basic/t/mcs_named_udfs.test +++ b/mysql-test/columnstore/basic/t/mcs_named_udfs.test @@ -25,4 +25,3 @@ select mcslastinsertid("t1"); DROP TABLE t1; DROP DATABASE cal_test_db; ---source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test b/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test index 0edfd7823..99c91b68d 100644 --- a/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test +++ b/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test @@ -103,4 +103,3 @@ INSERT INTO t(k) VALUES (1), (2), (2), (3), (3), (4), (4),(4),(4),(4),(995), (NU SELECT k + k a FROM t GROUP BY a HAVING a >= 8; DROP DATABASE MCOL5776; ---source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.result b/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.result index b3dcfdb62..c9e2db639 100644 --- a/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.result +++ b/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.result @@ -10,4 +10,3 @@ LOAD DATA LOCAL infile 'MTR_SUITE_DIR/../std_data/mcol-4741-part-2-empty-strings SELECT COUNT(*) FROM t WHERE x='val'; COUNT(*) 2 -DROP DATABASE db4741; diff --git a/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.test b/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.test index a3d2222a9..31311d992 100644 --- a/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.test +++ b/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.test @@ -16,4 +16,4 @@ SELECT COUNT(*) FROM t WHERE x='val'; --eval LOAD DATA LOCAL infile '$MTR_SUITE_DIR/../std_data/mcol-4741-part-2-empty-strings.txt' INTO TABLE t SELECT COUNT(*) FROM t WHERE x='val'; -DROP DATABASE db4741; + diff --git a/mysql-test/columnstore/bugfixes/mcol-5074.test b/mysql-test/columnstore/bugfixes/mcol-5074.test index 949210734..aed1ff750 100644 --- a/mysql-test/columnstore/bugfixes/mcol-5074.test +++ b/mysql-test/columnstore/bugfixes/mcol-5074.test @@ -40,5 +40,4 @@ select case when da.mtn in ('PFG','Person Focal Group') then count( acct_id) end + case when da.mtn = 'Person Focal Group' then count( acct_id) end as PFG_active_accounts from accnt da group by mtn, accts, act_created_dt order by mtn; - DROP DATABASE mcol_5074_db; diff --git a/mysql-test/columnstore/bugfixes/mcol-5669.test b/mysql-test/columnstore/bugfixes/mcol-5669.test index 890d750d7..5420034d8 100644 --- a/mysql-test/columnstore/bugfixes/mcol-5669.test +++ b/mysql-test/columnstore/bugfixes/mcol-5669.test @@ -112,5 +112,3 @@ INSERT INTO `zzz_999999` VALUES ('2023-12-18',5298,684963,1004,1,1,2166,1.000),( DROP DATABASE mcol_5669; REVOKE ALL PRIVILEGES ON *.* FROM 'cejuser'@'localhost'; DROP USER 'cejuser'@'localhost'; - - diff --git a/mysql-test/columnstore/bugfixes/mcol_4465.test b/mysql-test/columnstore/bugfixes/mcol_4465.test index 6339eced9..25503f6d5 100644 --- a/mysql-test/columnstore/bugfixes/mcol_4465.test +++ b/mysql-test/columnstore/bugfixes/mcol_4465.test @@ -10,4 +10,3 @@ INSERT INTO cs1 VALUES('i',0),('i',0),('ii',0); SELECT c,regr_count(d,length(c)) f FROM cs1 GROUP BY 1 ORDER BY 1; SELECT * FROM (SELECT c,regr_count(d,length(c)) f FROM cs1 GROUP BY 1 ORDER BY 1)a; DROP DATABASE mcol_4465; ---source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/include/drop_functions.inc b/mysql-test/columnstore/include/drop_functions.inc deleted file mode 100644 index a55af261c..000000000 --- a/mysql-test/columnstore/include/drop_functions.inc +++ /dev/null @@ -1,63 +0,0 @@ ---disable_query_log -DROP FUNCTION mcsgetstats; -DROP FUNCTION calgetstats; -DROP FUNCTION mcssettrace; -DROP FUNCTION calsettrace; -DROP FUNCTION mcssetparms; -DROP FUNCTION calsetparms; -DROP FUNCTION mcsflushcache; -DROP FUNCTION calflushcache; -DROP FUNCTION mcsgettrace; -DROP FUNCTION calgettrace; -DROP FUNCTION mcsgetversion; -DROP FUNCTION calgetversion; -DROP FUNCTION calonlinealter; -DROP FUNCTION mcsviewtablelock; -DROP FUNCTION calviewtablelock; -DROP FUNCTION mcscleartablelock; -DROP FUNCTION calcleartablelock; -DROP FUNCTION mcslastinsertid; -DROP FUNCTION callastinsertid; -DROP FUNCTION mcsgetsqlcount; -DROP FUNCTION calgetsqlcount; -DROP FUNCTION idbpm; -DROP FUNCTION idbdbroot; -DROP FUNCTION idbsegment; -DROP FUNCTION idbsegmentdir; -DROP FUNCTION idbextentrelativerid; -DROP FUNCTION idbblockid; -DROP FUNCTION idbextentid; -DROP FUNCTION idbextentmin; -DROP FUNCTION idbextentmax; -DROP FUNCTION idbpartition; -DROP FUNCTION idblocalpm; -DROP FUNCTION mcssystemready; -DROP FUNCTION mcssystemreadonly; -DROP FUNCTION mcssystemprimary; -DROP FUNCTION mcs_emindex_size; -DROP FUNCTION mcs_emindex_free; -DROP FUNCTION columnstore_dataload; -DROP FUNCTION regr_avgx; -DROP FUNCTION regr_avgy; -DROP FUNCTION regr_count; -DROP FUNCTION regr_slope; -DROP FUNCTION regr_intercept; -DROP FUNCTION regr_r2; -DROP FUNCTION corr; -DROP FUNCTION regr_sxx; -DROP FUNCTION regr_syy; -DROP FUNCTION regr_sxy; -DROP FUNCTION covar_pop; -DROP FUNCTION covar_samp; -DROP FUNCTION distinct_count; -DROP FUNCTION caldisablepartitions; -DROP FUNCTION calenablepartitions; -DROP FUNCTION caldroppartitions; -DROP FUNCTION calshowpartitions; -DROP FUNCTION caldroppartitionsbyvalue; -DROP FUNCTION caldisablepartitionsbyvalue; -DROP FUNCTION calenablepartitionsbyvalue; -DROP FUNCTION calshowpartitionsbyvalue; -DROP FUNCTION moda; -DROP FUNCTION mcs_set_ddldebug_level; ---enable_query_log From f8b32bbf9a9dea1076a759a103fc159c60043b70 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Tue, 24 Jun 2025 15:59:58 +0300 Subject: [PATCH 61/79] Fix typos in bugfixes.mcol-5074 and bugfixes.mcol-5669 tests --- mysql-test/columnstore/bugfixes/mcol-5074.test | 2 +- mysql-test/columnstore/bugfixes/mcol-5669.result | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/mysql-test/columnstore/bugfixes/mcol-5074.test b/mysql-test/columnstore/bugfixes/mcol-5074.test index aed1ff750..6c4978590 100644 --- a/mysql-test/columnstore/bugfixes/mcol-5074.test +++ b/mysql-test/columnstore/bugfixes/mcol-5074.test @@ -40,4 +40,4 @@ select case when da.mtn in ('PFG','Person Focal Group') then count( acct_id) end + case when da.mtn = 'Person Focal Group' then count( acct_id) end as PFG_active_accounts from accnt da group by mtn, accts, act_created_dt order by mtn; - +DROP DATABASE mcol_5074_db; diff --git a/mysql-test/columnstore/bugfixes/mcol-5669.result b/mysql-test/columnstore/bugfixes/mcol-5669.result index 33eabaf91..10cb76216 100644 --- a/mysql-test/columnstore/bugfixes/mcol-5669.result +++ b/mysql-test/columnstore/bugfixes/mcol-5669.result @@ -113,4 +113,3 @@ di_source_id brand_sku_id adjusted_dtm is_sit sit_uom sales_uom_daily_average DROP DATABASE mcol_5669; REVOKE ALL PRIVILEGES ON *.* FROM 'cejuser'@'localhost'; DROP USER 'cejuser'@'localhost'; - From 4b8b5e3d75807a68dd7730ad1974a76972e2cadc Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Tue, 24 Jun 2025 16:10:03 +0300 Subject: [PATCH 62/79] add clean up to bugfixes.mcol-4741-strings-ranges-are-unsigned test --- .../bugfixes/mcol-4741-strings-ranges-are-unsigned.result | 2 +- .../bugfixes/mcol-4741-strings-ranges-are-unsigned.test | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.result b/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.result index c9e2db639..b531a6e1c 100644 --- a/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.result +++ b/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.result @@ -9,4 +9,4 @@ COUNT(*) LOAD DATA LOCAL infile 'MTR_SUITE_DIR/../std_data/mcol-4741-part-2-empty-strings.txt' INTO TABLE t; SELECT COUNT(*) FROM t WHERE x='val'; COUNT(*) -2 +DROP DATABASE IF EXISTS db4741; diff --git a/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.test b/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.test index 31311d992..c57fbbb98 100644 --- a/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.test +++ b/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.test @@ -16,4 +16,4 @@ SELECT COUNT(*) FROM t WHERE x='val'; --eval LOAD DATA LOCAL infile '$MTR_SUITE_DIR/../std_data/mcol-4741-part-2-empty-strings.txt' INTO TABLE t SELECT COUNT(*) FROM t WHERE x='val'; - +DROP DATABASE IF EXISTS db4741; From 22ad96e04a9848d506e9cd7d085deec06d8bb759 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Wed, 25 Jun 2025 00:26:56 +0300 Subject: [PATCH 63/79] Fix typo in the mcol-4741-strings-ranges-are-unsigned test --- .../bugfixes/mcol-4741-strings-ranges-are-unsigned.result | 1 + 1 file changed, 1 insertion(+) diff --git a/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.result b/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.result index b531a6e1c..778ef7959 100644 --- a/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.result +++ b/mysql-test/columnstore/bugfixes/mcol-4741-strings-ranges-are-unsigned.result @@ -9,4 +9,5 @@ COUNT(*) LOAD DATA LOCAL infile 'MTR_SUITE_DIR/../std_data/mcol-4741-part-2-empty-strings.txt' INTO TABLE t; SELECT COUNT(*) FROM t WHERE x='val'; COUNT(*) +2 DROP DATABASE IF EXISTS db4741; From 3d5e10631082bbe361a36cbb7b0b6c8e1e7f0262 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Wed, 18 Jun 2025 18:01:51 +0300 Subject: [PATCH 64/79] Fix charset in MTR --- mysql-test/columnstore/include/syscatalog_mysql.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysql-test/columnstore/include/syscatalog_mysql.sql b/mysql-test/columnstore/include/syscatalog_mysql.sql index ef2b22039..43beaee2b 100644 --- a/mysql-test/columnstore/include/syscatalog_mysql.sql +++ b/mysql-test/columnstore/include/syscatalog_mysql.sql @@ -1,5 +1,6 @@ --disable_query_log --disable_warnings +-- SYSTABLE create database if not exists calpontsys; use calpontsys; @@ -46,4 +47,3 @@ create table if not exists syscolumn (`schema` varchar(128), --enable_warnings --enable_query_log - From e789dfd1bf75abbe3effbf805434a6860974967c Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Thu, 19 Jun 2025 18:37:54 +0300 Subject: [PATCH 65/79] enable sequence engine in the mcol-4786 test --- mysql-test/columnstore/basic/r/analyze_table.result | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mysql-test/columnstore/basic/r/analyze_table.result b/mysql-test/columnstore/basic/r/analyze_table.result index 08d8031e0..5630c2c2a 100644 --- a/mysql-test/columnstore/basic/r/analyze_table.result +++ b/mysql-test/columnstore/basic/r/analyze_table.result @@ -7,12 +7,14 @@ analyze table t1 PERSISTENT FOR ALL; Table Op Msg_type Msg_text analyze_table_db.t1 analyze status Engine-independent statistics collected analyze_table_db.t1 analyze status OK +analyze_table_db.t1 analyze status Engine-independent statistics collected create table t2 (a int, b double) engine=columnstore; insert into t2 values (2, 3), (3, 4); analyze table t2 PERSISTENT FOR ALL; Table Op Msg_type Msg_text analyze_table_db.t2 analyze status Engine-independent statistics collected analyze_table_db.t2 analyze status OK +analyze_table_db.t2 analyze status Engine-independent statistics collected create table t3 (a varchar(25)) engine=columnstore; insert into t3 values ("a"), ("b"); analyze table t3 PERSISTENT FOR ALL; From 549b33f9452fe48bb8694422113746b5097d4d57 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Fri, 20 Jun 2025 14:14:28 +0300 Subject: [PATCH 66/79] Fix analize_table test --- mysql-test/columnstore/basic/r/analyze_table.result | 2 -- 1 file changed, 2 deletions(-) diff --git a/mysql-test/columnstore/basic/r/analyze_table.result b/mysql-test/columnstore/basic/r/analyze_table.result index 5630c2c2a..08d8031e0 100644 --- a/mysql-test/columnstore/basic/r/analyze_table.result +++ b/mysql-test/columnstore/basic/r/analyze_table.result @@ -7,14 +7,12 @@ analyze table t1 PERSISTENT FOR ALL; Table Op Msg_type Msg_text analyze_table_db.t1 analyze status Engine-independent statistics collected analyze_table_db.t1 analyze status OK -analyze_table_db.t1 analyze status Engine-independent statistics collected create table t2 (a int, b double) engine=columnstore; insert into t2 values (2, 3), (3, 4); analyze table t2 PERSISTENT FOR ALL; Table Op Msg_type Msg_text analyze_table_db.t2 analyze status Engine-independent statistics collected analyze_table_db.t2 analyze status OK -analyze_table_db.t2 analyze status Engine-independent statistics collected create table t3 (a varchar(25)) engine=columnstore; insert into t3 values ("a"), ("b"); analyze table t3 PERSISTENT FOR ALL; From 1465a5c6b3fd6d93c60b1e3c1c0515279f4b352f Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Fri, 20 Jun 2025 18:00:35 +0300 Subject: [PATCH 67/79] dusable warings in the includes for MTR --- mysql-test/columnstore/include/syscatalog_mysql.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/mysql-test/columnstore/include/syscatalog_mysql.sql b/mysql-test/columnstore/include/syscatalog_mysql.sql index 43beaee2b..23470f666 100644 --- a/mysql-test/columnstore/include/syscatalog_mysql.sql +++ b/mysql-test/columnstore/include/syscatalog_mysql.sql @@ -1,6 +1,7 @@ --disable_query_log --disable_warnings -- SYSTABLE + create database if not exists calpontsys; use calpontsys; From 1c6985cbf5992ed42ed14507d6871be4d722ff67 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Sun, 22 Jun 2025 00:47:44 +0300 Subject: [PATCH 68/79] add cleanups to MTR --- .../MCOL-5572-autoincrement-filtering.result | 1 + .../t/MCOL-5572-autoincrement-filtering.test | 3 +- .../columnstore/basic/t/cal_named_udfs.test | 1 + .../basic/t/mcs98_moda_function.test | 2 +- .../columnstore/basic/t/mcs_named_udfs.test | 1 + ...OL-5776-GROUP-BY-HAVING-functions-use.test | 1 + .../columnstore/bugfixes/mcol_4465.test | 1 + .../columnstore/include/drop_functions.inc | 63 +++++++++++++++++++ 8 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 mysql-test/columnstore/include/drop_functions.inc diff --git a/mysql-test/columnstore/basic/r/MCOL-5572-autoincrement-filtering.result b/mysql-test/columnstore/basic/r/MCOL-5572-autoincrement-filtering.result index f638c9e48..63263c955 100644 --- a/mysql-test/columnstore/basic/r/MCOL-5572-autoincrement-filtering.result +++ b/mysql-test/columnstore/basic/r/MCOL-5572-autoincrement-filtering.result @@ -18,3 +18,4 @@ select tablename, autoincrement, nextvalue from calpontsys.syscolumn where autoi tablename autoincrement nextvalue foo n 1 DROP DATABASE mcol5572; +DROP DATABASE calpontsys; diff --git a/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test b/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test index 8d331cf40..bee2d5a99 100644 --- a/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test +++ b/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test @@ -21,4 +21,5 @@ select tablename, autoincrement, nextvalue from calpontsys.syscolumn where autoi select tablename, autoincrement, nextvalue from calpontsys.syscolumn where autoincrement = 'n' and `schema`='mcol5572' and tablename='foo'; DROP DATABASE mcol5572; - +--source ../include/drop_functions.inc +DROP DATABASE calpontsys; diff --git a/mysql-test/columnstore/basic/t/cal_named_udfs.test b/mysql-test/columnstore/basic/t/cal_named_udfs.test index d097511b8..bd03af5bc 100644 --- a/mysql-test/columnstore/basic/t/cal_named_udfs.test +++ b/mysql-test/columnstore/basic/t/cal_named_udfs.test @@ -24,3 +24,4 @@ select calgetsqlcount(); DROP TABLE t1; DROP DATABASE cal_test_db; +--source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/basic/t/mcs98_moda_function.test b/mysql-test/columnstore/basic/t/mcs98_moda_function.test index 148f355b4..9b02a79a2 100644 --- a/mysql-test/columnstore/basic/t/mcs98_moda_function.test +++ b/mysql-test/columnstore/basic/t/mcs98_moda_function.test @@ -101,4 +101,4 @@ SELECT moda(floor(rl)) FROM t2; SELECT t, moda(tu) 'q1' FROM t2 GROUP BY t HAVING moda(tu) > 5; # Clean UP DROP DATABASE mcs98_db; - +--source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/basic/t/mcs_named_udfs.test b/mysql-test/columnstore/basic/t/mcs_named_udfs.test index 84859b2c6..00ca03aa5 100644 --- a/mysql-test/columnstore/basic/t/mcs_named_udfs.test +++ b/mysql-test/columnstore/basic/t/mcs_named_udfs.test @@ -25,3 +25,4 @@ select mcslastinsertid("t1"); DROP TABLE t1; DROP DATABASE cal_test_db; +--source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test b/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test index 99c91b68d..0edfd7823 100644 --- a/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test +++ b/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test @@ -103,3 +103,4 @@ INSERT INTO t(k) VALUES (1), (2), (2), (3), (3), (4), (4),(4),(4),(4),(995), (NU SELECT k + k a FROM t GROUP BY a HAVING a >= 8; DROP DATABASE MCOL5776; +--source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/bugfixes/mcol_4465.test b/mysql-test/columnstore/bugfixes/mcol_4465.test index 25503f6d5..6339eced9 100644 --- a/mysql-test/columnstore/bugfixes/mcol_4465.test +++ b/mysql-test/columnstore/bugfixes/mcol_4465.test @@ -10,3 +10,4 @@ INSERT INTO cs1 VALUES('i',0),('i',0),('ii',0); SELECT c,regr_count(d,length(c)) f FROM cs1 GROUP BY 1 ORDER BY 1; SELECT * FROM (SELECT c,regr_count(d,length(c)) f FROM cs1 GROUP BY 1 ORDER BY 1)a; DROP DATABASE mcol_4465; +--source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/include/drop_functions.inc b/mysql-test/columnstore/include/drop_functions.inc new file mode 100644 index 000000000..a55af261c --- /dev/null +++ b/mysql-test/columnstore/include/drop_functions.inc @@ -0,0 +1,63 @@ +--disable_query_log +DROP FUNCTION mcsgetstats; +DROP FUNCTION calgetstats; +DROP FUNCTION mcssettrace; +DROP FUNCTION calsettrace; +DROP FUNCTION mcssetparms; +DROP FUNCTION calsetparms; +DROP FUNCTION mcsflushcache; +DROP FUNCTION calflushcache; +DROP FUNCTION mcsgettrace; +DROP FUNCTION calgettrace; +DROP FUNCTION mcsgetversion; +DROP FUNCTION calgetversion; +DROP FUNCTION calonlinealter; +DROP FUNCTION mcsviewtablelock; +DROP FUNCTION calviewtablelock; +DROP FUNCTION mcscleartablelock; +DROP FUNCTION calcleartablelock; +DROP FUNCTION mcslastinsertid; +DROP FUNCTION callastinsertid; +DROP FUNCTION mcsgetsqlcount; +DROP FUNCTION calgetsqlcount; +DROP FUNCTION idbpm; +DROP FUNCTION idbdbroot; +DROP FUNCTION idbsegment; +DROP FUNCTION idbsegmentdir; +DROP FUNCTION idbextentrelativerid; +DROP FUNCTION idbblockid; +DROP FUNCTION idbextentid; +DROP FUNCTION idbextentmin; +DROP FUNCTION idbextentmax; +DROP FUNCTION idbpartition; +DROP FUNCTION idblocalpm; +DROP FUNCTION mcssystemready; +DROP FUNCTION mcssystemreadonly; +DROP FUNCTION mcssystemprimary; +DROP FUNCTION mcs_emindex_size; +DROP FUNCTION mcs_emindex_free; +DROP FUNCTION columnstore_dataload; +DROP FUNCTION regr_avgx; +DROP FUNCTION regr_avgy; +DROP FUNCTION regr_count; +DROP FUNCTION regr_slope; +DROP FUNCTION regr_intercept; +DROP FUNCTION regr_r2; +DROP FUNCTION corr; +DROP FUNCTION regr_sxx; +DROP FUNCTION regr_syy; +DROP FUNCTION regr_sxy; +DROP FUNCTION covar_pop; +DROP FUNCTION covar_samp; +DROP FUNCTION distinct_count; +DROP FUNCTION caldisablepartitions; +DROP FUNCTION calenablepartitions; +DROP FUNCTION caldroppartitions; +DROP FUNCTION calshowpartitions; +DROP FUNCTION caldroppartitionsbyvalue; +DROP FUNCTION caldisablepartitionsbyvalue; +DROP FUNCTION calenablepartitionsbyvalue; +DROP FUNCTION calshowpartitionsbyvalue; +DROP FUNCTION moda; +DROP FUNCTION mcs_set_ddldebug_level; +--enable_query_log From e95fef4f265bdc813e7185e032d17705fa3c3ce0 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Mon, 23 Jun 2025 15:06:25 +0300 Subject: [PATCH 69/79] Fix MCOL-5572-autoincrement-filtering test --- .../columnstore/basic/r/MCOL-5572-autoincrement-filtering.result | 1 - .../columnstore/basic/t/MCOL-5572-autoincrement-filtering.test | 1 - 2 files changed, 2 deletions(-) diff --git a/mysql-test/columnstore/basic/r/MCOL-5572-autoincrement-filtering.result b/mysql-test/columnstore/basic/r/MCOL-5572-autoincrement-filtering.result index 63263c955..f638c9e48 100644 --- a/mysql-test/columnstore/basic/r/MCOL-5572-autoincrement-filtering.result +++ b/mysql-test/columnstore/basic/r/MCOL-5572-autoincrement-filtering.result @@ -18,4 +18,3 @@ select tablename, autoincrement, nextvalue from calpontsys.syscolumn where autoi tablename autoincrement nextvalue foo n 1 DROP DATABASE mcol5572; -DROP DATABASE calpontsys; diff --git a/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test b/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test index bee2d5a99..aef1b6f75 100644 --- a/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test +++ b/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test @@ -22,4 +22,3 @@ select tablename, autoincrement, nextvalue from calpontsys.syscolumn where autoi DROP DATABASE mcol5572; --source ../include/drop_functions.inc -DROP DATABASE calpontsys; From 72753308cd6452064517da3609ee86cf0b051a7c Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Tue, 24 Jun 2025 10:57:08 +0300 Subject: [PATCH 70/79] Revert "add cleanups to MTR" This reverts commit 9dafef641a785507d447d3dbce81e8ba5a60a1f0. --- .../t/MCOL-5572-autoincrement-filtering.test | 2 +- .../columnstore/basic/t/cal_named_udfs.test | 1 - .../basic/t/mcs98_moda_function.test | 2 +- .../columnstore/basic/t/mcs_named_udfs.test | 1 - ...OL-5776-GROUP-BY-HAVING-functions-use.test | 1 - .../columnstore/bugfixes/mcol-5074.test | 1 + .../columnstore/bugfixes/mcol_4465.test | 1 - .../columnstore/include/drop_functions.inc | 63 ------------------- 8 files changed, 3 insertions(+), 69 deletions(-) delete mode 100644 mysql-test/columnstore/include/drop_functions.inc diff --git a/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test b/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test index aef1b6f75..8d331cf40 100644 --- a/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test +++ b/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test @@ -21,4 +21,4 @@ select tablename, autoincrement, nextvalue from calpontsys.syscolumn where autoi select tablename, autoincrement, nextvalue from calpontsys.syscolumn where autoincrement = 'n' and `schema`='mcol5572' and tablename='foo'; DROP DATABASE mcol5572; ---source ../include/drop_functions.inc + diff --git a/mysql-test/columnstore/basic/t/cal_named_udfs.test b/mysql-test/columnstore/basic/t/cal_named_udfs.test index bd03af5bc..d097511b8 100644 --- a/mysql-test/columnstore/basic/t/cal_named_udfs.test +++ b/mysql-test/columnstore/basic/t/cal_named_udfs.test @@ -24,4 +24,3 @@ select calgetsqlcount(); DROP TABLE t1; DROP DATABASE cal_test_db; ---source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/basic/t/mcs98_moda_function.test b/mysql-test/columnstore/basic/t/mcs98_moda_function.test index 9b02a79a2..148f355b4 100644 --- a/mysql-test/columnstore/basic/t/mcs98_moda_function.test +++ b/mysql-test/columnstore/basic/t/mcs98_moda_function.test @@ -101,4 +101,4 @@ SELECT moda(floor(rl)) FROM t2; SELECT t, moda(tu) 'q1' FROM t2 GROUP BY t HAVING moda(tu) > 5; # Clean UP DROP DATABASE mcs98_db; ---source ../include/drop_functions.inc + diff --git a/mysql-test/columnstore/basic/t/mcs_named_udfs.test b/mysql-test/columnstore/basic/t/mcs_named_udfs.test index 00ca03aa5..84859b2c6 100644 --- a/mysql-test/columnstore/basic/t/mcs_named_udfs.test +++ b/mysql-test/columnstore/basic/t/mcs_named_udfs.test @@ -25,4 +25,3 @@ select mcslastinsertid("t1"); DROP TABLE t1; DROP DATABASE cal_test_db; ---source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test b/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test index 0edfd7823..99c91b68d 100644 --- a/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test +++ b/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test @@ -103,4 +103,3 @@ INSERT INTO t(k) VALUES (1), (2), (2), (3), (3), (4), (4),(4),(4),(4),(995), (NU SELECT k + k a FROM t GROUP BY a HAVING a >= 8; DROP DATABASE MCOL5776; ---source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/bugfixes/mcol-5074.test b/mysql-test/columnstore/bugfixes/mcol-5074.test index 6c4978590..9ec6e6535 100644 --- a/mysql-test/columnstore/bugfixes/mcol-5074.test +++ b/mysql-test/columnstore/bugfixes/mcol-5074.test @@ -40,4 +40,5 @@ select case when da.mtn in ('PFG','Person Focal Group') then count( acct_id) end + case when da.mtn = 'Person Focal Group' then count( acct_id) end as PFG_active_accounts from accnt da group by mtn, accts, act_created_dt order by mtn; + DROP DATABASE mcol_5074_db; diff --git a/mysql-test/columnstore/bugfixes/mcol_4465.test b/mysql-test/columnstore/bugfixes/mcol_4465.test index 6339eced9..25503f6d5 100644 --- a/mysql-test/columnstore/bugfixes/mcol_4465.test +++ b/mysql-test/columnstore/bugfixes/mcol_4465.test @@ -10,4 +10,3 @@ INSERT INTO cs1 VALUES('i',0),('i',0),('ii',0); SELECT c,regr_count(d,length(c)) f FROM cs1 GROUP BY 1 ORDER BY 1; SELECT * FROM (SELECT c,regr_count(d,length(c)) f FROM cs1 GROUP BY 1 ORDER BY 1)a; DROP DATABASE mcol_4465; ---source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/include/drop_functions.inc b/mysql-test/columnstore/include/drop_functions.inc deleted file mode 100644 index a55af261c..000000000 --- a/mysql-test/columnstore/include/drop_functions.inc +++ /dev/null @@ -1,63 +0,0 @@ ---disable_query_log -DROP FUNCTION mcsgetstats; -DROP FUNCTION calgetstats; -DROP FUNCTION mcssettrace; -DROP FUNCTION calsettrace; -DROP FUNCTION mcssetparms; -DROP FUNCTION calsetparms; -DROP FUNCTION mcsflushcache; -DROP FUNCTION calflushcache; -DROP FUNCTION mcsgettrace; -DROP FUNCTION calgettrace; -DROP FUNCTION mcsgetversion; -DROP FUNCTION calgetversion; -DROP FUNCTION calonlinealter; -DROP FUNCTION mcsviewtablelock; -DROP FUNCTION calviewtablelock; -DROP FUNCTION mcscleartablelock; -DROP FUNCTION calcleartablelock; -DROP FUNCTION mcslastinsertid; -DROP FUNCTION callastinsertid; -DROP FUNCTION mcsgetsqlcount; -DROP FUNCTION calgetsqlcount; -DROP FUNCTION idbpm; -DROP FUNCTION idbdbroot; -DROP FUNCTION idbsegment; -DROP FUNCTION idbsegmentdir; -DROP FUNCTION idbextentrelativerid; -DROP FUNCTION idbblockid; -DROP FUNCTION idbextentid; -DROP FUNCTION idbextentmin; -DROP FUNCTION idbextentmax; -DROP FUNCTION idbpartition; -DROP FUNCTION idblocalpm; -DROP FUNCTION mcssystemready; -DROP FUNCTION mcssystemreadonly; -DROP FUNCTION mcssystemprimary; -DROP FUNCTION mcs_emindex_size; -DROP FUNCTION mcs_emindex_free; -DROP FUNCTION columnstore_dataload; -DROP FUNCTION regr_avgx; -DROP FUNCTION regr_avgy; -DROP FUNCTION regr_count; -DROP FUNCTION regr_slope; -DROP FUNCTION regr_intercept; -DROP FUNCTION regr_r2; -DROP FUNCTION corr; -DROP FUNCTION regr_sxx; -DROP FUNCTION regr_syy; -DROP FUNCTION regr_sxy; -DROP FUNCTION covar_pop; -DROP FUNCTION covar_samp; -DROP FUNCTION distinct_count; -DROP FUNCTION caldisablepartitions; -DROP FUNCTION calenablepartitions; -DROP FUNCTION caldroppartitions; -DROP FUNCTION calshowpartitions; -DROP FUNCTION caldroppartitionsbyvalue; -DROP FUNCTION caldisablepartitionsbyvalue; -DROP FUNCTION calenablepartitionsbyvalue; -DROP FUNCTION calshowpartitionsbyvalue; -DROP FUNCTION moda; -DROP FUNCTION mcs_set_ddldebug_level; ---enable_query_log From d503221e6fa7b5a36ada4de410e142d5648973d5 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Wed, 25 Jun 2025 14:32:57 +0300 Subject: [PATCH 71/79] Drop functions in the bugfixes suite tests --- ...OL-5776-GROUP-BY-HAVING-functions-use.test | 1 + .../columnstore/bugfixes/mcol_4465.test | 1 + .../columnstore/include/drop_functions.inc | 63 +++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 mysql-test/columnstore/include/drop_functions.inc diff --git a/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test b/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test index 99c91b68d..0edfd7823 100644 --- a/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test +++ b/mysql-test/columnstore/bugfixes/MCOL-5776-GROUP-BY-HAVING-functions-use.test @@ -103,3 +103,4 @@ INSERT INTO t(k) VALUES (1), (2), (2), (3), (3), (4), (4),(4),(4),(4),(995), (NU SELECT k + k a FROM t GROUP BY a HAVING a >= 8; DROP DATABASE MCOL5776; +--source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/bugfixes/mcol_4465.test b/mysql-test/columnstore/bugfixes/mcol_4465.test index 25503f6d5..6339eced9 100644 --- a/mysql-test/columnstore/bugfixes/mcol_4465.test +++ b/mysql-test/columnstore/bugfixes/mcol_4465.test @@ -10,3 +10,4 @@ INSERT INTO cs1 VALUES('i',0),('i',0),('ii',0); SELECT c,regr_count(d,length(c)) f FROM cs1 GROUP BY 1 ORDER BY 1; SELECT * FROM (SELECT c,regr_count(d,length(c)) f FROM cs1 GROUP BY 1 ORDER BY 1)a; DROP DATABASE mcol_4465; +--source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/include/drop_functions.inc b/mysql-test/columnstore/include/drop_functions.inc new file mode 100644 index 000000000..a55af261c --- /dev/null +++ b/mysql-test/columnstore/include/drop_functions.inc @@ -0,0 +1,63 @@ +--disable_query_log +DROP FUNCTION mcsgetstats; +DROP FUNCTION calgetstats; +DROP FUNCTION mcssettrace; +DROP FUNCTION calsettrace; +DROP FUNCTION mcssetparms; +DROP FUNCTION calsetparms; +DROP FUNCTION mcsflushcache; +DROP FUNCTION calflushcache; +DROP FUNCTION mcsgettrace; +DROP FUNCTION calgettrace; +DROP FUNCTION mcsgetversion; +DROP FUNCTION calgetversion; +DROP FUNCTION calonlinealter; +DROP FUNCTION mcsviewtablelock; +DROP FUNCTION calviewtablelock; +DROP FUNCTION mcscleartablelock; +DROP FUNCTION calcleartablelock; +DROP FUNCTION mcslastinsertid; +DROP FUNCTION callastinsertid; +DROP FUNCTION mcsgetsqlcount; +DROP FUNCTION calgetsqlcount; +DROP FUNCTION idbpm; +DROP FUNCTION idbdbroot; +DROP FUNCTION idbsegment; +DROP FUNCTION idbsegmentdir; +DROP FUNCTION idbextentrelativerid; +DROP FUNCTION idbblockid; +DROP FUNCTION idbextentid; +DROP FUNCTION idbextentmin; +DROP FUNCTION idbextentmax; +DROP FUNCTION idbpartition; +DROP FUNCTION idblocalpm; +DROP FUNCTION mcssystemready; +DROP FUNCTION mcssystemreadonly; +DROP FUNCTION mcssystemprimary; +DROP FUNCTION mcs_emindex_size; +DROP FUNCTION mcs_emindex_free; +DROP FUNCTION columnstore_dataload; +DROP FUNCTION regr_avgx; +DROP FUNCTION regr_avgy; +DROP FUNCTION regr_count; +DROP FUNCTION regr_slope; +DROP FUNCTION regr_intercept; +DROP FUNCTION regr_r2; +DROP FUNCTION corr; +DROP FUNCTION regr_sxx; +DROP FUNCTION regr_syy; +DROP FUNCTION regr_sxy; +DROP FUNCTION covar_pop; +DROP FUNCTION covar_samp; +DROP FUNCTION distinct_count; +DROP FUNCTION caldisablepartitions; +DROP FUNCTION calenablepartitions; +DROP FUNCTION caldroppartitions; +DROP FUNCTION calshowpartitions; +DROP FUNCTION caldroppartitionsbyvalue; +DROP FUNCTION caldisablepartitionsbyvalue; +DROP FUNCTION calenablepartitionsbyvalue; +DROP FUNCTION calshowpartitionsbyvalue; +DROP FUNCTION moda; +DROP FUNCTION mcs_set_ddldebug_level; +--enable_query_log From 06aff0bd0a273a5c1cbc9246bc45a3fc6ea753ce Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Wed, 25 Jun 2025 16:21:37 +0300 Subject: [PATCH 72/79] Drop functions in the basic suite tests --- mysql-test/columnstore/basic/t/cal_named_udfs.test | 1 + mysql-test/columnstore/basic/t/mcs98_moda_function.test | 2 +- mysql-test/columnstore/basic/t/mcs_named_udfs.test | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/mysql-test/columnstore/basic/t/cal_named_udfs.test b/mysql-test/columnstore/basic/t/cal_named_udfs.test index d097511b8..bd03af5bc 100644 --- a/mysql-test/columnstore/basic/t/cal_named_udfs.test +++ b/mysql-test/columnstore/basic/t/cal_named_udfs.test @@ -24,3 +24,4 @@ select calgetsqlcount(); DROP TABLE t1; DROP DATABASE cal_test_db; +--source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/basic/t/mcs98_moda_function.test b/mysql-test/columnstore/basic/t/mcs98_moda_function.test index 148f355b4..9b02a79a2 100644 --- a/mysql-test/columnstore/basic/t/mcs98_moda_function.test +++ b/mysql-test/columnstore/basic/t/mcs98_moda_function.test @@ -101,4 +101,4 @@ SELECT moda(floor(rl)) FROM t2; SELECT t, moda(tu) 'q1' FROM t2 GROUP BY t HAVING moda(tu) > 5; # Clean UP DROP DATABASE mcs98_db; - +--source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/basic/t/mcs_named_udfs.test b/mysql-test/columnstore/basic/t/mcs_named_udfs.test index 84859b2c6..00ca03aa5 100644 --- a/mysql-test/columnstore/basic/t/mcs_named_udfs.test +++ b/mysql-test/columnstore/basic/t/mcs_named_udfs.test @@ -25,3 +25,4 @@ select mcslastinsertid("t1"); DROP TABLE t1; DROP DATABASE cal_test_db; +--source ../include/drop_functions.inc From d08766fd7d8f361d69627e4e25012d7e1e823f84 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Wed, 25 Jun 2025 19:42:39 +0300 Subject: [PATCH 73/79] disable basic.MCOL-5572-autoincrement-filtering when running without --extern --- .../basic/t/MCOL-5572-autoincrement-filtering.test | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test b/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test index 8d331cf40..0a7f1af32 100644 --- a/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test +++ b/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test @@ -2,6 +2,12 @@ --source ../include/functions.inc --source ../include/syscatalog_mysql.sql +if ($MASTER_MYPORT) +{ + # Running without --extern + --skip Only works with --extern (will work without extern when cleanup issues are fixed) +} + SET default_storage_engine=columnstore; --disable_warnings From 4df58ffa963dfb6cbcf169dc68b888f6a90f552b Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Thu, 26 Jun 2025 02:09:06 +0300 Subject: [PATCH 74/79] Check for --extern before importing functions in the MCOL-5572-autoincrement-filtering.test --- .../basic/t/MCOL-5572-autoincrement-filtering.test | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test b/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test index 0a7f1af32..462157f6e 100644 --- a/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test +++ b/mysql-test/columnstore/basic/t/MCOL-5572-autoincrement-filtering.test @@ -1,13 +1,13 @@ ---source ../include/have_columnstore.inc ---source ../include/functions.inc ---source ../include/syscatalog_mysql.sql - if ($MASTER_MYPORT) { # Running without --extern --skip Only works with --extern (will work without extern when cleanup issues are fixed) } +--source ../include/have_columnstore.inc +--source ../include/functions.inc +--source ../include/syscatalog_mysql.sql + SET default_storage_engine=columnstore; --disable_warnings From f1b68b9a19ab750b6ce74bf59436995ee2d9d390 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Mon, 30 Jun 2025 11:26:03 +0300 Subject: [PATCH 75/79] Fix merge error im the mysql-test/columnstore/include/syscatalog_mysql.sql --- mysql-test/columnstore/include/syscatalog_mysql.sql | 1 - 1 file changed, 1 deletion(-) diff --git a/mysql-test/columnstore/include/syscatalog_mysql.sql b/mysql-test/columnstore/include/syscatalog_mysql.sql index 23470f666..aea3fdaad 100644 --- a/mysql-test/columnstore/include/syscatalog_mysql.sql +++ b/mysql-test/columnstore/include/syscatalog_mysql.sql @@ -1,6 +1,5 @@ --disable_query_log --disable_warnings --- SYSTABLE create database if not exists calpontsys; From 1adb39db41b28f6f0b438a78f371622cd52bc5bc Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Mon, 30 Jun 2025 11:30:05 +0300 Subject: [PATCH 76/79] Fix merge error im the mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps --- ...5886-use-of-partitioned-tables-in-crossengine-steps.test | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.test b/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.test index fbd3b3041..2320e5848 100644 --- a/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.test +++ b/mysql-test/columnstore/basic/t/MCOL-5886-use-of-partitioned-tables-in-crossengine-steps.test @@ -6,6 +6,12 @@ DROP DATABASE IF EXISTS MCOL5886; CREATE DATABASE MCOL5886; USE MCOL5886; +if (!$MASTER_MYPORT) +{ + # Running with --extern + let $MASTER_MYPORT=`SELECT @@port`; +} + --exec $MCS_MCSSETCONFIG CrossEngineSupport User 'cejuser' --exec $MCS_MCSSETCONFIG CrossEngineSupport Password 'Vagrant1|0000001' --exec $MCS_MCSSETCONFIG CrossEngineSupport Port $MASTER_MYPORT From 9c0accb44703f812485113ac5f189c3e601962ca Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Mon, 30 Jun 2025 15:15:01 +0300 Subject: [PATCH 77/79] disable tests inclompatible with 11.4 --- mysql-test/columnstore/basic/t/mcs114_comments.test | 1 + mysql-test/columnstore/basic/t/mcs11_show_db_table.test | 1 + mysql-test/columnstore/basic/t/mcs12_alter_table.test | 1 + .../columnstore/basic/t/mcs1_create_table_data_types.test | 1 + .../columnstore/basic/t/mcs45_write_crossengine_join.test | 1 + mysql-test/columnstore/bugfixes/mcol-4740.test | 4 ++-- mysql-test/columnstore/bugfixes/mcol-5480.test | 2 +- mysql-test/columnstore/bugfixes/mcol-5669.test | 1 + mysql-test/columnstore/include/disable_11.4.inc | 4 ++++ 9 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 mysql-test/columnstore/include/disable_11.4.inc diff --git a/mysql-test/columnstore/basic/t/mcs114_comments.test b/mysql-test/columnstore/basic/t/mcs114_comments.test index ad7406d16..66bc469c2 100644 --- a/mysql-test/columnstore/basic/t/mcs114_comments.test +++ b/mysql-test/columnstore/basic/t/mcs114_comments.test @@ -2,6 +2,7 @@ # Test comments # Author: Bharath, bharath.bokka@mariadb.com # +--source ../include/disable_11.4.inc -- source ../include/have_columnstore.inc --disable_warnings diff --git a/mysql-test/columnstore/basic/t/mcs11_show_db_table.test b/mysql-test/columnstore/basic/t/mcs11_show_db_table.test index f5469d63d..c0948a830 100644 --- a/mysql-test/columnstore/basic/t/mcs11_show_db_table.test +++ b/mysql-test/columnstore/basic/t/mcs11_show_db_table.test @@ -1,6 +1,7 @@ # #This test verifies show databases and tables with engine=columnstore. # +--source ../include/disable_11.4.inc -- source ../include/have_columnstore.inc --source ../include/detect_maxscale.inc -- source include/have_innodb.inc diff --git a/mysql-test/columnstore/basic/t/mcs12_alter_table.test b/mysql-test/columnstore/basic/t/mcs12_alter_table.test index 175086f43..dd8dda7fa 100644 --- a/mysql-test/columnstore/basic/t/mcs12_alter_table.test +++ b/mysql-test/columnstore/basic/t/mcs12_alter_table.test @@ -1,6 +1,7 @@ # # Test ALTER TABLE schemas in various possible ways. # +--source ../include/disable_11.4.inc -- source ../include/have_columnstore.inc -- source include/have_innodb.inc -- source ../include/check_maxscale.inc diff --git a/mysql-test/columnstore/basic/t/mcs1_create_table_data_types.test b/mysql-test/columnstore/basic/t/mcs1_create_table_data_types.test index bacda2ef9..167c65d8f 100644 --- a/mysql-test/columnstore/basic/t/mcs1_create_table_data_types.test +++ b/mysql-test/columnstore/basic/t/mcs1_create_table_data_types.test @@ -2,6 +2,7 @@ # Test CREATE TABLE with all data types supported in Columnstore # Author: Bharath, bharath.bokka@mariadb.com # +--source ../include/disable_11.4.inc -- source ../include/have_columnstore.inc --source ../include/charset.inc diff --git a/mysql-test/columnstore/basic/t/mcs45_write_crossengine_join.test b/mysql-test/columnstore/basic/t/mcs45_write_crossengine_join.test index 2ebaadbc9..f3ab5ec94 100644 --- a/mysql-test/columnstore/basic/t/mcs45_write_crossengine_join.test +++ b/mysql-test/columnstore/basic/t/mcs45_write_crossengine_join.test @@ -2,6 +2,7 @@ # Update and Delete using Cross engine join # Author: Bharath, bharath.bokka@mariadb.com # +--source ../include/disable_11.4.inc -- source include/have_innodb.inc -- source ../include/have_columnstore.inc diff --git a/mysql-test/columnstore/bugfixes/mcol-4740.test b/mysql-test/columnstore/bugfixes/mcol-4740.test index 85075fd99..b950908cb 100644 --- a/mysql-test/columnstore/bugfixes/mcol-4740.test +++ b/mysql-test/columnstore/bugfixes/mcol-4740.test @@ -1,7 +1,7 @@ # # MCOL-4740 UPDATE involving multi-tables returns wrong "Rows matched" # - +--source ../include/disable_11.4.inc --source ../include/have_columnstore.inc --disable_warnings @@ -79,4 +79,4 @@ SET main.status = 1; SELECT status FROM test1; -DROP DATABASE mcol_4740; \ No newline at end of file +DROP DATABASE mcol_4740; diff --git a/mysql-test/columnstore/bugfixes/mcol-5480.test b/mysql-test/columnstore/bugfixes/mcol-5480.test index ab32e1503..37de6bb1c 100644 --- a/mysql-test/columnstore/bugfixes/mcol-5480.test +++ b/mysql-test/columnstore/bugfixes/mcol-5480.test @@ -2,7 +2,7 @@ # MCOL-5480 LDI loads values incorrectly for MEDIUMINT, TIME and TIMESTAMP # when cpimport is used for batch insert # - +--source ../include/disable_11.4.inc --source ../include/have_columnstore.inc --source ../include/detect_maxscale.inc diff --git a/mysql-test/columnstore/bugfixes/mcol-5669.test b/mysql-test/columnstore/bugfixes/mcol-5669.test index 5420034d8..c40e987f7 100644 --- a/mysql-test/columnstore/bugfixes/mcol-5669.test +++ b/mysql-test/columnstore/bugfixes/mcol-5669.test @@ -1,3 +1,4 @@ +--source ../include/disable_11.4.inc --source include/have_innodb.inc --source ../include/have_columnstore.inc --disable_warnings diff --git a/mysql-test/columnstore/include/disable_11.4.inc b/mysql-test/columnstore/include/disable_11.4.inc new file mode 100644 index 000000000..308d65d5a --- /dev/null +++ b/mysql-test/columnstore/include/disable_11.4.inc @@ -0,0 +1,4 @@ +if (`SELECT (sys.version_major(), sys.version_minor()) != (10, 6)`) +{ + skip Temporary disabled due to incompatibility with 11.4; +} From e9400a1959e9b785b77707749b06718fda025772 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Mon, 30 Jun 2025 23:43:48 +0300 Subject: [PATCH 78/79] add link to JIRA for disable tests --- mysql-test/columnstore/include/disable_11.4.inc | 2 +- mysql-test/columnstore/include/only_10.6.inc | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 mysql-test/columnstore/include/only_10.6.inc diff --git a/mysql-test/columnstore/include/disable_11.4.inc b/mysql-test/columnstore/include/disable_11.4.inc index 308d65d5a..3e225b452 100644 --- a/mysql-test/columnstore/include/disable_11.4.inc +++ b/mysql-test/columnstore/include/disable_11.4.inc @@ -1,4 +1,4 @@ if (`SELECT (sys.version_major(), sys.version_minor()) != (10, 6)`) { - skip Temporary disabled due to incompatibility with 11.4; + skip Temporary disabled due to incompatibility with 11.4, MCOL-5948; } diff --git a/mysql-test/columnstore/include/only_10.6.inc b/mysql-test/columnstore/include/only_10.6.inc new file mode 100644 index 000000000..931e97f8c --- /dev/null +++ b/mysql-test/columnstore/include/only_10.6.inc @@ -0,0 +1,4 @@ +if (`SELECT (sys.version_major(), sys.version_minor()) != (10, 6)`) +{ + skip This test works only with 10.6; +} From dd4cfebaf482e055c7a01ec994606b81ac779bf7 Mon Sep 17 00:00:00 2001 From: Timofey Turenko Date: Thu, 3 Jul 2025 01:26:12 +0300 Subject: [PATCH 79/79] change skip message for mcs114_comments test --- mysql-test/columnstore/basic/t/mcs114_comments.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysql-test/columnstore/basic/t/mcs114_comments.test b/mysql-test/columnstore/basic/t/mcs114_comments.test index 66bc469c2..8e4e1fe9c 100644 --- a/mysql-test/columnstore/basic/t/mcs114_comments.test +++ b/mysql-test/columnstore/basic/t/mcs114_comments.test @@ -2,7 +2,7 @@ # Test comments # Author: Bharath, bharath.bokka@mariadb.com # ---source ../include/disable_11.4.inc +--source ../include/only_10.6.inc -- source ../include/have_columnstore.inc --disable_warnings