diff --git a/.gitignore b/.gitignore index d155512039..b849df0d06 100644 --- a/.gitignore +++ b/.gitignore @@ -121,6 +121,7 @@ TAGS contrib/* !contrib/CMakeLists.txt !contrib/test +!contrib/azure-cmake sql debug*/ .env diff --git a/CMakeLists.txt b/CMakeLists.txt index ac368c29fe..db5b89db3d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,13 +1,13 @@ cmake_minimum_required(VERSION 3.0) project( - TDengine - VERSION 3.0 - DESCRIPTION "An open-source big data platform designed and optimized for the Internet of Things(IOT)" + TDengine + VERSION 3.0 + DESCRIPTION "An open-source big data platform designed and optimized for the Internet of Things(IOT)" ) -if (NOT DEFINED TD_SOURCE_DIR) - set( TD_SOURCE_DIR ${PROJECT_SOURCE_DIR} ) +if(NOT DEFINED TD_SOURCE_DIR) + set(TD_SOURCE_DIR ${PROJECT_SOURCE_DIR}) endif() SET(TD_COMMUNITY_DIR ${PROJECT_SOURCE_DIR}) @@ -15,13 +15,11 @@ SET(TD_COMMUNITY_DIR ${PROJECT_SOURCE_DIR}) set(TD_SUPPORT_DIR "${TD_SOURCE_DIR}/cmake") set(TD_CONTRIB_DIR "${TD_SOURCE_DIR}/contrib") - include(${TD_SUPPORT_DIR}/cmake.platform) include(${TD_SUPPORT_DIR}/cmake.define) include(${TD_SUPPORT_DIR}/cmake.options) include(${TD_SUPPORT_DIR}/cmake.version) - # contrib add_subdirectory(contrib) @@ -33,8 +31,8 @@ target_include_directories(api INTERFACE "include/client") # src if(${BUILD_TEST}) - include(CTest) - enable_testing() + include(CTest) + enable_testing() endif(${BUILD_TEST}) add_subdirectory(source) @@ -44,5 +42,5 @@ add_subdirectory(examples/c) add_subdirectory(tests) include(${TD_SUPPORT_DIR}/cmake.install) -# docs +# docs add_subdirectory(docs/doxgen) diff --git a/cmake/azure_CMakeLists.txt.in b/cmake/azure_CMakeLists.txt.in new file mode 100644 index 0000000000..5aa32b70e5 --- /dev/null +++ b/cmake/azure_CMakeLists.txt.in @@ -0,0 +1,15 @@ +# azure +ExternalProject_Add(azure + URL https://github.com/Azure/azure-sdk-for-cpp/archive/refs/tags/azure-storage-blobs_12.13.0-beta.1.tar.gz + URL_HASH SHA256=3eca486fd60e3522d0a633025ecd652a71515b1e944799b2e8ee31fd590305a9 + DOWNLOAD_NO_PROGRESS 1 + DOWNLOAD_DIR "${TD_CONTRIB_DIR}/deps-download" + SOURCE_DIR "${TD_CONTRIB_DIR}/azure-sdk-for-cpp-azure-storage-blobs_12.13.0-beta.1" + #BUILD_IN_SOURCE TRUE + #BUILD_ALWAYS 1 + #UPDATE_COMMAND "" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" +) diff --git a/cmake/cmake.define b/cmake/cmake.define index 998a969b65..4f12b15af0 100644 --- a/cmake/cmake.define +++ b/cmake/cmake.define @@ -3,7 +3,7 @@ set(CMAKE_VERBOSE_MAKEFILE FALSE) set(TD_BUILD_TAOSA_INTERNAL FALSE) set(TD_BUILD_KEEPER_INTERNAL FALSE) -#set output directory +# set output directory SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/build/lib) SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/build/bin) SET(TD_TESTS_OUTPUT_DIR ${PROJECT_BINARY_DIR}/test) @@ -13,50 +13,50 @@ MESSAGE(STATUS "Project binary files output path: " ${PROJECT_BINARY_DIR}) MESSAGE(STATUS "Project executable files output path: " ${EXECUTABLE_OUTPUT_PATH}) MESSAGE(STATUS "Project library files output path: " ${LIBRARY_OUTPUT_PATH}) -if (NOT DEFINED TD_GRANT) - SET(TD_GRANT FALSE) -endif() +IF(NOT DEFINED TD_GRANT) + SET(TD_GRANT FALSE) +ENDIF() -IF (NOT DEFINED BUILD_WITH_RAND_ERR) - SET(BUILD_WITH_RAND_ERR FALSE) -ELSE () - SET(BUILD_WITH_RAND_ERR TRUE) -endif() +IF(NOT DEFINED BUILD_WITH_RAND_ERR) + SET(BUILD_WITH_RAND_ERR FALSE) +ELSE() + SET(BUILD_WITH_RAND_ERR TRUE) +ENDIF() -IF ("${WEBSOCKET}" MATCHES "true") +IF("${WEBSOCKET}" MATCHES "true") SET(TD_WEBSOCKET TRUE) MESSAGE("Enable websocket") ADD_DEFINITIONS(-DWEBSOCKET) -ELSE () +ELSE() SET(TD_WEBSOCKET FALSE) -ENDIF () +ENDIF() -IF ("${BUILD_HTTP}" STREQUAL "") - IF (TD_LINUX) - IF (TD_ARM_32) - SET(TD_BUILD_HTTP TRUE) - ELSE () - SET(TD_BUILD_HTTP TRUE) - ENDIF () - ELSEIF (TD_DARWIN) +IF("${BUILD_HTTP}" STREQUAL "") + IF(TD_LINUX) + IF(TD_ARM_32) + SET(TD_BUILD_HTTP TRUE) + ELSE() + SET(TD_BUILD_HTTP TRUE) + ENDIF() + ELSEIF(TD_DARWIN) + SET(TD_BUILD_HTTP TRUE) + ELSE() + SET(TD_BUILD_HTTP TRUE) + ENDIF() +ELSEIF(${BUILD_HTTP} MATCHES "false") + SET(TD_BUILD_HTTP FALSE) +ELSEIF(${BUILD_HTTP} MATCHES "true") SET(TD_BUILD_HTTP TRUE) - ELSE () +ELSEIF(${BUILD_HTTP} MATCHES "internal") + SET(TD_BUILD_HTTP FALSE) + SET(TD_BUILD_TAOSA_INTERNAL TRUE) +ELSE() SET(TD_BUILD_HTTP TRUE) - ENDIF () -ELSEIF (${BUILD_HTTP} MATCHES "false") - SET(TD_BUILD_HTTP FALSE) -ELSEIF (${BUILD_HTTP} MATCHES "true") - SET(TD_BUILD_HTTP TRUE) -ELSEIF (${BUILD_HTTP} MATCHES "internal") - SET(TD_BUILD_HTTP FALSE) - SET(TD_BUILD_TAOSA_INTERNAL TRUE) -ELSE () - SET(TD_BUILD_HTTP TRUE) -ENDIF () +ENDIF() -IF (TD_BUILD_HTTP) - ADD_DEFINITIONS(-DHTTP_EMBEDDED) -ENDIF () +IF(TD_BUILD_HTTP) + ADD_DEFINITIONS(-DHTTP_EMBEDDED) +ENDIF() IF ("${BUILD_KEEPER}" STREQUAL "") SET(TD_BUILD_KEEPER FALSE) @@ -71,125 +71,133 @@ ELSE () SET(TD_BUILD_KEEPER FALSE) ENDIF () -IF ("${BUILD_TOOLS}" STREQUAL "") - IF (TD_LINUX) - IF (TD_ARM_32) - SET(BUILD_TOOLS "false") - ELSEIF (TD_ARM_64) - SET(BUILD_TOOLS "false") - ELSE () - SET(BUILD_TOOLS "false") - ENDIF () - ELSEIF (TD_DARWIN) - SET(BUILD_TOOLS "false") - ELSE () - SET(BUILD_TOOLS "false") - ENDIF () -ENDIF () +IF("${BUILD_TOOLS}" STREQUAL "") + IF(TD_LINUX) + IF(TD_ARM_32) + SET(BUILD_TOOLS "false") + ELSEIF(TD_ARM_64) + SET(BUILD_TOOLS "false") + ELSE() + SET(BUILD_TOOLS "false") + ENDIF() + ELSEIF(TD_DARWIN) + SET(BUILD_TOOLS "false") + ELSE() + SET(BUILD_TOOLS "false") + ENDIF() +ENDIF() -IF ("${BUILD_TOOLS}" MATCHES "false") +IF("${BUILD_TOOLS}" MATCHES "false") MESSAGE("${Yellow} Will _not_ build taos_tools! ${ColourReset}") SET(TD_TAOS_TOOLS FALSE) -ELSE () +ELSE() MESSAGE("") MESSAGE("${Green} Will build taos_tools! ${ColourReset}") MESSAGE("") SET(TD_TAOS_TOOLS TRUE) -ENDIF () +ENDIF() -IF (${TD_WINDOWS}) +IF(${TD_WINDOWS}) SET(TAOS_LIB taos_static) -ELSE () +ELSE() SET(TAOS_LIB taos) -ENDIF () +ENDIF() # build TSZ by default -IF ("${TSZ_ENABLED}" MATCHES "false") - set(VAR_TSZ "" CACHE INTERNAL "global variant empty" ) +IF("${TSZ_ENABLED}" MATCHES "false") + set(VAR_TSZ "" CACHE INTERNAL "global variant empty") ELSE() - # define add - MESSAGE(STATUS "build with TSZ enabled") - ADD_DEFINITIONS(-DTD_TSZ) - set(VAR_TSZ "TSZ" CACHE INTERNAL "global variant tsz" ) + # define add + MESSAGE(STATUS "build with TSZ enabled") + ADD_DEFINITIONS(-DTD_TSZ) + set(VAR_TSZ "TSZ" CACHE INTERNAL "global variant tsz") ENDIF() # force set all platform to JEMALLOC_ENABLED = false SET(JEMALLOC_ENABLED OFF) -IF (TD_WINDOWS) - MESSAGE("${Yellow} set compiler flag for Windows! ${ColourReset}") - IF (${CMAKE_BUILD_TYPE} MATCHES "Release") - MESSAGE("${Green} will build Release version! ${ColourReset}") - SET(COMMON_FLAGS "/W3 /D_WIN32 /DWIN32 /Zi- /O2 /GL /MD") - ELSE () - MESSAGE("${Green} will build Debug version! ${ColourReset}") - SET(COMMON_FLAGS "/w /D_WIN32 /DWIN32 /Zi /MTd") +IF(TD_WINDOWS) + MESSAGE("${Yellow} set compiler flag for Windows! ${ColourReset}") + + IF(${CMAKE_BUILD_TYPE} MATCHES "Release") + MESSAGE("${Green} will build Release version! ${ColourReset}") + SET(COMMON_FLAGS "/W3 /D_WIN32 /DWIN32 /Zi- /O2 /GL /MD") + + ELSE() + MESSAGE("${Green} will build Debug version! ${ColourReset}") + SET(COMMON_FLAGS "/w /D_WIN32 /DWIN32 /Zi /MTd") ENDIF() SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO") + # IF (MSVC AND (MSVC_VERSION GREATER_EQUAL 1900)) - # SET(COMMON_FLAGS "${COMMON_FLAGS} /Wv:18") + # SET(COMMON_FLAGS "${COMMON_FLAGS} /Wv:18") # ENDIF () - IF (CMAKE_DEPFILE_FLAGS_C) + IF(CMAKE_DEPFILE_FLAGS_C) SET(CMAKE_DEPFILE_FLAGS_C "") - ENDIF () - IF (CMAKE_DEPFILE_FLAGS_CXX) + ENDIF() + + IF(CMAKE_DEPFILE_FLAGS_CXX) SET(CMAKE_DEPFILE_FLAGS_CXX "") - ENDIF () - IF (CMAKE_C_FLAGS_DEBUG) + ENDIF() + + IF(CMAKE_C_FLAGS_DEBUG) SET(CMAKE_C_FLAGS_DEBUG "" CACHE STRING "" FORCE) - ENDIF () - IF (CMAKE_CXX_FLAGS_DEBUG) + ENDIF() + + IF(CMAKE_CXX_FLAGS_DEBUG) SET(CMAKE_CXX_FLAGS_DEBUG "" CACHE STRING "" FORCE) - ENDIF () + ENDIF() SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_FLAGS}") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_FLAGS}") -ELSE () - IF (${TD_DARWIN}) +ELSE() + IF(${TD_DARWIN}) set(CMAKE_MACOSX_RPATH 0) - ENDIF () - IF (${COVER} MATCHES "true") + ENDIF() + + IF(${COVER} MATCHES "true") MESSAGE(STATUS "Test coverage mode, add extra flags") SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage") - SET(GCC_COVERAGE_LINK_FLAGS "-lgcov --coverage") + SET(GCC_COVERAGE_LINK_FLAGS "-lgcov --coverage") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}") - ENDIF () + ENDIF() # disable all assert - IF ((${DISABLE_ASSERT} MATCHES "true") OR (${DISABLE_ASSERTS} MATCHES "true")) + IF((${DISABLE_ASSERT} MATCHES "true") OR(${DISABLE_ASSERTS} MATCHES "true")) ADD_DEFINITIONS(-DDISABLE_ASSERT) MESSAGE(STATUS "Disable all asserts") ENDIF() INCLUDE(CheckCCompilerFlag) - IF (TD_ARM_64 OR TD_ARM_32) + + IF(TD_ARM_64 OR TD_ARM_32) SET(COMPILER_SUPPORT_SSE42 false) - ELSEIF (("${CMAKE_C_COMPILER_ID}" MATCHES "Clang") OR ("${CMAKE_C_COMPILER_ID}" MATCHES "AppleClang")) + ELSEIF(("${CMAKE_C_COMPILER_ID}" MATCHES "Clang") OR("${CMAKE_C_COMPILER_ID}" MATCHES "AppleClang")) SET(COMPILER_SUPPORT_SSE42 true) MESSAGE(STATUS "Always enable sse4.2 for Clang/AppleClang") ELSE() CHECK_C_COMPILER_FLAG("-msse4.2" COMPILER_SUPPORT_SSE42) ENDIF() - IF (TD_ARM_64 OR TD_ARM_32) - SET(COMPILER_SUPPORT_FMA false) - SET(COMPILER_SUPPORT_AVX false) - SET(COMPILER_SUPPORT_AVX2 false) - SET(COMPILER_SUPPORT_AVX512F false) - SET(COMPILER_SUPPORT_AVX512BMI false) - SET(COMPILER_SUPPORT_AVX512VL false) + IF(TD_ARM_64 OR TD_ARM_32) + SET(COMPILER_SUPPORT_FMA false) + SET(COMPILER_SUPPORT_AVX false) + SET(COMPILER_SUPPORT_AVX2 false) + SET(COMPILER_SUPPORT_AVX512F false) + SET(COMPILER_SUPPORT_AVX512BMI false) + SET(COMPILER_SUPPORT_AVX512VL false) ELSE() - CHECK_C_COMPILER_FLAG("-mfma" COMPILER_SUPPORT_FMA) - CHECK_C_COMPILER_FLAG("-mavx512f" COMPILER_SUPPORT_AVX512F) - CHECK_C_COMPILER_FLAG("-mavx512vbmi" COMPILER_SUPPORT_AVX512BMI) - CHECK_C_COMPILER_FLAG("-mavx512vl" COMPILER_SUPPORT_AVX512VL) + CHECK_C_COMPILER_FLAG("-mfma" COMPILER_SUPPORT_FMA) + CHECK_C_COMPILER_FLAG("-mavx512f" COMPILER_SUPPORT_AVX512F) + CHECK_C_COMPILER_FLAG("-mavx512vbmi" COMPILER_SUPPORT_AVX512BMI) + CHECK_C_COMPILER_FLAG("-mavx512vl" COMPILER_SUPPORT_AVX512VL) - INCLUDE(CheckCSourceRuns) - SET(CMAKE_REQUIRED_FLAGS "-mavx") - check_c_source_runs(" + INCLUDE(CheckCSourceRuns) + SET(CMAKE_REQUIRED_FLAGS "-mavx") + check_c_source_runs(" #include int main() { __m256d a, b, c; @@ -199,7 +207,7 @@ ELSE () c = _mm256_add_pd(a, b); _mm256_storeu_pd(buf, c); for (int i = 0; i < sizeof(buf) / sizeof(buf[0]); ++i) { - if (buf[i] != 0) { + IF (buf[i] != 0) { return 1; } } @@ -207,8 +215,8 @@ ELSE () } " COMPILER_SUPPORT_AVX) - SET(CMAKE_REQUIRED_FLAGS "-mavx2") - check_c_source_runs(" + SET(CMAKE_REQUIRED_FLAGS "-mavx2") + check_c_source_runs(" #include int main() { __m256i a, b, c; @@ -218,7 +226,7 @@ ELSE () c = _mm256_and_si256(a, b); _mm256_storeu_si256((__m256i *)buf, c); for (int i = 0; i < sizeof(buf) / sizeof(buf[0]); ++i) { - if (buf[i] != 0) { + IF (buf[i] != 0) { return 1; } } @@ -227,40 +235,42 @@ ELSE () " COMPILER_SUPPORT_AVX2) ENDIF() - IF (COMPILER_SUPPORT_SSE42) + IF(COMPILER_SUPPORT_SSE42) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.2") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2") ENDIF() - IF ("${SIMD_SUPPORT}" MATCHES "true") - IF (COMPILER_SUPPORT_FMA) + IF("${SIMD_SUPPORT}" MATCHES "true") + IF(COMPILER_SUPPORT_FMA) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfma") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfma") MESSAGE(STATUS "FMA instructions is ACTIVATED") ENDIF() - IF (COMPILER_SUPPORT_AVX) + + IF(COMPILER_SUPPORT_AVX) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx") MESSAGE(STATUS "AVX instructions is ACTIVATED") ENDIF() - IF (COMPILER_SUPPORT_AVX2) + + IF(COMPILER_SUPPORT_AVX2) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx2") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2") MESSAGE(STATUS "AVX2 instructions is ACTIVATED") ENDIF() ENDIF() - IF ("${SIMD_AVX512_SUPPORT}" MATCHES "true") - IF (COMPILER_SUPPORT_AVX512F AND COMPILER_SUPPORT_AVX512BMI) + IF("${SIMD_AVX512_SUPPORT}" MATCHES "true") + IF(COMPILER_SUPPORT_AVX512F AND COMPILER_SUPPORT_AVX512BMI) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx512f -mavx512vbmi") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx512f -mavx512vbmi") MESSAGE(STATUS "avx512f/avx512bmi enabled by compiler") ENDIF() - IF (COMPILER_SUPPORT_AVX512VL) + IF(COMPILER_SUPPORT_AVX512VL) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx512vl") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx512vl") - MESSAGE(STATUS "avx512vl enabled by compiler") + MESSAGE(STATUS "avx512vl enabled by compiler") ENDIF() ENDIF() @@ -268,16 +278,17 @@ ELSE () SET(CMAKE_C_FLAGS_REL "${CMAKE_C_FLAGS} -Werror -Werror=return-type -fPIC -O3 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k") SET(CMAKE_CXX_FLAGS_REL "${CMAKE_CXX_FLAGS} -Werror -Wno-reserved-user-defined-literal -Wno-literal-suffix -Werror=return-type -fPIC -O3 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k") - IF (${BUILD_SANITIZER}) + IF(${BUILD_SANITIZER}) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Werror=return-type -fPIC -gdwarf-2 -fsanitize=address -fsanitize=undefined -fsanitize-recover=all -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fno-sanitize=shift-base -fno-sanitize=alignment -g3 -Wformat=0") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-literal-suffix -Werror=return-type -fPIC -gdwarf-2 -fsanitize=address -fsanitize=undefined -fsanitize-recover=all -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fno-sanitize=shift-base -fno-sanitize=alignment -g3 -Wformat=0") - MESSAGE(STATUS "Compile with Address Sanitizer!") - ELSEIF (${BUILD_RELEASE}) + + # SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-literal-suffix -Werror=return-type -fPIC -gdwarf-2 -fsanitize=address -fsanitize=undefined -fsanitize-recover=all -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fno-sanitize=shift-base -fno-sanitize=alignment -g3 -Wformat=0") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-literal-suffix -Werror=return-type -fPIC -gdwarf-2 -fsanitize=address -fsanitize-recover=all -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fno-sanitize=shift-base -fno-sanitize=alignment -g3 -Wformat=0") + MESSAGE(STATUS "Compile with Address Sanitizer!") + ELSEIF(${BUILD_RELEASE}) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS_REL}") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_REL}") - ELSE () + ELSE() SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Werror=return-type -fPIC -g3 -gdwarf-2 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-reserved-user-defined-literal -g3 -Wno-literal-suffix -Werror=return-type -fPIC -gdwarf-2 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k") - ENDIF () - -ENDIF () + ENDIF() +ENDIF() diff --git a/cmake/taosadapter_CMakeLists.txt.in b/cmake/taosadapter_CMakeLists.txt.in index ef6ed4af1d..13826a1a74 100644 --- a/cmake/taosadapter_CMakeLists.txt.in +++ b/cmake/taosadapter_CMakeLists.txt.in @@ -2,7 +2,7 @@ # taosadapter ExternalProject_Add(taosadapter GIT_REPOSITORY https://github.com/taosdata/taosadapter.git - GIT_TAG 3.0 + GIT_TAG main SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosadapter" BINARY_DIR "" #BUILD_IN_SOURCE TRUE diff --git a/cmake/taostools_CMakeLists.txt.in b/cmake/taostools_CMakeLists.txt.in index 9a6a5329ae..9bbda8309f 100644 --- a/cmake/taostools_CMakeLists.txt.in +++ b/cmake/taostools_CMakeLists.txt.in @@ -2,7 +2,7 @@ # taos-tools ExternalProject_Add(taos-tools GIT_REPOSITORY https://github.com/taosdata/taos-tools.git - GIT_TAG 3.0 + GIT_TAG main SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools" BINARY_DIR "" #BUILD_IN_SOURCE TRUE diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt index 2a38bf74c7..eae697560b 100644 --- a/contrib/CMakeLists.txt +++ b/contrib/CMakeLists.txt @@ -10,39 +10,36 @@ if(${BUILD_WITH_S3}) file(MAKE_DIRECTORY $ENV{HOME}/.cos-local.2/) elseif(${BUILD_WITH_COS}) + set(CONTRIB_TMP_FILE3 "${CMAKE_BINARY_DIR}/deps_tmp_CMakeLists.txt.in3") + configure_file("${TD_SUPPORT_DIR}/deps_CMakeLists.txt.in" ${CONTRIB_TMP_FILE3}) -set(CONTRIB_TMP_FILE3 "${CMAKE_BINARY_DIR}/deps_tmp_CMakeLists.txt.in3") -configure_file("${TD_SUPPORT_DIR}/deps_CMakeLists.txt.in" ${CONTRIB_TMP_FILE3}) + if(${BUILD_WITH_COS}) + file(MAKE_DIRECTORY $ENV{HOME}/.cos-local.1/) + cat("${TD_SUPPORT_DIR}/mxml_CMakeLists.txt.in" ${CONTRIB_TMP_FILE3}) + cat("${TD_SUPPORT_DIR}/apr_CMakeLists.txt.in" ${CONTRIB_TMP_FILE3}) + cat("${TD_SUPPORT_DIR}/curl_CMakeLists.txt.in" ${CONTRIB_TMP_FILE3}) + endif(${BUILD_WITH_COS}) -if(${BUILD_WITH_COS}) - file(MAKE_DIRECTORY $ENV{HOME}/.cos-local.1/) - cat("${TD_SUPPORT_DIR}/mxml_CMakeLists.txt.in" ${CONTRIB_TMP_FILE3}) - cat("${TD_SUPPORT_DIR}/apr_CMakeLists.txt.in" ${CONTRIB_TMP_FILE3}) - cat("${TD_SUPPORT_DIR}/curl_CMakeLists.txt.in" ${CONTRIB_TMP_FILE3}) -endif(${BUILD_WITH_COS}) - -configure_file(${CONTRIB_TMP_FILE3} "${TD_CONTRIB_DIR}/deps-download/CMakeLists.txt") -execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . + configure_file(${CONTRIB_TMP_FILE3} "${TD_CONTRIB_DIR}/deps-download/CMakeLists.txt") + execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . WORKING_DIRECTORY "${TD_CONTRIB_DIR}/deps-download") -execute_process(COMMAND "${CMAKE_COMMAND}" --build . + execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${TD_CONTRIB_DIR}/deps-download") -set(CONTRIB_TMP_FILE2 "${CMAKE_BINARY_DIR}/deps_tmp_CMakeLists.txt.in2") -configure_file("${TD_SUPPORT_DIR}/deps_CMakeLists.txt.in" ${CONTRIB_TMP_FILE2}) + set(CONTRIB_TMP_FILE2 "${CMAKE_BINARY_DIR}/deps_tmp_CMakeLists.txt.in2") + configure_file("${TD_SUPPORT_DIR}/deps_CMakeLists.txt.in" ${CONTRIB_TMP_FILE2}) -if(${BUILD_WITH_COS}) - cat("${TD_SUPPORT_DIR}/apr-util_CMakeLists.txt.in" ${CONTRIB_TMP_FILE2}) -endif(${BUILD_WITH_COS}) + if(${BUILD_WITH_COS}) + cat("${TD_SUPPORT_DIR}/apr-util_CMakeLists.txt.in" ${CONTRIB_TMP_FILE2}) + endif(${BUILD_WITH_COS}) -configure_file(${CONTRIB_TMP_FILE2} "${TD_CONTRIB_DIR}/deps-download/CMakeLists.txt") -execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . + configure_file(${CONTRIB_TMP_FILE2} "${TD_CONTRIB_DIR}/deps-download/CMakeLists.txt") + execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . WORKING_DIRECTORY "${TD_CONTRIB_DIR}/deps-download") -execute_process(COMMAND "${CMAKE_COMMAND}" --build . + execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${TD_CONTRIB_DIR}/deps-download") - endif() - set(CONTRIB_TMP_FILE "${CMAKE_BINARY_DIR}/deps_tmp_CMakeLists.txt.in") configure_file("${TD_SUPPORT_DIR}/deps_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) @@ -59,7 +56,7 @@ endif() # taosadapter if(${BUILD_HTTP}) MESSAGE("BUILD_HTTP is on") -else () +else() MESSAGE("BUILD_HTTP is off, use taosAdapter") cat("${TD_SUPPORT_DIR}/taosadapter_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) endif() @@ -110,19 +107,18 @@ cat("${TD_SUPPORT_DIR}/zlib_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) cat("${TD_SUPPORT_DIR}/cjson_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) # xz -#cat("${TD_SUPPORT_DIR}/xz_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) +# cat("${TD_SUPPORT_DIR}/xz_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) -#lzma2 +# lzma2 cat("${TD_SUPPORT_DIR}/lzma_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) - -if (${BUILD_CONTRIB}) +if(${BUILD_CONTRIB}) if(${BUILD_WITH_ROCKSDB}) cat("${TD_SUPPORT_DIR}/rocksdb_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) add_definitions(-DUSE_ROCKSDB) endif() else() - if (NOT ${TD_LINUX}) + if(NOT ${TD_LINUX}) if(${BUILD_WITH_ROCKSDB}) cat("${TD_SUPPORT_DIR}/rocksdb_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) add_definitions(-DUSE_ROCKSDB) @@ -134,9 +130,9 @@ else() endif() endif() -#cat("${TD_SUPPORT_DIR}/zstd_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) +# cat("${TD_SUPPORT_DIR}/zstd_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) -#libuv +# libuv if(${BUILD_WITH_UV}) cat("${TD_SUPPORT_DIR}/libuv_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) endif(${BUILD_WITH_UV}) @@ -152,17 +148,17 @@ if(${BUILD_WITH_S3}) cat("${TD_SUPPORT_DIR}/xml2_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) cat("${TD_SUPPORT_DIR}/curl_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) cat("${TD_SUPPORT_DIR}/libs3_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) + cat("${TD_SUPPORT_DIR}/azure_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) add_definitions(-DUSE_S3) # cos elseif(${BUILD_WITH_COS}) - #cat("${TD_SUPPORT_DIR}/mxml_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) - #cat("${TD_SUPPORT_DIR}/apr_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) - #cat("${TD_SUPPORT_DIR}/apr-util_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) - #cat("${TD_SUPPORT_DIR}/curl_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) + # cat("${TD_SUPPORT_DIR}/mxml_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) + # cat("${TD_SUPPORT_DIR}/apr_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) + # cat("${TD_SUPPORT_DIR}/apr-util_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) + # cat("${TD_SUPPORT_DIR}/curl_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) cat("${TD_SUPPORT_DIR}/cos_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) add_definitions(-DUSE_COS) - endif() # crashdump @@ -191,9 +187,9 @@ endif() # download dependencies configure_file(${CONTRIB_TMP_FILE} "${TD_CONTRIB_DIR}/deps-download/CMakeLists.txt") execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . - WORKING_DIRECTORY "${TD_CONTRIB_DIR}/deps-download") + WORKING_DIRECTORY "${TD_CONTRIB_DIR}/deps-download") execute_process(COMMAND "${CMAKE_COMMAND}" --build . - WORKING_DIRECTORY "${TD_CONTRIB_DIR}/deps-download") + WORKING_DIRECTORY "${TD_CONTRIB_DIR}/deps-download") # ================================================================================================ # Build @@ -206,25 +202,27 @@ if(${BUILD_TEST}) gtest PUBLIC $ ) + if(${TD_WINDOWS}) target_include_directories( gtest PUBLIC $ ) endif(${TD_WINDOWS}) + if(${TD_LINUX}) target_include_directories( gtest PUBLIC $ ) endif(${TD_LINUX}) + if(${TD_DARWIN}) target_include_directories( gtest PUBLIC $ ) endif(${TD_DARWIN}) - endif(${BUILD_TEST}) # cJson @@ -236,15 +234,16 @@ option(CJSON_BUILD_SHARED_LIBS "Overrides BUILD_SHARED_LIBS if CJSON_OVERRIDE_BU add_subdirectory(cJson EXCLUDE_FROM_ALL) target_include_directories( cjson + # see https://stackoverflow.com/questions/25676277/cmake-target-include-directories-prints-an-error-when-i-try-to-add-the-source PUBLIC $ ) unset(CMAKE_PROJECT_INCLUDE_BEFORE) # xml2 -#if(${BUILD_WITH_S3}) -# add_subdirectory(xml2 EXCLUDE_FROM_ALL) -#endif() +# if(${BUILD_WITH_S3}) +# add_subdirectory(xml2 EXCLUDE_FROM_ALL) +# endif() # lz4 add_subdirectory(lz4/build/cmake EXCLUDE_FROM_ALL) @@ -255,10 +254,12 @@ target_include_directories( # zlib set(CMAKE_PROJECT_INCLUDE_BEFORE "${TD_SUPPORT_DIR}/EnableCMP0048.txt.in") + if(${TD_DARWIN}) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-error=deprecated-non-prototype") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=deprecated-non-prototype") endif(${TD_DARWIN}) + add_subdirectory(zlib EXCLUDE_FROM_ALL) target_include_directories( zlibstatic @@ -274,9 +275,9 @@ unset(CMAKE_PROJECT_INCLUDE_BEFORE) # add_subdirectory(xz EXCLUDE_FROM_ALL) # target_include_directories( -# xz -# PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/xz -# PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/xz +# xz +# PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/xz +# PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/xz # ) # leveldb @@ -291,24 +292,27 @@ endif(${BUILD_WITH_LEVELDB}) # rocksdb # To support rocksdb build on ubuntu: sudo apt-get install libgflags-dev -if (${BUILD_WITH_UV}) +if(${BUILD_WITH_UV}) if(${TD_LINUX}) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS_REL}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_REL}") - IF ("${CMAKE_BUILD_TYPE}" STREQUAL "") + + if("${CMAKE_BUILD_TYPE}" STREQUAL "") SET(CMAKE_BUILD_TYPE Release) endif() endif(${TD_LINUX}) -endif (${BUILD_WITH_UV}) +endif(${BUILD_WITH_UV}) -if (${BUILD_WITH_ROCKSDB}) - if (${BUILD_CONTRIB}) +if(${BUILD_WITH_ROCKSDB}) + if(${BUILD_CONTRIB}) if(${TD_LINUX}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_REL} -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable -Wno-error=unused-variable -Wno-error=unused-function -Wno-errno=unused-private-field -Wno-error=unused-result") - if ("${CMAKE_BUILD_TYPE}" STREQUAL "") + + if("${CMAKE_BUILD_TYPE}" STREQUAL "") SET(CMAKE_BUILD_TYPE Release) endif() endif(${TD_LINUX}) + MESSAGE(STATUS "ROCKSDB CXXXX STATUS CONFIG: " ${CMAKE_CXX_FLAGS}) MESSAGE(STATUS "ROCKSDB C STATUS CONFIG: " ${CMAKE_C_FLAGS}) @@ -316,22 +320,23 @@ if (${BUILD_WITH_ROCKSDB}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=maybe-uninitialized") endif(${TD_DARWIN}) - if (${TD_DARWIN_ARM64}) + if(${TD_DARWIN_ARM64}) set(HAS_ARMV8_CRC true) endif(${TD_DARWIN_ARM64}) - if (${TD_WINDOWS}) + if(${TD_WINDOWS}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4244 /wd4819 /std:c++17") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4244 /wd4819") option(WITH_JNI "" OFF) + if(CMAKE_C_FLAGS MATCHES "/MT" OR CMAKE_C_FLAGS MATCHES "/MTd") - message("Rocksdb build runtime lib use /MT or /MTd") - option(WITH_MD_LIBRARY "build with MD" OFF) + message("Rocksdb build runtime lib use /MT or /MTd") + option(WITH_MD_LIBRARY "build with MD" OFF) endif() + set(SYSTEM_LIBS ${SYSTEM_LIBS} shlwapi.lib rpcrt4.lib) endif(${TD_WINDOWS}) - if(${TD_DARWIN}) option(HAVE_THREAD_LOCAL "" OFF) option(WITH_IOSTATS_CONTEXT "" OFF) @@ -357,30 +362,32 @@ if (${BUILD_WITH_ROCKSDB}) PUBLIC $ ) else() - if (NOT ${TD_LINUX}) + if(NOT ${TD_LINUX}) MESSAGE(STATUS "ROCKSDB CXX STATUS CONFIG: " ${CMAKE_CXX_FLAGS}) MESSAGE(STATUS "ROCKSDB C STATUS CONFIG: " ${CMAKE_C_FLAGS}) + if(${TD_DARWIN}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=maybe-uninitialized") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-error=maybe-uninitialized") endif(${TD_DARWIN}) - if (${TD_DARWIN_ARM64}) + if(${TD_DARWIN_ARM64}) set(HAS_ARMV8_CRC true) endif(${TD_DARWIN_ARM64}) - if (${TD_WINDOWS}) + if(${TD_WINDOWS}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4244 /wd4819 /std:c++17") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4244 /wd4819") option(WITH_JNI "" OFF) + if(CMAKE_C_FLAGS MATCHES "/MT" OR CMAKE_C_FLAGS MATCHES "/MTd") message("Rocksdb build runtime lib use /MT or /MTd") option(WITH_MD_LIBRARY "build with MD" OFF) endif() + set(SYSTEM_LIBS ${SYSTEM_LIBS} shlwapi.lib rpcrt4.lib) endif(${TD_WINDOWS}) - if(${TD_DARWIN}) option(HAVE_THREAD_LOCAL "" OFF) option(WITH_IOSTATS_CONTEXT "" OFF) @@ -406,44 +413,44 @@ if (${BUILD_WITH_ROCKSDB}) PUBLIC $ ) endif() - endif() endif() if(${BUILD_WITH_S3}) INCLUDE_DIRECTORIES($ENV{HOME}/.cos-local.2/include) MESSAGE("build with s3: ${BUILD_WITH_S3}") + # cos elseif(${BUILD_WITH_COS}) - if(${TD_LINUX}) - set(CMAKE_PREFIX_PATH $ENV{HOME}/.cos-local.1) - #ADD_DEFINITIONS(-DMINIXML_LIBRARY=${CMAKE_BINARY_DIR}/build/lib/libxml.a) - option(ENABLE_TEST "Enable the tests" OFF) - INCLUDE_DIRECTORIES($ENV{HOME}/.cos-local.1/include) - #MESSAGE("$ENV{HOME}/.cos-local.1/include") + if(${TD_LINUX}) + set(CMAKE_PREFIX_PATH $ENV{HOME}/.cos-local.1) - set(CMAKE_BUILD_TYPE Release) - set(ORIG_CMAKE_PROJECT_NAME ${CMAKE_PROJECT_NAME}) - set(CMAKE_PROJECT_NAME cos_c_sdk) + # ADD_DEFINITIONS(-DMINIXML_LIBRARY=${CMAKE_BINARY_DIR}/build/lib/libxml.a) + option(ENABLE_TEST "Enable the tests" OFF) + INCLUDE_DIRECTORIES($ENV{HOME}/.cos-local.1/include) - add_subdirectory(cos-c-sdk-v5 EXCLUDE_FROM_ALL) - target_include_directories( - cos_c_sdk - PUBLIC $ - ) + # MESSAGE("$ENV{HOME}/.cos-local.1/include") + set(CMAKE_BUILD_TYPE Release) + set(ORIG_CMAKE_PROJECT_NAME ${CMAKE_PROJECT_NAME}) + set(CMAKE_PROJECT_NAME cos_c_sdk) - set(CMAKE_PROJECT_NAME ${ORIG_CMAKE_PROJECT_NAME}) - else() - - endif(${TD_LINUX}) + add_subdirectory(cos-c-sdk-v5 EXCLUDE_FROM_ALL) + target_include_directories( + cos_c_sdk + PUBLIC $ + ) + set(CMAKE_PROJECT_NAME ${ORIG_CMAKE_PROJECT_NAME}) + else() + endif(${TD_LINUX}) endif() # pthread if(${BUILD_PTHREAD}) - if ("${CMAKE_BUILD_TYPE}" STREQUAL "") - SET(CMAKE_BUILD_TYPE Release) + if("${CMAKE_BUILD_TYPE}" STREQUAL "") + SET(CMAKE_BUILD_TYPE Release) endif() + add_definitions(-DPTW32_STATIC_LIB) add_subdirectory(pthread EXCLUDE_FROM_ALL) set_target_properties(libpthreadVC3 PROPERTIES OUTPUT_NAME pthread) @@ -451,16 +458,15 @@ if(${BUILD_PTHREAD}) target_link_libraries(pthread INTERFACE libpthreadVC3) endif() - # jemalloc if(${JEMALLOC_ENABLED}) include(ExternalProject) ExternalProject_Add(jemalloc - PREFIX "jemalloc" - SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/jemalloc - BUILD_IN_SOURCE 1 - CONFIGURE_COMMAND ./autogen.sh COMMAND ./configure --prefix=${CMAKE_BINARY_DIR}/build/ --disable-initial-exec-tls - BUILD_COMMAND ${MAKE} + PREFIX "jemalloc" + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/jemalloc + BUILD_IN_SOURCE 1 + CONFIGURE_COMMAND ./autogen.sh COMMAND ./configure --prefix=${CMAKE_BINARY_DIR}/build/ --disable-initial-exec-tls + BUILD_COMMAND ${MAKE} ) INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/build/include) endif() @@ -514,12 +520,13 @@ endif(${BUILD_WCWIDTH}) # LIBUV if(${BUILD_WITH_UV}) - if (TD_WINDOWS) + if(TD_WINDOWS) # There is no GetHostNameW function on win7. file(READ "libuv/src/win/util.c" LIBUV_WIN_UTIL_CONTENT) string(REPLACE "if (GetHostNameW(buf, UV_MAXHOSTNAMESIZE" "DWORD nSize = UV_MAXHOSTNAMESIZE;\n if (GetComputerNameW(buf, &nSize" LIBUV_WIN_UTIL_CONTENT "${LIBUV_WIN_UTIL_CONTENT}") file(WRITE "libuv/src/win/util.c" "${LIBUV_WIN_UTIL_CONTENT}") - endif () + endif() + add_subdirectory(libuv EXCLUDE_FROM_ALL) endif(${BUILD_WITH_UV}) @@ -535,6 +542,7 @@ if(${BUILD_WITH_SQLITE}) INTERFACE m INTERFACE pthread ) + if(NOT TD_WINDOWS) target_link_libraries(sqlite INTERFACE dl @@ -545,36 +553,38 @@ endif(${BUILD_WITH_SQLITE}) # addr2line if(${BUILD_ADDR2LINE}) if(NOT ${TD_WINDOWS}) - check_include_file( "sys/types.h" HAVE_SYS_TYPES_H) - check_include_file( "sys/stat.h" HAVE_SYS_STAT_H ) - check_include_file( "inttypes.h" HAVE_INTTYPES_H ) - check_include_file( "stddef.h" HAVE_STDDEF_H ) - check_include_file( "stdlib.h" HAVE_STDLIB_H ) - check_include_file( "string.h" HAVE_STRING_H ) - check_include_file( "memory.h" HAVE_MEMORY_H ) - check_include_file( "strings.h" HAVE_STRINGS_H ) - check_include_file( "stdint.h" HAVE_STDINT_H ) - check_include_file( "unistd.h" HAVE_UNISTD_H ) - check_include_file( "sgidefs.h" HAVE_SGIDEFS_H ) - check_include_file( "stdafx.h" HAVE_STDAFX_H ) - check_include_file( "elf.h" HAVE_ELF_H ) - check_include_file( "libelf.h" HAVE_LIBELF_H ) - check_include_file( "libelf/libelf.h" HAVE_LIBELF_LIBELF_H) - check_include_file( "alloca.h" HAVE_ALLOCA_H ) - check_include_file( "elfaccess.h" HAVE_ELFACCESS_H) - check_include_file( "sys/elf_386.h" HAVE_SYS_ELF_386_H ) - check_include_file( "sys/elf_amd64.h" HAVE_SYS_ELF_AMD64_H) - check_include_file( "sys/elf_sparc.h" HAVE_SYS_ELF_SPARC_H) - check_include_file( "sys/ia64/elf.h" HAVE_SYS_IA64_ELF_H ) + check_include_file("sys/types.h" HAVE_SYS_TYPES_H) + check_include_file("sys/stat.h" HAVE_SYS_STAT_H) + check_include_file("inttypes.h" HAVE_INTTYPES_H) + check_include_file("stddef.h" HAVE_STDDEF_H) + check_include_file("stdlib.h" HAVE_STDLIB_H) + check_include_file("string.h" HAVE_STRING_H) + check_include_file("memory.h" HAVE_MEMORY_H) + check_include_file("strings.h" HAVE_STRINGS_H) + check_include_file("stdint.h" HAVE_STDINT_H) + check_include_file("unistd.h" HAVE_UNISTD_H) + check_include_file("sgidefs.h" HAVE_SGIDEFS_H) + check_include_file("stdafx.h" HAVE_STDAFX_H) + check_include_file("elf.h" HAVE_ELF_H) + check_include_file("libelf.h" HAVE_LIBELF_H) + check_include_file("libelf/libelf.h" HAVE_LIBELF_LIBELF_H) + check_include_file("alloca.h" HAVE_ALLOCA_H) + check_include_file("elfaccess.h" HAVE_ELFACCESS_H) + check_include_file("sys/elf_386.h" HAVE_SYS_ELF_386_H) + check_include_file("sys/elf_amd64.h" HAVE_SYS_ELF_AMD64_H) + check_include_file("sys/elf_sparc.h" HAVE_SYS_ELF_SPARC_H) + check_include_file("sys/ia64/elf.h" HAVE_SYS_IA64_ELF_H) set(VERSION 0.3.1) set(PACKAGE_VERSION "\"${VERSION}\"") configure_file(libdwarf/cmake/config.h.cmake config.h) file(GLOB_RECURSE LIBDWARF_SOURCES "libdwarf/src/lib/libdwarf/*.c") add_library(libdwarf STATIC ${LIBDWARF_SOURCES}) set_target_properties(libdwarf PROPERTIES OUTPUT_NAME "libdwarf") + if(HAVE_LIBELF_H OR HAVE_LIBELF_LIBELF_H) target_link_libraries(libdwarf PUBLIC libelf) endif() + target_include_directories(libdwarf SYSTEM PUBLIC "libdwarf/src/lib/libdwarf" ${CMAKE_CURRENT_BINARY_DIR}) file(READ "addr2line/addr2line.c" ADDR2LINE_CONTENT) string(REPLACE "static int" "int" ADDR2LINE_CONTENT "${ADDR2LINE_CONTENT}") @@ -583,7 +593,7 @@ if(${BUILD_ADDR2LINE}) file(WRITE "addr2line/addr2line.c" "${ADDR2LINE_CONTENT}") add_library(addr2line STATIC "addr2line/addr2line.c") target_link_libraries(addr2line PUBLIC libdwarf dl z) - target_include_directories(addr2line PUBLIC "libdwarf/src/lib/libdwarf" ) + target_include_directories(addr2line PUBLIC "libdwarf/src/lib/libdwarf") endif(NOT ${TD_WINDOWS}) endif(${BUILD_ADDR2LINE}) @@ -592,31 +602,41 @@ if(${BUILD_GEOS}) if(${TD_LINUX}) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS_REL}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_REL}") - if ("${CMAKE_BUILD_TYPE}" STREQUAL "") + + if("${CMAKE_BUILD_TYPE}" STREQUAL "") SET(CMAKE_BUILD_TYPE Release) endif() endif(${TD_LINUX}) + option(BUILD_SHARED_LIBS "Build GEOS with shared libraries" OFF) add_subdirectory(geos EXCLUDE_FROM_ALL) - if (${TD_WINDOWS}) + + if(${TD_WINDOWS}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") - else () + else() unset(CMAKE_CXX_STANDARD CACHE) # undo libgeos's setting of global CMAKE_CXX_STANDARD endif(${TD_WINDOWS}) + target_include_directories( geos_c PUBLIC $ ) endif(${BUILD_GEOS}) -if (${BUILD_PCRE2}) +if(${BUILD_PCRE2}) add_subdirectory(pcre2 EXCLUDE_FROM_ALL) endif(${BUILD_PCRE2}) +if(${TD_LINUX} AND ${BUILD_WITH_S3}) + add_subdirectory(azure-cmake EXCLUDE_FROM_ALL) +endif() + # ================================================================================================ # Build test # ================================================================================================ +MESSAGE("build with dependency tests: ${BUILD_DEPENDENCY_TESTS}") + if(${BUILD_DEPENDENCY_TESTS}) add_subdirectory(test EXCLUDE_FROM_ALL) endif(${BUILD_DEPENDENCY_TESTS}) diff --git a/contrib/azure-cmake/CMakeLists.txt b/contrib/azure-cmake/CMakeLists.txt new file mode 100644 index 0000000000..aaa5617860 --- /dev/null +++ b/contrib/azure-cmake/CMakeLists.txt @@ -0,0 +1,73 @@ +# lib_azure_sdk +set(AZURE_DIR "${TD_CONTRIB_DIR}/azure-sdk-for-cpp-azure-storage-blobs_12.13.0-beta.1") +set(AZURE_SDK_LIBRARY_DIR "${AZURE_DIR}/sdk") + +file(GLOB AZURE_SDK_SRC + "${AZURE_SDK_LIBRARY_DIR}/core/azure-core/src/*.cpp" + "${AZURE_SDK_LIBRARY_DIR}/core/azure-core/src/credentials/*.cpp" + "${AZURE_SDK_LIBRARY_DIR}/core/azure-core/src/cryptography/*.cpp" + "${AZURE_SDK_LIBRARY_DIR}/core/azure-core/src/http/*.cpp" + "${AZURE_SDK_LIBRARY_DIR}/core/azure-core/src/http/curl/*.cpp" + "${AZURE_SDK_LIBRARY_DIR}/core/azure-core/src/io/*.cpp" + "${AZURE_SDK_LIBRARY_DIR}/core/azure-core/src/tracing/*.cpp" + "${AZURE_SDK_LIBRARY_DIR}/identity/azure-identity/src/*.cpp" + "${AZURE_SDK_LIBRARY_DIR}/storage/azure-storage-blobs/src/*.cpp" + "${AZURE_SDK_LIBRARY_DIR}/storage/azure-storage-blobs/src/private/*.cpp" + "${AZURE_SDK_LIBRARY_DIR}/storage/azure-storage-common/src/*.cpp" +) + +file(GLOB AZURE_SDK_UNIFIED_SRC + ${AZURE_SDK_SRC} +) + +set(AZURE_SDK_INCLUDES + "${AZURE_SDK_LIBRARY_DIR}/core/azure-core/inc/" + "${AZURE_SDK_LIBRARY_DIR}/identity/azure-identity/inc/" + "${AZURE_SDK_LIBRARY_DIR}/storage/azure-storage-common/inc/" + "${AZURE_SDK_LIBRARY_DIR}/storage/azure-storage-blobs/inc/" +) + +add_library(_azure_sdk STATIC ${AZURE_SDK_UNIFIED_SRC}) +target_compile_definitions(_azure_sdk PRIVATE BUILD_CURL_HTTP_TRANSPORT_ADAPTER) + +target_include_directories( + _azure_sdk + PUBLIC "$ENV{HOME}/.cos-local.2/include" +) + +find_library(CURL_LIBRARY curl $ENV{HOME}/.cos-local.2/lib NO_DEFAULT_PATH) +find_library(XML2_LIBRARY xml2 $ENV{HOME}/.cos-local.2/lib NO_DEFAULT_PATH) + +# find_library(CURL_LIBRARY curl) +# find_library(XML2_LIBRARY xml2) +find_library(SSL_LIBRARY ssl $ENV{HOME}/.cos-local.2/lib64 $ENV{HOME}/.cos-local.2/lib NO_DEFAULT_PATH) +find_library(CRYPTO_LIBRARY crypto $ENV{HOME}/.cos-local.2/lib64 $ENV{HOME}/.cos-local.2/lib NO_DEFAULT_PATH) + +# find_library(CoreFoundation_Library CoreFoundation) +# find_library(SystemConfiguration_Library SystemConfiguration) +target_link_libraries( + _azure_sdk + PRIVATE ${CURL_LIBRARY} + PRIVATE ${SSL_LIBRARY} + PRIVATE ${CRYPTO_LIBRARY} + PRIVATE ${XML2_LIBRARY} + + # PRIVATE xml2 + PRIVATE zlib + + # PRIVATE ${CoreFoundation_Library} + # PRIVATE ${SystemConfiguration_Library} +) + +# Originally, on Windows azure-core is built with bcrypt and crypt32 by default +if(TARGET OpenSSL::SSL) + target_link_libraries(_azure_sdk PRIVATE OpenSSL::Crypto OpenSSL::SSL) +endif() + +# Originally, on Windows azure-core is built with winhttp by default +if(TARGET td_contrib::curl) + target_link_libraries(_azure_sdk PRIVATE td_contrib::curl) +endif() + +target_include_directories(_azure_sdk SYSTEM BEFORE PUBLIC ${AZURE_SDK_INCLUDES}) +add_library(td_contrib::azure_sdk ALIAS _azure_sdk) diff --git a/contrib/test/CMakeLists.txt b/contrib/test/CMakeLists.txt index 1deff5a67e..f544baafde 100644 --- a/contrib/test/CMakeLists.txt +++ b/contrib/test/CMakeLists.txt @@ -28,5 +28,6 @@ if(${BUILD_WITH_TRAFT}) # add_subdirectory(traft) endif(${BUILD_WITH_TRAFT}) +add_subdirectory(azure) add_subdirectory(tdev) add_subdirectory(lz4) diff --git a/contrib/test/azure/CMakeLists.txt b/contrib/test/azure/CMakeLists.txt new file mode 100644 index 0000000000..fade8c9ef6 --- /dev/null +++ b/contrib/test/azure/CMakeLists.txt @@ -0,0 +1,27 @@ +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED True) + +add_executable( + azure-test + main.cpp +) + +find_library(CURL_LIBRARY curl $ENV{HOME}/.cos-local.2/lib NO_DEFAULT_PATH) +find_library(XML2_LIBRARY xml2 $ENV{HOME}/.cos-local.2/lib NO_DEFAULT_PATH) + +# find_library(XML2_LIBRARY xml2) +find_library(SSL_LIBRARY ssl $ENV{HOME}/.cos-local.2/lib64 $ENV{HOME}/.cos-local.2/lib NO_DEFAULT_PATH) +find_library(CRYPTO_LIBRARY crypto $ENV{HOME}/.cos-local.2/lib64 $ENV{HOME}/.cos-local.2/lib NO_DEFAULT_PATH) + +# find_library(CoreFoundation_Library CoreFoundation) +# find_library(SystemConfiguration_Library SystemConfiguration) +target_link_libraries( + azure-test + PRIVATE _azure_sdk + PRIVATE ${CURL_LIBRARY} + PRIVATE ${XML2_LIBRARY} + PRIVATE ${SSL_LIBRARY} + PRIVATE ${CRYPTO_LIBRARY} + PRIVATE dl + PRIVATE pthread +) diff --git a/contrib/test/azure/main.cpp b/contrib/test/azure/main.cpp new file mode 100644 index 0000000000..78ecc8b9f5 --- /dev/null +++ b/contrib/test/azure/main.cpp @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * 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. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include + +// Include the necessary SDK headers +#include +#include + +// Add appropriate using namespace directives +using namespace Azure::Storage; +using namespace Azure::Storage::Blobs; + +// Secrets should be stored & retrieved from secure locations such as Azure::KeyVault. For +// convenience and brevity of samples, the secrets are retrieved from environment variables. + +std::string GetEndpointUrl() { + // return std::getenv("AZURE_STORAGE_ACCOUNT_URL"); + std::string accountId = getenv("ablob_account_id"); + if (accountId.empty()) { + return accountId; + } + + return accountId + ".blob.core.windows.net"; +} + +std::string GetAccountName() { + // return std::getenv("AZURE_STORAGE_ACCOUNT_NAME"); + return getenv("ablob_account_id"); +} + +std::string GetAccountKey() { + // return std::getenv("AZURE_STORAGE_ACCOUNT_KEY"); + + return getenv("ablob_account_secret"); +} + +int main() { + std::string endpointUrl = GetEndpointUrl(); + std::string accountName = GetAccountName(); + std::string accountKey = GetAccountKey(); + + try { + auto sharedKeyCredential = std::make_shared(accountName, accountKey); + + std::string accountURL = "https://fd2d01cd892f844eeaa2273.blob.core.windows.net"; + BlobServiceClient blobServiceClient(accountURL, sharedKeyCredential); + + std::string containerName = "myblobcontainer"; + // auto containerClient = blobServiceClient.GetBlobContainerClient("myblobcontainer"); + auto containerClient = blobServiceClient.GetBlobContainerClient("td-test"); + + // Create the container if it does not exist + std::cout << "Creating container: " << containerName << std::endl; + // containerClient.CreateIfNotExists(); + + std::string blobName = "blob.txt"; + uint8_t blobContent[] = "Hello Azure!"; + // Create the block blob client + BlockBlobClient blobClient = containerClient.GetBlockBlobClient(blobName); + + // Upload the blob + std::cout << "Uploading blob: " << blobName << std::endl; + blobClient.UploadFrom(blobContent, sizeof(blobContent)); + /* + auto blockBlobClient = BlockBlobClient(endpointUrl, sharedKeyCredential); + + // Create some data to upload into the blob. + std::vector data = {1, 2, 3, 4}; + Azure::Core::IO::MemoryBodyStream stream(data); + + Azure::Response response = blockBlobClient.Upload(stream); + + Models::UploadBlockBlobResult model = response.Value; + std::cout << "Last modified date of uploaded blob: " << model.LastModified.ToString() + << std::endl; + */ + } catch (const Azure::Core::RequestFailedException& e) { + std::cout << "Status Code: " << static_cast(e.StatusCode) << ", Reason Phrase: " << e.ReasonPhrase + << std::endl; + std::cout << e.what() << std::endl; + + return 1; + } + + return 0; +} diff --git a/docs/en/14-reference/03-taos-sql/12-distinguished.md b/docs/en/14-reference/03-taos-sql/12-distinguished.md index bfc9ca32c0..2374b762d4 100644 --- a/docs/en/14-reference/03-taos-sql/12-distinguished.md +++ b/docs/en/14-reference/03-taos-sql/12-distinguished.md @@ -80,7 +80,7 @@ These pseudocolumns occur after the aggregation clause. `FILL` clause is used to specify how to fill when there is data missing in any window, including: 1. NONE: No fill (the default fill mode) -2. VALUE: Fill with a fixed value, which should be specified together, for example `FILL(VALUE, 1.23)` Note: The value filled depends on the data type. For example, if you run FILL(VALUE 1.23) on an integer column, the value 1 is filled. If multiple columns in select list need to be filled, then in the fill clause there must be a fill value for each of these columns, for example, `SELECT _wstart, min(c1), max(c1) FROM ... FILL(VALUE, 0, 0)`. +2. VALUE: Fill with a fixed value, which should be specified together, for example `FILL(VALUE, 1.23)` Note: The value filled depends on the data type. For example, if you run FILL(VALUE 1.23) on an integer column, the value 1 is filled. If multiple columns in select list need to be filled, then in the fill clause there must be a fill value for each of these columns, for example, `SELECT _wstart, min(c1), max(c1) FROM ... FILL(VALUE, 0, 0)`. Note that only exprs in select list that contains normal cols need to specify fill value, exprs like `_wstart`, `_wend`, `_wduration`, `_wstart + 1a`, `now`, `1+1`, partition keys like tbname(when using partition by) don't need to specify fill value. But exprs like `timediff(last(ts), _wstart)` need to specify fill value. 3. PREV: Fill with the previous non-NULL value, `FILL(PREV)` 4. NULL: Fill with NULL, `FILL(NULL)` 5. LINEAR: Fill with the closest non-NULL value, `FILL(LINEAR)` diff --git a/docs/examples/JDBC/JDBCDemo/pom.xml b/docs/examples/JDBC/JDBCDemo/pom.xml index 315b147cce..4b3e1ab675 100644 --- a/docs/examples/JDBC/JDBCDemo/pom.xml +++ b/docs/examples/JDBC/JDBCDemo/pom.xml @@ -19,7 +19,7 @@ com.taosdata.jdbc taos-jdbcdriver - 3.3.3 + 3.4.0 org.locationtech.jts diff --git a/docs/examples/JDBC/connectionPools/pom.xml b/docs/examples/JDBC/connectionPools/pom.xml index 1791bfe8bc..e3ef30d2f8 100644 --- a/docs/examples/JDBC/connectionPools/pom.xml +++ b/docs/examples/JDBC/connectionPools/pom.xml @@ -18,7 +18,7 @@ com.taosdata.jdbc taos-jdbcdriver - 3.3.3 + 3.4.0 diff --git a/docs/examples/JDBC/consumer-demo/pom.xml b/docs/examples/JDBC/consumer-demo/pom.xml index dcabfc1249..709f87d9c1 100644 --- a/docs/examples/JDBC/consumer-demo/pom.xml +++ b/docs/examples/JDBC/consumer-demo/pom.xml @@ -17,7 +17,7 @@ com.taosdata.jdbc taos-jdbcdriver - 3.3.3 + 3.4.0 com.google.guava diff --git a/docs/examples/JDBC/taosdemo/pom.xml b/docs/examples/JDBC/taosdemo/pom.xml index ffe159ea49..ab5912aa9e 100644 --- a/docs/examples/JDBC/taosdemo/pom.xml +++ b/docs/examples/JDBC/taosdemo/pom.xml @@ -67,7 +67,7 @@ com.taosdata.jdbc taos-jdbcdriver - 3.3.3 + 3.4.0 diff --git a/docs/examples/java/pom.xml b/docs/examples/java/pom.xml index f23b73177e..e1a9504249 100644 --- a/docs/examples/java/pom.xml +++ b/docs/examples/java/pom.xml @@ -22,7 +22,7 @@ com.taosdata.jdbc taos-jdbcdriver - 3.3.3 + 3.4.0 diff --git a/docs/examples/java/src/main/java/com/taos/example/SchemalessWsTest.java b/docs/examples/java/src/main/java/com/taos/example/SchemalessWsTest.java index 08f66c2227..0f35e38f57 100644 --- a/docs/examples/java/src/main/java/com/taos/example/SchemalessWsTest.java +++ b/docs/examples/java/src/main/java/com/taos/example/SchemalessWsTest.java @@ -17,8 +17,8 @@ public class SchemalessWsTest { private static final String jsonDemo = "{\"metric\": \"metric_json\",\"timestamp\": 1626846400,\"value\": 10.3, \"tags\": {\"groupid\": 2, \"location\": \"California.SanFrancisco\", \"id\": \"d1001\"}}"; public static void main(String[] args) throws SQLException { - final String url = "jdbc:TAOS-RS://" + host + ":6041?user=root&password=taosdata&batchfetch=true"; - try(Connection connection = DriverManager.getConnection(url)){ + final String url = "jdbc:TAOS-WS://" + host + ":6041?user=root&password=taosdata"; + try (Connection connection = DriverManager.getConnection(url)) { init(connection); AbstractConnection conn = connection.unwrap(AbstractConnection.class); diff --git a/docs/examples/java/src/main/java/com/taos/example/WSConnectExample.java b/docs/examples/java/src/main/java/com/taos/example/WSConnectExample.java index afe74ace83..052af71a83 100644 --- a/docs/examples/java/src/main/java/com/taos/example/WSConnectExample.java +++ b/docs/examples/java/src/main/java/com/taos/example/WSConnectExample.java @@ -12,9 +12,9 @@ public class WSConnectExample { public static void main(String[] args) throws Exception { // use // String jdbcUrl = - // "jdbc:TAOS-RS://localhost:6041/dbName?user=root&password=taosdata&batchfetch=true"; + // "jdbc:TAOS-WS://localhost:6041/dbName?user=root&password=taosdata"; // if you want to connect a specified database named "dbName". - String jdbcUrl = "jdbc:TAOS-RS://localhost:6041?user=root&password=taosdata&batchfetch=true"; + String jdbcUrl = "jdbc:TAOS-WS://localhost:6041?user=root&password=taosdata"; Properties connProps = new Properties(); connProps.setProperty(TSDBDriver.PROPERTY_KEY_ENABLE_AUTO_RECONNECT, "true"); connProps.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8"); diff --git a/docs/examples/java/src/main/java/com/taos/example/WSParameterBindingBasicDemo.java b/docs/examples/java/src/main/java/com/taos/example/WSParameterBindingBasicDemo.java index eab8df06b9..1353ebbddc 100644 --- a/docs/examples/java/src/main/java/com/taos/example/WSParameterBindingBasicDemo.java +++ b/docs/examples/java/src/main/java/com/taos/example/WSParameterBindingBasicDemo.java @@ -15,7 +15,7 @@ public class WSParameterBindingBasicDemo { public static void main(String[] args) throws SQLException { - String jdbcUrl = "jdbc:TAOS-RS://" + host + ":6041/?batchfetch=true"; + String jdbcUrl = "jdbc:TAOS-WS://" + host + ":6041"; try (Connection conn = DriverManager.getConnection(jdbcUrl, "root", "taosdata")) { init(conn); @@ -40,7 +40,7 @@ public class WSParameterBindingBasicDemo { pstmt.setFloat(4, random.nextFloat()); pstmt.addBatch(); } - int [] exeResult = pstmt.executeBatch(); + int[] exeResult = pstmt.executeBatch(); // you can check exeResult here System.out.println("Successfully inserted " + exeResult.length + " rows to power.meters."); } @@ -60,7 +60,8 @@ public class WSParameterBindingBasicDemo { try (Statement stmt = conn.createStatement()) { stmt.execute("CREATE DATABASE IF NOT EXISTS power"); stmt.execute("USE power"); - stmt.execute("CREATE STABLE IF NOT EXISTS power.meters (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS (groupId INT, location BINARY(24))"); + stmt.execute( + "CREATE STABLE IF NOT EXISTS power.meters (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS (groupId INT, location BINARY(24))"); } } } diff --git a/docs/examples/java/src/main/java/com/taos/example/WSParameterBindingFullDemo.java b/docs/examples/java/src/main/java/com/taos/example/WSParameterBindingFullDemo.java index f23fb187f4..7eaccb3db2 100644 --- a/docs/examples/java/src/main/java/com/taos/example/WSParameterBindingFullDemo.java +++ b/docs/examples/java/src/main/java/com/taos/example/WSParameterBindingFullDemo.java @@ -40,7 +40,7 @@ public class WSParameterBindingFullDemo { public static void main(String[] args) throws SQLException { - String jdbcUrl = "jdbc:TAOS-RS://" + host + ":6041/?batchfetch=true"; + String jdbcUrl = "jdbc:TAOS-WS://" + host + ":6041/"; try (Connection conn = DriverManager.getConnection(jdbcUrl, "root", "taosdata")) { @@ -51,8 +51,10 @@ public class WSParameterBindingFullDemo { stmtAll(conn); } catch (SQLException ex) { - // handle any errors, please refer to the JDBC specifications for detailed exceptions info - System.out.println("Failed to insert data using stmt, ErrCode:" + ex.getErrorCode() + "; ErrMessage: " + ex.getMessage()); + // handle any errors, please refer to the JDBC specifications for detailed + // exceptions info + System.out.println("Failed to insert data using stmt, ErrCode:" + ex.getErrorCode() + "; ErrMessage: " + + ex.getMessage()); throw ex; } catch (Exception ex) { System.out.println("Failed to insert data using stmt, ErrMessage: " + ex.getMessage()); @@ -104,30 +106,29 @@ public class WSParameterBindingFullDemo { pstmt.setTagBoolean(3, true); pstmt.setTagString(4, "binary_value"); pstmt.setTagNString(5, "nchar_value"); - pstmt.setTagVarbinary(6, new byte[]{(byte) 0x98, (byte) 0xf4, 0x6e}); - pstmt.setTagGeometry(7, new byte[]{ + pstmt.setTagVarbinary(6, new byte[] { (byte) 0x98, (byte) 0xf4, 0x6e }); + pstmt.setTagGeometry(7, new byte[] { 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x59, 0x40}); + 0x00, 0x00, 0x00, 0x59, 0x40 }); long current = System.currentTimeMillis(); - pstmt.setTimestamp(1, new Timestamp(current)); pstmt.setInt(2, 1); pstmt.setDouble(3, 1.1); pstmt.setBoolean(4, true); pstmt.setString(5, "binary_value"); pstmt.setNString(6, "nchar_value"); - pstmt.setVarbinary(7, new byte[]{(byte) 0x98, (byte) 0xf4, 0x6e}); - pstmt.setGeometry(8, new byte[]{ + pstmt.setVarbinary(7, new byte[] { (byte) 0x98, (byte) 0xf4, 0x6e }); + pstmt.setGeometry(8, new byte[] { 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x59, 0x40}); + 0x00, 0x00, 0x00, 0x59, 0x40 }); pstmt.addBatch(); pstmt.executeBatch(); System.out.println("Successfully inserted rows to example_all_type_stmt.ntb"); diff --git a/docs/zh/05-basic/02-insert.md b/docs/zh/05-basic/02-insert.md index 0c7ffd86a4..88d131e832 100644 --- a/docs/zh/05-basic/02-insert.md +++ b/docs/zh/05-basic/02-insert.md @@ -111,7 +111,7 @@ TDengine 还支持直接向超级表写入数据。需要注意的是,超级 ```sql insert into meters (tbname, ts, current, voltage, phase, location, group_id) -values( "d1001v, "2018-10-03 14:38:05", 10.2, 220, 0.23, "California.SanFrancisco", 2) +values( "d1001, "2018-10-03 14:38:05", 10.2, 220, 0.23, "California.SanFrancisco", 2) ``` ### 零代码写入 diff --git a/docs/zh/07-develop/01-connect/_connect_rust.mdx b/docs/zh/07-develop/01-connect/_connect_rust.mdx index 0e65e8f920..d88a3335ca 100644 --- a/docs/zh/07-develop/01-connect/_connect_rust.mdx +++ b/docs/zh/07-develop/01-connect/_connect_rust.mdx @@ -3,6 +3,6 @@ ``` :::note -对于 Rust 连接器, 连接方式的不同只体现在使用的特性不同。如果启用了 "ws" 特性,那么只有 Websocket 的实现会被编译进来。 +对于 Rust 连接器, 连接方式的不同只体现在使用的特性不同。如果启用了 "ws" 特性,那么只有 WebSocket 的实现会被编译进来。 ::: diff --git a/docs/zh/07-develop/01-connect/index.md b/docs/zh/07-develop/01-connect/index.md index 1dfb95d169..bd26bea46d 100644 --- a/docs/zh/07-develop/01-connect/index.md +++ b/docs/zh/07-develop/01-connect/index.md @@ -28,7 +28,7 @@ TDengine 提供了丰富的应用程序开发接口,为了便于用户快速 1. 通过客户端驱动程序 taosc 直接与服务端程序 taosd 建立连接,这种连接方式下文中简称 “原生连接”。 2. 通过 taosAdapter 组件提供的 REST API 建立与 taosd 的连接,这种连接方式下文中简称 “REST 连接” -3. 通过 taosAdapter 组件提供的 Websocket API 建立与 taosd 的连接,这种连接方式下文中简称 “Websocket 连接” +3. 通过 taosAdapter 组件提供的 WebSocket API 建立与 taosd 的连接,这种连接方式下文中简称 “WebSocket 连接” ![TDengine connection type](connection-type-zh.webp) @@ -38,9 +38,9 @@ TDengine 提供了丰富的应用程序开发接口,为了便于用户快速 关键不同点在于: 1. 使用 原生连接,需要保证客户端的驱动程序 taosc 和服务端的 TDengine 版本配套。 -2. 使用 REST 连接,用户无需安装客户端驱动程序 taosc,具有跨平台易用的优势,但是无法体验数据订阅和二进制数据类型等功能。另外与 原生连接 和 Websocket 连接相比,REST连接的性能最低。REST 接口是无状态的。在使用 REST 连接时,需要在 SQL 中指定表、超级表的数据库名称。 -3. 使用 Websocket 连接,用户也无需安装客户端驱动程序 taosc。 -4. 连接云服务实例,必须使用 REST 连接 或 Websocket 连接。 +2. 使用 REST 连接,用户无需安装客户端驱动程序 taosc,具有跨平台易用的优势,但是无法体验数据订阅和二进制数据类型等功能。另外与 原生连接 和 WebSocket 连接相比,REST连接的性能最低。REST 接口是无状态的。在使用 REST 连接时,需要在 SQL 中指定表、超级表的数据库名称。 +3. 使用 WebSocket 连接,用户也无需安装客户端驱动程序 taosc。 +4. 连接云服务实例,必须使用 REST 连接 或 WebSocket 连接。 **推荐使用 WebSocket 连接** @@ -126,7 +126,7 @@ TDengine 提供了丰富的应用程序开发接口,为了便于用户快速 ```bash pip3 install taos-ws-py ``` - :::note 此安装包为 Websocket 连接器 + :::note 此安装包为 WebSocket 连接器 - 同时安装 `taospy` 和 `taos-ws-py` ```bash pip3 install taospy[ws] @@ -182,7 +182,7 @@ taos = { version = "*"} ``` :::info -Rust 连接器通过不同的特性区分不同的连接方式。默认同时支持原生连接和 Websocket 连接,如果仅需要建立 Websocket 连接,可设置 `ws` 特性: +Rust 连接器通过不同的特性区分不同的连接方式。默认同时支持原生连接和 WebSocket 连接,如果仅需要建立 WebSocket 连接,可设置 `ws` 特性: ```toml taos = { version = "*", default-features = false, features = ["ws"] } @@ -201,7 +201,7 @@ taos = { version = "*", default-features = false, features = ["ws"] } ``` npm install @tdengine/websocket ``` - :::note Node.js 目前只支持 Websocket 连接 + :::note Node.js 目前只支持 WebSocket 连接 - **安装验证** - 新建安装验证目录,例如:`~/tdengine-test`,下载 GitHub 上 [nodejsChecker.js 源代码](https://github.com/taosdata/TDengine/tree/main/docs/examples/node/websocketexample/nodejsChecker.js)到本地。 - 在命令行中执行以下命令。 @@ -271,12 +271,10 @@ dotnet add package TDengine.Connector Java 连接器建立连接的参数有 URL 和 Properties。 TDengine 的 JDBC URL 规范格式为: - `jdbc:[TAOS|TAOS-RS]://[host_name]:[port]/[database_name]?[user={user}|&password={password}|&charset={charset}|&cfgdir={config_dir}|&locale={locale}|&timezone={timezone}|&batchfetch={batchfetch}]` + `jdbc:[TAOS|TAOS-WS|TAOS-RS]://[host_name]:[port]/[database_name]?[user={user}|&password={password}|&charset={charset}|&cfgdir={config_dir}|&locale={locale}|&timezone={timezone}|&batchfetch={batchfetch}]` URL 和 Properties 的详细参数说明和如何使用详见 [url 规范](../../reference/connector/java/#url-规范) - **注**:REST 连接中增加 `batchfetch` 参数并设置为 true,将开启 WebSocket 连接。 - Python 连接器使用 `connect()` 方法来建立连接,下面是连接参数的具体说明: @@ -387,8 +385,8 @@ DSN 的详细说明和如何使用详见 [连接功能](../../reference/connecto - `reconnectIntervalMs`:重连间隔毫秒时间,默认为 2000。 -**Websocket 连接** -C/C++ 语言连接器 Websocket 连接方式使用 `ws_connect()` 函数用于建立与 TDengine 数据库的连接。其参数为 DSN 描述字符串,其基本结构如下: +**WebSocket 连接** +C/C++ 语言连接器 WebSocket 连接方式使用 `ws_connect()` 函数用于建立与 TDengine 数据库的连接。其参数为 DSN 描述字符串,其基本结构如下: ```text [+]://[[:@]:][/][?=[&=]] @@ -417,8 +415,8 @@ C/C++ 语言连接器原生连接方式使用 `taos_connect()` 函数用于建 -### Websocket 连接 -下面是各语言连接器建立 Websocket 连接代码样例。演示了如何使用 Websocket 连接方式连接到 TDengine 数据库,并对连接设定一些参数。整个过程主要涉及到数据库连接的建立和异常处理。 +### WebSocket 连接 +下面是各语言连接器建立 WebSocket 连接代码样例。演示了如何使用 WebSocket 连接方式连接到 TDengine 数据库,并对连接设定一些参数。整个过程主要涉及到数据库连接的建立和异常处理。 diff --git a/docs/zh/07-develop/02-sql.md b/docs/zh/07-develop/02-sql.md index 5461c975dd..b4274045fc 100644 --- a/docs/zh/07-develop/02-sql.md +++ b/docs/zh/07-develop/02-sql.md @@ -33,7 +33,7 @@ REST API:直接调用 `taosadapter` 提供的 REST API 接口,进行数据 -```python title="Websocket 连接" +```python title="WebSocket 连接" {{#include docs/examples/python/create_db_ws.py}} ``` @@ -69,7 +69,7 @@ REST API:直接调用 `taosadapter` 提供的 REST API 接口,进行数据 -```c title="Websocket 连接" +```c title="WebSocket 连接" {{#include docs/examples/c-ws/create_db_demo.c:create_db_and_table}} ``` @@ -114,7 +114,7 @@ NOW 为系统内部函数,默认为客户端所在计算机当前时间。 NOW -```python title="Websocket 连接" +```python title="WebSocket 连接" {{#include docs/examples/python/insert_ws.py}} ``` @@ -151,7 +151,7 @@ NOW 为系统内部函数,默认为客户端所在计算机当前时间。 NOW -```c title="Websocket 连接" +```c title="WebSocket 连接" {{#include docs/examples/c-ws/insert_data_demo.c:insert_data}} ``` @@ -189,7 +189,7 @@ curl --location -uroot:taosdata 'http://127.0.0.1:6041/rest/sql' \ -```python title="Websocket 连接" +```python title="WebSocket 连接" {{#include docs/examples/python/query_ws.py}} ``` @@ -230,7 +230,7 @@ rust 连接器还支持使用 **serde** 进行反序列化行为结构体的结 -```c title="Websocket 连接" +```c title="WebSocket 连接" {{#include docs/examples/c-ws/query_data_demo.c:query_data}} ``` @@ -273,7 +273,7 @@ reqId 可用于请求链路追踪,reqId 就像分布式系统中的 traceId -```python title="Websocket 连接" +```python title="WebSocket 连接" {{#include docs/examples/python/reqid_ws.py}} ``` @@ -310,7 +310,7 @@ reqId 可用于请求链路追踪,reqId 就像分布式系统中的 traceId -```c "Websocket 连接" +```c "WebSocket 连接" {{#include docs/examples/c-ws/with_reqid_demo.c:with_reqid}} ``` diff --git a/docs/zh/07-develop/04-schemaless.md b/docs/zh/07-develop/04-schemaless.md index a865b58b28..bf10b41736 100644 --- a/docs/zh/07-develop/04-schemaless.md +++ b/docs/zh/07-develop/04-schemaless.md @@ -191,7 +191,7 @@ st,t1=3,t2=4,t3=t3 c1=3i64,c6="passit" 1626006833640000000 ::: -### Websocket 连接 +### WebSocket 连接 diff --git a/docs/zh/07-develop/05-stmt.md b/docs/zh/07-develop/05-stmt.md index 624600ba4d..74b44ba8e6 100644 --- a/docs/zh/07-develop/05-stmt.md +++ b/docs/zh/07-develop/05-stmt.md @@ -23,7 +23,7 @@ import TabItem from "@theme/TabItem"; - 执行批量插入操作,将这些数据行插入到对应的子表中。 3. 最后打印实际插入表中的行数。 -## Websocket 连接 +## WebSocket 连接 ```java diff --git a/docs/zh/07-develop/07-tmq.md b/docs/zh/07-develop/07-tmq.md index c668203259..a91a764c67 100644 --- a/docs/zh/07-develop/07-tmq.md +++ b/docs/zh/07-develop/07-tmq.md @@ -94,7 +94,7 @@ Rust 连接器创建消费者的参数为 DSN, 可以设置的参数列表请 -- Websocket 连接: 因为使用 dsn,不需要 `td.connect.ip`,`td.connect.port`,`td.connect.user` 和 `td.connect.pass` 四个配置项,其余同通用配置项。 +- WebSocket 连接: 因为使用 dsn,不需要 `td.connect.ip`,`td.connect.port`,`td.connect.user` 和 `td.connect.pass` 四个配置项,其余同通用配置项。 - 原生连接: 同通用基础配置项。 @@ -103,8 +103,8 @@ Rust 连接器创建消费者的参数为 DSN, 可以设置的参数列表请 -### Websocket 连接 -介绍各语言连接器使用 Websocket 连接方式创建消费者。指定连接的服务器地址,设置自动提交,从最新消息开始消费,指定 `group.id` 和 `client.id` 等信息。有的语言的连接器还支持反序列化参数。 +### WebSocket 连接 +介绍各语言连接器使用 WebSocket 连接方式创建消费者。指定连接的服务器地址,设置自动提交,从最新消息开始消费,指定 `group.id` 和 `client.id` 等信息。有的语言的连接器还支持反序列化参数。 @@ -234,7 +234,7 @@ Rust 连接器创建消费者的参数为 DSN, 可以设置的参数列表请 ## 订阅消费数据 消费者订阅主题后,可以开始接收并处理这些主题中的消息。订阅消费数据的示例代码如下: -### Websocket 连接 +### WebSocket 连接 @@ -403,7 +403,7 @@ Rust 连接器创建消费者的参数为 DSN, 可以设置的参数列表请 ## 指定订阅的 Offset 消费者可以指定从特定 Offset 开始读取分区中的消息,这允许消费者重读消息或跳过已处理的消息。下面展示各语言连接器如何指定订阅的 Offset。 -### Websocket 连接 +### WebSocket 连接 @@ -549,7 +549,7 @@ Rust 连接器创建消费者的参数为 DSN, 可以设置的参数列表请 **注意**:手工提交消费进度前确保消息正常处理完成,否则处理出错的消息不会被再次消费。自动提交是在本次 `poll` 消息时可能会提交上次消息的消费进度,因此请确保消息处理完毕再进行下一次 `poll` 或消息获取。 -### Websocket 连接 +### WebSocket 连接 @@ -663,7 +663,7 @@ Rust 连接器创建消费者的参数为 DSN, 可以设置的参数列表请 ## 取消订阅和关闭消费 消费者可以取消对主题的订阅,停止接收消息。当消费者不再需要时,应该关闭消费者实例,以释放资源和断开与 TDengine 服务器的连接。 -### Websocket 连接 +### WebSocket 连接 @@ -766,7 +766,7 @@ Rust 连接器创建消费者的参数为 DSN, 可以设置的参数列表请 ## 完整示例 -### Websocket 连接 +### WebSocket 连接
diff --git a/docs/zh/08-operation/18-dual.md b/docs/zh/08-operation/18-dual.md index c7871a8e1e..caddb7ab3b 100644 --- a/docs/zh/08-operation/18-dual.md +++ b/docs/zh/08-operation/18-dual.md @@ -30,9 +30,8 @@ toc_max_heading_level: 4 目前只有 Java 连接器在 WebSocket 连接模式下支持双活,其配置示例如下 ```java -url = "jdbc:TAOS-RS://" + host + ":6041/?user=root&password=taosdata"; +url = "jdbc:TAOS-WS://" + host + ":6041/?user=root&password=taosdata"; Properties properties = new Properties(); -properties.setProperty(TSDBDriver.PROPERTY_KEY_BATCH_LOAD, "true"); properties.setProperty(TSDBDriver.PROPERTY_KEY_SLAVE_CLUSTER_HOST, "192.168.1.11"); properties.setProperty(TSDBDriver.PROPERTY_KEY_SLAVE_CLUSTER_PORT, "6041"); properties.setProperty(TSDBDriver.PROPERTY_KEY_ENABLE_AUTO_RECONNECT, "true"); @@ -43,13 +42,13 @@ connection = DriverManager.getConnection(url, properties); 其中的配置属性及含义如下表 -| 属性名 | 含义 | -| ----------------- | ------------------ | -| PROPERTY_KEY_SLAVE_CLUSTER_HOST | 第二节点的主机名或者 ip,默认空 | -| PROPERTY_KEY_SLAVE_CLUSTER_PORT | 第二节点的端口号,默认空 | -| PROPERTY_KEY_ENABLE_AUTO_RECONNECT | 是否启用自动重连。仅在使用 Websocket 连接时生效。true: 启用,false: 不启用。默认为 false。双活场景下请设置为 true | -| PROPERTY_KEY_RECONNECT_INTERVAL_MS | 重连的时间间隔,单位毫秒:默认 2000 毫秒,也就是 2 秒;最小值为 0, 表示立即重试;最大值不做限制 | -| PROPERTY_KEY_RECONNECT_RETRY_COUNT | 每节点最多重试次数:默认值为 3;最小值为 0,表示不进行重试;最大值不做限制 | +| 属性名 | 含义 | +| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------- | +| PROPERTY_KEY_SLAVE_CLUSTER_HOST | 第二节点的主机名或者 ip,默认空 | +| PROPERTY_KEY_SLAVE_CLUSTER_PORT | 第二节点的端口号,默认空 | +| PROPERTY_KEY_ENABLE_AUTO_RECONNECT | 是否启用自动重连。仅在使用 WebSocket 连接时生效。true: 启用,false: 不启用。默认为 false。双活场景下请设置为 true | +| PROPERTY_KEY_RECONNECT_INTERVAL_MS | 重连的时间间隔,单位毫秒:默认 2000 毫秒,也就是 2 秒;最小值为 0, 表示立即重试;最大值不做限制 | +| PROPERTY_KEY_RECONNECT_RETRY_COUNT | 每节点最多重试次数:默认值为 3;最小值为 0,表示不进行重试;最大值不做限制 | ### 约束条件 diff --git a/docs/zh/14-reference/01-components/02-taosc.md b/docs/zh/14-reference/01-components/02-taosc.md index 32baac9a3b..5f22ebe8d5 100755 --- a/docs/zh/14-reference/01-components/02-taosc.md +++ b/docs/zh/14-reference/01-components/02-taosc.md @@ -10,7 +10,7 @@ TDengine 客户端驱动提供了应用编程所需要的全部 API,并且在 | 参数名称 | 参数含义 | |:-----------:|:----------------------------------------------------------:| -|firstEp | taos 启动时,主动连接的集群中首个 dnode 的 endpoint,缺省值:localhost:6030 | +|firstEp | taos 启动时,主动连接的集群中首个 dnode 的 endpoint,缺省值:${hostname}:6030,若无法获取 ${hostname},则赋值为 localhost | |secondEp | 启动时,如果 firstEp 连接不上,尝试连接集群中第二个 dnode 的 endpoint,没有缺省值 | |numOfRpcSessions | 一个客户端能创建的最大连接数,取值范围:10-50000000(单位为毫秒);缺省值:500000 | |telemetryReporting | 是否上传 telemetry,0: 不上传,1: 上传;缺省值:1 | diff --git a/docs/zh/14-reference/01-components/03-taosadapter.md b/docs/zh/14-reference/01-components/03-taosadapter.md index a8e8fc3418..b74ee77862 100644 --- a/docs/zh/14-reference/01-components/03-taosadapter.md +++ b/docs/zh/14-reference/01-components/03-taosadapter.md @@ -306,7 +306,7 @@ http 返回内容: ## taosAdapter 监控指标 -taosAdapter 采集 REST/Websocket 相关请求的监控指标。将监控指标上报给 taosKeeper,这些监控指标会被 taosKeeper 写入监控数据库,默认是 `log` 库,可以在 taoskeeper 配置文件中修改。以下是这些监控指标的详细介绍。 +taosAdapter 采集 REST/WebSocket 相关请求的监控指标。将监控指标上报给 taosKeeper,这些监控指标会被 taosKeeper 写入监控数据库,默认是 `log` 库,可以在 taoskeeper 配置文件中修改。以下是这些监控指标的详细介绍。 #### adapter\_requests 表 @@ -330,8 +330,8 @@ taosAdapter 采集 REST/Websocket 相关请求的监控指标。将监控指标 | other\_fail | INT UNSIGNED | | 其他失败请求数 | | query\_in\_process | INT UNSIGNED | | 正在处理查询请求数 | | write\_in\_process | INT UNSIGNED | | 正在处理写入请求数 | -| endpoint | VARCHAR | | 请求端点 | -| req\_type | NCHAR | TAG | 请求类型:0 为 REST,1 为 Websocket | +| endpoint | VARCHAR | | 请求端点 | +| req\_type | NCHAR | TAG | 请求类型:0 为 REST,1 为 WebSocket | ## 结果返回条数限制 diff --git a/docs/zh/14-reference/02-tools/08-taos-cli.md b/docs/zh/14-reference/02-tools/08-taos-cli.md index c388e7edda..a6f2f7ae05 100644 --- a/docs/zh/14-reference/02-tools/08-taos-cli.md +++ b/docs/zh/14-reference/02-tools/08-taos-cli.md @@ -4,11 +4,11 @@ sidebar_label: taos toc_max_heading_level: 4 --- -TDengine 命令行程序(以下简称 TDengine CLI)是用户操作 TDengine 实例并与之交互的最简洁最常用的方式。 使用前需要安装 TDengine Server 安装包或 TDengine Client 安装包。 +TDengine 命令行程序(以下简称 TDengine CLI)是用户操作 TDengine 实例并与之交互的最简洁最常用工具。 使用前需要安装 TDengine Server 安装包或 TDengine Client 安装包。 ## 启动 -要进入 TDengine CLI,您只要在终端执行 `taos` 即可。 +要进入 TDengine CLI,您在终端执行 `taos` 即可。 ```bash taos @@ -23,6 +23,11 @@ taos> ``` 进入 TDengine CLI 后,你可执行各种 SQL 语句,包括插入、查询以及各种管理命令。 +退出 TDengine CLI, 执行 `q` 或 `quit` 或 `exit` 回车即可 +```shell +taos> quit +``` + ## 执行 SQL 脚本 @@ -66,7 +71,7 @@ taos> SET MAX_BINARY_DISPLAY_WIDTH ; - -l PKTLEN: 网络测试时使用的测试包大小 - -n NETROLE: 网络连接测试时的测试范围,默认为 `client`, 可选值为 `client`、`server` - -N PKTNUM: 网络测试时使用的测试包数量 -- -r: 将时间输出出无符号 64 位整数类型(即 C 语音中 uint64_t) +- -r: 将时间列转化为无符号 64 位整数类型输出(即 C 语言中 uint64_t) - -R: 使用 RESTful 模式连接服务端 - -s COMMAND: 以非交互模式执行的 SQL 命令 - -t: 测试服务端启动状态,状态同-k @@ -84,6 +89,13 @@ taos -h h1.taos.com -s "use db; show tables;" 也可以通过配置文件中的参数设置来控制 TDengine CLI 的行为。可用配置参数请参考[客户端配置](../../components/taosc) +## TDengine CLI TAB 键补全 + +- TAB 键前为空命令状态下按 TAB 键,会列出 TDengine CLI 支持的所有命令 +- TAB 键前为空格状态下按 TAB 键,会显示此位置可以出现的所有命令词的第一个,再次按 TAB 键切为下一个 +- TAB 键前为字符串,会搜索与此字符串前缀匹配的所有可出现命令词,并显示第一个,再次按 TAB 键切为下一个 +- 输入反斜杠 `\` + TAB 键, 会自动补全为列显示模式命令词 `\G;` + ## TDengine CLI 小技巧 - 可以使用上下光标键查看历史输入的指令 @@ -91,7 +103,6 @@ taos -h h1.taos.com -s "use db; show tables;" - Ctrl+C 中止正在进行中的查询 - 执行 `RESET QUERY CACHE` 可清除本地表 Schema 的缓存 - 批量执行 SQL 语句。可以将一系列的 TDengine CLI 命令(以英文 ; 结尾,每个 SQL 语句为一行)按行存放在文件里,在 TDengine CLI 里执行命令 `source ` 自动执行该文件里所有的 SQL 语句 -- 输入 `q` 或 `quit` 或 `exit` 回车,可以退出 TDengine CLI ## TDengine CLI 导出查询结果到文件中 diff --git a/docs/zh/14-reference/03-taos-sql/01-data-type.md b/docs/zh/14-reference/03-taos-sql/01-data-type.md index f33592366a..54106cc578 100644 --- a/docs/zh/14-reference/03-taos-sql/01-data-type.md +++ b/docs/zh/14-reference/03-taos-sql/01-data-type.md @@ -42,8 +42,8 @@ CREATE DATABASE db_name PRECISION 'ns'; | 14 | NCHAR | 自定义 | 记录包含多字节字符在内的字符串,如中文字符。每个 NCHAR 字符占用 4 字节的存储空间。字符串两端使用单引号引用,字符串内的单引号需用转义字符 `\'`。NCHAR 使用时须指定字符串大小,类型为 NCHAR(10) 的列表示此列的字符串最多存储 10 个 NCHAR 字符。如果用户字符串长度超出声明长度,将会报错。 | | 15 | JSON | | JSON 数据类型, 只有 Tag 可以是 JSON 格式 | | 16 | VARCHAR | 自定义 | BINARY 类型的别名 | -| 17 | GEOMETRY | 自定义 | 几何类型 -| 18 | VARBINARY | 自定义 | 可变长的二进制数据| +| 17 | GEOMETRY | 自定义 | 几何类型,3.1.0.0 版本开始支持 +| 18 | VARBINARY | 自定义 | 可变长的二进制数据, 3.1.1.0 版本开始支持| :::note diff --git a/docs/zh/14-reference/03-taos-sql/12-distinguished.md b/docs/zh/14-reference/03-taos-sql/12-distinguished.md index e149c2c82e..0b834dea29 100644 --- a/docs/zh/14-reference/03-taos-sql/12-distinguished.md +++ b/docs/zh/14-reference/03-taos-sql/12-distinguished.md @@ -76,7 +76,7 @@ window_clause: { FILL 语句指定某一窗口区间数据缺失的情况下的填充模式。填充模式包括以下几种: 1. 不进行填充:NONE(默认填充模式)。 -2. VALUE 填充:固定值填充,此时需要指定填充的数值。例如:FILL(VALUE, 1.23)。这里需要注意,最终填充的值受由相应列的类型决定,如 FILL(VALUE, 1.23),相应列为 INT 类型,则填充值为 1, 若查询列表中有多列需要FILL, 则需要给每一个FILL列指定VALUE, 如`SELECT _wstart, min(c1), max(c1) FROM ... FILL(VALUE, 0, 0)`。 +2. VALUE 填充:固定值填充,此时需要指定填充的数值。例如:FILL(VALUE, 1.23)。这里需要注意,最终填充的值受由相应列的类型决定,如 FILL(VALUE, 1.23),相应列为 INT 类型,则填充值为 1, 若查询列表中有多列需要FILL, 则需要给每一个FILL列指定VALUE, 如`SELECT _wstart, min(c1), max(c1) FROM ... FILL(VALUE, 0, 0)`, 注意, SELECT表达式中只有包含普通列时才需要指定FILL VALUE, 如`_wstart`, `_wstart+1a`, `now`, `1+1` 以及使用partition by时的partition key(如tbname)都不需要指定VALUE, 如`timediff(last(ts), _wstart)`则需要指定VALUE。 3. PREV 填充:使用前一个非 NULL 值填充数据。例如:FILL(PREV)。 4. NULL 填充:使用 NULL 填充数据。例如:FILL(NULL)。 5. LINEAR 填充:根据前后距离最近的非 NULL 值做线性插值填充。例如:FILL(LINEAR)。 diff --git a/docs/zh/14-reference/03-taos-sql/14-stream.md b/docs/zh/14-reference/03-taos-sql/14-stream.md index 3af8fa6921..cd5c76a4ad 100644 --- a/docs/zh/14-reference/03-taos-sql/14-stream.md +++ b/docs/zh/14-reference/03-taos-sql/14-stream.md @@ -153,7 +153,7 @@ SELECT * from information_schema.`ins_streams`; 由于窗口关闭是由事件时间决定的,如事件流中断、或持续延迟,则事件时间无法更新,可能导致无法得到最新的计算结果。 -因此,流式计算提供了以事件时间结合处理时间计算的 MAX_DELAY 触发模式。MAX_DELAY最小时间是5s,如果低于5s,创建流计算时会报错。 +因此,流式计算提供了以事件时间结合处理时间计算的 MAX_DELAY 触发模式。MAX_DELAY 最小时间是 5s,如果低于 5s,创建流计算时会报错。 MAX_DELAY 模式在窗口关闭时会立即触发计算。此外,当数据写入后,计算触发的时间超过 max delay 指定的时间,则立即触发计算 diff --git a/docs/zh/14-reference/05-connector/10-cpp.mdx b/docs/zh/14-reference/05-connector/10-cpp.mdx index c618601fb9..7164baad2a 100644 --- a/docs/zh/14-reference/05-connector/10-cpp.mdx +++ b/docs/zh/14-reference/05-connector/10-cpp.mdx @@ -5,14 +5,14 @@ toc_max_heading_level: 4 --- C/C++ 开发人员可以使用 TDengine 的客户端驱动,即 C/C++连接器 (以下都用 TDengine 客户端驱动表示),开发自己的应用来连接 TDengine 集群完成数据存储、查询以及其他功能。TDengine 客户端驱动的 API 类似于 MySQL 的 C API。应用程序使用时,需要包含 TDengine 头文件,里面列出了提供的 API 的函数原型;应用程序还要链接到所在平台上对应的动态库。 -TDengine 的客户端驱动提供了 taosws 和 taos 两个动态库,分别支持 Websocket 连接和原生连接。 Websocket 连接和原生连接的区别是 Websocket 连接方式不要求客户端和服务端版本完全匹配,而原生连接要求,在性能上 Websocket 连接方式也接近于原生连接,一般我们推荐使用 Websocket 连接方式。 +TDengine 的客户端驱动提供了 taosws 和 taos 两个动态库,分别支持 WebSocket 连接和原生连接。 WebSocket 连接和原生连接的区别是 WebSocket 连接方式不要求客户端和服务端版本完全匹配,而原生连接要求,在性能上 WebSocket 连接方式也接近于原生连接,一般我们推荐使用 WebSocket 连接方式。 下面我们分开介绍两种连接方式的使用方法。 -## Websocket 连接方式 +## WebSocket 连接方式 -Websocket 连接方式需要使用 taosws.h 头文件和 taosws 动态库。 +WebSocket 连接方式需要使用 taosws.h 头文件和 taosws 动态库。 ```c #include @@ -44,7 +44,7 @@ TDengine 客户端驱动的动态库位于: ### 错误码 在 C 接口的设计中,错误码采用整数类型表示,每个错误码都对应一个特定的错误状态。如未特别说明,当 API 的返回值是整数时,_0_ 代表成功,其它是代表失败原因的错误码,当返回值是指针时, _NULL_ 表示失败。 -Websocket 连接方式单独的错误码在 `taosws.h` 中, +WebSocket 连接方式单独的错误码在 `taosws.h` 中, | 错误码 | 错误描述 | 可能的出错场景或者可能的原因 | 建议用户采取的措施 | @@ -82,7 +82,7 @@ WebSocket 连接方式错误码只保留了原生连接错误码的后两个字 #### DSN -C/C++ Websocket 连接器通过 DSN 连接描述字符串来表示连接信息。 +C/C++ WebSocket 连接器通过 DSN 连接描述字符串来表示连接信息。 DSN 描述字符串基本结构如下: ```text @@ -96,16 +96,16 @@ DSN 描述字符串基本结构如下: - **driver**: 必须指定驱动名以便连接器选择何种方式创建连接,支持如下驱动名: - **taos**: 默认驱动,支持 SQL 执行,参数绑定,无模式写入。 - **tmq**: 使用 TMQ 订阅数据。 -- **protocol**: 显示指定以何种方式建立连接,例如:`taos+ws://localhost:6041` 指定以 Websocket 方式建立连接。 - - **http/ws**: 使用 Websocket 协议。 - - **https/wss**: 在 Websocket 连接方式下显示启用 SSL/TLS 协议。 +- **protocol**: 显示指定以何种方式建立连接,例如:`taos+ws://localhost:6041` 指定以 WebSocket 方式建立连接。 + - **http/ws**: 使用 WebSocket 协议。 + - **https/wss**: 在 WebSocket 连接方式下显示启用 SSL/TLS 协议。 - **username/password**: 用于创建连接的用户名及密码。 -- **host/port**: 指定创建连接的服务器及端口,当不指定服务器地址及端口时 Websocket 连接默认为 `localhost:6041` 。 +- **host/port**: 指定创建连接的服务器及端口,当不指定服务器地址及端口时 WebSocket 连接默认为 `localhost:6041` 。 - **database**: 指定默认连接的数据库名,可选参数。 - **params**:其他可选参数。 -一个完整的 DSN 描述字符串示例如下:`taos+ws://localhost:6041/test`, 表示使用 Websocket(`ws`)方式通过 `6041` 端口连接服务器 `localhost`,并指定默认数据库为 `test`。 +一个完整的 DSN 描述字符串示例如下:`taos+ws://localhost:6041/test`, 表示使用 WebSocket(`ws`)方式通过 `6041` 端口连接服务器 `localhost`,并指定默认数据库为 `test`。 #### 基础 API diff --git a/docs/zh/14-reference/05-connector/14-java.mdx b/docs/zh/14-reference/05-connector/14-java.mdx index ba4cb38afd..0a167dd5ee 100644 --- a/docs/zh/14-reference/05-connector/14-java.mdx +++ b/docs/zh/14-reference/05-connector/14-java.mdx @@ -33,14 +33,15 @@ REST 连接支持所有能运行 Java 的平台。 | taos-jdbcdriver 版本 | 主要变化 | TDengine 版本 | | :------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------: | -| 3.3.3 | 1. 解决了 Websocket statement 关闭导致的内存泄漏 | - | -| 3.3.2 | 1. 优化 Websocket 连接下的参数绑定性能;2. 优化了对 mybatis 的支持 | - | -| 3.3.0 | 1. 优化 Websocket 连接下的数据传输性能;2. 支持跳过 SSL 验证,默认关闭 | 3.3.2.0 及更高版本 | +| 3.4.0 | 1. 使用 jackson 库替换 fastjson 库;2. WebSocket 采用独立协议标识;3. 优化后台拉取线程使用,避免用户误用导致超时。 | - | +| 3.3.3 | 1. 解决了 WebSocket statement 关闭导致的内存泄漏 | - | +| 3.3.2 | 1. 优化 WebSocket 连接下的参数绑定性能;2. 优化了对 mybatis 的支持 | - | +| 3.3.0 | 1. 优化 WebSocket 连接下的数据传输性能;2. 支持跳过 SSL 验证,默认关闭 | 3.3.2.0 及更高版本 | | 3.2.11 | 解决了 Native 连接关闭结果集 bug | - | -| 3.2.10 | 1. REST/WebSocket 连接支持传输中的数据压缩;2. Websocket 自动重连机制,默认关闭;3. Connection 类提供无模式写入的方法;4. 优化了原生连接的数据拉取性能;5. 修复了一些已知问题;6.元数据获取函数可以返回支持的函数列表。 | - | -| 3.2.9 | 解决了 Websocket prepareStatement 关闭 bug | - | -| 3.2.8 | 优化了自动提交, 解决了 websocket 手动提交 bug, 优化 Websocket prepareStatement 使用一个连接, 元数据支持视图 | - | -| 3.2.7 | 支持 VARBINARY 和 GEOMETRY 类型,增加 native 连接的时区设置支持。增加 websocket 自动重连功能。 | 3.2.0.0 及更高版本 | +| 3.2.10 | 1. REST/WebSocket 连接支持传输中的数据压缩;2. WebSocket 自动重连机制,默认关闭;3. Connection 类提供无模式写入的方法;4. 优化了原生连接的数据拉取性能;5. 修复了一些已知问题;6.元数据获取函数可以返回支持的函数列表。 | - | +| 3.2.9 | 解决了 WebSocket prepareStatement 关闭 bug | - | +| 3.2.8 | 优化了自动提交, 解决了 WebSocket 手动提交 bug, 优化 WebSocket prepareStatement 使用一个连接, 元数据支持视图 | - | +| 3.2.7 | 支持 VARBINARY 和 GEOMETRY 类型,增加 native 连接的时区设置支持。增加 WebSocket 自动重连功能。 | 3.2.0.0 及更高版本 | | 3.2.5 | 数据订阅增加 committed()、assignment() 方法 | 3.1.0.3 及更高版本 | | 3.2.4 | 数据订阅在 WebSocket 连接下增加 enable.auto.commit 参数,以及 unsubscribe() 方法。 | - | | 3.2.3 | 修复 ResultSet 在一些情况数据解析失败 | - | @@ -195,17 +196,14 @@ WKB规范请参考[Well-Known Binary (WKB)](https://libgeos.org/specifications/w ## API 参考 ### JDBC 驱动 -taos-jdbcdriver 实现了 JDBC 标准的 Driver 接口,提供了两个实现类:RestfulDriver 和 TSDBDriver。 -Websocket 和 REST 连接使用驱动类 `com.taosdata.jdbc.rs.RestfulDriver`。原生连接使用驱动类 `com.taosdata.jdbc.TSDBDriver`。 - +taos-jdbcdriver 实现了 JDBC 标准的 Driver 接口,提供了 3 个实现类。 +- WebSocket 连接使用驱动类 `com.taosdata.jdbc.ws.WebSocketDriver`。 +- 原生连接使用驱动类 `com.taosdata.jdbc.TSDBDriver`。 +- REST 连接使用驱动类 `com.taosdata.jdbc.rs.RestfulDriver`。 #### URL 规范 TDengine 的 JDBC URL 规范格式为: -`jdbc:[TAOS|TAOS-RS]://[host_name]:[port]/[database_name]?[user={user}|&password={password}|&charset={charset}|&cfgdir={config_dir}|&locale={locale}|&timezone={timezone}|&batchfetch={batchfetch}]` - -对于建立连接,原生连接与 REST 连接有细微不同。 Websocket 和 REST 连接使用驱动类 `com.taosdata.jdbc.rs.RestfulDriver`。原生连接使用驱动类 `com.taosdata.jdbc.TSDBDriver`。 - -**注**:REST 连接中增加 `batchfetch` 参数并设置为 true,将开启 WebSocket 连接。 +`jdbc:[TAOS|TAOS-WS|TAOS-RS]://[host_name]:[port]/[database_name]?[user={user}|&password={password}|&charset={charset}|&cfgdir={config_dir}|&locale={locale}|&timezone={timezone}|&batchfetch={batchfetch}]` **原生连接** `jdbc:TAOS://taosdemo.com:6030/power?user=root&password=taosdata`,使用了 JDBC 原生连接的 TSDBDriver,建立了到 hostname 为 taosdemo.com,端口为 6030(TDengine 的默认端口),数据库名为 power 的连接。这个 URL @@ -234,23 +232,38 @@ TDengine 中,只要保证 firstEp 和 secondEp 中一个节点有效,就可 > **注意**:这里的配置文件指的是调用 JDBC Connector 的应用程序所在机器上的配置文件,Linux OS 上默认值 /etc/taos/taos.cfg ,Windows OS 上默认值 C://TDengine/cfg/taos.cfg。 +**WebSocket 连接** +使用 JDBC WebSocket 连接,不需要依赖客户端驱动。与 JDBC 原生连接相比,仅需要: -**Websocket 和 REST 连接** -使用 JDBC Websocket 或 REST 连接,不需要依赖客户端驱动。与 JDBC 原生连接相比,仅需要: +1. driverClass 指定为“com.taosdata.jdbc.ws.WebSocketDriver”; +2. jdbcUrl 以“jdbc:TAOS-WS://”开头; +3. 使用 6041 作为连接端口。 + +对于 WebSocket 连接,url 中的配置参数如下: +- user:登录 TDengine 用户名,默认值 'root'。 +- password:用户登录密码,默认值 'taosdata'。 +- charset: 当开启批量拉取数据时,指定解析字符串数据的字符集。 +- batchErrorIgnore:true:在执行 Statement 的 executeBatch 时,如果中间有一条 SQL 执行失败,继续执行下面的 SQL 了。false:不再执行失败 SQL 后的任何语句。默认值为:false。 +- httpConnectTimeout: 连接超时时间,单位 ms, 默认值为 60000。 +- messageWaitTimeout: 消息超时时间, 单位 ms, 默认值为 60000。 +- useSSL: 连接中是否使用 SSL。 + +**注意**:部分配置项(比如:locale、timezone)在 WebSocket 连接中不生效。 + +**REST 连接** +使用 JDBC REST 连接,不需要依赖客户端驱动。与 JDBC 原生连接相比,仅需要: 1. driverClass 指定为“com.taosdata.jdbc.rs.RestfulDriver”; 2. jdbcUrl 以“jdbc:TAOS-RS://”开头; 3. 使用 6041 作为连接端口。 -对于 Websocket 和 REST 连接,url 中的配置参数如下: +对于 REST 连接,url 中的配置参数如下: - user:登录 TDengine 用户名,默认值 'root'。 - password:用户登录密码,默认值 'taosdata'。 -- batchfetch: true:在执行查询时批量拉取结果集;false:逐行拉取结果集。默认值为:false。逐行拉取结果集使用 HTTP 方式进行数据传输。JDBC REST 连接支持批量拉取数据功能。taos-jdbcdriver 与 TDengine 之间通过 WebSocket 连接进行数据传输。相较于 HTTP,WebSocket 可以使 JDBC REST 连接支持大数据量查询,并提升查询性能。 - charset: 当开启批量拉取数据时,指定解析字符串数据的字符集。 - batchErrorIgnore:true:在执行 Statement 的 executeBatch 时,如果中间有一条 SQL 执行失败,继续执行下面的 SQL 了。false:不再执行失败 SQL 后的任何语句。默认值为:false。 - httpConnectTimeout: 连接超时时间,单位 ms, 默认值为 60000。 -- httpSocketTimeout: socket 超时时间,单位 ms,默认值为 60000。仅在 batchfetch 设置为 false 时生效。 -- messageWaitTimeout: 消息超时时间, 单位 ms, 默认值为 60000。 仅在 batchfetch 设置为 true 时生效。 +- httpSocketTimeout: socket 超时时间,单位 ms,默认值为 60000。 - useSSL: 连接中是否使用 SSL。 - httpPoolSize: REST 并发请求大小,默认 20。 @@ -272,7 +285,7 @@ TDengine 中,只要保证 firstEp 和 secondEp 中一个节点有效,就可 properties 中的配置参数如下: - TSDBDriver.PROPERTY_KEY_USER:登录 TDengine 用户名,默认值 'root'。 - TSDBDriver.PROPERTY_KEY_PASSWORD:用户登录密码,默认值 'taosdata'。 -- TSDBDriver.PROPERTY_KEY_BATCH_LOAD: true:在执行查询时批量拉取结果集;false:逐行拉取结果集。默认值为:false。 +- TSDBDriver.PROPERTY_KEY_BATCH_LOAD: true:在执行查询时批量拉取结果集;false:逐行拉取结果集。默认值为:false。因历史原因使用 REST 连接时,若设置此参数为 true 会变成 WebSocket 连接。 - TSDBDriver.PROPERTY_KEY_BATCH_ERROR_IGNORE:true:在执行 Statement 的 executeBatch 时,如果中间有一条 SQL 执行失败,继续执行下面的 sq 了。false:不再执行失败 SQL 后的任何语句。默认值为:false。 - TSDBDriver.PROPERTY_KEY_CONFIG_DIR:仅在使用 JDBC 原生连接时生效。客户端配置文件目录路径,Linux OS 上默认值 `/etc/taos`,Windows OS 上默认值 `C:/TDengine/cfg`。 - TSDBDriver.PROPERTY_KEY_CHARSET:客户端使用的字符集,默认值为系统字符集。 @@ -280,16 +293,16 @@ properties 中的配置参数如下: - TSDBDriver.PROPERTY_KEY_TIME_ZONE:仅在使用 JDBC 原生连接时生效。 客户端使用的时区,默认值为系统当前时区。因为历史的原因,我们只支持POSIX标准的部分规范,如UTC-8(代表中国上上海), GMT-8,Asia/Shanghai 这几种形式。 - TSDBDriver.HTTP_CONNECT_TIMEOUT: 连接超时时间,单位 ms, 默认值为 60000。仅在 REST 连接时生效。 - TSDBDriver.HTTP_SOCKET_TIMEOUT: socket 超时时间,单位 ms,默认值为 60000。仅在 REST 连接且 batchfetch 设置为 false 时生效。 -- TSDBDriver.PROPERTY_KEY_MESSAGE_WAIT_TIMEOUT: 消息超时时间, 单位 ms, 默认值为 60000。 仅在 REST 连接且 batchfetch 设置为 true 时生效。 -- TSDBDriver.PROPERTY_KEY_USE_SSL: 连接中是否使用 SSL。仅在 REST 连接时生效。 +- TSDBDriver.PROPERTY_KEY_MESSAGE_WAIT_TIMEOUT: 消息超时时间, 单位 ms, 默认值为 60000。 仅 WebSocket 连接下有效。 +- TSDBDriver.PROPERTY_KEY_USE_SSL: 连接中是否使用 SSL。仅在 WebSocket/REST 连接时生效。 - TSDBDriver.HTTP_POOL_SIZE: REST 并发请求大小,默认 20。 -- TSDBDriver.PROPERTY_KEY_ENABLE_COMPRESSION: 传输过程是否启用压缩。仅在使用 REST/Websocket 连接时生效。true: 启用,false: 不启用。默认为 false。 -- TSDBDriver.PROPERTY_KEY_ENABLE_AUTO_RECONNECT: 是否启用自动重连。仅在使用 Websocket 连接时生效。true: 启用,false: 不启用。默认为 false。 +- TSDBDriver.PROPERTY_KEY_ENABLE_COMPRESSION: 传输过程是否启用压缩。仅在使用 REST/WebSocket 连接时生效。true: 启用,false: 不启用。默认为 false。 +- TSDBDriver.PROPERTY_KEY_ENABLE_AUTO_RECONNECT: 是否启用自动重连。仅在使用 WebSocket 连接时生效。true: 启用,false: 不启用。默认为 false。 > **注意**:启用自动重连仅对简单执行 SQL 语句以及 无模式写入、数据订阅有效。对于参数绑定无效。自动重连仅对连接建立时通过参数指定数据库有效,对后面的 `use db` 语句切换数据库无效。 - TSDBDriver.PROPERTY_KEY_RECONNECT_INTERVAL_MS: 自动重连重试间隔,单位毫秒,默认值 2000。仅在 PROPERTY_KEY_ENABLE_AUTO_RECONNECT 为 true 时生效。 - TSDBDriver.PROPERTY_KEY_RECONNECT_RETRY_COUNT: 自动重连重试次数,默认值 3,仅在 PROPERTY_KEY_ENABLE_AUTO_RECONNECT 为 true 时生效。 -- TSDBDriver.PROPERTY_KEY_DISABLE_SSL_CERT_VALIDATION: 关闭 SSL 证书验证 。仅在使用 Websocket 连接时生效。true: 启用,false: 不启用。默认为 false。 +- TSDBDriver.PROPERTY_KEY_DISABLE_SSL_CERT_VALIDATION: 关闭 SSL 证书验证 。仅在使用 WebSocket 连接时生效。true: 启用,false: 不启用。默认为 false。 此外对 JDBC 原生连接,通过指定 URL 和 Properties 还可以指定其他参数,比如日志级别、SQL 长度等。 @@ -1154,7 +1167,7 @@ JDBC 驱动支持标准的 ResultSet 接口,提供了用于读取结果集中 PreparedStatement 允许使用预编译的 SQL 语句,这可以提高性能并提供参数化查询的能力,从而增加安全性。 JDBC 驱动提供了实现 PreparedStatement 接口的两个类: 1. 对应原生连接的 TSDBPreparedStatement -2. 对应 Websocket 连接的 TSWSPreparedStatement +2. 对应 WebSocket 连接的 TSWSPreparedStatement 因 JDBC 标准没有高性能绑定数据的接口,TSDBPreparedStatement 和 TSWSPreparedStatement 都新增了一些方法,用来扩展参数绑定能力。 > **注意**:由于 PreparedStatement 继承了 Statement 接口,因此对于这部分重复的接口不再赘述,请参考 Statement 接口中对应描述。 @@ -1347,8 +1360,8 @@ JDBC 标准不支持数据订阅,因此本章所有接口都是扩展接口。 - httpConnectTimeout: 创建连接超时参数,单位 ms,默认为 5000 ms。仅在 WebSocket 连接下有效。 - messageWaitTimeout: 数据传输超时参数,单位 ms,默认为 10000 ms。仅在 WebSocket 连接下有效。 - httpPoolSize: 同一个连接下最大并行请求数。仅在 WebSocket 连接下有效。 -- TSDBDriver.PROPERTY_KEY_ENABLE_COMPRESSION: 传输过程是否启用压缩。仅在使用 Websocket 连接时生效。true: 启用,false: 不启用。默认为 false。 -- TSDBDriver.PROPERTY_KEY_ENABLE_AUTO_RECONNECT: 是否启用自动重连。仅在使用 Websocket 连接时生效。true: 启用,false: 不启用。默认为 false。 +- TSDBDriver.PROPERTY_KEY_ENABLE_COMPRESSION: 传输过程是否启用压缩。仅在使用 WebSocket 连接时生效。true: 启用,false: 不启用。默认为 false。 +- TSDBDriver.PROPERTY_KEY_ENABLE_AUTO_RECONNECT: 是否启用自动重连。仅在使用 WebSocket 连接时生效。true: 启用,false: 不启用。默认为 false。 - TSDBDriver.PROPERTY_KEY_RECONNECT_INTERVAL_MS: 自动重连重试间隔,单位毫秒,默认值 2000。仅在 PROPERTY_KEY_ENABLE_AUTO_RECONNECT 为 true 时生效。 - TSDBDriver.PROPERTY_KEY_RECONNECT_RETRY_COUNT: 自动重连重试次数,默认值 3,仅在 PROPERTY_KEY_ENABLE_AUTO_RECONNECT 为 true 时生效。 diff --git a/docs/zh/14-reference/05-connector/26-rust.mdx b/docs/zh/14-reference/05-connector/26-rust.mdx index 1fcc1e3dcd..cfabed4c61 100644 --- a/docs/zh/14-reference/05-connector/26-rust.mdx +++ b/docs/zh/14-reference/05-connector/26-rust.mdx @@ -18,9 +18,9 @@ import RequestId from "./_request_id.mdx"; ## 连接方式 -`taos` 提供两种建立连接的方式。一般我们推荐使用 **Websocket 连接**。 +`taos` 提供两种建立连接的方式。一般我们推荐使用 **WebSocket 连接**。 - **原生连接**,它通过 TDengine 客户端驱动程序(taosc)连接 TDengine 运行实例。 -- **Websocket 连接**,它通过 taosAdapter 的 Websocket 接口连接 TDengine 运行实例。 +- **WebSocket 连接**,它通过 taosAdapter 的 WebSocket 接口连接 TDengine 运行实例。 你可以通过不同的 “特性(即 Cargo 关键字 `features`)” 来指定使用哪种连接器(默认同时支持)。 @@ -29,13 +29,13 @@ import RequestId from "./_request_id.mdx"; ## 支持的平台 原生连接支持的平台和 TDengine 客户端驱动支持的平台一致。 -Websocket 连接支持所有能运行 Rust 的平台。 +WebSocket 连接支持所有能运行 Rust 的平台。 ## 版本历史 | Rust 连接器版本 | TDengine 版本 | 主要功能 | | :----------------: | :--------------: | :--------------------------------------------------: | -| v0.12.3 | 3.3.0.0 or later | 优化了 Websocket 查询和插入性能,支持了 VARBINARY 和 GEOMETRY 类型 | +| v0.12.3 | 3.3.0.0 or later | 优化了 WebSocket 查询和插入性能,支持了 VARBINARY 和 GEOMETRY 类型 | | v0.12.0 | 3.2.3.0 or later | WS 支持压缩。 | | v0.11.0 | 3.2.0.0 | TMQ 功能优化。 | | v0.10.0 | 3.1.0.0 | WS endpoint 变更。 | @@ -115,15 +115,15 @@ DSN 描述字符串基本结构如下: - **driver**: 必须指定驱动名以便连接器选择何种方式创建连接,支持如下驱动名: - **taos**: 使用 TDengine 连接器驱动,默认是使用 taos 驱动。 - **tmq**: 使用 TMQ 订阅数据。 -- **protocol**: 显示指定以何种方式建立连接,例如:`taos+ws://localhost:6041` 指定以 Websocket 方式建立连接。 - - **http/ws**: 使用 Websocket 创建连接。 - - **https/wss**: 在 Websocket 连接方式下显示启用 SSL/TLS 连接。 +- **protocol**: 显示指定以何种方式建立连接,例如:`taos+ws://localhost:6041` 指定以 WebSocket 方式建立连接。 + - **http/ws**: 使用 WebSocket 创建连接。 + - **https/wss**: 在 WebSocket 连接方式下显示启用 SSL/TLS 连接。 - **username/password**: 用于创建连接的用户名及密码。 -- **host/port**: 指定创建连接的服务器及端口,当不指定服务器地址及端口时(`taos://`),原生连接默认为 `localhost:6030`,Websocket 连接默认为 `localhost:6041` 。 +- **host/port**: 指定创建连接的服务器及端口,当不指定服务器地址及端口时(`taos://`),原生连接默认为 `localhost:6030`,WebSocket 连接默认为 `localhost:6041` 。 - **database**: 指定默认连接的数据库名,可选参数。 - **params**:其他可选参数。 -一个完整的 DSN 描述字符串示例如下:`taos+ws://localhost:6041/test`, 表示使用 Websocket(`ws`)方式通过 `6041` 端口连接服务器 `localhost`,并指定默认数据库为 `test`。 +一个完整的 DSN 描述字符串示例如下:`taos+ws://localhost:6041/test`, 表示使用 WebSocket(`ws`)方式通过 `6041` 端口连接服务器 `localhost`,并指定默认数据库为 `test`。 #### TaosBuilder TaosBuilder 结构体主要提供了根据 DSN 构建 Taos 对象的方法,还提供了检查连接,以及获取客户端版本号等功能。 diff --git a/docs/zh/14-reference/05-connector/30-python.mdx b/docs/zh/14-reference/05-connector/30-python.mdx index 8e08bfc103..8436c30249 100644 --- a/docs/zh/14-reference/05-connector/30-python.mdx +++ b/docs/zh/14-reference/05-connector/30-python.mdx @@ -14,10 +14,10 @@ import RequestId from "./_request_id.mdx"; Python 连接器的源码托管在 [GitHub](https://github.com/taosdata/taos-connector-python)。 ## 连接方式 -`taospy`主要提供三种形式的连接器。一般我们推荐使用 **Websocket 连接**。 +`taospy`主要提供三种形式的连接器。一般我们推荐使用 **WebSocket 连接**。 - **原生连接**,对应 `taospy` 包的 `taos` 模块。通过 TDengine 客户端驱动程序(taosc)原生连接 TDengine 实例,支持数据写入、查询、数据订阅、schemaless 接口和参数绑定接口等功能。 - **REST 连接**,对应 `taospy` 包的 `taosrest` 模块。通过 taosAdapter 提供的 HTTP 接口连接 TDengine 实例,不支持 schemaless 和数据订阅等特性。 -- **Websocket 连接**,对应 `taos-ws-py` 包,可以选装。通过 taosAdapter 提供的 Websocket 接口连接 TDengine 实例,WebSocket 连接实现的功能集合和原生连接有少量不同。 +- **WebSocket 连接**,对应 `taos-ws-py` 包,可以选装。通过 taosAdapter 提供的 WebSocket 接口连接 TDengine 实例,WebSocket 连接实现的功能集合和原生连接有少量不同。 连接方式的详细介绍请参考:[连接方式](../../../develop/connect/#连接方式) @@ -48,9 +48,9 @@ Python 连接器的源码托管在 [GitHub](https://github.com/taosdata/taos-con |2.7.9|数据订阅支持获取消费进度和重置消费进度| |2.7.8|新增 `execute_many`| -|Python Websocket Connector 版本|主要变化| +|Python WebSocket Connector 版本|主要变化| |:----------------------------:|:-----:| -|0.3.2|优化 Websocket sql 查询和插入性能,修改 readme 和 文档,修复已知问题| +|0.3.2|优化 WebSocket sql 查询和插入性能,修改 readme 和 文档,修复已知问题| |0.2.9|已知问题修复| |0.2.5|1. 数据订阅支持获取消费进度和重置消费进度
2. 支持 schemaless
3. 支持 STMT| |0.2.4|数据订阅新增取消订阅方法| diff --git a/docs/zh/14-reference/05-connector/35-node.mdx b/docs/zh/14-reference/05-connector/35-node.mdx index bd2ca537e3..6ac34d2471 100644 --- a/docs/zh/14-reference/05-connector/35-node.mdx +++ b/docs/zh/14-reference/05-connector/35-node.mdx @@ -14,7 +14,7 @@ Node.js 连接器源码托管在 [GitHub](https://github.com/taosdata/taos-conne ## 连接方式 -Node.js 连接器目前仅支持 Websocket 连接器, 其通过 taosAdapter 提供的 Websocket 接口连接 TDengine 实例。 +Node.js 连接器目前仅支持 WebSocket 连接器, 其通过 taosAdapter 提供的 WebSocket 接口连接 TDengine 实例。 连接方式的详细介绍请参考:[连接方式](../../../develop/connect/#连接方式) @@ -48,7 +48,7 @@ Node.js 连接器目前仅支持 Websocket 连接器, 其通过 taosAdapter | 107 | unknown sql type in tdengine | 请检查 TDengine 支持的 Data Type 类型。 | | 108 | connection has been closed | 连接已经关闭,请检查 Connection 是否关闭后再次使用,或是连接是否正常。 | | 109 | fetch block data parse fail | 获取到的查询数据,解析失败 | -| 110 | websocket connection has reached its maximum limit | Websocket 连接达到上限 | +| 110 | websocket connection has reached its maximum limit | WebSocket 连接达到上限 | - [TDengine Node.js Connector Error Code](https://github.com/taosdata/taos-connector-node/blob/main/nodejs/src/common/wsError.ts) - TDengine 其他功能模块的报错,请参考 [错误码](../../../reference/error-code) @@ -104,7 +104,7 @@ Node.js 连接器目前仅支持 Websocket 连接器, 其通过 taosAdapter ## API 参考 -Node.js 连接器(`@tdengine/websocket`), 其通过 taosAdapter 提供的 Websocket 接口连接 TDengine 实例。 +Node.js 连接器(`@tdengine/websocket`), 其通过 taosAdapter 提供的 WebSocket 接口连接 TDengine 实例。 ### URL 规范 diff --git a/docs/zh/14-reference/05-connector/40-csharp.mdx b/docs/zh/14-reference/05-connector/40-csharp.mdx index 93f592fdd0..e4e778eeff 100644 --- a/docs/zh/14-reference/05-connector/40-csharp.mdx +++ b/docs/zh/14-reference/05-connector/40-csharp.mdx @@ -14,7 +14,7 @@ import RequestId from "./_request_id.mdx"; `TDengine.Connector` 提供两种形式的连接器 * **原生连接**,通过 TDengine 客户端驱动程序(taosc)原生连接 TDengine 实例,支持数据写入、查询、数据订阅、schemaless 接口和参数绑定接口等功能。 -* **Websocket 连接**,通过 taosAdapter 提供的 Websocket 接口连接 TDengine 实例,WebSocket 连接实现的功能集合和原生连接有少量不同。(自 v3.0.1 起) +* **WebSocket 连接**,通过 taosAdapter 提供的 WebSocket 接口连接 TDengine 实例,WebSocket 连接实现的功能集合和原生连接有少量不同。(自 v3.0.1 起) 连接方式的详细介绍请参考:[连接方式](../../../develop/connect/#连接方式) diff --git a/docs/zh/14-reference/05-connector/50-odbc.mdx b/docs/zh/14-reference/05-connector/50-odbc.mdx index 38dd88b86d..8518d2ffd7 100644 --- a/docs/zh/14-reference/05-connector/50-odbc.mdx +++ b/docs/zh/14-reference/05-connector/50-odbc.mdx @@ -109,7 +109,7 @@ WebSocket 连接方式除此之外还支持 Windows X64系统上运行的 32 位 ## 版本历史 -| taos_odbc版本 | 主要变化 | TDengine 版本 | +| taos_odbc 版本 | 主要变化 | TDengine 版本 | | :----------- | :-------------------------------------------------------------------------------------------------- | :---------------- | | v1.1.0 | 1. 支持视图功能;
2. 支持 VARBINARY/GEOMETRY 数据类型; | 3.3.3.0及更高版本 | | v1.0.2 | 支持 CP1252 字符编码; | 3.2.3.0及更高版本 | @@ -145,7 +145,7 @@ WebSocket 连接方式除此之外还支持 Windows X64系统上运行的 32 位 ## API 参考 -本节按功能分类汇总了 ODBC API,关于完整的 ODBC API 参考,请访问 http://msdn.microsoft.com/en-us/library/ms714177.aspx 的ODBC程序员参考页面。 +本节按功能分类汇总了 ODBC API,关于完整的 ODBC API 参考,请访问 http://msdn.microsoft.com/en-us/library/ms714177.aspx 的 ODBC 程序员参考页面。 ### 数据源和驱动程序管理 diff --git a/docs/zh/14-reference/05-connector/index.md b/docs/zh/14-reference/05-connector/index.md index 04a2ef6c1f..bd2cff6a3d 100644 --- a/docs/zh/14-reference/05-connector/index.md +++ b/docs/zh/14-reference/05-connector/index.md @@ -62,7 +62,7 @@ TDengine 版本更新往往会增加新的功能特性,列表中的连接器 | **连接管理** | 支持 | 支持 | 支持 | | **执行 SQL** | 支持 | 支持 | 支持 | -### 使用 Websocket 接口 +### 使用 WebSocket 接口 | **功能特性** | **Java** | **Python** | **Go** | **C#** | **Node.js** | **Rust** | **C/C++** | | ------------------- | -------- | ---------- | ------ | ------ | ----------- | -------- | --------- | diff --git a/include/common/cos.h b/include/common/cos.h index b336a1e5ee..53dc161ee5 100644 --- a/include/common/cos.h +++ b/include/common/cos.h @@ -32,6 +32,8 @@ extern int32_t tsS3PageCacheSize; extern int32_t tsS3UploadDelaySec; int32_t s3Init(); +int32_t s3Begin(); +void s3End(); int32_t s3CheckCfg(); int32_t s3PutObjectFromFile(const char *file, const char *object); int32_t s3PutObjectFromFile2(const char *file, const char *object, int8_t withcp); diff --git a/include/libs/azure/az.h b/include/libs/azure/az.h new file mode 100644 index 0000000000..55839b0727 --- /dev/null +++ b/include/libs/azure/az.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * 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. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef _TD_AZURE_H_ +#define _TD_AZURE_H_ + +#include "os.h" +#include "tarray.h" +#include "tdef.h" +#include "tlog.h" +#include "tmsg.h" + +#ifdef __cplusplus +extern "C" { +#endif + +int32_t azBegin(); +void azEnd(); +int32_t azCheckCfg(); +int32_t azPutObjectFromFileOffset(const char *file, const char *object_name, int64_t offset, int64_t size); +int32_t azGetObjectBlock(const char *object_name, int64_t offset, int64_t size, bool check, uint8_t **ppBlock); +void azDeleteObjectsByPrefix(const char *prefix); + +int32_t azPutObjectFromFile2(const char *file, const char *object, int8_t withcp); +int32_t azGetObjectsByPrefix(const char *prefix, const char *path); +int32_t azGetObjectToFile(const char *object_name, const char *fileName); +int32_t azDeleteObjects(const char *object_name[], int nobject); + +#ifdef __cplusplus +} +#endif + +#endif // _TD_AZURE_H_ diff --git a/include/libs/nodes/plannodes.h b/include/libs/nodes/plannodes.h index 8e4a3ea32b..a05211ece3 100644 --- a/include/libs/nodes/plannodes.h +++ b/include/libs/nodes/plannodes.h @@ -333,6 +333,7 @@ typedef struct SFillLogicNode { SNode* pWStartTs; SNode* pValues; // SNodeListNode STimeWindow timeRange; + SNodeList* pFillNullExprs; } SFillLogicNode; typedef struct SSortLogicNode { @@ -677,6 +678,7 @@ typedef struct SFillPhysiNode { SNode* pWStartTs; // SColumnNode SNode* pValues; // SNodeListNode STimeWindow timeRange; + SNodeList* pFillNullExprs; } SFillPhysiNode; typedef SFillPhysiNode SStreamFillPhysiNode; diff --git a/include/libs/tcs/tcs.h b/include/libs/tcs/tcs.h new file mode 100644 index 0000000000..530a23d9e9 --- /dev/null +++ b/include/libs/tcs/tcs.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * 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. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef _TD_TCS_H_ +#define _TD_TCS_H_ + +#include "os.h" +#include "tarray.h" +#include "tdef.h" +#include "tlog.h" +#include "tmsg.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern int8_t tsS3Enabled; +extern int8_t tsS3EnabledCfg; + +extern int32_t tsS3UploadDelaySec; +extern int32_t tsS3BlockSize; +extern int32_t tsS3BlockCacheSize; +extern int32_t tsS3PageCacheSize; + +extern int8_t tsS3StreamEnabled; + +int32_t tcsInit(); +void tcsUninit(); + +int32_t tcsCheckCfg(); + +int32_t tcsPutObjectFromFileOffset(const char *file, const char *object_name, int64_t offset, int64_t size); +int32_t tcsGetObjectBlock(const char *object_name, int64_t offset, int64_t size, bool check, uint8_t **ppBlock); + +void tcsDeleteObjectsByPrefix(const char *prefix); + +int32_t tcsPutObjectFromFile2(const char *file, const char *object, int8_t withcp); +int32_t tcsGetObjectsByPrefix(const char *prefix, const char *path); +int32_t tcsDeleteObjects(const char *object_name[], int nobject); +int32_t tcsGetObjectToFile(const char *object_name, const char *fileName); + +#ifdef __cplusplus +} +#endif + +#endif // _TD_TCS_H_ diff --git a/include/util/tdef.h b/include/util/tdef.h index a0bfdc83f5..e15ec0b499 100644 --- a/include/util/tdef.h +++ b/include/util/tdef.h @@ -453,10 +453,10 @@ typedef enum ELogicConditionType { #define TSDB_DEFAULT_S3_CHUNK_SIZE (256 * 1024) #define TSDB_MIN_S3_KEEP_LOCAL (1 * 1440) // unit minute #define TSDB_MAX_S3_KEEP_LOCAL (365000 * 1440) -#define TSDB_DEFAULT_S3_KEEP_LOCAL (3650 * 1440) +#define TSDB_DEFAULT_S3_KEEP_LOCAL (365 * 1440) #define TSDB_MIN_S3_COMPACT 0 #define TSDB_MAX_S3_COMPACT 1 -#define TSDB_DEFAULT_S3_COMPACT 0 +#define TSDB_DEFAULT_S3_COMPACT 1 #define TSDB_DB_MIN_WAL_RETENTION_PERIOD -1 #define TSDB_REP_DEF_DB_WAL_RET_PERIOD 3600 @@ -506,7 +506,7 @@ typedef enum ELogicConditionType { #ifdef WINDOWS #define TSDB_MAX_RPC_THREADS 4 // windows pipe only support 4 connections. #else -#define TSDB_MAX_RPC_THREADS 20 +#define TSDB_MAX_RPC_THREADS 50 #endif #define TSDB_QUERY_TYPE_NON_TYPE 0x00u // none type diff --git a/include/util/tlog.h b/include/util/tlog.h index 6b0270523e..09ebb35e8f 100644 --- a/include/util/tlog.h +++ b/include/util/tlog.h @@ -57,6 +57,7 @@ extern int32_t rpcDebugFlag; extern int32_t qDebugFlag; extern int32_t stDebugFlag; extern int32_t wDebugFlag; +extern int32_t azDebugFlag; extern int32_t sDebugFlag; extern int32_t tsdbDebugFlag; extern int32_t tqDebugFlag; diff --git a/source/client/CMakeLists.txt b/source/client/CMakeLists.txt index 84747860e9..bbd18892ab 100644 --- a/source/client/CMakeLists.txt +++ b/source/client/CMakeLists.txt @@ -1,8 +1,8 @@ aux_source_directory(src CLIENT_SRC) -IF (TD_ENTERPRISE) - LIST(APPEND CLIENT_SRC ${TD_ENTERPRISE_DIR}/src/plugins/view/src/clientView.c) -ENDIF () +if(TD_ENTERPRISE) + LIST(APPEND CLIENT_SRC ${TD_ENTERPRISE_DIR}/src/plugins/view/src/clientView.c) +endif() if(TD_WINDOWS) add_library(taos SHARED ${CLIENT_SRC} ${CMAKE_CURRENT_SOURCE_DIR}/src/taos.rc.in) diff --git a/source/common/CMakeLists.txt b/source/common/CMakeLists.txt index eb3dd95e95..42a7c2c615 100644 --- a/source/common/CMakeLists.txt +++ b/source/common/CMakeLists.txt @@ -1,121 +1,122 @@ aux_source_directory(src COMMON_SRC) -IF (TD_ENTERPRISE) -LIST(APPEND COMMON_SRC ${TD_ENTERPRISE_DIR}/src/plugins/common/src/tglobal.c) -ENDIF() + +if(TD_ENTERPRISE) + LIST(APPEND COMMON_SRC ${TD_ENTERPRISE_DIR}/src/plugins/common/src/tglobal.c) +endif() add_library(common STATIC ${COMMON_SRC}) -if (DEFINED GRANT_CFG_INCLUDE_DIR) +if(DEFINED GRANT_CFG_INCLUDE_DIR) add_definitions(-DGRANTS_CFG) endif() -IF (TD_GRANT) +if(TD_GRANT) ADD_DEFINITIONS(-D_GRANT) -ENDIF () +endif() -IF (TD_STORAGE) +if(TD_STORAGE) ADD_DEFINITIONS(-D_STORAGE) TARGET_LINK_LIBRARIES(common PRIVATE storage) -ENDIF () +endif() -IF (TD_ENTERPRISE) - IF(${BUILD_WITH_S3}) +if(TD_ENTERPRISE) + if(${BUILD_WITH_S3}) add_definitions(-DUSE_S3) ELSEIF(${BUILD_WITH_COS}) add_definitions(-DUSE_COS) - ENDIF() -ENDIF() + endif() +endif() target_include_directories( - common - PUBLIC "${TD_SOURCE_DIR}/include/common" - PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" - PRIVATE "${GRANT_CFG_INCLUDE_DIR}" + common + PUBLIC "${TD_SOURCE_DIR}/include/common" + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" + PRIVATE "${GRANT_CFG_INCLUDE_DIR}" ) -IF(${TD_WINDOWS}) - target_include_directories( - common - PRIVATE "${TD_SOURCE_DIR}/contrib/pthread" - PRIVATE "${TD_SOURCE_DIR}/contrib/msvcregex" - ) -ENDIF () + +if(${TD_WINDOWS}) + target_include_directories( + common + PRIVATE "${TD_SOURCE_DIR}/contrib/pthread" + PRIVATE "${TD_SOURCE_DIR}/contrib/msvcregex" + ) +endif() target_link_libraries( - common - PUBLIC os - PUBLIC util - INTERFACE api + common + PUBLIC os + PUBLIC util + INTERFACE api ) if(${BUILD_S3}) + if(${BUILD_WITH_S3}) + target_include_directories( + common - if(${BUILD_WITH_S3}) - target_include_directories( - common + PUBLIC "$ENV{HOME}/.cos-local.2/include" + ) - PUBLIC "$ENV{HOME}/.cos-local.2/include" - ) + set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") + set(CMAKE_PREFIX_PATH $ENV{HOME}/.cos-local.2) + find_library(S3_LIBRARY s3) + find_library(CURL_LIBRARY curl $ENV{HOME}/.cos-local.2/lib NO_DEFAULT_PATH) + find_library(XML2_LIBRARY xml2) + find_library(SSL_LIBRARY ssl $ENV{HOME}/.cos-local.2/lib64 $ENV{HOME}/.cos-local.2/lib NO_DEFAULT_PATH) + find_library(CRYPTO_LIBRARY crypto $ENV{HOME}/.cos-local.2/lib64 $ENV{HOME}/.cos-local.2/lib NO_DEFAULT_PATH) + target_link_libraries( + common - set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") - set(CMAKE_PREFIX_PATH $ENV{HOME}/.cos-local.2) - find_library(S3_LIBRARY s3) - find_library(CURL_LIBRARY curl $ENV{HOME}/.cos-local.2/lib NO_DEFAULT_PATH) - find_library(XML2_LIBRARY xml2) - find_library(SSL_LIBRARY ssl $ENV{HOME}/.cos-local.2/lib64 $ENV{HOME}/.cos-local.2/lib NO_DEFAULT_PATH) - find_library(CRYPTO_LIBRARY crypto $ENV{HOME}/.cos-local.2/lib64 $ENV{HOME}/.cos-local.2/lib NO_DEFAULT_PATH) - target_link_libraries( - common + # s3 + PUBLIC ${S3_LIBRARY} + PUBLIC ${CURL_LIBRARY} + PUBLIC ${SSL_LIBRARY} + PUBLIC ${CRYPTO_LIBRARY} + PUBLIC ${XML2_LIBRARY} + ) - # s3 - PUBLIC ${S3_LIBRARY} - PUBLIC ${CURL_LIBRARY} - PUBLIC ${SSL_LIBRARY} - PUBLIC ${CRYPTO_LIBRARY} - PUBLIC ${XML2_LIBRARY} - ) + add_definitions(-DUSE_S3) + endif() - add_definitions(-DUSE_S3) + if(${BUILD_WITH_COS}) + set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") + find_library(APR_LIBRARY apr-1 PATHS /usr/local/apr/lib/) + find_library(APR_UTIL_LIBRARY aprutil-1 PATHS /usr/local/apr/lib/) + find_library(MINIXML_LIBRARY mxml) + find_library(CURL_LIBRARY curl) + target_link_libraries( + common + + # s3 + PUBLIC cos_c_sdk_static + PUBLIC ${APR_UTIL_LIBRARY} + PUBLIC ${APR_LIBRARY} + PUBLIC ${MINIXML_LIBRARY} + PUBLIC ${CURL_LIBRARY} + ) + + # s3 + FIND_PROGRAM(APR_CONFIG_BIN NAMES apr-config apr-1-config PATHS /usr/bin /usr/local/bin /usr/local/apr/bin/) + + if(APR_CONFIG_BIN) + EXECUTE_PROCESS( + COMMAND ${APR_CONFIG_BIN} --includedir + OUTPUT_VARIABLE APR_INCLUDE_DIR + OUTPUT_STRIP_TRAILING_WHITESPACE + ) endif() - if(${BUILD_WITH_COS}) - - set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") - find_library(APR_LIBRARY apr-1 PATHS /usr/local/apr/lib/) - find_library(APR_UTIL_LIBRARY aprutil-1 PATHS /usr/local/apr/lib/) - find_library(MINIXML_LIBRARY mxml) - find_library(CURL_LIBRARY curl) - target_link_libraries( - common - - # s3 - PUBLIC cos_c_sdk_static - PUBLIC ${APR_UTIL_LIBRARY} - PUBLIC ${APR_LIBRARY} - PUBLIC ${MINIXML_LIBRARY} - PUBLIC ${CURL_LIBRARY} - ) - - # s3 - FIND_PROGRAM(APR_CONFIG_BIN NAMES apr-config apr-1-config PATHS /usr/bin /usr/local/bin /usr/local/apr/bin/) - IF (APR_CONFIG_BIN) - EXECUTE_PROCESS( - COMMAND ${APR_CONFIG_BIN} --includedir - OUTPUT_VARIABLE APR_INCLUDE_DIR - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - ENDIF() - include_directories (${APR_INCLUDE_DIR}) - target_include_directories( - common - PUBLIC "${TD_SOURCE_DIR}/contrib/cos-c-sdk-v5/cos_c_sdk" - PUBLIC "$ENV{HOME}/.cos-local.1/include" - ) - - add_definitions(-DUSE_COS) - endif(${BUILD_WITH_COS}) + include_directories(${APR_INCLUDE_DIR}) + target_include_directories( + common + PUBLIC "${TD_SOURCE_DIR}/contrib/cos-c-sdk-v5/cos_c_sdk" + PUBLIC "$ENV{HOME}/.cos-local.1/include" + ) + add_definitions(-DUSE_COS) + endif(${BUILD_WITH_COS}) endif() if(${BUILD_TEST}) - ADD_SUBDIRECTORY(test) + ADD_SUBDIRECTORY(test) endif(${BUILD_TEST}) diff --git a/source/common/src/cos.c b/source/common/src/cos.c index 453b924f31..a7e69ddc4c 100644 --- a/source/common/src/cos.c +++ b/source/common/src/cos.c @@ -89,20 +89,8 @@ static void s3DumpCfgByEp(int8_t epIndex) { int32_t s3CheckCfg() { int32_t code = 0, lino = 0; - int8_t i = 0; - if (!tsS3Enabled) { - (void)fprintf(stderr, "s3 not configured.\n"); - TAOS_RETURN(code); - } - - code = s3Begin(); - if (code != 0) { - (void)fprintf(stderr, "failed to initialize s3.\n"); - TAOS_RETURN(code); - } - - for (; i < tsS3EpNum; i++) { + for (int8_t i = 0; i < tsS3EpNum; i++) { (void)fprintf(stdout, "test s3 ep (%d/%d):\n", i + 1, tsS3EpNum); s3DumpCfgByEp(i); @@ -192,7 +180,7 @@ int32_t s3CheckCfg() { (void)fprintf(stdout, "=================================================================\n"); } - s3End(); + // s3End(); TAOS_RETURN(code); } @@ -1529,6 +1517,8 @@ void s3EvictCache(const char *path, long object_size) {} #include "cos_http_io.h" #include "cos_log.h" +int32_t s3Begin() { TAOS_RETURN(TSDB_CODE_SUCCESS); } + int32_t s3Init() { if (cos_http_io_initialize(NULL, 0) != COSE_OK) { return -1; @@ -1967,6 +1957,10 @@ long s3Size(const char *object_name) { #else int32_t s3Init() { return 0; } +int32_t s3Begin() { TAOS_RETURN(TSDB_CODE_SUCCESS); } + +void s3End() {} +int32_t s3CheckCfg() { return 0; } int32_t s3PutObjectFromFile(const char *file, const char *object) { return 0; } int32_t s3PutObjectFromFile2(const char *file, const char *object, int8_t withcp) { return 0; } int32_t s3PutObjectFromFileOffset(const char *file, const char *object_name, int64_t offset, int64_t size) { return 0; } diff --git a/source/common/src/rsync.c b/source/common/src/rsync.c index eef889429b..b7352acf25 100644 --- a/source/common/src/rsync.c +++ b/source/common/src/rsync.c @@ -160,7 +160,11 @@ int32_t startRsync() { code = system(cmd); if (code != 0) { uError("[rsync] cmd:%s start server failed, code:%d," ERRNO_ERR_FORMAT, cmd, code, ERRNO_ERR_DATA); - code = TAOS_SYSTEM_ERROR(errno); + if (errno == 0) { + return 0; + } else { + code = TAOS_SYSTEM_ERROR(errno); + } } else { uInfo("[rsync] cmd:%s start server successful", cmd); } @@ -358,4 +362,4 @@ int32_t deleteRsync(const char* id) { uDebug("[rsync] delete data:%s successful", id); return 0; -} \ No newline at end of file +} diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index 7cff5de008..43fe88171d 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -56,7 +56,7 @@ int32_t tsShellActivityTimer = 3; // second // queue & threads int32_t tsNumOfRpcThreads = 1; int32_t tsNumOfRpcSessions = 30000; -int32_t tsShareConnLimit = 8; +int32_t tsShareConnLimit = 10; int32_t tsReadTimeout = 900; int32_t tsTimeToGetAvailableConn = 500000; int32_t tsKeepAliveIdle = 60; @@ -287,7 +287,7 @@ int32_t tsTtlUnit = 86400; int32_t tsTtlPushIntervalSec = 10; int32_t tsTrimVDbIntervalSec = 60 * 60; // interval of trimming db in all vgroups int32_t tsS3MigrateIntervalSec = 60 * 60; // interval of s3migrate db in all vgroups -bool tsS3MigrateEnabled = 1; +bool tsS3MigrateEnabled = 0; int32_t tsGrantHBInterval = 60; int32_t tsUptimeInterval = 300; // seconds char tsUdfdResFuncs[512] = ""; // udfd resident funcs that teardown when udfd exits @@ -308,6 +308,7 @@ char tsS3AppId[TSDB_MAX_EP_NUM][TSDB_FQDN_LEN] = {""}; int8_t tsS3Enabled = false; int8_t tsS3EnabledCfg = false; int8_t tsS3Oss[TSDB_MAX_EP_NUM] = {false}; +int8_t tsS3Ablob = false; int8_t tsS3StreamEnabled = false; int8_t tsS3Https[TSDB_MAX_EP_NUM] = {true}; @@ -436,6 +437,7 @@ int32_t taosSetS3Cfg(SConfig *pCfg) { } tsS3Https[i] = (strstr(tsS3Endpoint[i], "https://") != NULL); tsS3Oss[i] = (strstr(tsS3Endpoint[i], "aliyuncs.") != NULL); + tsS3Ablob = (strstr(tsS3Endpoint[i], ".blob.core.windows.net") != NULL); } if (tsS3BucketName[0] != '<') { @@ -542,6 +544,7 @@ static int32_t taosAddServerLogCfg(SConfig *pCfg) { TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "vDebugFlag", vDebugFlag, 0, 255, CFG_SCOPE_SERVER, CFG_DYN_SERVER)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "mDebugFlag", mDebugFlag, 0, 255, CFG_SCOPE_SERVER, CFG_DYN_SERVER)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "wDebugFlag", wDebugFlag, 0, 255, CFG_SCOPE_SERVER, CFG_DYN_SERVER)); + TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "azDebugFlag", azDebugFlag, 0, 255, CFG_SCOPE_SERVER, CFG_DYN_SERVER)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "sDebugFlag", sDebugFlag, 0, 255, CFG_SCOPE_SERVER, CFG_DYN_SERVER)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "tsdbDebugFlag", tsdbDebugFlag, 0, 255, CFG_SCOPE_SERVER, CFG_DYN_SERVER)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "tqDebugFlag", tqDebugFlag, 0, 255, CFG_SCOPE_SERVER, CFG_DYN_SERVER)); @@ -1063,6 +1066,9 @@ static int32_t taosSetServerLogCfg(SConfig *pCfg) { TAOS_CHECK_GET_CFG_ITEM(pCfg, pItem, "wDebugFlag"); wDebugFlag = pItem->i32; + TAOS_CHECK_GET_CFG_ITEM(pCfg, pItem, "azDebugFlag"); + azDebugFlag = pItem->i32; + TAOS_CHECK_GET_CFG_ITEM(pCfg, pItem, "sDebugFlag"); sDebugFlag = pItem->i32; @@ -1987,13 +1993,14 @@ static int32_t taosCfgDynamicOptionsForServer(SConfig *pCfg, const char *name) { { // 'bool/int32_t/int64_t/float/double' variables with general modification function static OptionNameAndVar debugOptions[] = { - {"dDebugFlag", &dDebugFlag}, {"vDebugFlag", &vDebugFlag}, {"mDebugFlag", &mDebugFlag}, - {"wDebugFlag", &wDebugFlag}, {"sDebugFlag", &sDebugFlag}, {"tsdbDebugFlag", &tsdbDebugFlag}, - {"tqDebugFlag", &tqDebugFlag}, {"fsDebugFlag", &fsDebugFlag}, {"udfDebugFlag", &udfDebugFlag}, - {"smaDebugFlag", &smaDebugFlag}, {"idxDebugFlag", &idxDebugFlag}, {"tdbDebugFlag", &tdbDebugFlag}, - {"tmrDebugFlag", &tmrDebugFlag}, {"uDebugFlag", &uDebugFlag}, {"smaDebugFlag", &smaDebugFlag}, - {"rpcDebugFlag", &rpcDebugFlag}, {"qDebugFlag", &qDebugFlag}, {"metaDebugFlag", &metaDebugFlag}, - {"stDebugFlag", &stDebugFlag}, {"sndDebugFlag", &sndDebugFlag}, {"tqClientDebug", &tqClientDebug}, + {"dDebugFlag", &dDebugFlag}, {"vDebugFlag", &vDebugFlag}, {"mDebugFlag", &mDebugFlag}, + {"wDebugFlag", &wDebugFlag}, {"azDebugFlag", &azDebugFlag}, {"sDebugFlag", &sDebugFlag}, + {"tsdbDebugFlag", &tsdbDebugFlag}, {"tqDebugFlag", &tqDebugFlag}, {"fsDebugFlag", &fsDebugFlag}, + {"udfDebugFlag", &udfDebugFlag}, {"smaDebugFlag", &smaDebugFlag}, {"idxDebugFlag", &idxDebugFlag}, + {"tdbDebugFlag", &tdbDebugFlag}, {"tmrDebugFlag", &tmrDebugFlag}, {"uDebugFlag", &uDebugFlag}, + {"smaDebugFlag", &smaDebugFlag}, {"rpcDebugFlag", &rpcDebugFlag}, {"qDebugFlag", &qDebugFlag}, + {"metaDebugFlag", &metaDebugFlag}, {"stDebugFlag", &stDebugFlag}, {"sndDebugFlag", &sndDebugFlag}, + {"tqClientDebug", &tqClientDebug}, }; static OptionNameAndVar options[] = {{"audit", &tsEnableAudit}, @@ -2371,6 +2378,7 @@ static int32_t taosSetAllDebugFlag(SConfig *pCfg, int32_t flag) { taosCheckAndSetDebugFlag(&vDebugFlag, "vDebugFlag", flag, noNeedToSetVars); taosCheckAndSetDebugFlag(&mDebugFlag, "mDebugFlag", flag, noNeedToSetVars); taosCheckAndSetDebugFlag(&wDebugFlag, "wDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&azDebugFlag, "azDebugFlag", flag, noNeedToSetVars); taosCheckAndSetDebugFlag(&sDebugFlag, "sDebugFlag", flag, noNeedToSetVars); taosCheckAndSetDebugFlag(&tsdbDebugFlag, "tsdbDebugFlag", flag, noNeedToSetVars); taosCheckAndSetDebugFlag(&tqDebugFlag, "tqDebugFlag", flag, noNeedToSetVars); diff --git a/source/dnode/mgmt/CMakeLists.txt b/source/dnode/mgmt/CMakeLists.txt index d72301279e..5d356e06b1 100644 --- a/source/dnode/mgmt/CMakeLists.txt +++ b/source/dnode/mgmt/CMakeLists.txt @@ -10,29 +10,28 @@ add_subdirectory(test) aux_source_directory(exe EXEC_SRC) add_executable(taosd ${EXEC_SRC}) target_include_directories( - taosd - PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/node_mgmt/inc" + taosd + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/node_mgmt/inc" ) -IF (TD_ENTERPRISE) +IF(TD_ENTERPRISE) IF(${BUILD_WITH_S3}) - add_definitions(-DUSE_S3) + add_definitions(-DUSE_S3) ELSEIF(${BUILD_WITH_COS}) - add_definitions(-DUSE_COS) + add_definitions(-DUSE_COS) ENDIF() ENDIF() -IF (TD_LINUX_64 AND JEMALLOC_ENABLED) +IF(TD_LINUX_64 AND JEMALLOC_ENABLED) ADD_DEFINITIONS(-DTD_JEMALLOC_ENABLED -I${CMAKE_BINARY_DIR}/build/include -L${CMAKE_BINARY_DIR}/build/lib -Wl,-rpath,${CMAKE_BINARY_DIR}/build/lib -ljemalloc) SET(LINK_JEMALLOC "-L${CMAKE_BINARY_DIR}/build/lib -ljemalloc") -ELSE () +ELSE() SET(LINK_JEMALLOC "") -ENDIF () - -IF (TD_LINUX_64 AND JEMALLOC_ENABLED) - ADD_DEPENDENCIES(taosd jemalloc) - target_link_libraries(taosd dnode crypt ${LINK_JEMALLOC}) -ELSE () - target_link_libraries(taosd dnode crypt) -ENDIF () +ENDIF() +IF(TD_LINUX_64 AND JEMALLOC_ENABLED) + ADD_DEPENDENCIES(taosd jemalloc) + target_link_libraries(taosd dnode crypt ${LINK_JEMALLOC}) +ELSE() + target_link_libraries(taosd dnode crypt) +ENDIF() diff --git a/source/dnode/mgmt/exe/dmMain.c b/source/dnode/mgmt/exe/dmMain.c index 040eafbcf1..f94b9e2d73 100644 --- a/source/dnode/mgmt/exe/dmMain.c +++ b/source/dnode/mgmt/exe/dmMain.c @@ -24,6 +24,7 @@ #include "jemalloc/jemalloc.h" #endif #include "dmUtil.h" +#include "tcs.h" #if defined(CUS_NAME) || defined(CUS_PROMPT) || defined(CUS_EMAIL) #include "cus_name.h" @@ -330,10 +331,9 @@ static int32_t dmCheckS3() { int32_t code = 0; SConfig *pCfg = taosGetCfg(); cfgDumpCfgS3(pCfg, 0, true); -#if defined(USE_S3) - extern int32_t s3CheckCfg(); - code = s3CheckCfg(); +#if defined(USE_S3) + code = tcsCheckCfg(); #endif return code; } diff --git a/source/dnode/mgmt/mgmt_dnode/CMakeLists.txt b/source/dnode/mgmt/mgmt_dnode/CMakeLists.txt index f7920d3d8e..76e51ac44f 100644 --- a/source/dnode/mgmt/mgmt_dnode/CMakeLists.txt +++ b/source/dnode/mgmt/mgmt_dnode/CMakeLists.txt @@ -1,24 +1,25 @@ aux_source_directory(src MGMT_DNODE) add_library(mgmt_dnode STATIC ${MGMT_DNODE}) -if (DEFINED GRANT_CFG_INCLUDE_DIR) + +if(DEFINED GRANT_CFG_INCLUDE_DIR) add_definitions(-DGRANTS_CFG) endif() -IF (NOT BUILD_DM_MODULE) +if(NOT BUILD_DM_MODULE) MESSAGE(STATUS "NOT BUILD_DM_MODULE") target_link_directories( mgmt_dnode PUBLIC "${TD_SOURCE_DIR}/deps/${TD_DEPS_DIR}/dm_static" ) -ELSE() - MESSAGE(STATUS "BUILD_DM_MODULE") -ENDIF() +else() + MESSAGE(STATUS "BUILD_DM_MODULE") +endif() target_include_directories( - mgmt_dnode - PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/inc" - PUBLIC "${GRANT_CFG_INCLUDE_DIR}" + mgmt_dnode + PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/inc" + PUBLIC "${GRANT_CFG_INCLUDE_DIR}" ) target_link_libraries( - mgmt_dnode node_util dmodule + mgmt_dnode node_util dmodule ) \ No newline at end of file diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c b/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c index 7fc9920816..7f802f3837 100644 --- a/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c +++ b/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c @@ -47,7 +47,6 @@ static void *dmStatusThreadFp(void *param) { return NULL; } -extern SMonVloadInfo tsVinfo; static void *dmStatusInfoThreadFp(void *param) { SDnodeMgmt *pMgmt = param; int64_t lastTime = taosGetTimestampMs(); @@ -73,19 +72,6 @@ static void *dmStatusInfoThreadFp(void *param) { } } } - dDebug("begin to lock status info when thread exit"); - if (taosThreadMutexLock(&pMgmt->pData->statusInfolock) != 0) { - dError("failed to lock status info lock"); - return NULL; - } - if (tsVinfo.pVloads != NULL) { - taosArrayDestroy(tsVinfo.pVloads); - tsVinfo.pVloads = NULL; - } - if (taosThreadMutexUnlock(&pMgmt->pData->statusInfolock) != 0) { - dError("failed to unlock status info lock"); - return NULL; - } return NULL; } diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmInt.c b/source/dnode/mgmt/mgmt_vnode/src/vmInt.c index 3cf0382eba..20618dbdf3 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmInt.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmInt.c @@ -213,13 +213,13 @@ void vmCloseVnode(SVnodeMgmt *pMgmt, SVnodeObj *pVnode, bool commitAndRemoveWal) taosQueueGetThreadId(pVnode->pApplyW.queue)); tMultiWorkerCleanup(&pVnode->pApplyW); - dInfo("vgId:%d, wait for vnode query queue:%p is empty", pVnode->vgId, pVnode->pQueryQ); - while (!taosQueueEmpty(pVnode->pQueryQ)) taosMsleep(10); - dInfo("vgId:%d, wait for vnode fetch queue:%p is empty, thread:%08" PRId64, pVnode->vgId, pVnode->pFetchQ, taosQueueGetThreadId(pVnode->pFetchQ)); while (!taosQueueEmpty(pVnode->pFetchQ)) taosMsleep(10); + dInfo("vgId:%d, wait for vnode query queue:%p is empty", pVnode->vgId, pVnode->pQueryQ); + while (!taosQueueEmpty(pVnode->pQueryQ)) taosMsleep(10); + tqNotifyClose(pVnode->pImpl->pTq); dInfo("vgId:%d, wait for vnode stream queue:%p is empty", pVnode->vgId, pVnode->pStreamQ); while (!taosQueueEmpty(pVnode->pStreamQ)) taosMsleep(10); diff --git a/source/dnode/mgmt/node_mgmt/CMakeLists.txt b/source/dnode/mgmt/node_mgmt/CMakeLists.txt index 82b9384d66..f5198681bc 100644 --- a/source/dnode/mgmt/node_mgmt/CMakeLists.txt +++ b/source/dnode/mgmt/node_mgmt/CMakeLists.txt @@ -1,22 +1,22 @@ aux_source_directory(src IMPLEMENT_SRC) add_library(dnode STATIC ${IMPLEMENT_SRC}) target_link_libraries( - dnode mgmt_mnode mgmt_qnode mgmt_snode mgmt_vnode mgmt_dnode monitorfw + dnode mgmt_mnode mgmt_qnode mgmt_snode mgmt_vnode mgmt_dnode monitorfw tcs ) -IF (TD_ENTERPRISE) +IF(TD_ENTERPRISE) IF(${BUILD_WITH_S3}) - add_definitions(-DUSE_S3) + add_definitions(-DUSE_S3) ELSEIF(${BUILD_WITH_COS}) - add_definitions(-DUSE_COS) + add_definitions(-DUSE_COS) ENDIF() ENDIF() -IF (DEFINED GRANT_CFG_INCLUDE_DIR) +IF(DEFINED GRANT_CFG_INCLUDE_DIR) add_definitions(-DGRANTS_CFG) ENDIF() target_include_directories( - dnode - PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" + dnode + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" ) diff --git a/source/dnode/mgmt/node_mgmt/src/dmEnv.c b/source/dnode/mgmt/node_mgmt/src/dmEnv.c index 0c2bd2bc0f..694cc52d64 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmEnv.c +++ b/source/dnode/mgmt/node_mgmt/src/dmEnv.c @@ -20,6 +20,7 @@ #include "libs/function/tudf.h" #include "tgrant.h" #include "tcompare.h" +#include "tcs.h" #include "tanal.h" // clang-format on @@ -98,9 +99,9 @@ static bool dmDataSpaceAvailable() { static int32_t dmCheckDiskSpace() { // availability int32_t code = 0; - code = osUpdate(); - if(code != 0) { - code = 0; // ignore the error, just log it + code = osUpdate(); + if (code != 0) { + code = 0; // ignore the error, just log it dError("failed to update os info since %s", tstrerror(code)); } if (!dmDataSpaceAvailable()) { @@ -163,13 +164,6 @@ static int32_t dmCheckDataDirVersionWrapper() { } return 0; } -#if defined(USE_S3) - -extern int32_t s3Begin(); -extern void s3End(); -extern int8_t tsS3Enabled; - -#endif int32_t dmInit() { dInfo("start to init dnode env"); @@ -187,7 +181,7 @@ int32_t dmInit() { if ((code = dmInitDnode(dmInstance())) != 0) return code; if ((code = InitRegexCache() != 0)) return code; #if defined(USE_S3) - if ((code = s3Begin()) != 0) return code; + if ((code = tcsInit()) != 0) return code; #endif dInfo("dnode env is initialized"); @@ -221,7 +215,7 @@ void dmCleanup() { DestroyRegexCache(); #if defined(USE_S3) - s3End(); + tcsUninit(); #endif dInfo("dnode env is cleaned up"); diff --git a/source/dnode/mgmt/node_mgmt/src/dmMgmt.c b/source/dnode/mgmt/node_mgmt/src/dmMgmt.c index 5e4f7163e7..9f1c292a90 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmMgmt.c +++ b/source/dnode/mgmt/node_mgmt/src/dmMgmt.c @@ -219,6 +219,7 @@ int32_t dmInitVars(SDnode *pDnode) { return 0; } +extern SMonVloadInfo tsVinfo; void dmClearVars(SDnode *pDnode) { for (EDndNodeType ntype = DNODE; ntype < NODE_END; ++ntype) { SMgmtWrapper *pWrapper = &pDnode->wrappers[ntype]; @@ -254,6 +255,25 @@ void dmClearVars(SDnode *pDnode) { (void)taosThreadRwlockUnlock(&pData->lock); (void)taosThreadRwlockDestroy(&pData->lock); + + dDebug("begin to lock status info when thread exit"); + if (taosThreadMutexLock(&pData->statusInfolock) != 0) { + dError("failed to lock status info lock"); + return; + } + if (tsVinfo.pVloads != NULL) { + taosArrayDestroy(tsVinfo.pVloads); + tsVinfo.pVloads = NULL; + } + if (taosThreadMutexUnlock(&pData->statusInfolock) != 0) { + dError("failed to unlock status info lock"); + return; + } + if (taosThreadMutexDestroy(&pData->statusInfolock) != 0) { + dError("failed to destroy status info lock"); + } + memset(&pData->statusInfolock, 0, sizeof(pData->statusInfolock)); + (void)taosThreadMutexDestroy(&pDnode->mutex); memset(&pDnode->mutex, 0, sizeof(pDnode->mutex)); } diff --git a/source/dnode/mgmt/node_mgmt/src/dmTransport.c b/source/dnode/mgmt/node_mgmt/src/dmTransport.c index 28d6113bba..fd593e0638 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmTransport.c +++ b/source/dnode/mgmt/node_mgmt/src/dmTransport.c @@ -16,8 +16,8 @@ #define _DEFAULT_SOURCE #include "dmMgmt.h" #include "qworker.h" -#include "tversion.h" #include "tanal.h" +#include "tversion.h" static inline void dmSendRsp(SRpcMsg *pMsg) { if (rpcSendResponse(pMsg) != 0) { @@ -411,7 +411,7 @@ int32_t dmInitClient(SDnode *pDnode) { rpcInit.noDelayFp = rpcNoDelayMsg; - int32_t connLimitNum = tsNumOfRpcSessions / (tsNumOfRpcThreads * 3) / 2; + int32_t connLimitNum = tsNumOfRpcSessions / (tsNumOfRpcThreads * 3); connLimitNum = TMAX(connLimitNum, 10); connLimitNum = TMIN(connLimitNum, 500); diff --git a/source/dnode/mnode/impl/CMakeLists.txt b/source/dnode/mnode/impl/CMakeLists.txt index 1a74b6fa9f..8a390948ae 100644 --- a/source/dnode/mnode/impl/CMakeLists.txt +++ b/source/dnode/mnode/impl/CMakeLists.txt @@ -1,44 +1,46 @@ aux_source_directory(src MNODE_SRC) -IF (TD_PRIVILEGE) + +if(TD_PRIVILEGE) ADD_DEFINITIONS(-D_PRIVILEGE) -ENDIF () -IF (TD_ENTERPRISE) +endif() + +if(TD_ENTERPRISE) LIST(APPEND MNODE_SRC ${TD_ENTERPRISE_DIR}/src/plugins/privilege/src/privilege.c) LIST(APPEND MNODE_SRC ${TD_ENTERPRISE_DIR}/src/plugins/mnode/src/mndDb.c) LIST(APPEND MNODE_SRC ${TD_ENTERPRISE_DIR}/src/plugins/mnode/src/mndVgroup.c) LIST(APPEND MNODE_SRC ${TD_ENTERPRISE_DIR}/src/plugins/mnode/src/mndDnode.c) LIST(APPEND MNODE_SRC ${TD_ENTERPRISE_DIR}/src/plugins/view/src/mndView.c) - IF(${BUILD_WITH_S3}) + if(${BUILD_WITH_S3}) add_definitions(-DUSE_S3) ELSEIF(${BUILD_WITH_COS}) add_definitions(-DUSE_COS) - ENDIF() + endif() - IF(${BUILD_WITH_ANALYSIS}) + if(${BUILD_WITH_ANALYSIS}) add_definitions(-DUSE_ANAL) - ENDIF() -ENDIF () + endif() +endif() add_library(mnode STATIC ${MNODE_SRC}) target_include_directories( - mnode - PUBLIC "${TD_SOURCE_DIR}/include/dnode/mnode" - PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" + mnode + PUBLIC "${TD_SOURCE_DIR}/include/dnode/mnode" + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" ) target_link_libraries( - mnode scheduler sdb wal transport cjson sync monitor executor qworker stream parser audit monitorfw + mnode scheduler sdb wal transport cjson sync monitor executor qworker stream parser audit monitorfw ) -IF (DEFINED GRANT_CFG_INCLUDE_DIR) +if(DEFINED GRANT_CFG_INCLUDE_DIR) add_definitions(-DGRANTS_CFG) -ENDIF() +endif() -IF (TD_GRANT) +if(TD_GRANT) TARGET_LINK_LIBRARIES(mnode grant) ADD_DEFINITIONS(-D_GRANT) -ENDIF () +endif() if(${BUILD_TEST}) - add_subdirectory(test) + add_subdirectory(test) endif(${BUILD_TEST}) diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index 7c42564f4c..aed00af3c1 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -583,7 +583,7 @@ static void mndSetDefaultDbCfg(SDbCfg *pCfg) { if (pCfg->tsdbPageSize <= 0) pCfg->tsdbPageSize = TSDB_DEFAULT_TSDB_PAGESIZE; if (pCfg->s3ChunkSize <= 0) pCfg->s3ChunkSize = TSDB_DEFAULT_S3_CHUNK_SIZE; if (pCfg->s3KeepLocal <= 0) pCfg->s3KeepLocal = TSDB_DEFAULT_S3_KEEP_LOCAL; - if (pCfg->s3Compact <= 0) pCfg->s3Compact = TSDB_DEFAULT_S3_COMPACT; + if (pCfg->s3Compact < 0) pCfg->s3Compact = TSDB_DEFAULT_S3_COMPACT; if (pCfg->withArbitrator < 0) pCfg->withArbitrator = TSDB_DEFAULT_DB_WITH_ARBITRATOR; if (pCfg->encryptAlgorithm < 0) pCfg->encryptAlgorithm = TSDB_DEFAULT_ENCRYPT_ALGO; } diff --git a/source/dnode/mnode/impl/src/mndStb.c b/source/dnode/mnode/impl/src/mndStb.c index b8cf72cd9e..2500d1ef40 100644 --- a/source/dnode/mnode/impl/src/mndStb.c +++ b/source/dnode/mnode/impl/src/mndStb.c @@ -4076,7 +4076,7 @@ typedef struct SMDropTbDbInfo { typedef struct SMDropTbTsmaInfo { char tsmaResTbDbFName[TSDB_DB_FNAME_LEN]; - char tsmaResTbNamePrefix[TSDB_TABLE_NAME_LEN]; + char tsmaResTbNamePrefix[TSDB_TABLE_FNAME_LEN]; int32_t suid; SMDropTbDbInfo dbInfo; // reference to DbInfo in pDbMap } SMDropTbTsmaInfo; @@ -4207,6 +4207,7 @@ static int32_t mndCreateDropTbsTxnPrepare(SRpcMsg *pRsp, SMndDropTbsWithTsmaCtx SMnode *pMnode = pRsp->info.node; STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pRsp, "drop-tbs"); mndTransSetChangeless(pTrans); + mndTransSetSerial(pTrans); if (pTrans == NULL) { code = TSDB_CODE_MND_RETURN_VALUE_NULL; if (terrno != 0) code = terrno; @@ -4294,6 +4295,18 @@ static int32_t mndDropTbAdd(SMnode *pMnode, SHashObj *pVgHashMap, const SVgroupI return 0; } +int vgInfoCmp(const void* lp, const void* rp) { + SVgroupInfo* pLeft = (SVgroupInfo*)lp; + SVgroupInfo* pRight = (SVgroupInfo*)rp; + if (pLeft->hashBegin < pRight->hashBegin) { + return -1; + } else if (pLeft->hashBegin > pRight->hashBegin) { + return 1; + } + + return 0; +} + static int32_t mndGetDbVgInfoForTsma(SMnode *pMnode, const char *dbname, SMDropTbTsmaInfo *pInfo) { int32_t code = 0; SDbObj *pDb = mndAcquireDb(pMnode, dbname); @@ -4308,6 +4321,7 @@ static int32_t mndGetDbVgInfoForTsma(SMnode *pMnode, const char *dbname, SMDropT goto _end; } mndBuildDBVgroupInfo(pDb, pMnode, pInfo->dbInfo.dbVgInfos); + taosArraySort(pInfo->dbInfo.dbVgInfos, vgInfoCmp); pInfo->dbInfo.hashPrefix = pDb->cfg.hashPrefix; pInfo->dbInfo.hashSuffix = pDb->cfg.hashSuffix; @@ -4380,9 +4394,8 @@ static int32_t mndDropTbAddTsmaResTbsForSingleVg(SMnode *pMnode, SMndDropTbsWith if (pInfos) { SMDropTbTsmaInfo info = {0}; int32_t len = sprintf(buf, "%s", pSma->name); - len = taosCreateMD5Hash(buf, len); sprintf(info.tsmaResTbDbFName, "%s", pSma->db); - snprintf(info.tsmaResTbNamePrefix, TSDB_TABLE_NAME_LEN, "%s", buf); + snprintf(info.tsmaResTbNamePrefix, TSDB_TABLE_FNAME_LEN, "%s", buf); SMDropTbDbInfo *pDbInfo = taosHashGet(pCtx->pDbMap, pSma->db, TSDB_DB_FNAME_LEN); info.suid = pSma->dstTbUid; if (!pDbInfo) { @@ -4417,14 +4430,17 @@ static int32_t mndDropTbAddTsmaResTbsForSingleVg(SMnode *pMnode, SMndDropTbsWith SMDropTbTsmaInfos *pInfos = taosHashGet(pCtx->pTsmaMap, &pTb->suid, sizeof(pTb->suid)); SArray *pVgInfos = NULL; - char buf[TSDB_TABLE_FNAME_LEN]; + char buf[TSDB_TABLE_FNAME_LEN + TSDB_TABLE_NAME_LEN + 1]; + char resTbFullName[TSDB_TABLE_FNAME_LEN + 1] = {0}; for (int32_t j = 0; j < pInfos->pTsmaInfos->size; ++j) { SMDropTbTsmaInfo *pInfo = taosArrayGet(pInfos->pTsmaInfos, j); - int32_t len = sprintf(buf, "%s.%s_%s", pInfo->tsmaResTbDbFName, pInfo->tsmaResTbNamePrefix, pTb->name); - uint32_t hashVal = - taosGetTbHashVal(buf, len, pInfo->dbInfo.hashMethod, pInfo->dbInfo.hashPrefix, pInfo->dbInfo.hashSuffix); + int32_t len = sprintf(buf, "%s_%s", pInfo->tsmaResTbNamePrefix, pTb->name); + len = taosCreateMD5Hash(buf, len); + len = snprintf(resTbFullName, TSDB_TABLE_FNAME_LEN + 1, "%s.%s", pInfo->tsmaResTbDbFName, buf); + uint32_t hashVal = taosGetTbHashVal(resTbFullName, len, pInfo->dbInfo.hashMethod, pInfo->dbInfo.hashPrefix, + pInfo->dbInfo.hashSuffix); const SVgroupInfo *pVgInfo = taosArraySearch(pInfo->dbInfo.dbVgInfos, &hashVal, vgHashValCmp, TD_EQ); - void *p = taosStrdup(buf + strlen(pInfo->tsmaResTbDbFName) + TSDB_NAME_DELIMITER_LEN); + void *p = taosStrdup(resTbFullName + strlen(pInfo->tsmaResTbDbFName) + TSDB_NAME_DELIMITER_LEN); if (taosArrayPush(pCtx->pResTbNames, &p) == NULL) { code = terrno; goto _end; diff --git a/source/dnode/mnode/impl/test/arbgroup/CMakeLists.txt b/source/dnode/mnode/impl/test/arbgroup/CMakeLists.txt index 44ac305498..0da36e1f67 100644 --- a/source/dnode/mnode/impl/test/arbgroup/CMakeLists.txt +++ b/source/dnode/mnode/impl/test/arbgroup/CMakeLists.txt @@ -4,7 +4,7 @@ aux_source_directory(. MNODE_ARBGROUP_TEST_SRC) add_executable(arbgroupTest ${MNODE_ARBGROUP_TEST_SRC}) target_link_libraries( arbgroupTest - PRIVATE dnode nodes planner gtest qcom + PRIVATE dnode nodes planner gtest qcom tcs ) add_test( diff --git a/source/dnode/vnode/CMakeLists.txt b/source/dnode/vnode/CMakeLists.txt index f70a8844ba..c377e69f03 100644 --- a/source/dnode/vnode/CMakeLists.txt +++ b/source/dnode/vnode/CMakeLists.txt @@ -1,24 +1,26 @@ # vnode add_subdirectory(src/tqCommon) add_library(vnode STATIC "") + if(${TD_DARWIN}) target_compile_options(vnode PRIVATE -Wno-error=single-bit-bitfield-constant-conversion) endif(${TD_DARWIN}) + set( - VNODE_SOURCE_FILES - "src/vnd/vnodeOpen.c" - "src/vnd/vnodeBufPool.c" - "src/vnd/vnodeCfg.c" - "src/vnd/vnodeCommit.c" - "src/vnd/vnodeQuery.c" - "src/vnd/vnodeModule.c" - "src/vnd/vnodeSvr.c" - "src/vnd/vnodeSync.c" - "src/vnd/vnodeSnapshot.c" - "src/vnd/vnodeRetention.c" - "src/vnd/vnodeInitApi.c" - "src/vnd/vnodeAsync.c" - "src/vnd/vnodeHash.c" + VNODE_SOURCE_FILES + "src/vnd/vnodeOpen.c" + "src/vnd/vnodeBufPool.c" + "src/vnd/vnodeCfg.c" + "src/vnd/vnodeCommit.c" + "src/vnd/vnodeQuery.c" + "src/vnd/vnodeModule.c" + "src/vnd/vnodeSvr.c" + "src/vnd/vnodeSync.c" + "src/vnd/vnodeSnapshot.c" + "src/vnd/vnodeRetention.c" + "src/vnd/vnodeInitApi.c" + "src/vnd/vnodeAsync.c" + "src/vnd/vnodeHash.c" # meta "src/meta/metaOpen.c" @@ -40,23 +42,23 @@ set( "src/sma/smaSnapshot.c" "src/sma/smaTimeRange.c" - # # tsdb - # "src/tsdb/tsdbCommit.c" - # "src/tsdb/tsdbFile.c" - # "src/tsdb/tsdbFS.c" - # "src/tsdb/tsdbOpen.c" - # "src/tsdb/tsdbMemTable.c" - # "src/tsdb/tsdbRead.c" - # "src/tsdb/tsdbCache.c" - # "src/tsdb/tsdbWrite.c" - # "src/tsdb/tsdbReaderWriter.c" - # "src/tsdb/tsdbUtil.c" - # "src/tsdb/tsdbSnapshot.c" - # "src/tsdb/tsdbCacheRead.c" - # "src/tsdb/tsdbRetention.c" - # "src/tsdb/tsdbDiskData.c" - # "src/tsdb/tsdbMergeTree.c" - # "src/tsdb/tsdbDataIter.c" + # # tsdb + # "src/tsdb/tsdbCommit.c" + # "src/tsdb/tsdbFile.c" + # "src/tsdb/tsdbFS.c" + # "src/tsdb/tsdbOpen.c" + # "src/tsdb/tsdbMemTable.c" + # "src/tsdb/tsdbRead.c" + # "src/tsdb/tsdbCache.c" + # "src/tsdb/tsdbWrite.c" + # "src/tsdb/tsdbReaderWriter.c" + # "src/tsdb/tsdbUtil.c" + # "src/tsdb/tsdbSnapshot.c" + # "src/tsdb/tsdbCacheRead.c" + # "src/tsdb/tsdbRetention.c" + # "src/tsdb/tsdbDiskData.c" + # "src/tsdb/tsdbMergeTree.c" + # "src/tsdb/tsdbDataIter.c" # tq "src/tq/tq.c" @@ -71,14 +73,13 @@ set( "src/tq/tqSnapshot.c" "src/tq/tqStreamStateSnap.c" "src/tq/tqStreamTaskSnap.c" - ) aux_source_directory("src/tsdb/" TSDB_SOURCE_FILES) list( - APPEND - VNODE_SOURCE_FILES - ${TSDB_SOURCE_FILES} + APPEND + VNODE_SOURCE_FILES + ${TSDB_SOURCE_FILES} ) target_sources( @@ -87,38 +88,38 @@ target_sources( ${VNODE_SOURCE_FILES} ) -IF (TD_VNODE_PLUGINS) - target_sources( - vnode - PRIVATE - ${TD_ENTERPRISE_DIR}/src/plugins/vnode/src/tsdbCompact.c - ${TD_ENTERPRISE_DIR}/src/plugins/vnode/src/tsdbCompactMonitor.c - ${TD_ENTERPRISE_DIR}/src/plugins/vnode/src/vnodeCompact.c - ) -ENDIF () +if(TD_VNODE_PLUGINS) + target_sources( + vnode + PRIVATE + ${TD_ENTERPRISE_DIR}/src/plugins/vnode/src/tsdbCompact.c + ${TD_ENTERPRISE_DIR}/src/plugins/vnode/src/tsdbCompactMonitor.c + ${TD_ENTERPRISE_DIR}/src/plugins/vnode/src/vnodeCompact.c + ) +endif() -# IF (NOT ${TD_LINUX}) +# if (NOT ${TD_LINUX}) # target_include_directories( -# vnode -# PUBLIC "inc" -# PUBLIC "src/inc" -# PUBLIC "${TD_SOURCE_DIR}/include/libs/scalar" -# PUBLIC "${TD_SOURCE_DIR}/contrib/rocksdb/include" +# vnode +# PUBLIC "inc" +# PUBLIC "src/inc" +# PUBLIC "${TD_SOURCE_DIR}/include/libs/scalar" +# PUBLIC "${TD_SOURCE_DIR}/contrib/rocksdb/include" # ) # ELSE() # target_include_directories( -# vnode -# PUBLIC "inc" -# PUBLIC "src/inc" -# PUBLIC "${TD_SOURCE_DIR}/include/libs/scalar" +# vnode +# PUBLIC "inc" +# PUBLIC "src/inc" +# PUBLIC "${TD_SOURCE_DIR}/include/libs/scalar" # ) -#ENDIF(NOT ${TD_LINUX}) - -if (${BUILD_CONTRIB}) +# endif(NOT ${TD_LINUX}) +if(${BUILD_CONTRIB}) target_include_directories( vnode PUBLIC "inc" PUBLIC "src/inc" + PUBLIC "${TD_SOURCE_DIR}/include/libs/tcs" PUBLIC "${TD_SOURCE_DIR}/include/libs/scalar" PUBLIC "${TD_SOURCE_DIR}/include/libs/crypt" PUBLIC "${TD_SOURCE_DIR}/include/dnode/vnode" @@ -129,24 +130,26 @@ else() vnode PUBLIC "inc" PUBLIC "src/inc" + PUBLIC "${TD_SOURCE_DIR}/include/libs/tcs" PUBLIC "${TD_SOURCE_DIR}/include/libs/scalar" PUBLIC "${TD_SOURCE_DIR}/include/libs/crypt" PUBLIC "${TD_SOURCE_DIR}/include/dnode/vnode" ) - if (${TD_LINUX}) - target_include_directories( - vnode + + if(${TD_LINUX}) + target_include_directories( + vnode PUBLIC "${TD_SOURCE_DIR}/deps/${TD_DEPS_DIR}/rocksdb_static" ) target_link_directories( - vnode + vnode PUBLIC "${TD_SOURCE_DIR}/deps/${TD_DEPS_DIR}/rocksdb_static" ) endif() endif() target_link_directories( - vnode + vnode PUBLIC "${CMAKE_BINARY_DIR}/build/lib" ) @@ -164,10 +167,11 @@ target_link_libraries( PUBLIC tdb PUBLIC audit PUBLIC crypt + PUBLIC tcs # PUBLIC bdb # PUBLIC scalar - #PUBLIC zstd + # PUBLIC zstd PUBLIC rocksdb PUBLIC transport PUBLIC stream @@ -175,9 +179,9 @@ target_link_libraries( PUBLIC tqCommon ) -IF (TD_GRANT) - TARGET_LINK_LIBRARIES(vnode PUBLIC grant) -ENDIF () +if(TD_GRANT) + TARGET_LINK_LIBRARIES(vnode PUBLIC grant) +endif() target_compile_definitions(vnode PUBLIC -DMETA_REFACT) diff --git a/source/dnode/vnode/src/meta/metaOpen.c b/source/dnode/vnode/src/meta/metaOpen.c index 8f2c0b5a5e..659ba3f777 100644 --- a/source/dnode/vnode/src/meta/metaOpen.c +++ b/source/dnode/vnode/src/meta/metaOpen.c @@ -496,6 +496,7 @@ void metaULock(SMeta *pMeta) { static void metaCleanup(SMeta **ppMeta) { SMeta *pMeta = *ppMeta; if (pMeta) { + metaInfo("vgId:%d meta clean up, path:%s", TD_VID(pMeta->pVnode), pMeta->path); if (pMeta->pEnv) metaAbort(pMeta); if (pMeta->pCache) metaCacheClose(pMeta); #ifdef BUILD_NO_CALL diff --git a/source/dnode/vnode/src/tsdb/tsdbCache.c b/source/dnode/vnode/src/tsdb/tsdbCache.c index 89a51eb0f5..5583e464ed 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCache.c +++ b/source/dnode/vnode/src/tsdb/tsdbCache.c @@ -12,8 +12,8 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -#include "cos.h" #include "functionMgt.h" +#include "tcs.h" #include "tsdb.h" #include "tsdbDataFileRW.h" #include "tsdbIter.h" @@ -1258,7 +1258,8 @@ static int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, SArray } if (NULL == pLastCol || cmp_res < 0 || (cmp_res == 0 && !COL_VAL_IS_NONE(pColVal))) { - SLastCol lastColTmp = {.rowKey = *pRowKey, .colVal = *pColVal, .dirty = 0, .cacheStatus = TSDB_LAST_CACHE_VALID}; + SLastCol lastColTmp = { + .rowKey = *pRowKey, .colVal = *pColVal, .dirty = 0, .cacheStatus = TSDB_LAST_CACHE_VALID}; if ((code = tsdbCachePutToRocksdb(pTsdb, &idxKey->key, &lastColTmp)) != TSDB_CODE_SUCCESS) { tsdbError("tsdb/cache: vgId:%d, put rocks failed at line %d since %s.", TD_VID(pTsdb->pVnode), lino, tstrerror(code)); @@ -1705,8 +1706,7 @@ static int32_t tsdbCacheLoadFromRocks(STsdb *pTsdb, tb_uid_t uid, SArray *pLastA if (pLastCol && pLastCol->cacheStatus != TSDB_LAST_CACHE_NO_CACHE) { code = tsdbCachePutToLRU(pTsdb, &idxKey->key, pLastCol, 0); if (code) { - tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, __LINE__, - tstrerror(code)); + tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, __LINE__, tstrerror(code)); taosMemoryFreeClear(pToFree); TAOS_CHECK_EXIT(code); } @@ -3064,9 +3064,8 @@ static int32_t nextRowIterGet(CacheNextRowIter *pIter, TSDBROW **ppRow, bool *pI iMax[nMax] = i; max[nMax++] = pIter->input[i].pRow; - } else { - pIter->input[i].next = false; } + pIter->input[i].next = false; } } @@ -3520,7 +3519,7 @@ static int32_t tsdbCacheLoadBlockS3(STsdbFD *pFD, uint8_t **ppBlock) { int64_t block_offset = (pFD->blkno - 1) * tsS3BlockSize * pFD->szPage; - TAOS_CHECK_RETURN(s3GetObjectBlock(pFD->objName, block_offset, tsS3BlockSize * pFD->szPage, 0, ppBlock)); + TAOS_CHECK_RETURN(tcsGetObjectBlock(pFD->objName, block_offset, tsS3BlockSize * pFD->szPage, 0, ppBlock)); tsdbTrace("block:%p load from s3", *ppBlock); diff --git a/source/dnode/vnode/src/tsdb/tsdbFile2.c b/source/dnode/vnode/src/tsdb/tsdbFile2.c index da78d67db3..ad5f02d601 100644 --- a/source/dnode/vnode/src/tsdb/tsdbFile2.c +++ b/source/dnode/vnode/src/tsdb/tsdbFile2.c @@ -14,7 +14,7 @@ */ #include "tsdbFile2.h" -#include "cos.h" +#include "tcs.h" #include "vnd.h" // to_json @@ -318,7 +318,7 @@ static void tsdbTFileObjRemoveLC(STFileObj *fobj, bool remove_all) { } *(dot + 1) = 0; - s3DeleteObjectsByPrefix(object_name_prefix); + tcsDeleteObjectsByPrefix(object_name_prefix); // remove local last chunk file dot = strrchr(lc_path, '.'); diff --git a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c index d867318e1c..53e1c57f14 100644 --- a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c +++ b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c @@ -13,8 +13,8 @@ * along with this program. If not, see . */ -#include "cos.h" #include "crypt.h" +#include "tcs.h" #include "tsdb.h" #include "tsdbDef.h" #include "vnd.h" @@ -391,7 +391,7 @@ static int32_t tsdbReadFileBlock(STsdbFD *pFD, int64_t offset, int64_t size, boo snprintf(dot + 1, TSDB_FQDN_LEN - (dot + 1 - object_name_prefix), "%d.data", chunkno); - code = s3GetObjectBlock(object_name_prefix, cOffset, nRead, check, &pBlock); + code = tcsGetObjectBlock(object_name_prefix, cOffset, nRead, check, &pBlock); TSDB_CHECK_CODE(code, lino, _exit); memcpy(buf + n, pBlock, nRead); diff --git a/source/dnode/vnode/src/tsdb/tsdbRetention.c b/source/dnode/vnode/src/tsdb/tsdbRetention.c index cbe2ab4b8e..0072fd5e7f 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRetention.c +++ b/source/dnode/vnode/src/tsdb/tsdbRetention.c @@ -13,7 +13,7 @@ * along with this program. If not, see . */ -#include "cos.h" +#include "tcs.h" #include "tsdb.h" #include "tsdbFS2.h" #include "vnd.h" @@ -426,35 +426,6 @@ static int32_t tsdbS3FidLevel(int32_t fid, STsdbKeepCfg *pKeepCfg, int32_t s3Kee } } -static int32_t tsdbCopyFileS3(SRTNer *rtner, const STFileObj *from, const STFile *to) { - int32_t code = 0; - int32_t lino = 0; - - char fname[TSDB_FILENAME_LEN]; - TdFilePtr fdFrom = NULL; - // TdFilePtr fdTo = NULL; - - tsdbTFileName(rtner->tsdb, to, fname); - - fdFrom = taosOpenFile(from->fname, TD_FILE_READ); - if (fdFrom == NULL) { - TAOS_CHECK_GOTO(terrno, &lino, _exit); - } - - char *object_name = taosDirEntryBaseName(fname); - TAOS_CHECK_GOTO(s3PutObjectFromFile2(from->fname, object_name, 1), &lino, _exit); - -_exit: - if (code) { - tsdbError("vgId:%d %s failed at line %s:%d since %s", TD_VID(rtner->tsdb->pVnode), __func__, __FILE__, lino, - tstrerror(code)); - } - if (taosCloseFile(&fdFrom) != 0) { - tsdbTrace("vgId:%d, failed to close file", TD_VID(rtner->tsdb->pVnode)); - } - return code; -} - static int32_t tsdbMigrateDataFileLCS3(SRTNer *rtner, const STFileObj *fobj, int64_t size, int64_t chunksize) { int32_t code = 0; int32_t lino = 0; @@ -519,7 +490,7 @@ static int32_t tsdbMigrateDataFileLCS3(SRTNer *rtner, const STFileObj *fobj, int snprintf(dot + 1, TSDB_FQDN_LEN - (dot + 1 - object_name_prefix), "%d.data", cn); int64_t c_offset = chunksize * (cn - fobj->f->lcn); - TAOS_CHECK_GOTO(s3PutObjectFromFileOffset(fname, object_name_prefix, c_offset, chunksize), &lino, _exit); + TAOS_CHECK_GOTO(tcsPutObjectFromFileOffset(fname, object_name_prefix, c_offset, chunksize), &lino, _exit); } // copy last chunk @@ -618,7 +589,7 @@ static int32_t tsdbMigrateDataFileS3(SRTNer *rtner, const STFileObj *fobj, int64 snprintf(dot + 1, TSDB_FQDN_LEN - (dot + 1 - object_name_prefix), "%d.data", cn); int64_t c_offset = chunksize * (cn - 1); - TAOS_CHECK_GOTO(s3PutObjectFromFileOffset(fobj->fname, object_name_prefix, c_offset, chunksize), &lino, _exit); + TAOS_CHECK_GOTO(tcsPutObjectFromFileOffset(fobj->fname, object_name_prefix, c_offset, chunksize), &lino, _exit); } // copy last chunk @@ -741,8 +712,6 @@ _exit: int32_t tsdbAsyncS3Migrate(STsdb *tsdb, int64_t now) { int32_t code = 0; - extern int8_t tsS3EnabledCfg; - int32_t expired = grantCheck(TSDB_GRANT_OBJECT_STORAGE); if (expired && tsS3Enabled) { tsdbWarn("s3 grant expired: %d", expired); diff --git a/source/dnode/vnode/src/vnd/vnodeOpen.c b/source/dnode/vnode/src/vnd/vnodeOpen.c index 0d04486925..53365303b0 100644 --- a/source/dnode/vnode/src/vnd/vnodeOpen.c +++ b/source/dnode/vnode/src/vnd/vnodeOpen.c @@ -13,8 +13,8 @@ * along with this program. If not, see . */ -#include "cos.h" #include "sync.h" +#include "tcs.h" #include "tsdb.h" #include "vnd.h" @@ -327,7 +327,7 @@ void vnodeDestroy(int32_t vgId, const char *path, STfs *pTfs, int32_t nodeId) { if (nodeId > 0 && vgId > 0 /*&& nlevel > 1*/ && tsS3Enabled) { char vnode_prefix[TSDB_FILENAME_LEN]; snprintf(vnode_prefix, TSDB_FILENAME_LEN, "%d/v%df", nodeId, vgId); - s3DeleteObjectsByPrefix(vnode_prefix); + tcsDeleteObjectsByPrefix(vnode_prefix); } } diff --git a/source/libs/CMakeLists.txt b/source/libs/CMakeLists.txt index 64209572f4..033582f2c0 100644 --- a/source/libs/CMakeLists.txt +++ b/source/libs/CMakeLists.txt @@ -22,4 +22,6 @@ add_subdirectory(stream) add_subdirectory(planner) add_subdirectory(qworker) add_subdirectory(geometry) -add_subdirectory(command) \ No newline at end of file +add_subdirectory(command) +add_subdirectory(azure) +add_subdirectory(tcs) diff --git a/source/libs/audit/CMakeLists.txt b/source/libs/audit/CMakeLists.txt index 2a04f084f1..14648cc1a2 100644 --- a/source/libs/audit/CMakeLists.txt +++ b/source/libs/audit/CMakeLists.txt @@ -1,7 +1,8 @@ aux_source_directory(src AUDIT_SRC) -IF (TD_ENTERPRISE) + +IF(TD_ENTERPRISE) LIST(APPEND AUDIT_SRC ${TD_ENTERPRISE_DIR}/src/plugins/audit/src/audit.c) -ENDIF () +ENDIF() add_library(audit STATIC ${AUDIT_SRC}) target_include_directories( diff --git a/source/libs/azure/CMakeLists.txt b/source/libs/azure/CMakeLists.txt new file mode 100644 index 0000000000..1516a35c4d --- /dev/null +++ b/source/libs/azure/CMakeLists.txt @@ -0,0 +1,33 @@ +# if(${TD_LINUX}) +aux_source_directory(src AZ_SRC) + +add_library(az STATIC ${AZ_SRC}) + +if(${BUILD_S3}) + add_definitions(-DUSE_S3) + target_link_libraries( + az + PUBLIC _azure_sdk + PUBLIC crypt + ) +endif() + +target_include_directories( + az + PUBLIC "${TD_SOURCE_DIR}/include/libs/azure" + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" +) + +target_link_libraries( + az + PUBLIC cjson + PUBLIC os + PUBLIC util + PUBLIC common +) + +if(${BUILD_TEST}) + add_subdirectory(test) +endif(${BUILD_TEST}) + +# endif(${TD_LINUX}) diff --git a/source/libs/azure/inc/azInt.h b/source/libs/azure/inc/azInt.h new file mode 100644 index 0000000000..3538e925c7 --- /dev/null +++ b/source/libs/azure/inc/azInt.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * 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. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef _TD_AZ_INT_H_ +#define _TD_AZ_INT_H_ + +#include "os.h" +#include "tarray.h" +#include "tdef.h" +#include "tlog.h" +#include "tmsg.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// clang-format off +#define azFatal(...) { if (azDebugFlag & DEBUG_FATAL) { taosPrintLog("AZR FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }} +#define azError(...) { if (azDebugFlag & DEBUG_ERROR) { taosPrintLog("AZR ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }} +#define azWarn(...) { if (azDebugFlag & DEBUG_WARN) { taosPrintLog("AZR WARN ", DEBUG_WARN, 255, __VA_ARGS__); }} +#define azInfo(...) { if (azDebugFlag & DEBUG_INFO) { taosPrintLog("AZR ", DEBUG_INFO, 255, __VA_ARGS__); }} +#define azDebug(...) { if (azDebugFlag & DEBUG_DEBUG) { taosPrintLog("AZR ", DEBUG_DEBUG, azDebugFlag, __VA_ARGS__); }} +#define azTrace(...) { if (azDebugFlag & DEBUG_TRACE) { taosPrintLog("AZR ", DEBUG_TRACE, azDebugFlag, __VA_ARGS__); }} +// clang-format on + +#ifdef __cplusplus +} +#endif + +#endif // _TD_AZ_INT_H_ diff --git a/source/libs/azure/inc/td_avro_parser.h b/source/libs/azure/inc/td_avro_parser.h new file mode 100644 index 0000000000..dae5a65dc7 --- /dev/null +++ b/source/libs/azure/inc/td_avro_parser.h @@ -0,0 +1,191 @@ +#pragma once + +#include "azure/storage/blobs/blob_options.hpp" + +#include + +#include +#include +#include + +namespace Azure { +namespace Storage { +namespace Blobs { +namespace _detail { +enum class AvroDatumType { + String, + Bytes, + Int, + Long, + Float, + Double, + Bool, + Null, + Record, + Enum, + Array, + Map, + Union, + Fixed, +}; + +class AvroStreamReader final { + public: + // position of a vector that lives through vector resizing + struct ReaderPos final { + const std::vector* BufferPtr = nullptr; + size_t Offset = 0; + }; + explicit AvroStreamReader(Core::IO::BodyStream& stream) : m_stream(&stream), m_pos{&m_streambuffer, 0} {} + AvroStreamReader(const AvroStreamReader&) = delete; + AvroStreamReader& operator=(const AvroStreamReader&) = delete; + + int64_t ParseInt(const Core::Context& context); + void Advance(size_t n, const Core::Context& context); + // Read at least n bytes from m_stream and append data to m_streambuffer. Return number of bytes + // available in m_streambuffer; + size_t Preload(size_t n, const Core::Context& context); + size_t TryPreload(size_t n, const Core::Context& context); + // discards data that's before m_pos + void Discard(); + + private: + size_t AvailableBytes() const { return m_streambuffer.size() - m_pos.Offset; } + + private: + Core::IO::BodyStream* m_stream; + std::vector m_streambuffer; + ReaderPos m_pos; + + friend class AvroDatum; +}; + +class AvroSchema final { + public: + static const AvroSchema StringSchema; + static const AvroSchema BytesSchema; + static const AvroSchema IntSchema; + static const AvroSchema LongSchema; + static const AvroSchema FloatSchema; + static const AvroSchema DoubleSchema; + static const AvroSchema BoolSchema; + static const AvroSchema NullSchema; + static AvroSchema RecordSchema(std::string name, const std::vector>& fieldsSchema); + static AvroSchema ArraySchema(AvroSchema elementSchema); + static AvroSchema MapSchema(AvroSchema elementSchema); + static AvroSchema UnionSchema(std::vector schemas); + static AvroSchema FixedSchema(std::string name, int64_t size); + + const std::string& Name() const { return m_name; } + AvroDatumType Type() const { return m_type; } + const std::vector& FieldNames() const { return m_status->m_keys; } + AvroSchema ItemSchema() const { return m_status->m_schemas[0]; } + const std::vector& FieldSchemas() const { return m_status->m_schemas; } + size_t Size() const { return static_cast(m_status->m_size); } + + private: + explicit AvroSchema(AvroDatumType type) : m_type(type) {} + + private: + AvroDatumType m_type; + std::string m_name; + + struct SharedStatus { + std::vector m_keys; + std::vector m_schemas; + int64_t m_size = 0; + }; + std::shared_ptr m_status; +}; + +class AvroDatum final { + public: + AvroDatum() : m_schema(AvroSchema::NullSchema) {} + explicit AvroDatum(AvroSchema schema) : m_schema(std::move(schema)) {} + + void Fill(AvroStreamReader& reader, const Core::Context& context); + void Fill(AvroStreamReader::ReaderPos& data); + + const AvroSchema& Schema() const { return m_schema; } + + template + T Value() const; + struct StringView { + const uint8_t* Data = nullptr; + size_t Length = 0; + }; + + private: + AvroSchema m_schema; + AvroStreamReader::ReaderPos m_data; +}; + +using AvroMap = std::map; + +class AvroRecord final { + public: + bool HasField(const std::string& key) const { return FindField(key) != m_keys->size(); } + const AvroDatum& Field(const std::string& key) const { return m_values.at(FindField(key)); } + AvroDatum& Field(const std::string& key) { return m_values.at(FindField(key)); } + const AvroDatum& FieldAt(size_t i) const { return m_values.at(i); } + AvroDatum& FieldAt(size_t i) { return m_values.at(i); } + + private: + size_t FindField(const std::string& key) const { + auto i = find(m_keys->begin(), m_keys->end(), key); + return i - m_keys->begin(); + } + const std::vector* m_keys = nullptr; + std::vector m_values; + + friend class AvroDatum; +}; + +class AvroObjectContainerReader final { + public: + explicit AvroObjectContainerReader(Core::IO::BodyStream& stream); + + bool End() const { return m_eof; } + // Calling Next() will invalidates the previous AvroDatum returned by this function and all + // AvroDatums propagated from there. + AvroDatum Next(const Core::Context& context) { return NextImpl(m_objectSchema.get(), context); } + + private: + AvroDatum NextImpl(const AvroSchema* schema, const Core::Context& context); + + private: + std::unique_ptr m_reader; + std::unique_ptr m_objectSchema; + std::string m_syncMarker; + int64_t m_remainingObjectInCurrentBlock = 0; + bool m_eof = false; +}; + +class AvroStreamParser final : public Core::IO::BodyStream { + public: + explicit AvroStreamParser(std::unique_ptr inner, + std::function progressCallback, + std::function errorCallback) + : m_inner(std::move(inner)), + m_parser(*m_inner), + m_progressCallback(std::move(progressCallback)), + m_errorCallback(std::move(errorCallback)) {} + + int64_t Length() const override { return -1; } + void Rewind() override { this->m_inner->Rewind(); } + + private: + size_t OnRead(uint8_t* buffer, size_t count, const Azure::Core::Context& context) override; + + private: + std::unique_ptr m_inner; + AvroObjectContainerReader m_parser; + std::function m_progressCallback; + std::function m_errorCallback; + AvroDatum::StringView m_parserBuffer; +}; + +} // namespace _detail +} // namespace Blobs +} // namespace Storage +} // namespace Azure diff --git a/source/libs/azure/inc/td_block_blob_client.hpp b/source/libs/azure/inc/td_block_blob_client.hpp new file mode 100644 index 0000000000..1b00104821 --- /dev/null +++ b/source/libs/azure/inc/td_block_blob_client.hpp @@ -0,0 +1,260 @@ +#pragma once + +#include "azure/storage/blobs/blob_client.hpp" + +#include +#include +#include + +namespace Azure { +namespace Storage { +namespace Files { +namespace DataLake { +class FileClient; +} +} // namespace Files +} // namespace Storage +} // namespace Azure + +namespace Azure { +namespace Storage { +namespace Blobs { + +/** + * @brief The TDBlockBlobClient allows you to manipulate Azure Storage block blobs. + * + * Block blobs let you upload large blobs efficiently. Block blobs are comprised of blocks, each + * of which is identified by a block ID. You create or modify a block blob by writing a set of + * blocks and committing them by their block IDs. Each block can be a different size. + * + * When you upload a block to a blob in your storage account, it is associated with the specified + * block blob, but it does not become part of the blob until you commit a list of blocks that + * includes the new block's ID. New blocks remain in an uncommitted state until they are + * specifically committed or discarded. Writing a block does not update the last modified time of + * an existing blob. + */ +class TDBlockBlobClient final : public BlobClient { + public: + /** + * @brief Initialize a new instance of TDBlockBlobClient. + * + * @param connectionString A connection string includes the authentication information required + * for your application to access data in an Azure Storage account at runtime. + * @param blobContainerName The name of the container containing this blob. + * @param blobName The name of this blob. + * @param options Optional client options that define the transport pipeline policies for + * authentication, retries, etc., that are applied to every request. + * @return A new TDBlockBlobClient instance. + */ + static TDBlockBlobClient CreateFromConnectionString(const std::string& connectionString, + const std::string& blobContainerName, const std::string& blobName, + const BlobClientOptions& options = BlobClientOptions()); + + /** + * @brief Initialize a new instance of TDBlockBlobClient. + * + * @param blobUrl A URL + * referencing the blob that includes the name of the account, the name of the container, and + * the name of the blob. + * @param credential The shared key credential used to sign + * requests. + * @param options Optional client options that define the transport pipeline + * policies for authentication, retries, etc., that are applied to every request. + */ + explicit TDBlockBlobClient(const std::string& blobUrl, std::shared_ptr credential, + const BlobClientOptions& options = BlobClientOptions()); + + /** + * @brief Initialize a new instance of TDBlockBlobClient. + * + * @param blobUrl A URL + * referencing the blob that includes the name of the account, the name of the container, and + * the name of the blob. + * @param credential The token credential used to sign requests. + * @param options Optional client options that define the transport pipeline policies for + * authentication, retries, etc., that are applied to every request. + */ + explicit TDBlockBlobClient(const std::string& blobUrl, std::shared_ptr credential, + const BlobClientOptions& options = BlobClientOptions()); + + /** + * @brief Initialize a new instance of TDBlockBlobClient. + * + * @param blobUrl A URL + * referencing the blob that includes the name of the account, the name of the container, and + * the name of the blob, and possibly also a SAS token. + * @param options Optional client + * options that define the transport pipeline policies for authentication, retries, etc., that + * are applied to every request. + */ + explicit TDBlockBlobClient(const std::string& blobUrl, const BlobClientOptions& options = BlobClientOptions()); + + /** + * @brief Initializes a new instance of the TDBlockBlobClient class with an identical URL + * source but the specified snapshot timestamp. + * + * @param snapshot The snapshot + * identifier. + * @return A new TDBlockBlobClient instance. + * @remarks Pass empty string to remove the snapshot returning the base blob. + */ + TDBlockBlobClient WithSnapshot(const std::string& snapshot) const; + + /** + * @brief Creates a clone of this instance that references a version ID rather than the base + * blob. + * + * @param versionId The version ID returning a URL to the base blob. + * @return A new TDBlockBlobClient instance. + * @remarks Pass empty string to remove the version ID returning the base blob. + */ + TDBlockBlobClient WithVersionId(const std::string& versionId) const; + + /** + * @brief Creates a new block blob, or updates the content of an existing block blob. Updating + * an existing block blob overwrites any existing metadata on the blob. + * + * @param content A BodyStream containing the content to upload. + * @param options Optional parameters to execute this function. + * @param context Context for cancelling long running operations. + * @return A UploadBlockBlobResult describing the state of the updated block blob. + */ + Azure::Response Upload( + Azure::Core::IO::BodyStream& content, const UploadBlockBlobOptions& options = UploadBlockBlobOptions(), + const Azure::Core::Context& context = Azure::Core::Context()) const; + + /** + * @brief Creates a new block blob, or updates the content of an existing block blob. Updating + * an existing block blob overwrites any existing metadata on the blob. + * + * @param buffer A memory buffer containing the content to upload. + * @param bufferSize Size of the memory buffer. + * @param options Optional parameters to execute this function. + * @param context Context for cancelling long running operations. + * @return A UploadBlockBlobFromResult describing the state of the updated block blob. + */ + Azure::Response UploadFrom( + const uint8_t* buffer, size_t bufferSize, + const UploadBlockBlobFromOptions& options = UploadBlockBlobFromOptions(), + const Azure::Core::Context& context = Azure::Core::Context()) const; + + /** + * @brief Creates a new block blob, or updates the content of an existing block blob. Updating + * an existing block blob overwrites any existing metadata on the blob. + * + * @param fileName A file containing the content to upload. + * @param options Optional parameters to execute this function. + * @param context Context for cancelling long running operations. + * @return A UploadBlockBlobFromResult describing the state of the updated block blob. + */ + Azure::Response UploadFrom( + const std::string& fileName, const UploadBlockBlobFromOptions& options = UploadBlockBlobFromOptions(), + const Azure::Core::Context& context = Azure::Core::Context()) const; + + Azure::Response UploadFrom( + const std::string& fileName, int64_t offset, int64_t size, + const UploadBlockBlobFromOptions& options = UploadBlockBlobFromOptions(), + const Azure::Core::Context& context = Azure::Core::Context()) const; + + /** + * @brief Creates a new Block Blob where the contents of the blob are read from a given URL. + * + * @param sourceUri Specifies the URL of the source blob. + * @param options Optional parameters to execute this function. + * @param context Context for cancelling long running operations. + * @return A UploadBlockBlobFromUriResult describing the state of the updated block blob. + */ + Azure::Response UploadFromUri( + const std::string& sourceUri, const UploadBlockBlobFromUriOptions& options = UploadBlockBlobFromUriOptions(), + const Azure::Core::Context& context = Azure::Core::Context()) const; + + /** + * @brief Creates a new block as part of a block blob's staging area to be eventually + * committed via the CommitBlockList operation. + * + * @param blockId A valid Base64 string value that identifies the block. Prior to encoding, the + * string must be less than or equal to 64 bytes in size. + * @param content A BodyStream containing the content to upload. + * @param options Optional parameters to execute this function. + * @param context Context for cancelling long running operations. + * @return A StageBlockResult describing the state of the updated block. + */ + Azure::Response StageBlock( + const std::string& blockId, Azure::Core::IO::BodyStream& content, + const StageBlockOptions& options = StageBlockOptions(), + const Azure::Core::Context& context = Azure::Core::Context()) const; + + /** + * @brief Creates a new block to be committed as part of a blob where the contents are read from + * the sourceUri. + * + * @param blockId A valid Base64 string value that identifies the block. Prior to encoding, the + * string must be less than or equal to 64 bytes in size. + * @param sourceUri Specifies the uri of the source + * blob. The value may be a uri of up to 2 KB in length that specifies a blob. The source blob + * must either be public or must be authenticated via a shared access signature. If the source + * blob is public, no authentication is required to perform the operation. + * @param options Optional parameters to execute this function. + * @param context Context for cancelling long running operations. + * @return A StageBlockFromUriResult describing the state of the updated block blob. + */ + Azure::Response StageBlockFromUri( + const std::string& blockId, const std::string& sourceUri, + const StageBlockFromUriOptions& options = StageBlockFromUriOptions(), + const Azure::Core::Context& context = Azure::Core::Context()) const; + + /** + * @brief Writes a blob by specifying the list of block IDs that make up the blob. In order to + * be written as part of a blob, a block must have been successfully written to the server in a + * prior StageBlock operation. You can call CommitBlockList to update a blob by uploading only + * those blocks that have changed, then committing the new and existing blocks together. You can + * do this by specifying whether to commit a block from the committed block list or from the + * uncommitted block list, or to commit the most recently uploaded version of the block, + * whichever list it may belong to. + * + * @param blockIds Base64 encoded block IDs to indicate that make up the blob. + * @param options Optional parameters to execute this function. + * @param context Context for cancelling long running operations. + * @return A CommitBlobBlockListResult describing the state of the updated block blob. + */ + Azure::Response CommitBlockList( + const std::vector& blockIds, const CommitBlockListOptions& options = CommitBlockListOptions(), + const Azure::Core::Context& context = Azure::Core::Context()) const; + + /** + * @brief Retrieves the list of blocks that have been uploaded as part of a block blob. There + * are two block lists maintained for a blob. The Committed Block list has blocks that have been + * successfully committed to a given blob with CommitBlockList. The Uncommitted Block list has + * blocks that have been uploaded for a blob using StageBlock, but that have not yet been + * committed. + * + * @param options Optional parameters to execute this function. + * @param context Context for cancelling long running operations. + * @return A GetBlobBlockListResult describing requested block list. + */ + Azure::Response GetBlockList( + const GetBlockListOptions& options = GetBlockListOptions(), + const Azure::Core::Context& context = Azure::Core::Context()) const; + + /** + * @brief Returns the result of a query against the blob. + * + * @param querySqlExpression The query expression in SQL. + * @param options Optional parameters to execute this function. + * @param context Context for cancelling long running operations. + * @return A QueryBlobResult describing the query result. + */ + Azure::Response Query(const std::string& querySqlExpression, + const QueryBlobOptions& options = QueryBlobOptions(), + const Azure::Core::Context& context = Azure::Core::Context()) const; + + explicit TDBlockBlobClient(BlobClient blobClient); + + private: + friend class BlobClient; + friend class Files::DataLake::DataLakeFileClient; +}; + +} // namespace Blobs +} // namespace Storage +} // namespace Azure diff --git a/source/libs/azure/src/az.cpp b/source/libs/azure/src/az.cpp new file mode 100644 index 0000000000..5f95624c94 --- /dev/null +++ b/source/libs/azure/src/az.cpp @@ -0,0 +1,551 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * 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. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#define ALLOW_FORBID_FUNC + +#include "az.h" +#include "azInt.h" + +#include "os.h" +#include "taoserror.h" +#include "tglobal.h" + +#if defined(USE_S3) + +#include +#include +#include "td_block_blob_client.hpp" + +// Add appropriate using namespace directives +using namespace Azure::Storage; +using namespace Azure::Storage::Blobs; + +extern char tsS3Hostname[][TSDB_FQDN_LEN]; +extern char tsS3AccessKeyId[][TSDB_FQDN_LEN]; +extern char tsS3AccessKeySecret[][TSDB_FQDN_LEN]; +extern char tsS3BucketName[TSDB_FQDN_LEN]; + +extern int8_t tsS3Enabled; +extern int8_t tsS3EpNum; + +int32_t azBegin() { return TSDB_CODE_SUCCESS; } + +void azEnd() {} + +static void checkPrint(const char *fmt, ...) { + va_list arg_ptr; + va_start(arg_ptr, fmt); + (void)vfprintf(stderr, fmt, arg_ptr); + va_end(arg_ptr); +} + +static void azDumpCfgByEp(int8_t epIndex) { + // clang-format off + checkPrint( + "%-24s %s\n" + "%-24s %s\n" + "%-24s %s\n" + "%-24s %s\n" + "%-24s %s\n" + "%-24s %s\n", + "hostName", tsS3Hostname[epIndex], + "bucketName", tsS3BucketName, + "protocol", "https only", + "uristyle", "path only", + "accessKey", tsS3AccessKeyId[epIndex], + "accessKeySecret", tsS3AccessKeySecret[epIndex]); + // clang-format on +} + +static int32_t azListBucket(char const *bucketname) { + int32_t code = 0; + const std::string delimiter = "/"; + std::string accountName = tsS3AccessKeyId[0]; + std::string accountKey = tsS3AccessKeySecret[0]; + std::string accountURL = tsS3Hostname[0]; + accountURL = "https://" + accountURL; + + try { + auto sharedKeyCredential = std::make_shared(accountName, accountKey); + + BlobServiceClient blobServiceClient(accountURL, sharedKeyCredential); + + std::string containerName = bucketname; + auto containerClient = blobServiceClient.GetBlobContainerClient(containerName); + + Azure::Storage::Blobs::ListBlobsOptions options; + options.Prefix = "s3"; + + checkPrint("objects:\n"); + for (auto pageResult = containerClient.ListBlobs(options); pageResult.HasPage(); pageResult.MoveToNextPage()) { + for (const auto &blob : pageResult.Blobs) { + checkPrint("%s\n", blob.Name.c_str()); + } + } + } catch (const Azure::Core::RequestFailedException &e) { + azError("%s failed at line %d since %d(%s)", __func__, __LINE__, static_cast(e.StatusCode), + e.ReasonPhrase.c_str()); + + code = TAOS_SYSTEM_ERROR(EIO); + TAOS_RETURN(code); + } + + TAOS_RETURN(code); +} + +int32_t azCheckCfg() { + int32_t code = 0, lino = 0; + + azDumpCfgByEp(0); + + // test put + char testdata[17] = "0123456789abcdef"; + const char *objectname[] = {"s3test.txt"}; + char path[PATH_MAX] = {0}; + int ds_len = strlen(TD_DIRSEP); + int tmp_len = strlen(tsTempDir); + + (void)snprintf(path, PATH_MAX, "%s", tsTempDir); + if (strncmp(tsTempDir + tmp_len - ds_len, TD_DIRSEP, ds_len) != 0) { + (void)snprintf(path + tmp_len, PATH_MAX - tmp_len, "%s", TD_DIRSEP); + (void)snprintf(path + tmp_len + ds_len, PATH_MAX - tmp_len - ds_len, "%s", objectname[0]); + } else { + (void)snprintf(path + tmp_len, PATH_MAX - tmp_len, "%s", objectname[0]); + } + + uint8_t *pBlock = NULL; + int c_offset = 10; + int c_len = 6; + char buf[7] = {0}; + + TdFilePtr fp = taosOpenFile(path, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_READ | TD_FILE_TRUNC); + if (!fp) { + checkPrint("failed to open test file: %s.\n", path); + TAOS_CHECK_GOTO(terrno, &lino, _next); + } + if (taosWriteFile(fp, testdata, strlen(testdata)) < 0) { + checkPrint("failed to write test file: %s.\n", path); + TAOS_CHECK_GOTO(terrno, &lino, _next); + } + if (taosFsyncFile(fp) < 0) { + checkPrint("failed to fsync test file: %s.\n", path); + TAOS_CHECK_GOTO(terrno, &lino, _next); + } + (void)taosCloseFile(&fp); + + checkPrint("\nstart to put object: %s, file: %s content: %s\n", objectname[0], path, testdata); + code = azPutObjectFromFileOffset(path, objectname[0], 0, 16); + if (code != 0) { + checkPrint("put object %s : failed.\n", objectname[0]); + TAOS_CHECK_GOTO(code, &lino, _next); + } + checkPrint("put object %s: success.\n\n", objectname[0]); + + // list buckets + checkPrint("start to list bucket %s by prefix s3.\n", tsS3BucketName); + code = azListBucket(tsS3BucketName); + if (code != 0) { + checkPrint("listing bucket %s : failed.\n", tsS3BucketName); + TAOS_CHECK_GOTO(code, &lino, _next); + } + checkPrint("listing bucket %s: success.\n\n", tsS3BucketName); + + // test range get + checkPrint("start to range get object %s offset: %d len: %d.\n", objectname[0], c_offset, c_len); + code = azGetObjectBlock(objectname[0], c_offset, c_len, true, &pBlock); + if (code != 0) { + checkPrint("get object %s : failed.\n", objectname[0]); + TAOS_CHECK_GOTO(code, &lino, _next); + } + + (void)memcpy(buf, pBlock, c_len); + taosMemoryFree(pBlock); + checkPrint("object content: %s\n", buf); + checkPrint("get object %s: success.\n\n", objectname[0]); + + // delete test object + checkPrint("start to delete object: %s.\n", objectname[0]); + // code = azDeleteObjectsByPrefix(objectname[0]); + azDeleteObjectsByPrefix(objectname[0]); + /* + if (code != 0) { + (void)fprintf(stderr, "delete object %s : failed.\n", objectname[0]); + TAOS_CHECK_GOTO(code, &lino, _next); + } + */ + checkPrint("delete object %s: success.\n\n", objectname[0]); + +_next: + if (fp) { + (void)taosCloseFile(&fp); + } + + if (TSDB_CODE_SUCCESS != code) { + checkPrint("s3 check failed, code: %d, line: %d.\n", code, lino); + } + + checkPrint("=================================================================\n"); + + TAOS_RETURN(code); +} + +static int32_t azPutObjectFromFileOffsetImpl(const char *file, const char *object_name, int64_t offset, int64_t size) { + int32_t code = 0; + + std::string endpointUrl = tsS3Hostname[0]; + std::string accountName = tsS3AccessKeyId[0]; + std::string accountKey = tsS3AccessKeySecret[0]; + + try { + auto sharedKeyCredential = std::make_shared(accountName, accountKey); + + std::string accountURL = tsS3Hostname[0]; + + accountURL = "https://" + accountURL; + BlobServiceClient blobServiceClient(accountURL, sharedKeyCredential); + + std::string containerName = tsS3BucketName; + auto containerClient = blobServiceClient.GetBlobContainerClient(containerName); + + std::string blobName = "blob.txt"; + uint8_t blobContent[] = "Hello Azure!"; + // Create the block blob client + // BlockBlobClient blobClient = containerClient.GetBlockBlobClient(blobName); + // TDBlockBlobClient blobClient(containerClient.GetBlobClient(blobName)); + TDBlockBlobClient blobClient(containerClient.GetBlobClient(object_name)); + + blobClient.UploadFrom(file, offset, size); + } catch (const Azure::Core::RequestFailedException &e) { + azError("%s: Status Code: %d, Reason Phrase: %s", __func__, static_cast(e.StatusCode), e.ReasonPhrase.c_str()); + + code = TAOS_SYSTEM_ERROR(EIO); + azError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); + + TAOS_RETURN(code); + } + + TAOS_RETURN(code); +} + +int32_t azPutObjectFromFileOffset(const char *file, const char *object_name, int64_t offset, int64_t size) { + int32_t code = 0; + + try { + code = azPutObjectFromFileOffsetImpl(file, object_name, offset, size); + } catch (const std::exception &e) { + azError("%s: Reason Phrase: %s", __func__, e.what()); + + code = TAOS_SYSTEM_ERROR(EIO); + azError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); + + TAOS_RETURN(code); + } + + TAOS_RETURN(code); +} + +static int32_t azGetObjectBlockImpl(const char *object_name, int64_t offset, int64_t size, bool check, + uint8_t **ppBlock) { + int32_t code = TSDB_CODE_SUCCESS; + std::string accountName = tsS3AccessKeyId[0]; + std::string accountKey = tsS3AccessKeySecret[0]; + std::string accountURL = tsS3Hostname[0]; + uint8_t *buf = NULL; + + try { + auto sharedKeyCredential = std::make_shared(accountName, accountKey); + + accountURL = "https://" + accountURL; + BlobServiceClient blobServiceClient(accountURL, sharedKeyCredential); + + std::string containerName = tsS3BucketName; + auto containerClient = blobServiceClient.GetBlobContainerClient(containerName); + + TDBlockBlobClient blobClient(containerClient.GetBlobClient(object_name)); + + Blobs::DownloadBlobToOptions options; + options.Range = Azure::Core::Http::HttpRange(); + options.Range.Value().Offset = offset; + options.Range.Value().Length = size; + + buf = (uint8_t *)taosMemoryCalloc(1, size); + if (!buf) { + return terrno; + } + + auto res = blobClient.DownloadTo(buf, size, options); + if (check && res.Value.ContentRange.Length.Value() != size) { + code = TAOS_SYSTEM_ERROR(EIO); + azError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); + TAOS_RETURN(code); + } + + *ppBlock = buf; + } catch (const Azure::Core::RequestFailedException &e) { + azError("%s failed at line %d since %d(%s)", __func__, __LINE__, static_cast(e.StatusCode), + e.ReasonPhrase.c_str()); + code = TAOS_SYSTEM_ERROR(EIO); + azError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); + + if (buf) { + taosMemoryFree(buf); + } + *ppBlock = NULL; + + TAOS_RETURN(code); + } + + TAOS_RETURN(code); +} + +static int32_t azGetObjectBlockRetry(const char *object_name, int64_t offset, int64_t size, bool check, + uint8_t **ppBlock) { + int32_t code = TSDB_CODE_SUCCESS; + + // May use an exponential backoff policy for retries with 503 + int retryCount = 0; + static int maxRetryCount = 5; + static int minRetryInterval = 1000; // ms + static int maxRetryInterval = 3000; // ms + +_retry: + code = azGetObjectBlockImpl(object_name, offset, size, check, ppBlock); + if (TSDB_CODE_SUCCESS != code && retryCount++ < maxRetryCount) { + taosMsleep(taosRand() % (maxRetryInterval - minRetryInterval + 1) + minRetryInterval); + uInfo("%s: 0x%x(%s) and retry get object", __func__, code, tstrerror(code)); + goto _retry; + } + + TAOS_RETURN(code); +} + +int32_t azGetObjectBlock(const char *object_name, int64_t offset, int64_t size, bool check, uint8_t **ppBlock) { + int32_t code = TSDB_CODE_SUCCESS; + + try { + code = azGetObjectBlockRetry(object_name, offset, size, check, ppBlock); + } catch (const std::exception &e) { + azError("%s: Reason Phrase: %s", __func__, e.what()); + + code = TAOS_SYSTEM_ERROR(EIO); + azError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); + + TAOS_RETURN(code); + } + + TAOS_RETURN(code); +} + +static void azDeleteObjectsByPrefixImpl(const char *prefix) { + const std::string delimiter = "/"; + std::string accountName = tsS3AccessKeyId[0]; + std::string accountKey = tsS3AccessKeySecret[0]; + std::string accountURL = tsS3Hostname[0]; + accountURL = "https://" + accountURL; + + try { + auto sharedKeyCredential = std::make_shared(accountName, accountKey); + + BlobServiceClient blobServiceClient(accountURL, sharedKeyCredential); + + std::string containerName = tsS3BucketName; + auto containerClient = blobServiceClient.GetBlobContainerClient(containerName); + + Azure::Storage::Blobs::ListBlobsOptions options; + options.Prefix = prefix; + + std::set listBlobs; + for (auto pageResult = containerClient.ListBlobs(options); pageResult.HasPage(); pageResult.MoveToNextPage()) { + for (const auto &blob : pageResult.Blobs) { + listBlobs.insert(blob.Name); + } + } + + for (auto blobName : listBlobs) { + auto blobClient = containerClient.GetAppendBlobClient(blobName); + blobClient.Delete(); + } + } catch (const Azure::Core::RequestFailedException &e) { + azError("%s failed at line %d since %d(%s)", __func__, __LINE__, static_cast(e.StatusCode), + e.ReasonPhrase.c_str()); + } +} + +void azDeleteObjectsByPrefix(const char *prefix) { + int32_t code = TSDB_CODE_SUCCESS; + + try { + azDeleteObjectsByPrefixImpl(prefix); + } catch (const std::exception &e) { + azError("%s: Reason Phrase: %s", __func__, e.what()); + } +} + +int32_t azPutObjectFromFile2(const char *file, const char *object, int8_t withcp) { + int32_t code = 0, lino = 0; + uint64_t contentLength = 0; + + if (taosStatFile(file, (int64_t *)&contentLength, NULL, NULL) < 0) { + azError("ERROR: %s Failed to stat file %s: ", __func__, file); + TAOS_RETURN(terrno); + } + + code = azPutObjectFromFileOffset(file, object, 0, contentLength); + if (code != 0) { + azError("ERROR: %s Failed to put file %s: ", __func__, file); + TAOS_CHECK_GOTO(code, &lino, _exit); + } + +_exit: + if (code) { + azError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + } + + return 0; +} + +static int32_t azGetObjectToFileImpl(const char *object_name, const char *fileName) { + int32_t code = TSDB_CODE_SUCCESS; + std::string accountName = tsS3AccessKeyId[0]; + std::string accountKey = tsS3AccessKeySecret[0]; + std::string accountURL = tsS3Hostname[0]; + accountURL = "https://" + accountURL; + + try { + auto sharedKeyCredential = std::make_shared(accountName, accountKey); + + BlobServiceClient blobServiceClient(accountURL, sharedKeyCredential); + + std::string containerName = tsS3BucketName; + auto containerClient = blobServiceClient.GetBlobContainerClient(containerName); + + TDBlockBlobClient blobClient(containerClient.GetBlobClient(object_name)); + + auto res = blobClient.DownloadTo(fileName); + if (res.Value.ContentRange.Length.Value() <= 0) { + code = TAOS_SYSTEM_ERROR(EIO); + azError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); + TAOS_RETURN(code); + } + } catch (const Azure::Core::RequestFailedException &e) { + azError("%s failed at line %d since %d(%s)", __func__, __LINE__, static_cast(e.StatusCode), + e.ReasonPhrase.c_str()); + code = TAOS_SYSTEM_ERROR(EIO); + azError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); + TAOS_RETURN(code); + } + + TAOS_RETURN(code); +} + +int32_t azGetObjectToFile(const char *object_name, const char *fileName) { + int32_t code = 0; + + try { + code = azGetObjectToFileImpl(object_name, fileName); + } catch (const std::exception &e) { + azError("%s: Reason Phrase: %s", __func__, e.what()); + + code = TAOS_SYSTEM_ERROR(EIO); + azError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); + + TAOS_RETURN(code); + } + + TAOS_RETURN(code); +} + +int32_t azGetObjectsByPrefix(const char *prefix, const char *path) { + const std::string delimiter = "/"; + std::string accountName = tsS3AccessKeyId[0]; + std::string accountKey = tsS3AccessKeySecret[0]; + std::string accountURL = tsS3Hostname[0]; + accountURL = "https://" + accountURL; + + try { + auto sharedKeyCredential = std::make_shared(accountName, accountKey); + + BlobServiceClient blobServiceClient(accountURL, sharedKeyCredential); + + std::string containerName = tsS3BucketName; + auto containerClient = blobServiceClient.GetBlobContainerClient(containerName); + + Azure::Storage::Blobs::ListBlobsOptions options; + options.Prefix = prefix; + + std::set listBlobs; + for (auto pageResult = containerClient.ListBlobs(options); pageResult.HasPage(); pageResult.MoveToNextPage()) { + for (const auto &blob : pageResult.Blobs) { + listBlobs.insert(blob.Name); + } + } + + for (auto blobName : listBlobs) { + const char *tmp = strchr(blobName.c_str(), '/'); + tmp = (tmp == NULL) ? blobName.c_str() : tmp + 1; + char fileName[PATH_MAX] = {0}; + if (path[strlen(path) - 1] != TD_DIRSEP_CHAR) { + (void)snprintf(fileName, PATH_MAX, "%s%s%s", path, TD_DIRSEP, tmp); + } else { + (void)snprintf(fileName, PATH_MAX, "%s%s", path, tmp); + } + if (azGetObjectToFile(blobName.c_str(), fileName)) { + TAOS_RETURN(TSDB_CODE_FAILED); + } + } + } catch (const Azure::Core::RequestFailedException &e) { + azError("%s failed at line %d since %d(%s)", __func__, __LINE__, static_cast(e.StatusCode), + e.ReasonPhrase.c_str()); + TAOS_RETURN(TSDB_CODE_FAILED); + } + + return 0; +} + +int32_t azDeleteObjects(const char *object_name[], int nobject) { + for (int i = 0; i < nobject; ++i) { + azDeleteObjectsByPrefix(object_name[i]); + } + + return 0; +} + +#else + +int32_t azBegin() { return TSDB_CODE_SUCCESS; } + +void azEnd() {} + +int32_t azCheckCfg() { return TSDB_CODE_SUCCESS; } + +int32_t azPutObjectFromFileOffset(const char *file, const char *object_name, int64_t offset, int64_t size) { + return TSDB_CODE_SUCCESS; +} + +int32_t azGetObjectBlock(const char *object_name, int64_t offset, int64_t size, bool check, uint8_t **ppBlock) { + return TSDB_CODE_SUCCESS; +} + +void azDeleteObjectsByPrefix(const char *prefix) {} + +int32_t azPutObjectFromFile2(const char *file, const char *object, int8_t withcp) { return 0; } + +int32_t azGetObjectsByPrefix(const char *prefix, const char *path) { return 0; } + +int32_t azGetObjectToFile(const char *object_name, const char *fileName) { return 0; } + +int32_t azDeleteObjects(const char *object_name[], int nobject) { return 0; } + +#endif diff --git a/source/libs/azure/src/td_avro_parser.cpp b/source/libs/azure/src/td_avro_parser.cpp new file mode 100644 index 0000000000..62bd3a8151 --- /dev/null +++ b/source/libs/azure/src/td_avro_parser.cpp @@ -0,0 +1,531 @@ +#if defined(USE_S3) +#include + +#include +#include + +#include +#include + +namespace Azure { +namespace Storage { +namespace Blobs { +namespace _detail { + +namespace { +int64_t parseInt(AvroStreamReader::ReaderPos& data) { + uint64_t r = 0; + int nb = 0; + while (true) { + uint8_t c = (*data.BufferPtr)[data.Offset++]; + r = r | ((static_cast(c) & 0x7f) << (nb * 7)); + if (c & 0x80) { + ++nb; + continue; + } + break; + } + return static_cast(r >> 1) ^ -static_cast(r & 0x01); +} + +AvroSchema ParseSchemaFromJsonString(const std::string& jsonSchema) { + const static std::map BuiltinNameSchemaMap = { + {"string", AvroSchema::StringSchema}, {"bytes", AvroSchema::BytesSchema}, {"int", AvroSchema::IntSchema}, + {"long", AvroSchema::LongSchema}, {"float", AvroSchema::FloatSchema}, {"double", AvroSchema::DoubleSchema}, + {"boolean", AvroSchema::BoolSchema}, {"null", AvroSchema::NullSchema}, {"string", AvroSchema::StringSchema}, + }; + std::map nameSchemaMap = BuiltinNameSchemaMap; + + std::function parseSchemaFromJsonObject; + parseSchemaFromJsonObject = [&](const Core::Json::_internal::json& obj) -> AvroSchema { + if (obj.is_string()) { + auto typeName = obj.get(); + return nameSchemaMap.find(typeName)->second; + } else if (obj.is_array()) { + std::vector unionSchemas; + for (const auto& s : obj) { + unionSchemas.push_back(parseSchemaFromJsonObject(s)); + } + return AvroSchema::UnionSchema(std::move(unionSchemas)); + } else if (obj.is_object()) { + if (obj.count("namespace") != 0) { + throw std::runtime_error("Namespace isn't supported yet in Avro schema."); + } + if (obj.count("aliases") != 0) { + throw std::runtime_error("Alias isn't supported yet in Avro schema."); + } + auto typeName = obj["type"].get(); + auto i = nameSchemaMap.find(typeName); + if (i != nameSchemaMap.end()) { + return i->second; + } + if (typeName == "record") { + std::vector> fieldsSchema; + for (const auto& field : obj["fields"]) { + fieldsSchema.push_back( + std::make_pair(field["name"].get(), parseSchemaFromJsonObject(field["type"]))); + } + + const std::string recordName = obj["name"].get(); + auto recordSchema = AvroSchema::RecordSchema(recordName, std::move(fieldsSchema)); + nameSchemaMap.insert(std::make_pair(recordName, recordSchema)); + return recordSchema; + } else if (typeName == "enum") { + throw std::runtime_error("Enum type isn't supported yet in Avro schema."); + } else if (typeName == "array") { + return AvroSchema::ArraySchema(parseSchemaFromJsonObject(obj["items"])); + } else if (typeName == "map") { + return AvroSchema::MapSchema(parseSchemaFromJsonObject(obj["items"])); + } else if (typeName == "fixed") { + const std::string fixedName = obj["name"].get(); + auto fixedSchema = AvroSchema::FixedSchema(fixedName, obj["size"].get()); + nameSchemaMap.insert(std::make_pair(fixedName, fixedSchema)); + return fixedSchema; + } else { + throw std::runtime_error("Unrecognized type " + typeName + " in Avro schema."); + } + } + AZURE_UNREACHABLE_CODE(); + }; + + auto jsonRoot = Core::Json::_internal::json::parse(jsonSchema.begin(), jsonSchema.end()); + return parseSchemaFromJsonObject(jsonRoot); +} +} // namespace + +int64_t AvroStreamReader::ParseInt(const Core::Context& context) { + uint64_t r = 0; + int nb = 0; + while (true) { + Preload(1, context); + uint8_t c = m_streambuffer[m_pos.Offset++]; + + r = r | ((static_cast(c) & 0x7f) << (nb * 7)); + if (c & 0x80) { + ++nb; + continue; + } + break; + } + return static_cast(r >> 1) ^ -static_cast(r & 0x01); +} + +void AvroStreamReader::Advance(size_t n, const Core::Context& context) { + Preload(n, context); + m_pos.Offset += n; +} + +size_t AvroStreamReader::Preload(size_t n, const Core::Context& context) { + size_t oldAvailable = AvailableBytes(); + while (true) { + size_t newAvailable = TryPreload(n, context); + if (newAvailable >= n) { + return newAvailable; + } + if (oldAvailable == newAvailable) { + throw std::runtime_error("Unexpected EOF of Avro stream."); + } + oldAvailable = newAvailable; + } + AZURE_UNREACHABLE_CODE(); +} + +size_t AvroStreamReader::TryPreload(size_t n, const Core::Context& context) { + size_t availableBytes = AvailableBytes(); + if (availableBytes >= n) { + return availableBytes; + } + const size_t MinRead = 4096; + size_t tryReadSize = (std::max)(n, MinRead); + size_t currSize = m_streambuffer.size(); + m_streambuffer.resize(m_streambuffer.size() + tryReadSize); + size_t actualReadSize = m_stream->Read(m_streambuffer.data() + currSize, tryReadSize, context); + m_streambuffer.resize(currSize + actualReadSize); + return AvailableBytes(); +} + +void AvroStreamReader::Discard() { + constexpr size_t MinimumReleaseMemory = 128 * 1024; + if (m_pos.Offset < MinimumReleaseMemory) { + return; + } + const size_t availableBytes = AvailableBytes(); + std::memmove(&m_streambuffer[0], &m_streambuffer[m_pos.Offset], availableBytes); + m_streambuffer.resize(availableBytes); + m_pos.Offset = 0; +} + +const AvroSchema AvroSchema::StringSchema(AvroDatumType::String); +const AvroSchema AvroSchema::BytesSchema(AvroDatumType::Bytes); +const AvroSchema AvroSchema::IntSchema(AvroDatumType::Int); +const AvroSchema AvroSchema::LongSchema(AvroDatumType::Long); +const AvroSchema AvroSchema::FloatSchema(AvroDatumType::Float); +const AvroSchema AvroSchema::DoubleSchema(AvroDatumType::Double); +const AvroSchema AvroSchema::BoolSchema(AvroDatumType::Bool); +const AvroSchema AvroSchema::NullSchema(AvroDatumType::Null); + +AvroSchema AvroSchema::RecordSchema(std::string name, + const std::vector>& fieldsSchema) { + AvroSchema recordSchema(AvroDatumType::Record); + recordSchema.m_name = std::move(name); + recordSchema.m_status = std::make_shared(); + for (auto& i : fieldsSchema) { + recordSchema.m_status->m_keys.push_back(i.first); + recordSchema.m_status->m_schemas.push_back(i.second); + } + return recordSchema; +} + +AvroSchema AvroSchema::ArraySchema(AvroSchema elementSchema) { + AvroSchema arraySchema(AvroDatumType::Array); + arraySchema.m_status = std::make_shared(); + arraySchema.m_status->m_schemas.push_back(std::move(elementSchema)); + return arraySchema; +} + +AvroSchema AvroSchema::MapSchema(AvroSchema elementSchema) { + AvroSchema mapSchema(AvroDatumType::Map); + mapSchema.m_status = std::make_shared(); + mapSchema.m_status->m_schemas.push_back(std::move(elementSchema)); + return mapSchema; +} + +AvroSchema AvroSchema::UnionSchema(std::vector schemas) { + AvroSchema unionSchema(AvroDatumType::Union); + unionSchema.m_status = std::make_shared(); + unionSchema.m_status->m_schemas = std::move(schemas); + return unionSchema; +} + +AvroSchema AvroSchema::FixedSchema(std::string name, int64_t size) { + AvroSchema fixedSchema(AvroDatumType::Fixed); + fixedSchema.m_name = std::move(name); + fixedSchema.m_status = std::make_shared(); + fixedSchema.m_status->m_size = size; + return fixedSchema; +} + +void AvroDatum::Fill(AvroStreamReader& reader, const Core::Context& context) { + m_data = reader.m_pos; + if (m_schema.Type() == AvroDatumType::String || m_schema.Type() == AvroDatumType::Bytes) { + int64_t stringSize = reader.ParseInt(context); + reader.Advance(static_cast(stringSize), context); + } else if (m_schema.Type() == AvroDatumType::Int || m_schema.Type() == AvroDatumType::Long || + m_schema.Type() == AvroDatumType::Enum) { + reader.ParseInt(context); + } else if (m_schema.Type() == AvroDatumType::Float) { + reader.Advance(4, context); + } else if (m_schema.Type() == AvroDatumType::Double) { + reader.Advance(8, context); + } else if (m_schema.Type() == AvroDatumType::Bool) { + reader.Advance(1, context); + } else if (m_schema.Type() == AvroDatumType::Null) { + reader.Advance(0, context); + } else if (m_schema.Type() == AvroDatumType::Record) { + for (const auto& s : m_schema.FieldSchemas()) { + AvroDatum(s).Fill(reader, context); + } + } else if (m_schema.Type() == AvroDatumType::Array) { + while (true) { + int64_t numElementsInBlock = reader.ParseInt(context); + if (numElementsInBlock == 0) { + break; + } else if (numElementsInBlock < 0) { + int64_t blockSize = reader.ParseInt(context); + reader.Advance(static_cast(blockSize), context); + } else { + for (auto i = 0; i < numElementsInBlock; ++i) { + AvroDatum(m_schema.ItemSchema()).Fill(reader, context); + } + } + } + } else if (m_schema.Type() == AvroDatumType::Map) { + while (true) { + int64_t numElementsInBlock = reader.ParseInt(context); + if (numElementsInBlock == 0) { + break; + } else if (numElementsInBlock < 0) { + int64_t blockSize = reader.ParseInt(context); + reader.Advance(static_cast(blockSize), context); + } else { + for (int64_t i = 0; i < numElementsInBlock; ++i) { + AvroDatum(AvroSchema::StringSchema).Fill(reader, context); + AvroDatum(m_schema.ItemSchema()).Fill(reader, context); + } + } + } + } else if (m_schema.Type() == AvroDatumType::Union) { + int64_t i = reader.ParseInt(context); + AvroDatum(m_schema.FieldSchemas()[static_cast(i)]).Fill(reader, context); + } else if (m_schema.Type() == AvroDatumType::Fixed) { + reader.Advance(m_schema.Size(), context); + } else { + AZURE_UNREACHABLE_CODE(); + } +} + +void AvroDatum::Fill(AvroStreamReader::ReaderPos& data) { + m_data = data; + if (m_schema.Type() == AvroDatumType::String || m_schema.Type() == AvroDatumType::Bytes) { + int64_t stringSize = parseInt(data); + data.Offset += static_cast(stringSize); + } else if (m_schema.Type() == AvroDatumType::Int || m_schema.Type() == AvroDatumType::Long || + m_schema.Type() == AvroDatumType::Enum) { + parseInt(data); + } else if (m_schema.Type() == AvroDatumType::Float) { + data.Offset += 4; + } else if (m_schema.Type() == AvroDatumType::Double) { + data.Offset += 8; + } else if (m_schema.Type() == AvroDatumType::Bool) { + data.Offset += 1; + } else if (m_schema.Type() == AvroDatumType::Null) { + data.Offset += 0; + } else if (m_schema.Type() == AvroDatumType::Record) { + for (const auto& s : m_schema.FieldSchemas()) { + AvroDatum(s).Fill(data); + } + } else if (m_schema.Type() == AvroDatumType::Array) { + while (true) { + int64_t numElementsInBlock = parseInt(data); + if (numElementsInBlock == 0) { + break; + } else if (numElementsInBlock < 0) { + int64_t blockSize = parseInt(data); + data.Offset += static_cast(blockSize); + } else { + for (auto i = 0; i < numElementsInBlock; ++i) { + AvroDatum(m_schema.ItemSchema()).Fill(data); + } + } + } + } else if (m_schema.Type() == AvroDatumType::Map) { + while (true) { + int64_t numElementsInBlock = parseInt(data); + if (numElementsInBlock == 0) { + break; + } else if (numElementsInBlock < 0) { + int64_t blockSize = parseInt(data); + data.Offset += static_cast(blockSize); + } else { + for (int64_t i = 0; i < numElementsInBlock; ++i) { + AvroDatum(AvroSchema::StringSchema).Fill(data); + AvroDatum(m_schema.ItemSchema()).Fill(data); + } + } + } + } else if (m_schema.Type() == AvroDatumType::Union) { + int64_t i = parseInt(data); + AvroDatum(m_schema.FieldSchemas()[static_cast(i)]).Fill(data); + } else if (m_schema.Type() == AvroDatumType::Fixed) { + data.Offset += m_schema.Size(); + } else { + AZURE_UNREACHABLE_CODE(); + } +} + +template <> +AvroDatum::StringView AvroDatum::Value() const { + auto data = m_data; + if (m_schema.Type() == AvroDatumType::String || m_schema.Type() == AvroDatumType::Bytes) { + const int64_t length = parseInt(data); + const uint8_t* start = &(*data.BufferPtr)[data.Offset]; + StringView ret{start, static_cast(length)}; + data.Offset += static_cast(length); + return ret; + } + if (m_schema.Type() == AvroDatumType::Fixed) { + const size_t fixedSize = m_schema.Size(); + const uint8_t* start = &(*data.BufferPtr)[data.Offset]; + StringView ret{start, fixedSize}; + data.Offset += fixedSize; + return ret; + } + AZURE_UNREACHABLE_CODE(); +} + +template <> +std::string AvroDatum::Value() const { + auto stringView = Value(); + return std::string(stringView.Data, stringView.Data + stringView.Length); +} + +template <> +std::vector AvroDatum::Value() const { + auto stringView = Value(); + return std::vector(stringView.Data, stringView.Data + stringView.Length); +} + +template <> +int64_t AvroDatum::Value() const { + auto data = m_data; + return parseInt(data); +} + +template <> +int32_t AvroDatum::Value() const { + return static_cast(Value()); +} + +template <> +bool AvroDatum::Value() const { + return Value(); +} + +template <> +std::nullptr_t AvroDatum::Value() const { + return nullptr; +} + +template <> +AvroRecord AvroDatum::Value() const { + auto data = m_data; + + AvroRecord r; + r.m_keys = &m_schema.FieldNames(); + for (const auto& schema : m_schema.FieldSchemas()) { + auto datum = AvroDatum(schema); + datum.Fill(data); + r.m_values.push_back(std::move(datum)); + } + + return r; +} + +template <> +AvroMap AvroDatum::Value() const { + auto data = m_data; + + AvroMap m; + while (true) { + int64_t numElementsInBlock = parseInt(data); + if (numElementsInBlock == 0) { + break; + } + if (numElementsInBlock < 0) { + numElementsInBlock = -numElementsInBlock; + parseInt(data); + } + for (int64_t i = 0; i < numElementsInBlock; ++i) { + auto keyDatum = AvroDatum(AvroSchema::StringSchema); + keyDatum.Fill(data); + auto valueDatum = AvroDatum(m_schema.ItemSchema()); + valueDatum.Fill(data); + m[keyDatum.Value()] = valueDatum; + } + } + return m; +} + +template <> +AvroDatum AvroDatum::Value() const { + auto data = m_data; + if (m_schema.Type() == AvroDatumType::Union) { + int64_t i = parseInt(data); + auto datum = AvroDatum(m_schema.FieldSchemas()[static_cast(i)]); + datum.Fill(data); + return datum; + } + AZURE_UNREACHABLE_CODE(); +} + +AvroObjectContainerReader::AvroObjectContainerReader(Core::IO::BodyStream& stream) + : m_reader(std::make_unique(stream)) {} + +AvroDatum AvroObjectContainerReader::NextImpl(const AvroSchema* schema, const Core::Context& context) { + AZURE_ASSERT_FALSE(m_eof); + static const auto SyncMarkerSchema = AvroSchema::FixedSchema("Sync", 16); + if (!schema) { + static AvroSchema FileHeaderSchema = []() { + std::vector> fieldsSchema; + fieldsSchema.push_back(std::make_pair("magic", AvroSchema::FixedSchema("Magic", 4))); + fieldsSchema.push_back(std::make_pair("meta", AvroSchema::MapSchema(AvroSchema::BytesSchema))); + fieldsSchema.push_back(std::make_pair("sync", SyncMarkerSchema)); + return AvroSchema::RecordSchema("org.apache.avro.file.Header", std::move(fieldsSchema)); + }(); + auto fileHeaderDatum = AvroDatum(FileHeaderSchema); + fileHeaderDatum.Fill(*m_reader, context); + auto fileHeader = fileHeaderDatum.Value(); + if (fileHeader.Field("magic").Value() != "Obj\01") { + throw std::runtime_error("Invalid Avro object container magic."); + } + AvroMap meta = fileHeader.Field("meta").Value(); + std::string objectSchemaJson = meta["avro.schema"].Value(); + std::string codec = "null"; + if (meta.count("avro.codec") != 0) { + codec = meta["avro.codec"].Value(); + } + if (codec != "null") { + throw std::runtime_error("Unsupported Avro codec: " + codec); + } + m_syncMarker = fileHeader.Field("sync").Value(); + m_objectSchema = std::make_unique(ParseSchemaFromJsonString(objectSchemaJson)); + schema = m_objectSchema.get(); + } + + if (m_remainingObjectInCurrentBlock == 0) { + m_reader->Discard(); + m_remainingObjectInCurrentBlock = m_reader->ParseInt(context); + int64_t ObjectsSize = m_reader->ParseInt(context); + m_reader->Preload(static_cast(ObjectsSize), context); + } + + auto objectDatum = AvroDatum(*m_objectSchema); + objectDatum.Fill(*m_reader, context); + if (--m_remainingObjectInCurrentBlock == 0) { + auto markerDatum = AvroDatum(SyncMarkerSchema); + markerDatum.Fill(*m_reader, context); + auto marker = markerDatum.Value(); + if (marker != m_syncMarker) { + throw std::runtime_error("Sync marker doesn't match."); + } + m_eof = m_reader->TryPreload(1, context) == 0; + } + return objectDatum; +} + +size_t AvroStreamParser::OnRead(uint8_t* buffer, size_t count, Azure::Core::Context const& context) { + if (m_parserBuffer.Length != 0) { + size_t bytesToCopy = (std::min)(m_parserBuffer.Length, count); + std::memcpy(buffer, m_parserBuffer.Data, bytesToCopy); + m_parserBuffer.Data += bytesToCopy; + m_parserBuffer.Length -= bytesToCopy; + return bytesToCopy; + } + while (!m_parser.End()) { + auto datum = m_parser.Next(context); + if (datum.Schema().Type() == AvroDatumType::Union) { + datum = datum.Value(); + } + if (datum.Schema().Type() != AvroDatumType::Record) { + continue; + } + if (datum.Schema().Name() == "com.microsoft.azure.storage.queryBlobContents.resultData") { + auto record = datum.Value(); + auto dataDatum = record.Field("data"); + m_parserBuffer = dataDatum.Value(); + return OnRead(buffer, count, context); + } + if (datum.Schema().Name() == "com.microsoft.azure.storage.queryBlobContents.progress" && m_progressCallback) { + auto record = datum.Value(); + auto bytesScanned = record.Field("bytesScanned").Value(); + auto totalBytes = record.Field("totalBytes").Value(); + m_progressCallback(bytesScanned, totalBytes); + } + if (datum.Schema().Name() == "com.microsoft.azure.storage.queryBlobContents.error" && m_errorCallback) { + auto record = datum.Value(); + BlobQueryError e; + e.Name = record.Field("name").Value(); + e.Description = record.Field("description").Value(); + e.IsFatal = record.Field("fatal").Value(); + e.Position = record.Field("position").Value(); + m_errorCallback(std::move(e)); + } + } + return 0; +} +} // namespace _detail +} // namespace Blobs +} // namespace Storage +} // namespace Azure + +#endif diff --git a/source/libs/azure/src/td_block_blob_client.cpp b/source/libs/azure/src/td_block_blob_client.cpp new file mode 100644 index 0000000000..33ac774d0c --- /dev/null +++ b/source/libs/azure/src/td_block_blob_client.cpp @@ -0,0 +1,625 @@ +#if defined(USE_S3) + +#include "td_block_blob_client.hpp" + +#include + +#if defined(AZ_PLATFORM_WINDOWS) +#if !defined(WIN32_LEAN_AND_MEAN) +#define WIN32_LEAN_AND_MEAN +#endif +#if !defined(NOMINMAX) +#define NOMINMAX +#endif +#include +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Azure { +namespace Storage { +namespace Blobs { + +TDBlockBlobClient TDBlockBlobClient::CreateFromConnectionString(const std::string& connectionString, + const std::string& blobContainerName, + const std::string& blobName, + const BlobClientOptions& options) { + TDBlockBlobClient newClient( + BlobClient::CreateFromConnectionString(connectionString, blobContainerName, blobName, options)); + return newClient; +} + +TDBlockBlobClient::TDBlockBlobClient(const std::string& blobUrl, std::shared_ptr credential, + const BlobClientOptions& options) + : BlobClient(blobUrl, std::move(credential), options) {} + +TDBlockBlobClient::TDBlockBlobClient(const std::string& blobUrl, + std::shared_ptr credential, + const BlobClientOptions& options) + : BlobClient(blobUrl, std::move(credential), options) {} + +TDBlockBlobClient::TDBlockBlobClient(const std::string& blobUrl, const BlobClientOptions& options) + : BlobClient(blobUrl, options) {} + +TDBlockBlobClient::TDBlockBlobClient(BlobClient blobClient) : BlobClient(std::move(blobClient)) {} + +TDBlockBlobClient TDBlockBlobClient::WithSnapshot(const std::string& snapshot) const { + TDBlockBlobClient newClient(*this); + if (snapshot.empty()) { + newClient.m_blobUrl.RemoveQueryParameter(_internal::HttpQuerySnapshot); + } else { + newClient.m_blobUrl.AppendQueryParameter(_internal::HttpQuerySnapshot, + _internal::UrlEncodeQueryParameter(snapshot)); + } + return newClient; +} + +TDBlockBlobClient TDBlockBlobClient::WithVersionId(const std::string& versionId) const { + TDBlockBlobClient newClient(*this); + if (versionId.empty()) { + newClient.m_blobUrl.RemoveQueryParameter(_internal::HttpQueryVersionId); + } else { + newClient.m_blobUrl.AppendQueryParameter(_internal::HttpQueryVersionId, + _internal::UrlEncodeQueryParameter(versionId)); + } + return newClient; +} + +Azure::Response TDBlockBlobClient::Upload(Azure::Core::IO::BodyStream& content, + const UploadBlockBlobOptions& options, + const Azure::Core::Context& context) const { + _detail::BlockBlobClient::UploadBlockBlobOptions protocolLayerOptions; + if (options.TransactionalContentHash.HasValue()) { + if (options.TransactionalContentHash.Value().Algorithm == HashAlgorithm::Md5) { + protocolLayerOptions.TransactionalContentMD5 = options.TransactionalContentHash.Value().Value; + } else if (options.TransactionalContentHash.Value().Algorithm == HashAlgorithm::Crc64) { + protocolLayerOptions.TransactionalContentCrc64 = options.TransactionalContentHash.Value().Value; + } + } + protocolLayerOptions.BlobContentType = options.HttpHeaders.ContentType; + protocolLayerOptions.BlobContentEncoding = options.HttpHeaders.ContentEncoding; + protocolLayerOptions.BlobContentLanguage = options.HttpHeaders.ContentLanguage; + protocolLayerOptions.BlobContentMD5 = options.HttpHeaders.ContentHash.Value; + protocolLayerOptions.BlobContentDisposition = options.HttpHeaders.ContentDisposition; + protocolLayerOptions.BlobCacheControl = options.HttpHeaders.CacheControl; + protocolLayerOptions.Metadata = std::map(options.Metadata.begin(), options.Metadata.end()); + protocolLayerOptions.BlobTagsString = _detail::TagsToString(options.Tags); + protocolLayerOptions.Tier = options.AccessTier; + protocolLayerOptions.LeaseId = options.AccessConditions.LeaseId; + protocolLayerOptions.IfModifiedSince = options.AccessConditions.IfModifiedSince; + protocolLayerOptions.IfUnmodifiedSince = options.AccessConditions.IfUnmodifiedSince; + protocolLayerOptions.IfMatch = options.AccessConditions.IfMatch; + protocolLayerOptions.IfNoneMatch = options.AccessConditions.IfNoneMatch; + protocolLayerOptions.IfTags = options.AccessConditions.TagConditions; + if (m_customerProvidedKey.HasValue()) { + protocolLayerOptions.EncryptionKey = m_customerProvidedKey.Value().Key; + protocolLayerOptions.EncryptionKeySha256 = m_customerProvidedKey.Value().KeyHash; + protocolLayerOptions.EncryptionAlgorithm = m_customerProvidedKey.Value().Algorithm.ToString(); + } + protocolLayerOptions.EncryptionScope = m_encryptionScope; + if (options.ImmutabilityPolicy.HasValue()) { + protocolLayerOptions.ImmutabilityPolicyExpiry = options.ImmutabilityPolicy.Value().ExpiresOn; + protocolLayerOptions.ImmutabilityPolicyMode = options.ImmutabilityPolicy.Value().PolicyMode; + } + protocolLayerOptions.LegalHold = options.HasLegalHold; + + return _detail::BlockBlobClient::Upload(*m_pipeline, m_blobUrl, content, protocolLayerOptions, context); +} + +Azure::Response TDBlockBlobClient::UploadFrom( + const uint8_t* buffer, size_t bufferSize, const UploadBlockBlobFromOptions& options, + const Azure::Core::Context& context) const { + constexpr int64_t DefaultStageBlockSize = 4 * 1024 * 1024ULL; + constexpr int64_t MaxStageBlockSize = 4000 * 1024 * 1024ULL; + constexpr int64_t MaxBlockNumber = 50000; + constexpr int64_t BlockGrainSize = 1 * 1024 * 1024; + + if (static_cast(options.TransferOptions.SingleUploadThreshold) > (std::numeric_limits::max)()) { + throw Azure::Core::RequestFailedException("Single upload threshold is too big"); + } + if (bufferSize <= static_cast(options.TransferOptions.SingleUploadThreshold)) { + Azure::Core::IO::MemoryBodyStream contentStream(buffer, bufferSize); + UploadBlockBlobOptions uploadBlockBlobOptions; + uploadBlockBlobOptions.HttpHeaders = options.HttpHeaders; + uploadBlockBlobOptions.Metadata = options.Metadata; + uploadBlockBlobOptions.Tags = options.Tags; + uploadBlockBlobOptions.AccessTier = options.AccessTier; + uploadBlockBlobOptions.ImmutabilityPolicy = options.ImmutabilityPolicy; + uploadBlockBlobOptions.HasLegalHold = options.HasLegalHold; + return Upload(contentStream, uploadBlockBlobOptions, context); + } + + int64_t chunkSize; + if (options.TransferOptions.ChunkSize.HasValue()) { + chunkSize = options.TransferOptions.ChunkSize.Value(); + } else { + int64_t minChunkSize = (bufferSize + MaxBlockNumber - 1) / MaxBlockNumber; + minChunkSize = (minChunkSize + BlockGrainSize - 1) / BlockGrainSize * BlockGrainSize; + chunkSize = (std::max)(DefaultStageBlockSize, minChunkSize); + } + if (chunkSize > MaxStageBlockSize) { + throw Azure::Core::RequestFailedException("Block size is too big."); + } + + std::vector blockIds; + auto getBlockId = [](int64_t id) { + constexpr size_t BlockIdLength = 64; + std::string blockId = std::to_string(id); + blockId = std::string(BlockIdLength - blockId.length(), '0') + blockId; + return Azure::Core::Convert::Base64Encode(std::vector(blockId.begin(), blockId.end())); + }; + + auto uploadBlockFunc = [&](int64_t offset, int64_t length, int64_t chunkId, int64_t numChunks) { + Azure::Core::IO::MemoryBodyStream contentStream(buffer + offset, static_cast(length)); + StageBlockOptions chunkOptions; + auto blockInfo = StageBlock(getBlockId(chunkId), contentStream, chunkOptions, context); + if (chunkId == numChunks - 1) { + blockIds.resize(static_cast(numChunks)); + } + }; + + _internal::ConcurrentTransfer(0, bufferSize, chunkSize, options.TransferOptions.Concurrency, uploadBlockFunc); + + for (size_t i = 0; i < blockIds.size(); ++i) { + blockIds[i] = getBlockId(static_cast(i)); + } + CommitBlockListOptions commitBlockListOptions; + commitBlockListOptions.HttpHeaders = options.HttpHeaders; + commitBlockListOptions.Metadata = options.Metadata; + commitBlockListOptions.Tags = options.Tags; + commitBlockListOptions.AccessTier = options.AccessTier; + commitBlockListOptions.ImmutabilityPolicy = options.ImmutabilityPolicy; + commitBlockListOptions.HasLegalHold = options.HasLegalHold; + auto commitBlockListResponse = CommitBlockList(blockIds, commitBlockListOptions, context); + + Models::UploadBlockBlobFromResult ret; + ret.ETag = std::move(commitBlockListResponse.Value.ETag); + ret.LastModified = std::move(commitBlockListResponse.Value.LastModified); + ret.VersionId = std::move(commitBlockListResponse.Value.VersionId); + ret.IsServerEncrypted = commitBlockListResponse.Value.IsServerEncrypted; + ret.EncryptionKeySha256 = std::move(commitBlockListResponse.Value.EncryptionKeySha256); + ret.EncryptionScope = std::move(commitBlockListResponse.Value.EncryptionScope); + return Azure::Response(std::move(ret), + std::move(commitBlockListResponse.RawResponse)); +} + +Azure::Response TDBlockBlobClient::UploadFrom( + const std::string& fileName, const UploadBlockBlobFromOptions& options, const Azure::Core::Context& context) const { + constexpr int64_t DefaultStageBlockSize = 4 * 1024 * 1024ULL; + constexpr int64_t MaxStageBlockSize = 4000 * 1024 * 1024ULL; + constexpr int64_t MaxBlockNumber = 50000; + constexpr int64_t BlockGrainSize = 1 * 1024 * 1024; + + { + Azure::Core::IO::FileBodyStream contentStream(fileName); + + if (contentStream.Length() <= options.TransferOptions.SingleUploadThreshold) { + UploadBlockBlobOptions uploadBlockBlobOptions; + uploadBlockBlobOptions.HttpHeaders = options.HttpHeaders; + uploadBlockBlobOptions.Metadata = options.Metadata; + uploadBlockBlobOptions.Tags = options.Tags; + uploadBlockBlobOptions.AccessTier = options.AccessTier; + uploadBlockBlobOptions.ImmutabilityPolicy = options.ImmutabilityPolicy; + uploadBlockBlobOptions.HasLegalHold = options.HasLegalHold; + return Upload(contentStream, uploadBlockBlobOptions, context); + } + } + + std::vector blockIds; + auto getBlockId = [](int64_t id) { + constexpr size_t BlockIdLength = 64; + std::string blockId = std::to_string(id); + blockId = std::string(BlockIdLength - blockId.length(), '0') + blockId; + return Azure::Core::Convert::Base64Encode(std::vector(blockId.begin(), blockId.end())); + }; + + _internal::FileReader fileReader(fileName); + + auto uploadBlockFunc = [&](int64_t offset, int64_t length, int64_t chunkId, int64_t numChunks) { + Azure::Core::IO::_internal::RandomAccessFileBodyStream contentStream(fileReader.GetHandle(), offset, length); + StageBlockOptions chunkOptions; + auto blockInfo = StageBlock(getBlockId(chunkId), contentStream, chunkOptions, context); + if (chunkId == numChunks - 1) { + blockIds.resize(static_cast(numChunks)); + } + }; + + int64_t chunkSize; + if (options.TransferOptions.ChunkSize.HasValue()) { + chunkSize = options.TransferOptions.ChunkSize.Value(); + } else { + int64_t minChunkSize = (fileReader.GetFileSize() + MaxBlockNumber - 1) / MaxBlockNumber; + minChunkSize = (minChunkSize + BlockGrainSize - 1) / BlockGrainSize * BlockGrainSize; + chunkSize = (std::max)(DefaultStageBlockSize, minChunkSize); + } + if (chunkSize > MaxStageBlockSize) { + throw Azure::Core::RequestFailedException("Block size is too big."); + } + + _internal::ConcurrentTransfer(0, fileReader.GetFileSize(), chunkSize, options.TransferOptions.Concurrency, + uploadBlockFunc); + + for (size_t i = 0; i < blockIds.size(); ++i) { + blockIds[i] = getBlockId(static_cast(i)); + } + CommitBlockListOptions commitBlockListOptions; + commitBlockListOptions.HttpHeaders = options.HttpHeaders; + commitBlockListOptions.Metadata = options.Metadata; + commitBlockListOptions.Tags = options.Tags; + commitBlockListOptions.AccessTier = options.AccessTier; + commitBlockListOptions.ImmutabilityPolicy = options.ImmutabilityPolicy; + commitBlockListOptions.HasLegalHold = options.HasLegalHold; + auto commitBlockListResponse = CommitBlockList(blockIds, commitBlockListOptions, context); + + Models::UploadBlockBlobFromResult result; + result.ETag = commitBlockListResponse.Value.ETag; + result.LastModified = commitBlockListResponse.Value.LastModified; + result.VersionId = commitBlockListResponse.Value.VersionId; + result.IsServerEncrypted = commitBlockListResponse.Value.IsServerEncrypted; + result.EncryptionKeySha256 = commitBlockListResponse.Value.EncryptionKeySha256; + result.EncryptionScope = commitBlockListResponse.Value.EncryptionScope; + return Azure::Response(std::move(result), + std::move(commitBlockListResponse.RawResponse)); +} + +Azure::Response TDBlockBlobClient::UploadFrom( + const std::string& fileName, int64_t offset, int64_t size, const UploadBlockBlobFromOptions& options, + const Azure::Core::Context& context) const { + _internal::FileReader fileReader(fileName); + + { + Azure::Core::IO::_internal::RandomAccessFileBodyStream contentStream(fileReader.GetHandle(), offset, size); + + if (size <= options.TransferOptions.SingleUploadThreshold) { + UploadBlockBlobOptions uploadBlockBlobOptions; + uploadBlockBlobOptions.HttpHeaders = options.HttpHeaders; + uploadBlockBlobOptions.Metadata = options.Metadata; + uploadBlockBlobOptions.Tags = options.Tags; + uploadBlockBlobOptions.AccessTier = options.AccessTier; + uploadBlockBlobOptions.ImmutabilityPolicy = options.ImmutabilityPolicy; + uploadBlockBlobOptions.HasLegalHold = options.HasLegalHold; + return Upload(contentStream, uploadBlockBlobOptions, context); + } + } + + std::vector blockIds; + auto getBlockId = [](int64_t id) { + constexpr size_t BlockIdLength = 64; + std::string blockId = std::to_string(id); + blockId = std::string(BlockIdLength - blockId.length(), '0') + blockId; + return Azure::Core::Convert::Base64Encode(std::vector(blockId.begin(), blockId.end())); + }; + + auto uploadBlockFunc = [&](int64_t offset, int64_t length, int64_t chunkId, int64_t numChunks) { + Azure::Core::IO::_internal::RandomAccessFileBodyStream contentStream(fileReader.GetHandle(), offset, length); + StageBlockOptions chunkOptions; + auto blockInfo = StageBlock(getBlockId(chunkId), contentStream, chunkOptions, context); + if (chunkId == numChunks - 1) { + blockIds.resize(static_cast(numChunks)); + } + }; + + constexpr int64_t DefaultStageBlockSize = 4 * 1024 * 1024ULL; + constexpr int64_t MaxStageBlockSize = 4000 * 1024 * 1024ULL; + constexpr int64_t MaxBlockNumber = 50000; + constexpr int64_t BlockGrainSize = 1 * 1024 * 1024; + + int64_t chunkSize; + if (options.TransferOptions.ChunkSize.HasValue()) { + chunkSize = options.TransferOptions.ChunkSize.Value(); + } else { + int64_t minChunkSize = (size + MaxBlockNumber - 1) / MaxBlockNumber; + minChunkSize = (minChunkSize + BlockGrainSize - 1) / BlockGrainSize * BlockGrainSize; + chunkSize = (std::max)(DefaultStageBlockSize, minChunkSize); + } + if (chunkSize > MaxStageBlockSize) { + throw Azure::Core::RequestFailedException("Block size is too big."); + } + + _internal::ConcurrentTransfer(offset, size, chunkSize, options.TransferOptions.Concurrency, uploadBlockFunc); + + for (size_t i = 0; i < blockIds.size(); ++i) { + blockIds[i] = getBlockId(static_cast(i)); + } + CommitBlockListOptions commitBlockListOptions; + commitBlockListOptions.HttpHeaders = options.HttpHeaders; + commitBlockListOptions.Metadata = options.Metadata; + commitBlockListOptions.Tags = options.Tags; + commitBlockListOptions.AccessTier = options.AccessTier; + commitBlockListOptions.ImmutabilityPolicy = options.ImmutabilityPolicy; + commitBlockListOptions.HasLegalHold = options.HasLegalHold; + auto commitBlockListResponse = CommitBlockList(blockIds, commitBlockListOptions, context); + + Models::UploadBlockBlobFromResult result; + result.ETag = commitBlockListResponse.Value.ETag; + result.LastModified = commitBlockListResponse.Value.LastModified; + result.VersionId = commitBlockListResponse.Value.VersionId; + result.IsServerEncrypted = commitBlockListResponse.Value.IsServerEncrypted; + result.EncryptionKeySha256 = commitBlockListResponse.Value.EncryptionKeySha256; + result.EncryptionScope = commitBlockListResponse.Value.EncryptionScope; + return Azure::Response(std::move(result), + std::move(commitBlockListResponse.RawResponse)); +} + +Azure::Response TDBlockBlobClient::UploadFromUri( + const std::string& sourceUri, const UploadBlockBlobFromUriOptions& options, + const Azure::Core::Context& context) const { + _detail::BlockBlobClient::UploadBlockBlobFromUriOptions protocolLayerOptions; + protocolLayerOptions.CopySource = sourceUri; + protocolLayerOptions.CopySourceBlobProperties = options.CopySourceBlobProperties; + protocolLayerOptions.BlobContentType = options.HttpHeaders.ContentType; + protocolLayerOptions.BlobContentEncoding = options.HttpHeaders.ContentEncoding; + protocolLayerOptions.BlobContentLanguage = options.HttpHeaders.ContentLanguage; + protocolLayerOptions.BlobContentMD5 = options.HttpHeaders.ContentHash.Value; + protocolLayerOptions.BlobCacheControl = options.HttpHeaders.CacheControl; + protocolLayerOptions.BlobContentDisposition = options.HttpHeaders.ContentDisposition; + protocolLayerOptions.Metadata = std::map(options.Metadata.begin(), options.Metadata.end()); + protocolLayerOptions.BlobTagsString = _detail::TagsToString(options.Tags); + protocolLayerOptions.Tier = options.AccessTier; + protocolLayerOptions.LeaseId = options.AccessConditions.LeaseId; + protocolLayerOptions.IfMatch = options.AccessConditions.IfMatch; + protocolLayerOptions.IfNoneMatch = options.AccessConditions.IfNoneMatch; + protocolLayerOptions.IfModifiedSince = options.AccessConditions.IfModifiedSince; + protocolLayerOptions.IfUnmodifiedSince = options.AccessConditions.IfUnmodifiedSince; + protocolLayerOptions.IfTags = options.AccessConditions.TagConditions; + protocolLayerOptions.SourceIfMatch = options.SourceAccessConditions.IfMatch; + protocolLayerOptions.SourceIfNoneMatch = options.SourceAccessConditions.IfNoneMatch; + protocolLayerOptions.SourceIfModifiedSince = options.SourceAccessConditions.IfModifiedSince; + protocolLayerOptions.SourceIfUnmodifiedSince = options.SourceAccessConditions.IfUnmodifiedSince; + protocolLayerOptions.SourceIfTags = options.SourceAccessConditions.TagConditions; + if (options.TransactionalContentHash.HasValue()) { + if (options.TransactionalContentHash.Value().Algorithm == HashAlgorithm::Md5) { + protocolLayerOptions.SourceContentMD5 = options.TransactionalContentHash.Value().Value; + } else if (options.TransactionalContentHash.Value().Algorithm == HashAlgorithm::Crc64) { + protocolLayerOptions.SourceContentcrc64 = options.TransactionalContentHash.Value().Value; + } + } + if (m_customerProvidedKey.HasValue()) { + protocolLayerOptions.EncryptionKey = m_customerProvidedKey.Value().Key; + protocolLayerOptions.EncryptionKeySha256 = m_customerProvidedKey.Value().KeyHash; + protocolLayerOptions.EncryptionAlgorithm = m_customerProvidedKey.Value().Algorithm.ToString(); + } + protocolLayerOptions.EncryptionScope = m_encryptionScope; + protocolLayerOptions.CopySourceTags = options.CopySourceTagsMode; + if (!options.SourceAuthorization.empty()) { + protocolLayerOptions.CopySourceAuthorization = options.SourceAuthorization; + } + + return _detail::BlockBlobClient::UploadFromUri(*m_pipeline, m_blobUrl, protocolLayerOptions, context); +} + +Azure::Response TDBlockBlobClient::StageBlock(const std::string& blockId, + Azure::Core::IO::BodyStream& content, + const StageBlockOptions& options, + const Azure::Core::Context& context) const { + _detail::BlockBlobClient::StageBlockBlobBlockOptions protocolLayerOptions; + protocolLayerOptions.BlockId = blockId; + if (options.TransactionalContentHash.HasValue()) { + if (options.TransactionalContentHash.Value().Algorithm == HashAlgorithm::Md5) { + protocolLayerOptions.TransactionalContentMD5 = options.TransactionalContentHash.Value().Value; + } else if (options.TransactionalContentHash.Value().Algorithm == HashAlgorithm::Crc64) { + protocolLayerOptions.TransactionalContentCrc64 = options.TransactionalContentHash.Value().Value; + } + } + protocolLayerOptions.LeaseId = options.AccessConditions.LeaseId; + if (m_customerProvidedKey.HasValue()) { + protocolLayerOptions.EncryptionKey = m_customerProvidedKey.Value().Key; + protocolLayerOptions.EncryptionKeySha256 = m_customerProvidedKey.Value().KeyHash; + protocolLayerOptions.EncryptionAlgorithm = m_customerProvidedKey.Value().Algorithm.ToString(); + } + protocolLayerOptions.EncryptionScope = m_encryptionScope; + return _detail::BlockBlobClient::StageBlock(*m_pipeline, m_blobUrl, content, protocolLayerOptions, context); +} + +Azure::Response TDBlockBlobClient::StageBlockFromUri( + const std::string& blockId, const std::string& sourceUri, const StageBlockFromUriOptions& options, + const Azure::Core::Context& context) const { + _detail::BlockBlobClient::StageBlockBlobBlockFromUriOptions protocolLayerOptions; + protocolLayerOptions.BlockId = blockId; + protocolLayerOptions.SourceUrl = sourceUri; + if (options.SourceRange.HasValue()) { + std::string rangeStr = "bytes=" + std::to_string(options.SourceRange.Value().Offset) + "-"; + if (options.SourceRange.Value().Length.HasValue()) { + rangeStr += std::to_string(options.SourceRange.Value().Offset + options.SourceRange.Value().Length.Value() - 1); + } + protocolLayerOptions.SourceRange = rangeStr; + } + if (options.TransactionalContentHash.HasValue()) { + if (options.TransactionalContentHash.Value().Algorithm == HashAlgorithm::Md5) { + protocolLayerOptions.SourceContentMD5 = options.TransactionalContentHash.Value().Value; + } else if (options.TransactionalContentHash.Value().Algorithm == HashAlgorithm::Crc64) { + protocolLayerOptions.SourceContentcrc64 = options.TransactionalContentHash.Value().Value; + } + } + protocolLayerOptions.LeaseId = options.AccessConditions.LeaseId; + protocolLayerOptions.SourceIfModifiedSince = options.SourceAccessConditions.IfModifiedSince; + protocolLayerOptions.SourceIfUnmodifiedSince = options.SourceAccessConditions.IfUnmodifiedSince; + protocolLayerOptions.SourceIfMatch = options.SourceAccessConditions.IfMatch; + protocolLayerOptions.SourceIfNoneMatch = options.SourceAccessConditions.IfNoneMatch; + if (m_customerProvidedKey.HasValue()) { + protocolLayerOptions.EncryptionKey = m_customerProvidedKey.Value().Key; + protocolLayerOptions.EncryptionKeySha256 = m_customerProvidedKey.Value().KeyHash; + protocolLayerOptions.EncryptionAlgorithm = m_customerProvidedKey.Value().Algorithm.ToString(); + } + protocolLayerOptions.EncryptionScope = m_encryptionScope; + if (!options.SourceAuthorization.empty()) { + protocolLayerOptions.CopySourceAuthorization = options.SourceAuthorization; + } + + return _detail::BlockBlobClient::StageBlockFromUri(*m_pipeline, m_blobUrl, protocolLayerOptions, context); +} + +Azure::Response TDBlockBlobClient::CommitBlockList( + const std::vector& blockIds, const CommitBlockListOptions& options, + const Azure::Core::Context& context) const { + _detail::BlockBlobClient::CommitBlockBlobBlockListOptions protocolLayerOptions; + protocolLayerOptions.Blocks.Latest = blockIds; + protocolLayerOptions.BlobContentType = options.HttpHeaders.ContentType; + protocolLayerOptions.BlobContentEncoding = options.HttpHeaders.ContentEncoding; + protocolLayerOptions.BlobContentLanguage = options.HttpHeaders.ContentLanguage; + protocolLayerOptions.BlobContentMD5 = options.HttpHeaders.ContentHash.Value; + protocolLayerOptions.BlobContentDisposition = options.HttpHeaders.ContentDisposition; + protocolLayerOptions.BlobCacheControl = options.HttpHeaders.CacheControl; + protocolLayerOptions.Metadata = std::map(options.Metadata.begin(), options.Metadata.end()); + protocolLayerOptions.BlobTagsString = _detail::TagsToString(options.Tags); + protocolLayerOptions.Tier = options.AccessTier; + protocolLayerOptions.LeaseId = options.AccessConditions.LeaseId; + protocolLayerOptions.IfModifiedSince = options.AccessConditions.IfModifiedSince; + protocolLayerOptions.IfUnmodifiedSince = options.AccessConditions.IfUnmodifiedSince; + protocolLayerOptions.IfMatch = options.AccessConditions.IfMatch; + protocolLayerOptions.IfNoneMatch = options.AccessConditions.IfNoneMatch; + protocolLayerOptions.IfTags = options.AccessConditions.TagConditions; + if (m_customerProvidedKey.HasValue()) { + protocolLayerOptions.EncryptionKey = m_customerProvidedKey.Value().Key; + protocolLayerOptions.EncryptionKeySha256 = m_customerProvidedKey.Value().KeyHash; + protocolLayerOptions.EncryptionAlgorithm = m_customerProvidedKey.Value().Algorithm.ToString(); + } + protocolLayerOptions.EncryptionScope = m_encryptionScope; + if (options.ImmutabilityPolicy.HasValue()) { + protocolLayerOptions.ImmutabilityPolicyExpiry = options.ImmutabilityPolicy.Value().ExpiresOn; + protocolLayerOptions.ImmutabilityPolicyMode = options.ImmutabilityPolicy.Value().PolicyMode; + } + protocolLayerOptions.LegalHold = options.HasLegalHold; + + return _detail::BlockBlobClient::CommitBlockList(*m_pipeline, m_blobUrl, protocolLayerOptions, context); +} + +Azure::Response TDBlockBlobClient::GetBlockList(const GetBlockListOptions& options, + const Azure::Core::Context& context) const { + _detail::BlockBlobClient::GetBlockBlobBlockListOptions protocolLayerOptions; + protocolLayerOptions.ListType = options.ListType; + protocolLayerOptions.LeaseId = options.AccessConditions.LeaseId; + protocolLayerOptions.IfTags = options.AccessConditions.TagConditions; + return _detail::BlockBlobClient::GetBlockList(*m_pipeline, m_blobUrl, protocolLayerOptions, + _internal::WithReplicaStatus(context)); +} +/* +Azure::Response TDBlockBlobClient::Query(const std::string& querySqlExpression, + const QueryBlobOptions& options, + const Azure::Core::Context& context) const { +_detail::BlobClient::QueryBlobOptions protocolLayerOptions; +protocolLayerOptions.QueryRequest.QueryType = Models::_detail::QueryRequestQueryType::SQL; +protocolLayerOptions.QueryRequest.Expression = querySqlExpression; +if (options.InputTextConfiguration.m_format == Models::_detail::QueryFormatType::Delimited) { + Models::_detail::DelimitedTextConfiguration c; + c.RecordSeparator = options.InputTextConfiguration.m_recordSeparator; + c.ColumnSeparator = options.InputTextConfiguration.m_columnSeparator; + c.FieldQuote = options.InputTextConfiguration.m_quotationCharacter; + c.EscapeChar = options.InputTextConfiguration.m_escapeCharacter; + c.HeadersPresent = options.InputTextConfiguration.m_hasHeaders; + Models::_detail::QuerySerialization q; + q.Format.Type = options.InputTextConfiguration.m_format; + q.Format.DelimitedTextConfiguration = std::move(c); + protocolLayerOptions.QueryRequest.InputSerialization = std::move(q); +} else if (options.InputTextConfiguration.m_format == Models::_detail::QueryFormatType::Json) { + Models::_detail::JsonTextConfiguration c; + c.RecordSeparator = options.InputTextConfiguration.m_recordSeparator; + Models::_detail::QuerySerialization q; + q.Format.Type = options.InputTextConfiguration.m_format; + q.Format.JsonTextConfiguration = std::move(c); + protocolLayerOptions.QueryRequest.InputSerialization = std::move(q); +} else if (options.InputTextConfiguration.m_format == Models::_detail::QueryFormatType::Parquet) { + Models::_detail::ParquetConfiguration c; + Models::_detail::QuerySerialization q; + q.Format.Type = options.InputTextConfiguration.m_format; + q.Format.ParquetTextConfiguration = std::move(c); + protocolLayerOptions.QueryRequest.InputSerialization = std::move(q); +} else if (options.InputTextConfiguration.m_format.ToString().empty()) { +} else { + AZURE_UNREACHABLE_CODE(); +} +if (options.OutputTextConfiguration.m_format == Models::_detail::QueryFormatType::Delimited) { + Models::_detail::DelimitedTextConfiguration c; + c.RecordSeparator = options.OutputTextConfiguration.m_recordSeparator; + c.ColumnSeparator = options.OutputTextConfiguration.m_columnSeparator; + c.FieldQuote = options.OutputTextConfiguration.m_quotationCharacter; + c.EscapeChar = options.OutputTextConfiguration.m_escapeCharacter; + c.HeadersPresent = options.OutputTextConfiguration.m_hasHeaders; + Models::_detail::QuerySerialization q; + q.Format.Type = options.OutputTextConfiguration.m_format; + q.Format.DelimitedTextConfiguration = std::move(c); + protocolLayerOptions.QueryRequest.OutputSerialization = std::move(q); +} else if (options.OutputTextConfiguration.m_format == Models::_detail::QueryFormatType::Json) { + Models::_detail::JsonTextConfiguration c; + c.RecordSeparator = options.OutputTextConfiguration.m_recordSeparator; + Models::_detail::QuerySerialization q; + q.Format.Type = options.OutputTextConfiguration.m_format; + q.Format.JsonTextConfiguration = std::move(c); + protocolLayerOptions.QueryRequest.OutputSerialization = std::move(q); +} else if (options.OutputTextConfiguration.m_format == Models::_detail::QueryFormatType::Parquet) { + Models::_detail::ParquetConfiguration c; + Models::_detail::QuerySerialization q; + q.Format.Type = options.OutputTextConfiguration.m_format; + q.Format.ParquetTextConfiguration = std::move(c); + protocolLayerOptions.QueryRequest.OutputSerialization = std::move(q); +} else if (options.OutputTextConfiguration.m_format == Models::_detail::QueryFormatType::Arrow) { + Models::_detail::ArrowConfiguration c; + c.Schema = options.OutputTextConfiguration.m_schema; + Models::_detail::QuerySerialization q; + q.Format.Type = options.OutputTextConfiguration.m_format; + q.Format.ArrowConfiguration = std::move(c); + protocolLayerOptions.QueryRequest.OutputSerialization = std::move(q); +} else if (options.InputTextConfiguration.m_format.ToString().empty()) { +} else { + AZURE_UNREACHABLE_CODE(); +} + +protocolLayerOptions.LeaseId = options.AccessConditions.LeaseId; +if (m_customerProvidedKey.HasValue()) { + protocolLayerOptions.EncryptionKey = m_customerProvidedKey.Value().Key; + protocolLayerOptions.EncryptionKeySha256 = m_customerProvidedKey.Value().KeyHash; + protocolLayerOptions.EncryptionAlgorithm = m_customerProvidedKey.Value().Algorithm.ToString(); +} +protocolLayerOptions.EncryptionScope = m_encryptionScope; +protocolLayerOptions.IfModifiedSince = options.AccessConditions.IfModifiedSince; +protocolLayerOptions.IfUnmodifiedSince = options.AccessConditions.IfUnmodifiedSince; +protocolLayerOptions.IfMatch = options.AccessConditions.IfMatch; +protocolLayerOptions.IfNoneMatch = options.AccessConditions.IfNoneMatch; +protocolLayerOptions.IfTags = options.AccessConditions.TagConditions; +auto response = + _detail::BlobClient::Query(*m_pipeline, m_blobUrl, protocolLayerOptions, _internal::WithReplicaStatus(context)); + +const auto statusCode = response.RawResponse->GetStatusCode(); +const auto reasonPhrase = response.RawResponse->GetReasonPhrase(); +const auto requestId = response.RawResponse->GetHeaders().count(_internal::HttpHeaderRequestId) != 0 + ? response.RawResponse->GetHeaders().at(_internal::HttpHeaderRequestId) + : std::string(); + +const auto clientRequestId = response.RawResponse->GetHeaders().count(_internal::HttpHeaderClientRequestId) != 0 + ? response.RawResponse->GetHeaders().at(_internal::HttpHeaderClientRequestId) + : std::string(); + +auto defaultErrorHandler = [statusCode, reasonPhrase, requestId, clientRequestId](BlobQueryError e) { + if (e.IsFatal) { + StorageException exception("Fatal " + e.Name + " at " + std::to_string(e.Position)); + exception.StatusCode = statusCode; + exception.ReasonPhrase = reasonPhrase; + exception.RequestId = requestId; + exception.ClientRequestId = clientRequestId; + exception.ErrorCode = e.Name; + exception.Message = e.Description; + + throw exception; + } +}; + +response.Value.BodyStream = + std::make_unique<_detail::AvroStreamParser>(std::move(response.Value.BodyStream), options.ProgressHandler, + options.ErrorHandler ? options.ErrorHandler : defaultErrorHandler); +return response; +} +*/ +} // namespace Blobs +} // namespace Storage +} // namespace Azure + +#endif diff --git a/source/libs/azure/test/CMakeLists.txt b/source/libs/azure/test/CMakeLists.txt new file mode 100644 index 0000000000..f00257f228 --- /dev/null +++ b/source/libs/azure/test/CMakeLists.txt @@ -0,0 +1,20 @@ +if(TD_LINUX) + aux_source_directory(. AZ_TEST_SRC) + + add_executable(azTest ${AZ_TEST_SRC}) + target_include_directories(azTest + PUBLIC + "${TD_SOURCE_DIR}/include/libs/azure" + "${CMAKE_CURRENT_SOURCE_DIR}/../inc" + ) + + target_link_libraries(azTest + az + gtest_main + ) + enable_testing() + add_test( + NAME az_test + COMMAND azTest + ) +endif(TD_LINUX) diff --git a/source/libs/azure/test/azTest.cpp b/source/libs/azure/test/azTest.cpp new file mode 100644 index 0000000000..0459cb5f6a --- /dev/null +++ b/source/libs/azure/test/azTest.cpp @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * 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. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include + +#include "az.h" + +extern int8_t tsS3Enabled; + +int32_t azInitEnv() { + int32_t code = 0; + + extern int8_t tsS3EpNum; + + extern char tsS3Hostname[][TSDB_FQDN_LEN]; + extern char tsS3AccessKeyId[][TSDB_FQDN_LEN]; + extern char tsS3AccessKeySecret[][TSDB_FQDN_LEN]; + extern char tsS3BucketName[TSDB_FQDN_LEN]; + + /* TCS parameter format + tsS3Hostname[0] = "/.blob.core.windows.net"; + tsS3AccessKeyId[0] = ""; + tsS3AccessKeySecret[0] = ""; + tsS3BucketName = ""; + */ + + const char *hostname = "/.blob.core.windows.net"; + const char *accessKeyId = ""; + const char *accessKeySecret = ""; + const char *bucketName = ""; + + if (hostname[0] != '<') { + tstrncpy(&tsS3Hostname[0][0], hostname, TSDB_FQDN_LEN); + tstrncpy(&tsS3AccessKeyId[0][0], accessKeyId, TSDB_FQDN_LEN); + tstrncpy(&tsS3AccessKeySecret[0][0], accessKeySecret, TSDB_FQDN_LEN); + tstrncpy(tsS3BucketName, bucketName, TSDB_FQDN_LEN); + } else { + const char *accountId = getenv("ablob_account_id"); + if (!accountId) { + return -1; + } + + const char *accountSecret = getenv("ablob_account_secret"); + if (!accountSecret) { + return -1; + } + + const char *containerName = getenv("ablob_container"); + if (!containerName) { + return -1; + } + + TAOS_STRCPY(&tsS3Hostname[0][0], accountId); + TAOS_STRCAT(&tsS3Hostname[0][0], ".blob.core.windows.net"); + TAOS_STRCPY(&tsS3AccessKeyId[0][0], accountId); + TAOS_STRCPY(&tsS3AccessKeySecret[0][0], accountSecret); + TAOS_STRCPY(tsS3BucketName, containerName); + } + + tstrncpy(tsTempDir, "/tmp/", PATH_MAX); + + tsS3Enabled = true; + + return code; +} + +// TEST(AzTest, DISABLED_InterfaceTest) { +TEST(AzTest, InterfaceTest) { + int code = 0; + bool check = false; + bool withcp = false; + + code = azInitEnv(); + if (code) { + std::cout << "ablob env init failed with: " << code << std::endl; + return; + } + + GTEST_ASSERT_EQ(code, 0); + GTEST_ASSERT_EQ(tsS3Enabled, 1); + + code = azBegin(); + GTEST_ASSERT_EQ(code, 0); + + code = azCheckCfg(); + GTEST_ASSERT_EQ(code, 0); + const int size = 4096; + char data[size] = {0}; + for (int i = 0; i < size / 2; ++i) { + data[i * 2 + 1] = 1; + } + + const char object_name[] = "azut.bin"; + char path[PATH_MAX] = {0}; + char path_download[PATH_MAX] = {0}; + int ds_len = strlen(TD_DIRSEP); + int tmp_len = strlen(tsTempDir); + + (void)snprintf(path, PATH_MAX, "%s", tsTempDir); + if (strncmp(tsTempDir + tmp_len - ds_len, TD_DIRSEP, ds_len) != 0) { + (void)snprintf(path + tmp_len, PATH_MAX - tmp_len, "%s", TD_DIRSEP); + (void)snprintf(path + tmp_len + ds_len, PATH_MAX - tmp_len - ds_len, "%s", object_name); + } else { + (void)snprintf(path + tmp_len, PATH_MAX - tmp_len, "%s", object_name); + } + + tstrncpy(path_download, path, strlen(path) + 1); + tstrncpy(path_download + strlen(path), ".download", strlen(".download") + 1); + + TdFilePtr fp = taosOpenFile(path, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_WRITE_THROUGH); + GTEST_ASSERT_NE(fp, nullptr); + + int n = taosWriteFile(fp, data, size); + GTEST_ASSERT_EQ(n, size); + + code = taosCloseFile(&fp); + GTEST_ASSERT_EQ(code, 0); + + code = azPutObjectFromFileOffset(path, object_name, 0, size); + GTEST_ASSERT_EQ(code, 0); + + uint8_t *pBlock = NULL; + code = azGetObjectBlock(object_name, 0, size, check, &pBlock); + GTEST_ASSERT_EQ(code, 0); + + for (int i = 0; i < size / 2; ++i) { + GTEST_ASSERT_EQ(pBlock[i * 2], 0); + GTEST_ASSERT_EQ(pBlock[i * 2 + 1], 1); + } + + taosMemoryFree(pBlock); + + code = azGetObjectToFile(object_name, path_download); + GTEST_ASSERT_EQ(code, 0); + + { + TdFilePtr fp = taosOpenFile(path, TD_FILE_READ); + GTEST_ASSERT_NE(fp, nullptr); + + (void)memset(data, 0, size); + + int64_t n = taosReadFile(fp, data, size); + GTEST_ASSERT_EQ(n, size); + + code = taosCloseFile(&fp); + GTEST_ASSERT_EQ(code, 0); + + for (int i = 0; i < size / 2; ++i) { + GTEST_ASSERT_EQ(data[i * 2], 0); + GTEST_ASSERT_EQ(data[i * 2 + 1], 1); + } + } + + azDeleteObjectsByPrefix(object_name); + // list object to check + + code = azPutObjectFromFile2(path, object_name, withcp); + GTEST_ASSERT_EQ(code, 0); + + code = azGetObjectsByPrefix(object_name, tsTempDir); + GTEST_ASSERT_EQ(code, 0); + + { + TdFilePtr fp = taosOpenFile(path, TD_FILE_READ); + GTEST_ASSERT_NE(fp, nullptr); + + (void)memset(data, 0, size); + + int64_t n = taosReadFile(fp, data, size); + GTEST_ASSERT_EQ(n, size); + + code = taosCloseFile(&fp); + GTEST_ASSERT_EQ(code, 0); + + for (int i = 0; i < size / 2; ++i) { + GTEST_ASSERT_EQ(data[i * 2], 0); + GTEST_ASSERT_EQ(data[i * 2 + 1], 1); + } + } + + const char *object_name_arr[] = {object_name}; + code = azDeleteObjects(object_name_arr, 1); + GTEST_ASSERT_EQ(code, 0); + + azEnd(); +} diff --git a/source/libs/catalog/CMakeLists.txt b/source/libs/catalog/CMakeLists.txt index 6f09af8a8f..179781c2c9 100644 --- a/source/libs/catalog/CMakeLists.txt +++ b/source/libs/catalog/CMakeLists.txt @@ -7,10 +7,10 @@ target_include_directories( ) target_link_libraries( - catalog - PRIVATE os util transport qcom nodes + catalog + PRIVATE os util transport qcom nodes ) # if(${BUILD_TEST}) -# ADD_SUBDIRECTORY(test) +# ADD_SUBDIRECTORY(test) # endif(${BUILD_TEST}) diff --git a/source/libs/command/CMakeLists.txt b/source/libs/command/CMakeLists.txt index a890972d14..308f652861 100644 --- a/source/libs/command/CMakeLists.txt +++ b/source/libs/command/CMakeLists.txt @@ -12,5 +12,5 @@ target_link_libraries( ) if(${BUILD_TEST}) - ADD_SUBDIRECTORY(test) + ADD_SUBDIRECTORY(test) endif(${BUILD_TEST}) diff --git a/source/libs/crypt/CMakeLists.txt b/source/libs/crypt/CMakeLists.txt index e6d73b1882..c29c9a4a29 100644 --- a/source/libs/crypt/CMakeLists.txt +++ b/source/libs/crypt/CMakeLists.txt @@ -1,8 +1,8 @@ aux_source_directory(src CRYPT_SRC) -IF (TD_ENTERPRISE) +IF(TD_ENTERPRISE) LIST(APPEND CRYPT_SRC ${TD_ENTERPRISE_DIR}/src/plugins/crypt/cryptImpl.c) -ENDIF () +ENDIF() add_library(crypt STATIC ${CRYPT_SRC}) target_include_directories( diff --git a/source/libs/executor/CMakeLists.txt b/source/libs/executor/CMakeLists.txt index af2c3986aa..014b538375 100644 --- a/source/libs/executor/CMakeLists.txt +++ b/source/libs/executor/CMakeLists.txt @@ -1,24 +1,25 @@ aux_source_directory(src EXECUTOR_SRC) add_library(executor STATIC ${EXECUTOR_SRC}) + if(${TD_DARWIN}) - target_compile_options(executor PRIVATE -Wno-error=deprecated-non-prototype) + target_compile_options(executor PRIVATE -Wno-error=deprecated-non-prototype) endif(${TD_DARWIN}) -IF(${BUILD_WITH_ANALYSIS}) +if(${BUILD_WITH_ANALYSIS}) add_definitions(-DUSE_ANAL) -ENDIF() +endif() target_link_libraries(executor - PRIVATE os util common function parser planner qcom scalar nodes index wal tdb geometry - ) + PRIVATE os util common function parser planner qcom scalar nodes index wal tdb geometry +) target_include_directories( - executor - PUBLIC "${TD_SOURCE_DIR}/include/libs/executor" - PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" + executor + PUBLIC "${TD_SOURCE_DIR}/include/libs/executor" + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" ) if(${BUILD_TEST}) - ADD_SUBDIRECTORY(test) + ADD_SUBDIRECTORY(test) endif(${BUILD_TEST}) diff --git a/source/libs/executor/inc/tfill.h b/source/libs/executor/inc/tfill.h index b06aa7d1c8..31ac5689f6 100644 --- a/source/libs/executor/inc/tfill.h +++ b/source/libs/executor/inc/tfill.h @@ -35,6 +35,7 @@ typedef struct SFillColInfo { SExprInfo* pExpr; bool notFillCol; // denote if this column needs fill operation SVariant fillVal; + bool fillNull; } SFillColInfo; typedef struct SFillLinearInfo { @@ -125,12 +126,14 @@ void taosFillSetInputDataBlock(struct SFillInfo* pFillInfo, const struc void taosFillUpdateStartTimestampInfo(SFillInfo* pFillInfo, int64_t ts); bool taosFillNotStarted(const SFillInfo* pFillInfo); SFillColInfo* createFillColInfo(SExprInfo* pExpr, int32_t numOfFillExpr, SExprInfo* pNotFillExpr, - int32_t numOfNotFillCols, const struct SNodeListNode* val); + int32_t numOfNotFillCols, SExprInfo* pFillNullExpr, int32_t numOfFillNullExprs, + const struct SNodeListNode* val); bool taosFillHasMoreResults(struct SFillInfo* pFillInfo); -int32_t taosCreateFillInfo(TSKEY skey, int32_t numOfFillCols, int32_t numOfNotFillCols, int32_t capacity, - SInterval* pInterval, int32_t fillType, struct SFillColInfo* pCol, int32_t slotId, - int32_t order, const char* id, SExecTaskInfo* pTaskInfo, SFillInfo** ppFillInfo); +int32_t taosCreateFillInfo(TSKEY skey, int32_t numOfFillCols, int32_t numOfNotFillCols, int32_t fillNullCols, + int32_t capacity, SInterval* pInterval, int32_t fillType, struct SFillColInfo* pCol, + int32_t slotId, int32_t order, const char* id, SExecTaskInfo* pTaskInfo, + SFillInfo** ppFillInfo); void* taosDestroyFillInfo(struct SFillInfo* pFillInfo); int32_t taosFillResultDataBlock(struct SFillInfo* pFillInfo, SSDataBlock* p, int32_t capacity); diff --git a/source/libs/executor/src/filloperator.c b/source/libs/executor/src/filloperator.c index d530382f7c..1595c90419 100644 --- a/source/libs/executor/src/filloperator.c +++ b/source/libs/executor/src/filloperator.c @@ -53,6 +53,7 @@ typedef struct SFillOperatorInfo { SExprInfo* pExprInfo; int32_t numOfExpr; SExprSupp noFillExprSupp; + SExprSupp fillNullExprSupp; } SFillOperatorInfo; static void destroyFillOperatorInfo(void* param); @@ -140,6 +141,15 @@ void doApplyScalarCalculation(SOperatorInfo* pOperator, SSDataBlock* pBlock, int code = projectApplyFunctions(pNoFillSupp->pExprInfo, pInfo->pRes, pBlock, pNoFillSupp->pCtx, pNoFillSupp->numOfExprs, NULL); QUERY_CHECK_CODE(code, lino, _end); + + if (pInfo->fillNullExprSupp.pExprInfo) { + pInfo->pRes->info.rows = 0; + code = setInputDataBlock(&pInfo->fillNullExprSupp, pBlock, order, scanFlag, false); + QUERY_CHECK_CODE(code, lino, _end); + code = projectApplyFunctions(pInfo->fillNullExprSupp.pExprInfo, pInfo->pRes, pBlock, pInfo->fillNullExprSupp.pCtx, + pInfo->fillNullExprSupp.numOfExprs, NULL); + } + pInfo->pRes->info.id.groupId = pBlock->info.id.groupId; _end: @@ -327,6 +337,7 @@ void destroyFillOperatorInfo(void* param) { pInfo->pFinalRes = NULL; cleanupExprSupp(&pInfo->noFillExprSupp); + cleanupExprSupp(&pInfo->fillNullExprSupp); taosMemoryFreeClear(pInfo->p); taosArrayDestroy(pInfo->matchInfo.pList); @@ -334,10 +345,11 @@ void destroyFillOperatorInfo(void* param) { } static int32_t initFillInfo(SFillOperatorInfo* pInfo, SExprInfo* pExpr, int32_t numOfCols, SExprInfo* pNotFillExpr, - int32_t numOfNotFillCols, SNodeListNode* pValNode, STimeWindow win, int32_t capacity, - const char* id, SInterval* pInterval, int32_t fillType, int32_t order, - SExecTaskInfo* pTaskInfo) { - SFillColInfo* pColInfo = createFillColInfo(pExpr, numOfCols, pNotFillExpr, numOfNotFillCols, pValNode); + int32_t numOfNotFillCols, SExprInfo* pFillNullExpr, int32_t numOfFillNullExprs, + SNodeListNode* pValNode, STimeWindow win, int32_t capacity, const char* id, + SInterval* pInterval, int32_t fillType, int32_t order, SExecTaskInfo* pTaskInfo) { + SFillColInfo* pColInfo = + createFillColInfo(pExpr, numOfCols, pNotFillExpr, numOfNotFillCols, pFillNullExpr, numOfFillNullExprs, pValNode); if (!pColInfo) { qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(terrno)); return terrno; @@ -348,8 +360,8 @@ static int32_t initFillInfo(SFillOperatorInfo* pInfo, SExprInfo* pExpr, int32_t // STimeWindow w = {0}; // getInitialStartTimeWindow(pInterval, startKey, &w, order == TSDB_ORDER_ASC); pInfo->pFillInfo = NULL; - int32_t code = taosCreateFillInfo(startKey, numOfCols, numOfNotFillCols, capacity, pInterval, fillType, pColInfo, - pInfo->primaryTsCol, order, id, pTaskInfo, &pInfo->pFillInfo); + int32_t code = taosCreateFillInfo(startKey, numOfCols, numOfNotFillCols, numOfFillNullExprs, capacity, pInterval, + fillType, pColInfo, pInfo->primaryTsCol, order, id, pTaskInfo, &pInfo->pFillInfo); if (code != TSDB_CODE_SUCCESS) { qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); return code; @@ -455,6 +467,13 @@ int32_t createFillOperatorInfo(SOperatorInfo* downstream, SFillPhysiNode* pPhyFi initExprSupp(pNoFillSupp, pNoFillSupp->pExprInfo, pNoFillSupp->numOfExprs, &pTaskInfo->storageAPI.functionStore); QUERY_CHECK_CODE(code, lino, _error); + code = createExprInfo(pPhyFillNode->pFillNullExprs, NULL, &pInfo->fillNullExprSupp.pExprInfo, + &pInfo->fillNullExprSupp.numOfExprs); + QUERY_CHECK_CODE(code, lino, _error); + code = initExprSupp(&pInfo->fillNullExprSupp, pInfo->fillNullExprSupp.pExprInfo, pInfo->fillNullExprSupp.numOfExprs, + &pTaskInfo->storageAPI.functionStore); + QUERY_CHECK_CODE(code, lino, _error); + SInterval* pInterval = QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL == downstream->operatorType ? &((SMergeAlignedIntervalAggOperatorInfo*)downstream->info)->intervalAggOperatorInfo->interval @@ -482,7 +501,9 @@ int32_t createFillOperatorInfo(SOperatorInfo* downstream, SFillPhysiNode* pPhyFi code = extractColMatchInfo(pPhyFillNode->pFillExprs, pPhyFillNode->node.pOutputDataBlockDesc, &numOfOutputCols, COL_MATCH_FROM_SLOT_ID, &pInfo->matchInfo); + QUERY_CHECK_CODE(code, lino, _error); code = initFillInfo(pInfo, pExprInfo, pInfo->numOfExpr, pNoFillSupp->pExprInfo, pNoFillSupp->numOfExprs, + pInfo->fillNullExprSupp.pExprInfo, pInfo->fillNullExprSupp.numOfExprs, (SNodeListNode*)pPhyFillNode->pValues, pPhyFillNode->timeRange, pResultInfo->capacity, pTaskInfo->id.str, pInterval, type, order, pTaskInfo); if (code != TSDB_CODE_SUCCESS) { diff --git a/source/libs/executor/src/streamfilloperator.c b/source/libs/executor/src/streamfilloperator.c index 826220581a..b7061fad97 100644 --- a/source/libs/executor/src/streamfilloperator.c +++ b/source/libs/executor/src/streamfilloperator.c @@ -1201,7 +1201,7 @@ static SStreamFillSupporter* initStreamFillSup(SStreamFillPhysiNode* pPhyFillNod QUERY_CHECK_CODE(code, lino, _end); pFillSup->pAllColInfo = createFillColInfo(pFillExprInfo, pFillSup->numOfFillCols, noFillExprInfo, numOfNotFillCols, - (const SNodeListNode*)(pPhyFillNode->pValues)); + NULL, 0, (const SNodeListNode*)(pPhyFillNode->pValues)); if (pFillSup->pAllColInfo == NULL) { code = terrno; lino = __LINE__; diff --git a/source/libs/executor/src/tfill.c b/source/libs/executor/src/tfill.c index cdfbd7a850..190b327522 100644 --- a/source/libs/executor/src/tfill.c +++ b/source/libs/executor/src/tfill.c @@ -39,22 +39,27 @@ static int32_t doSetVal(SColumnInfoData* pDstColInfoData, int32_t rowIndex, const SGroupKeys* pKey); static void setNotFillColumn(SFillInfo* pFillInfo, SColumnInfoData* pDstColInfo, int32_t rowIndex, int32_t colIdx) { - SRowVal* p = NULL; - if (pFillInfo->type == TSDB_FILL_NEXT) { - p = FILL_IS_ASC_FILL(pFillInfo) ? &pFillInfo->next : &pFillInfo->prev; + SFillColInfo* pCol = &pFillInfo->pFillCol[colIdx]; + if (pCol->fillNull) { + colDataSetNULL(pDstColInfo, rowIndex); } else { - p = FILL_IS_ASC_FILL(pFillInfo) ? &pFillInfo->prev : &pFillInfo->next; - } + SRowVal* p = NULL; + if (pFillInfo->type == TSDB_FILL_NEXT) { + p = FILL_IS_ASC_FILL(pFillInfo) ? &pFillInfo->next : &pFillInfo->prev; + } else { + p = FILL_IS_ASC_FILL(pFillInfo) ? &pFillInfo->prev : &pFillInfo->next; + } - SGroupKeys* pKey = taosArrayGet(p->pRowVal, colIdx); - if (!pKey) { - qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(terrno)); - T_LONG_JMP(pFillInfo->pTaskInfo->env, terrno); - } - int32_t code = doSetVal(pDstColInfo, rowIndex, pKey); - if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); - T_LONG_JMP(pFillInfo->pTaskInfo->env, code); + SGroupKeys* pKey = taosArrayGet(p->pRowVal, colIdx); + if (!pKey) { + qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(terrno)); + T_LONG_JMP(pFillInfo->pTaskInfo->env, terrno); + } + int32_t code = doSetVal(pDstColInfo, rowIndex, pKey); + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); + T_LONG_JMP(pFillInfo->pTaskInfo->env, code); + } } } @@ -545,9 +550,10 @@ static int32_t taosNumOfRemainRows(SFillInfo* pFillInfo) { return pFillInfo->numOfRows - pFillInfo->index; } -int32_t taosCreateFillInfo(TSKEY skey, int32_t numOfFillCols, int32_t numOfNotFillCols, int32_t capacity, - SInterval* pInterval, int32_t fillType, struct SFillColInfo* pCol, int32_t primaryTsSlotId, - int32_t order, const char* id, SExecTaskInfo* pTaskInfo, SFillInfo** ppFillInfo) { +int32_t taosCreateFillInfo(TSKEY skey, int32_t numOfFillCols, int32_t numOfNotFillCols, int32_t fillNullCols, + int32_t capacity, SInterval* pInterval, int32_t fillType, struct SFillColInfo* pCol, + int32_t primaryTsSlotId, int32_t order, const char* id, SExecTaskInfo* pTaskInfo, + SFillInfo** ppFillInfo) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; if (fillType == TSDB_FILL_NONE) { @@ -574,7 +580,7 @@ int32_t taosCreateFillInfo(TSKEY skey, int32_t numOfFillCols, int32_t numOfNotFi pFillInfo->type = fillType; pFillInfo->pFillCol = pCol; - pFillInfo->numOfCols = numOfFillCols + numOfNotFillCols; + pFillInfo->numOfCols = numOfFillCols + numOfNotFillCols + fillNullCols; pFillInfo->alloc = capacity; pFillInfo->id = id; pFillInfo->interval = *pInterval; @@ -761,10 +767,11 @@ _end: int64_t getFillInfoStart(struct SFillInfo* pFillInfo) { return pFillInfo->start; } SFillColInfo* createFillColInfo(SExprInfo* pExpr, int32_t numOfFillExpr, SExprInfo* pNotFillExpr, - int32_t numOfNoFillExpr, const struct SNodeListNode* pValNode) { + int32_t numOfNoFillExpr, SExprInfo* pFillNullExpr, int32_t numOfFillNullExpr, + const struct SNodeListNode* pValNode) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; - SFillColInfo* pFillCol = taosMemoryCalloc(numOfFillExpr + numOfNoFillExpr, sizeof(SFillColInfo)); + SFillColInfo* pFillCol = taosMemoryCalloc(numOfFillExpr + numOfNoFillExpr + numOfFillNullExpr, sizeof(SFillColInfo)); if (pFillCol == NULL) { return NULL; } @@ -797,6 +804,13 @@ SFillColInfo* createFillColInfo(SExprInfo* pExpr, int32_t numOfFillExpr, SExprIn pFillCol[i + numOfFillExpr].notFillCol = true; } + for (int32_t i = 0; i < numOfFillNullExpr; ++i) { + SExprInfo* pExprInfo = &pFillNullExpr[i]; + pFillCol[i + numOfFillExpr + numOfNoFillExpr].pExpr = pExprInfo; + pFillCol[i + numOfFillExpr + numOfNoFillExpr].notFillCol = true; + pFillCol[i + numOfFillExpr + numOfNoFillExpr].fillNull = true; + } + return pFillCol; _end: diff --git a/source/libs/executor/src/timesliceoperator.c b/source/libs/executor/src/timesliceoperator.c index 2ea300ace8..6803f40da4 100644 --- a/source/libs/executor/src/timesliceoperator.c +++ b/source/libs/executor/src/timesliceoperator.c @@ -1147,7 +1147,8 @@ int32_t createTimeSliceOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyN pInfo->fillType = convertFillType(pInterpPhyNode->fillMode); initResultSizeInfo(&pOperator->resultInfo, 4096); - pInfo->pFillColInfo = createFillColInfo(pExprInfo, numOfExprs, NULL, 0, (SNodeListNode*)pInterpPhyNode->pFillValues); + pInfo->pFillColInfo = + createFillColInfo(pExprInfo, numOfExprs, NULL, 0, NULL, 0, (SNodeListNode*)pInterpPhyNode->pFillValues); QUERY_CHECK_NULL(pInfo->pFillColInfo, code, lino, _error, terrno); pInfo->pLinearInfo = NULL; diff --git a/source/libs/function/CMakeLists.txt b/source/libs/function/CMakeLists.txt index 3a68648d49..4164852111 100644 --- a/source/libs/function/CMakeLists.txt +++ b/source/libs/function/CMakeLists.txt @@ -5,115 +5,114 @@ add_library(function STATIC ${FUNCTION_SRC} ${FUNCTION_SRC_DETAIL}) target_include_directories( function PUBLIC - "${TD_SOURCE_DIR}/include/libs/function" - "${TD_SOURCE_DIR}/include/util" - "${TD_SOURCE_DIR}/include/common" - "${TD_SOURCE_DIR}/include/client" - "${TD_SOURCE_DIR}/contrib/libuv/include" + "${TD_SOURCE_DIR}/include/libs/function" + "${TD_SOURCE_DIR}/include/util" + "${TD_SOURCE_DIR}/include/common" + "${TD_SOURCE_DIR}/include/client" + "${TD_SOURCE_DIR}/contrib/libuv/include" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" ) -IF (TD_LINUX_64 AND JEMALLOC_ENABLED) - ADD_DEFINITIONS(-DTD_JEMALLOC_ENABLED -I${CMAKE_BINARY_DIR}/build/include -L${CMAKE_BINARY_DIR}/build/lib -Wl,-rpath,${CMAKE_BINARY_DIR}/build/lib -ljemalloc) - SET(LINK_JEMALLOC "-L${CMAKE_BINARY_DIR}/build/lib -ljemalloc") -ELSE () - SET(LINK_JEMALLOC "") -ENDIF () +IF(TD_LINUX_64 AND JEMALLOC_ENABLED) + ADD_DEFINITIONS(-DTD_JEMALLOC_ENABLED -I${CMAKE_BINARY_DIR}/build/include -L${CMAKE_BINARY_DIR}/build/lib -Wl,-rpath,${CMAKE_BINARY_DIR}/build/lib -ljemalloc) + SET(LINK_JEMALLOC "-L${CMAKE_BINARY_DIR}/build/lib -ljemalloc") +ELSE() + SET(LINK_JEMALLOC "") +ENDIF() -IF (TD_LINUX_64 AND JEMALLOC_ENABLED) +IF(TD_LINUX_64 AND JEMALLOC_ENABLED) ADD_DEPENDENCIES(function jemalloc) -ENDIF () +ENDIF() target_link_libraries( function - PRIVATE os - PRIVATE util - PRIVATE common - PRIVATE nodes - PRIVATE qcom - PRIVATE scalar - PRIVATE geometry - PRIVATE transport + PRIVATE os + PRIVATE util + PRIVATE common + PRIVATE nodes + PRIVATE qcom + PRIVATE scalar + PRIVATE geometry + PRIVATE transport PUBLIC uv_a ) add_executable(runUdf test/runUdf.c) target_include_directories( - runUdf - PUBLIC - "${TD_SOURCE_DIR}/include/libs/function" - "${TD_SOURCE_DIR}/contrib/libuv/include" - "${TD_SOURCE_DIR}/include/util" - "${TD_SOURCE_DIR}/include/common" - "${TD_SOURCE_DIR}/include/client" - "${TD_SOURCE_DIR}/include/os" - PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" + runUdf + PUBLIC + "${TD_SOURCE_DIR}/include/libs/function" + "${TD_SOURCE_DIR}/contrib/libuv/include" + "${TD_SOURCE_DIR}/include/util" + "${TD_SOURCE_DIR}/include/common" + "${TD_SOURCE_DIR}/include/client" + "${TD_SOURCE_DIR}/include/os" + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" ) -IF (TD_LINUX_64 AND JEMALLOC_ENABLED) +IF(TD_LINUX_64 AND JEMALLOC_ENABLED) ADD_DEPENDENCIES(runUdf jemalloc) -ENDIF () +ENDIF() target_link_libraries( - runUdf - PUBLIC uv_a - PRIVATE os util common nodes function ${LINK_JEMALLOC} + runUdf + PUBLIC uv_a + PRIVATE os util common nodes function ${LINK_JEMALLOC} ) add_library(udf1 STATIC MODULE test/udf1.c) target_include_directories( - udf1 - PUBLIC - "${TD_SOURCE_DIR}/include/libs/function" - "${TD_SOURCE_DIR}/include/util" - "${TD_SOURCE_DIR}/include/common" - "${TD_SOURCE_DIR}/include/client" - "${TD_SOURCE_DIR}/include/os" - PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" + udf1 + PUBLIC + "${TD_SOURCE_DIR}/include/libs/function" + "${TD_SOURCE_DIR}/include/util" + "${TD_SOURCE_DIR}/include/common" + "${TD_SOURCE_DIR}/include/client" + "${TD_SOURCE_DIR}/include/os" + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" ) -IF (TD_LINUX_64 AND JEMALLOC_ENABLED) +IF(TD_LINUX_64 AND JEMALLOC_ENABLED) ADD_DEPENDENCIES(udf1 jemalloc) -ENDIF () +ENDIF() target_link_libraries( udf1 PUBLIC os ${LINK_JEMALLOC}) - add_library(udf1_dup STATIC MODULE test/udf1_dup.c) target_include_directories( - udf1_dup - PUBLIC - "${TD_SOURCE_DIR}/include/libs/function" - "${TD_SOURCE_DIR}/include/util" - "${TD_SOURCE_DIR}/include/common" - "${TD_SOURCE_DIR}/include/client" - "${TD_SOURCE_DIR}/include/os" - PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" + udf1_dup + PUBLIC + "${TD_SOURCE_DIR}/include/libs/function" + "${TD_SOURCE_DIR}/include/util" + "${TD_SOURCE_DIR}/include/common" + "${TD_SOURCE_DIR}/include/client" + "${TD_SOURCE_DIR}/include/os" + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" ) -IF (TD_LINUX_64 AND JEMALLOC_ENABLED) +IF(TD_LINUX_64 AND JEMALLOC_ENABLED) ADD_DEPENDENCIES(udf1_dup jemalloc) -ENDIF () +ENDIF() target_link_libraries( udf1_dup PUBLIC os ${LINK_JEMALLOC}) add_library(udf2 STATIC MODULE test/udf2.c) target_include_directories( - udf2 - PUBLIC - "${TD_SOURCE_DIR}/include/libs/function" - "${TD_SOURCE_DIR}/include/util" - "${TD_SOURCE_DIR}/include/common" - "${TD_SOURCE_DIR}/include/client" - "${TD_SOURCE_DIR}/include/os" - PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" + udf2 + PUBLIC + "${TD_SOURCE_DIR}/include/libs/function" + "${TD_SOURCE_DIR}/include/util" + "${TD_SOURCE_DIR}/include/common" + "${TD_SOURCE_DIR}/include/client" + "${TD_SOURCE_DIR}/include/os" + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" ) -IF (TD_LINUX_64 AND JEMALLOC_ENABLED) +IF(TD_LINUX_64 AND JEMALLOC_ENABLED) ADD_DEPENDENCIES(udf2 jemalloc) -ENDIF () +ENDIF() target_link_libraries( udf2 PUBLIC os ${LINK_JEMALLOC} @@ -121,45 +120,44 @@ target_link_libraries( add_library(udf2_dup STATIC MODULE test/udf2_dup.c) target_include_directories( - udf2_dup - PUBLIC - "${TD_SOURCE_DIR}/include/libs/function" - "${TD_SOURCE_DIR}/include/util" - "${TD_SOURCE_DIR}/include/common" - "${TD_SOURCE_DIR}/include/client" - "${TD_SOURCE_DIR}/include/os" - PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" + udf2_dup + PUBLIC + "${TD_SOURCE_DIR}/include/libs/function" + "${TD_SOURCE_DIR}/include/util" + "${TD_SOURCE_DIR}/include/common" + "${TD_SOURCE_DIR}/include/client" + "${TD_SOURCE_DIR}/include/os" + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" ) -IF (TD_LINUX_64 AND JEMALLOC_ENABLED) +IF(TD_LINUX_64 AND JEMALLOC_ENABLED) ADD_DEPENDENCIES(udf2_dup jemalloc) -ENDIF () +ENDIF() target_link_libraries( udf2_dup PUBLIC os ${LINK_JEMALLOC} ) -#SET(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/build/bin) +# SET(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/build/bin) add_executable(udfd src/udfd.c) target_include_directories( - udfd - PUBLIC - "${TD_SOURCE_DIR}/include/libs/function" - "${TD_SOURCE_DIR}/contrib/libuv/include" - "${TD_SOURCE_DIR}/include/util" - "${TD_SOURCE_DIR}/include/common" - "${TD_SOURCE_DIR}/include/libs/transport" - "${TD_SOURCE_DIR}/include/client" - PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" + udfd + PUBLIC + "${TD_SOURCE_DIR}/include/libs/function" + "${TD_SOURCE_DIR}/contrib/libuv/include" + "${TD_SOURCE_DIR}/include/util" + "${TD_SOURCE_DIR}/include/common" + "${TD_SOURCE_DIR}/include/libs/transport" + "${TD_SOURCE_DIR}/include/client" + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" ) -IF (TD_LINUX_64 AND JEMALLOC_ENABLED) +IF(TD_LINUX_64 AND JEMALLOC_ENABLED) ADD_DEPENDENCIES(udfd jemalloc) -ENDIF () +ENDIF() target_link_libraries( udfd PUBLIC uv_a PRIVATE os util common nodes function ${LINK_JEMALLOC} - ) - +) diff --git a/source/libs/index/CMakeLists.txt b/source/libs/index/CMakeLists.txt index 6f3f48610c..246708926a 100644 --- a/source/libs/index/CMakeLists.txt +++ b/source/libs/index/CMakeLists.txt @@ -1,23 +1,22 @@ aux_source_directory(src INDEX_SRC) add_library(index STATIC ${INDEX_SRC}) target_include_directories( - index - PUBLIC "${TD_SOURCE_DIR}/include/libs/index" - PUBLIC "${TD_SOURCE_DIR}/include/os" - PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" - + index + PUBLIC "${TD_SOURCE_DIR}/include/libs/index" + PUBLIC "${TD_SOURCE_DIR}/include/os" + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" ) target_link_libraries( - index - PUBLIC os - PUBLIC util - PUBLIC common - PUBLIC nodes - PUBLIC scalar - PUBLIC function + index + PUBLIC os + PUBLIC util + PUBLIC common + PUBLIC nodes + PUBLIC scalar + PUBLIC function ) -if (${BUILD_WITH_LUCENE}) +if(${BUILD_WITH_LUCENE}) target_include_directories( index PUBLIC "${TD_SOURCE_DIR}/deps/lucene/include" @@ -29,12 +28,10 @@ if (${BUILD_WITH_LUCENE}) ) endif(${BUILD_WITH_LUCENE}) -if (${BUILD_WITH_INVERTEDINDEX}) - add_definitions(-DUSE_INVERTED_INDEX) +if(${BUILD_WITH_INVERTEDINDEX}) + add_definitions(-DUSE_INVERTED_INDEX) endif(${BUILD_WITH_INVERTEDINDEX}) - -if (${BUILD_TEST}) - add_subdirectory(test) +if(${BUILD_TEST}) + add_subdirectory(test) endif(${BUILD_TEST}) - diff --git a/source/libs/monitor/CMakeLists.txt b/source/libs/monitor/CMakeLists.txt index cc8f40fa4c..23597718bf 100644 --- a/source/libs/monitor/CMakeLists.txt +++ b/source/libs/monitor/CMakeLists.txt @@ -9,5 +9,5 @@ target_include_directories( target_link_libraries(monitor os util common qcom transport monitorfw) if(${BUILD_TEST}) - add_subdirectory(test) + add_subdirectory(test) endif(${BUILD_TEST}) \ No newline at end of file diff --git a/source/libs/monitorfw/CMakeLists.txt b/source/libs/monitorfw/CMakeLists.txt index f08b2d6c2b..339a97fb94 100644 --- a/source/libs/monitorfw/CMakeLists.txt +++ b/source/libs/monitorfw/CMakeLists.txt @@ -5,7 +5,9 @@ target_include_directories( PUBLIC "${TD_SOURCE_DIR}/include/libs/monitorfw" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" ) + if(${TD_DARWIN}) - target_compile_options(monitorfw PRIVATE -Wno-error=deprecated-pragma) + target_compile_options(monitorfw PRIVATE -Wno-error=deprecated-pragma) endif(${TD_DARWIN}) + target_link_libraries(monitorfw os util common transport) diff --git a/source/libs/nodes/src/nodesCloneFuncs.c b/source/libs/nodes/src/nodesCloneFuncs.c index b77ffb8d2c..b2b06e6bea 100644 --- a/source/libs/nodes/src/nodesCloneFuncs.c +++ b/source/libs/nodes/src/nodesCloneFuncs.c @@ -642,6 +642,7 @@ static int32_t logicFillCopy(const SFillLogicNode* pSrc, SFillLogicNode* pDst) { CLONE_NODE_FIELD(pWStartTs); CLONE_NODE_FIELD(pValues); COPY_OBJECT_FIELD(timeRange, sizeof(STimeWindow)); + CLONE_NODE_LIST_FIELD(pFillNullExprs); return TSDB_CODE_SUCCESS; } diff --git a/source/libs/nodes/src/nodesCodeFuncs.c b/source/libs/nodes/src/nodesCodeFuncs.c index 0f67493094..723a38c2bd 100644 --- a/source/libs/nodes/src/nodesCodeFuncs.c +++ b/source/libs/nodes/src/nodesCodeFuncs.c @@ -2887,6 +2887,7 @@ static const char* jkFillPhysiPlanWStartTs = "WStartTs"; static const char* jkFillPhysiPlanValues = "Values"; static const char* jkFillPhysiPlanStartTime = "StartTime"; static const char* jkFillPhysiPlanEndTime = "EndTime"; +static const char* jkFillPhysiPlanFillNullExprs = "FillNullExprs"; static int32_t physiFillNodeToJson(const void* pObj, SJson* pJson) { const SFillPhysiNode* pNode = (const SFillPhysiNode*)pObj; @@ -2913,6 +2914,9 @@ static int32_t physiFillNodeToJson(const void* pObj, SJson* pJson) { if (TSDB_CODE_SUCCESS == code) { code = tjsonAddIntegerToObject(pJson, jkFillPhysiPlanEndTime, pNode->timeRange.ekey); } + if (TSDB_CODE_SUCCESS == code) { + code = nodeListToJson(pJson, jkFillPhysiPlanFillNullExprs, pNode->pFillNullExprs); + } return code; } @@ -2942,6 +2946,9 @@ static int32_t jsonToPhysiFillNode(const SJson* pJson, void* pObj) { if (TSDB_CODE_SUCCESS == code) { code = tjsonGetBigIntValue(pJson, jkFillPhysiPlanEndTime, &pNode->timeRange.ekey); } + if (TSDB_CODE_SUCCESS == code) { + code = jsonToNodeList(pJson, jkFillPhysiPlanFillNullExprs, &pNode->pFillNullExprs); + } return code; } diff --git a/source/libs/nodes/src/nodesMsgFuncs.c b/source/libs/nodes/src/nodesMsgFuncs.c index 3d8a57363b..7e3e0e0806 100644 --- a/source/libs/nodes/src/nodesMsgFuncs.c +++ b/source/libs/nodes/src/nodesMsgFuncs.c @@ -3326,7 +3326,8 @@ enum { PHY_FILL_CODE_WSTART, PHY_FILL_CODE_VALUES, PHY_FILL_CODE_TIME_RANGE, - PHY_FILL_CODE_INPUT_TS_ORDER + PHY_FILL_CODE_INPUT_TS_ORDER, + PHY_FILL_CODE_FILL_NULL_EXPRS, }; static int32_t physiFillNodeToMsg(const void* pObj, STlvEncoder* pEncoder) { @@ -3351,6 +3352,9 @@ static int32_t physiFillNodeToMsg(const void* pObj, STlvEncoder* pEncoder) { if (TSDB_CODE_SUCCESS == code) { code = tlvEncodeObj(pEncoder, PHY_FILL_CODE_TIME_RANGE, timeWindowToMsg, &pNode->timeRange); } + if (TSDB_CODE_SUCCESS == code) { + code = tlvEncodeObj(pEncoder, PHY_FILL_CODE_FILL_NULL_EXPRS, nodeListToMsg, pNode->pFillNullExprs); + } return code; } @@ -3383,6 +3387,9 @@ static int32_t msgToPhysiFillNode(STlvDecoder* pDecoder, void* pObj) { case PHY_FILL_CODE_TIME_RANGE: code = tlvDecodeObjFromTlv(pTlv, msgToTimeWindow, (void**)&pNode->timeRange); break; + case PHY_FILL_CODE_FILL_NULL_EXPRS: + code = msgToNodeListFromTlv(pTlv, (void**)&pNode->pFillNullExprs); + break; default: break; } diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c index 31568149c9..6830dd01b6 100644 --- a/source/libs/nodes/src/nodesUtilFuncs.c +++ b/source/libs/nodes/src/nodesUtilFuncs.c @@ -1495,6 +1495,7 @@ void nodesDestroyNode(SNode* pNode) { nodesDestroyNode(pLogicNode->pValues); nodesDestroyList(pLogicNode->pFillExprs); nodesDestroyList(pLogicNode->pNotFillExprs); + nodesDestroyList(pLogicNode->pFillNullExprs); break; } case QUERY_NODE_LOGIC_PLAN_SORT: { @@ -1666,6 +1667,7 @@ void nodesDestroyNode(SNode* pNode) { nodesDestroyList(pPhyNode->pNotFillExprs); nodesDestroyNode(pPhyNode->pWStartTs); nodesDestroyNode(pPhyNode->pValues); + nodesDestroyList(pPhyNode->pFillNullExprs); break; } case QUERY_NODE_PHYSICAL_PLAN_MERGE_SESSION: diff --git a/source/libs/parser/CMakeLists.txt b/source/libs/parser/CMakeLists.txt index c5ee1a00c4..f1b801c563 100644 --- a/source/libs/parser/CMakeLists.txt +++ b/source/libs/parser/CMakeLists.txt @@ -1,8 +1,8 @@ aux_source_directory(src PARSER_SRC) -IF (TD_ENTERPRISE) - LIST(APPEND PARSER_SRC ${TD_ENTERPRISE_DIR}/src/plugins/view/src/parserView.c) -ENDIF () +IF(TD_ENTERPRISE) + LIST(APPEND PARSER_SRC ${TD_ENTERPRISE_DIR}/src/plugins/view/src/parserView.c) +ENDIF() add_library(parser STATIC ${PARSER_SRC}) target_include_directories( @@ -17,5 +17,5 @@ target_link_libraries( ) if(${BUILD_TEST}) - ADD_SUBDIRECTORY(test) + ADD_SUBDIRECTORY(test) endif(${BUILD_TEST}) diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 752525fe7f..636be7c5cc 100755 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -3293,8 +3293,44 @@ static int32_t rewriteIsTrue(SNode* pSrc, SNode** pIsTrue) { return TSDB_CODE_SUCCESS; } +extern int8_t gDisplyTypes[TSDB_DATA_TYPE_MAX][TSDB_DATA_TYPE_MAX]; +static int32_t selectCommonType(SDataType* commonType, const SDataType* newType) { + if (commonType->type < TSDB_DATA_TYPE_NULL || commonType->type >= TSDB_DATA_TYPE_MAX || + newType->type < TSDB_DATA_TYPE_NULL || newType->type >= TSDB_DATA_TYPE_MAX) { + return TSDB_CODE_INVALID_PARA; + } + int8_t type1 = commonType->type; + int8_t type2 = newType->type; + int8_t resultType; + if (type1 < type2) { + resultType = gDisplyTypes[type1][type2]; + } else { + resultType = gDisplyTypes[type2][type1]; + } + if (resultType == -1) { + return TSDB_CODE_SCALAR_CONVERT_ERROR; + } + if (commonType->type == newType->type) { + commonType->bytes = TMAX(commonType->bytes, newType->bytes); + return TSDB_CODE_SUCCESS; + } + if (resultType == commonType->type){ + return TSDB_CODE_SUCCESS; + } + if(resultType == newType->type) { + *commonType = *newType; + return TSDB_CODE_SUCCESS; + } + commonType->bytes = TMAX(TMAX(commonType->bytes, newType->bytes), TYPE_BYTES[resultType]); + if(resultType == TSDB_DATA_TYPE_VARCHAR && (IS_FLOAT_TYPE(commonType->type) || IS_FLOAT_TYPE(newType->type))) { + commonType->bytes += TYPE_BYTES[TSDB_DATA_TYPE_DOUBLE]; + } + commonType->type = resultType; + return TSDB_CODE_SUCCESS; + +} + static EDealRes translateCaseWhen(STranslateContext* pCxt, SCaseWhenNode* pCaseWhen) { - bool first = true; bool allNullThen = true; SNode* pNode = NULL; FOREACH(pNode, pCaseWhen->pWhenThenList) { @@ -3313,10 +3349,18 @@ static EDealRes translateCaseWhen(STranslateContext* pCxt, SCaseWhenNode* pCaseW continue; } allNullThen = false; - if (first || dataTypeComp(&pCaseWhen->node.resType, &pThenExpr->resType) < 0) { - pCaseWhen->node.resType = pThenExpr->resType; + pCxt->errCode = selectCommonType(&pCaseWhen->node.resType, &pThenExpr->resType); + if(TSDB_CODE_SUCCESS != pCxt->errCode){ + return DEAL_RES_ERROR; + } + } + + SExprNode* pElseExpr = (SExprNode*)pCaseWhen->pElse; + if (NULL != pElseExpr) { + pCxt->errCode = selectCommonType(&pCaseWhen->node.resType, &pElseExpr->resType); + if(TSDB_CODE_SUCCESS != pCxt->errCode) { + return DEAL_RES_ERROR; } - first = false; } if (allNullThen) { diff --git a/source/libs/planner/src/planLogicCreater.c b/source/libs/planner/src/planLogicCreater.c index 40cd415cb9..c579b66511 100644 --- a/source/libs/planner/src/planLogicCreater.c +++ b/source/libs/planner/src/planLogicCreater.c @@ -1279,71 +1279,139 @@ static int32_t createWindowLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSele return TSDB_CODE_FAILED; } +typedef struct SCollectFillExprsCtx { + SHashObj* pPseudoCols; + SNodeList* pFillExprs; + SNodeList* pNotFillExprs; + bool collectAggFuncs; + SNodeList* pAggFuncCols; +} SCollectFillExprsCtx; + +typedef struct SWalkFillSubExprCtx { + bool hasFillCol; + bool hasPseudoWinCol; + bool hasGroupKeyCol; + SCollectFillExprsCtx* pCollectFillCtx; + int32_t code; +} SWalkFillSubExprCtx; + +static bool nodeAlreadyContained(SNodeList* pList, SNode* pNode) { + SNode* pExpr = NULL; + FOREACH(pExpr, pList) { + if (nodesEqualNode(pExpr, pNode)) { + return true; + } + } + return false; +} + static EDealRes needFillValueImpl(SNode* pNode, void* pContext) { + SWalkFillSubExprCtx *pCtx = pContext; + EDealRes res = DEAL_RES_CONTINUE; if (QUERY_NODE_COLUMN == nodeType(pNode)) { SColumnNode* pCol = (SColumnNode*)pNode; - if (COLUMN_TYPE_WINDOW_START != pCol->colType && COLUMN_TYPE_WINDOW_END != pCol->colType && - COLUMN_TYPE_WINDOW_DURATION != pCol->colType && COLUMN_TYPE_GROUP_KEY != pCol->colType) { - *(bool*)pContext = true; - return DEAL_RES_END; + if (COLUMN_TYPE_WINDOW_START == pCol->colType || COLUMN_TYPE_WINDOW_END == pCol->colType || + COLUMN_TYPE_WINDOW_DURATION == pCol->colType) { + pCtx->hasPseudoWinCol = true; + pCtx->code = + taosHashPut(pCtx->pCollectFillCtx->pPseudoCols, pCol->colName, TSDB_COL_NAME_LEN, &pNode, POINTER_BYTES); + } else if (COLUMN_TYPE_GROUP_KEY == pCol->colType || COLUMN_TYPE_TBNAME == pCol->colType || + COLUMN_TYPE_TAG == pCol->colType) { + pCtx->hasGroupKeyCol = true; + pCtx->code = + taosHashPut(pCtx->pCollectFillCtx->pPseudoCols, pCol->colName, TSDB_COL_NAME_LEN, &pNode, POINTER_BYTES); + } else { + pCtx->hasFillCol = true; + if (pCtx->pCollectFillCtx->collectAggFuncs) { + // Agg funcs has already been rewriten to columns by Interval + // Here, we return DEAL_RES_CONTINUE cause we need to collect all agg funcs + if (!nodeAlreadyContained(pCtx->pCollectFillCtx->pFillExprs, pNode) && + !nodeAlreadyContained(pCtx->pCollectFillCtx->pAggFuncCols, pNode)) + pCtx->code = nodesListMakeStrictAppend(&pCtx->pCollectFillCtx->pAggFuncCols, pNode); + } else { + res = DEAL_RES_END; + } } } - return DEAL_RES_CONTINUE; + if (pCtx->code != TSDB_CODE_SUCCESS) res = DEAL_RES_ERROR; + return res; } -static bool needFillValue(SNode* pNode) { - bool hasFillCol = false; - nodesWalkExpr(pNode, needFillValueImpl, &hasFillCol); - return hasFillCol; +static void needFillValue(SNode* pNode, SWalkFillSubExprCtx* pCtx) { + nodesWalkExpr(pNode, needFillValueImpl, pCtx); } -static int32_t partFillExprs(SSelectStmt* pSelect, SNodeList** pFillExprs, SNodeList** pNotFillExprs) { - int32_t code = TSDB_CODE_SUCCESS; - SNode* pProject = NULL; - FOREACH(pProject, pSelect->pProjectionList) { - if (needFillValue(pProject)) { - SNode* pNew = NULL; - code = nodesCloneNode(pProject, &pNew); - if (TSDB_CODE_SUCCESS == code) { - code = nodesListMakeStrictAppend(pFillExprs, pNew); - } - } else if (QUERY_NODE_VALUE != nodeType(pProject)) { - SNode* pNew = NULL; - code = nodesCloneNode(pProject, &pNew); - if (TSDB_CODE_SUCCESS == code) { - code = nodesListMakeStrictAppend(pNotFillExprs, pNew); - } +static int32_t collectFillExpr(SNode* pNode, SCollectFillExprsCtx* pCollectFillCtx) { + SNode* pNew = NULL; + SWalkFillSubExprCtx collectFillSubExprCtx = { + .hasFillCol = false, .hasPseudoWinCol = false, .hasGroupKeyCol = false, .pCollectFillCtx = pCollectFillCtx}; + needFillValue(pNode, &collectFillSubExprCtx); + if (collectFillSubExprCtx.code != TSDB_CODE_SUCCESS) { + return collectFillSubExprCtx.code; + } + + if (collectFillSubExprCtx.hasFillCol && !pCollectFillCtx->collectAggFuncs) { + if (nodeType(pNode) == QUERY_NODE_ORDER_BY_EXPR) { + collectFillSubExprCtx.code = nodesCloneNode(((SOrderByExprNode*)pNode)->pExpr, &pNew); + } else { + collectFillSubExprCtx.code = nodesCloneNode(pNode, &pNew); } - if (TSDB_CODE_SUCCESS != code) { - NODES_DESTORY_LIST(*pFillExprs); - NODES_DESTORY_LIST(*pNotFillExprs); - break; + if (collectFillSubExprCtx.code == TSDB_CODE_SUCCESS) { + collectFillSubExprCtx.code = nodesListMakeStrictAppend(&pCollectFillCtx->pFillExprs, pNew); } } - if (!pSelect->isDistinct) { - SNode* pOrderExpr = NULL; - FOREACH(pOrderExpr, pSelect->pOrderByList) { - SNode* pExpr = ((SOrderByExprNode*)pOrderExpr)->pExpr; - if (needFillValue(pExpr)) { - SNode* pNew = NULL; - code = nodesCloneNode(pExpr, &pNew); - if (TSDB_CODE_SUCCESS == code) { - code = nodesListMakeStrictAppend(pFillExprs, pNew); - } - } else if (QUERY_NODE_VALUE != nodeType(pExpr)) { - SNode* pNew = NULL; - code = nodesCloneNode(pExpr, &pNew); - if (TSDB_CODE_SUCCESS == code) { - code = nodesListMakeStrictAppend(pNotFillExprs, pNew); - } + return collectFillSubExprCtx.code; +} + +static int32_t collectFillExprs(SSelectStmt* pSelect, SNodeList** pFillExprs, SNodeList** pNotFillExprs, + SNodeList** pPossibleFillNullCols) { + int32_t code = TSDB_CODE_SUCCESS; + SCollectFillExprsCtx collectFillCtx = {0}; + SNode* pNode = NULL; + collectFillCtx.pPseudoCols = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); + if (!collectFillCtx.pPseudoCols) return terrno; + + FOREACH(pNode, pSelect->pProjectionList) { + code = collectFillExpr(pNode, &collectFillCtx); + if (code != TSDB_CODE_SUCCESS) break; + } + collectFillCtx.collectAggFuncs = true; + if (code == TSDB_CODE_SUCCESS) { + code = collectFillExpr(pSelect->pHaving, &collectFillCtx); + } + if (code == TSDB_CODE_SUCCESS) { + FOREACH(pNode, pSelect->pOrderByList) { + code = collectFillExpr(pNode, &collectFillCtx); + if (code != TSDB_CODE_SUCCESS) break; + } + } + if (code == TSDB_CODE_SUCCESS) { + void* pIter = taosHashIterate(collectFillCtx.pPseudoCols, 0); + while (pIter) { + SNode* pNode = *(SNode**)pIter, *pNew = NULL; + code = nodesCloneNode(pNode, &pNew); + if (code == TSDB_CODE_SUCCESS) { + code = nodesListMakeStrictAppend(&collectFillCtx.pNotFillExprs, pNew); } - if (TSDB_CODE_SUCCESS != code) { - NODES_DESTORY_LIST(*pFillExprs); - NODES_DESTORY_LIST(*pNotFillExprs); + if (code == TSDB_CODE_SUCCESS) { + pIter = taosHashIterate(collectFillCtx.pPseudoCols, pIter); + } else { + taosHashCancelIterate(collectFillCtx.pPseudoCols, pIter); break; } } + if (code == TSDB_CODE_SUCCESS) { + TSWAP(*pFillExprs, collectFillCtx.pFillExprs); + TSWAP(*pNotFillExprs, collectFillCtx.pNotFillExprs); + TSWAP(*pPossibleFillNullCols, collectFillCtx.pAggFuncCols); + } } + if (code != TSDB_CODE_SUCCESS) { + if (collectFillCtx.pFillExprs) nodesDestroyList(collectFillCtx.pFillExprs); + if (collectFillCtx.pNotFillExprs) nodesDestroyList(collectFillCtx.pNotFillExprs); + if (collectFillCtx.pAggFuncCols) nodesDestroyList(collectFillCtx.pAggFuncCols); + } + taosHashCleanup(collectFillCtx.pPseudoCols); return code; } @@ -1369,13 +1437,16 @@ static int32_t createFillLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect pFill->node.resultDataOrder = pFill->node.requireDataOrder; pFill->node.inputTsOrder = TSDB_ORDER_ASC; - code = partFillExprs(pSelect, &pFill->pFillExprs, &pFill->pNotFillExprs); + code = collectFillExprs(pSelect, &pFill->pFillExprs, &pFill->pNotFillExprs, &pFill->pFillNullExprs); if (TSDB_CODE_SUCCESS == code) { code = rewriteExprsForSelect(pFill->pFillExprs, pSelect, SQL_CLAUSE_FILL, NULL); } if (TSDB_CODE_SUCCESS == code) { code = rewriteExprsForSelect(pFill->pNotFillExprs, pSelect, SQL_CLAUSE_FILL, NULL); } + if (TSDB_CODE_SUCCESS == code && LIST_LENGTH(pFill->pFillNullExprs) > 0) { + code = createColumnByRewriteExprs(pFill->pFillNullExprs, &pFill->node.pTargets); + } if (TSDB_CODE_SUCCESS == code) { code = createColumnByRewriteExprs(pFill->pFillExprs, &pFill->node.pTargets); } diff --git a/source/libs/planner/src/planPhysiCreater.c b/source/libs/planner/src/planPhysiCreater.c index 738ccf3224..f05966802b 100644 --- a/source/libs/planner/src/planPhysiCreater.c +++ b/source/libs/planner/src/planPhysiCreater.c @@ -2605,6 +2605,12 @@ static int32_t createFillPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren if (TSDB_CODE_SUCCESS == code) { code = addDataBlockSlots(pCxt, pFill->pNotFillExprs, pFill->node.pOutputDataBlockDesc); } + if (TSDB_CODE_SUCCESS == code && LIST_LENGTH(pFillNode->pFillNullExprs) > 0) { + code = setListSlotId(pCxt, pChildTupe->dataBlockId, -1, pFillNode->pFillNullExprs, &pFill->pFillNullExprs); + if (TSDB_CODE_SUCCESS == code ) { + code = addDataBlockSlots(pCxt, pFill->pFillNullExprs, pFill->node.pOutputDataBlockDesc); + } + } if (TSDB_CODE_SUCCESS == code) { code = setNodeSlotId(pCxt, pChildTupe->dataBlockId, -1, pFillNode->pWStartTs, &pFill->pWStartTs); diff --git a/source/libs/qworker/CMakeLists.txt b/source/libs/qworker/CMakeLists.txt index 7a984cd000..5c5eafdbc5 100644 --- a/source/libs/qworker/CMakeLists.txt +++ b/source/libs/qworker/CMakeLists.txt @@ -8,8 +8,8 @@ target_include_directories( ) TARGET_LINK_LIBRARIES(qworker - PRIVATE os util transport nodes planner qcom executor index - ) + PRIVATE os util transport nodes planner qcom executor index +) if(${BUILD_TEST}) ADD_SUBDIRECTORY(test) diff --git a/source/libs/qworker/src/qwMsg.c b/source/libs/qworker/src/qwMsg.c index 0011d1c70c..69014d5b1c 100644 --- a/source/libs/qworker/src/qwMsg.c +++ b/source/libs/qworker/src/qwMsg.c @@ -502,6 +502,10 @@ int32_t qWorkerProcessQueryMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg, int } int32_t qWorkerProcessCQueryMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg, int64_t ts) { + if (NULL == node || NULL == qWorkerMgmt || NULL == pMsg) { + QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT); + } + int32_t code = 0; int8_t status = 0; bool queryDone = false; diff --git a/source/libs/qworker/src/qworker.c b/source/libs/qworker/src/qworker.c index 7180c58404..ddc4812b55 100644 --- a/source/libs/qworker/src/qworker.c +++ b/source/libs/qworker/src/qworker.c @@ -329,7 +329,7 @@ int32_t qwGetQueryResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, int32_t *dataLen, if (len < 0) { QW_TASK_ELOG("invalid length from dsGetDataLength, length:%" PRId64 "", len); - QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT); + QW_ERR_JRET(TSDB_CODE_QRY_INVALID_INPUT); } if (len == 0) { @@ -337,18 +337,18 @@ int32_t qwGetQueryResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, int32_t *dataLen, code = dsGetDataBlock(ctx->sinkHandle, &output); if (code) { QW_TASK_ELOG("dsGetDataBlock failed, code:%x - %s", code, tstrerror(code)); - QW_ERR_RET(code); + QW_ERR_JRET(code); } QW_TASK_DLOG("no more data in sink and query end, fetched blocks %d rows %" PRId64, pOutput->numOfBlocks, pOutput->numOfRows); if (!ctx->dynamicTask) { - QW_ERR_RET(qwUpdateTaskStatus(QW_FPARAMS(), JOB_TASK_STATUS_SUCC, ctx->dynamicTask)); + QW_ERR_JRET(qwUpdateTaskStatus(QW_FPARAMS(), JOB_TASK_STATUS_SUCC, ctx->dynamicTask)); } if (NULL == pRsp) { - QW_ERR_RET(qwMallocFetchRsp(!ctx->localExec, len, &pRsp)); + QW_ERR_JRET(qwMallocFetchRsp(!ctx->localExec, len, &pRsp)); *pOutput = output; } else { pOutput->queryEnd = output.queryEnd; @@ -368,7 +368,7 @@ int32_t qwGetQueryResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, int32_t *dataLen, *dataLen += len + PAYLOAD_PREFIX_LEN; *pRawDataLen += rawLen + PAYLOAD_PREFIX_LEN; - QW_ERR_RET(qwMallocFetchRsp(!ctx->localExec, *dataLen, &pRsp)); + QW_ERR_JRET(qwMallocFetchRsp(!ctx->localExec, *dataLen, &pRsp)); // set the serialize start position output.pData = pRsp->data + *dataLen - (len + PAYLOAD_PREFIX_LEN); @@ -380,7 +380,7 @@ int32_t qwGetQueryResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, int32_t *dataLen, code = dsGetDataBlock(ctx->sinkHandle, &output); if (code) { QW_TASK_ELOG("dsGetDataBlock failed, code:%x - %s", code, tstrerror(code)); - QW_ERR_RET(code); + QW_ERR_JRET(code); } pOutput->queryEnd = output.queryEnd; @@ -399,7 +399,7 @@ int32_t qwGetQueryResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, int32_t *dataLen, if (DS_BUF_EMPTY == pOutput->bufStatus && pOutput->queryEnd) { QW_TASK_DLOG("task all data fetched and done, fetched blocks %d rows %" PRId64, pOutput->numOfBlocks, pOutput->numOfRows); - QW_ERR_RET(qwUpdateTaskStatus(QW_FPARAMS(), JOB_TASK_STATUS_SUCC, ctx->dynamicTask)); + QW_ERR_JRET(qwUpdateTaskStatus(QW_FPARAMS(), JOB_TASK_STATUS_SUCC, ctx->dynamicTask)); break; } @@ -416,8 +416,11 @@ int32_t qwGetQueryResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, int32_t *dataLen, } } +_return: + *rspMsg = pRsp; - return TSDB_CODE_SUCCESS; + + return code; } int32_t qwGetDeleteResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, SDeleteRes *pRes) { @@ -472,6 +475,12 @@ int32_t qwQuickRspFetchReq(QW_FPARAMS_DEF, SQWTaskCtx *ctx, SQWMsg *qwMsg, int32 code = qwGetQueryResFromSink(QW_FPARAMS(), ctx, &dataLen, &rawLen, &rsp, &sOutput); } + if (code) { + qwFreeFetchRsp(rsp); + rsp = NULL; + dataLen = 0; + } + if (NULL == rsp && TSDB_CODE_SUCCESS == code) { return TSDB_CODE_SUCCESS; } @@ -877,10 +886,11 @@ int32_t qwProcessCQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg) { break; } + qwFreeFetchRsp(rsp); + rsp = NULL; + if (code && QW_EVENT_RECEIVED(ctx, QW_EVENT_FETCH)) { QW_SET_EVENT_PROCESSED(ctx, QW_EVENT_FETCH); - qwFreeFetchRsp(rsp); - rsp = NULL; qwMsg->connInfo = ctx->dataConnInfo; code = qwBuildAndSendFetchRsp(ctx->fetchMsgType + 1, &qwMsg->connInfo, NULL, 0, code); @@ -1432,6 +1442,8 @@ void qWorkerDestroy(void **qWorkerMgmt) { while (0 == destroyed) { taosMsleep(2); } + + *qWorkerMgmt = NULL; } int32_t qWorkerGetStat(SReadHandle *handle, void *qWorkerMgmt, SQWorkerStat *pStat) { diff --git a/source/libs/scalar/src/sclvector.c b/source/libs/scalar/src/sclvector.c index a086d1f367..54794b9044 100644 --- a/source/libs/scalar/src/sclvector.c +++ b/source/libs/scalar/src/sclvector.c @@ -1030,6 +1030,31 @@ int8_t gConvertTypes[TSDB_DATA_TYPE_MAX][TSDB_DATA_TYPE_MAX] = { /*MEDB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, /*GEOM*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0}; +int8_t gDisplyTypes[TSDB_DATA_TYPE_MAX][TSDB_DATA_TYPE_MAX] = { + /*NULL BOOL TINY SMAL INT BIGI FLOA DOUB VARC TIME NCHA UTINY USMA UINT UBIG JSON VARB DECI BLOB MEDB GEOM*/ + /*NULL*/ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, -1, -1, -1, 8, + /*BOOL*/ 0, 1, 2, 3, 4, 5, 6, 7, 8, 5, 10, 11, 12, 13, 14, 8, -1, -1, -1, -1, 8, + /*TINY*/ 0, 0, 2, 3, 4, 5, 8, 8, 8, 5, 10, 3, 4, 5, 8, 8, -1, -1, -1, -1, 8, + /*SMAL*/ 0, 0, 0, 3, 4, 5, 8, 8, 8, 5, 10, 3, 4, 5, 8, 8, -1, -1, -1, -1, 8, + /*INT */ 0, 0, 0, 0, 4, 5, 8, 8, 8, 5, 10, 4, 4, 5, 8, 8, -1, -1, -1, -1, 8, + /*BIGI*/ 0, 0, 0, 0, 0, 5, 8, 8, 8, 5, 10, 5, 5, 5, 8, 8, -1, -1, -1, -1, 8, + /*FLOA*/ 0, 0, 0, 0, 0, 0, 6, 7, 8, 8, 10, 8, 8, 8, 8, 8, -1, -1, -1, -1, 8, + /*DOUB*/ 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 10, 8, 8, 8, 8, 8, -1, -1, -1, -1, 8, + /*VARC*/ 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 10, 8, 8, 8, 8, 8, -1, -1, -1, -1, 8, + /*TIME*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 5, 5, 5, 8, 8, -1, -1, -1, -1, 8, + /*NCHA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, -1, -1, -1, -1, 10, + /*UTINY*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, 14, 8, -1, -1, -1, -1, 8, + /*USMA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 14, 8, -1, -1, -1, -1, 8, + /*UINT*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 8, -1, -1, -1, -1, 8, + /*UBIG*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, -1, -1, -1, -1, 8, + /*JSON*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, -1, -1, -1, -1, 8, + /*VARB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, -1, -1, -1, -1, + /*DECI*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, + /*BLOB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, + /*MEDB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, + /*GEOM*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20 +}; + int32_t vectorGetConvertType(int32_t type1, int32_t type2) { if (type1 == type2) { return 0; diff --git a/source/libs/scheduler/CMakeLists.txt b/source/libs/scheduler/CMakeLists.txt index fafc2a27e0..c07d267f97 100644 --- a/source/libs/scheduler/CMakeLists.txt +++ b/source/libs/scheduler/CMakeLists.txt @@ -13,5 +13,5 @@ target_link_libraries( ) if(${BUILD_TEST}) - ADD_SUBDIRECTORY(test) + ADD_SUBDIRECTORY(test) endif(${BUILD_TEST}) diff --git a/source/libs/stream/CMakeLists.txt b/source/libs/stream/CMakeLists.txt index b63a8b3900..bb2a23b106 100644 --- a/source/libs/stream/CMakeLists.txt +++ b/source/libs/stream/CMakeLists.txt @@ -1,61 +1,59 @@ aux_source_directory(src STREAM_SRC) add_library(stream STATIC ${STREAM_SRC}) target_include_directories( - stream - PUBLIC "${TD_SOURCE_DIR}/include/libs/stream" - PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" + stream + PUBLIC "${TD_SOURCE_DIR}/include/libs/stream" + PUBLIC "${TD_SOURCE_DIR}/include/libs/tcs" + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" ) - if(${BUILD_WITH_ROCKSDB}) - if (${BUILD_CONTRIB}) + if(${BUILD_CONTRIB}) target_link_libraries( stream - PUBLIC rocksdb tdb - PRIVATE os util transport qcom executor wal index + PUBLIC rocksdb tdb tcs + PRIVATE os util transport qcom executor wal index ) target_include_directories( stream PUBLIC "${TD_SOURCE_DIR}/contrib/rocksdb/include" ) else() - if (TD_LINUX) + if(TD_LINUX) target_include_directories( - stream - PUBLIC "${TD_SOURCE_DIR}/deps/${TD_DEPS_DIR}/rocksdb_static" - ) - target_link_directories( - stream - PUBLIC "${TD_SOURCE_DIR}/deps/${TD_DEPS_DIR}/rocksdb_static" - ) - target_link_libraries( - stream - PUBLIC rocksdb tdb - PRIVATE os util transport qcom executor wal index - ) - else() + stream + PUBLIC "${TD_SOURCE_DIR}/deps/${TD_DEPS_DIR}/rocksdb_static" + ) + target_link_directories( + stream + PUBLIC "${TD_SOURCE_DIR}/deps/${TD_DEPS_DIR}/rocksdb_static" + ) target_link_libraries( stream - PUBLIC rocksdb tdb - PRIVATE os util transport qcom executor wal index + PUBLIC rocksdb tdb tcs + PRIVATE os util transport qcom executor wal index + ) + else() + target_link_libraries( + stream + PUBLIC rocksdb tdb tcs + PRIVATE os util transport qcom executor wal index ) target_include_directories( stream PUBLIC "${TD_SOURCE_DIR}/contrib/rocksdb/include" ) endif() - endif() + endif() + add_definitions(-DUSE_ROCKSDB) endif(${BUILD_WITH_ROCKSDB}) - -#target_link_libraries( -# stream -# PUBLIC tdb -# PRIVATE os util transport qcom executor -#) - +# target_link_libraries( +# stream +# PUBLIC tdb +# PRIVATE os util transport qcom executor +# ) if(${BUILD_TEST}) - ADD_SUBDIRECTORY(test) + ADD_SUBDIRECTORY(test) endif(${BUILD_TEST}) - diff --git a/source/libs/stream/src/streamCheckpoint.c b/source/libs/stream/src/streamCheckpoint.c index be914d9746..302090bb37 100644 --- a/source/libs/stream/src/streamCheckpoint.c +++ b/source/libs/stream/src/streamCheckpoint.c @@ -13,10 +13,10 @@ * along with this program. If not, see . */ -#include "cos.h" #include "rsync.h" #include "streamBackendRocksdb.h" #include "streamInt.h" +#include "tcs.h" static int32_t downloadCheckpointDataByName(const char* id, const char* fname, const char* dstName); static int32_t deleteCheckpointFile(const char* id, const char* name); @@ -343,7 +343,7 @@ int32_t streamProcessCheckpointTriggerBlock(SStreamTask* pTask, SStreamDataBlock // And if we don't start a new timer, and the lost of checkpoint-trigger message may cause the whole checkpoint // procedure to be stucked. SStreamTmrInfo* pTmrInfo = &pActiveInfo->chkptTriggerMsgTmr; - int8_t old = atomic_val_compare_exchange_8(&pTmrInfo->isActive, 0, 1); + int8_t old = atomic_val_compare_exchange_8(&pTmrInfo->isActive, 0, 1); if (old == 0) { int32_t ref = atomic_add_fetch_32(&pTask->status.timerActive, 1); stDebug("s-task:%s start checkpoint-trigger monitor in 10s, ref:%d ", pTask->id.idStr, ref); @@ -352,7 +352,7 @@ int32_t streamProcessCheckpointTriggerBlock(SStreamTask* pTask, SStreamDataBlock streamTmrStart(checkpointTriggerMonitorFn, 200, pTask, streamTimer, &pTmrInfo->tmrHandle, vgId, "trigger-recv-monitor"); pTmrInfo->launchChkptId = pActiveInfo->activeId; - } else { // already launched, do nothing + } else { // already launched, do nothing stError("s-task:%s previous checkpoint-trigger monitor tmr is set, not start new one", pTask->id.idStr); } } @@ -373,10 +373,10 @@ int32_t streamProcessCheckpointTriggerBlock(SStreamTask* pTask, SStreamDataBlock if (type == TASK_OUTPUT__FIXED_DISPATCH || type == TASK_OUTPUT__SHUFFLE_DISPATCH) { stDebug("s-task:%s set childIdx:%d, and add checkpoint-trigger block into outputQ", id, pTask->info.selfChildId); - code = continueDispatchCheckpointTriggerBlock(pBlock, pTask); // todo handle this failure + code = continueDispatchCheckpointTriggerBlock(pBlock, pTask); // todo handle this failure } else { // only one task exists, no need to dispatch downstream info - code = appendCheckpointIntoInputQ(pTask, STREAM_INPUT__CHECKPOINT, pActiveInfo->activeId, pActiveInfo->transId, - -1); + code = + appendCheckpointIntoInputQ(pTask, STREAM_INPUT__CHECKPOINT, pActiveInfo->activeId, pActiveInfo->transId, -1); streamFreeQitem((SStreamQueueItem*)pBlock); } } else if (taskLevel == TASK_LEVEL__SINK || taskLevel == TASK_LEVEL__AGG) { @@ -399,8 +399,8 @@ int32_t streamProcessCheckpointTriggerBlock(SStreamTask* pTask, SStreamDataBlock if (taskLevel == TASK_LEVEL__SINK) { stDebug("s-task:%s process checkpoint-trigger block, all %d upstreams sent, send ready msg to upstream", id, num); streamFreeQitem((SStreamQueueItem*)pBlock); - code = streamTaskBuildCheckpoint(pTask); // todo: not handle error yet - } else { // source & agg tasks need to forward the checkpoint msg downwards + code = streamTaskBuildCheckpoint(pTask); // todo: not handle error yet + } else { // source & agg tasks need to forward the checkpoint msg downwards stDebug("s-task:%s process checkpoint-trigger block, all %d upstreams sent, forwards to downstream", id, num); code = flushStateDataInExecutor(pTask, (SStreamQueueItem*)pBlock); if (code) { @@ -445,7 +445,7 @@ static int32_t processCheckpointReadyHelp(SActiveCheckpointInfo* pInfo, int32_t .transId = pInfo->transId, .streamId = streamId, .downstreamNodeId = downstreamNodeId}; - void* p = taosArrayPush(pInfo->pCheckpointReadyRecvList, &info); + void* p = taosArrayPush(pInfo->pCheckpointReadyRecvList, &info); if (p == NULL) { stError("s-task:%s failed to set checkpoint ready recv msg, code:%s", id, tstrerror(terrno)); return terrno; @@ -560,8 +560,8 @@ void streamTaskClearCheckInfo(SStreamTask* pTask, bool clearChkpReadyMsg) { } streamMutexUnlock(&pInfo->lock); - stDebug("s-task:%s clear active checkpointInfo, failed checkpointId:%"PRId64", current checkpointId:%"PRId64, - pTask->id.idStr, pInfo->failedId, pTask->chkInfo.checkpointId); + stDebug("s-task:%s clear active checkpointInfo, failed checkpointId:%" PRId64 ", current checkpointId:%" PRId64, + pTask->id.idStr, pInfo->failedId, pTask->chkInfo.checkpointId); } int32_t streamTaskUpdateTaskCheckpointInfo(SStreamTask* pTask, bool restored, SVUpdateCheckpointInfoReq* pReq) { @@ -575,8 +575,7 @@ int32_t streamTaskUpdateTaskCheckpointInfo(SStreamTask* pTask, bool restored, SV if (pReq->checkpointId <= pInfo->checkpointId) { stDebug("s-task:%s vgId:%d latest checkpointId:%" PRId64 " Ver:%" PRId64 - " no need to update checkpoint info, updated checkpointId:%" PRId64 " Ver:%" PRId64 - " transId:%d ignored", + " no need to update checkpoint info, updated checkpointId:%" PRId64 " Ver:%" PRId64 " transId:%d ignored", id, vgId, pInfo->checkpointId, pInfo->checkpointVer, pReq->checkpointId, pReq->checkpointVer, pReq->transId); streamMutexUnlock(&pTask->lock); @@ -623,7 +622,7 @@ int32_t streamTaskUpdateTaskCheckpointInfo(SStreamTask* pTask, bool restored, SV } bool valid = (pInfo->checkpointId <= pReq->checkpointId && pInfo->checkpointVer <= pReq->checkpointVer && - pInfo->processedVer <= pReq->checkpointVer); + pInfo->processedVer <= pReq->checkpointVer); if (!valid) { stFatal("invalid checkpoint id check, current checkpointId:%" PRId64 " checkpointVer:%" PRId64 @@ -908,7 +907,7 @@ static int32_t doChkptStatusCheck(SStreamTask* pTask) { if (pTmrInfo->launchChkptId != pActiveInfo->activeId) { int32_t ref = streamCleanBeforeQuitTmr(pTmrInfo, pTask); stWarn("s-task:%s vgId:%d checkpoint-trigger retrieve by previous checkpoint procedure, checkpointId:%" PRId64 - ", quit, ref:%d", + ", quit, ref:%d", id, vgId, pTmrInfo->launchChkptId, ref); return -1; } @@ -1005,7 +1004,7 @@ void checkpointTriggerMonitorFn(void* param, void* tmrId) { int32_t numOfNotSend = 0; SActiveCheckpointInfo* pActiveInfo = pTask->chkInfo.pActiveInfo; - SStreamTmrInfo* pTmrInfo = &pActiveInfo->chkptTriggerMsgTmr; + SStreamTmrInfo* pTmrInfo = &pActiveInfo->chkptTriggerMsgTmr; if (pTask->info.taskLevel == TASK_LEVEL__SOURCE) { int32_t ref = streamCleanBeforeQuitTmr(pTmrInfo, pTask); @@ -1023,7 +1022,8 @@ void checkpointTriggerMonitorFn(void* param, void* tmrId) { } if (++pTmrInfo->activeCounter < 50) { - streamTmrStart(checkpointTriggerMonitorFn, 200, pTask, streamTimer, &pTmrInfo->tmrHandle, vgId, "trigger-recv-monitor"); + streamTmrStart(checkpointTriggerMonitorFn, 200, pTask, streamTimer, &pTmrInfo->tmrHandle, vgId, + "trigger-recv-monitor"); return; } @@ -1201,8 +1201,8 @@ int32_t streamTaskInitTriggerDispatchInfo(SStreamTask* pTask) { STaskDispatcherFixed* pDispatch = &pTask->outputInfo.fixedDispatcher; STaskTriggerSendInfo p = {.sendTs = now, .recved = false, .nodeId = pDispatch->nodeId, .taskId = pDispatch->taskId}; - void* px = taosArrayPush(pInfo->pDispatchTriggerList, &p); - if (px == NULL) { // pause the stream task, if memory not enough + void* px = taosArrayPush(pInfo->pDispatchTriggerList, &p); + if (px == NULL) { // pause the stream task, if memory not enough code = terrno; } } else { @@ -1213,8 +1213,8 @@ int32_t streamTaskInitTriggerDispatchInfo(SStreamTask* pTask) { } STaskTriggerSendInfo p = {.sendTs = now, .recved = false, .nodeId = pVgInfo->vgId, .taskId = pVgInfo->taskId}; - void* px = taosArrayPush(pInfo->pDispatchTriggerList, &p); - if (px == NULL) { // pause the stream task, if memory not enough + void* px = taosArrayPush(pInfo->pDispatchTriggerList, &p); + if (px == NULL) { // pause the stream task, if memory not enough code = terrno; break; } @@ -1288,11 +1288,11 @@ void streamTaskSetTriggerDispatchConfirmed(SStreamTask* pTask, int32_t vgId) { static int32_t uploadCheckpointToS3(const char* id, const char* path) { int32_t code = 0; int32_t nBytes = 0; - + /* if (s3Init() != 0) { return TSDB_CODE_THIRDPARTY_ERROR; } - + */ TdDirPtr pDir = taosOpenDir(path); if (pDir == NULL) { return terrno; @@ -1325,11 +1325,11 @@ static int32_t uploadCheckpointToS3(const char* id, const char* path) { break; } - code = s3PutObjectFromFile2(filename, object, 0); + code = tcsPutObjectFromFile2(filename, object, 0); if (code != 0) { - stError("[s3] failed to upload checkpoint:%s, reason:%s", filename, tstrerror(code)); + stError("[tcs] failed to upload checkpoint:%s, reason:%s", filename, tstrerror(code)); } else { - stDebug("[s3] upload checkpoint:%s", filename); + stDebug("[tcs] upload checkpoint:%s", filename); } } @@ -1355,7 +1355,7 @@ int32_t downloadCheckpointByNameS3(const char* id, const char* fname, const char taosMemoryFree(buf); return TSDB_CODE_OUT_OF_RANGE; } - int32_t code = s3GetObjectToFile(buf, dstName); + int32_t code = tcsGetObjectToFile(buf, dstName); if (code != 0) { taosMemoryFree(buf); return TAOS_SYSTEM_ERROR(errno); @@ -1418,7 +1418,7 @@ int32_t streamTaskDownloadCheckpointData(const char* id, char* path, int64_t che if (strlen(tsSnodeAddress) != 0) { return downloadByRsync(id, path, checkpointId); } else if (tsS3StreamEnabled) { - return s3GetObjectsByPrefix(id, path); + return tcsGetObjectsByPrefix(id, path); } return 0; @@ -1432,7 +1432,7 @@ int32_t deleteCheckpoint(const char* id) { if (strlen(tsSnodeAddress) != 0) { return deleteRsync(id); } else if (tsS3StreamEnabled) { - s3DeleteObjectsByPrefix(id); + tcsDeleteObjectsByPrefix(id); } return 0; } @@ -1446,7 +1446,7 @@ int32_t deleteCheckpointFile(const char* id, const char* name) { } char* tmp = object; - int32_t code = s3DeleteObjects((const char**)&tmp, 1); + int32_t code = tcsDeleteObjects((const char**)&tmp, 1); if (code != 0) { return TSDB_CODE_THIRDPARTY_ERROR; } @@ -1488,4 +1488,4 @@ int32_t streamTaskSendCheckpointsourceRsp(SStreamTask* pTask) { streamMutexUnlock(&pTask->lock); return code; -} \ No newline at end of file +} diff --git a/source/libs/stream/test/CMakeLists.txt b/source/libs/stream/test/CMakeLists.txt index c472207b27..ed66563225 100644 --- a/source/libs/stream/test/CMakeLists.txt +++ b/source/libs/stream/test/CMakeLists.txt @@ -1,81 +1,77 @@ - - # bloomFilterTest -#TARGET_LINK_LIBRARIES(streamUpdateTest - #PUBLIC os util common gtest gtest_main stream executor index - #) +# TARGET_LINK_LIBRARIES(streamUpdateTest +# PUBLIC os util common gtest gtest_main stream executor index +# ) -#TARGET_INCLUDE_DIRECTORIES( - #streamUpdateTest - #PUBLIC "${TD_SOURCE_DIR}/include/libs/stream/" - #PRIVATE "${TD_SOURCE_DIR}/source/libs/stream/inc" -#) +# TARGET_INCLUDE_DIRECTORIES( +# streamUpdateTest +# PUBLIC "${TD_SOURCE_DIR}/include/libs/stream/" +# PRIVATE "${TD_SOURCE_DIR}/source/libs/stream/inc" +# ) -#ADD_EXECUTABLE(checkpointTest checkpointTest.cpp) -#TARGET_LINK_LIBRARIES( - #checkpointTest - #PUBLIC os common gtest stream executor qcom index transport util -#) +# ADD_EXECUTABLE(checkpointTest checkpointTest.cpp) +# TARGET_LINK_LIBRARIES( +# checkpointTest +# PUBLIC os common gtest stream executor qcom index transport util +# ) -#TARGET_INCLUDE_DIRECTORIES( - #checkpointTest - #PRIVATE "${TD_SOURCE_DIR}/source/libs/stream/inc" -#) +# TARGET_INCLUDE_DIRECTORIES( +# checkpointTest +# PRIVATE "${TD_SOURCE_DIR}/source/libs/stream/inc" +# ) -#add_executable(backendTest "") +# add_executable(backendTest "") -#target_sources(backendTest - #PRIVATE - #"backendTest.cpp" -#) +# target_sources(backendTest +# PRIVATE +# "backendTest.cpp" +# ) -#TARGET_LINK_LIBRARIES( - #backendTest - #PUBLIC rocksdb - #PUBLIC os common gtest stream executor qcom index transport util -#) +# TARGET_LINK_LIBRARIES( +# backendTest +# PUBLIC rocksdb +# PUBLIC os common gtest stream executor qcom index transport util +# ) -#TARGET_INCLUDE_DIRECTORIES( - #backendTest - #PUBLIC "${TD_SOURCE_DIR}/include/libs/stream/" - #PRIVATE "${TD_SOURCE_DIR}/source/libs/stream/inc" -#) +# TARGET_INCLUDE_DIRECTORIES( +# backendTest +# PUBLIC "${TD_SOURCE_DIR}/include/libs/stream/" +# PRIVATE "${TD_SOURCE_DIR}/source/libs/stream/inc" +# ) -#add_test( - #NAME streamUpdateTest - #COMMAND streamUpdateTest -#) +# add_test( +# NAME streamUpdateTest +# COMMAND streamUpdateTest +# ) -#add_test( - #NAME checkpointTest - #COMMAND checkpointTest -#) -#add_test( - #NAME backendTest - #COMMAND backendTest -#) +# add_test( +# NAME checkpointTest +# COMMAND checkpointTest +# ) +# add_test( +# NAME backendTest +# COMMAND backendTest +# ) +# add_executable(backendTest "") -#add_executable(backendTest "") +# target_sources(backendTest +# PUBLIC +# "backendTest.cpp" +# ) -#target_sources(backendTest - #PUBLIC - #"backendTest.cpp" -#) - -#target_include_directories( - #backendTest - #PUBLIC "${TD_SOURCE_DIR}/include/libs/stream/" - #PRIVATE "${TD_SOURCE_DIR}/source/libs/stream/inc" -#) - -#target_link_libraries( - #backendTest - #PUBLIC rocksdb - #PUBLIC os common gtest stream executor qcom index transport util -#) +# target_include_directories( +# backendTest +# PUBLIC "${TD_SOURCE_DIR}/include/libs/stream/" +# PRIVATE "${TD_SOURCE_DIR}/source/libs/stream/inc" +# ) +# target_link_libraries( +# backendTest +# PUBLIC rocksdb +# PUBLIC os common gtest stream executor qcom index transport util +# ) MESSAGE(STATUS "build parser unit test") @@ -86,19 +82,19 @@ IF(NOT TD_DARWIN) ADD_EXECUTABLE(backendTest ${SOURCE_LIST}) TARGET_LINK_LIBRARIES( - backendTest - PUBLIC rocksdb - PUBLIC os common gtest stream executor qcom index transport util vnode + backendTest + PUBLIC rocksdb + PUBLIC os common gtest stream executor qcom index transport util vnode ) TARGET_INCLUDE_DIRECTORIES( - backendTest + backendTest PUBLIC "${TD_SOURCE_DIR}/include/libs/stream/" PRIVATE "${TD_SOURCE_DIR}/source/libs/stream/inc" ) ADD_TEST( - NAME backendTest - COMMAND backendTest + NAME backendTest + COMMAND backendTest ) -ENDIF () \ No newline at end of file +ENDIF() diff --git a/source/libs/tcs/CMakeLists.txt b/source/libs/tcs/CMakeLists.txt new file mode 100644 index 0000000000..95c167d737 --- /dev/null +++ b/source/libs/tcs/CMakeLists.txt @@ -0,0 +1,23 @@ +aux_source_directory(src TCS_SRC) + +add_library(tcs STATIC ${TCS_SRC}) +target_include_directories( + tcs + PUBLIC "${TD_SOURCE_DIR}/include/libs/tcs" + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" +) + +target_link_libraries( + tcs + PUBLIC az + PUBLIC common + + # PUBLIC cjson + # PUBLIC os + # PUBLIC util + # PUBLIC crypt +) + +if(${BUILD_TEST}) + add_subdirectory(test) +endif(${BUILD_TEST}) diff --git a/source/libs/tcs/inc/tcsInt.h b/source/libs/tcs/inc/tcsInt.h new file mode 100644 index 0000000000..b24a47aa98 --- /dev/null +++ b/source/libs/tcs/inc/tcsInt.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * 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. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef _TD_TCS_INT_H_ +#define _TD_TCS_INT_H_ + +#include "os.h" +#include "tarray.h" +#include "tdef.h" +#include "tlog.h" +#include "tmsg.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern int8_t tsS3Ablob; + +typedef enum { + TOS_PROTO_NIL, + TOS_PROTO_S3, + TOS_PROTO_ABLOB, +} STosProto; + +typedef struct { + int32_t (*Begin)(); + void (*End)(); + int32_t (*CheckCfg)(); + + int32_t (*PutObjectFromFileOffset)(const char* file, const char* object_name, int64_t offset, int64_t size); + int32_t (*GetObjectBlock)(const char* object_name, int64_t offset, int64_t size, bool check, uint8_t** ppBlock); + + void (*DeleteObjectsByPrefix)(const char* prefix); + + int32_t (*PutObjectFromFile2)(const char* file, const char* object, int8_t withcp); + int32_t (*GetObjectsByPrefix)(const char* prefix, const char* path); + int32_t (*DeleteObjects)(const char* object_name[], int nobject); + int32_t (*GetObjectToFile)(const char* object_name, const char* fileName); +} STcs; + +extern STcs tcs; + +#ifdef __cplusplus +} +#endif + +#endif // _TD_TCS_INT_H_ diff --git a/source/libs/tcs/src/tcs.c b/source/libs/tcs/src/tcs.c new file mode 100644 index 0000000000..a668eac60f --- /dev/null +++ b/source/libs/tcs/src/tcs.c @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * 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. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include "tcs.h" +#include "os.h" +#include "taoserror.h" +#include "tcsInt.h" +#include "tglobal.h" + +#include "az.h" +#include "cos.h" + +int32_t tcsInit() { + int32_t code = 0; + + STosProto proto = tsS3Ablob ? TOS_PROTO_ABLOB : TOS_PROTO_S3; + + if (TOS_PROTO_S3 == proto) { + tcs.Begin = s3Begin; + tcs.End = s3End; + tcs.CheckCfg = s3CheckCfg; + + tcs.PutObjectFromFileOffset = s3PutObjectFromFileOffset; + tcs.GetObjectBlock = s3GetObjectBlock; + + tcs.DeleteObjectsByPrefix = s3DeleteObjectsByPrefix; + + tcs.PutObjectFromFile2 = s3PutObjectFromFile2; + tcs.GetObjectsByPrefix = s3GetObjectsByPrefix; + tcs.DeleteObjects = s3DeleteObjects; + tcs.GetObjectToFile = s3GetObjectToFile; + + } else if (TOS_PROTO_ABLOB == proto) { + tcs.Begin = azBegin; + tcs.End = azEnd; + tcs.CheckCfg = azCheckCfg; + + tcs.PutObjectFromFileOffset = azPutObjectFromFileOffset; + tcs.GetObjectBlock = azGetObjectBlock; + + tcs.DeleteObjectsByPrefix = azDeleteObjectsByPrefix; + + tcs.PutObjectFromFile2 = azPutObjectFromFile2; + tcs.GetObjectsByPrefix = azGetObjectsByPrefix; + tcs.DeleteObjects = azDeleteObjects; + tcs.GetObjectToFile = azGetObjectToFile; + + } else { + code = TSDB_CODE_INVALID_PARA; + return code; + } + + code = tcs.Begin(); + + return code; +} + +void tcsUninit() { tcs.End(); } + +int32_t tcsCheckCfg() { + int32_t code = 0; + + if (!tsS3Enabled) { + (void)fprintf(stderr, "tcs not configured.\n"); + TAOS_RETURN(code); + } + + code = tcsInit(); + if (code != 0) { + (void)fprintf(stderr, "failed to initialize tcs.\n"); + TAOS_RETURN(code); + } + + code = tcs.CheckCfg(); + if (code != 0) { + (void)fprintf(stderr, "failed to check tcs.\n"); + TAOS_RETURN(code); + } + + tcsUninit(); + + return code; +} + +int32_t tcsPutObjectFromFileOffset(const char* file, const char* object_name, int64_t offset, int64_t size) { + return tcs.PutObjectFromFileOffset(file, object_name, offset, size); +} + +int32_t tcsGetObjectBlock(const char* object_name, int64_t offset, int64_t size, bool check, uint8_t** ppBlock) { + return tcs.GetObjectBlock(object_name, offset, size, check, ppBlock); +} + +void tcsDeleteObjectsByPrefix(const char* prefix) { return tcs.DeleteObjectsByPrefix(prefix); } diff --git a/source/libs/tcs/src/tcsStream.c b/source/libs/tcs/src/tcsStream.c new file mode 100644 index 0000000000..f73bb028ba --- /dev/null +++ b/source/libs/tcs/src/tcsStream.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * 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. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include "tcs.h" +#include "tcsInt.h" + +STcs tcs; + +int32_t tcsPutObjectFromFile2(const char* file, const char* object, int8_t withcp) { + return tcs.PutObjectFromFile2(file, object, withcp); +} + +int32_t tcsGetObjectsByPrefix(const char* prefix, const char* path) { return tcs.GetObjectsByPrefix(prefix, path); } + +int32_t tcsDeleteObjects(const char* object_name[], int nobject) { return tcs.DeleteObjects(object_name, nobject); } + +int32_t tcsGetObjectToFile(const char* object_name, const char* fileName) { + return tcs.GetObjectToFile(object_name, fileName); +} diff --git a/source/libs/tcs/test/CMakeLists.txt b/source/libs/tcs/test/CMakeLists.txt new file mode 100644 index 0000000000..909128db37 --- /dev/null +++ b/source/libs/tcs/test/CMakeLists.txt @@ -0,0 +1,20 @@ +if(TD_LINUX) + aux_source_directory(. TCS_TEST_SRC) + + add_executable(tcsTest ${TCS_TEST_SRC}) + target_include_directories(tcsTest + PUBLIC + "${TD_SOURCE_DIR}/include/libs/tcs" + "${CMAKE_CURRENT_SOURCE_DIR}/../inc" + ) + + target_link_libraries(tcsTest + tcs + gtest_main + ) + enable_testing() + add_test( + NAME tcs_test + COMMAND tcsTest + ) +endif() diff --git a/source/libs/tcs/test/tcsTest.cpp b/source/libs/tcs/test/tcsTest.cpp new file mode 100644 index 0000000000..4b5afc5b85 --- /dev/null +++ b/source/libs/tcs/test/tcsTest.cpp @@ -0,0 +1,351 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * 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. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include + +#include +#include +#include + +#include "tcs.h" +#include "tcsInt.h" + +int32_t tcsInitEnv(int8_t isBlob) { + int32_t code = 0; + + extern char tsS3Hostname[][TSDB_FQDN_LEN]; + extern char tsS3AccessKeyId[][TSDB_FQDN_LEN]; + extern char tsS3AccessKeySecret[][TSDB_FQDN_LEN]; + extern char tsS3BucketName[TSDB_FQDN_LEN]; + + /* TCS parameter format + tsS3Hostname[0] = "/.blob.core.windows.net"; + tsS3AccessKeyId[0] = ""; + tsS3AccessKeySecret[0] = ""; + tsS3BucketName = ""; + */ + + tsS3Ablob = isBlob; + if (isBlob) { + const char *hostname = "/.blob.core.windows.net"; + const char *accessKeyId = ""; + const char *accessKeySecret = ""; + const char *bucketName = ""; + + if (hostname[0] != '<') { + tstrncpy(&tsS3Hostname[0][0], hostname, TSDB_FQDN_LEN); + tstrncpy(&tsS3AccessKeyId[0][0], accessKeyId, TSDB_FQDN_LEN); + tstrncpy(&tsS3AccessKeySecret[0][0], accessKeySecret, TSDB_FQDN_LEN); + tstrncpy(tsS3BucketName, bucketName, TSDB_FQDN_LEN); + } else { + const char *accountId = getenv("ablob_account_id"); + if (!accountId) { + return -1; + } + + const char *accountSecret = getenv("ablob_account_secret"); + if (!accountSecret) { + return -1; + } + + const char *containerName = getenv("ablob_container"); + if (!containerName) { + return -1; + } + + TAOS_STRCPY(&tsS3Hostname[0][0], accountId); + TAOS_STRCAT(&tsS3Hostname[0][0], ".blob.core.windows.net"); + TAOS_STRCPY(&tsS3AccessKeyId[0][0], accountId); + TAOS_STRCPY(&tsS3AccessKeySecret[0][0], accountSecret); + TAOS_STRCPY(tsS3BucketName, containerName); + } + } else { + /* + const char *hostname = "endpoint/.blob.core.windows.net"; + const char *accessKeyId = ""; + const char *accessKeySecret = ""; + const char *bucketName = ""; + */ + + // const char *hostname = "http://192.168.1.52:9000"; + // const char *accessKeyId = "zOgllR6bSnw2Ah3mCNel"; + // const char *accessKeySecret = "cdO7oXAu3Cqdb1rUdevFgJMi0LtRwCXdWKQx4bhX"; + // const char *bucketName = "test-bucket"; + const char *hostname = "192.168.1.52:9000"; + const char *accessKeyId = "fGPPyYjzytw05nw44ViA"; + const char *accessKeySecret = "vK1VcwxgSOykicx6hk8fL1x15uEtyDSFU3w4hTaZ"; + + const char *bucketName = "ci-bucket19"; + + tstrncpy(&tsS3Hostname[0][0], hostname, TSDB_FQDN_LEN); + tstrncpy(&tsS3AccessKeyId[0][0], accessKeyId, TSDB_FQDN_LEN); + tstrncpy(&tsS3AccessKeySecret[0][0], accessKeySecret, TSDB_FQDN_LEN); + tstrncpy(tsS3BucketName, bucketName, TSDB_FQDN_LEN); + + // setup s3 env + extern int8_t tsS3EpNum; + extern int8_t tsS3Https[TSDB_MAX_EP_NUM]; + + tsS3EpNum = 1; + tsS3Https[0] = false; + } + + tstrncpy(tsTempDir, "/tmp/", PATH_MAX); + + tsS3Enabled = true; + + return code; +} + +// TEST(TcsTest, DISABLED_InterfaceTest) { +TEST(TcsTest, InterfaceTest) { + int code = 0; + bool check = false; + bool withcp = false; + + code = tcsInitEnv(true); + if (code) { + std::cout << "ablob env init failed with: " << code << std::endl; + return; + } + + GTEST_ASSERT_EQ(code, 0); + GTEST_ASSERT_EQ(tsS3Enabled, 1); + GTEST_ASSERT_EQ(tsS3Ablob, 1); + + code = tcsInit(); + GTEST_ASSERT_EQ(code, 0); + + code = tcsCheckCfg(); + GTEST_ASSERT_EQ(code, 0); + + const int size = 4096; + char data[size] = {0}; + for (int i = 0; i < size / 2; ++i) { + data[i * 2 + 1] = 1; + } + + const char object_name[] = "tcsut.bin"; + char path[PATH_MAX] = {0}; + char path_download[PATH_MAX] = {0}; + int ds_len = strlen(TD_DIRSEP); + int tmp_len = strlen(tsTempDir); + + (void)snprintf(path, PATH_MAX, "%s", tsTempDir); + if (strncmp(tsTempDir + tmp_len - ds_len, TD_DIRSEP, ds_len) != 0) { + (void)snprintf(path + tmp_len, PATH_MAX - tmp_len, "%s", TD_DIRSEP); + (void)snprintf(path + tmp_len + ds_len, PATH_MAX - tmp_len - ds_len, "%s", object_name); + } else { + (void)snprintf(path + tmp_len, PATH_MAX - tmp_len, "%s", object_name); + } + + tstrncpy(path_download, path, strlen(path) + 1); + tstrncpy(path_download + strlen(path), ".download", strlen(".download") + 1); + + TdFilePtr fp = taosOpenFile(path, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_WRITE_THROUGH); + GTEST_ASSERT_NE(fp, nullptr); + + int n = taosWriteFile(fp, data, size); + GTEST_ASSERT_EQ(n, size); + + code = taosCloseFile(&fp); + GTEST_ASSERT_EQ(code, 0); + + code = tcsPutObjectFromFileOffset(path, object_name, 0, size); + GTEST_ASSERT_EQ(code, 0); + + uint8_t *pBlock = NULL; + code = tcsGetObjectBlock(object_name, 0, size, check, &pBlock); + GTEST_ASSERT_EQ(code, 0); + + for (int i = 0; i < size / 2; ++i) { + GTEST_ASSERT_EQ(pBlock[i * 2], 0); + GTEST_ASSERT_EQ(pBlock[i * 2 + 1], 1); + } + + taosMemoryFree(pBlock); + + code = tcsGetObjectToFile(object_name, path_download); + GTEST_ASSERT_EQ(code, 0); + + { + TdFilePtr fp = taosOpenFile(path, TD_FILE_READ); + GTEST_ASSERT_NE(fp, nullptr); + + (void)memset(data, 0, size); + + int64_t n = taosReadFile(fp, data, size); + GTEST_ASSERT_EQ(n, size); + + code = taosCloseFile(&fp); + GTEST_ASSERT_EQ(code, 0); + + for (int i = 0; i < size / 2; ++i) { + GTEST_ASSERT_EQ(data[i * 2], 0); + GTEST_ASSERT_EQ(data[i * 2 + 1], 1); + } + } + + tcsDeleteObjectsByPrefix(object_name); + // list object to check + + code = tcsPutObjectFromFile2(path, object_name, withcp); + GTEST_ASSERT_EQ(code, 0); + + code = tcsGetObjectsByPrefix(object_name, tsTempDir); + GTEST_ASSERT_EQ(code, 0); + + { + TdFilePtr fp = taosOpenFile(path, TD_FILE_READ); + GTEST_ASSERT_NE(fp, nullptr); + + (void)memset(data, 0, size); + + int64_t n = taosReadFile(fp, data, size); + GTEST_ASSERT_EQ(n, size); + + code = taosCloseFile(&fp); + GTEST_ASSERT_EQ(code, 0); + + for (int i = 0; i < size / 2; ++i) { + GTEST_ASSERT_EQ(data[i * 2], 0); + GTEST_ASSERT_EQ(data[i * 2 + 1], 1); + } + } + + const char *object_name_arr[] = {object_name}; + code = tcsDeleteObjects(object_name_arr, 1); + GTEST_ASSERT_EQ(code, 0); + + tcsUninit(); +} + +// TEST(TcsTest, DISABLED_InterfaceNonBlobTest) { +TEST(TcsTest, InterfaceNonBlobTest) { + int code = 0; + bool check = false; + bool withcp = false; + + code = tcsInitEnv(false); + GTEST_ASSERT_EQ(code, 0); + GTEST_ASSERT_EQ(tsS3Enabled, 1); + GTEST_ASSERT_EQ(tsS3Ablob, 0); + + code = tcsInit(); + GTEST_ASSERT_EQ(code, 0); + + code = tcsCheckCfg(); + GTEST_ASSERT_EQ(code, 0); + + const int size = 4096; + char data[size] = {0}; + for (int i = 0; i < size / 2; ++i) { + data[i * 2 + 1] = 1; + } + + const char object_name[] = "tcsut.bin"; + char path[PATH_MAX] = {0}; + char path_download[PATH_MAX] = {0}; + int ds_len = strlen(TD_DIRSEP); + int tmp_len = strlen(tsTempDir); + + (void)snprintf(path, PATH_MAX, "%s", tsTempDir); + if (strncmp(tsTempDir + tmp_len - ds_len, TD_DIRSEP, ds_len) != 0) { + (void)snprintf(path + tmp_len, PATH_MAX - tmp_len, "%s", TD_DIRSEP); + (void)snprintf(path + tmp_len + ds_len, PATH_MAX - tmp_len - ds_len, "%s", object_name); + } else { + (void)snprintf(path + tmp_len, PATH_MAX - tmp_len, "%s", object_name); + } + + tstrncpy(path_download, path, strlen(path) + 1); + tstrncpy(path_download + strlen(path), ".download", strlen(".download") + 1); + + TdFilePtr fp = taosOpenFile(path, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_WRITE_THROUGH); + GTEST_ASSERT_NE(fp, nullptr); + + int n = taosWriteFile(fp, data, size); + GTEST_ASSERT_EQ(n, size); + + code = taosCloseFile(&fp); + GTEST_ASSERT_EQ(code, 0); + + code = tcsPutObjectFromFileOffset(path, object_name, 0, size); + GTEST_ASSERT_EQ(code, 0); + + uint8_t *pBlock = NULL; + code = tcsGetObjectBlock(object_name, 0, size, check, &pBlock); + GTEST_ASSERT_EQ(code, 0); + + for (int i = 0; i < size / 2; ++i) { + GTEST_ASSERT_EQ(pBlock[i * 2], 0); + GTEST_ASSERT_EQ(pBlock[i * 2 + 1], 1); + } + + taosMemoryFree(pBlock); + + code = tcsGetObjectToFile(object_name, path_download); + GTEST_ASSERT_EQ(code, 0); + + { + TdFilePtr fp = taosOpenFile(path, TD_FILE_READ); + GTEST_ASSERT_NE(fp, nullptr); + + (void)memset(data, 0, size); + + int64_t n = taosReadFile(fp, data, size); + GTEST_ASSERT_EQ(n, size); + + code = taosCloseFile(&fp); + GTEST_ASSERT_EQ(code, 0); + + for (int i = 0; i < size / 2; ++i) { + GTEST_ASSERT_EQ(data[i * 2], 0); + GTEST_ASSERT_EQ(data[i * 2 + 1], 1); + } + } + + tcsDeleteObjectsByPrefix(object_name); + // list object to check + + code = tcsPutObjectFromFile2(path, object_name, withcp); + GTEST_ASSERT_EQ(code, 0); + + code = tcsGetObjectsByPrefix(object_name, tsTempDir); + GTEST_ASSERT_EQ(code, 0); + + { + TdFilePtr fp = taosOpenFile(path, TD_FILE_READ); + GTEST_ASSERT_NE(fp, nullptr); + + (void)memset(data, 0, size); + + int64_t n = taosReadFile(fp, data, size); + GTEST_ASSERT_EQ(n, size); + + code = taosCloseFile(&fp); + GTEST_ASSERT_EQ(code, 0); + + for (int i = 0; i < size / 2; ++i) { + GTEST_ASSERT_EQ(data[i * 2], 0); + GTEST_ASSERT_EQ(data[i * 2 + 1], 1); + } + } + + const char *object_name_arr[] = {object_name}; + code = tcsDeleteObjects(object_name_arr, 1); + GTEST_ASSERT_EQ(code, 0); + + tcsUninit(); +} diff --git a/source/libs/tfs/CMakeLists.txt b/source/libs/tfs/CMakeLists.txt index ef1afa01a1..98572f94d8 100644 --- a/source/libs/tfs/CMakeLists.txt +++ b/source/libs/tfs/CMakeLists.txt @@ -9,5 +9,5 @@ target_include_directories( target_link_libraries(tfs os util common monitor) if(${BUILD_TEST}) - add_subdirectory(test) + add_subdirectory(test) endif(${BUILD_TEST}) \ No newline at end of file diff --git a/source/libs/transport/CMakeLists.txt b/source/libs/transport/CMakeLists.txt index a48926d2d4..6ad130017a 100644 --- a/source/libs/transport/CMakeLists.txt +++ b/source/libs/transport/CMakeLists.txt @@ -1,34 +1,30 @@ aux_source_directory(src TRANSPORT_SRC) add_library(transport STATIC ${TRANSPORT_SRC}) target_include_directories( - transport - PUBLIC "${TD_SOURCE_DIR}/include/libs/transport" - PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" + transport + PUBLIC "${TD_SOURCE_DIR}/include/libs/transport" + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" ) target_link_libraries( - transport - PUBLIC lz4_static - PUBLIC os - PUBLIC util - PUBLIC common - PUBLIC zlibstatic + transport + PUBLIC lz4_static + PUBLIC os + PUBLIC util + PUBLIC common + PUBLIC zlibstatic ) -if (${BUILD_WITH_UV_TRANS}) -if (${BUILD_WITH_UV}) - target_link_libraries( - transport - PUBLIC uv_a - ) - add_definitions(-DUSE_UV) -endif(${BUILD_WITH_UV}) -endif(${BUILD_WITH_UV_TRANS}) -if (${BUILD_TEST}) +if(${BUILD_WITH_UV_TRANS}) + if(${BUILD_WITH_UV}) + target_link_libraries( + transport + PUBLIC uv_a + ) + add_definitions(-DUSE_UV) + endif(${BUILD_WITH_UV}) +endif(${BUILD_WITH_UV_TRANS}) + +if(${BUILD_TEST}) add_subdirectory(test) endif(${BUILD_TEST}) - - - - - diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index 18bedab5c7..c3e214b5e3 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -27,7 +27,7 @@ typedef struct { typedef struct SConnList { queue conns; int32_t size; - int32_t totaSize; + int32_t totalSize; } SConnList; typedef struct { @@ -703,8 +703,9 @@ void cliHandleResp(SCliConn* conn) { code = cliBuildRespFromCont(pReq, &resp, pHead); STraceId* trace = &resp.info.traceId; - tGDebug("%s conn %p %s received from %s, local info:%s, len:%d, seq:%" PRId64 ", sid:%" PRId64 "", - CONN_GET_INST_LABEL(conn), conn, TMSG_INFO(resp.msgType), conn->dst, conn->src, pHead->msgLen, seq, qId); + tGDebug("%s conn %p %s received from %s, local info:%s, len:%d, seq:%" PRId64 ", sid:%" PRId64 ", code:%s", + CONN_GET_INST_LABEL(conn), conn, TMSG_INFO(resp.msgType), conn->dst, conn->src, pHead->msgLen, seq, qId, + tstrerror(pHead->code)); code = cliNotifyCb(conn, pReq, &resp); if (code == TSDB_CODE_RPC_ASYNC_IN_PROCESS) { @@ -854,10 +855,9 @@ static int32_t cliGetConnFromPool(SCliThrd* pThrd, const char* key, SCliConn** p } if (QUEUE_IS_EMPTY(&plist->conns)) { - if (plist->size >= pInst->connLimitNum) { + if (plist->totalSize >= pInst->connLimitNum) { return TSDB_CODE_RPC_MAX_SESSIONS; } - plist->totaSize += 1; return TSDB_CODE_RPC_NETWORK_BUSY; } @@ -1045,7 +1045,7 @@ static int32_t cliCreateConn(SCliThrd* pThrd, SCliConn** pCliConn, char* ip, int conn->hostThrd = pThrd; conn->seq = 0; - conn->pQTable = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK); + conn->pQTable = taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK); if (conn->pQTable == NULL) { TAOS_CHECK_GOTO(terrno, NULL, _failed); } @@ -1248,7 +1248,7 @@ static void cliHandleException(SCliConn* conn) { cliDestroyAllQidFromThrd(conn); QUEUE_REMOVE(&conn->q); if (conn->list) { - conn->list->totaSize -= 1; + conn->list->totalSize -= 1; conn->list = NULL; } @@ -1547,10 +1547,15 @@ static int32_t cliDoConn(SCliThrd* pThrd, SCliConn* conn) { } transRefCliHandle(conn); + + conn->list = taosHashGet((SHashObj*)pThrd->pool, conn->dstAddr, strlen(conn->dstAddr)); + if (conn->list != NULL) { + conn->list->totalSize += 1; + } + ret = uv_tcp_connect(&conn->connReq, (uv_tcp_t*)(conn->stream), (const struct sockaddr*)&addr, cliConnCb); if (ret != 0) { tError("failed connect to %s since %s", conn->dstAddr, uv_err_name(ret)); - TAOS_CHECK_GOTO(TSDB_CODE_THIRDPARTY_ERROR, &lino, _exception1); } @@ -2362,7 +2367,7 @@ static int32_t createThrdObj(void* trans, SCliThrd** ppThrd) { } } - pThrd->pool = createConnPool(4); + pThrd->pool = createConnPool(128); if (pThrd->pool == NULL) { code = terrno; TAOS_CHECK_GOTO(terrno, NULL, _end); @@ -2381,22 +2386,22 @@ static int32_t createThrdObj(void* trans, SCliThrd** ppThrd) { pThrd->destroyAhandleFp = pInst->destroyFp; - pThrd->fqdn2ipCache = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); + pThrd->fqdn2ipCache = taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); if (pThrd->fqdn2ipCache == NULL) { TAOS_CHECK_GOTO(terrno, NULL, _end); } - pThrd->batchCache = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); + pThrd->batchCache = taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); if (pThrd->batchCache == NULL) { TAOS_CHECK_GOTO(terrno, NULL, _end); } - pThrd->connHeapCache = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); + pThrd->connHeapCache = taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); if (pThrd->connHeapCache == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, NULL, _end); } - pThrd->pIdConnTable = taosHashInit(512, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK); + pThrd->pIdConnTable = taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK); if (pThrd->connHeapCache == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, NULL, _end); } @@ -2956,12 +2961,13 @@ int32_t cliNotifyCb(SCliConn* pConn, SCliReq* pReq, STransMsg* pResp) { STrans* pInst = pThrd->pInst; if (pReq != NULL) { - if (cliMayRetry(pConn, pReq, pResp)) { - return TSDB_CODE_RPC_ASYNC_IN_PROCESS; + if (pResp->code != TSDB_CODE_SUCCESS) { + if (cliMayRetry(pConn, pReq, pResp)) { + return TSDB_CODE_RPC_ASYNC_IN_PROCESS; + } + cliMayResetRespCode(pReq, pResp); } - cliMayResetRespCode(pReq, pResp); - if (cliTryUpdateEpset(pReq, pResp)) { cliPerfLog_epset(pConn, pReq); } @@ -3737,7 +3743,7 @@ static FORCE_INLINE int8_t shouldSWitchToOtherConn(SCliConn* pConn, char* key) { tTrace("conn %p get list %p from pool for key:%s", pConn, pConn->list, key); } } - if (pConn->list && pConn->list->totaSize >= pInst->connLimitNum / 4) { + if (pConn->list && pConn->list->totalSize >= pInst->connLimitNum / 4) { tWarn("%s conn %p try to remove timeout msg since too many conn created", transLabel(pInst), pConn); if (cliConnRemoveTimeoutMsg(pConn)) { diff --git a/source/libs/transport/src/transSvr.c b/source/libs/transport/src/transSvr.c index a7c24f3fae..5723f2ff23 100644 --- a/source/libs/transport/src/transSvr.c +++ b/source/libs/transport/src/transSvr.c @@ -239,7 +239,7 @@ SIpWhiteListTab* uvWhiteListCreate() { return NULL; } - pWhiteList->pList = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), 0, HASH_NO_LOCK); + pWhiteList->pList = taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), 0, HASH_NO_LOCK); if (pWhiteList->pList == NULL) { taosMemoryFree(pWhiteList); return NULL; @@ -1333,7 +1333,7 @@ static FORCE_INLINE SSvrConn* createConn(void* hThrd) { QUEUE_INIT(&exh->q); tTrace("%s handle %p, conn %p created, refId:%" PRId64, transLabel(pInst), exh, pConn, pConn->refId); - pConn->pQTable = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK); + pConn->pQTable = taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK); if (pConn->pQTable == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _end); } diff --git a/source/util/CMakeLists.txt b/source/util/CMakeLists.txt index 4972e9f50b..063988ea00 100644 --- a/source/util/CMakeLists.txt +++ b/source/util/CMakeLists.txt @@ -1,19 +1,20 @@ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/version.c.in" "${CMAKE_CURRENT_SOURCE_DIR}/src/version.c") aux_source_directory(src UTIL_SRC) add_library(util STATIC ${UTIL_SRC}) -if (DEFINED GRANT_CFG_INCLUDE_DIR) - add_definitions(-DGRANTS_CFG) + +if(DEFINED GRANT_CFG_INCLUDE_DIR) + add_definitions(-DGRANTS_CFG) endif() -IF (${ASSERT_NOT_CORE}) +if(${ASSERT_NOT_CORE}) ADD_DEFINITIONS(-DASSERT_NOT_CORE) MESSAGE(STATUS "disable assert core") -ELSE () +else() MESSAGE(STATUS "enable assert core") -ENDIF (${ASSERT_NOT_CORE}) +endif(${ASSERT_NOT_CORE}) if(${BUILD_WITH_ANALYSIS}) - add_definitions(-DUSE_ANAL) + add_definitions(-DUSE_ANAL) endif() target_include_directories( @@ -34,7 +35,7 @@ target_link_directories( PUBLIC "${TD_SOURCE_DIR}/contrib/pcre2" ) -if (TD_LINUX) +if(TD_LINUX) target_link_libraries( util PUBLIC os common @@ -43,10 +44,10 @@ if (TD_LINUX) ) else() target_link_libraries( - util - PUBLIC os common - PUBLIC lz4_static pcre2-8 - PUBLIC api cjson geos_c TSZ + util + PUBLIC os common + PUBLIC lz4_static pcre2-8 + PUBLIC api cjson geos_c TSZ ) endif() diff --git a/source/util/src/tlog.c b/source/util/src/tlog.c index 45c8a2f6c2..3ca148a625 100644 --- a/source/util/src/tlog.c +++ b/source/util/src/tlog.c @@ -26,7 +26,7 @@ #define LOG_MAX_LINE_DUMP_SIZE (1024 * 1024) #define LOG_MAX_LINE_DUMP_BUFFER_SIZE (LOG_MAX_LINE_DUMP_SIZE + 128) -#define LOG_FILE_DAY_LEN 64 +#define LOG_FILE_DAY_LEN 64 #define LOG_DEFAULT_BUF_SIZE (20 * 1024 * 1024) // 20MB #define LOG_SLOW_BUF_SIZE (10 * 1024 * 1024) // 10MB @@ -113,6 +113,7 @@ int32_t rpcDebugFlag = 131; int32_t qDebugFlag = 131; int32_t stDebugFlag = 131; int32_t wDebugFlag = 131; +int32_t azDebugFlag = 131; int32_t sDebugFlag = 131; int32_t tsdbDebugFlag = 131; int32_t tdbDebugFlag = 131; @@ -151,7 +152,7 @@ static int32_t taosStartLog() { return 0; } -static void getDay(char* buf, int32_t bufSize){ +static void getDay(char *buf, int32_t bufSize) { time_t t = taosTime(NULL); struct tm tmInfo; if (taosLocalTime(&t, &tmInfo, buf, bufSize) != NULL) { @@ -172,7 +173,7 @@ static int64_t getTimestampToday() { return (int64_t)taosMktime(&tm); } -static void getFullPathName(char* fullName, const char* logName){ +static void getFullPathName(char *fullName, const char *logName) { if (strlen(tsLogDir) != 0) { char lastC = tsLogDir[strlen(tsLogDir) - 1]; if (lastC == '\\' || lastC == '/') { @@ -225,7 +226,7 @@ int32_t taosInitLog(const char *logName, int32_t maxFiles, bool tsc) { } TAOS_CHECK_RETURN(taosInitNormalLog(logName, maxFiles)); - if (tsc){ + if (tsc) { TAOS_CHECK_RETURN(taosInitSlowLog()); } TAOS_CHECK_RETURN(taosStartLog()); @@ -397,7 +398,7 @@ static int32_t taosOpenNewLogFile() { OldFileKeeper *oldFileKeeper = taosOpenNewFile(); if (!oldFileKeeper) { - TAOS_UNUSED(taosThreadMutexUnlock(&tsLogObj.logMutex)); + TAOS_UNUSED(taosThreadMutexUnlock(&tsLogObj.logMutex)); return terrno; } if (taosThreadCreate(&thread, &attr, taosThreadToCloseOldFile, oldFileKeeper) != 0) { @@ -433,7 +434,7 @@ static void taosOpenNewSlowLogFile() { char day[TD_TIME_STR_LEN] = {0}; getDay(day, sizeof(day)); TdFilePtr pFile = NULL; - char name[PATH_MAX + TD_TIME_STR_LEN] = {0}; + char name[PATH_MAX + TD_TIME_STR_LEN] = {0}; (void)snprintf(name, PATH_MAX + TD_TIME_STR_LEN, "%s.%s", tsLogObj.slowLogName, day); pFile = taosOpenFile(name, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_APPEND); if (pFile == NULL) { @@ -455,7 +456,7 @@ void taosResetLog() { if (tsLogObj.logHandle) { int32_t code = taosOpenNewLogFile(); - if(code != 0){ + if (code != 0) { uError("failed to open new log file, reason:%s", tstrerror(code)); } uInfo("=================================="); @@ -508,12 +509,12 @@ static void decideLogFileName(const char *fn, int32_t maxFileNum) { } } -static void decideLogFileNameFlag(){ +static void decideLogFileNameFlag() { char name[PATH_MAX + 50] = "\0"; int32_t logstat0_mtime = 0; int32_t logstat1_mtime = 0; - bool log0Exist = false; - bool log1Exist = false; + bool log0Exist = false; + bool log1Exist = false; if (strlen(tsLogObj.logName) < PATH_MAX + 50 - 2) { strcpy(name, tsLogObj.logName); @@ -535,7 +536,7 @@ static void decideLogFileNameFlag(){ } } -static void processLogFileName(const char* logName , int32_t maxFileNum){ +static void processLogFileName(const char *logName, int32_t maxFileNum) { char fullName[PATH_MAX] = {0}; getFullPathName(fullName, logName); decideLogFileName(fullName, maxFileNum); @@ -872,7 +873,7 @@ static int32_t taosGetLogRemainSize(SLogBuff *pLogBuf, int32_t start, int32_t en return rSize >= 0 ? rSize : LOG_BUF_SIZE(pLogBuf) + rSize; } -static void taosWriteSlowLog(SLogBuff *pLogBuf){ +static void taosWriteSlowLog(SLogBuff *pLogBuf) { int32_t lock = atomic_val_compare_exchange_32(&pLogBuf->lock, 0, 1); if (lock == 1) return; taosWriteLog(pLogBuf); diff --git a/tests/army/frame/sql.py b/tests/army/frame/sql.py index 8b99219524..b4bc31b6a8 100644 --- a/tests/army/frame/sql.py +++ b/tests/army/frame/sql.py @@ -73,7 +73,7 @@ class TDSql: for k, v in kwargs.items(): s += f" {k} {v}" if "duration" not in kwargs: - s += " duration 300" + s += " duration 100" self.cursor.execute(s) s = f'use {dbname}' self.cursor.execute(s) diff --git a/tests/army/query/function/ans/ascii.csv b/tests/army/query/function/ans/ascii.csv index cc1529367b..3f1e6b8c5b 100644 --- a/tests/army/query/function/ans/ascii.csv +++ b/tests/army/query/function/ans/ascii.csv @@ -1,112 +1,302 @@ -104 -104 -104 -104 -229 -105.000000000000000 -103.000000000000000 -104 -104 -104 -104 -104 -105.000000000000000 -2.080000000000000e+02 -110 -228 -117 -112 -110 -110 -112 -110 -112 -228 -110 -228 -117 -112 -110 -110 -228 -117 -112 -110 -12100.000000000000000 -51984.000000000000000 -13689.000000000000000 -12544.000000000000000 -12100.000000000000000 -10.488088481701515 -15.099668870541500 -10.816653826391969 -10.583005244258363 -10.488088481701515 -110 -228 -117 -112 -110 -116 -116 -39 -108 -120 -108 -120 -108 -116 -104 -116 -116 -104 -108 -120 -108 -120 -108 -116 -104 -116 -116 -104 -110 -228 -117 -112 -110 -110 -97 -228 -110 -97 -110 -228 -117 -112 -110 -110 -97 -228 -110 -97 -110 -112 -110 -112 -228 -117 -112 -112 -112 -112 -110 -112 -110 -112 -228 -117 -112 -112 -112 -112 + +taos> select ASCII('hello') + ascii('hello') | +================= + 104 | + +taos> select ASCII('hello world') + ascii('hello world') | +======================= + 104 | + +taos> select ASCII('hello world!') + ascii('hello world!') | +======================== + 104 | + +taos> select ASCII('hello,world.你好,世界。') + ascii('hello,world.你好,世界。') | +========================================== + 104 | + +taos> select ASCII('北京涛思数据科技有限公司') + ascii('北京涛思数据科技有限公司') | +================================================ + 229 | + +taos> select ASCII('hello') + 1 + ascii('hello') + 1 | +============================ + 105.000000000000000 | + +taos> select ASCII('hello') - 1 + ascii('hello') - 1 | +============================ + 103.000000000000000 | + +taos> select ASCII('hello') from ts_4893.meters limit 5 + ascii('hello') | +================= + 104 | + 104 | + 104 | + 104 | + 104 | + +taos> select ASCII('hello') + 1 from ts_4893.meters limit 1 + ascii('hello') + 1 | +============================ + 105.000000000000000 | + +taos> select ASCII('hello') + ASCII('hello') from ts_4893.meters limit 1 + ascii('hello') + ascii('hello') | +================================== + 2.080000000000000e+02 | + +taos> select ASCII(nch1) from ts_4893.meters order by ts limit 5 + ascii(nch1) | +============== + 110 | + 228 | + 117 | + 112 | + 110 | + +taos> select ASCII(var1) from ts_4893.meters order by ts limit 5 + ascii(var1) | +============== + 110 | + 112 | + 110 | + 112 | + 228 | + +taos> select ASCII(concat(nch1,var1)) from ts_4893.meters order by ts limit 5 + ascii(concat(nch1,var1)) | +=========================== + 110 | + 228 | + 117 | + 112 | + 110 | + +taos> select ASCII(cast(nch1 as varchar)) from ts_4893.meters order by ts limit 5 + ascii(cast(nch1 as varchar)) | +=============================== + 110 | + 228 | + 117 | + 112 | + 110 | + +taos> select pow(ASCII(nch1), 2) from ts_4893.meters order by ts limit 5 + pow(ascii(nch1), 2) | +============================ + 12100.000000000000000 | + 51984.000000000000000 | + 13689.000000000000000 | + 12544.000000000000000 | + 12100.000000000000000 | + +taos> select sqrt(ASCII(nch1)) from ts_4893.meters order by ts limit 5 + sqrt(ascii(nch1)) | +============================ + 10.488088481701515 | + 15.099668870541500 | + 10.816653826391969 | + 10.583005244258363 | + 10.488088481701515 | + +taos> select cast(ASCII(nch1) as int) from ts_4893.meters order by ts limit 5 + cast(ascii(nch1) as int) | +=========================== + 110 | + 228 | + 117 | + 112 | + 110 | + +taos> select ascii('taos') + ascii('taos') | +================ + 116 | + +taos> select ascii('t') + ascii('t') | +============= + 116 | + +taos> select ascii('\'') + ascii('\'') | +============== + 39 | + +taos> select ascii(name) from ts_4893.d0 order by ts limit 10 + ascii(name) | +============== + 108 | + 120 | + 108 | + 120 | + 108 | + 116 | + 104 | + 116 | + 116 | + 104 | + +taos> select ascii(name) from ts_4893.meters order by ts limit 10 + ascii(name) | +============== + 108 | + 120 | + 108 | + 120 | + 108 | + 116 | + 104 | + 116 | + 116 | + 104 | + +taos> select ascii(nch1) from ts_4893.d0 order by ts limit 10 + ascii(nch1) | +============== + 110 | + 228 | + 117 | + 112 | + 110 | + 110 | + 97 | + 228 | + 110 | + 97 | + +taos> select ascii(nch1) from ts_4893.meters order by ts limit 10 + ascii(nch1) | +============== + 110 | + 228 | + 117 | + 112 | + 110 | + 110 | + 97 | + 228 | + 110 | + 97 | + +taos> select ascii(var1) from ts_4893.d0 order by ts limit 10 + ascii(var1) | +============== + 110 | + 112 | + 110 | + 112 | + 228 | + 117 | + 112 | + 112 | + 112 | + 112 | + +taos> select ascii(var1) from ts_4893.meters order by ts limit 10 + ascii(var1) | +============== + 110 | + 112 | + 110 | + 112 | + 228 | + 117 | + 112 | + 112 | + 112 | + 112 | + +taos> select ascii(null) + ascii(null) | +============== + NULL | + +taos> select ascii('0') + ascii('0') | +============= + 48 | + +taos> select ascii(' ') + ascii(' ') | +============= + 32 | + +taos> select ascii('~') + ascii('~') | +============= + 126 | + +taos> select ascii('中') + ascii('中') | +=============== + 228 | + +taos> select ascii('é') + ascii('é') | +============== + 195 | + +taos> select ascii('!@#') + ascii('!@#') | +=============== + 33 | + +taos> select ascii('Hello') + ascii('Hello') | +================= + 72 | + +taos> select ascii('123abc') + ascii('123abc') | +================== + 49 | + +taos> select ascii(concat('A', 'B')) + ascii(concat('A', 'B')) | +========================== + 65 | + +taos> select ascii(char(65)) + ascii(char(65)) | +================== + 65 | + +taos> select ascii(upper('b')) + ascii(upper('b')) | +==================== + 66 | + +taos> select ascii(trim(' A ')) + ascii(trim(' A ')) | +===================== + 65 | + +taos> select name, ascii(name) from ts_4893.meters limit 1 + name | ascii(name) | +=============================================== + lili | 108 | + +taos> select name, ascii(substring(name, 1, 1)) from ts_4893.meters limit 1 + name | ascii(substring(name, 1, 1)) | +================================================================ + lili | 108 | + +taos> select nch1, ascii(nch1) from ts_4893.meters limit 1 + nch1 | ascii(nch1) | +=============================================== + novel | 110 | + +taos> select var1, ascii(var1) from ts_4893.meters limit 1 + var1 | ascii(var1) | +=============================================== + novel | 110 | + diff --git a/tests/army/query/function/ans/char.csv b/tests/army/query/function/ans/char.csv index 7488ac31b8..6aa17a3726 100644 --- a/tests/army/query/function/ans/char.csv +++ b/tests/army/query/function/ans/char.csv @@ -1,43 +1,129 @@ -M -M -d -M -M -M -M -M -MNOPQ -MNOPQ -MNOPQ -MNOPQ -MNOPQ -MM -MM -MM -MM -MM -MN -MN -MN -MN -MN -1 -M -N -O -P -Q -MMM -NNN -OOO -PPP -QQQ -MMMMM -NNNNN -OOOOO -PPPPP -QQQQQ -M -MM -{ -M{ + +taos> select CHAR(77) + char(77) | +=========== + M | + +taos> select CHAR(77.5) + char(77.5) | +============= + M | + +taos> select CHAR(100) + char(100) | +============ + d | + +taos> select CHAR(77) from ts_4893.meters limit 5 + char(77) | +=========== + M | + M | + M | + M | + M | + +taos> select CHAR(77,78,79,80,81) from ts_4893.meters limit 5 + char(77,78,79,80,81) | +========================= + MNOPQ | + MNOPQ | + MNOPQ | + MNOPQ | + MNOPQ | + +taos> select CHAR(77*256+77) from ts_4893.meters limit 5 + char(77*256+77) | +================== + MM | + MM | + MM | + MM | + MM | + +taos> select concat(CHAR(77),CHAR(78)) from ts_4893.meters limit 5 + concat(char(77),char(78)) | +============================ + MN | + MN | + MN | + MN | + MN | + +taos> select cast(CHAR(49) as int) + cast(char(49) as int) | +======================== + 1 | + +taos> select CHAR(id + 77) from ts_4893.meters order by ts limit 5; + char(id + 77) | +================ + M | + N | + O | + P | + Q | + +taos> select CONCAT(CHAR(id + 77),CHAR(id + 77),CHAR(id + 77)) from ts_4893.meters limit 5 + concat(char(id + 77),char(id + 77),char(id + 77)) | +==================================================== + MMM | + NNN | + OOO | + PPP | + QQQ | + +taos> select CHAR(id+77, id+77, id+77, id+77, id+77) from ts_4893.meters limit 5 + char(id+77, id+77, id+77, id+77, id+77) | +========================================== + MMMMM | + NNNNN | + OOOOO | + PPPPP | + QQQQQ | + +taos> select char(77) + char(77) | +=========== + M | + +taos> select char(77 * 256 + 77) + char(77 * 256 + 77) | +====================== + MM | + +taos> select char('123') + char('123') | +============== + { | + +taos> select char(77, NULL, '123') + char(77, null, '123') | +======================== + M{ | + +taos> select char(null) + char(null) | +============= + | + +taos> select char('ustc') + char('ustc') | +=============== + | + +taos> select char(65.99) + char(65.99) | +============== + A | + +taos> select char(65, 66, 67) + char(65, 66, 67) | +=================== + ABC | + +taos> select char(72, 101, 108, 108, 111) + char(72, 101, 108, 108, 111) | +=============================== + Hello | + diff --git a/tests/army/query/function/ans/char_length.csv b/tests/army/query/function/ans/char_length.csv index 1a4c328fef..a872e8cd88 100644 --- a/tests/army/query/function/ans/char_length.csv +++ b/tests/army/query/function/ans/char_length.csv @@ -1,93 +1,259 @@ -5 -11 -12 -18 -12 -6.000000000000000 -4.000000000000000 -5 -5 -5 -5 -5 -6.000000000000000 -1.000000000000000e+01 -5 -10 -6 -7 -5 -5 -6 -5 -5 -10 -10 -16 -11 -12 -15 -5 -10 -6 -7 -5 -25.000000000000000 -100.000000000000000 -36.000000000000000 -49.000000000000000 -25.000000000000000 -2.236067977499790 -3.162277660168380 -2.449489742783178 -2.645751311064591 -2.236067977499790 -5 -10 -6 -7 -5 -4 -2 -6 -5 -5 -10 -6 -7 -5 -5 -5 -10 -5 -5 -5 -10 -6 -7 -5 -5 -5 -10 -5 -5 -5 -6 -5 -5 -10 -6 -7 -6 -7 -5 -5 -6 -5 -5 -10 -6 -7 -6 -7 -5 + +taos> select CHAR_LENGTH('hello') + char_length('hello') | +======================== + 5 | + +taos> select CHAR_LENGTH('hello world') + char_length('hello world') | +============================= + 11 | + +taos> select CHAR_LENGTH('hello world!') + char_length('hello world!') | +============================== + 12 | + +taos> select CHAR_LENGTH('hello,world.你好,世界。') + char_length('hello,world.你好,世界。') | +================================================ + 18 | + +taos> select CHAR_LENGTH('北京涛思数据科技有限公司') + char_length('北京涛思数据科技有限公司') | +====================================================== + 12 | + +taos> select CHAR_LENGTH('hello') + 1 + char_length('hello') + 1 | +============================ + 6.000000000000000 | + +taos> select CHAR_LENGTH('hello') - 1 + char_length('hello') - 1 | +============================ + 4.000000000000000 | + +taos> select CHAR_LENGTH('hello') from ts_4893.meters limit 5 + char_length('hello') | +======================== + 5 | + 5 | + 5 | + 5 | + 5 | + +taos> select CHAR_LENGTH('hello') + 1 from ts_4893.meters limit 1 + char_length('hello') + 1 | +============================ + 6.000000000000000 | + +taos> select CHAR_LENGTH('hello') + CHAR_LENGTH('hello') from ts_4893.meters limit 1 + char_length('hello') + char_length('hello') | +============================================== + 1.000000000000000e+01 | + +taos> select CHAR_LENGTH(nch1) from ts_4893.meters order by ts limit 5 + char_length(nch1) | +======================== + 5 | + 10 | + 6 | + 7 | + 5 | + +taos> select CHAR_LENGTH(var1) from ts_4893.meters order by ts limit 5 + char_length(var1) | +======================== + 5 | + 6 | + 5 | + 5 | + 10 | + +taos> select CHAR_LENGTH(concat(nch1,var1)) from ts_4893.meters order by ts limit 5 + char_length(concat(nch1,var1)) | +================================= + 10 | + 16 | + 11 | + 12 | + 15 | + +taos> select CHAR_LENGTH(cast(nch1 as varchar)) from ts_4893.meters order by ts limit 5 + char_length(cast(nch1 as varchar)) | +===================================== + 5 | + 10 | + 6 | + 7 | + 5 | + +taos> select pow(CHAR_LENGTH(nch1), 2) from ts_4893.meters order by ts limit 5 + pow(char_length(nch1), 2) | +============================ + 25.000000000000000 | + 100.000000000000000 | + 36.000000000000000 | + 49.000000000000000 | + 25.000000000000000 | + +taos> select sqrt(CHAR_LENGTH(nch1)) from ts_4893.meters order by ts limit 5 + sqrt(char_length(nch1)) | +============================ + 2.236067977499790 | + 3.162277660168380 | + 2.449489742783178 | + 2.645751311064591 | + 2.236067977499790 | + +taos> select cast(CHAR_LENGTH(nch1) as int) from ts_4893.meters order by ts limit 5 + cast(char_length(nch1) as int) | +================================= + 5 | + 10 | + 6 | + 7 | + 5 | + +taos> select char_length('taos') + char_length('taos') | +======================== + 4 | + +taos> select char_length('涛思') + char_length('涛思') | +======================== + 2 | + +taos> select char_length('涛思taos') + char_length('涛思taos') | +============================ + 6 | + +taos> select char_length('tao\'s') + char_length('tao\'s') | +======================== + 5 | + +taos> select char_length(nch1) from ts_4893.d0 limit 10 + char_length(nch1) | +======================== + 5 | + 10 | + 6 | + 7 | + 5 | + 5 | + 5 | + 10 | + 5 | + 5 | + +taos> select char_length(nch1) from ts_4893.meters limit 10 + char_length(nch1) | +======================== + 5 | + 10 | + 6 | + 7 | + 5 | + 5 | + 5 | + 10 | + 5 | + 5 | + +taos> select char_length(var1) from ts_4893.d0 limit 10 + char_length(var1) | +======================== + 5 | + 6 | + 5 | + 5 | + 10 | + 6 | + 7 | + 6 | + 7 | + 5 | + +taos> select char_length(var1) from ts_4893.meters limit 10 + char_length(var1) | +======================== + 5 | + 6 | + 5 | + 5 | + 10 | + 6 | + 7 | + 6 | + 7 | + 5 | + +taos> select char_length(null) + char_length(null) | +======================== + NULL | + +taos> select char_length('') + char_length('') | +======================== + 0 | + +taos> select char_length('あいうえお') + char_length('あいうえお') | +================================= + 5 | + +taos> select min(char_length(name)) from ts_4893.meters + min(char_length(name)) | +========================= + 1 | + +taos> select max(char_length(name)) from ts_4893.meters + max(char_length(name)) | +========================= + 4 | + +taos> select trim(name), char_length(trim(name)) from ts_4893.meters limit 1 + trim(name) | char_length(trim(name)) | +=========================================================== + lili | 4 | + +taos> select upper(name), char_length(upper(name)) from ts_4893.meters limit 1 + upper(name) | char_length(upper(name)) | +============================================================ + LILI | 4 | + +taos> select concat(name, ' - ', location), char_length(concat(name, ' - ', location)) from ts_4893.meters limit 1 + concat(name, ' - ', location) | char_length(concat(name, ' - ', location)) | +============================================================================== + lili - beijing | 14 | + +taos> select substring(name, 1, 5), char_length(substring(name, 1, 5)) from ts_4893.meters limit 1 + substring(name, 1, 5) | char_length(substring(name, 1, 5)) | +====================================================================== + lili | 4 | + +taos> select name, char_length(name) from ts_4893.meters limit 1 + name | char_length(name) | +========================================================= + lili | 4 | + +taos> select nch1, char_length(nch1) from ts_4893.meters limit 1 + nch1 | char_length(nch1) | +========================================================= + novel | 5 | + +taos> select groupid, max(char_length(name)) from ts_4893.meters group by groupid order by ts + groupid | max(char_length(name)) | +=================================== + 1 | 4 | + +taos> select location, avg(char_length(name)) from ts_4893.meters group by location order by location + location | avg(char_length(name)) | +================================================= + beijing | 3.244600000000000 | + diff --git a/tests/army/query/function/ans/dayofweek.csv b/tests/army/query/function/ans/dayofweek.csv index 93af60dc7d..ff80e7aa80 100644 --- a/tests/army/query/function/ans/dayofweek.csv +++ b/tests/army/query/function/ans/dayofweek.csv @@ -1,99 +1,262 @@ -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -6 -6 -6 -6 -6 -6 -6 -6 -6 -6 -6 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -6 -6 -6 -6 -6 -6 -6 -6 -6 -6 -4 -4 -2 -6 -6 -6 -6 -6 -6 -6 -6 -6 -6 -6 -6 -6 -6 -6 -6 -6 -6 -6 -6 + +taos> select DAYOFWEEK('2020-01-01 00:00:00') + dayofweek('2020-01-01 00:00:00') | +=================================== + 4 | + +taos> select DAYOFWEEK('2020-01-01 00:00:00') from ts_4893.meters order by ts limit 10 + dayofweek('2020-01-01 00:00:00') | +=================================== + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + +taos> select DAYOFWEEK('2021-01-01 00:00:00') + dayofweek('2021-01-01 00:00:00') | +=================================== + 6 | + +taos> select DAYOFWEEK('2021-01-01 00:00:00') from ts_4893.meters order by ts limit 10 + dayofweek('2021-01-01 00:00:00') | +=================================== + 6 | + 6 | + 6 | + 6 | + 6 | + 6 | + 6 | + 6 | + 6 | + 6 | + +taos> select DAYOFWEEK('1998-01-01 00:00:00') + dayofweek('1998-01-01 00:00:00') | +=================================== + 5 | + +taos> select DAYOFWEEK('1998-01-01 00:00:00') from ts_4893.meters order by ts limit 10 + dayofweek('1998-01-01 00:00:00') | +=================================== + 5 | + 5 | + 5 | + 5 | + 5 | + 5 | + 5 | + 5 | + 5 | + 5 | + +taos> select DAYOFWEEK('1998-12-31 00:00:00') + dayofweek('1998-12-31 00:00:00') | +=================================== + 5 | + +taos> select DAYOFWEEK('1998-12-31 00:00:00') from ts_4893.meters order by ts limit 10 + dayofweek('1998-12-31 00:00:00') | +=================================== + 5 | + 5 | + 5 | + 5 | + 5 | + 5 | + 5 | + 5 | + 5 | + 5 | + +taos> select DAYOFWEEK('2000-01-06 00:00:00') + dayofweek('2000-01-06 00:00:00') | +=================================== + 5 | + +taos> select DAYOFWEEK('2000-01-06 00:00:00') from ts_4893.meters order by ts limit 10 + dayofweek('2000-01-06 00:00:00') | +=================================== + 5 | + 5 | + 5 | + 5 | + 5 | + 5 | + 5 | + 5 | + 5 | + 5 | + +taos> select DAYOFWEEK(1725095657) + dayofweek(1725095657) | +======================== + 4 | + +taos> select DAYOFWEEK(1725095657) from ts_4893.meters order by ts limit 10 + dayofweek(1725095657) | +======================== + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + +taos> select DAYOFWEEK(ts) from ts_4893.meters order by ts limit 10 + dayofweek(ts) | +======================== + 6 | + 6 | + 6 | + 6 | + 6 | + 6 | + 6 | + 6 | + 6 | + 6 | + +taos> select dayofweek(null) + dayofweek(null) | +======================== + NULL | + +taos> select dayofweek('1721020591') + dayofweek('1721020591') | +========================== + NULL | + +taos> select dayofweek('1721020666229') + dayofweek('1721020666229') | +============================= + NULL | + +taos> select dayofweek('abc') + dayofweek('abc') | +======================== + NULL | + +taos> select dayofweek('01/01/2020') + dayofweek('01/01/2020') | +========================== + NULL | + +taos> select dayofweek('20200101') + dayofweek('20200101') | +======================== + NULL | + +taos> select dayofweek('20/01/01') + dayofweek('20/01/01') | +======================== + NULL | + +taos> select dayofweek('11/01/31') + dayofweek('11/01/31') | +======================== + NULL | + +taos> select dayofweek('01-JAN-20') + dayofweek('01-JAN-20') | +========================= + NULL | + +taos> select dayofweek('2020-01-01') + dayofweek('2020-01-01') | +========================== + 4 | + +taos> select dayofweek(1721020666) + dayofweek(1721020666) | +======================== + 4 | + +taos> select dayofweek(1721020666229) + dayofweek(1721020666229) | +=========================== + 2 | + +taos> select dayofweek(ts) from ts_4893.d0 order by ts limit 10 + dayofweek(ts) | +======================== + 6 | + 6 | + 6 | + 6 | + 6 | + 6 | + 6 | + 6 | + 6 | + 6 | + +taos> select dayofweek(ts) from ts_4893.meters order by ts limit 10 + dayofweek(ts) | +======================== + 6 | + 6 | + 6 | + 6 | + 6 | + 6 | + 6 | + 6 | + 6 | + 6 | + +taos> select dayofweek('2024-02-29') + dayofweek('2024-02-29') | +========================== + 5 | + +taos> select dayofweek('2024-01-01') + dayofweek('2024-01-01') | +========================== + 2 | + +taos> select dayofweek('2024-12-31') + dayofweek('2024-12-31') | +========================== + 3 | + +taos> select dayofweek('9999-12-31') + dayofweek('9999-12-31') | +========================== + 6 | + +taos> select dayofweek(ts) from ts_4893.meters limit 1 + dayofweek(ts) | +======================== + 6 | + +taos> select dayofweek(name) from ts_4893.meters limit 1 + dayofweek(name) | +======================== + NULL | + +taos> select dayofweek(timediff(ts, '2024-10-10 09:36:50.172')) from ts_4893.meters limit 1 + dayofweek(timediff(ts, '2024-10-10 09:36:50.172')) | +===================================================== + 6 | + +taos> select id, dayofweek(ts) from ts_4893.meters where id = 1 limit 1 + id | dayofweek(ts) | +====================================== + 1 | 6 | + +taos> select groupid, sum(dayofweek(ts)) from ts_4893.meters group by groupid order by groupid + groupid | sum(dayofweek(ts)) | +================================== + 1 | 400012 | + diff --git a/tests/army/query/function/ans/degrees.csv b/tests/army/query/function/ans/degrees.csv index 4da868ff42..9c68c92a9c 100644 --- a/tests/army/query/function/ans/degrees.csv +++ b/tests/army/query/function/ans/degrees.csv @@ -1,66 +1,270 @@ -0.000000000000000 -57.295779513082323 -85.943669269623484 -5729.577951308232514 --57.295779513082323 --85.943669269623484 --5729.577951308232514 -58.295779513082323 -56.295779513082323 -57.295779513082323 -57.295779513082323 -57.295779513082323 -57.295779513082323 -57.295779513082323 -57.295779513082323 -57.295779513082323 -58.295779513082323 -56.295779513082323 -114.591559026164646 -28.647889756541161 -171.887338539246969 -57.295779513082323 -6565.612700023488287 -2.000000000000000 -57.295779513082323 -58.295779513082323 -59.295779513082323 -60.295779513082323 -61.295779513082323 -0.000000000000000 -58.295779513082323 -116.591559026164646 -174.887338539246969 -233.183118052329291 -572.957795130823229 -180.000000000000000 -572.957795130823229 -328280.635001174407080 -23.936536824085962 -572 -0.000000000000000 -57.295779513082323 -81.028468454139556 -99.239201175922574 -114.591559026164646 -180 -610.200029957721426 -491.254034090376820 -561.212164701962479 -643.603479905018958 -613.408634263739941 -487.472513516777667 -549.810284033650078 -628.076328902558998 -643.202411196955836 -592.266466706882511 -610.200029957721426 -491.254034090376820 -561.212164701962479 -643.603479905018958 -613.408634263739941 -487.472513516777667 -549.810284033650078 -628.076328902558998 -643.202411196955836 -592.266466706882511 + +taos> select DEGREES(0) + degrees(0) | +============================ + 0.000000000000000 | + +taos> select DEGREES(1) + degrees(1) | +============================ + 57.295779513082323 | + +taos> select DEGREES(1.5) + degrees(1.5) | +============================ + 85.943669269623484 | + +taos> select DEGREES(100) + degrees(100) | +============================ + 5729.577951308232514 | + +taos> select DEGREES(-1) + degrees(-1) | +============================ + -57.295779513082323 | + +taos> select DEGREES(-1.5) + degrees(-1.5) | +============================ + -85.943669269623484 | + +taos> select DEGREES(-100) + degrees(-100) | +============================ + -5729.577951308232514 | + +taos> select DEGREES(1) + 1 + degrees(1) + 1 | +============================ + 58.295779513082323 | + +taos> select DEGREES(1) - 1 + degrees(1) - 1 | +============================ + 56.295779513082323 | + +taos> select DEGREES(1) * 1 + degrees(1) * 1 | +============================ + 57.295779513082323 | + +taos> select DEGREES(1) / 1 + degrees(1) / 1 | +============================ + 57.295779513082323 | + +taos> select DEGREES(1) from ts_4893.meters limit 5 + degrees(1) | +============================ + 57.295779513082323 | + 57.295779513082323 | + 57.295779513082323 | + 57.295779513082323 | + 57.295779513082323 | + +taos> select DEGREES(1) + 1 from ts_4893.meters limit 1 + degrees(1) + 1 | +============================ + 58.295779513082323 | + +taos> select DEGREES(1) - 1 from ts_4893.meters limit 1 + degrees(1) - 1 | +============================ + 56.295779513082323 | + +taos> select DEGREES(1) * 2 from ts_4893.meters limit 1 + degrees(1) * 2 | +============================ + 114.591559026164646 | + +taos> select DEGREES(1) / 2 from ts_4893.meters limit 1 + degrees(1) / 2 | +============================ + 28.647889756541161 | + +taos> select DEGREES(2) + DEGREES(1) from ts_4893.meters limit 1 + degrees(2) + degrees(1) | +============================ + 171.887338539246969 | + +taos> select DEGREES(2) - DEGREES(1) from ts_4893.meters limit 1 + degrees(2) - degrees(1) | +============================ + 57.295779513082323 | + +taos> select DEGREES(2) * DEGREES(1) from ts_4893.meters limit 1 + degrees(2) * degrees(1) | +============================ + 6565.612700023488287 | + +taos> select DEGREES(2) / DEGREES(1) from ts_4893.meters limit 1 + degrees(2) / degrees(1) | +============================ + 2.000000000000000 | + +taos> select DEGREES(1) + id from ts_4893.meters order by ts limit 5 + degrees(1) + id | +============================ + 57.295779513082323 | + 58.295779513082323 | + 59.295779513082323 | + 60.295779513082323 | + 61.295779513082323 | + +taos> select DEGREES(id) + id from ts_4893.meters order by ts limit 5 + degrees(id) + id | +============================ + 0.000000000000000 | + 58.295779513082323 | + 116.591559026164646 | + 174.887338539246969 | + 233.183118052329291 | + +taos> select DEGREES(abs(10)) + degrees(abs(10)) | +============================ + 572.957795130823229 | + +taos> select DEGREES(PI()) + degrees(pi()) | +============================ + 180.000000000000000 | + +taos> select abs(DEGREES(10)) + abs(degrees(10)) | +============================ + 572.957795130823229 | + +taos> select pow(DEGREES(10), 2) + pow(degrees(10), 2) | +============================ + 328280.635001174407080 | + +taos> select sqrt(DEGREES(10)) + sqrt(degrees(10)) | +============================ + 23.936536824085962 | + +taos> select cast(DEGREES(10) as int) + cast(degrees(10) as int) | +=========================== + 572 | + +taos> select DEGREES(sqrt(id)) from ts_4893.meters order by ts limit 5 + degrees(sqrt(id)) | +============================ + 0.000000000000000 | + 57.295779513082323 | + 81.028468454139556 | + 99.239201175922574 | + 114.591559026164646 | + +taos> select degrees(pi()) + degrees(pi()) | +============================ + 180.000000000000000 | + +taos> select degrees(current) from ts_4893.d0 order by ts limit 10 + degrees(current) | +============================ + 610.200029957721426 | + 491.254034090376820 | + 561.212164701962479 | + 643.603479905018958 | + 613.408634263739941 | + 487.472513516777667 | + 549.810284033650078 | + 628.076328902558998 | + 643.202411196955836 | + 592.266466706882511 | + +taos> select degrees(current) from ts_4893.meters order by ts limit 10 + degrees(current) | +============================ + 610.200029957721426 | + 491.254034090376820 | + 561.212164701962479 | + 643.603479905018958 | + 613.408634263739941 | + 487.472513516777667 | + 549.810284033650078 | + 628.076328902558998 | + 643.202411196955836 | + 592.266466706882511 | + +taos> select degrees(null) + degrees(null) | +============================ + NULL | + +taos> select degrees(-5) + degrees(-5) | +============================ + -286.478897565411614 | + +taos> select degrees(3.14) + degrees(3.14) | +============================ + 179.908747671078515 | + +taos> select degrees(2*pi()) + degrees(2*pi()) | +============================ + 360.000000000000000 | + +taos> select degrees(pi()/2) + degrees(pi()/2) | +============================ + 90.000000000000000 | + +taos> select degrees(-pi()/2) + degrees(-pi()/2) | +============================ + -90.000000000000000 | + +taos> select degrees(1000000) + degrees(1000000) | +============================ + 57295779.513082325458527 | + +taos> select degrees(sin(1)) + degrees(sin(1)) | +============================ + 48.212736012209490 | + +taos> select degrees(cos(1)) + degrees(cos(1)) | +============================ + 30.957041787430903 | + +taos> select degrees(tan(1)) + degrees(tan(1)) | +============================ + 89.232889603798512 | + +taos> select degrees(radians(90)) + degrees(radians(90)) | +============================ + 90.000000000000000 | + +taos> select degrees(atan(1)) + degrees(atan(1)) | +============================ + 45.000000000000000 | + +taos> select degrees(phase) from ts_4893.meters limit 1 + degrees(phase) | +============================ + 29.157708736569255 | + +taos> select degrees(current) from ts_4893.meters limit 1 + degrees(current) | +============================ + 610.200029957721426 | + +taos> select degrees(voltage) from ts_4893.meters limit 1 + degrees(voltage) | +============================ + 12662.367272391193183 | + diff --git a/tests/army/query/function/ans/exp.csv b/tests/army/query/function/ans/exp.csv old mode 100755 new mode 100644 index 37a6204848..c30efe4f55 --- a/tests/army/query/function/ans/exp.csv +++ b/tests/army/query/function/ans/exp.csv @@ -1,66 +1,260 @@ -1.000000000000000 -2.718281828459045 -4.481689070338065 -2.688117141816136e+43 -0.367879441171442 -0.223130160148430 -0.000000000000000 -3.718281828459045 -1.718281828459045 -2.718281828459045 -2.718281828459045 -2.718281828459045 -2.718281828459045 -2.718281828459045 -2.718281828459045 -2.718281828459045 -3.718281828459045 -1.718281828459045 -5.436563656918090 -1.359140914229523 -10.107337927389695 -4.670774270471606 -20.085536923187668 -2.718281828459046 -2.718281828459045 -3.718281828459045 -4.718281828459045 -5.718281828459045 -6.718281828459045 -1.000000000000000 -3.718281828459045 -9.389056098930650 -23.085536923187668 -58.598150033144236 -22026.465794806717895 -485165195.409790337085724 -148.413159102576600 -22026 -1.000000000000000 -2.718281828459045 -4.113250378782928 -5.652233674034091 -7.389056098930650 -3814279.104760214220732 -7.38905609893065 -1.6487212707001282 -42192.578453635847836 -5292.258432380726845 -17943.802618770550907 -75583.992598717435612 -44622.804904812772293 -4954.246535954979663 -14705.836248958077704 -57641.604897186582093 -75056.754435561466380 -30853.327779395312973 -42192.578453635847836 -5292.258432380726845 -17943.802618770550907 -75583.992598717435612 -44622.804904812772293 -4954.246535954979663 -14705.836248958077704 -57641.604897186582093 -75056.754435561466380 -30853.327779395312973 + +taos> select EXP(0) + exp(0) | +============================ + 1.000000000000000 | + +taos> select EXP(1) + exp(1) | +============================ + 2.718281828459045 | + +taos> select EXP(1.5) + exp(1.5) | +============================ + 4.481689070338065 | + +taos> select EXP(100) + exp(100) | +============================ + 2.688117141816136e+43 | + +taos> select EXP(-1) + exp(-1) | +============================ + 0.367879441171442 | + +taos> select EXP(-1.5) + exp(-1.5) | +============================ + 0.223130160148430 | + +taos> select EXP(-100) + exp(-100) | +============================ + 0.000000000000000 | + +taos> select EXP(1) + 1 + exp(1) + 1 | +============================ + 3.718281828459045 | + +taos> select EXP(1) - 1 + exp(1) - 1 | +============================ + 1.718281828459045 | + +taos> select EXP(1) * 1 + exp(1) * 1 | +============================ + 2.718281828459045 | + +taos> select EXP(1) / 1 + exp(1) / 1 | +============================ + 2.718281828459045 | + +taos> select exp(1) from ts_4893.meters limit 5 + exp(1) | +============================ + 2.718281828459045 | + 2.718281828459045 | + 2.718281828459045 | + 2.718281828459045 | + 2.718281828459045 | + +taos> select exp(1) + 1 from ts_4893.meters limit 1 + exp(1) + 1 | +============================ + 3.718281828459045 | + +taos> select exp(1) - 1 from ts_4893.meters limit 1 + exp(1) - 1 | +============================ + 1.718281828459045 | + +taos> select exp(1) * 2 from ts_4893.meters limit 1 + exp(1) * 2 | +============================ + 5.436563656918090 | + +taos> select exp(1) / 2 from ts_4893.meters limit 1 + exp(1) / 2 | +============================ + 1.359140914229523 | + +taos> select exp(2) + exp(1) from ts_4893.meters limit 1 + exp(2) + exp(1) | +============================ + 10.107337927389695 | + +taos> select exp(2) - exp(1) from ts_4893.meters limit 1 + exp(2) - exp(1) | +============================ + 4.670774270471606 | + +taos> select exp(2) * exp(1) from ts_4893.meters limit 1 + exp(2) * exp(1) | +============================ + 20.085536923187668 | + +taos> select exp(2) / exp(1) from ts_4893.meters limit 1 + exp(2) / exp(1) | +============================ + 2.718281828459046 | + +taos> select exp(1) + id from ts_4893.meters order by ts limit 5 + exp(1) + id | +============================ + 2.718281828459045 | + 3.718281828459045 | + 4.718281828459045 | + 5.718281828459045 | + 6.718281828459045 | + +taos> select exp(id) + id from ts_4893.meters order by ts limit 5 + exp(id) + id | +============================ + 1.000000000000000 | + 3.718281828459045 | + 9.389056098930650 | + 23.085536923187668 | + 58.598150033144236 | + +taos> select abs(EXP(10)) + abs(exp(10)) | +============================ + 22026.465794806717895 | + +taos> select pow(EXP(10), 2) + pow(exp(10), 2) | +============================ + 485165195.409790337085724 | + +taos> select sqrt(EXP(10)) + sqrt(exp(10)) | +============================ + 148.413159102576600 | + +taos> select cast(EXP(10) as int) + cast(exp(10) as int) | +======================= + 22026 | + +taos> select EXP(sqrt(id)) from ts_4893.meters order by ts limit 5 + exp(sqrt(id)) | +============================ + 1.000000000000000 | + 2.718281828459045 | + 4.113250378782928 | + 5.652233674034091 | + 7.389056098930650 | + +taos> select EXP(EXP(EXP(EXP(0)))) + exp(exp(exp(exp(0)))) | +============================ + 3814279.104760214220732 | + +taos> select exp(2) + exp(2) | +============================ + 7.389056098930650 | + +taos> select exp(0.5) + exp(0.5) | +============================ + 1.648721270700128 | + +taos> select exp(current) from ts_4893.d0 order by ts limit 10 + exp(current) | +============================ + 42192.578453635847836 | + 5292.258432380726845 | + 17943.802618770550907 | + 75583.992598717435612 | + 44622.804904812772293 | + 4954.246535954979663 | + 14705.836248958077704 | + 57641.604897186582093 | + 75056.754435561466380 | + 30853.327779395312973 | + +taos> select exp(current) from ts_4893.meters order by ts limit 10 + exp(current) | +============================ + 42192.578453635847836 | + 5292.258432380726845 | + 17943.802618770550907 | + 75583.992598717435612 | + 44622.804904812772293 | + 4954.246535954979663 | + 14705.836248958077704 | + 57641.604897186582093 | + 75056.754435561466380 | + 30853.327779395312973 | + +taos> select exp(null) + exp(null) | +============================ + NULL | + +taos> select exp(100000) + exp(100000) | +============================ + NULL | + +taos> select exp(-1000) + exp(-1000) | +============================ + 0.000000000000000 | + +taos> select exp(-9999999999) + exp(-9999999999) | +============================ + 0.000000000000000 | + +taos> select exp(0.0001) + exp(0.0001) | +============================ + 1.000100005000167 | + +taos> select exp(pi()) + exp(pi()) | +============================ + 23.140692632779267 | + +taos> select exp(voltage) from ts_4893.meters limit 1 + exp(voltage) | +============================ + 9.529727902367202e+95 | + +taos> select exp(current) from ts_4893.meters limit 1 + exp(current) | +============================ + 42192.578453635847836 | + +taos> select exp(phase) from ts_4893.meters limit 1 + exp(phase) | +============================ + 1.663457087766762 | + +taos> select exp(voltage + current) from ts_4893.meters limit 1 + exp(voltage + current) | +============================ + 4.020837921624308e+100 | + +taos> select exp(abs(current)) from ts_4893.meters limit 1 + exp(abs(current)) | +============================ + 42192.578453635847836 | + +taos> select exp(log(voltage)) from ts_4893.meters limit 1 + exp(log(voltage)) | +============================ + 220.999999999999915 | + +taos> select round(exp(voltage), 2) from ts_4893.meters limit 1 + round(exp(voltage), 2) | +============================ + 9.529727902367202e+95 | + diff --git a/tests/army/query/function/ans/ln.csv b/tests/army/query/function/ans/ln.csv old mode 100755 new mode 100644 index ef8db86bbf..5d6443ab79 --- a/tests/army/query/function/ans/ln.csv +++ b/tests/army/query/function/ans/ln.csv @@ -1,63 +1,265 @@ -4.605170185988092 -0.405465108108164 -4.605170185988092 -5.605170185988092 -3.605170185988092 -4.605170185988092 -4.605170185988092 -4.605170185988092 -4.605170185988092 -4.605170185988092 -4.605170185988092 -4.605170185988092 -5.605170185988092 -3.605170185988092 -9.210340371976184 -2.302585092994046 -5.298317366548037 --3.912023005428146 -3.192060730416365 -0.150514997831991 -4.605170185988092 -5.605170185988092 -6.605170185988092 -7.605170185988092 -8.605170185988092 -0.000000000000000 -1.693147180559945 -3.098612288668110 -4.386294361119891 -5.609437912434101 -2.302585092994046 -5.301898110478399 -1.517427129385146 -2 -0.000000000000000 -0.693147180559945 -0.881373587019543 -1.005052538742381 -1.098612288668110 --0.226079864157595 -2.000000000000000 -2.302585092994046 -1.144729885849400 -2.365559856336680 -2.148734409997751 -2.281872059185575 -2.418855857000369 -2.370804362614190 -2.141006941277850 -2.261346315560232 -2.394434736880126 -2.418232501568406 -2.335729681253415 -2.365559856336680 -2.148734409997751 -2.281872059185575 -2.418855857000369 -2.370804362614190 -2.141006941277850 -2.261346315560232 -2.394434736880126 -2.418232501568406 -2.335729681253415 + +taos> select LN(100) + ln(100) | +============================ + 4.605170185988092 | + +taos> select LN(1.5) + ln(1.5) | +============================ + 0.405465108108164 | + +taos> select LN(100) + ln(100) | +============================ + 4.605170185988092 | + +taos> select LN(100) + 1 + ln(100) + 1 | +============================ + 5.605170185988092 | + +taos> select LN(100) - 1 + ln(100) - 1 | +============================ + 3.605170185988092 | + +taos> select LN(100) * 1 + ln(100) * 1 | +============================ + 4.605170185988092 | + +taos> select LN(100) / 1 + ln(100) / 1 | +============================ + 4.605170185988092 | + +taos> select LN(100) from ts_4893.meters limit 5 + ln(100) | +============================ + 4.605170185988092 | + 4.605170185988092 | + 4.605170185988092 | + 4.605170185988092 | + 4.605170185988092 | + +taos> select LN(100) + 1 from ts_4893.meters limit 1 + ln(100) + 1 | +============================ + 5.605170185988092 | + +taos> select LN(100) - 1 from ts_4893.meters limit 1 + ln(100) - 1 | +============================ + 3.605170185988092 | + +taos> select LN(100) * 2 from ts_4893.meters limit 1 + ln(100) * 2 | +============================ + 9.210340371976184 | + +taos> select LN(100) / 2 from ts_4893.meters limit 1 + ln(100) / 2 | +============================ + 2.302585092994046 | + +taos> select LN(2) + LN(100) from ts_4893.meters limit 1 + ln(2) + ln(100) | +============================ + 5.298317366548037 | + +taos> select LN(2) - LN(100) from ts_4893.meters limit 1 + ln(2) - ln(100) | +============================ + -3.912023005428146 | + +taos> select LN(2) * LN(100) from ts_4893.meters limit 1 + ln(2) * ln(100) | +============================ + 3.192060730416365 | + +taos> select LN(2) / LN(100) from ts_4893.meters limit 1 + ln(2) / ln(100) | +============================ + 0.150514997831991 | + +taos> select LN(100) + id from ts_4893.meters order by ts limit 5 + ln(100) + id | +============================ + 4.605170185988092 | + 5.605170185988092 | + 6.605170185988092 | + 7.605170185988092 | + 8.605170185988092 | + +taos> select LN(id + 1) + id from ts_4893.meters order by ts limit 5 + ln(id + 1) + id | +============================ + 0.000000000000000 | + 1.693147180559945 | + 3.098612288668110 | + 4.386294361119891 | + 5.609437912434101 | + +taos> select ln(null) + ln(null) | +============================ + NULL | + +taos> select ln(0) + ln(0) | +============================ + NULL | + +taos> select ln(-5) + ln(-5) | +============================ + NULL | + +taos> select abs(LN(10)) + abs(ln(10)) | +============================ + 2.302585092994046 | + +taos> select pow(LN(10), 2) + pow(ln(10), 2) | +============================ + 5.301898110478399 | + +taos> select sqrt(LN(10)) + sqrt(ln(10)) | +============================ + 1.517427129385146 | + +taos> select cast(LN(10) as int) + cast(ln(10) as int) | +====================== + 2 | + +taos> select LN(sqrt(id) + 1) from ts_4893.meters order by ts limit 5 + ln(sqrt(id) + 1) | +============================ + 0.000000000000000 | + 0.693147180559945 | + 0.881373587019543 | + 1.005052538742381 | + 1.098612288668110 | + +taos> select LN(LN(LN(LN(10000)))) + ln(ln(ln(ln(10000)))) | +============================ + -0.226079864157595 | + +taos> select LN(EXP(2)) + ln(exp(2)) | +============================ + 2.000000000000000 | + +taos> select ln(10) + ln(10) | +============================ + 2.302585092994046 | + +taos> select ln(pi()) + ln(pi()) | +============================ + 1.144729885849400 | + +taos> select ln(current) from ts_4893.d0 order by ts limit 10 + ln(current) | +============================ + 2.365559856336680 | + 2.148734409997751 | + 2.281872059185575 | + 2.418855857000369 | + 2.370804362614190 | + 2.141006941277850 | + 2.261346315560232 | + 2.394434736880126 | + 2.418232501568406 | + 2.335729681253415 | + +taos> select ln(current) from ts_4893.meters order by ts limit 10 + ln(current) | +============================ + 2.365559856336680 | + 2.148734409997751 | + 2.281872059185575 | + 2.418855857000369 | + 2.370804362614190 | + 2.141006941277850 | + 2.261346315560232 | + 2.394434736880126 | + 2.418232501568406 | + 2.335729681253415 | + +taos> select ln(1) + ln(1) | +============================ + 0.000000000000000 | + +taos> select ln(20) + ln(20) | +============================ + 2.995732273553991 | + +taos> select ln(100) + ln(100) | +============================ + 4.605170185988092 | + +taos> select ln(99999999999999) + ln(99999999999999) | +============================ + 32.236191301916627 | + +taos> select ln(0.1) + ln(0.1) | +============================ + -2.302585092994045 | + +taos> select ln(2.718) + ln(2.718) | +============================ + 0.999896315728952 | + +taos> select ln(exp(1)) + ln(exp(1)) | +============================ + 1.000000000000000 | + +taos> select ln(voltage) from ts_4893.meters where voltage > 0 limit 1 + ln(voltage) | +============================ + 5.398162701517752 | + +taos> select ln(current) from ts_4893.meters where current > 0 limit 1 + ln(current) | +============================ + 2.365559856336680 | + +taos> select ln(phase) from ts_4893.meters where phase > 0 limit 1 + ln(phase) | +============================ + -0.675507636551043 | + +taos> select ln(exp(voltage)) from ts_4893.meters where voltage > 0 limit 1 + ln(exp(voltage)) | +============================ + 221.000000000000000 | + +taos> select ln(abs(current)) from ts_4893.meters where current != 0 limit 1 + ln(abs(current)) | +============================ + 2.365559856336680 | + +taos> select ln(sqrt(phase)) from ts_4893.meters where phase >= 0 limit 1 + ln(sqrt(phase)) | +============================ + -0.337753818275521 | + +taos> select ln(log(current)) from ts_4893.meters where current > 1 limit 1 + ln(log(current)) | +============================ + 0.861014719652538 | + diff --git a/tests/army/query/function/ans/max.csv b/tests/army/query/function/ans/max.csv index 62df7c5d53..f150ad1208 100644 --- a/tests/army/query/function/ans/max.csv +++ b/tests/army/query/function/ans/max.csv @@ -1,480 +1,605 @@ -9999 -11.9989996 -224 -x -一二三四五六七八九十 -四 -一二三四五六七八九十 -四 -1110 -2838 -4566 -6294 -8022 -9750 -9999 -3206 -4934 -6662 -8390 -9999 -1846 -3574 -5302 -7030 -8758 -9999 -2214 -3942 -5670 -7398 -9126 -9999 -2582 -4310 -6038 -7766 -9494 -9999 -2950 -4678 -6406 -8134 -9862 -9999 -3318 -5046 -6774 -8502 -9999 -1958 -3686 -5414 -7142 -8870 -9999 -2326 -4054 -5782 -7510 -9238 -9999 -2694 -4422 -6150 -7878 -9606 -9999 -11.9989996 -11.9969997 -11.9969997 -11.9989996 -11.9989996 -11.9989996 -11.9989996 -11.9969997 -11.9989996 -11.9980001 -11.9989996 -11.9989996 -11.9989996 -11.9969997 -11.9989996 -11.9980001 -11.9989996 -11.9989996 -11.9989996 -11.9969997 -11.9989996 -11.9980001 -11.9989996 -11.9989996 -11.9989996 -11.9969997 -11.9989996 -11.9989996 -11.9989996 -11.9989996 -11.9969997 -11.9989996 -11.9980001 -11.9989996 -11.9989996 -11.9989996 -11.9969997 -11.9989996 -11.9980001 -11.9989996 -11.9989996 -11.9989996 -11.9969997 -11.9989996 -11.9980001 -11.9989996 -11.9989996 -11.9989996 -11.9969997 -11.9989996 -11.9989996 -11.9989996 -11.9989996 -11.9989996 -11.9969997 -11.9989996 -11.9989996 -11.9989996 -11.9860001 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -224 -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -x -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -一二三四五六七八九十 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 -四 + +taos> select MAX(current) from ts_4893.meters + max(current) | +======================= + 11.9989996 | + +taos> select MAX(voltage) from ts_4893.meters + max(voltage) | +=============== + 224 | + +taos> select MAX(name) from ts_4893.meters + max(name) | +================================= + x | + +taos> select MAX(nch1) from ts_4893.meters + max(nch1) | +================================= + 一二三四五六七八九十 | + +taos> select MAX(nch2) from ts_4893.meters + max(nch2) | +================================= + 四 | + +taos> select MAX(var1) from ts_4893.meters + max(var1) | +================================= + 一二三四五六七八九十 | + +taos> select MAX(var2) from ts_4893.meters + max(var2) | +================================= + 四 | + +taos> select MAX(id) from ts_4893.meters interval(60d) + max(id) | +============== + 1110 | + 2838 | + 4566 | + 6294 | + 8022 | + 9750 | + 9999 | + 3206 | + 4934 | + 6662 | + 8390 | + 9999 | + 1846 | + 3574 | + 5302 | + 7030 | + 8758 | + 9999 | + 2214 | + 3942 | + 5670 | + 7398 | + 9126 | + 9999 | + 2582 | + 4310 | + 6038 | + 7766 | + 9494 | + 9999 | + 2950 | + 4678 | + 6406 | + 8134 | + 9862 | + 9999 | + 3318 | + 5046 | + 6774 | + 8502 | + 9999 | + 1958 | + 3686 | + 5414 | + 7142 | + 8870 | + 9999 | + 2326 | + 4054 | + 5782 | + 7510 | + 9238 | + 9999 | + 2694 | + 4422 | + 6150 | + 7878 | + 9606 | + 9999 | + +taos> select MAX(current) from ts_4893.meters interval(60d) + max(current) | +======================= + 11.9989996 | + 11.9969997 | + 11.9969997 | + 11.9989996 | + 11.9989996 | + 11.9989996 | + 11.9989996 | + 11.9969997 | + 11.9989996 | + 11.9980001 | + 11.9989996 | + 11.9989996 | + 11.9989996 | + 11.9969997 | + 11.9989996 | + 11.9980001 | + 11.9989996 | + 11.9989996 | + 11.9989996 | + 11.9969997 | + 11.9989996 | + 11.9980001 | + 11.9989996 | + 11.9989996 | + 11.9989996 | + 11.9969997 | + 11.9989996 | + 11.9989996 | + 11.9989996 | + 11.9989996 | + 11.9969997 | + 11.9989996 | + 11.9980001 | + 11.9989996 | + 11.9989996 | + 11.9989996 | + 11.9969997 | + 11.9989996 | + 11.9980001 | + 11.9989996 | + 11.9989996 | + 11.9989996 | + 11.9969997 | + 11.9989996 | + 11.9980001 | + 11.9989996 | + 11.9989996 | + 11.9989996 | + 11.9969997 | + 11.9989996 | + 11.9989996 | + 11.9989996 | + 11.9989996 | + 11.9989996 | + 11.9969997 | + 11.9989996 | + 11.9989996 | + 11.9989996 | + 11.9860001 | + +taos> select MAX(voltage) from ts_4893.meters interval(60d) + max(voltage) | +=============== + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + 224 | + +taos> select MAX(name) from ts_4893.meters interval(60d) + max(name) | +================================= + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + x | + +taos> select MAX(nch1) from ts_4893.meters interval(60d) + max(nch1) | +================================= + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + +taos> select MAX(nch2) from ts_4893.meters interval(60d) + max(nch2) | +================================= + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + +taos> select MAX(var1) from ts_4893.meters interval(60d) + max(var1) | +================================= + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + 一二三四五六七八九十 | + +taos> select MAX(var2) from ts_4893.meters interval(60d) + max(var2) | +================================= + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + 四 | + +taos> select max(null) from ts_4893.meters + max(null) | +======================== + NULL | + +taos> select max(id) from ts_4893.meters + max(id) | +============== + 9999 | + +taos> select max(id) from ts_4893.meters where id > 0 + max(id) | +============== + 9999 | + +taos> select max(id) from ts_4893.meters where id <= 0 + max(id) | +============== + 0 | + +taos> select max(phase) from ts_4893.meters where ts between '2023-01-01 00:00:00' and '2023-12-31 23:59:59' + max(phase) | +======================= + 0.9999660 | + +taos> select max(voltage) from ts_4893.meters where voltage is not null + max(voltage) | +=============== + 224 | + +taos> select max(total_voltage) from (select sum(voltage) as total_voltage from ts_4893.meters group by location) + max(total_voltage) | +======================== + 21948660 | + +taos> select round(max(current), 2) from ts_4893.meters + round(max(current), 2) | +========================= + 1.2000000e+01 | + +taos> select pow(max(current), 2) from ts_4893.meters + pow(max(current), 2) | +============================ + 143.975991296219036 | + +taos> select log(max(voltage) + 1) from ts_4893.meters + log(max(voltage) + 1) | +============================ + 5.416100402204420 | + +taos> select groupid, max(voltage) from ts_4893.meters group by groupid order by groupid + groupid | max(voltage) | +========================= + 1 | 224 | + +taos> select location, max(id) from ts_4893.meters group by location order by location + location | max(id) | +=================================== + beijing | 9999 | + +taos> select location, max(current) from ts_4893.meters group by location order by location + location | max(current) | +============================================ + beijing | 11.9989996 | + diff --git a/tests/army/query/function/ans/min.csv b/tests/army/query/function/ans/min.csv index d87f2264d7..9a8ba15287 100644 --- a/tests/army/query/function/ans/min.csv +++ b/tests/army/query/function/ans/min.csv @@ -1,480 +1,605 @@ -0 -8.0000000 -215 -haha -abc一二三abc一二三abc -a -abc一二三abc一二三abc -a -0 -1111 -2839 -4567 -6295 -8023 -0 -1479 -3207 -4935 -6663 -0 -119 -1847 -3575 -5303 -7031 -0 -487 -2215 -3943 -5671 -7399 -0 -855 -2583 -4311 -6039 -7767 -0 -1223 -2951 -4679 -6407 -8135 -0 -1591 -3319 -5047 -6775 -0 -231 -1959 -3687 -5415 -7143 -0 -599 -2327 -4055 -5783 -7511 -0 -967 -2695 -4423 -6151 -7879 -9607 -8.0000000 -8.0000000 -8.0000000 -8.0010004 -8.0010004 -8.0000000 -8.0000000 -8.0000000 -8.0019999 -8.0010004 -8.0000000 -8.0030003 -8.0000000 -8.0000000 -8.0019999 -8.0010004 -8.0000000 -8.0030003 -8.0000000 -8.0000000 -8.0019999 -8.0010004 -8.0000000 -8.0000000 -8.0000000 -8.0000000 -8.0019999 -8.0010004 -8.0000000 -8.0000000 -8.0000000 -8.0000000 -8.0010004 -8.0089998 -8.0000000 -8.0000000 -8.0000000 -8.0019999 -8.0010004 -8.0000000 -8.0030003 -8.0000000 -8.0000000 -8.0019999 -8.0010004 -8.0000000 -8.0019999 -8.0000000 -8.0000000 -8.0019999 -8.0010004 -8.0000000 -8.0000000 -8.0000000 -8.0000000 -8.0019999 -8.0010004 -8.0000000 -8.0050001 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -215 -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -haha -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a + +taos> select MIN(id) from ts_4893.meters + min(id) | +============== + 0 | + +taos> select MIN(current) from ts_4893.meters + min(current) | +======================= + 8.0000000 | + +taos> select MIN(voltage) from ts_4893.meters + min(voltage) | +=============== + 215 | + +taos> select MIN(name) from ts_4893.meters + min(name) | +================================= + haha | + +taos> select MIN(nch1) from ts_4893.meters + min(nch1) | +================================= + abc一二三abc一二三abc | + +taos> select MIN(nch2) from ts_4893.meters + min(nch2) | +================================= + a | + +taos> select MIN(var1) from ts_4893.meters + min(var1) | +================================= + abc一二三abc一二三abc | + +taos> select MIN(var2) from ts_4893.meters + min(var2) | +================================= + a | + +taos> select MIN(id) from ts_4893.meters interval(60d) + min(id) | +============== + 0 | + 1111 | + 2839 | + 4567 | + 6295 | + 8023 | + 0 | + 1479 | + 3207 | + 4935 | + 6663 | + 0 | + 119 | + 1847 | + 3575 | + 5303 | + 7031 | + 0 | + 487 | + 2215 | + 3943 | + 5671 | + 7399 | + 0 | + 855 | + 2583 | + 4311 | + 6039 | + 7767 | + 0 | + 1223 | + 2951 | + 4679 | + 6407 | + 8135 | + 0 | + 1591 | + 3319 | + 5047 | + 6775 | + 0 | + 231 | + 1959 | + 3687 | + 5415 | + 7143 | + 0 | + 599 | + 2327 | + 4055 | + 5783 | + 7511 | + 0 | + 967 | + 2695 | + 4423 | + 6151 | + 7879 | + 9607 | + +taos> select MIN(current) from ts_4893.meters interval(60d) + min(current) | +======================= + 8.0000000 | + 8.0000000 | + 8.0000000 | + 8.0010004 | + 8.0010004 | + 8.0000000 | + 8.0000000 | + 8.0000000 | + 8.0019999 | + 8.0010004 | + 8.0000000 | + 8.0030003 | + 8.0000000 | + 8.0000000 | + 8.0019999 | + 8.0010004 | + 8.0000000 | + 8.0030003 | + 8.0000000 | + 8.0000000 | + 8.0019999 | + 8.0010004 | + 8.0000000 | + 8.0000000 | + 8.0000000 | + 8.0000000 | + 8.0019999 | + 8.0010004 | + 8.0000000 | + 8.0000000 | + 8.0000000 | + 8.0000000 | + 8.0010004 | + 8.0089998 | + 8.0000000 | + 8.0000000 | + 8.0000000 | + 8.0019999 | + 8.0010004 | + 8.0000000 | + 8.0030003 | + 8.0000000 | + 8.0000000 | + 8.0019999 | + 8.0010004 | + 8.0000000 | + 8.0019999 | + 8.0000000 | + 8.0000000 | + 8.0019999 | + 8.0010004 | + 8.0000000 | + 8.0000000 | + 8.0000000 | + 8.0000000 | + 8.0019999 | + 8.0010004 | + 8.0000000 | + 8.0050001 | + +taos> select MIN(voltage) from ts_4893.meters interval(60d) + min(voltage) | +=============== + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + 215 | + +taos> select MIN(name) from ts_4893.meters interval(60d) + min(name) | +================================= + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + haha | + +taos> select MIN(nch1) from ts_4893.meters interval(60d) + min(nch1) | +================================= + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + +taos> select MIN(nch2) from ts_4893.meters interval(60d) + min(nch2) | +================================= + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + +taos> select MIN(var1) from ts_4893.meters interval(60d) + min(var1) | +================================= + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + +taos> select MIN(var2) from ts_4893.meters interval(60d) + min(var2) | +================================= + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + a | + +taos> select min(null) from ts_4893.meters + min(null) | +======================== + NULL | + +taos> select min(id) from ts_4893.meters where id > 0 + min(id) | +============== + 1 | + +taos> select min(id) from ts_4893.meters where id <= 0 + min(id) | +============== + 0 | + +taos> select min(phase) from ts_4893.meters where ts between '2023-01-01 00:00:00' and '2023-12-31 23:59:59' + min(phase) | +======================= + 0.0001700 | + +taos> select min(voltage) from ts_4893.meters where voltage is not null + min(voltage) | +=============== + 215 | + +taos> select min(total_voltage) from (select sum(voltage) as total_voltage from ts_4893.meters group by location) + min(total_voltage) | +======================== + 21948660 | + +taos> select round(min(current), 2) from ts_4893.meters + round(min(current), 2) | +========================= + 8.0000000e+00 | + +taos> select pow(min(current), 2) from ts_4893.meters + pow(min(current), 2) | +============================ + 64.000000000000000 | + +taos> select log(min(voltage) + 1) from ts_4893.meters + log(min(voltage) + 1) | +============================ + 5.375278407684165 | + +taos> select groupid, min(voltage) from ts_4893.meters group by groupid order by groupid + groupid | min(voltage) | +========================= + 1 | 215 | + +taos> select location, min(current) from ts_4893.meters group by location order by location + location | min(current) | +============================================ + beijing | 8.0000000 | + +taos> select location, min(id) from ts_4893.meters group by location order by location + location | min(id) | +=================================== + beijing | 0 | + diff --git a/tests/army/query/function/ans/mod.csv b/tests/army/query/function/ans/mod.csv index 87f776a3a9..fb0a09c14c 100644 --- a/tests/army/query/function/ans/mod.csv +++ b/tests/army/query/function/ans/mod.csv @@ -1,72 +1,235 @@ -1.550000000000001 -0.550000000000001 -0.550000000000001 -0.550000000000001 -0.550000000000001 --0.550000000000001 -0.000000000000000 -1.550000000000001 -1.234567890000022e-01 -1.234567910432816e-01 -1.234567910432816e-01 -1.123456791043282e+00 -1.234567910432816e-01 -1.123456791043282e+00 -1.123456791043282e+00 -3.123456791043282e+00 -6.123456791043282e+00 -1.123456791043282e+00 -1.234567910432816e-01 -1.123456791043282e+00 -0.649999618530273 -0.574000358581543 -0.795000076293945 -3.232999801635742 -0.706000328063965 -2.508000373840332 -2.595999717712402 -2.961999893188477 -2.225999832153320 -0.336999893188477 -0.649999618530273 -0.574000358581543 -0.795000076293945 -0.232999801635742 -0.706000328063965 -0.508000373840332 -0.595999717712402 -0.961999893188477 -0.225999832153320 -0.336999893188477 -2.634337159700784e-01 -9.281394021770111e-01 -1.296964830944782e-01 -3.351566768190027e+00 -3.272002495118848e+00 -2.916847677517688e+00 -3.097741066924800e+00 -3.310891102586806e+00 -3.350522322288470e+00 -3.215120509901375e+00 -1 -1 -0 -1 -2 -0 -1 -2 -0 -1 -2 -0 -0 -1 -2 -0 -1 -2 -0 -1 -2 -0 + +taos> select MOD(10.55, 3) + mod(10.55, 3) | +============================ + 1.550000000000001 | + +taos> select MOD(10.55, 2) + mod(10.55, 2) | +============================ + 0.550000000000001 | + +taos> select MOD(10.55, 1) + mod(10.55, 1) | +============================ + 0.550000000000001 | + +taos> select MOD(10.55, -1) + mod(10.55, -1) | +============================ + 0.550000000000001 | + +taos> select MOD(10.55, -10) + mod(10.55, -10) | +============================ + 0.550000000000001 | + +taos> select MOD(-10.55, 1) + mod(-10.55, 1) | +============================ + -0.550000000000001 | + +taos> select MOD(99, 1) + mod(99, 1) | +============================ + 0.000000000000000 | + +taos> select MOD(10.55, 1) + 1 + mod(10.55, 1) + 1 | +============================ + 1.550000000000001 | + +taos> select MOD(MOD(MOD(MOD(MOD(MOD(MOD(123.123456789, 9), 8), 7), 6), 5), 4), 3) + mod(mod(mod(mod(mod(mod(mod(123.123456789, 9), 8), 7), 6), 5), 4 | +=================================================================== + 1.234567890000022e-01 | + +taos> select MOD(MOD(MOD(MOD(MOD(MOD(MOD(123456789.123456789, -1), -2), -3), -4), -5), -6), -7) + mod(mod(mod(mod(mod(mod(mod(123456789.123456789, -1), -2), -3), | +=================================================================== + 1.234567910432816e-01 | + +taos> select MOD(87654321.123456789, id + 1) from ts_4893.meters order by ts limit 10 + mod(87654321.123456789, id + 1) | +================================== + 1.234567910432816e-01 | + 1.123456791043282e+00 | + 1.234567910432816e-01 | + 1.123456791043282e+00 | + 1.123456791043282e+00 | + 3.123456791043282e+00 | + 6.123456791043282e+00 | + 1.123456791043282e+00 | + 1.234567910432816e-01 | + 1.123456791043282e+00 | + +taos> select MOD(current, id + 1) from ts_4893.meters order by ts limit 10 + mod(current, id + 1) | +============================ + 0.649999618530273 | + 0.574000358581543 | + 0.795000076293945 | + 3.232999801635742 | + 0.706000328063965 | + 2.508000373840332 | + 2.595999717712402 | + 2.961999893188477 | + 2.225999832153320 | + 0.336999893188477 | + +taos> select MOD(current, 1) from ts_4893.meters order by ts limit 10 + mod(current, 1) | +============================ + 0.649999618530273 | + 0.574000358581543 | + 0.795000076293945 | + 0.232999801635742 | + 0.706000328063965 | + 0.508000373840332 | + 0.595999717712402 | + 0.961999893188477 | + 0.225999832153320 | + 0.336999893188477 | + +taos> select MOD(sqrt(current), abs(id + 1)) from ts_4893.meters order by ts limit 10 + mod(sqrt(current), abs(id + 1)) | +================================== + 2.634337159700784e-01 | + 9.281394021770111e-01 | + 1.296964830944782e-01 | + 3.351566768190027e+00 | + 3.272002495118848e+00 | + 2.916847677517688e+00 | + 3.097741066924800e+00 | + 3.310891102586806e+00 | + 3.350522322288470e+00 | + 3.215120509901375e+00 | + +taos> select mod(10, -3) + mod(10, -3) | +============================ + 1.000000000000000 | + +taos> select mod(10, 3) + mod(10, 3) | +============================ + 1.000000000000000 | + +taos> select mod(id, 3) from ts_4893.d0 order by ts limit 10 + mod(id, 3) | +============================ + 0.000000000000000 | + 1.000000000000000 | + 2.000000000000000 | + 0.000000000000000 | + 1.000000000000000 | + 2.000000000000000 | + 0.000000000000000 | + 1.000000000000000 | + 2.000000000000000 | + 0.000000000000000 | + +taos> select mod(id, 3) from ts_4893.meters order by ts limit 10 + mod(id, 3) | +============================ + 0.000000000000000 | + 1.000000000000000 | + 2.000000000000000 | + 0.000000000000000 | + 1.000000000000000 | + 2.000000000000000 | + 0.000000000000000 | + 1.000000000000000 | + 2.000000000000000 | + 0.000000000000000 | + +taos> select mod(null, 2) + mod(null, 2) | +============================ + NULL | + +taos> select mod(10, null) + mod(10, null) | +============================ + NULL | + +taos> select mod(10, 0) + mod(10, 0) | +============================ + NULL | + +taos> select mod(-10, 0) + mod(-10, 0) | +============================ + NULL | + +taos> select mod(5, 0) + mod(5, 0) | +============================ + NULL | + +taos> select mod(0, 1) + mod(0, 1) | +============================ + 0.000000000000000 | + +taos> select mod(1, 1) + mod(1, 1) | +============================ + 0.000000000000000 | + +taos> select mod(5, 2) + mod(5, 2) | +============================ + 1.000000000000000 | + +taos> select mod(5, -3) + mod(5, -3) | +============================ + 2.000000000000000 | + +taos> select mod(15, 4) + mod(15, 4) | +============================ + 3.000000000000000 | + +taos> select mod(-5, 3) + mod(-5, 3) | +============================ + -2.000000000000000 | + +taos> select mod(voltage, 2) from ts_4893.meters limit 1 + mod(voltage, 2) | +============================ + 1.000000000000000 | + +taos> select mod(current, 10) from ts_4893.meters limit 1 + mod(current, 10) | +============================ + 0.649999618530273 | + +taos> select mod(current, log(100)) from ts_4893.meters limit 1 + mod(current, log(100)) | +============================ + 1.439659246554090 | + +taos> select mod(phase, 4) from ts_4893.meters limit 1 + mod(phase, 4) | +============================ + 0.508898019790649 | + +taos> select mod(abs(voltage), 3) from ts_4893.meters limit 1 + mod(abs(voltage), 3) | +============================ + 2.000000000000000 | + +taos> select mod(phase, sqrt(16)) from ts_4893.meters limit 1 + mod(phase, sqrt(16)) | +============================ + 0.508898019790649 | + +taos> select mod(round(voltage), 5) from ts_4893.meters limit 1 + mod(round(voltage), 5) | +============================ + 1.000000000000000 | + diff --git a/tests/army/query/function/ans/pi.csv b/tests/army/query/function/ans/pi.csv index 68dd383cb3..1afc45f953 100644 --- a/tests/army/query/function/ans/pi.csv +++ b/tests/army/query/function/ans/pi.csv @@ -1,28 +1,194 @@ -3.141592653589793 -4.141592653589793 -2.141592653589793 -6.283185307179586 -1.570796326794897 -3.141592653589793 -3.141592653589793 -3.141592653589793 -3.141592653589793 -3.141592653589793 -4.141592653589793 -2.141592653589793 -6.283185307179586 -1.570796326794897 -6.283185307179586 -0.000000000000000 -9.869604401089358 -1.000000000000000 -3.141592653589793 -4.141592653589793 -5.141592653589793 -6.141592653589793 -7.141592653589793 -3.141592653589793 -9.869604401089358 -1.772453850905516 -3 -3.141592653589793 + +taos> select pi() + pi() | +============================ + 3.141592653589793 | + +taos> select pi() + 1 + pi() + 1 | +============================ + 4.141592653589793 | + +taos> select pi() - 1 + pi() - 1 | +============================ + 2.141592653589793 | + +taos> select pi() * 2 + pi() * 2 | +============================ + 6.283185307179586 | + +taos> select pi() / 2 + pi() / 2 | +============================ + 1.570796326794897 | + +taos> select pi() from ts_4893.meters limit 5 + pi() | +============================ + 3.141592653589793 | + 3.141592653589793 | + 3.141592653589793 | + 3.141592653589793 | + 3.141592653589793 | + +taos> select pi() + 1 from ts_4893.meters limit 1 + pi() + 1 | +============================ + 4.141592653589793 | + +taos> select pi() - 1 from ts_4893.meters limit 1 + pi() - 1 | +============================ + 2.141592653589793 | + +taos> select pi() * 2 from ts_4893.meters limit 1 + pi() * 2 | +============================ + 6.283185307179586 | + +taos> select pi() / 2 from ts_4893.meters limit 1 + pi() / 2 | +============================ + 1.570796326794897 | + +taos> select pi() + pi() from ts_4893.meters limit 1 + pi() + pi() | +============================ + 6.283185307179586 | + +taos> select pi() - pi() from ts_4893.meters limit 1 + pi() - pi() | +============================ + 0.000000000000000 | + +taos> select pi() * pi() from ts_4893.meters limit 1 + pi() * pi() | +============================ + 9.869604401089358 | + +taos> select pi() / pi() from ts_4893.meters limit 1 + pi() / pi() | +============================ + 1.000000000000000 | + +taos> select pi() + id from ts_4893.meters order by ts limit 5 + pi() + id | +============================ + 3.141592653589793 | + 4.141592653589793 | + 5.141592653589793 | + 6.141592653589793 | + 7.141592653589793 | + +taos> select abs(pi()) + abs(pi()) | +============================ + 3.141592653589793 | + +taos> select pow(pi(), 2) + pow(pi(), 2) | +============================ + 9.869604401089358 | + +taos> select sqrt(pi()) + sqrt(pi()) | +============================ + 1.772453850905516 | + +taos> select cast(pi() as int) + cast(pi() as int) | +==================== + 3 | + +taos> select pi() + pi() | +============================ + 3.141592653589793 | + +taos> select substring_index(null, '.', 2) + substring_index(null, '.', 2) | +================================ + NULL | + +taos> select pi() + null + pi() + null | +============================ + NULL | + +taos> select pi() * 0 + pi() * 0 | +============================ + 0.000000000000000 | + +taos> select pi() / 0 + pi() / 0 | +============================ + NULL | + +taos> select pi() * 0.5 + pi() * 0.5 | +============================ + 1.570796326794897 | + +taos> select pi() * -1 + pi() * -1 | +============================ + -3.141592653589793 | + +taos> select pi() * name from ts_4893.meters limit 1 + pi() * name | +============================ + 0.000000000000000 | + +taos> select pi() * voltage from ts_4893.meters limit 1 + pi() * voltage | +============================ + 694.291976443344311 | + +taos> select pi() * phase * 2 from ts_4893.meters limit 1 + pi() * phase * 2 | +============================ + 3.197500560801395 | + +taos> select round(pi(), 6) + round(pi(), 6) | +============================ + 3.141593000000000 | + +taos> select round(pi() * phase, 2) from ts_4893.meters limit 1 + round(pi() * phase, 2) | +============================ + 1.600000000000000 | + +taos> select sqrt(pi() * voltage) from ts_4893.meters limit 1 + sqrt(pi() * voltage) | +============================ + 26.349420799010826 | + +taos> select sqrt(current / pi()) from ts_4893.meters limit 1 + sqrt(current / pi()) | +============================ + 1.841195309148865 | + +taos> select abs(pi() * phase) from ts_4893.meters limit 1 + abs(pi() * phase) | +============================ + 1.598750280400697 | + +taos> select log(pi() * voltage) from ts_4893.meters limit 1 + log(pi() * voltage) | +============================ + 6.542892587367153 | + +taos> select voltage / pi() from ts_4893.meters limit 1 + voltage / pi() | +============================ + 70.346484846617741 | + +taos> select id, case when voltage > 100 then pi() else pi() / 2 end from ts_4893.meters limit 1 + id | case when voltage > 100 then pi() else pi() / 2 end | +==================================================================== + 0 | 3.141592653589793e+00 | + diff --git a/tests/army/query/function/ans/pi_1.csv b/tests/army/query/function/ans/pi_1.csv deleted file mode 100644 index 6f9baf1a71..0000000000 --- a/tests/army/query/function/ans/pi_1.csv +++ /dev/null @@ -1,114 +0,0 @@ - -taos> select pi() - pi() | -============================ - 3.141592653589793 | - -taos> select pi() + 1 - pi() + 1 | -============================ - 4.141592653589793 | - -taos> select pi() - 1 - pi() - 1 | -============================ - 2.141592653589793 | - -taos> select pi() * 2 - pi() * 2 | -============================ - 6.283185307179586 | - -taos> select pi() / 2 - pi() / 2 | -============================ - 1.570796326794897 | - -taos> select pi() from ts_4893.meters limit 5 - pi() | -============================ - 3.141592653589793 | - 3.141592653589793 | - 3.141592653589793 | - 3.141592653589793 | - 3.141592653589793 | - -taos> select pi() + 1 from ts_4893.meters limit 1 - pi() + 1 | -============================ - 4.141592653589793 | - -taos> select pi() - 1 from ts_4893.meters limit 1 - pi() - 1 | -============================ - 2.141592653589793 | - -taos> select pi() * 2 from ts_4893.meters limit 1 - pi() * 2 | -============================ - 6.283185307179586 | - -taos> select pi() / 2 from ts_4893.meters limit 1 - pi() / 2 | -============================ - 1.570796326794897 | - -taos> select pi() + pi() from ts_4893.meters limit 1 - pi() + pi() | -============================ - 6.283185307179586 | - -taos> select pi() - pi() from ts_4893.meters limit 1 - pi() - pi() | -============================ - 0.000000000000000 | - -taos> select pi() * pi() from ts_4893.meters limit 1 - pi() * pi() | -============================ - 9.869604401089358 | - -taos> select pi() / pi() from ts_4893.meters limit 1 - pi() / pi() | -============================ - 1.000000000000000 | - -taos> select pi() + id from ts_4893.meters order by ts limit 5 - pi() + id | -============================ - 3.141592653589793 | - 4.141592653589793 | - 5.141592653589793 | - 6.141592653589793 | - 7.141592653589793 | - -taos> select abs(pi()) - abs(pi()) | -============================ - 3.141592653589793 | - -taos> select pow(pi(), 2) - pow(pi(), 2) | -============================ - 9.869604401089358 | - -taos> select sqrt(pi()) - sqrt(pi()) | -============================ - 1.772453850905516 | - -taos> select cast(pi() as int) - cast(pi() as int) | -==================== - 3 | - -taos> select pi() - pi() | -============================ - 3.141592653589793 | - -taos> select substring_index(null, '.', 2) - substring_index(null, '.', 2) | -================================ - NULL | - diff --git a/tests/army/query/function/ans/position.csv b/tests/army/query/function/ans/position.csv index 1f3534572e..1547564322 100644 --- a/tests/army/query/function/ans/position.csv +++ b/tests/army/query/function/ans/position.csv @@ -1,176 +1,447 @@ -1 -3 -1 -0 -14 -0 -7 -1 -1 -0 -4 -2 -5 -4 -2 -0 -0 -0 -0 -4 -4 -5 -4 -1 -3 -4 -0 -0 -5 -0 -4 -4 -1 -1 -3 -4 -0 -0 -0 -0 -3 -2 -1 -4 -3 -0 -0 -0 -0 -0 -4 -1 -1 -3 -1 -3 -4 -3 -4 -4 -1 -1 -4 -1 -1 -1 -1 -4 -1 -1 -6 -3 -5 -5 -4 -5 -5 -2 -7 -2 -4 -1 -1 -4 -1 -4 -1 -4 -4 -1 -1 -1.000000000000000e+00 -1 -0 -1 -1 -0 -0 -0 -0 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -4 -0 -0 -0 -0 -0 -0 -0 -4 -0 -4 -0 -0 -0 -0 -0 -0 -0 -4 -0 -4 -0 -0 -5 -0 -0 -0 -0 -0 -0 -4 -0 -0 -5 -0 -0 -0 -0 -0 -0 + +taos> select POSITION('北' IN '北京涛思') + position('北' in '北京涛思') | +==================================== + 1 | + +taos> select POSITION('涛思' IN '北京涛思') + position('涛思' in '北京涛思') | +======================================= + 3 | + +taos> select POSITION('a' IN 'abcd') + position('a' in 'abcd') | +========================== + 1 | + +taos> select POSITION('e' IN 'abcd') + position('e' in 'abcd') | +========================== + 0 | + +taos> select POSITION('好,' IN 'hello,world.你好,世界。') + position('好,' in 'hello,world.你好,世界。') | +========================================================= + 14 | + +taos> select POSITION(',你' IN 'hello,world.你好,世界。') + position(',你' in 'hello,world.你好,世界。') | +========================================================= + 0 | + +taos> select POSITION('world' IN 'hello,world.你好,世界。') + position('world' in 'hello,world.你好,世界。') | +======================================================== + 7 | + +taos> select POSITION('aaa' IN 'aaaaaaaaa') + position('aaa' in 'aaaaaaaaa') | +================================= + 1 | + +taos> select POSITION(CONCAT('a','b','c') IN CONCAT('abc','def','ghi')) + position(concat('a','b','c') in concat('abc','def','ghi')) | +============================================================= + 1 | + +taos> select POSITION(CONCAT('a','b','d') IN CONCAT('abc','def','ghi')) + position(concat('a','b','d') in concat('abc','def','ghi')) | +============================================================= + 0 | + +taos> select POSITION(nch2 IN nch1) from ts_4893.meters where POSITION(nch2 IN nch1) != 0 order by ts limit 5 + position(nch2 in nch1) | +========================= + 4 | + 2 | + 5 | + 4 | + 2 | + +taos> select POSITION(nch2 IN nch1) from ts_4893.meters order by ts limit 5 + position(nch2 in nch1) | +========================= + 0 | + 0 | + 0 | + 0 | + 4 | + +taos> select POSITION(var2 IN var1) from ts_4893.meters where POSITION(var2 IN var1) != 0 order by ts limit 5 + position(var2 in var1) | +========================= + 4 | + 5 | + 4 | + 1 | + 3 | + +taos> select POSITION(var2 IN var1) from ts_4893.meters order by ts limit 5 + position(var2 in var1) | +========================= + 4 | + 0 | + 0 | + 5 | + 0 | + +taos> select POSITION(var2 IN nch1) from ts_4893.meters where POSITION(var2 IN nch1) != 0 order by ts limit 5 + position(var2 in nch1) | +========================= + 4 | + 4 | + 1 | + 1 | + 3 | + +taos> select POSITION(var2 IN nch1) from ts_4893.meters order by ts limit 5 + position(var2 in nch1) | +========================= + 4 | + 0 | + 0 | + 0 | + 0 | + +taos> select POSITION(nch2 IN var1) from ts_4893.meters where POSITION(nch2 IN var1) != 0 order by ts limit 5 + position(nch2 in var1) | +========================= + 3 | + 2 | + 1 | + 4 | + 3 | + +taos> select POSITION(nch2 IN var1) from ts_4893.meters order by ts limit 5 + position(nch2 in var1) | +========================= + 0 | + 0 | + 0 | + 0 | + 0 | + +taos> select POSITION('a' IN nch1) from ts_4893.meters where POSITION('a' IN nch1) != 0 order by ts limit 5 + position('a' in nch1) | +======================== + 4 | + 1 | + 1 | + 3 | + 1 | + +taos> select POSITION('a' IN var1) from ts_4893.meters where POSITION('a' IN var1) != 0 order by ts limit 5 + position('a' in var1) | +======================== + 3 | + 4 | + 3 | + 4 | + 4 | + +taos> select POSITION('一' IN nch1) from ts_4893.meters where POSITION('一' IN nch1) != 0 order by ts limit 5 + position('一' in nch1) | +========================== + 1 | + 1 | + 4 | + 1 | + 1 | + +taos> select POSITION('一' IN var1) from ts_4893.meters where POSITION('一' IN var1) != 0 order by ts limit 5 + position('一' in var1) | +========================== + 1 | + 1 | + 4 | + 1 | + 1 | + +taos> select POSITION(nch2 IN 'abcdefghijklmn') from ts_4893.meters where POSITION(nch2 IN 'abcdefghijklmn') != 0 order by ts limit 5 + position(nch2 in 'abcdefghijklmn') | +===================================== + 6 | + 3 | + 5 | + 5 | + 4 | + +taos> select POSITION(var2 IN 'abcdefghijklmn') from ts_4893.meters where POSITION(var2 IN 'abcdefghijklmn') != 0 order by ts limit 5 + position(var2 in 'abcdefghijklmn') | +===================================== + 5 | + 5 | + 2 | + 7 | + 2 | + +taos> select POSITION(nch2 IN '一二三四五六七八九十') from ts_4893.meters where POSITION(nch2 IN '一二三四五六七八九十') != 0 order by ts limit 5 + position(nch2 in '一二三四五六七八九十') | +===================================================== + 4 | + 1 | + 1 | + 4 | + 1 | + +taos> select POSITION(var2 IN '一二三四五六七八九十') from ts_4893.meters where POSITION(var2 IN '一二三四五六七八九十') != 0 order by ts limit 5 + position(var2 in '一二三四五六七八九十') | +===================================================== + 4 | + 1 | + 4 | + 4 | + 1 | + +taos> select ABS(POSITION('aaa' IN 'aaaaaaaaa')) + abs(position('aaa' in 'aaaaaaaaa')) | +====================================== + 1 | + +taos> select POW(POSITION('aaa' IN 'aaaaaaaaa'), 2) + pow(position('aaa' in 'aaaaaaaaa'), 2) | +========================================= + 1.000000000000000e+00 | + +taos> select position('t' in 'taos') + position('t' in 'taos') | +========================== + 1 | + +taos> select position('ustc' in 'taos') + position('ustc' in 'taos') | +============================= + 0 | + +taos> select position('' in '') + position('' in '') | +======================== + 1 | + +taos> select position('' in 'taos') + position('' in 'taos') | +========================= + 1 | + +taos> select position(nch2 in nch1) from ts_4893.d0 order by ts limit 10 + position(nch2 in nch1) | +========================= + 0 | + 0 | + 0 | + 0 | + 4 | + 0 | + 0 | + 0 | + 0 | + 0 | + +taos> select position(nch2 in nch1) from ts_4893.meters order by ts limit 10 + position(nch2 in nch1) | +========================= + 0 | + 0 | + 0 | + 0 | + 4 | + 0 | + 0 | + 0 | + 0 | + 0 | + +taos> select position(nch2 in var1) from ts_4893.d0 order by ts limit 10 + position(nch2 in var1) | +========================= + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + +taos> select position(nch2 in var1) from ts_4893.meters order by ts limit 10 + position(nch2 in var1) | +========================= + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + +taos> select position(var2 in nch1) from ts_4893.d0 order by ts limit 10 + position(var2 in nch1) | +========================= + 4 | + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + 4 | + 0 | + +taos> select position(var2 in nch1) from ts_4893.meters order by ts limit 10 + position(var2 in nch1) | +========================= + 4 | + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + 4 | + 0 | + +taos> select position(var2 in var1) from ts_4893.d0 order by ts limit 10 + position(var2 in var1) | +========================= + 4 | + 0 | + 0 | + 5 | + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + +taos> select position(var2 in var1) from ts_4893.meters order by ts limit 10 + position(var2 in var1) | +========================= + 4 | + 0 | + 0 | + 5 | + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + +taos> select position('t' in null) + position('t' in null) | +======================== + NULL | + +taos> select position(null in 'taos') + position(null in 'taos') | +=========================== + NULL | + +taos> select position('' in 'A') + position('' in 'A') | +======================== + 1 | + +taos> select position('A' in 'A') + position('A' in 'A') | +======================== + 1 | + +taos> select position('A' in '') + position('A' in '') | +======================== + 0 | + +taos> select position('A' in null) + position('A' in null) | +======================== + NULL | + +taos> select position('Z' in 'ABC') + position('Z' in 'ABC') | +========================= + 0 | + +taos> select position('l' in 'Hello') + position('l' in 'Hello') | +=========================== + 3 | + +taos> select position('s' in 'meters') + position('s' in 'meters') | +============================ + 6 | + +taos> select position('中' in '中国') + position('中' in '中国') | +============================== + 1 | + +taos> select position('e' in 'é') + position('e' in 'é') | +======================== + 0 | + +taos> select position('W' in 'Hello World') + position('W' in 'Hello World') | +================================= + 7 | + +taos> select position('@' in '!@#') + position('@' in '!@#') | +========================= + 2 | + +taos> select position('6' in '12345') + position('6' in '12345') | +=========================== + 0 | + +taos> select position('A' in trim(' A ')) + position('A' in trim(' A ')) | +=============================== + 1 | + +taos> select position('A' in upper('abc')) + position('A' in upper('abc')) | +================================ + 1 | + +taos> select position('B' in concat('A', 'B')) + position('B' in concat('A', 'B')) | +==================================== + 2 | + +taos> select position('x' in replace('Hello', 'l', 'x')) + position('x' in replace('Hello', 'l', 'x')) | +============================================== + 3 | + +taos> select name, position('e' in name) from ts_4893.meters limit 1 + name | position('e' in name) | +========================================================= + lili | 0 | + +taos> select name, position('a' in substring(name, 2, 5)) from ts_4893.meters limit 1 + name | position('a' in substring(name, 2, 5)) | +========================================================================== + lili | 0 | + +taos> select nch1, position('n' in nch1) from ts_4893.meters limit 1 + nch1 | position('n' in nch1) | +========================================================= + novel | 1 | + +taos> select var1, position('1' in var1) from ts_4893.meters limit 1 + var1 | position('1' in var1) | +========================================================= + novel | 0 | + diff --git a/tests/army/query/function/ans/radians.csv b/tests/army/query/function/ans/radians.csv index 0f6e56c565..83814344bc 100644 --- a/tests/army/query/function/ans/radians.csv +++ b/tests/army/query/function/ans/radians.csv @@ -1,66 +1,275 @@ -0.000000000000000 -0.017453292519943 -0.026179938779915 -1.745329251994330 --0.017453292519943 --0.026179938779915 --1.745329251994330 -1.017453292519943 --0.982546707480057 -0.017453292519943 -0.017453292519943 -0.017453292519943 -0.017453292519943 -0.017453292519943 -0.017453292519943 -0.017453292519943 -1.017453292519943 --0.982546707480057 -0.034906585039887 -0.008726646259972 -0.052359877559830 -0.017453292519943 -0.000609234839573 -2.000000000000000 -0.017453292519943 -1.017453292519943 -2.017453292519943 -3.017453292519943 -4.017453292519943 -0.000000000000000 -1.017453292519943 -2.034906585039887 -3.052359877559830 -4.069813170079773 -0.174532925199433 -3.141592653589793 -0.174532925199433 -0.030461741978671 -0.417771379105167 -0 -0.000000000000000 -0.017453292519943 -0.024682682989769 -0.030229989403904 -0.034906585039887 -3.141592653589793 -0.185877558679493 -0.149644536324422 -0.170955001564425 -0.196052831414414 -0.186854955444309 -0.148492619284422 -0.167481790094528 -0.191322990739406 -0.195930658899406 -0.180414682914441 -0.185877558679493 -0.149644536324422 -0.170955001564425 -0.196052831414414 -0.186854955444309 -0.148492619284422 -0.167481790094528 -0.191322990739406 -0.195930658899406 -0.180414682914441 + +taos> select RADIANS(0) + radians(0) | +============================ + 0.000000000000000 | + +taos> select RADIANS(1) + radians(1) | +============================ + 0.017453292519943 | + +taos> select RADIANS(1.5) + radians(1.5) | +============================ + 0.026179938779915 | + +taos> select RADIANS(100) + radians(100) | +============================ + 1.745329251994330 | + +taos> select RADIANS(-1) + radians(-1) | +============================ + -0.017453292519943 | + +taos> select RADIANS(-1.5) + radians(-1.5) | +============================ + -0.026179938779915 | + +taos> select RADIANS(-100) + radians(-100) | +============================ + -1.745329251994330 | + +taos> select RADIANS(1) + 1 + radians(1) + 1 | +============================ + 1.017453292519943 | + +taos> select RADIANS(1) - 1 + radians(1) - 1 | +============================ + -0.982546707480057 | + +taos> select RADIANS(1) * 1 + radians(1) * 1 | +============================ + 0.017453292519943 | + +taos> select RADIANS(1) / 1 + radians(1) / 1 | +============================ + 0.017453292519943 | + +taos> select RADIANS(1) from ts_4893.meters limit 5 + radians(1) | +============================ + 0.017453292519943 | + 0.017453292519943 | + 0.017453292519943 | + 0.017453292519943 | + 0.017453292519943 | + +taos> select RADIANS(1) + 1 from ts_4893.meters limit 1 + radians(1) + 1 | +============================ + 1.017453292519943 | + +taos> select RADIANS(1) - 1 from ts_4893.meters limit 1 + radians(1) - 1 | +============================ + -0.982546707480057 | + +taos> select RADIANS(1) * 2 from ts_4893.meters limit 1 + radians(1) * 2 | +============================ + 0.034906585039887 | + +taos> select RADIANS(1) / 2 from ts_4893.meters limit 1 + radians(1) / 2 | +============================ + 0.008726646259972 | + +taos> select RADIANS(2) + RADIANS(1) from ts_4893.meters limit 1 + radians(2) + radians(1) | +============================ + 0.052359877559830 | + +taos> select RADIANS(2) - RADIANS(1) from ts_4893.meters limit 1 + radians(2) - radians(1) | +============================ + 0.017453292519943 | + +taos> select RADIANS(2) * RADIANS(1) from ts_4893.meters limit 1 + radians(2) * radians(1) | +============================ + 0.000609234839573 | + +taos> select RADIANS(2) / RADIANS(1) from ts_4893.meters limit 1 + radians(2) / radians(1) | +============================ + 2.000000000000000 | + +taos> select RADIANS(1) + id from ts_4893.meters order by ts limit 5 + radians(1) + id | +============================ + 0.017453292519943 | + 1.017453292519943 | + 2.017453292519943 | + 3.017453292519943 | + 4.017453292519943 | + +taos> select RADIANS(id) + id from ts_4893.meters order by ts limit 5 + radians(id) + id | +============================ + 0.000000000000000 | + 1.017453292519943 | + 2.034906585039887 | + 3.052359877559830 | + 4.069813170079773 | + +taos> select RADIANS(abs(10)) + radians(abs(10)) | +============================ + 0.174532925199433 | + +taos> select RADIANS(DEGREES(PI())) + radians(degrees(pi())) | +============================ + 3.141592653589793 | + +taos> select abs(RADIANS(10)) + abs(radians(10)) | +============================ + 0.174532925199433 | + +taos> select pow(RADIANS(10), 2) + pow(radians(10), 2) | +============================ + 0.030461741978671 | + +taos> select sqrt(RADIANS(10)) + sqrt(radians(10)) | +============================ + 0.417771379105167 | + +taos> select cast(RADIANS(10) as int) + cast(radians(10) as int) | +=========================== + 0 | + +taos> select RADIANS(sqrt(id)) from ts_4893.meters order by ts limit 5 + radians(sqrt(id)) | +============================ + 0.000000000000000 | + 0.017453292519943 | + 0.024682682989769 | + 0.030229989403904 | + 0.034906585039887 | + +taos> select radians(180) + radians(180) | +============================ + 3.141592653589793 | + +taos> select radians(current) from ts_4893.d0 order by ts limit 10 + radians(current) | +============================ + 0.185877558679493 | + 0.149644536324422 | + 0.170955001564425 | + 0.196052831414414 | + 0.186854955444309 | + 0.148492619284422 | + 0.167481790094528 | + 0.191322990739406 | + 0.195930658899406 | + 0.180414682914441 | + +taos> select radians(current) from ts_4893.meters order by ts limit 10 + radians(current) | +============================ + 0.185877558679493 | + 0.149644536324422 | + 0.170955001564425 | + 0.196052831414414 | + 0.186854955444309 | + 0.148492619284422 | + 0.167481790094528 | + 0.191322990739406 | + 0.195930658899406 | + 0.180414682914441 | + +taos> select radians(null) + radians(null) | +============================ + NULL | + +taos> select radians(0) + radians(0) | +============================ + 0.000000000000000 | + +taos> select radians(45) + radians(45) | +============================ + 0.785398163397448 | + +taos> select radians(-45) + radians(-45) | +============================ + -0.785398163397448 | + +taos> select radians(90) + radians(90) | +============================ + 1.570796326794897 | + +taos> select radians(-90) + radians(-90) | +============================ + -1.570796326794897 | + +taos> select radians(360) + radians(360) | +============================ + 6.283185307179586 | + +taos> select radians(1000000) + radians(1000000) | +============================ + 17453.292519943293883 | + +taos> select radians(sin(1)) + radians(sin(1)) | +============================ + 0.014686439244897 | + +taos> select radians(cos(1)) + radians(cos(1)) | +============================ + 0.009430054193517 | + +taos> select radians(tan(1)) + radians(tan(1)) | +============================ + 0.027181892591221 | + +taos> select radians(degrees(90)) + radians(degrees(90)) | +============================ + 89.999999999999986 | + +taos> select radians(atan(1)) + radians(atan(1)) | +============================ + 0.013707783890402 | + +taos> select radians(current) from ts_4893.meters limit 1 + radians(current) | +============================ + 0.185877558679493 | + +taos> select radians(voltage) from ts_4893.meters limit 1 + radians(voltage) | +============================ + 3.857177646907469 | + +taos> select radians(phase) from ts_4893.meters limit 1 + radians(phase) | +============================ + 0.008881946002226 | + diff --git a/tests/army/query/function/ans/rand.csv b/tests/army/query/function/ans/rand.csv index 40e20c5ba4..98a096233c 100644 --- a/tests/army/query/function/ans/rand.csv +++ b/tests/army/query/function/ans/rand.csv @@ -1,21 +1,173 @@ -0.663936012733698 -0.840187717154710 -0.840187717154710 -0.700976369297587 -0.561380175203728 -0.916457875592847 -0.274745596235034 -0.135438768721856 -0.486904139391568 -0.352760728612896 -0.206965447965528 -0.419929514834624 -0.419929514834624 -0.419929514834624 -0.419929514834624 -0.419929514834624 -0.419929514834624 -0.419929514834624 -0.419929514834624 -0.419929514834624 -0.419929514834624 \ No newline at end of file + +taos> select RAND(1245) + rand(1245) | +============================ + 0.663936012733698 | + +taos> select RAND(id) from ts_4893.d0 limit 10 + rand(id) | +============================ + 0.840187717154710 | + 0.840187717154710 | + 0.700976369297587 | + 0.561380175203728 | + 0.916457875592847 | + 0.274745596235034 | + 0.135438768721856 | + 0.486904139391568 | + 0.352760728612896 | + 0.206965447965528 | + +taos> select RAND(id) from ts_4893.d0 order by id desc limit 10 + rand(id) | +============================ + 0.419929514834624 | + 0.419929514834624 | + 0.419929514834624 | + 0.419929514834624 | + 0.419929514834624 | + 0.419929514834624 | + 0.419929514834624 | + 0.419929514834624 | + 0.419929514834624 | + 0.419929514834624 | + +taos> select rand(0) + rand(0) | +============================ + 0.840187717154710 | + +taos> select rand(1) + rand(1) | +============================ + 0.840187717154710 | + +taos> select rand(-1) + rand(-1) | +============================ + 0.118708995691831 | + +taos> select rand(12345678901234567890) + rand(12345678901234567890) | +============================= + 2.008294813338805e-01 | + +taos> select rand(-12345678901234567890) + rand(-12345678901234567890) | +============================== + 8.401877171547095e-01 | + +taos> select rand(12345), rand(12345) + rand(12345) | rand(12345) | +======================================================== + 0.178395304446293 | 0.178395304446293 | + +taos> select rand(9999999999) where rand(9999999999) >= 0 and rand(9999999999) < 1 + rand(9999999999) | +============================ + 0.321409397442550 | + +taos> select rand(id) from ts_4893.meters limit 100 + rand(id) | +============================ + 0.840187717154710 | + 0.840187717154710 | + 0.700976369297587 | + 0.561380175203728 | + 0.916457875592847 | + 0.274745596235034 | + 0.135438768721856 | + 0.486904139391568 | + 0.352760728612896 | + 0.206965447965528 | + 0.565810732341283 | + 0.926345318521534 | + 0.785600282617658 | + 0.632643183056565 | + 0.999498499557142 | + 0.354973177125199 | + 0.215437470104283 | + 0.571794000254848 | + 0.929072778173291 | + 0.290233385418650 | + 0.148812267532950 | + 0.505899571117898 | + 0.865026922367991 | + 0.727581746283724 | + 0.087714229285584 | + 0.939356191986872 | + 0.795545781867367 | + 0.659832971943465 | + 0.517155105023251 | + 0.875989373715589 | + 0.229967075041480 | + 0.592119012303706 | + 0.449675684072858 | + 0.307948935454688 | + 0.168970021497910 | + 0.524489704763745 | + 0.381259786142623 | + 0.239412393066758 | + 0.598226357529977 | + 0.957148446215851 | + 0.819422913165494 | + 0.670246056127477 | + 0.033469948001890 | + 0.392149003405193 | + 0.749737140606035 | + 0.608923980318440 | + 0.469695958061933 | + 0.825680229266025 | + 0.683865774275673 | + 0.041811583583155 | + 0.894321223206036 | + 0.760580372885140 | + 0.615916447069457 | + 0.977703406930763 | + 0.329537633959920 | + 0.193522962831670 | + 0.052021294390793 | + 0.911150676622591 | + 0.766549994129012 | + 0.126697651635249 | + 0.985316422761100 | + 0.843173408342140 | + 0.699550600116863 | + 0.557263156192965 | + 0.419794161068180 | + 0.278590486048996 | + 0.133239280028846 | + 0.488706417143674 | + 0.854142372894167 | + 0.710721029765308 | + 0.570226699379378 | + 0.424855420563768 | + 0.283543675338637 | + 0.137892492179709 | + 0.998458440880505 | + 0.356983164025928 | + 0.218767986269094 | + 0.076468908263589 | + 0.431104593179703 | + 0.293163777931204 | + 0.650123746902740 | + 0.510736836358317 | + 0.864335399057872 | + 0.725284450559544 | + 0.085677149279824 | + 0.942077809917777 | + 0.798407114482674 | + 0.163865051774245 | + 0.017995767769402 | + 0.879516513030751 | + 0.736922031145972 | + 0.589669372695344 | + 0.954449085497507 | + 0.811225361568493 | + 0.172090128609953 | + 0.525153056031630 | + 0.386470556904781 | + 0.744990266275122 | + 0.100015020510189 | + 0.460091779222755 | + diff --git a/tests/army/query/function/ans/repeat.csv b/tests/army/query/function/ans/repeat.csv index 98176c87a3..d8f8b3050f 100644 --- a/tests/army/query/function/ans/repeat.csv +++ b/tests/army/query/function/ans/repeat.csv @@ -1,161 +1,396 @@ -hello -hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello -aa -g;aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddh -gaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc;ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddh -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc;ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddgh -6400 -50060 -北京taos北京taos北京taos北京taos北京taos北京taos -novelnovelnovelnovelnovelnovel -一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十 -updateupdateupdateupdateupdateupdate -prisionprisionprisionprisionprisionprision -novelnovelnovelnovelnovelnovel -novelnovelnovelnovelnovelnovel -personpersonpersonpersonpersonperson -novelnovelnovelnovelnovelnovel -plateplateplateplateplateplate -一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -一二三四五六七八九十 -updateupdate -prisionprisionprision -novelnovelnovelnovel -novelnovelnovelnovelnovel -person -novelnovel -plateplateplate -一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十 -updateupdateupdateupdateupdate -nch1 -nch1nch1 -nch1nch1nch1 -nch1nch1nch1nch1 -nch1nch1nch1nch1nch1 -var1 -var1var1 -var1var1var1 -var1var1var1var1 -var1var1var1var1var1 -taos -taostaos -lililililili -xxx -lililililili -xxx -lililililili -taostaostaos -hahahahahaha -taostaostaos -taostaostaos -hahahahahaha -lililililili -xxx -lililililili -xxx -lililililili -taostaostaos -hahahahahaha -taostaostaos -taostaostaos -hahahahahaha -novelnovelnovel -一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十 -updateupdateupdate -prisionprisionprision -novelnovelnovel -novelnovelnovel -againagainagain -一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十 -novelnovelnovel -againagainagain -novelnovelnovel -一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十 -updateupdateupdate -prisionprisionprision -novelnovelnovel -novelnovelnovel -againagainagain -一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十 -novelnovelnovel -againagainagain -novelnovelnovel -personpersonperson -novelnovelnovel -plateplateplate -一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十 -updateupdateupdate -prisionprisionprision -personpersonperson -prisionprisionprision -plateplateplate -novelnovelnovel -personpersonperson -novelnovelnovel -plateplateplate -一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十 -updateupdateupdate -prisionprisionprision -personpersonperson -prisionprisionprision -plateplateplate -lili -x -lili -x -lili -taos -haha -taos -taos -haha -lili -x -lili -x -lili -taos -haha -taos -taos -haha -novel -一二三四五六七八九十 -update -prision -novel -novel -again -一二三四五六七八九十 -novel -again -novel -一二三四五六七八九十 -update -prision -novel -novel -again -一二三四五六七八九十 -novel -again + +taos> select repeat('hello', 1) + repeat('hello', 1) | +===================== + hello | + +taos> select repeat('hello', 20) + repeat('hello', 20) | +================================= + hellohellohellohellohellohe... | + +taos> SELECT REPEAT('a', 2) + repeat('a', 2) | +================= + aa | + +taos> SELECT CONCAT('g',CONCAT(';',repeat('a',60), repeat('b',60), repeat('c',60), repeat ('d',100)),'h') + concat('g',concat(';',repeat('a',60), repeat('b',60), repeat('c' | +=================================================================== + g;aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... | + +taos> SELECT CONCAT('g',CONCAT_WS(';',repeat('a',60), repeat('b',60), repeat('c',60), repeat ('d',100)),'h') + concat('g',concat_ws(';',repeat('a',60), repeat('b',60), repeat( | +=================================================================== + gaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... | + +taos> SELECT CONCAT_WS('g',CONCAT_WS(';',repeat('a',60), repeat('b',60), repeat('c',60), repeat ('d',100)),'h') + concat_ws('g',concat_ws(';',repeat('a',60), repeat('b',60), repe | +=================================================================== + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;... | + +taos> select length(concat(repeat("a",3200),repeat("a",3200))) + length(concat(repeat("a",3200),repeat("a",3200))) | +==================================================== + 6400 | + +taos> select length(replace("aaaaa","a",concat(repeat("a",10000),repeat("a",12)))) + length(replace("aaaaa","a",concat(repeat("a",10000),repeat("a",1 | +=================================================================== + 50060 | + +taos> select repeat('北京taos', 6) + repeat('北京taos', 6) | +================================= + 北京taos北京taos北京taos北... | + +taos> select repeat(nch1, 6) from ts_4893.meters order by ts limit 5 + repeat(nch1, 6) | +================================= + novelnovelnovelnovelnovelnovel | + 一二三四五六七八九十一二三... | + updateupdateupdateupdateupd... | + prisionprisionprisionprisio... | + novelnovelnovelnovelnovelnovel | + +taos> select repeat(var1, 6) from ts_4893.meters order by ts limit 5 + repeat(var1, 6) | +================================= + novelnovelnovelnovelnovelnovel | + personpersonpersonpersonper... | + novelnovelnovelnovelnovelnovel | + plateplateplateplateplateplate | + 一二三四五六七八九十一二三... | + +taos> select position(nch1 in repeat(nch1,6)) from ts_4893.meters order by ts limit 5 + position(nch1 in repeat(nch1,6)) | +=================================== + 1 | + 1 | + 1 | + 1 | + 1 | + +taos> select position(var1 in repeat(var1,6)) from ts_4893.meters order by ts limit 5 + position(var1 in repeat(var1,6)) | +=================================== + 1 | + 1 | + 1 | + 1 | + 1 | + +taos> select position(nch1 in repeat(var1,6)) from ts_4893.meters where nch1 = var1 order by ts limit 5 + position(nch1 in repeat(var1,6)) | +=================================== + 1 | + 1 | + 1 | + 1 | + 1 | + +taos> select position(var1 in repeat(nch1,6)) from ts_4893.meters where nch1 = var1 order by ts limit 5 + position(var1 in repeat(nch1,6)) | +=================================== + 1 | + 1 | + 1 | + 1 | + 1 | + +taos> select repeat(nch1, id) from ts_4893.meters where id > 0 order by ts limit 5 + repeat(nch1, id) | +================================= + 一二三四五六七八九十 | + updateupdate | + prisionprisionprision | + novelnovelnovelnovel | + novelnovelnovelnovelnovel | + +taos> select repeat(var1, id) from ts_4893.meters where id > 0 order by ts limit 5 + repeat(var1, id) | +=================== + person | + novelnovel | + plateplateplate | + 一二三四五六... | + updateupdateu... | + +taos> select repeat('nch1', id) from ts_4893.meters where id > 0 order by ts limit 5 + repeat('nch1', id) | +================================= + nch1 | + nch1nch1 | + nch1nch1nch1 | + nch1nch1nch1nch1 | + nch1nch1nch1nch1nch1 | + +taos> select repeat('var1', id) from ts_4893.meters where id > 0 order by ts limit 5 + repeat('var1', id) | +================================= + var1 | + var1var1 | + var1var1var1 | + var1var1var1var1 | + var1var1var1var1var1 | + +taos> select repeat('taos', 1) + repeat('taos', 1) | +==================== + taos | + +taos> select repeat('taos', 2) + repeat('taos', 2) | +==================== + taostaos | + +taos> select repeat(name, 3) from ts_4893.d0 order by ts limit 10 + repeat(name, 3) | +================================= + lililililili | + xxx | + lililililili | + xxx | + lililililili | + taostaostaos | + hahahahahaha | + taostaostaos | + taostaostaos | + hahahahahaha | + +taos> select repeat(name, 3) from ts_4893.meters order by ts limit 10 + repeat(name, 3) | +================================= + lililililili | + xxx | + lililililili | + xxx | + lililililili | + taostaostaos | + hahahahahaha | + taostaostaos | + taostaostaos | + hahahahahaha | + +taos> select repeat(nch1, 3) from ts_4893.d0 order by ts limit 10 + repeat(nch1, 3) | +================================= + novelnovelnovel | + 一二三四五六七八九十一二三... | + updateupdateupdate | + prisionprisionprision | + novelnovelnovel | + novelnovelnovel | + againagainagain | + 一二三四五六七八九十一二三... | + novelnovelnovel | + againagainagain | + +taos> select repeat(nch1, 3) from ts_4893.meters order by ts limit 10 + repeat(nch1, 3) | +================================= + novelnovelnovel | + 一二三四五六七八九十一二三... | + updateupdateupdate | + prisionprisionprision | + novelnovelnovel | + novelnovelnovel | + againagainagain | + 一二三四五六七八九十一二三... | + novelnovelnovel | + againagainagain | + +taos> select repeat(var1, 3) from ts_4893.d0 order by ts limit 10 + repeat(var1, 3) | +================================= + novelnovelnovel | + personpersonperson | + novelnovelnovel | + plateplateplate | + 一二三四五六七八九十一二三... | + updateupdateupdate | + prisionprisionprision | + personpersonperson | + prisionprisionprision | + plateplateplate | + +taos> select repeat(var1, 3) from ts_4893.meters order by ts limit 10 + repeat(var1, 3) | +================================= + novelnovelnovel | + personpersonperson | + novelnovelnovel | + plateplateplate | + 一二三四五六七八九十一二三... | + updateupdateupdate | + prisionprisionprision | + personpersonperson | + prisionprisionprision | + plateplateplate | + +taos> select repeat(name, groupid) from ts_4893.d0 order by ts limit 10 + repeat(name, groupid) | +======================== + lili | + x | + lili | + x | + lili | + taos | + haha | + taos | + taos | + haha | + +taos> select repeat(name, groupid) from ts_4893.meters order by ts limit 10 + repeat(name, groupid) | +======================== + lili | + x | + lili | + x | + lili | + taos | + haha | + taos | + taos | + haha | + +taos> select repeat(nch1, groupid) from ts_4893.d0 order by ts limit 10 + repeat(nch1, groupid) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + again | + 一二三四五六七八九十 | + novel | + again | + +taos> select repeat(nch1, groupid) from ts_4893.meters order by ts limit 10 + repeat(nch1, groupid) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + again | + 一二三四五六七八九十 | + novel | + again | + +taos> select repeat(null, 3) + repeat(null, 3) | +================== + NULL | + +taos> select repeat('taos', null) + repeat('taos', null) | +======================= + NULL | + +taos> select repeat('taos', 0) + repeat('taos', 0) | +==================== + | + +taos> select repeat('', 5) + repeat('', 5) | +================ + | + +taos> select repeat('A', 0) + repeat('A', 0) | +================= + | + +taos> select repeat('A', 10) + repeat('A', 10) | +================================= + AAAAAAAAAA | + +taos> select repeat('A B', 5) + repeat('A B', 5) | +============================ + A BA BA BA BA B | + +taos> select repeat('ABC', 1) + repeat('ABC', 1) | +=================== + ABC | + +taos> select repeat('Hello', 2) + repeat('Hello', 2) | +===================== + HelloHello | + +taos> select repeat('HelloWorld', 2) + repeat('HelloWorld', 2) | +=========================== + HelloWorldHelloWorld | + +taos> select repeat('123', 5) + repeat('123', 5) | +============================ + 123123123123123 | + +taos> select repeat('12345', 3) + repeat('12345', 3) | +======================== + 123451234512345 | + +taos> select repeat('!@#', 3) + repeat('!@#', 3) | +=================== + !@#!@#!@# | + +taos> select repeat('你好', 2) + repeat('你好', 2) | +====================== + 你好你好 | + +taos> select repeat('abc', length('abc')) + repeat('abc', length('abc')) | +=============================== + abcabcabc | + +taos> select repeat(concat('A', 'B', 'C'), 3) + repeat(concat('A', 'B', 'C'), 3) | +=================================== + ABCABCABC | + +taos> select repeat(upper('abc'), 4) + repeat(upper('abc'), 4) | +========================== + ABCABCABCABC | + +taos> select repeat(trim(' Hello '), 3) + repeat(trim(' Hello '), 3) | +================================= + HelloHelloHello | + +taos> select name, repeat(name, 3) from ts_4893.meters limit 1 + name | repeat(name, 3) | +================================================================== + lili | lililililili | + +taos> select name, repeat(substring(name, 1, 5), 2) from ts_4893.meters limit 1 + name | repeat(substring(name, 1, 5), 2) | +==================================================================== + lili | lililili | + +taos> select var1, repeat(var1, 2) from ts_4893.meters limit 1 + var1 | repeat(var1, 2) | +================================================================== + novel | novelnovel | + +taos> select nch1, repeat(nch1, 4) from ts_4893.meters limit 1 + nch1 | repeat(nch1, 4) | +================================================================== + novel | novelnovelnovelnovel | + diff --git a/tests/army/query/function/ans/replace.csv b/tests/army/query/function/ans/replace.csv index 4df4e02d83..e1b7654897 100644 --- a/tests/army/query/function/ans/replace.csv +++ b/tests/army/query/function/ans/replace.csv @@ -1,476 +1,979 @@ -bbbb -bb -bbbbbbbb -aaaa -bbbb -this is a REAL test -涛思 -北京 -北京涛北京com -北京涛思.com -北京涛思 -novel -一二三四五六七八九十 -updbte -prision -novel -updbte -bgbin -bgbin -plbte -bbc一二三bbc一二三bbc -novel -一二三四五六七八九十 -prision -novel -novel -novel -一二三四五六七八九十 -upd啊te -prision -novel -upd啊te -啊g啊in -啊g啊in -pl啊te -啊bc一二三啊bc一二三啊bc -novel -一二三四五六七八九十 -prision -novel -novel -novel -壹二三四五六七八九十 -update -prision -novel -壹二三四五六七八九十 -壹二三四五六七八九十 -abc壹二三abc壹二三abc -壹壹壹壹壹||壹壹壹壹 -壹二三123321三二壹 -novel -update -prision -novel -novel -novel -1二三四五六七八九十 -update -prision -novel -1二三四五六七八九十 -1二三四五六七八九十 -abc1二三abc1二三abc -11111||1111 -1二三123321三二1 -novel -update -prision -novel -novel -novel -一二三四五六七八九十 -update -prision -novnch2l -novnch2l -anch2c一二三anch2c一二三anch2c -一二三anch2c -一二三nch2五六七八九十 -pnch2rson -novel -一二三四五六七八九十 -update -prision -novel -novvar2l -一二三四五六七八九十 -update -prision -novel -novvar2l -novvar2l -var2abc -var2123321三二一 -abvar2一二三abvar2一二三abvar2 -一二三四五六七八九十 -update -prision -novel -novel -novel -一二f四五六七八九十 -update -prision -novel -一二f四五六七八九十 -一二d四五六七八九十 -abc一二babc一二babc -一二三a123321三a二一 -一二babc -novel -update -prision -novel -novel -novel -一二三a四五六七八九十 -update -prision -novel -一二三a四五六七八九十 -一二b四五六七八九十 -abc一二fabc一二fabc -一二三a123321三a二一 -一二一二三abc -novel -update -prision -novel -novel -novel -一二三四五六七八九十 -update -prision -novbl -novbl -afc一二三afc一二三afc -一二三a一二三c -一二三三a五六七八九十 -pdrson -novel -一二三四五六七八九十 -update -prision -novel -nov四l -一二三四五六七八九十 -update -prision -novel -nov四l -novcl -babc -三a123321三二一 -abf一二三abf一二三abf -一二三四五六七八九十 -update -prision -novel -novel -novel -person -novel -plbte -一二三四五六七八九十 -plbte -updbte -plbte -updbte -一二三bbc -novel -person -novel -一二三四五六七八九十 -prision -novel -person -novel -pl啊te -一二三四五六七八九十 -pl啊te -upd啊te -pl啊te -upd啊te -一二三啊bc -novel -person -novel -一二三四五六七八九十 -prision -novel -person -novel -plate -壹二三四五六七八九十 -壹二三四五六七八九十 -壹二三abc -abc壹二三abc壹二三abc -壹二三123321三二壹 -壹壹壹壹壹||壹壹壹壹 -novel -person -novel -plate -update -novel -person -novel -plate -1二三四五六七八九十 -1二三四五六七八九十 -1二三abc -abc1二三abc1二三abc -1二三123321三二1 -11111||1111 -novel -person -novel -plate -update -novel -person -novel -plate -一二三四五六七八九十 -一二nch2bc -anch2c一二三anch2c一二三anch2c -nch2bc一二三nch2bc一二三nch2bc -novnch2l -upnch2ate -novel -person -novel -plate -一二三四五六七八九十 -novvar2l -person -novel -platvar2 -一二三四五六七八九十 -novvar2l -platvar2 -一二三var2bc -var2123321三二一 -abvar2一二三abvar2一二三abvar2 -person -novel -一二三四五六七八九十 -update -prision -novel -person -novel -plate -一二e四五六七八九十 -一二e四五六七八九十 -一二三aabc -abc一二babc一二babc -一二三a123321三a二一 -一二c四五六七八九十 -novel -person -novel -plate -update -novel -person -novel -plate -一二b四五六七八九十 -一二b四五六七八九十 -一二aabc -abc一二fabc一二fabc -一二四123321四二一 -一二b四五六七八九十 -novel -person -novel -plate -update -novel -person -novel -plate -一二三四五六七八九十 -一二abc -afc一二三afc一二三afc -四bc一二三四bc一二三四bc -novdl -up一二三ate -novel -person -novel -plate -一二三四五六七八九十 -nov四l -person -novel -plat一 -一二三四五六七八九十 -nov四l -plat一 -一二三三abc -b123321三二一 -abf一二三abf一二三abf -person -novel -一二三四五六七八九十 -update -prision -一二三nch2五六七abcdefghijk213124123 -一二三四五六七abcdench2ghijk213124123 -一二三四五六七abnch2defghijk213124123 -nch2二三四五六七abcdefghijk213124123 -一二三四五六七abcdnch2fghijk213124123 -一二三nch2五六七abcdefghijk213124123 -一二三四五六七abcdench2ghijk213124123 -一二三四五六七abnch2defghijk213124123 -nch2二三四五六七abcdefghijk213124123 -一二三四五六七abcdnch2fghijk213124123 -一二三四五六七abcdefghijk213124123 -一二三四五六七abcdefghijk213124123 -一二三四五六七abcdefghijk213124123 -一二三四五六七abcdefghijk213124123 -一二三四五六七abcdefghijk213124123 -一二三e五六七abcdefghijk213124123 -一二三四五六七abcde三aghijk213124123 -一二三四五六七ab四defghijk213124123 -e二三四五六七abcdefghijk213124123 -一二三四五六七abcdbfghijk213124123 -一二三e五六七abcdefghijk213124123 -一二三四五六七abcde三aghijk213124123 -一二三四五六七ab四defghijk213124123 -e二三四五六七abcdefghijk213124123 -一二三四五六七abcdbfghijk213124123 -一二三四五六七abcdefghijk213124123 -一二三四五六七abcdefghijk213124123 -一二三四五六七abcdefghijk213124123 -一二三四五六七abcdefghijk213124123 -一二三四五六七abcdefghijk213124123 -一二三四五六七abcdvar2fghijk213124123 -一二三四五六七abcdefghijk213124123 -一二三var2五六七abcdefghijk213124123 -一二三四五六七abcdvar2fghijk213124123 -一二三四五六七avar2cdefghijk213124123 -一二三四五六七abcdvar2fghijk213124123 -一二三var2五六七abcdefghijk213124123 -一二三四五六七abcdvar2fghijk213124123 -一二三四五六七avar2cdefghijk213124123 -一二三四五六七abcdefvar2hijk213124123 -一二三四五六七abcdefghijk213124123 -一二三四五六七abcdefghijk213124123 -一二三四五六七abcdefghijk213124123 -一二三四五六七abcdefghijk213124123 -一二三四五六七abcdefghijk213124123 -一二三四五六七abcd四fghijk213124123 -一二三四五六七abcdefghijk213124123 -一二三c五六七abcdefghijk213124123 -一二三四五六七abcd一fghijk213124123 -一二三四五六七aecdefghijk213124123 -一二三四五六七abcd四fghijk213124123 -一二三c五六七abcdefghijk213124123 -一二三四五六七abcd一fghijk213124123 -一二三四五六七aecdefghijk213124123 -一二三四五六七abcdef一二三hijk213124123 -一二三四五六七abcdefghijk213124123 -一二三四五六七abcdefghijk213124123 -一二三四五六七abcdefghijk213124123 -一二三四五六七abcdefghijk213124123 -一二三四五六七abcdefghijk213124123 -eebbccdd -aabbccdd -南京 -北南 -南京taos -novel -一二三四五六七八九十 -update -prision -novtl -novel -again -一二三四五六七八九十 -novel -again -novel -一二三四五六七八九十 -update -prision -novtl -novel -again -一二三四五六七八九十 -novel -again -novtl -一二三四五六七八九十 -update -prision -novel -novel -again -一二三四五六七八九十 -novtl -again -novtl -一二三四五六七八九十 -update -prision -novel -novel -again -一二三四五六七八九十 -novtl -again -novel -person -novel -plate -一二三四五六七八九十 -update -prision -person -prision -plate -novel -person -novel -plate -一二三四五六七八九十 -update -prision -person -prision -plate -novtl -person -novel -platt -一二三四五六七八九十 -update -prision -person -prision -plate -novtl -person -novel -platt -一二三四五六七八九十 -update -prision -person -prision -plate -novel -一二三四五六七八九十 -update -prision -nov一二三四五六七八九十l -novel -again -一二三四五六七八九十 -novel -again -novel -一二三四五六七八九十 -update -prision -nov一二三四五六七八九十l -novel -again -一二三四五六七八九十 -novel -again + +taos> select replace('aaaa','a','b') + replace('aaaa','a','b') | +========================== + bbbb | + +taos> select replace('aaaa','aa','b') + replace('aaaa','aa','b') | +=========================== + bb | + +taos> select replace('aaaa','a','bb') + replace('aaaa','a','bb') | +=========================== + bbbbbbbb | + +taos> select replace('aaaa','','b') + replace('aaaa','','b') | +========================= + aaaa | + +taos> select replace('bbbb','a','c') + replace('bbbb','a','c') | +========================== + bbbb | + +taos> select replace(concat(lower(concat('THIS',' ','IS',' ','A',' ')),upper('false'),' ','test'),'FALSE','REAL') + replace(concat(lower(concat('THIS',' ','IS',' ','A',' ')),upper( | +=================================================================== + this is a REAL test | + +taos> select replace('北京涛思','北京', '') + replace('北京涛思','北京', '') | +======================================= + 涛思 | + +taos> select replace('北京涛思','涛思', '') + replace('北京涛思','涛思', '') | +======================================= + 北京 | + +taos> select replace('北京涛思.com','思.', '北京') + replace('北京涛思.com','思.', '北京') | +=============================================== + 北京涛北京com | + +taos> select replace('北京涛思.com','北com', '北京涛') + replace('北京涛思.com','北com', '北京涛') | +==================================================== + 北京涛思.com | + +taos> select replace('北京涛思', char(ascii('北')), 'wrongans') + replace('北京涛思', char(ascii('北')), 'wrongans') | +========================================================== + 北京涛思 | + +taos> select replace(nch1, 'a', 'b') from ts_4893.meters order by ts limit 5 + replace(nch1, 'a', 'b') | +================================= + novel | + 一二三四五六七八九十 | + updbte | + prision | + novel | + +taos> select replace(nch1, 'a', 'b') from ts_4893.meters where position('a' IN nch1) != 0 order by ts limit 5 + replace(nch1, 'a', 'b') | +================================= + updbte | + bgbin | + bgbin | + plbte | + bbc一二三bbc一二三bbc | + +taos> select replace(nch1, 'a', 'b') from ts_4893.meters where position('a' IN nch1) = 0 order by ts limit 5 + replace(nch1, 'a', 'b') | +================================= + novel | + 一二三四五六七八九十 | + prision | + novel | + novel | + +taos> select replace(nch1, 'a', '啊') from ts_4893.meters order by ts limit 5 + replace(nch1, 'a', '啊') | +================================= + novel | + 一二三四五六七八九十 | + upd啊te | + prision | + novel | + +taos> select replace(nch1, 'a', '啊') from ts_4893.meters where position('a' IN nch1) != 0 order by ts limit 5 + replace(nch1, 'a', '啊') | +================================= + upd啊te | + 啊g啊in | + 啊g啊in | + pl啊te | + 啊bc一二三啊bc一二三啊bc | + +taos> select replace(nch1, 'a', '啊') from ts_4893.meters where position('a' IN nch1) = 0 order by ts limit 5 + replace(nch1, 'a', '啊') | +================================= + novel | + 一二三四五六七八九十 | + prision | + novel | + novel | + +taos> select replace(nch1, '一', '壹') from ts_4893.meters order by ts limit 5 + replace(nch1, '一', '壹') | +================================= + novel | + 壹二三四五六七八九十 | + update | + prision | + novel | + +taos> select replace(nch1, '一', '壹') from ts_4893.meters where position('一' IN nch1) != 0 order by ts limit 5 + replace(nch1, '一', '壹') | +================================= + 壹二三四五六七八九十 | + 壹二三四五六七八九十 | + abc壹二三abc壹二三abc | + 壹壹壹壹壹||壹壹壹壹 | + 壹二三123321三二壹 | + +taos> select replace(nch1, '一', '壹') from ts_4893.meters where position('一' IN nch1) = 0 order by ts limit 5 + replace(nch1, '一', '壹') | +================================= + novel | + update | + prision | + novel | + novel | + +taos> select replace(nch1, '一', '1') from ts_4893.meters order by ts limit 5 + replace(nch1, '一', '1') | +================================= + novel | + 1二三四五六七八九十 | + update | + prision | + novel | + +taos> select replace(nch1, '一', '1') from ts_4893.meters where position('一' IN nch1) != 0 order by ts limit 5 + replace(nch1, '一', '1') | +================================= + 1二三四五六七八九十 | + 1二三四五六七八九十 | + abc1二三abc1二三abc | + 11111||1111 | + 1二三123321三二1 | + +taos> select replace(nch1, '一', '1') from ts_4893.meters where position('一' IN nch1) = 0 order by ts limit 5 + replace(nch1, '一', '1') | +================================= + novel | + update | + prision | + novel | + novel | + +taos> select replace(nch1, nch2, 'nch2') from ts_4893.meters order by ts limit 5 + replace(nch1, nch2, 'nch2') | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novnch2l | + +taos> select replace(nch1, nch2, 'nch2') from ts_4893.meters where position(nch2 IN nch1) != 0 order by ts limit 5 + replace(nch1, nch2, 'nch2') | +================================= + novnch2l | + anch2c一二三anch2c一二三anch2c | + 一二三anch2c | + 一二三nch2五六七八九十 | + pnch2rson | + +taos> select replace(nch1, nch2, 'nch2') from ts_4893.meters where position(nch2 IN nch1) = 0 order by ts limit 5 + replace(nch1, nch2, 'nch2') | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novel | + +taos> select replace(nch1, var2, 'var2') from ts_4893.meters order by ts limit 5 + replace(nch1, var2, 'var2') | +================================= + novvar2l | + 一二三四五六七八九十 | + update | + prision | + novel | + +taos> select replace(nch1, var2, 'var2') from ts_4893.meters where position(var2 IN nch1) != 0 order by ts limit 5 + replace(nch1, var2, 'var2') | +================================= + novvar2l | + novvar2l | + var2abc | + var2123321三二一 | + abvar2一二三abvar2一二三abvar2 | + +taos> select replace(nch1, var2, 'var2') from ts_4893.meters where position(var2 IN nch1) = 0 order by ts limit 5 + replace(nch1, var2, 'var2') | +================================= + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + +taos> select replace(nch1, '三', nch2) from ts_4893.meters order by ts limit 5 + replace(nch1, '三', nch2) | +================================= + novel | + 一二f四五六七八九十 | + update | + prision | + novel | + +taos> select replace(nch1, '三', nch2) from ts_4893.meters where position('三' IN nch1) != 0 order by ts limit 5 + replace(nch1, '三', nch2) | +================================= + 一二f四五六七八九十 | + 一二d四五六七八九十 | + abc一二babc一二babc | + 一二三a123321三a二一 | + 一二babc | + +taos> select replace(nch1, '三', nch2) from ts_4893.meters where position('三' IN nch1) = 0 order by ts limit 5 + replace(nch1, '三', nch2) | +================================= + novel | + update | + prision | + novel | + novel | + +taos> select replace(nch1, '三', var2) from ts_4893.meters order by ts limit 5 + replace(nch1, '三', var2) | +================================= + novel | + 一二三a四五六七八九十 | + update | + prision | + novel | + +taos> select replace(nch1, '三', var2) from ts_4893.meters where position('三' IN nch1) != 0 order by ts limit 5 + replace(nch1, '三', var2) | +================================= + 一二三a四五六七八九十 | + 一二b四五六七八九十 | + abc一二fabc一二fabc | + 一二三a123321三a二一 | + 一二一二三abc | + +taos> select replace(nch1, '三', var2) from ts_4893.meters where position('三' IN nch1) = 0 order by ts limit 5 + replace(nch1, '三', var2) | +================================= + novel | + update | + prision | + novel | + novel | + +taos> select replace(nch1, nch2, var2) from ts_4893.meters order by ts limit 5 + replace(nch1, nch2, var2) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novbl | + +taos> select replace(nch1, nch2, var2) from ts_4893.meters where position(nch2 IN nch1) != 0 order by ts limit 5 + replace(nch1, nch2, var2) | +================================= + novbl | + afc一二三afc一二三afc | + 一二三a一二三c | + 一二三三a五六七八九十 | + pdrson | + +taos> select replace(nch1, nch2, var2) from ts_4893.meters where position(nch2 IN nch1) = 0 order by ts limit 5 + replace(nch1, nch2, var2) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novel | + +taos> select replace(nch1, var2, nch2) from ts_4893.meters order by ts limit 5 + replace(nch1, var2, nch2) | +================================= + nov四l | + 一二三四五六七八九十 | + update | + prision | + novel | + +taos> select replace(nch1, var2, nch2) from ts_4893.meters where position(var2 IN nch1) != 0 order by ts limit 5 + replace(nch1, var2, nch2) | +================================= + nov四l | + novcl | + babc | + 三a123321三二一 | + abf一二三abf一二三abf | + +taos> select replace(nch1, var2, nch2) from ts_4893.meters where position(var2 IN nch1) = 0 order by ts limit 5 + replace(nch1, var2, nch2) | +================================= + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + +taos> select replace(var1, 'a', 'b') from ts_4893.meters order by ts limit 5 + replace(var1, 'a', 'b') | +================================= + novel | + person | + novel | + plbte | + 一二三四五六七八九十 | + +taos> select replace(var1, 'a', 'b') from ts_4893.meters where position('a' IN var1) != 0 order by ts limit 5 + replace(var1, 'a', 'b') | +================================= + plbte | + updbte | + plbte | + updbte | + 一二三bbc | + +taos> select replace(var1, 'a', 'b') from ts_4893.meters where position('a' IN var1) = 0 order by ts limit 5 + replace(var1, 'a', 'b') | +================================= + novel | + person | + novel | + 一二三四五六七八九十 | + prision | + +taos> select replace(var1, 'a', '啊') from ts_4893.meters order by ts limit 5 + replace(var1, 'a', '啊') | +================================= + novel | + person | + novel | + pl啊te | + 一二三四五六七八九十 | + +taos> select replace(var1, 'a', '啊') from ts_4893.meters where position('a' IN var1) != 0 order by ts limit 5 + replace(var1, 'a', '啊') | +================================= + pl啊te | + upd啊te | + pl啊te | + upd啊te | + 一二三啊bc | + +taos> select replace(var1, 'a', '啊') from ts_4893.meters where position('a' IN var1) = 0 order by ts limit 5 + replace(var1, 'a', '啊') | +================================= + novel | + person | + novel | + 一二三四五六七八九十 | + prision | + +taos> select replace(var1, '一', '壹') from ts_4893.meters order by ts limit 5 + replace(var1, '一', '壹') | +================================= + novel | + person | + novel | + plate | + 壹二三四五六七八九十 | + +taos> select replace(var1, '一', '壹') from ts_4893.meters where position('一' IN var1) != 0 order by ts limit 5 + replace(var1, '一', '壹') | +================================= + 壹二三四五六七八九十 | + 壹二三abc | + abc壹二三abc壹二三abc | + 壹二三123321三二壹 | + 壹壹壹壹壹||壹壹壹壹 | + +taos> select replace(var1, '一', '壹') from ts_4893.meters where position('一' IN var1) = 0 order by ts limit 5 + replace(var1, '一', '壹') | +================================= + novel | + person | + novel | + plate | + update | + +taos> select replace(var1, '一', '1') from ts_4893.meters order by ts limit 5 + replace(var1, '一', '1') | +================================= + novel | + person | + novel | + plate | + 1二三四五六七八九十 | + +taos> select replace(var1, '一', '1') from ts_4893.meters where position('一' IN var1) != 0 order by ts limit 5 + replace(var1, '一', '1') | +================================= + 1二三四五六七八九十 | + 1二三abc | + abc1二三abc1二三abc | + 1二三123321三二1 | + 11111||1111 | + +taos> select replace(var1, '一', '1') from ts_4893.meters where position('一' IN var1) = 0 order by ts limit 5 + replace(var1, '一', '1') | +================================= + novel | + person | + novel | + plate | + update | + +taos> select replace(var1, nch2, 'nch2') from ts_4893.meters order by ts limit 5 + replace(var1, nch2, 'nch2') | +================================= + novel | + person | + novel | + plate | + 一二三四五六七八九十 | + +taos> select replace(var1, nch2, 'nch2') from ts_4893.meters where position(nch2 IN var1) != 0 order by ts limit 5 + replace(var1, nch2, 'nch2') | +================================= + 一二nch2bc | + anch2c一二三anch2c一二三anch2c | + nch2bc一二三nch2bc一二三nch2bc | + novnch2l | + upnch2ate | + +taos> select replace(var1, nch2, 'nch2') from ts_4893.meters where position(nch2 IN var1) = 0 order by ts limit 5 + replace(var1, nch2, 'nch2') | +================================= + novel | + person | + novel | + plate | + 一二三四五六七八九十 | + +taos> select replace(var1, var2, 'var2') from ts_4893.meters order by ts limit 5 + replace(var1, var2, 'var2') | +================================= + novvar2l | + person | + novel | + platvar2 | + 一二三四五六七八九十 | + +taos> select replace(var1, var2, 'var2') from ts_4893.meters where position(var2 IN var1) != 0 order by ts limit 5 + replace(var1, var2, 'var2') | +================================= + novvar2l | + platvar2 | + 一二三var2bc | + var2123321三二一 | + abvar2一二三abvar2一二三abvar2 | + +taos> select replace(var1, var2, 'var2') from ts_4893.meters where position(var2 IN var1) = 0 order by ts limit 5 + replace(var1, var2, 'var2') | +================================= + person | + novel | + 一二三四五六七八九十 | + update | + prision | + +taos> select replace(var1, '三', nch2) from ts_4893.meters order by ts limit 5 + replace(var1, '三', nch2) | +================================= + novel | + person | + novel | + plate | + 一二e四五六七八九十 | + +taos> select replace(var1, '三', nch2) from ts_4893.meters where position('三' IN var1) != 0 order by ts limit 5 + replace(var1, '三', nch2) | +================================= + 一二e四五六七八九十 | + 一二三aabc | + abc一二babc一二babc | + 一二三a123321三a二一 | + 一二c四五六七八九十 | + +taos> select replace(var1, '三', nch2) from ts_4893.meters where position('三' IN var1) = 0 order by ts limit 5 + replace(var1, '三', nch2) | +================================= + novel | + person | + novel | + plate | + update | + +taos> select replace(var1, '三', var2) from ts_4893.meters order by ts limit 5 + replace(var1, '三', var2) | +================================= + novel | + person | + novel | + plate | + 一二b四五六七八九十 | + +taos> select replace(var1, '三', var2) from ts_4893.meters where position('三' IN var1) != 0 order by ts limit 5 + replace(var1, '三', var2) | +================================= + 一二b四五六七八九十 | + 一二aabc | + abc一二fabc一二fabc | + 一二四123321四二一 | + 一二b四五六七八九十 | + +taos> select replace(var1, '三', var2) from ts_4893.meters where position('三' IN var1) = 0 order by ts limit 5 + replace(var1, '三', var2) | +================================= + novel | + person | + novel | + plate | + update | + +taos> select replace(var1, nch2, var2) from ts_4893.meters order by ts limit 5 + replace(var1, nch2, var2) | +================================= + novel | + person | + novel | + plate | + 一二三四五六七八九十 | + +taos> select replace(var1, nch2, var2) from ts_4893.meters where position(nch2 IN var1) != 0 order by ts limit 5 + replace(var1, nch2, var2) | +================================= + 一二abc | + afc一二三afc一二三afc | + 四bc一二三四bc一二三四bc | + novdl | + up一二三ate | + +taos> select replace(var1, nch2, var2) from ts_4893.meters where position(nch2 IN var1) = 0 order by ts limit 5 + replace(var1, nch2, var2) | +================================= + novel | + person | + novel | + plate | + 一二三四五六七八九十 | + +taos> select replace(var1, var2, nch2) from ts_4893.meters order by ts limit 5 + replace(var1, var2, nch2) | +================================= + nov四l | + person | + novel | + plat一 | + 一二三四五六七八九十 | + +taos> select replace(var1, var2, nch2) from ts_4893.meters where position(var2 IN var1) != 0 order by ts limit 5 + replace(var1, var2, nch2) | +================================= + nov四l | + plat一 | + 一二三三abc | + b123321三二一 | + abf一二三abf一二三abf | + +taos> select replace(var1, var2, nch2) from ts_4893.meters where position(var2 IN var1) = 0 order by ts limit 5 + replace(var1, var2, nch2) | +================================= + person | + novel | + 一二三四五六七八九十 | + update | + prision | + +taos> select replace('一二三四五六七abcdefghijk213124123', nch2, 'nch2') from ts_4893.meters order by ts limit 5 + replace('一二三四五六七abcdefghijk213124123', nch2, 'nch2 | +=================================================================== + 一二三nch2五六七abcdefghijk213124123 | + 一二三四五六七abcdench2ghijk213124123 | + 一二三四五六七abnch2defghijk213124123 | + nch2二三四五六七abcdefghijk213124123 | + 一二三四五六七abcdnch2fghijk213124123 | + +taos> select replace('一二三四五六七abcdefghijk213124123', nch2, 'nch2') from ts_4893.meters where position(nch2 IN '一二三四五六七abcdefghijk213124123') != 0 order by ts limit 5 + replace('一二三四五六七abcdefghijk213124123', nch2, 'nch2 | +=================================================================== + 一二三nch2五六七abcdefghijk213124123 | + 一二三四五六七abcdench2ghijk213124123 | + 一二三四五六七abnch2defghijk213124123 | + nch2二三四五六七abcdefghijk213124123 | + 一二三四五六七abcdnch2fghijk213124123 | + +taos> select replace('一二三四五六七abcdefghijk213124123', nch2, 'nch2') from ts_4893.meters where position(nch2 IN '一二三四五六七abcdefghijk213124123') = 0 order by ts limit 5 + replace('一二三四五六七abcdefghijk213124123', nch2, 'nch2 | +=================================================================== + 一二三四五六七abcdefghijk213124123 | + 一二三四五六七abcdefghijk213124123 | + 一二三四五六七abcdefghijk213124123 | + 一二三四五六七abcdefghijk213124123 | + 一二三四五六七abcdefghijk213124123 | + +taos> select replace('一二三四五六七abcdefghijk213124123', nch2, var2) from ts_4893.meters order by ts limit 5 + replace('一二三四五六七abcdefghijk213124123', nch2, var2) | +=================================================================== + 一二三e五六七abcdefghijk213124123 | + 一二三四五六七abcde三aghijk213124123 | + 一二三四五六七ab四defghijk213124123 | + e二三四五六七abcdefghijk213124123 | + 一二三四五六七abcdbfghijk213124123 | + +taos> select replace('一二三四五六七abcdefghijk213124123', nch2, var2) from ts_4893.meters where position(nch2 IN '一二三四五六七abcdefghijk213124123') != 0 order by ts limit 5 + replace('一二三四五六七abcdefghijk213124123', nch2, var2) | +=================================================================== + 一二三e五六七abcdefghijk213124123 | + 一二三四五六七abcde三aghijk213124123 | + 一二三四五六七ab四defghijk213124123 | + e二三四五六七abcdefghijk213124123 | + 一二三四五六七abcdbfghijk213124123 | + +taos> select replace('一二三四五六七abcdefghijk213124123', nch2, var2) from ts_4893.meters where position(nch2 IN '一二三四五六七abcdefghijk213124123') = 0 order by ts limit 5 + replace('一二三四五六七abcdefghijk213124123', nch2, var2) | +=================================================================== + 一二三四五六七abcdefghijk213124123 | + 一二三四五六七abcdefghijk213124123 | + 一二三四五六七abcdefghijk213124123 | + 一二三四五六七abcdefghijk213124123 | + 一二三四五六七abcdefghijk213124123 | + +taos> select replace('一二三四五六七abcdefghijk213124123', var2, 'var2') from ts_4893.meters order by ts limit 5 + replace('一二三四五六七abcdefghijk213124123', var2, 'var2 | +=================================================================== + 一二三四五六七abcdvar2fghijk213124123 | + 一二三四五六七abcdefghijk213124123 | + 一二三var2五六七abcdefghijk213124123 | + 一二三四五六七abcdvar2fghijk213124123 | + 一二三四五六七avar2cdefghijk213124123 | + +taos> select replace('一二三四五六七abcdefghijk213124123', var2, 'var2') from ts_4893.meters where position(var2 IN '一二三四五六七abcdefghijk213124123') != 0 order by ts limit 5 + replace('一二三四五六七abcdefghijk213124123', var2, 'var2 | +=================================================================== + 一二三四五六七abcdvar2fghijk213124123 | + 一二三var2五六七abcdefghijk213124123 | + 一二三四五六七abcdvar2fghijk213124123 | + 一二三四五六七avar2cdefghijk213124123 | + 一二三四五六七abcdefvar2hijk213124123 | + +taos> select replace('一二三四五六七abcdefghijk213124123', var2, 'var2') from ts_4893.meters where position(var2 IN '一二三四五六七abcdefghijk213124123') = 0 order by ts limit 5 + replace('一二三四五六七abcdefghijk213124123', var2, 'var2 | +=================================================================== + 一二三四五六七abcdefghijk213124123 | + 一二三四五六七abcdefghijk213124123 | + 一二三四五六七abcdefghijk213124123 | + 一二三四五六七abcdefghijk213124123 | + 一二三四五六七abcdefghijk213124123 | + +taos> select replace('一二三四五六七abcdefghijk213124123', var2, nch2) from ts_4893.meters order by ts limit 5 + replace('一二三四五六七abcdefghijk213124123', var2, nch2) | +=================================================================== + 一二三四五六七abcd四fghijk213124123 | + 一二三四五六七abcdefghijk213124123 | + 一二三c五六七abcdefghijk213124123 | + 一二三四五六七abcd一fghijk213124123 | + 一二三四五六七aecdefghijk213124123 | + +taos> select replace('一二三四五六七abcdefghijk213124123', var2, nch2) from ts_4893.meters where position(var2 IN '一二三四五六七abcdefghijk213124123') != 0 order by ts limit 5 + replace('一二三四五六七abcdefghijk213124123', var2, nch2) | +=================================================================== + 一二三四五六七abcd四fghijk213124123 | + 一二三c五六七abcdefghijk213124123 | + 一二三四五六七abcd一fghijk213124123 | + 一二三四五六七aecdefghijk213124123 | + 一二三四五六七abcdef一二三hijk213124123 | + +taos> select replace('一二三四五六七abcdefghijk213124123', var2, nch2) from ts_4893.meters where position(var2 IN '一二三四五六七abcdefghijk213124123') = 0 order by ts limit 5 + replace('一二三四五六七abcdefghijk213124123', var2, nch2) | +=================================================================== + 一二三四五六七abcdefghijk213124123 | + 一二三四五六七abcdefghijk213124123 | + 一二三四五六七abcdefghijk213124123 | + 一二三四五六七abcdefghijk213124123 | + 一二三四五六七abcdefghijk213124123 | + +taos> select replace('aabbccdd','aa', 'ee') + replace('aabbccdd','aa', 'ee') | +================================= + eebbccdd | + +taos> select replace('aabbccdd','AA', 'ee') + replace('aabbccdd','AA', 'ee') | +================================= + aabbccdd | + +taos> select replace('北京','北' , '南') + replace('北京','北' , '南') | +================================== + 南京 | + +taos> select replace('北京','京' , '南') + replace('北京','京' , '南') | +================================== + 北南 | + +taos> select replace('北京taos','北' , '南') + replace('北京taos','北' , '南') | +====================================== + 南京taos | + +taos> select replace(nch1, nch2, 't') from ts_4893.d0 order by ts limit 10 + replace(nch1, nch2, 't') | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novtl | + novel | + again | + 一二三四五六七八九十 | + novel | + again | + +taos> select replace(nch1, nch2, 't') from ts_4893.meters order by ts limit 10 + replace(nch1, nch2, 't') | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novtl | + novel | + again | + 一二三四五六七八九十 | + novel | + again | + +taos> select replace(nch1, var2, 't') from ts_4893.d0 order by ts limit 10 + replace(nch1, var2, 't') | +================================= + novtl | + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + again | + 一二三四五六七八九十 | + novtl | + again | + +taos> select replace(nch1, var2, 't') from ts_4893.meters order by ts limit 10 + replace(nch1, var2, 't') | +================================= + novtl | + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + again | + 一二三四五六七八九十 | + novtl | + again | + +taos> select replace(var1, nch2, 't') from ts_4893.d0 order by ts limit 10 + replace(var1, nch2, 't') | +================================= + novel | + person | + novel | + plate | + 一二三四五六七八九十 | + update | + prision | + person | + prision | + plate | + +taos> select replace(var1, nch2, 't') from ts_4893.meters order by ts limit 10 + replace(var1, nch2, 't') | +================================= + novel | + person | + novel | + plate | + 一二三四五六七八九十 | + update | + prision | + person | + prision | + plate | + +taos> select replace(var1, var2, 't') from ts_4893.d0 order by ts limit 10 + replace(var1, var2, 't') | +================================= + novtl | + person | + novel | + platt | + 一二三四五六七八九十 | + update | + prision | + person | + prision | + plate | + +taos> select replace(var1, var2, 't') from ts_4893.meters order by ts limit 10 + replace(var1, var2, 't') | +================================= + novtl | + person | + novel | + platt | + 一二三四五六七八九十 | + update | + prision | + person | + prision | + plate | + +taos> select replace(nch1, nch2, var1) from ts_4893.d0 order by ts limit 10 + replace(nch1, nch2, var1) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + nov一二三四五六七八九十l | + novel | + again | + 一二三四五六七八九十 | + novel | + again | + +taos> select replace(nch1, nch2, var1) from ts_4893.meters order by ts limit 10 + replace(nch1, nch2, var1) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + nov一二三四五六七八九十l | + novel | + again | + 一二三四五六七八九十 | + novel | + again | + +taos> select replace(null, 'aa', 'ee') + replace(null, 'aa', 'ee') | +============================ + NULL | + +taos> select replace(null, 'A', 'B') + replace(null, 'A', 'B') | +========================== + NULL | + +taos> select replace('', '', 'B') + replace('', '', 'B') | +======================= + | + +taos> select replace('', 'A', 'B') + replace('', 'A', 'B') | +======================== + | + +taos> select replace('A', 'A', '') + replace('A', 'A', '') | +======================== + | + +taos> select replace('aabbccdd', null, 'ee') + replace('aabbccdd', null, 'ee') | +================================== + NULL | + +taos> select replace('Hello', 'Z', 'X') + replace('Hello', 'Z', 'X') | +============================= + Hello | + +taos> select replace('Hello World', ' ', '_') + replace('Hello World', ' ', '_') | +=================================== + Hello_World | + +taos> select replace('Hello World', 'World', 'MySQL') + replace('Hello World', 'World', 'MySQL') | +=========================================== + Hello MySQL | + +taos> select replace('12345', '5', 'five') + replace('12345', '5', 'five') | +================================ + 1234five | + +taos> select replace('中国', '中', '国') + replace('中国', '中', '国') | +================================== + 国国 | + +taos> select replace('é', 'e', 'a') + replace('é', 'e', 'a') | +========================== + é | + +taos> select replace('!@#', '@', '#') + replace('!@#', '@', '#') | +=========================== + !## | + +taos> select replace('123456', '7', 'eight') + replace('123456', '7', 'eight') | +================================== + 123456 | + +taos> select replace(concat('A', 'B', 'C'), 'B', 'Z') + replace(concat('A', 'B', 'C'), 'B', 'Z') | +=========================================== + AZC | + +taos> select replace(upper('abc'), 'A', 'X') + replace(upper('abc'), 'A', 'X') | +================================== + XBC | + +taos> select replace(trim(' Hello '), 'l', 'L') + replace(trim(' Hello '), 'l', 'L') | +======================================= + HeLLo | + +taos> select replace(lower('HELLO'), 'h', 'H') + replace(lower('HELLO'), 'h', 'H') | +==================================== + Hello | + +taos> select name, replace(substring(name, 1, 5), 'e', 'o') from ts_4893.meters limit 1 + name | replace(substring(name, 1, 5), 'e', 'o') | +============================================================================ + lili | lili | + +taos> select name, replace(name, 'a', 'o') from ts_4893.meters limit 1 + name | replace(name, 'a', 'o') | +================================================================== + lili | lili | + +taos> select var1, replace(var1, '1', 'one') from ts_4893.meters limit 1 + var1 | replace(var1, '1', 'one') | +================================================================== + novel | novel | + +taos> select nch1, replace(nch1, 'n', 'm') from ts_4893.meters limit 1 + nch1 | replace(nch1, 'n', 'm') | +================================================================== + novel | movel | + diff --git a/tests/army/query/function/ans/round.csv b/tests/army/query/function/ans/round.csv index 75b48e51a8..1b6ed548e7 100644 --- a/tests/army/query/function/ans/round.csv +++ b/tests/army/query/function/ans/round.csv @@ -1,94 +1,310 @@ -10.550000000000001 -10.550000000000001 -10.600000000000000 -11.000000000000000 -11.000000000000000 -10.000000000000000 -0.000000000000000 --10.600000000000000 -99 -111.000000000000000 -112.000000000000000 -12.000000000000000 -11.600000000000000 -1.230000000000000e+02 -1.230000000000000e+08 -11.0000000 -9.0000000 -10.0000000 -11.0000000 -11.0000000 -9.0000000 -10.0000000 -11.0000000 -11.0000000 -10.0000000 -11.0000000 -9.0000000 -11.0000000 -8.0000000 -12.0000000 -9.0000000 -10.0000000 -10.0000000 -10.0000000 -10.0000000 -8.765432100000000e+07 -8.765432109999999e+07 -8.765432112000000e+07 -8.765432112300000e+07 -8.765432112350000e+07 -8.765432112345999e+07 -8.765432112345700e+07 -8.765432112345681e+07 -8.765432112345679e+07 -8.765432112345679e+07 -11.0000000 -8.6000004 -9.8000002 -11.2329998 -10.7060003 -8.5080004 -9.5959997 -10.9619999 -11.2259998 -10.3369999 -10.6999998 -8.6000004 -9.8000002 -11.1999998 -10.6999998 -8.5000000 -9.6000004 -11.0000000 -11.1999998 -10.3000002 -10.55 -10.55 -10.6 -11 -11 -10 -0 --10.6 -99 -11 -9 -10 -11 -11 -9 -10 -11 -11 -10 -11 -9 -10 -11 -11 -9 -10 -11 -11 -10 + +taos> select ROUND(10.55, 3) + round(10.55, 3) | +============================ + 10.550000000000001 | + +taos> select ROUND(10.55, 2) + round(10.55, 2) | +============================ + 10.550000000000001 | + +taos> select ROUND(10.55, 1) + round(10.55, 1) | +============================ + 10.600000000000000 | + +taos> select ROUND(10.55, 0) + round(10.55, 0) | +============================ + 11.000000000000000 | + +taos> select ROUND(10.55) + round(10.55) | +============================ + 11.000000000000000 | + +taos> select ROUND(10.55, -1) + round(10.55, -1) | +============================ + 10.000000000000000 | + +taos> select ROUND(10.55, -10) + round(10.55, -10) | +============================ + 0.000000000000000 | + +taos> select ROUND(-10.55, 1) + round(-10.55, 1) | +============================ + -10.600000000000000 | + +taos> select ROUND(99, 1) + round(99, 1) | +======================== + 99 | + +taos> select ROUND(111.1111) + round(111.1111) | +============================ + 111.000000000000000 | + +taos> select ROUND(111.5111) + round(111.5111) | +============================ + 112.000000000000000 | + +taos> select ROUND(10.55) + 1 + round(10.55) + 1 | +============================ + 12.000000000000000 | + +taos> select ROUND(10.55, 1) + 1 + round(10.55, 1) + 1 | +============================ + 11.600000000000000 | + +taos> select ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(123.123456789, 9), 8), 7), 6), 5), 4)) + round(round(round(round(round(round(round(123.123456789, 9), 8), | +=================================================================== + 1.230000000000000e+02 | + +taos> select ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(123456789.123456789, -1), -2), -3), -4), -5), -6)) + round(round(round(round(round(round(round(123456789.123456789, - | +=================================================================== + 1.230000000000000e+08 | + +taos> select ROUND(current) from ts_4893.meters order by ts limit 20 + round(current) | +======================= + 11.0000000 | + 9.0000000 | + 10.0000000 | + 11.0000000 | + 11.0000000 | + 9.0000000 | + 10.0000000 | + 11.0000000 | + 11.0000000 | + 10.0000000 | + 11.0000000 | + 9.0000000 | + 11.0000000 | + 8.0000000 | + 12.0000000 | + 9.0000000 | + 10.0000000 | + 10.0000000 | + 10.0000000 | + 10.0000000 | + +taos> select ROUND(87654321.123456789, id) from ts_4893.meters order by ts limit 10 + round(87654321.123456789, id) | +================================ + 8.765432100000000e+07 | + 8.765432109999999e+07 | + 8.765432112000000e+07 | + 8.765432112300000e+07 | + 8.765432112350000e+07 | + 8.765432112345999e+07 | + 8.765432112345700e+07 | + 8.765432112345681e+07 | + 8.765432112345679e+07 | + 8.765432112345679e+07 | + +taos> select ROUND(current, id) from ts_4893.meters order by ts limit 10 + round(current, id) | +======================= + 11.0000000 | + 8.6000004 | + 9.8000002 | + 11.2329998 | + 10.7060003 | + 8.5080004 | + 9.5959997 | + 10.9619999 | + 11.2259998 | + 10.3369999 | + +taos> select ROUND(current, 1) from ts_4893.meters order by ts limit 10 + round(current, 1) | +======================= + 10.6999998 | + 8.6000004 | + 9.8000002 | + 11.1999998 | + 10.6999998 | + 8.5000000 | + 9.6000004 | + 11.0000000 | + 11.1999998 | + 10.3000002 | + +taos> select round(10.55, 3) + round(10.55, 3) | +============================ + 10.550000000000001 | + +taos> select round(10.55, 2) + round(10.55, 2) | +============================ + 10.550000000000001 | + +taos> select round(10.55, 1) + round(10.55, 1) | +============================ + 10.600000000000000 | + +taos> select round(10.55, 0) + round(10.55, 0) | +============================ + 11.000000000000000 | + +taos> select round(10.55) + round(10.55) | +============================ + 11.000000000000000 | + +taos> select round(10.55, -1) + round(10.55, -1) | +============================ + 10.000000000000000 | + +taos> select round(10.55, -10) + round(10.55, -10) | +============================ + 0.000000000000000 | + +taos> select round(-10.55, 1) + round(-10.55, 1) | +============================ + -10.600000000000000 | + +taos> select round(99, 1) + round(99, 1) | +======================== + 99 | + +taos> select round(current) from ts_4893.d0 order by ts limit 10 + round(current) | +======================= + 11.0000000 | + 9.0000000 | + 10.0000000 | + 11.0000000 | + 11.0000000 | + 9.0000000 | + 10.0000000 | + 11.0000000 | + 11.0000000 | + 10.0000000 | + +taos> select round(current) from ts_4893.meters order by ts limit 10 + round(current) | +======================= + 11.0000000 | + 9.0000000 | + 10.0000000 | + 11.0000000 | + 11.0000000 | + 9.0000000 | + 10.0000000 | + 11.0000000 | + 11.0000000 | + 10.0000000 | + +taos> select round(10, null) + round(10, null) | +======================== + NULL | + +taos> select round(null, 2) + round(null, 2) | +======================== + NULL | + +taos> select round(123.456, null) + round(123.456, null) | +============================ + NULL | + +taos> select round(100) + round(100) | +======================== + 100 | + +taos> select round(0.00123, -2) + round(0.00123, -2) | +============================ + 0.000000000000000 | + +taos> select round(123.456, 0) + round(123.456, 0) | +============================ + 123.000000000000000 | + +taos> select round(123.456, -5) + round(123.456, -5) | +============================ + 0.000000000000000 | + +taos> select round(12345.6789, -2) + round(12345.6789, -2) | +============================ + 12300.000000000000000 | + +taos> select round(-123.456, 2) + round(-123.456, 2) | +============================ + -123.459999999999994 | + +taos> select round(-1234.5678, 2) + round(-1234.5678, 2) | +============================ + -1234.569999999999936 | + +taos> select round(voltage, 0) from ts_4893.meters limit 1 + round(voltage, 0) | +==================== + 221 | + +taos> select round(current, 1) from ts_4893.meters limit 1 + round(current, 1) | +======================= + 10.6999998 | + +taos> select round(phase, 3) from ts_4893.meters limit 1 + round(phase, 3) | +======================= + 0.5090000 | + +taos> select round(voltage, -1) from ts_4893.meters limit 1 + round(voltage, -1) | +===================== + 220 | + +taos> select round(current * voltage, 2) from ts_4893.meters limit 1 + round(current * voltage, 2) | +============================== + 2.353650000000000e+03 | + +taos> select round(abs(voltage), 2) from ts_4893.meters limit 1 + round(abs(voltage), 2) | +========================= + 221 | + +taos> select round(pi() * phase, 3) from ts_4893.meters limit 1 + round(pi() * phase, 3) | +============================ + 1.599000000000000 | + +taos> select round(sqrt(voltage), 2) from ts_4893.meters limit 1 + round(sqrt(voltage), 2) | +============================ + 14.869999999999999 | + +taos> select round(log(current), 2) from ts_4893.meters limit 1 + round(log(current), 2) | +============================ + 2.370000000000000 | + diff --git a/tests/army/query/function/ans/sign.csv b/tests/army/query/function/ans/sign.csv index 4338e8f40d..e15b4a74c7 100644 --- a/tests/army/query/function/ans/sign.csv +++ b/tests/army/query/function/ans/sign.csv @@ -1,70 +1,275 @@ -0 -1 -1.000000000000000 -1 --1 --1.000000000000000 --1 -2.000000000000000 -0.000000000000000 -1.000000000000000 -1.000000000000000 -1 -1 -1 -1 -1 -2.000000000000000 -0.000000000000000 -2.000000000000000 -0.500000000000000 -2.000000000000000 -0.000000000000000 -1.000000000000000 -1.000000000000000 -1.000000000000000 -2.000000000000000 -3.000000000000000 -4.000000000000000 -5.000000000000000 -0.000000000000000 -2.000000000000000 -3.000000000000000 -4.000000000000000 -5.000000000000000 -1 -1 -1 -1.000000000000000 -1.000000000000000 -1 -0.000000000000000 -1.000000000000000 -1.000000000000000 -1.000000000000000 -1.000000000000000 -0 -1 -1 --1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 + +taos> select SIGN(0) + sign(0) | +======================== + 0 | + +taos> select SIGN(1) + sign(1) | +======================== + 1 | + +taos> select SIGN(1.5) + sign(1.5) | +============================ + 1.000000000000000 | + +taos> select SIGN(100) + sign(100) | +======================== + 1 | + +taos> select SIGN(-1) + sign(-1) | +======================== + -1 | + +taos> select SIGN(-1.5) + sign(-1.5) | +============================ + -1.000000000000000 | + +taos> select SIGN(-100) + sign(-100) | +======================== + -1 | + +taos> select SIGN(1) + 1 + sign(1) + 1 | +============================ + 2.000000000000000 | + +taos> select SIGN(1) - 1 + sign(1) - 1 | +============================ + 0.000000000000000 | + +taos> select SIGN(1) * 1 + sign(1) * 1 | +============================ + 1.000000000000000 | + +taos> select SIGN(1) / 1 + sign(1) / 1 | +============================ + 1.000000000000000 | + +taos> select SIGN(1) from ts_4893.meters limit 5 + sign(1) | +======================== + 1 | + 1 | + 1 | + 1 | + 1 | + +taos> select SIGN(1) + 1 from ts_4893.meters limit 1 + sign(1) + 1 | +============================ + 2.000000000000000 | + +taos> select SIGN(1) - 1 from ts_4893.meters limit 1 + sign(1) - 1 | +============================ + 0.000000000000000 | + +taos> select SIGN(1) * 2 from ts_4893.meters limit 1 + sign(1) * 2 | +============================ + 2.000000000000000 | + +taos> select SIGN(1) / 2 from ts_4893.meters limit 1 + sign(1) / 2 | +============================ + 0.500000000000000 | + +taos> select SIGN(2) + SIGN(1) from ts_4893.meters limit 1 + sign(2) + sign(1) | +============================ + 2.000000000000000 | + +taos> select SIGN(2) - SIGN(1) from ts_4893.meters limit 1 + sign(2) - sign(1) | +============================ + 0.000000000000000 | + +taos> select SIGN(2) * SIGN(1) from ts_4893.meters limit 1 + sign(2) * sign(1) | +============================ + 1.000000000000000 | + +taos> select SIGN(2) / SIGN(1) from ts_4893.meters limit 1 + sign(2) / sign(1) | +============================ + 1.000000000000000 | + +taos> select SIGN(1) + id from ts_4893.meters order by ts limit 5 + sign(1) + id | +============================ + 1.000000000000000 | + 2.000000000000000 | + 3.000000000000000 | + 4.000000000000000 | + 5.000000000000000 | + +taos> select SIGN(id) + id from ts_4893.meters order by ts limit 5 + sign(id) + id | +============================ + 0.000000000000000 | + 2.000000000000000 | + 3.000000000000000 | + 4.000000000000000 | + 5.000000000000000 | + +taos> select SIGN(abs(10)) + sign(abs(10)) | +======================== + 1 | + +taos> select SIGN(abs(-10)) + sign(abs(-10)) | +======================== + 1 | + +taos> select abs(SIGN(10)) + abs(sign(10)) | +======================== + 1 | + +taos> select pow(SIGN(10), 2) + pow(sign(10), 2) | +============================ + 1.000000000000000 | + +taos> select sqrt(SIGN(10)) + sqrt(sign(10)) | +============================ + 1.000000000000000 | + +taos> select cast(SIGN(10) as int) + cast(sign(10) as int) | +======================== + 1 | + +taos> select SIGN(sqrt(id)) from ts_4893.meters order by ts limit 5 + sign(sqrt(id)) | +============================ + 0.000000000000000 | + 1.000000000000000 | + 1.000000000000000 | + 1.000000000000000 | + 1.000000000000000 | + +taos> select SIGN(SIGN(SIGN(SIGN(0)))) + sign(sign(sign(sign(0)))) | +============================ + 0 | + +taos> select sign(1) + sign(1) | +======================== + 1 | + +taos> select sign(10) + sign(10) | +======================== + 1 | + +taos> select sign(-1) + sign(-1) | +======================== + -1 | + +taos> select sign(-10) + sign(-10) | +======================== + -1 | + +taos> select sign(current) from ts_4893.d0 order by ts limit 10 + sign(current) | +======================= + 1.0000000 | + 1.0000000 | + 1.0000000 | + 1.0000000 | + 1.0000000 | + 1.0000000 | + 1.0000000 | + 1.0000000 | + 1.0000000 | + 1.0000000 | + +taos> select sign(current) from ts_4893.meters order by ts limit 10 + sign(current) | +======================= + 1.0000000 | + 1.0000000 | + 1.0000000 | + 1.0000000 | + 1.0000000 | + 1.0000000 | + 1.0000000 | + 1.0000000 | + 1.0000000 | + 1.0000000 | + +taos> select sign(null) + sign(null) | +======================== + NULL | + +taos> select sign(25) + sign(25) | +======================== + 1 | + +taos> select sign(-10) + sign(-10) | +======================== + -1 | + +taos> select sign(0.1) + sign(0.1) | +============================ + 1.000000000000000 | + +taos> select sign(-0.1) + sign(-0.1) | +============================ + -1.000000000000000 | + +taos> select sign(current) from ts_4893.meters limit 1 + sign(current) | +======================= + 1.0000000 | + +taos> select sign(voltage) from ts_4893.meters limit 1 + sign(voltage) | +================ + 1 | + +taos> select sign(phase) from ts_4893.meters limit 1 + sign(phase) | +======================= + 1.0000000 | + +taos> select sign(abs(voltage)) from ts_4893.meters limit 1 + sign(abs(voltage)) | +===================== + 1 | + +taos> select sign(round(current)) from ts_4893.meters limit 1 + sign(round(current)) | +======================= + 1.0000000 | + +taos> select sign(sqrt(voltage)) from ts_4893.meters limit 1 + sign(sqrt(voltage)) | +============================ + 1.000000000000000 | + +taos> select sign(log(current + 1)) from ts_4893.meters limit 1 + sign(log(current + 1)) | +============================ + 1.000000000000000 | + diff --git a/tests/army/query/function/ans/stddev.csv b/tests/army/query/function/ans/stddev.csv index 48d54ae544..95af278013 100644 --- a/tests/army/query/function/ans/stddev.csv +++ b/tests/army/query/function/ans/stddev.csv @@ -1,37 +1,138 @@ -1.154339668872968 -0.838273408289688 -0.838639277789964 -0.839707477142887 -0.839707477142887 -0.840565842326812 -0.844574982206356 -0.846680761198646 -0.847012832740021 -0.847182714923875 -0.848223610563542 -2886.751331514371941 -4.609772228646444 -8.366600265340756 -8.366600265340756 -8.366600265340756 -8.366600265340756 -8.077747210701755 -8.366600265340756 -8.366600265340756 -8.366600265340756 -8.366600265340756 -2857.595142773027419 -4.609772228646444 -5.477225575051661 -8.077747210701755 -8.077747210701755 -8.077747210701755 -8.077747210701755 -8.077747210701755 -8.077747210701755 -8.077747210701755 -8.077747210701755 -2886.751331514371941 -2886.751331514371941 -1.154339668872967 -1.154339668872967 + +taos> select STDDEV(current) from ts_4893.meters + stddev(current) | +============================ + 1.154339668872967 | + +taos> select STDDEV(current) from ts_4893.meters interval(1d) order by 1 limit 10 + stddev(current) | +============================ + 0.838273408289689 | + 0.838639277789961 | + 0.839707477142884 | + 0.839707477142884 | + 0.840565842326814 | + 0.844574982206356 | + 0.846680761198646 | + 0.847012832740024 | + 0.847182714923872 | + 0.848223610563545 | + +taos> select STDDEV(id) from ts_4893.meters + stddev(id) | +============================ + 2886.751331514371941 | + +taos> select STDDEV(id) from ts_4893.meters interval(1d) limit 10 + stddev(id) | +============================ + 4.609772228646444 | + 8.366600265340756 | + 8.366600265340756 | + 8.366600265340756 | + 8.366600265340756 | + 8.077747210701755 | + 8.366600265340756 | + 8.366600265340756 | + 8.366600265340756 | + 8.366600265340756 | + +taos> select STDDEV(id) from ts_4893.meters where id > 100 + stddev(id) | +============================ + 2857.595142773027419 | + +taos> select STDDEV(id) from ts_4893.meters interval(1d) order by 1 limit 10 + stddev(id) | +============================ + 4.609772228646444 | + 5.477225575051661 | + 8.077747210701755 | + 8.077747210701755 | + 8.077747210701755 | + 8.077747210701755 | + 8.077747210701755 | + 8.077747210701755 | + 8.077747210701755 | + 8.077747210701755 | + +taos> select stddev_pop(null) from ts_4893.meters + stddev_pop(null) | +============================ + NULL | + +taos> select stddev_pop(id) from ts_4893.d0 + stddev_pop(id) | +============================ + 2886.751331514371941 | + +taos> select stddev_pop(id) from ts_4893.meters + stddev_pop(id) | +============================ + 2886.751331514371941 | + +taos> select stddev_pop(current) from ts_4893.d0 + stddev_pop(current) | +============================ + 1.154339668872967 | + +taos> select stddev_pop(current) from ts_4893.meters + stddev_pop(current) | +============================ + 1.154339668872967 | + +taos> select stddev_pop(voltage) from ts_4893.meters + stddev_pop(voltage) | +============================ + 2.876459705957324 | + +taos> select stddev_pop(voltage) from ts_4893.meters where voltage is not null + stddev_pop(voltage) | +============================ + 2.876459705957324 | + +taos> select stddev_pop(phase) from ts_4893.meters + stddev_pop(phase) | +============================ + 0.288595458155823 | + +taos> select stddev_pop(phase) from ts_4893.meters where ts between '2023-01-01 00:00:00' and '2023-12-31 23:59:59' + stddev_pop(phase) | +============================ + 0.288075357974611 | + +taos> select stddev_pop(total_voltage) from (select sum(voltage) as total_voltage from ts_4893.meters group by location) + stddev_pop(total_voltage) | +============================ + 0.000000000000000 | + +taos> select round(stddev_pop(current), 2) from ts_4893.meters + round(stddev_pop(current), 2) | +================================ + 1.150000000000000e+00 | + +taos> select pow(stddev_pop(current), 2) from ts_4893.meters + pow(stddev_pop(current), 2) | +============================== + 1.332500071133751e+00 | + +taos> select log(stddev_pop(voltage) + 1) from ts_4893.meters + log(stddev_pop(voltage) + 1) | +=============================== + 1.354922290183882e+00 | + +taos> select groupid, stddev_pop(voltage) from ts_4893.meters group by groupid order by groupid + groupid | stddev_pop(voltage) | +====================================== + 1 | 2.876459705957324 | + +taos> select location, stddev_pop(current) from ts_4893.meters group by location order by location + location | stddev_pop(current) | +================================================= + beijing | 1.154339668872967 | + +taos> select location, stddev_pop(voltage) from ts_4893.meters group by location order by location + location | stddev_pop(voltage) | +================================================= + beijing | 2.876459705957324 | + diff --git a/tests/army/query/function/ans/substr.csv b/tests/army/query/function/ans/substr.csv index 72fd79c419..f56ea44ace 100644 --- a/tests/army/query/function/ans/substr.csv +++ b/tests/army/query/function/ans/substr.csv @@ -1,495 +1,1182 @@ -Hello.World! -Hello -Hello.World! -Hello.World! -Hello -Hello.World! -World! -World -World! -World! -World -World! -北京涛思数据科技有限公司,tdengine. -北京涛思数 -北京涛思数据科技有限公司,tdengin -北京涛思数据科技有限公司,tdengine. -北京涛思数 -北京涛思数据科技有限公司,tdengin -ngine. -ngine -ngine. -ngine. -ngine -ngine. -一二三四五六七八九十 -prision -一二三四五六七八九十 -prision -abc一二三abc一二三abc -一二三四五 -prisi -一二三四五 -prisi -abc一二 -一二三四五六七八九十 -prision -一二三四五六七八九十 -prision -abc一二三abc一二三abc -一二三四五六七八九十 -prision -一二三四五六七八九十 -prision -abc一二三abc一二三abc -一二三四五 -prisi -一二三四五 -prisi -abc一二 -一二三四五六七八九十 -prision -一二三四五六七八九十 -prision -abc一二三abc一二三abc -五六七八九十 -rision -五六七八九十 -rision -一二三abc -五六七八九 -risio -五六七八九 -risio -一二三ab -五六七八九十 -rision -五六七八九十 -rision -一二三abc -五六七八九十 -rision -五六七八九十 -rision -一二三abc -五六七八九 -risio -五六七八九 -risio -一二三ab -五六七八九十 -rision -五六七八九十 -rision -一二三abc -一二三四五六七八九十 -prision -prision -abc一二三abc一二三abc -一二三123321三二一 -一二三四五 -prisi -prisi -abc一二 -一二三12 -一二三四五六七八九十 -prision -prision -abc一二三abc一二三abc -一二三123321三二一 -一二三四五六七八九十 -prision -prision -abc一二三abc一二三abc -一二三123321三二一 -一二三四五 -prisi -prisi -abc一二 -一二三12 -一二三四五六七八九十 -prision -prision -abc一二三abc一二三abc -一二三123321三二一 -五六七八九十 -rision -rision -一二三abc -321三二一 -五六七八九 -risio -risio -一二三ab -321三二 -五六七八九十 -rision -rision -一二三abc -321三二一 -五六七八九十 -rision -rision -一二三abc -321三二一 -五六七八九 -risio -risio -一二三ab -321三二 -五六七八九十 -rision -rision -一二三abc -321三二一 -一 -p -一 -p -a -一二三四五 -prisi -一二三四五 -prisi -abc一二 -一二三四五六七八九十 -prision -一二三四五六七八九十 -prision -abc一二三abc一二三abc -一二三四五六七八九十 -prision -一二三四五六七八九十 -prision -abc一二三abc一二三abc -一二三四五 -prisi -一二三四五 -prisi -abc一二 -一二三四五六七八九十 -prision -一二三四五六七八九十 -prision -abc一二三abc一二三abc -一 -p -p -a -一 -一二三四五 -prisi -prisi -abc一二 -一二三12 -一二三四五六七八九十 -prision -prision -abc一二三abc一二三abc -一二三123321三二一 -一二三四五六七八九十 -prision -prision -abc一二三abc一二三abc -一二三123321三二一 -一二三四五 -prisi -prisi -abc一二 -一二三12 -一二三四五六七八九十 -prision -prision -abc一二三abc一二三abc -一二三123321三二一 -二 -ris -二三四五六七八 -rision -bc一二三abc一二三a -二 -ris -二三四五六七八 -rision -bc一二三abc一二三a -二三四五 -rision -rision -bc一二三abc一二三a -二三123321三二一 -二三四五 -rision -rision -bc一二三abc一二三a -二三123321三二一 -Hello.World! -Hello -Hello.World! -Hello.World! -Hello -Hello.World! -World! -World -World! -World! -World -World! -北京涛思数据科技有限公司,tdengine. -北京涛思数 -北京涛思数据科技有限公司,tdengin -北京涛思数据科技有限公司,tdengine. -北京涛思数 -北京涛思数据科技有限公司,tdengin -ngine. -ngine -ngine. -ngine. -ngine -ngine. -一二三四五六七八九十 -prision -一二三四五六七八九十 -prision -abc一二三abc一二三abc -一二三四五 -prisi -一二三四五 -prisi -abc一二 -一二三四五六七八九十 -prision -一二三四五六七八九十 -prision -abc一二三abc一二三abc -一二三四五六七八九十 -prision -一二三四五六七八九十 -prision -abc一二三abc一二三abc -一二三四五 -prisi -一二三四五 -prisi -abc一二 -一二三四五六七八九十 -prision -一二三四五六七八九十 -prision -abc一二三abc一二三abc -五六七八九十 -rision -五六七八九十 -rision -一二三abc -五六七八九 -risio -五六七八九 -risio -一二三ab -五六七八九十 -rision -五六七八九十 -rision -一二三abc -五六七八九十 -rision -五六七八九十 -rision -一二三abc -五六七八九 -risio -五六七八九 -risio -一二三ab -五六七八九十 -rision -五六七八九十 -rision -一二三abc -一二三四五六七八九十 -prision -prision -abc一二三abc一二三abc -一二三123321三二一 -一二三四五 -prisi -prisi -abc一二 -一二三12 -一二三四五六七八九十 -prision -prision -abc一二三abc一二三abc -一二三123321三二一 -一二三四五六七八九十 -prision -prision -abc一二三abc一二三abc -一二三123321三二一 -一二三四五 -prisi -prisi -abc一二 -一二三12 -一二三四五六七八九十 -prision -prision -abc一二三abc一二三abc -一二三123321三二一 -五六七八九十 -rision -rision -一二三abc -321三二一 -五六七八九 -risio -risio -一二三ab -321三二 -五六七八九十 -rision -rision -一二三abc -321三二一 -五六七八九十 -rision -rision -一二三abc -321三二一 -五六七八九 -risio -risio -一二三ab -321三二 -五六七八九十 -rision -rision -一二三abc -321三二一 -一 -p -一 -p -a -一二三四五 -prisi -一二三四五 -prisi -abc一二 -一二三四五六七八九十 -prision -一二三四五六七八九十 -prision -abc一二三abc一二三abc -一二三四五六七八九十 -prision -一二三四五六七八九十 -prision -abc一二三abc一二三abc -一二三四五 -prisi -一二三四五 -prisi -abc一二 -一二三四五六七八九十 -prision -一二三四五六七八九十 -prision -abc一二三abc一二三abc -一 -p -p -a -一 -一二三四五 -prisi -prisi -abc一二 -一二三12 -一二三四五六七八九十 -prision -prision -abc一二三abc一二三abc -一二三123321三二一 -一二三四五六七八九十 -prision -prision -abc一二三abc一二三abc -一二三123321三二一 -一二三四五 -prisi -prisi -abc一二 -一二三12 -一二三四五六七八九十 -prision -prision -abc一二三abc一二三abc -一二三123321三二一 -二 -ris -二三四五六七八 -rision -bc一二三abc一二三a -二 -ris -二三四五六七八 -rision -bc一二三abc一二三a -二三四五 -rision -rision -bc一二三abc一二三a -二三123321三二一 -二三四五 -rision -rision -bc一二三abc一二三a -二三123321三二一 -dengine -e -tde -dengine -e -中国 -中国t -novel -perso -novel -plate -一二三四五 -updat -prisi -perso -prisi -plate -novel -perso -novel -plate -一二三四五 -updat -prisi -perso -prisi -plate -novel -一二三四五 -updat -prisi -novel -novel -again -一二三四五 -novel -again -novel -一二三四五 -updat -prisi -novel -novel -again -一二三四五 -novel -again + +taos> select SUBSTRING('Hello.World!', 1) + substring('Hello.World!', 1) | +=============================== + Hello.World! | + +taos> select SUBSTRING('Hello.World!', 1, 5) + substring('Hello.World!', 1, 5) | +================================== + Hello | + +taos> select SUBSTRING('Hello.World!', 1, 20) + substring('Hello.World!', 1, 20) | +=================================== + Hello.World! | + +taos> select SUBSTRING('Hello.World!' FROM 1) + substring('Hello.World!' from 1) | +=================================== + Hello.World! | + +taos> select SUBSTRING('Hello.World!' FROM 1 FOR 5) + substring('Hello.World!' from 1 for 5) | +========================================= + Hello | + +taos> select SUBSTRING('Hello.World!' FROM 1 FOR 20) + substring('Hello.World!' from 1 for 20) | +========================================== + Hello.World! | + +taos> select SUBSTRING('Hello.World!', -6) + substring('Hello.World!', -6) | +================================ + World! | + +taos> select SUBSTRING('Hello.World!', -6, 5) + substring('Hello.World!', -6, 5) | +=================================== + World | + +taos> select SUBSTRING('Hello.World!', -6, 20) + substring('Hello.World!', -6, 20) | +==================================== + World! | + +taos> select SUBSTRING('Hello.World!' FROM -6) + substring('Hello.World!' from -6) | +==================================== + World! | + +taos> select SUBSTRING('Hello.World!' FROM -6 FOR 5) + substring('Hello.World!' from -6 for 5) | +========================================== + World | + +taos> select SUBSTRING('Hello.World!' FROM -6 FOR 20) + substring('Hello.World!' from -6 for 20) | +=========================================== + World! | + +taos> select SUBSTRING('北京涛思数据科技有限公司,tdengine.', 1) + substring('北京涛思数据科技有限公司,tdengine.', 1) | +=================================================================== + 北京涛思数据科技有限公司,tdengine. | + +taos> select SUBSTRING('北京涛思数据科技有限公司,tdengine.', 1, 5) + substring('北京涛思数据科技有限公司,tdengine.', 1, | +=================================================================== + 北京涛思数 | + +taos> select SUBSTRING('北京涛思数据科技有限公司,tdengine.', 1, 20) + substring('北京涛思数据科技有限公司,tdengine.', 1, | +=================================================================== + 北京涛思数据科技有限公司,tdengin | + +taos> select SUBSTRING('北京涛思数据科技有限公司,tdengine.' FROM 1) + substring('北京涛思数据科技有限公司,tdengine.' fro | +=================================================================== + 北京涛思数据科技有限公司,tdengine. | + +taos> select SUBSTRING('北京涛思数据科技有限公司,tdengine.' FROM 1 FOR 5) + substring('北京涛思数据科技有限公司,tdengine.' fro | +=================================================================== + 北京涛思数 | + +taos> select SUBSTRING('北京涛思数据科技有限公司,tdengine.' FROM 1 FOR 20) + substring('北京涛思数据科技有限公司,tdengine.' fro | +=================================================================== + 北京涛思数据科技有限公司,tdengin | + +taos> select SUBSTRING('北京涛思数据科技有限公司,tdengine.', -6) + substring('北京涛思数据科技有限公司,tdengine.', -6 | +=================================================================== + ngine. | + +taos> select SUBSTRING('北京涛思数据科技有限公司,tdengine.', -6, 5) + substring('北京涛思数据科技有限公司,tdengine.', -6 | +=================================================================== + ngine | + +taos> select SUBSTRING('北京涛思数据科技有限公司,tdengine.', -6, 20) + substring('北京涛思数据科技有限公司,tdengine.', -6 | +=================================================================== + ngine. | + +taos> select SUBSTRING('北京涛思数据科技有限公司,tdengine.' FROM -6) + substring('北京涛思数据科技有限公司,tdengine.' fro | +=================================================================== + ngine. | + +taos> select SUBSTRING('北京涛思数据科技有限公司,tdengine.' FROM -6 FOR 5) + substring('北京涛思数据科技有限公司,tdengine.' fro | +=================================================================== + ngine | + +taos> select SUBSTRING('北京涛思数据科技有限公司,tdengine.' FROM -6 FOR 20) + substring('北京涛思数据科技有限公司,tdengine.' fro | +=================================================================== + ngine. | + +taos> select SUBSTRING(nch1, 1) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substring(nch1, 1) | +================================= + 一二三四五六七八九十 | + prision | + 一二三四五六七八九十 | + prision | + abc一二三abc一二三abc | + +taos> select SUBSTRING(nch1, 1, 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substring(nch1, 1, 5) | +================================= + 一二三四五 | + prisi | + 一二三四五 | + prisi | + abc一二 | + +taos> select SUBSTRING(nch1, 1, 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substring(nch1, 1, 20) | +================================= + 一二三四五六七八九十 | + prision | + 一二三四五六七八九十 | + prision | + abc一二三abc一二三abc | + +taos> select SUBSTRING(nch1 FROM 1) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substring(nch1 from 1) | +================================= + 一二三四五六七八九十 | + prision | + 一二三四五六七八九十 | + prision | + abc一二三abc一二三abc | + +taos> select SUBSTRING(nch1 FROM 1 FOR 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substring(nch1 from 1 for 5) | +================================= + 一二三四五 | + prisi | + 一二三四五 | + prisi | + abc一二 | + +taos> select SUBSTRING(nch1 FROM 1 FOR 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substring(nch1 from 1 for 20) | +================================= + 一二三四五六七八九十 | + prision | + 一二三四五六七八九十 | + prision | + abc一二三abc一二三abc | + +taos> select SUBSTRING(nch1, -6) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substring(nch1, -6) | +================================= + 五六七八九十 | + rision | + 五六七八九十 | + rision | + 一二三abc | + +taos> select SUBSTRING(nch1, -6, 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substring(nch1, -6, 5) | +================================= + 五六七八九 | + risio | + 五六七八九 | + risio | + 一二三ab | + +taos> select SUBSTRING(nch1, -6, 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substring(nch1, -6, 20) | +================================= + 五六七八九十 | + rision | + 五六七八九十 | + rision | + 一二三abc | + +taos> select SUBSTRING(nch1 FROM -6) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substring(nch1 from -6) | +================================= + 五六七八九十 | + rision | + 五六七八九十 | + rision | + 一二三abc | + +taos> select SUBSTRING(nch1 FROM -6 FOR 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substring(nch1 from -6 for 5) | +================================= + 五六七八九 | + risio | + 五六七八九 | + risio | + 一二三ab | + +taos> select SUBSTRING(nch1 FROM -6 FOR 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substring(nch1 from -6 for 20) | +================================= + 五六七八九十 | + rision | + 五六七八九十 | + rision | + 一二三abc | + +taos> select SUBSTRING(var1, 1) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substring(var1, 1) | +================================= + 一二三四五六七八九十 | + prision | + prision | + abc一二三abc一二三abc | + 一二三123321三二一 | + +taos> select SUBSTRING(var1, 1, 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substring(var1, 1, 5) | +================================= + 一二三四五 | + prisi | + prisi | + abc一二 | + 一二三12 | + +taos> select SUBSTRING(var1, 1, 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substring(var1, 1, 20) | +================================= + 一二三四五六七八九十 | + prision | + prision | + abc一二三abc一二三abc | + 一二三123321三二一 | + +taos> select SUBSTRING(var1 FROM 1) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substring(var1 from 1) | +================================= + 一二三四五六七八九十 | + prision | + prision | + abc一二三abc一二三abc | + 一二三123321三二一 | + +taos> select SUBSTRING(var1 FROM 1 FOR 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substring(var1 from 1 for 5) | +================================= + 一二三四五 | + prisi | + prisi | + abc一二 | + 一二三12 | + +taos> select SUBSTRING(var1 FROM 1 FOR 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substring(var1 from 1 for 20) | +================================= + 一二三四五六七八九十 | + prision | + prision | + abc一二三abc一二三abc | + 一二三123321三二一 | + +taos> select SUBSTRING(var1, -6) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substring(var1, -6) | +================================= + 五六七八九十 | + rision | + rision | + 一二三abc | + 321三二一 | + +taos> select SUBSTRING(var1, -6, 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substring(var1, -6, 5) | +================================= + 五六七八九 | + risio | + risio | + 一二三ab | + 321三二 | + +taos> select SUBSTRING(var1, -6, 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substring(var1, -6, 20) | +================================= + 五六七八九十 | + rision | + rision | + 一二三abc | + 321三二一 | + +taos> select SUBSTRING(var1 FROM -6) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substring(var1 from -6) | +================================= + 五六七八九十 | + rision | + rision | + 一二三abc | + 321三二一 | + +taos> select SUBSTRING(var1 FROM -6 FOR 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substring(var1 from -6 for 5) | +================================= + 五六七八九 | + risio | + risio | + 一二三ab | + 321三二 | + +taos> select SUBSTRING(var1 FROM -6 FOR 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substring(var1 from -6 for 20) | +================================= + 五六七八九十 | + rision | + rision | + 一二三abc | + 321三二一 | + +taos> select SUBSTRING(nch1, sign(id), 1) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substring(nch1, sign(id), 1) | +================================= + 一 | + p | + 一 | + p | + a | + +taos> select SUBSTRING(nch1, sign(id), 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substring(nch1, sign(id), 5) | +================================= + 一二三四五 | + prisi | + 一二三四五 | + prisi | + abc一二 | + +taos> select SUBSTRING(nch1, sign(id), 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substring(nch1, sign(id), 20) | +================================= + 一二三四五六七八九十 | + prision | + 一二三四五六七八九十 | + prision | + abc一二三abc一二三abc | + +taos> select SUBSTRING(nch1 FROM sign(id)) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substring(nch1 from sign(id)) | +================================= + 一二三四五六七八九十 | + prision | + 一二三四五六七八九十 | + prision | + abc一二三abc一二三abc | + +taos> select SUBSTRING(nch1 FROM sign(id) FOR 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substring(nch1 from sign(id) for 5) | +====================================== + 一二三四五 | + prisi | + 一二三四五 | + prisi | + abc一二 | + +taos> select SUBSTRING(nch1 FROM sign(id) FOR 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substring(nch1 from sign(id) for 20) | +======================================= + 一二三四五六七八九十 | + prision | + 一二三四五六七八九十 | + prision | + abc一二三abc一二三abc | + +taos> select SUBSTRING(var1, sign(id), 1) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substring(var1, sign(id), 1) | +================================= + 一 | + p | + p | + a | + 一 | + +taos> select SUBSTRING(var1, sign(id), 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substring(var1, sign(id), 5) | +================================= + 一二三四五 | + prisi | + prisi | + abc一二 | + 一二三12 | + +taos> select SUBSTRING(var1, sign(id), 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substring(var1, sign(id), 20) | +================================= + 一二三四五六七八九十 | + prision | + prision | + abc一二三abc一二三abc | + 一二三123321三二一 | + +taos> select SUBSTRING(var1 FROM sign(id)) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substring(var1 from sign(id)) | +================================= + 一二三四五六七八九十 | + prision | + prision | + abc一二三abc一二三abc | + 一二三123321三二一 | + +taos> select SUBSTRING(var1 FROM sign(id) FOR 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substring(var1 from sign(id) for 5) | +====================================== + 一二三四五 | + prisi | + prisi | + abc一二 | + 一二三12 | + +taos> select SUBSTRING(var1 FROM sign(id) FOR 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substring(var1 from sign(id) for 20) | +======================================= + 一二三四五六七八九十 | + prision | + prision | + abc一二三abc一二三abc | + 一二三123321三二一 | + +taos> select SUBSTRING(nch1, 2, id) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substring(nch1, 2, id) | +================================= + 二 | + ris | + 二三四五六七八 | + rision | + bc一二三abc一二三a | + +taos> select SUBSTRING(nch1 FROM 2 FOR id) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substring(nch1 from 2 for id) | +================================= + 二 | + ris | + 二三四五六七八 | + rision | + bc一二三abc一二三a | + +taos> select SUBSTRING(var1, 2, id) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substring(var1, 2, id) | +================================= + 二三四五 | + rision | + rision | + bc一二三abc一二三a | + 二三123321三二一 | + +taos> select SUBSTRING(var1 FROM 2 FOR id) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substring(var1 from 2 for id) | +================================= + 二三四五 | + rision | + rision | + bc一二三abc一二三a | + 二三123321三二一 | + +taos> select SUBSTR('Hello.World!', 1) + substr('Hello.World!', 1) | +============================ + Hello.World! | + +taos> select SUBSTR('Hello.World!', 1, 5) + substr('Hello.World!', 1, 5) | +=============================== + Hello | + +taos> select SUBSTR('Hello.World!', 1, 20) + substr('Hello.World!', 1, 20) | +================================ + Hello.World! | + +taos> select SUBSTR('Hello.World!' FROM 1) + substr('Hello.World!' from 1) | +================================ + Hello.World! | + +taos> select SUBSTR('Hello.World!' FROM 1 FOR 5) + substr('Hello.World!' from 1 for 5) | +====================================== + Hello | + +taos> select SUBSTR('Hello.World!' FROM 1 FOR 20) + substr('Hello.World!' from 1 for 20) | +======================================= + Hello.World! | + +taos> select SUBSTR('Hello.World!', -6) + substr('Hello.World!', -6) | +============================= + World! | + +taos> select SUBSTR('Hello.World!', -6, 5) + substr('Hello.World!', -6, 5) | +================================ + World | + +taos> select SUBSTR('Hello.World!', -6, 20) + substr('Hello.World!', -6, 20) | +================================= + World! | + +taos> select SUBSTR('Hello.World!' FROM -6) + substr('Hello.World!' from -6) | +================================= + World! | + +taos> select SUBSTR('Hello.World!' FROM -6 FOR 5) + substr('Hello.World!' from -6 for 5) | +======================================= + World | + +taos> select SUBSTR('Hello.World!' FROM -6 FOR 20) + substr('Hello.World!' from -6 for 20) | +======================================== + World! | + +taos> select SUBSTR('北京涛思数据科技有限公司,tdengine.', 1) + substr('北京涛思数据科技有限公司,tdengine.', 1) | +================================================================ + 北京涛思数据科技有限公司,tdengine. | + +taos> select SUBSTR('北京涛思数据科技有限公司,tdengine.', 1, 5) + substr('北京涛思数据科技有限公司,tdengine.', 1, 5) | +=================================================================== + 北京涛思数 | + +taos> select SUBSTR('北京涛思数据科技有限公司,tdengine.', 1, 20) + substr('北京涛思数据科技有限公司,tdengine.', 1, 20 | +=================================================================== + 北京涛思数据科技有限公司,tdengin | + +taos> select SUBSTR('北京涛思数据科技有限公司,tdengine.' FROM 1) + substr('北京涛思数据科技有限公司,tdengine.' from 1 | +=================================================================== + 北京涛思数据科技有限公司,tdengine. | + +taos> select SUBSTR('北京涛思数据科技有限公司,tdengine.' FROM 1 FOR 5) + substr('北京涛思数据科技有限公司,tdengine.' from 1 | +=================================================================== + 北京涛思数 | + +taos> select SUBSTR('北京涛思数据科技有限公司,tdengine.' FROM 1 FOR 20) + substr('北京涛思数据科技有限公司,tdengine.' from 1 | +=================================================================== + 北京涛思数据科技有限公司,tdengin | + +taos> select SUBSTR('北京涛思数据科技有限公司,tdengine.', -6) + substr('北京涛思数据科技有限公司,tdengine.', -6) | +================================================================= + ngine. | + +taos> select SUBSTR('北京涛思数据科技有限公司,tdengine.', -6, 5) + substr('北京涛思数据科技有限公司,tdengine.', -6, 5 | +=================================================================== + ngine | + +taos> select SUBSTR('北京涛思数据科技有限公司,tdengine.', -6, 20) + substr('北京涛思数据科技有限公司,tdengine.', -6, 2 | +=================================================================== + ngine. | + +taos> select SUBSTR('北京涛思数据科技有限公司,tdengine.' FROM -6) + substr('北京涛思数据科技有限公司,tdengine.' from - | +=================================================================== + ngine. | + +taos> select SUBSTR('北京涛思数据科技有限公司,tdengine.' FROM -6 FOR 5) + substr('北京涛思数据科技有限公司,tdengine.' from - | +=================================================================== + ngine | + +taos> select SUBSTR('北京涛思数据科技有限公司,tdengine.' FROM -6 FOR 20) + substr('北京涛思数据科技有限公司,tdengine.' from - | +=================================================================== + ngine. | + +taos> select SUBSTR(nch1, 1) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substr(nch1, 1) | +================================= + 一二三四五六七八九十 | + prision | + 一二三四五六七八九十 | + prision | + abc一二三abc一二三abc | + +taos> select SUBSTR(nch1, 1, 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substr(nch1, 1, 5) | +================================= + 一二三四五 | + prisi | + 一二三四五 | + prisi | + abc一二 | + +taos> select SUBSTR(nch1, 1, 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substr(nch1, 1, 20) | +================================= + 一二三四五六七八九十 | + prision | + 一二三四五六七八九十 | + prision | + abc一二三abc一二三abc | + +taos> select SUBSTR(nch1 FROM 1) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substr(nch1 from 1) | +================================= + 一二三四五六七八九十 | + prision | + 一二三四五六七八九十 | + prision | + abc一二三abc一二三abc | + +taos> select SUBSTR(nch1 FROM 1 FOR 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substr(nch1 from 1 for 5) | +================================= + 一二三四五 | + prisi | + 一二三四五 | + prisi | + abc一二 | + +taos> select SUBSTR(nch1 FROM 1 FOR 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substr(nch1 from 1 for 20) | +================================= + 一二三四五六七八九十 | + prision | + 一二三四五六七八九十 | + prision | + abc一二三abc一二三abc | + +taos> select SUBSTR(nch1, -6) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substr(nch1, -6) | +================================= + 五六七八九十 | + rision | + 五六七八九十 | + rision | + 一二三abc | + +taos> select SUBSTR(nch1, -6, 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substr(nch1, -6, 5) | +================================= + 五六七八九 | + risio | + 五六七八九 | + risio | + 一二三ab | + +taos> select SUBSTR(nch1, -6, 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substr(nch1, -6, 20) | +================================= + 五六七八九十 | + rision | + 五六七八九十 | + rision | + 一二三abc | + +taos> select SUBSTR(nch1 FROM -6) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substr(nch1 from -6) | +================================= + 五六七八九十 | + rision | + 五六七八九十 | + rision | + 一二三abc | + +taos> select SUBSTR(nch1 FROM -6 FOR 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substr(nch1 from -6 for 5) | +================================= + 五六七八九 | + risio | + 五六七八九 | + risio | + 一二三ab | + +taos> select SUBSTR(nch1 FROM -6 FOR 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substr(nch1 from -6 for 20) | +================================= + 五六七八九十 | + rision | + 五六七八九十 | + rision | + 一二三abc | + +taos> select SUBSTR(var1, 1) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substr(var1, 1) | +================================= + 一二三四五六七八九十 | + prision | + prision | + abc一二三abc一二三abc | + 一二三123321三二一 | + +taos> select SUBSTR(var1, 1, 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substr(var1, 1, 5) | +================================= + 一二三四五 | + prisi | + prisi | + abc一二 | + 一二三12 | + +taos> select SUBSTR(var1, 1, 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substr(var1, 1, 20) | +================================= + 一二三四五六七八九十 | + prision | + prision | + abc一二三abc一二三abc | + 一二三123321三二一 | + +taos> select SUBSTR(var1 FROM 1) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substr(var1 from 1) | +================================= + 一二三四五六七八九十 | + prision | + prision | + abc一二三abc一二三abc | + 一二三123321三二一 | + +taos> select SUBSTR(var1 FROM 1 FOR 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substr(var1 from 1 for 5) | +================================= + 一二三四五 | + prisi | + prisi | + abc一二 | + 一二三12 | + +taos> select SUBSTR(var1 FROM 1 FOR 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substr(var1 from 1 for 20) | +================================= + 一二三四五六七八九十 | + prision | + prision | + abc一二三abc一二三abc | + 一二三123321三二一 | + +taos> select SUBSTR(var1, -6) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substr(var1, -6) | +================================= + 五六七八九十 | + rision | + rision | + 一二三abc | + 321三二一 | + +taos> select SUBSTR(var1, -6, 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substr(var1, -6, 5) | +================================= + 五六七八九 | + risio | + risio | + 一二三ab | + 321三二 | + +taos> select SUBSTR(var1, -6, 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substr(var1, -6, 20) | +================================= + 五六七八九十 | + rision | + rision | + 一二三abc | + 321三二一 | + +taos> select SUBSTR(var1 FROM -6) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substr(var1 from -6) | +================================= + 五六七八九十 | + rision | + rision | + 一二三abc | + 321三二一 | + +taos> select SUBSTR(var1 FROM -6 FOR 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substr(var1 from -6 for 5) | +================================= + 五六七八九 | + risio | + risio | + 一二三ab | + 321三二 | + +taos> select SUBSTR(var1 FROM -6 FOR 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substr(var1 from -6 for 20) | +================================= + 五六七八九十 | + rision | + rision | + 一二三abc | + 321三二一 | + +taos> select SUBSTR(nch1, sign(id), 1) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substr(nch1, sign(id), 1) | +================================= + 一 | + p | + 一 | + p | + a | + +taos> select SUBSTR(nch1, sign(id), 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substr(nch1, sign(id), 5) | +================================= + 一二三四五 | + prisi | + 一二三四五 | + prisi | + abc一二 | + +taos> select SUBSTR(nch1, sign(id), 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substr(nch1, sign(id), 20) | +================================= + 一二三四五六七八九十 | + prision | + 一二三四五六七八九十 | + prision | + abc一二三abc一二三abc | + +taos> select SUBSTR(nch1 FROM sign(id)) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substr(nch1 from sign(id)) | +================================= + 一二三四五六七八九十 | + prision | + 一二三四五六七八九十 | + prision | + abc一二三abc一二三abc | + +taos> select SUBSTR(nch1 FROM sign(id) FOR 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substr(nch1 from sign(id) for 5) | +=================================== + 一二三四五 | + prisi | + 一二三四五 | + prisi | + abc一二 | + +taos> select SUBSTR(nch1 FROM sign(id) FOR 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substr(nch1 from sign(id) for 20) | +==================================== + 一二三四五六七八九十 | + prision | + 一二三四五六七八九十 | + prision | + abc一二三abc一二三abc | + +taos> select SUBSTR(var1, sign(id), 1) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substr(var1, sign(id), 1) | +================================= + 一 | + p | + p | + a | + 一 | + +taos> select SUBSTR(var1, sign(id), 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substr(var1, sign(id), 5) | +================================= + 一二三四五 | + prisi | + prisi | + abc一二 | + 一二三12 | + +taos> select SUBSTR(var1, sign(id), 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substr(var1, sign(id), 20) | +================================= + 一二三四五六七八九十 | + prision | + prision | + abc一二三abc一二三abc | + 一二三123321三二一 | + +taos> select SUBSTR(var1 FROM sign(id)) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substr(var1 from sign(id)) | +================================= + 一二三四五六七八九十 | + prision | + prision | + abc一二三abc一二三abc | + 一二三123321三二一 | + +taos> select SUBSTR(var1 FROM sign(id) FOR 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substr(var1 from sign(id) for 5) | +=================================== + 一二三四五 | + prisi | + prisi | + abc一二 | + 一二三12 | + +taos> select SUBSTR(var1 FROM sign(id) FOR 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substr(var1 from sign(id) for 20) | +==================================== + 一二三四五六七八九十 | + prision | + prision | + abc一二三abc一二三abc | + 一二三123321三二一 | + +taos> select SUBSTR(nch1, 2, id) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substr(nch1, 2, id) | +================================= + 二 | + ris | + 二三四五六七八 | + rision | + bc一二三abc一二三a | + +taos> select SUBSTR(nch1 FROM 2 FOR id) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 + substr(nch1 from 2 for id) | +================================= + 二 | + ris | + 二三四五六七八 | + rision | + bc一二三abc一二三a | + +taos> select SUBSTR(var1, 2, id) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substr(var1, 2, id) | +================================= + 二三四五 | + rision | + rision | + bc一二三abc一二三a | + 二三123321三二一 | + +taos> select SUBSTR(var1 FROM 2 FOR id) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 + substr(var1 from 2 for id) | +================================= + 二三四五 | + rision | + rision | + bc一二三abc一二三a | + 二三123321三二一 | + +taos> select substring('tdengine', 2) + substring('tdengine', 2) | +=========================== + dengine | + +taos> select substring('tdengine', 8) + substring('tdengine', 8) | +=========================== + e | + +taos> select substring('tdengine', 1, 3) + substring('tdengine', 1, 3) | +============================== + tde | + +taos> select substring('tdengine', 2, 99) + substring('tdengine', 2, 99) | +=============================== + dengine | + +taos> select substring('tdengine', -1, 10) + substring('tdengine', -1, 10) | +================================ + e | + +taos> select substring('中国', 1, 3) + substring('中国', 1, 3) | +============================ + 中国 | + +taos> select substring('中国tdengine', 1, 3) + substring('中国tdengine', 1, 3) | +==================================== + 中国t | + +taos> select substring(var1, 1, 5) from ts_4893.d0 order by ts limit 10 + substring(var1, 1, 5) | +================================= + novel | + perso | + novel | + plate | + 一二三四五 | + updat | + prisi | + perso | + prisi | + plate | + +taos> select substring(var1, 1, 5) from ts_4893.meters order by ts limit 10 + substring(var1, 1, 5) | +================================= + novel | + perso | + novel | + plate | + 一二三四五 | + updat | + prisi | + perso | + prisi | + plate | + +taos> select substring(nch1, 1, 5) from ts_4893.d0 order by ts limit 10 + substring(nch1, 1, 5) | +================================= + novel | + 一二三四五 | + updat | + prisi | + novel | + novel | + again | + 一二三四五 | + novel | + again | + +taos> select substring(nch1, 1, 5) from ts_4893.meters order by ts limit 10 + substring(nch1, 1, 5) | +================================= + novel | + 一二三四五 | + updat | + prisi | + novel | + novel | + again | + 一二三四五 | + novel | + again | + +taos> select substring(null, 1, 3) + substring(null, 1, 3) | +======================== + NULL | + +taos> select substring('tdengine', null, 3) + substring('tdengine', null, 3) | +================================= + NULL | + +taos> select substring('tdengine', 0) + substring('tdengine', 0) | +=========================== + | + +taos> select substring('tdengine', 10) + substring('tdengine', 10) | +============================ + | + +taos> select substring('tdengine', 1, null) + substring('tdengine', 1, null) | +================================= + NULL | + +taos> select substring('tdengine', 1, 0) + substring('tdengine', 1, 0) | +============================== + | + +taos> select substring('tdengine', 1, -1) + substring('tdengine', 1, -1) | +=============================== + | + +taos> select substr(null, 1, 3) + substr(null, 1, 3) | +===================== + NULL | + +taos> select substr('Hello', 1, 3) + substr('Hello', 1, 3) | +======================== + Hel | + +taos> select substr('', 1, 5) + substr('', 1, 5) | +=================== + | + +taos> select substr('ABCDE', 0, 3) + substr('ABCDE', 0, 3) | +======================== + | + +taos> select substr('ABCDEFG', -3, 2) + substr('ABCDEFG', -3, 2) | +=========================== + EF | + +taos> select substr('HelloWorld', 2, 5) + substr('HelloWorld', 2, 5) | +============================= + elloW | + +taos> select substr('1234567890', -5, 5) + substr('1234567890', -5, 5) | +============================== + 67890 | + +taos> select substr('!@#$%^&*()', 2, 4) + substr('!@#$%^&*()', 2, 4) | +============================= + @#$% | + +taos> select substr('你好世界', 3, 2) + substr('你好世界', 3, 2) | +=============================== + 世界 | + +taos> select substr('ABCDEFG', 10, 5) + substr('ABCDEFG', 10, 5) | +=========================== + | + +taos> select substr('ABCDEFG', -1, 3) + substr('ABCDEFG', -1, 3) | +=========================== + G | + +taos> select substr('1234567890', -15, 5) + substr('1234567890', -15, 5) | +=============================== + 12345 | + +taos> select substr(concat('Hello', 'World'), 1, 5) + substr(concat('Hello', 'World'), 1, 5) | +========================================= + Hello | + +taos> select substr('HelloWorld', 1, length('Hello')) + substr('HelloWorld', 1, length('Hello')) | +=========================================== + Hello | + +taos> select substr(upper('helloworld'), 2, 4) + substr(upper('helloworld'), 2, 4) | +==================================== + ELLO | + +taos> select substr(trim(' HelloWorld '), 1, 5) + substr(trim(' HelloWorld '), 1, 5) | +======================================= + Hello | + +taos> select name, substr(name, 1, 3) from ts_4893.meters limit 1 + name | substr(name, 1, 3) | +================================================================== + lili | lil | + +taos> select var1, substr(var1, 1, 6) from ts_4893.meters limit 1 + var1 | substr(var1, 1, 6) | +================================================================== + novel | novel | + +taos> select nch1, substr(nch1, 2, 4) from ts_4893.meters limit 1 + nch1 | substr(nch1, 2, 4) | +================================================================== + novel | ovel | + diff --git a/tests/army/query/function/ans/substr_idx.csv b/tests/army/query/function/ans/substr_idx.csv index ff64b770c4..ac0a1ef274 100644 --- a/tests/army/query/function/ans/substr_idx.csv +++ b/tests/army/query/function/ans/substr_idx.csv @@ -1,295 +1,798 @@ -1abcd;2abcd -3abcd;4abcd -www. -data.com -www -com -taosdata.com -www.taosdata.com -www.taosdata.com -www.taosdata.com -www.taosdata.com -www.taosdata.com -www.taosdata.com -www.taosdata.com -www.taosdata.com -taosdata.com -.taosdata.com -aa -aaaa -aaaaaa -aaaaaaaaa1 -aaa -aaaaaa -aaaaaaaaa1 -aaaa -aaaaaaaaa -1 -1 -aa1 -aaaa1 -aaaaaa1 -aaaaaaaaa1 -1 -aaa1 -aaaaaa1 -aaaaaaaaa1 -the hill - the hill - the hill -hill - the hill -hill -the hill - the hill -the the hill -of the the hill -.the hill -the.the hill - hill -"the king of " -"the king of the " -nov -a -一二三a -一二三 -p -novel -一二三四五六七八九十 -update -prision -novel -novel -c一二三abc -一二三abc -一二三四五六七八九十 -person -novel -一二三四五六七八九十 -update -prision -novel -nov -plat -一二三 -ab -一二三a -person -novel -一二三四五六七八九十 -update -prision -novel -plate -一二三abc -一二三123321三二一 -一二三abc -person -novel -一二三四五六七八九十 -update -prision -nov -nov -ab -g -一二三 -一二三四五六七八九十 -update -prision -novel -novel -novel -novel -一二三abc -一二三123321三二一 -一二三abc -一二三四五六七八九十 -update -prision -novel -novel -一二 -a -nov -up -p -novel -person -novel -plate -一二三四五六七八九十 -一二三abc -c一二三abc -bc一二三abc -novel -update -novel -person -novel -plate -一二三四五六七八九十 -a一二三a一二三bbc -a一二三a一二三bb -a -a -a一二三a一二三bb -p -fp -二三bbcfp -bbcfp -fp -a一二三a一二三bbcfp -a一二三a一二三bbcfp -a一二三a一二三bbcfp -a一二三a一二三bbcfp -a一二三a一二三bbcfp -a一二 -a一二三a一二三 -a一二三a一二三 -a一二三a一二三 -a -一二三bbcfp -cfp -cfp -cfp -二三bbcfp -a一二三a一二三bbcfp -a一二三a一二三bbcfp -a一二三a一二三bbcfp -a一二三a一二三bbcfp -a一二三a一二三bbcfp -一二三 -一二三 -一二三 -一二三 -一二三 -321三二一 -321三二一 -321三二一 -321三二一 -321三二一 -一二三123321三二一 -一二三123321三二一 -一二三123321三二一 -一二三123321三二一 -一二三123321三二一 -一二三 -一二三 -一二三 -一二三 -一二三 -321三二一 -321三二一 -321三二一 -321三二一 -321三二一 -一二三123321三二一 -一二三123321三二一 -一二三123321三二一 -一二三123321三二一 -一二三123321三二一 -www.taosdata -taosdata.com -中国.科学 -北京。涛思 -novel -一二三四五六七八九十 -update -prision -novel -novel -ag -一二三四五六七八九十 -novel -ag -novel -一二三四五六七八九十 -update -prision -novel -novel -ag -一二三四五六七八九十 -novel -ag -novel -一二三四五六七八九十 -update -prision -novel -novel -again -一二三四五六七八九十 -novel -again -novel -一二三四五六七八九十 -update -prision -novel -novel -again -一二三四五六七八九十 -novel -again -novel -一二三四五六七八九十 -update -prision -novel -novel -again -一二三四五六七八九十 -novel -again -novel -一二三四五六七八九十 -update -prision -novel -novel -again -一二三四五六七八九十 -novel -again -novel -person -novel -plate -一二三四五六七八九十 -update -prision -person -prision -plate -novel -person -novel -plate -一二三四五六七八九十 -update -prision -person -prision -plate -novel -person -novel -plate -一二三四五六七八九十 -update -prision -person -prision -plate -novel -person -novel -plate -一二三四五六七八九十 -update -prision -person -prision -plate + +taos> select substring_index("1abcd;2abcd;3abcd;4abcd", ';', 2) + substring_index("1abcd;2abcd;3abcd;4abcd", ';', 2) | +===================================================== + 1abcd;2abcd | + +taos> select substring_index("1abcd;2abcd;3abcd;4abcd", ';', -2) + substring_index("1abcd;2abcd;3abcd;4abcd", ';', -2) | +====================================================== + 3abcd;4abcd | + +taos> select substring_index('www.taosdata.com','taos',1) + substring_index('www.taosdata.com','taos',1) | +=============================================== + www. | + +taos> select substring_index('www.taosdata.com','taos',-1) + substring_index('www.taosdata.com','taos',-1) | +================================================ + data.com | + +taos> SELECT SUBSTRING_INDEX('www.taosdata.com', '.', 1) + substring_index('www.taosdata.com', '.', 1) | +============================================== + www | + +taos> SELECT SUBSTRING_INDEX('www.taosdata.com', '.', -1) + substring_index('www.taosdata.com', '.', -1) | +=============================================== + com | + +taos> select substring_index('www.taosdata.com','.',-2) + substring_index('www.taosdata.com','.',-2) | +============================================= + taosdata.com | + +taos> SELECT SUBSTRING_INDEX('www.taosdata.com', '.', 100) + substring_index('www.taosdata.com', '.', 100) | +================================================ + www.taosdata.com | + +taos> SELECT SUBSTRING_INDEX('www.taosdata.com', '.', -100) + substring_index('www.taosdata.com', '.', -100) | +================================================= + www.taosdata.com | + +taos> SELECT SUBSTRING_INDEX('www.taosdata.com', '.', 2147483647) + substring_index('www.taosdata.com', '.', 2147483647) | +======================================================= + www.taosdata.com | + +taos> SELECT SUBSTRING_INDEX('www.taosdata.com', '.', -2147483647) + substring_index('www.taosdata.com', '.', -2147483647) | +======================================================== + www.taosdata.com | + +taos> SELECT SUBSTRING_INDEX('www.taosdata.com', '.', 2147483648) + substring_index('www.taosdata.com', '.', 2147483648) | +======================================================= + www.taosdata.com | + +taos> SELECT SUBSTRING_INDEX('www.taosdata.com', '.', -2147483648) + substring_index('www.taosdata.com', '.', -2147483648) | +======================================================== + www.taosdata.com | + +taos> SELECT SUBSTRING_INDEX('www.taosdata.com', '.', 2147483649) + substring_index('www.taosdata.com', '.', 2147483649) | +======================================================= + www.taosdata.com | + +taos> SELECT SUBSTRING_INDEX('www.taosdata.com', '.', -2147483649) + substring_index('www.taosdata.com', '.', -2147483649) | +======================================================== + www.taosdata.com | + +taos> select substring_index('.taosdata.com','.',-2) + substring_index('.taosdata.com','.',-2) | +========================================== + taosdata.com | + +taos> select substring_index('.taosdata.com','.tcx',-1) + substring_index('.taosdata.com','.tcx',-1) | +============================================= + .taosdata.com | + +taos> select substring_index('aaaaaaaaa1','aa',2) + substring_index('aaaaaaaaa1','aa',2) | +======================================= + aa | + +taos> select substring_index('aaaaaaaaa1','aa',3) + substring_index('aaaaaaaaa1','aa',3) | +======================================= + aaaa | + +taos> select substring_index('aaaaaaaaa1','aa',4) + substring_index('aaaaaaaaa1','aa',4) | +======================================= + aaaaaa | + +taos> select substring_index('aaaaaaaaa1','aa',5) + substring_index('aaaaaaaaa1','aa',5) | +======================================= + aaaaaaaaa1 | + +taos> select substring_index('aaaaaaaaa1','aaa',2) + substring_index('aaaaaaaaa1','aaa',2) | +======================================== + aaa | + +taos> select substring_index('aaaaaaaaa1','aaa',3) + substring_index('aaaaaaaaa1','aaa',3) | +======================================== + aaaaaa | + +taos> select substring_index('aaaaaaaaa1','aaa',4) + substring_index('aaaaaaaaa1','aaa',4) | +======================================== + aaaaaaaaa1 | + +taos> select substring_index('aaaaaaaaa1','aaaa',2) + substring_index('aaaaaaaaa1','aaaa',2) | +========================================= + aaaa | + +taos> select substring_index('aaaaaaaaa1','1',1) + substring_index('aaaaaaaaa1','1',1) | +====================================== + aaaaaaaaa | + +taos> select substring_index('aaaaaaaaa1','a',-1) + substring_index('aaaaaaaaa1','a',-1) | +======================================= + 1 | + +taos> select substring_index('aaaaaaaaa1','aa',-1) + substring_index('aaaaaaaaa1','aa',-1) | +======================================== + 1 | + +taos> select substring_index('aaaaaaaaa1','aa',-2) + substring_index('aaaaaaaaa1','aa',-2) | +======================================== + aa1 | + +taos> select substring_index('aaaaaaaaa1','aa',-3) + substring_index('aaaaaaaaa1','aa',-3) | +======================================== + aaaa1 | + +taos> select substring_index('aaaaaaaaa1','aa',-4) + substring_index('aaaaaaaaa1','aa',-4) | +======================================== + aaaaaa1 | + +taos> select substring_index('aaaaaaaaa1','aa',-5) + substring_index('aaaaaaaaa1','aa',-5) | +======================================== + aaaaaaaaa1 | + +taos> select substring_index('aaaaaaaaa1','aaa',-1) + substring_index('aaaaaaaaa1','aaa',-1) | +========================================= + 1 | + +taos> select substring_index('aaaaaaaaa1','aaa',-2) + substring_index('aaaaaaaaa1','aaa',-2) | +========================================= + aaa1 | + +taos> select substring_index('aaaaaaaaa1','aaa',-3) + substring_index('aaaaaaaaa1','aaa',-3) | +========================================= + aaaaaa1 | + +taos> select substring_index('aaaaaaaaa1','aaa',-4) + substring_index('aaaaaaaaa1','aaa',-4) | +========================================= + aaaaaaaaa1 | + +taos> select substring_index('the king of thethe hill','the',-2) + substring_index('the king of thethe hill','the',-2) | +====================================================== + the hill | + +taos> select substring_index('the king of the the hill','the',-2) + substring_index('the king of the the hill','the',-2) | +======================================================= + the hill | + +taos> select substring_index('the king of the the hill','the',-2) + substring_index('the king of the the hill','the',-2) | +======================================================== + the hill | + +taos> select substring_index('the king of the the hill',' the ',-1) + substring_index('the king of the the hill',' the ',-1) | +========================================================== + hill | + +taos> select substring_index('the king of the the hill',' the ',-2) + substring_index('the king of the the hill',' the ',-2) | +========================================================== + the hill | + +taos> select substring_index('the king of the the hill',' ',-1) + substring_index('the king of the the hill',' ',-1) | +====================================================== + hill | + +taos> select substring_index('the king of the the hill',' ',-2) + substring_index('the king of the the hill',' ',-2) | +====================================================== + the hill | + +taos> select substring_index('the king of the the hill',' ',-3) + substring_index('the king of the the hill',' ',-3) | +====================================================== + the hill | + +taos> select substring_index('the king of the the hill',' ',-4) + substring_index('the king of the the hill',' ',-4) | +====================================================== + the the hill | + +taos> select substring_index('the king of the the hill',' ',-5) + substring_index('the king of the the hill',' ',-5) | +====================================================== + of the the hill | + +taos> select substring_index('the king of the.the hill','the',-2) + substring_index('the king of the.the hill','the',-2) | +======================================================= + .the hill | + +taos> select substring_index('the king of thethethe.the hill','the',-3) + substring_index('the king of thethethe.the hill','the',-3) | +============================================================= + the.the hill | + +taos> select substring_index('the king of thethethe.the hill','the',-1) + substring_index('the king of thethethe.the hill','the',-1) | +============================================================= + hill | + +taos> select substring_index('the king of the the hill','the',2) + substring_index('the king of the the hill','the',2) | +====================================================== + the king of | + +taos> select substring_index('the king of the the hill','the',3) + substring_index('the king of the the hill','the',3) | +====================================================== + the king of the | + +taos> select substring_index(nch1, nch2, 1) from ts_4893.meters where position(nch2 in nch1) > 1 order by ts limit 5 + substring_index(nch1, nch2, 1) | +================================= + nov | + a | + 一二三a | + 一二三 | + p | + +taos> select substring_index(nch1, nch2, 1) from ts_4893.meters where position(nch2 in nch1) = 0 order by ts limit 5 + substring_index(nch1, nch2, 1) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novel | + +taos> select substring_index(nch1, nch2, -2) from ts_4893.meters where position(nch2 in nch1) != 0 order by ts limit 5 + substring_index(nch1, nch2, -2) | +================================== + novel | + c一二三abc | + 一二三abc | + 一二三四五六七八九十 | + person | + +taos> select substring_index(nch1, nch2, -2) from ts_4893.meters where position(nch2 in nch1) = 0 order by ts limit 5 + substring_index(nch1, nch2, -2) | +================================== + novel | + 一二三四五六七八九十 | + update | + prision | + novel | + +taos> select substring_index(var1, var2, 1) from ts_4893.meters where position(var2 in var1) > 1 order by ts limit 5 + substring_index(var1, var2, 1) | +================================= + nov | + plat | + 一二三 | + ab | + 一二三a | + +taos> select substring_index(var1, var2, 1) from ts_4893.meters where position(var2 in var1) = 0 order by ts limit 5 + substring_index(var1, var2, 1) | +================================= + person | + novel | + 一二三四五六七八九十 | + update | + prision | + +taos> select substring_index(var1, var2, -2) from ts_4893.meters where position(var2 in var1) != 0 order by ts limit 5 + substring_index(var1, var2, -2) | +================================== + novel | + plate | + 一二三abc | + 一二三123321三二一 | + 一二三abc | + +taos> select substring_index(var1, var2, -2) from ts_4893.meters where position(var2 in var1) = 0 order by ts limit 5 + substring_index(var1, var2, -2) | +================================== + person | + novel | + 一二三四五六七八九十 | + update | + prision | + +taos> select substring_index(nch1, var2, 1) from ts_4893.meters where position(var2 in nch1) > 1 order by ts limit 5 + substring_index(nch1, var2, 1) | +================================= + nov | + nov | + ab | + g | + 一二三 | + +taos> select substring_index(nch1, var2, 1) from ts_4893.meters where position(var2 in nch1) = 0 order by ts limit 5 + substring_index(nch1, var2, 1) | +================================= + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + +taos> select substring_index(nch1, var2, -2) from ts_4893.meters where position(var2 in nch1) != 0 order by ts limit 5 + substring_index(nch1, var2, -2) | +================================== + novel | + novel | + 一二三abc | + 一二三123321三二一 | + 一二三abc | + +taos> select substring_index(nch1, var2, -2) from ts_4893.meters where position(var2 in nch1) = 0 order by ts limit 5 + substring_index(nch1, var2, -2) | +================================== + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + +taos> select substring_index(var1, nch2, 1) from ts_4893.meters where position(nch2 in var1) > 1 order by ts limit 5 + substring_index(var1, nch2, 1) | +================================= + 一二 | + a | + nov | + up | + p | + +taos> select substring_index(var1, nch2, 1) from ts_4893.meters where position(nch2 in var1) = 0 order by ts limit 5 + substring_index(var1, nch2, 1) | +================================= + novel | + person | + novel | + plate | + 一二三四五六七八九十 | + +taos> select substring_index(var1, nch2, -2) from ts_4893.meters where position(nch2 in var1) != 0 order by ts limit 5 + substring_index(var1, nch2, -2) | +================================== + 一二三abc | + c一二三abc | + bc一二三abc | + novel | + update | + +taos> select substring_index(var1, nch2, -2) from ts_4893.meters where position(nch2 in var1) = 0 order by ts limit 5 + substring_index(var1, nch2, -2) | +================================== + novel | + person | + novel | + plate | + 一二三四五六七八九十 | + +taos> select substring_index('a一二三a一二三bbcfp', nch2, 1) from ts_4893.meters where position(nch2 in 'a一二三a一二三bbcfp') > 1 order by ts limit 5 + substring_index('a一二三a一二三bbcfp', nch2, 1) | +======================================================== + a一二三a一二三bbc | + a一二三a一二三bb | + a | + a | + a一二三a一二三bb | + +taos> select substring_index('a一二三a一二三bbcfp', nch2, -1) from ts_4893.meters where position(nch2 in 'a一二三a一二三bbcfp') > 1 order by ts limit 5 + substring_index('a一二三a一二三bbcfp', nch2, -1) | +========================================================= + p | + fp | + 二三bbcfp | + bbcfp | + fp | + +taos> select substring_index('a一二三a一二三bbcfp', nch2, cast(id + 1 as int)) from ts_4893.meters where position(nch2 in 'a一二三a一二三bbcfp') = 0 order by ts limit 5 + substring_index('a一二三a一二三bbcfp', nch2, cast(id + 1 a | +=================================================================== + a一二三a一二三bbcfp | + a一二三a一二三bbcfp | + a一二三a一二三bbcfp | + a一二三a一二三bbcfp | + a一二三a一二三bbcfp | + +taos> select substring_index('a一二三a一二三bbcfp', var2, 1) from ts_4893.meters where position(var2 in 'a一二三a一二三bbcfp') > 1 order by ts limit 5 + substring_index('a一二三a一二三bbcfp', var2, 1) | +======================================================== + a一二 | + a一二三a一二三 | + a一二三a一二三 | + a一二三a一二三 | + a | + +taos> select substring_index('a一二三a一二三bbcfp', var2, -1) from ts_4893.meters where position(var2 in 'a一二三a一二三bbcfp') > 1 order by ts limit 5 + substring_index('a一二三a一二三bbcfp', var2, -1) | +========================================================= + 一二三bbcfp | + cfp | + cfp | + cfp | + 二三bbcfp | + +taos> select substring_index('a一二三a一二三bbcfp', var2, cast(id + 1 as int)) from ts_4893.meters where position(var2 in 'a一二三a一二三bbcfp') = 0 order by ts limit 5 + substring_index('a一二三a一二三bbcfp', var2, cast(id + 1 a | +=================================================================== + a一二三a一二三bbcfp | + a一二三a一二三bbcfp | + a一二三a一二三bbcfp | + a一二三a一二三bbcfp | + a一二三a一二三bbcfp | + +taos> select substring_index(nch1, '123', 1) from ts_4893.meters where position('123' in nch1) > 1 order by ts limit 5 + substring_index(nch1, '123', 1) | +================================== + 一二三 | + 一二三 | + 一二三 | + 一二三 | + 一二三 | + +taos> select substring_index(nch1, '123', -1) from ts_4893.meters where position('123' in nch1) > 1 order by ts limit 5 + substring_index(nch1, '123', -1) | +=================================== + 321三二一 | + 321三二一 | + 321三二一 | + 321三二一 | + 321三二一 | + +taos> select substring_index(nch1, '123', id) from ts_4893.meters where position('123' in nch1) > 1 order by ts limit 5 + substring_index(nch1, '123', id) | +=================================== + 一二三123321三二一 | + 一二三123321三二一 | + 一二三123321三二一 | + 一二三123321三二一 | + 一二三123321三二一 | + +taos> select substring_index(var1, '123', 1) from ts_4893.meters where position('123' in var1) > 1 order by ts limit 5 + substring_index(var1, '123', 1) | +================================== + 一二三 | + 一二三 | + 一二三 | + 一二三 | + 一二三 | + +taos> select substring_index(var1, '123', -1) from ts_4893.meters where position('123' in var1) > 1 order by ts limit 5 + substring_index(var1, '123', -1) | +=================================== + 321三二一 | + 321三二一 | + 321三二一 | + 321三二一 | + 321三二一 | + +taos> select substring_index(var1, '123', id) from ts_4893.meters where position('123' in var1) > 1 order by ts limit 5 + substring_index(var1, '123', id) | +=================================== + 一二三123321三二一 | + 一二三123321三二一 | + 一二三123321三二一 | + 一二三123321三二一 | + 一二三123321三二一 | + +taos> select substring_index('www.taosdata.com', '.', 2) + substring_index('www.taosdata.com', '.', 2) | +============================================== + www.taosdata | + +taos> select substring_index('www.taosdata.com', '.', -2) + substring_index('www.taosdata.com', '.', -2) | +=============================================== + taosdata.com | + +taos> select substring_index('中国.科学.www.taosdata.com', '.', 2) + substring_index('中国.科学.www.taosdata.com', '.', 2) | +============================================================ + 中国.科学 | + +taos> select substring_index('北京。涛思。数据。科技', '。', 2) + substring_index('北京。涛思。数据。科技', '。', 2) | +================================================================= + 北京。涛思 | + +taos> select substring_index(nch1, 'a', 2) from ts_4893.d0 order by ts limit 10 + substring_index(nch1, 'a', 2) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + ag | + 一二三四五六七八九十 | + novel | + ag | + +taos> select substring_index(nch1, 'a', 2) from ts_4893.meters order by ts limit 10 + substring_index(nch1, 'a', 2) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + ag | + 一二三四五六七八九十 | + novel | + ag | + +taos> select substring_index(nch1, nch2, 2) from ts_4893.d0 order by ts limit 10 + substring_index(nch1, nch2, 2) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + again | + 一二三四五六七八九十 | + novel | + again | + +taos> select substring_index(nch1, nch2, 2) from ts_4893.meters order by ts limit 10 + substring_index(nch1, nch2, 2) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + again | + 一二三四五六七八九十 | + novel | + again | + +taos> select substring_index(nch1, var2, 2) from ts_4893.d0 order by ts limit 10 + substring_index(nch1, var2, 2) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + again | + 一二三四五六七八九十 | + novel | + again | + +taos> select substring_index(nch1, var2, 2) from ts_4893.meters order by ts limit 10 + substring_index(nch1, var2, 2) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + again | + 一二三四五六七八九十 | + novel | + again | + +taos> select substring_index(var1, nch2, 2) from ts_4893.d0 order by ts limit 10 + substring_index(var1, nch2, 2) | +================================= + novel | + person | + novel | + plate | + 一二三四五六七八九十 | + update | + prision | + person | + prision | + plate | + +taos> select substring_index(var1, nch2, 2) from ts_4893.meters order by ts limit 10 + substring_index(var1, nch2, 2) | +================================= + novel | + person | + novel | + plate | + 一二三四五六七八九十 | + update | + prision | + person | + prision | + plate | + +taos> select substring_index(var1, var2, 2) from ts_4893.d0 order by ts limit 10 + substring_index(var1, var2, 2) | +================================= + novel | + person | + novel | + plate | + 一二三四五六七八九十 | + update | + prision | + person | + prision | + plate | + +taos> select substring_index(var1, var2, 2) from ts_4893.meters order by ts limit 10 + substring_index(var1, var2, 2) | +================================= + novel | + person | + novel | + plate | + 一二三四五六七八九十 | + update | + prision | + person | + prision | + plate | + +taos> select substring_index(null, '.', 2) + substring_index(null, '.', 2) | +================================ + NULL | + +taos> select substring_index('www.taosdata.com', null, 2) + substring_index('www.taosdata.com', null, 2) | +=============================================== + NULL | + +taos> select substring_index('www.taosdata.com', '.', 0) + substring_index('www.taosdata.com', '.', 0) | +============================================== + | + +taos> select substring_index('www.taosdata.com', '.', null) + substring_index('www.taosdata.com', '.', null) | +================================================= + NULL | + +taos> select substring_index('a.b.c', '.', 1) + substring_index('a.b.c', '.', 1) | +=================================== + a | + +taos> select substring_index('a.b.c', '.', 2) + substring_index('a.b.c', '.', 2) | +=================================== + a.b | + +taos> select substring_index('a.b.c', '.', -1) + substring_index('a.b.c', '.', -1) | +==================================== + c | + +taos> select substring_index('', '.', 1) + substring_index('', '.', 1) | +============================== + | + +taos> select substring_index('apple.orange.banana', '.', 2) + substring_index('apple.orange.banana', '.', 2) | +================================================= + apple.orange | + +taos> select substring_index('192.168.1.1', '.', 3) + substring_index('192.168.1.1', '.', 3) | +========================================= + 192.168.1 | + +taos> select substring_index('abc@xyz.com', '.', 5) + substring_index('abc@xyz.com', '.', 5) | +========================================= + abc@xyz.com | + +taos> select substring_index('123456789', '.', 1) + substring_index('123456789', '.', 1) | +======================================= + 123456789 | + +taos> select substring_index('abcdef', ' ', 2) + substring_index('abcdef', ' ', 2) | +==================================== + abcdef | + +taos> select substring_index('ABCDEFG', '-', -1) + substring_index('ABCDEFG', '-', -1) | +====================================== + ABCDEFG | + +taos> select substring_index('apple', '.', -3) + substring_index('apple', '.', -3) | +==================================== + apple | + +taos> select substring_index(concat('apple', '.', 'orange', '.', 'banana'), '.', 2) + substring_index(concat('apple', '.', 'orange', '.', 'banana'), ' | +=================================================================== + apple.orange | + +taos> select substring_index('apple.orange.banana', '.', length('apple')) + substring_index('apple.orange.banana', '.', length('apple')) | +=============================================================== + apple.orange.banana | + +taos> select substring_index(upper('apple.orange.banana'), '.', 2) + substring_index(upper('apple.orange.banana'), '.', 2) | +======================================================== + APPLE.ORANGE | + +taos> select substring_index(trim(' apple.orange.banana '), '.', 2) + substring_index(trim(' apple.orange.banana '), '.', 2) | +=========================================================== + apple.orange | + +taos> select substring_index(concat('apple', '.', 'orange', '.', 'banana'), '.', 2) + substring_index(concat('apple', '.', 'orange', '.', 'banana'), ' | +=================================================================== + apple.orange | + +taos> select substring_index('apple.orange.banana', '.', length('apple')) + substring_index('apple.orange.banana', '.', length('apple')) | +=============================================================== + apple.orange.banana | + +taos> select substring_index(upper('apple.orange.banana'), '.', 2) + substring_index(upper('apple.orange.banana'), '.', 2) | +======================================================== + APPLE.ORANGE | + +taos> select substring_index(trim(' apple.orange.banana '), '.', 2) + substring_index(trim(' apple.orange.banana '), '.', 2) | +=========================================================== + apple.orange | + +taos> select name, substring_index(name, ' ', 1) from ts_4893.meters limit 1 + name | substring_index(name, ' ', 1) | +================================================================== + lili | lili | + +taos> select var1, substring_index(var1, '-', -1) from ts_4893.meters limit 1 + var1 | substring_index(var1, '-', -1) | +================================================================== + novel | novel | + +taos> select nch1, substring_index(nch1, ',', 3) from ts_4893.meters limit 1 + nch1 | substring_index(nch1, ',', 3) | +================================================================== + novel | novel | + diff --git a/tests/army/query/function/ans/timediff.csv b/tests/army/query/function/ans/timediff.csv index c819be1411..39de484454 100644 --- a/tests/army/query/function/ans/timediff.csv +++ b/tests/army/query/function/ans/timediff.csv @@ -1,334 +1,785 @@ --1000 -1000 --1 -1 --166666 -166666 --2777 -2777 --115 -115 --16 -16 --691207000 -691207000 --691207 -691207 --11520 -11520 --192 -192 --8 -8 --1 -1 --691200000 -691200000 --691200 -691200 --11520 -11520 --192 -192 --8 -8 --1 -1 --691200000 -691200000 --691200 -691200 --11520 -11520 --192 -192 --8 -8 --1 -1 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 --225095657000 --225092657000 --225089657000 --225086657000 --225083657000 --225080657000 --225077657000 --225074657000 --225071657000 --225068657000 -225095657000 -225092657000 -225089657000 -225086657000 -225083657000 -225080657000 -225077657000 -225074657000 -225071657000 -225068657000 --225095657 --225092657 --225089657 --225086657 --225083657 --225080657 --225077657 --225074657 --225071657 --225068657 -225095657 -225092657 -225089657 -225086657 -225083657 -225080657 -225077657 -225074657 -225071657 -225068657 --3751594 --3751544 --3751494 --3751444 --3751394 --3751344 --3751294 --3751244 --3751194 --3751144 -3751594 -3751544 -3751494 -3751444 -3751394 -3751344 -3751294 -3751244 -3751194 -3751144 --62526 --62525 --62524 --62524 --62523 --62522 --62521 --62520 --62519 --62519 -62526 -62525 -62524 -62524 -62523 -62522 -62521 -62520 -62519 -62519 --2605 --2605 --2605 --2605 --2605 --2605 --2605 --2605 --2604 --2604 -2605 -2605 -2605 -2605 -2605 -2605 -2605 -2605 -2604 -2604 --372 --372 --372 --372 --372 --372 --372 --372 --372 --372 -372 -372 -372 -372 -372 -372 -372 -372 -372 -372 --225095657000 --225092657000 --225089657000 --225086657000 --225083657000 --225080657000 --225077657000 --225074657000 --225071657000 --225068657000 -225095657000 -225092657000 -225089657000 -225086657000 -225083657000 -225080657000 -225077657000 -225074657000 -225071657000 -225068657000 --225095657 --225092657 --225089657 --225086657 --225083657 --225080657 --225077657 --225074657 --225071657 --225068657 -225095657 -225092657 -225089657 -225086657 -225083657 -225080657 -225077657 -225074657 -225071657 -225068657 --3751594 --3751544 --3751494 --3751444 --3751394 --3751344 --3751294 --3751244 --3751194 --3751144 -3751594 -3751544 -3751494 -3751444 -3751394 -3751344 -3751294 -3751244 -3751194 -3751144 --62526 --62525 --62524 --62524 --62523 --62522 --62521 --62520 --62519 --62519 -62526 -62525 -62524 -62524 -62523 -62522 -62521 -62520 -62519 -62519 --2605 --2605 --2605 --2605 --2605 --2605 --2605 --2605 --2604 --2604 -2605 -2605 -2605 -2605 -2605 -2605 -2605 -2605 -2604 -2604 --372 --372 --372 --372 --372 --372 --372 --372 --372 --372 -372 -372 -372 -372 -372 -372 -372 -372 -372 -372 --10 -31536000 -3000 -43200 -720 -30 -4 -2592000000 -2592000 -2592000 -60 -60 -79774389 --79774389 -79774389 --79774389 --220769589123 --220766589123 --220763589123 --220760589123 --220757589123 --220754589123 --220751589123 --220748589123 --220745589123 --220742589123 --220769589123 --220766589123 --220763589123 --220760589123 --220757589123 --220754589123 --220751589123 --220748589123 --220745589123 --220742589123 + +taos> select TIMEDIFF(1,2) + timediff(1,2) | +======================== + -1000 | + +taos> select TIMEDIFF(2,1) + timediff(2,1) | +======================== + 1000 | + +taos> select TIMEDIFF(1,2,1s) + timediff(1,2,1s) | +======================== + -1 | + +taos> select TIMEDIFF(2,1,1s) + timediff(2,1,1s) | +======================== + 1 | + +taos> select TIMEDIFF(1,10000000,1m) + timediff(1,10000000,1m) | +========================== + -166666 | + +taos> select TIMEDIFF(10000000,1,1m) + timediff(10000000,1,1m) | +========================== + 166666 | + +taos> select TIMEDIFF(1,10000000,1h) + timediff(1,10000000,1h) | +========================== + -2777 | + +taos> select TIMEDIFF(10000000,1,1h) + timediff(10000000,1,1h) | +========================== + 2777 | + +taos> select TIMEDIFF(1,10000000,1d) + timediff(1,10000000,1d) | +========================== + -115 | + +taos> select TIMEDIFF(10000000,1,1d) + timediff(10000000,1,1d) | +========================== + 115 | + +taos> select TIMEDIFF(1,10000000,1w) + timediff(1,10000000,1w) | +========================== + -16 | + +taos> select TIMEDIFF(10000000,1,1w) + timediff(10000000,1,1w) | +========================== + 16 | + +taos> select TIMEDIFF(1724404450,1725095657) + timediff(1724404450,1725095657) | +================================== + -691207000 | + +taos> select TIMEDIFF(1725095657,1724404450) + timediff(1725095657,1724404450) | +================================== + 691207000 | + +taos> select TIMEDIFF(1724404450,1725095657,1s) + timediff(1724404450,1725095657,1s) | +===================================== + -691207 | + +taos> select TIMEDIFF(1725095657,1724404450,1s) + timediff(1725095657,1724404450,1s) | +===================================== + 691207 | + +taos> select TIMEDIFF(1724404450,1725095657,1m) + timediff(1724404450,1725095657,1m) | +===================================== + -11520 | + +taos> select TIMEDIFF(1725095657,1724404450,1m) + timediff(1725095657,1724404450,1m) | +===================================== + 11520 | + +taos> select TIMEDIFF(1724404450,1725095657,1h) + timediff(1724404450,1725095657,1h) | +===================================== + -192 | + +taos> select TIMEDIFF(1725095657,1724404450,1h) + timediff(1725095657,1724404450,1h) | +===================================== + 192 | + +taos> select TIMEDIFF(1724404450,1725095657,1d) + timediff(1724404450,1725095657,1d) | +===================================== + -8 | + +taos> select TIMEDIFF(1725095657,1724404450,1d) + timediff(1725095657,1724404450,1d) | +===================================== + 8 | + +taos> select TIMEDIFF(1724404450,1725095657,1w) + timediff(1724404450,1725095657,1w) | +===================================== + -1 | + +taos> select TIMEDIFF(1725095657,1724404450,1w) + timediff(1725095657,1724404450,1w) | +===================================== + 1 | + +taos> select TIMEDIFF('2024-08-23 17:14:17', '2024-08-31 17:14:17') + timediff('2024-08-23 17:14:17', '2024-08-31 17:14:17') | +========================================================= + -691200000 | + +taos> select TIMEDIFF('2024-08-31 17:14:17', '2024-08-23 17:14:17') + timediff('2024-08-31 17:14:17', '2024-08-23 17:14:17') | +========================================================= + 691200000 | + +taos> select TIMEDIFF('2024-08-23 17:14:17', '2024-08-31 17:14:17', 1s) + timediff('2024-08-23 17:14:17', '2024-08-31 17:14:17', 1s) | +============================================================= + -691200 | + +taos> select TIMEDIFF('2024-08-31 17:14:17', '2024-08-23 17:14:17', 1s) + timediff('2024-08-31 17:14:17', '2024-08-23 17:14:17', 1s) | +============================================================= + 691200 | + +taos> select TIMEDIFF('2024-08-23 17:14:17', '2024-08-31 17:14:17', 1m) + timediff('2024-08-23 17:14:17', '2024-08-31 17:14:17', 1m) | +============================================================= + -11520 | + +taos> select TIMEDIFF('2024-08-31 17:14:17', '2024-08-23 17:14:17', 1m) + timediff('2024-08-31 17:14:17', '2024-08-23 17:14:17', 1m) | +============================================================= + 11520 | + +taos> select TIMEDIFF('2024-08-23 17:14:17', '2024-08-31 17:14:17', 1h) + timediff('2024-08-23 17:14:17', '2024-08-31 17:14:17', 1h) | +============================================================= + -192 | + +taos> select TIMEDIFF('2024-08-31 17:14:17', '2024-08-23 17:14:17', 1h) + timediff('2024-08-31 17:14:17', '2024-08-23 17:14:17', 1h) | +============================================================= + 192 | + +taos> select TIMEDIFF('2024-08-23 17:14:17', '2024-08-31 17:14:17', 1d) + timediff('2024-08-23 17:14:17', '2024-08-31 17:14:17', 1d) | +============================================================= + -8 | + +taos> select TIMEDIFF('2024-08-31 17:14:17', '2024-08-23 17:14:17', 1d) + timediff('2024-08-31 17:14:17', '2024-08-23 17:14:17', 1d) | +============================================================= + 8 | + +taos> select TIMEDIFF('2024-08-23 17:14:17', '2024-08-31 17:14:17', 1w) + timediff('2024-08-23 17:14:17', '2024-08-31 17:14:17', 1w) | +============================================================= + -1 | + +taos> select TIMEDIFF('2024-08-31 17:14:17', '2024-08-23 17:14:17', 1w) + timediff('2024-08-31 17:14:17', '2024-08-23 17:14:17', 1w) | +============================================================= + 1 | + +taos> select TIMEDIFF('2024-08-23 17:14:17', 1725095657) + timediff('2024-08-23 17:14:17', 1725095657) | +============================================== + -691200000 | + +taos> select TIMEDIFF(1725095657, '2024-08-23 17:14:17') + timediff(1725095657, '2024-08-23 17:14:17') | +============================================== + 691200000 | + +taos> select TIMEDIFF('2024-08-23 17:14:17', 1725095657, 1s) + timediff('2024-08-23 17:14:17', 1725095657, 1s) | +================================================== + -691200 | + +taos> select TIMEDIFF(1725095657, '2024-08-23 17:14:17', 1s) + timediff(1725095657, '2024-08-23 17:14:17', 1s) | +================================================== + 691200 | + +taos> select TIMEDIFF('2024-08-23 17:14:17', 1725095657, 1m) + timediff('2024-08-23 17:14:17', 1725095657, 1m) | +================================================== + -11520 | + +taos> select TIMEDIFF(1725095657, '2024-08-23 17:14:17', 1m) + timediff(1725095657, '2024-08-23 17:14:17', 1m) | +================================================== + 11520 | + +taos> select TIMEDIFF('2024-08-23 17:14:17', 1725095657, 1h) + timediff('2024-08-23 17:14:17', 1725095657, 1h) | +================================================== + -192 | + +taos> select TIMEDIFF(1725095657, '2024-08-23 17:14:17', 1h) + timediff(1725095657, '2024-08-23 17:14:17', 1h) | +================================================== + 192 | + +taos> select TIMEDIFF('2024-08-23 17:14:17', 1725095657, 1d) + timediff('2024-08-23 17:14:17', 1725095657, 1d) | +================================================== + -8 | + +taos> select TIMEDIFF(1725095657, '2024-08-23 17:14:17', 1d) + timediff(1725095657, '2024-08-23 17:14:17', 1d) | +================================================== + 8 | + +taos> select TIMEDIFF('2024-08-23 17:14:17', 1725095657, 1w) + timediff('2024-08-23 17:14:17', 1725095657, 1w) | +================================================== + -1 | + +taos> select TIMEDIFF(1725095657, '2024-08-23 17:14:17', 1w) + timediff(1725095657, '2024-08-23 17:14:17', 1w) | +================================================== + 1 | + +taos> select TIMEDIFF(ts, ts) from ts_4893.meters order by ts limit 10 + timediff(ts, ts) | +======================== + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + 0 | + +taos> select TIMEDIFF(ts, '2024-08-31 17:14:17') from ts_4893.meters order by ts limit 10 + timediff(ts, '2024-08-31 17:14:17') | +====================================== + -225095657000 | + -225092657000 | + -225089657000 | + -225086657000 | + -225083657000 | + -225080657000 | + -225077657000 | + -225074657000 | + -225071657000 | + -225068657000 | + +taos> select TIMEDIFF('2024-08-31 17:14:17', ts) from ts_4893.meters order by ts limit 10 + timediff('2024-08-31 17:14:17', ts) | +====================================== + 225095657000 | + 225092657000 | + 225089657000 | + 225086657000 | + 225083657000 | + 225080657000 | + 225077657000 | + 225074657000 | + 225071657000 | + 225068657000 | + +taos> select TIMEDIFF(ts, '2024-08-31 17:14:17', 1s) from ts_4893.meters order by ts limit 10 + timediff(ts, '2024-08-31 17:14:17', 1s) | +========================================== + -225095657 | + -225092657 | + -225089657 | + -225086657 | + -225083657 | + -225080657 | + -225077657 | + -225074657 | + -225071657 | + -225068657 | + +taos> select TIMEDIFF('2024-08-31 17:14:17', ts, 1s) from ts_4893.meters order by ts limit 10 + timediff('2024-08-31 17:14:17', ts, 1s) | +========================================== + 225095657 | + 225092657 | + 225089657 | + 225086657 | + 225083657 | + 225080657 | + 225077657 | + 225074657 | + 225071657 | + 225068657 | + +taos> select TIMEDIFF(ts, '2024-08-31 17:14:17', 1m) from ts_4893.meters order by ts limit 10 + timediff(ts, '2024-08-31 17:14:17', 1m) | +========================================== + -3751594 | + -3751544 | + -3751494 | + -3751444 | + -3751394 | + -3751344 | + -3751294 | + -3751244 | + -3751194 | + -3751144 | + +taos> select TIMEDIFF('2024-08-31 17:14:17', ts, 1m) from ts_4893.meters order by ts limit 10 + timediff('2024-08-31 17:14:17', ts, 1m) | +========================================== + 3751594 | + 3751544 | + 3751494 | + 3751444 | + 3751394 | + 3751344 | + 3751294 | + 3751244 | + 3751194 | + 3751144 | + +taos> select TIMEDIFF(ts, '2024-08-31 17:14:17', 1h) from ts_4893.meters order by ts limit 10 + timediff(ts, '2024-08-31 17:14:17', 1h) | +========================================== + -62526 | + -62525 | + -62524 | + -62524 | + -62523 | + -62522 | + -62521 | + -62520 | + -62519 | + -62519 | + +taos> select TIMEDIFF('2024-08-31 17:14:17', ts, 1h) from ts_4893.meters order by ts limit 10 + timediff('2024-08-31 17:14:17', ts, 1h) | +========================================== + 62526 | + 62525 | + 62524 | + 62524 | + 62523 | + 62522 | + 62521 | + 62520 | + 62519 | + 62519 | + +taos> select TIMEDIFF(ts, '2024-08-31 17:14:17', 1d) from ts_4893.meters order by ts limit 10 + timediff(ts, '2024-08-31 17:14:17', 1d) | +========================================== + -2605 | + -2605 | + -2605 | + -2605 | + -2605 | + -2605 | + -2605 | + -2605 | + -2604 | + -2604 | + +taos> select TIMEDIFF('2024-08-31 17:14:17', ts, 1d) from ts_4893.meters order by ts limit 10 + timediff('2024-08-31 17:14:17', ts, 1d) | +========================================== + 2605 | + 2605 | + 2605 | + 2605 | + 2605 | + 2605 | + 2605 | + 2605 | + 2604 | + 2604 | + +taos> select TIMEDIFF(ts, '2024-08-31 17:14:17', 1w) from ts_4893.meters order by ts limit 10 + timediff(ts, '2024-08-31 17:14:17', 1w) | +========================================== + -372 | + -372 | + -372 | + -372 | + -372 | + -372 | + -372 | + -372 | + -372 | + -372 | + +taos> select TIMEDIFF('2024-08-31 17:14:17', ts, 1w) from ts_4893.meters order by ts limit 10 + timediff('2024-08-31 17:14:17', ts, 1w) | +========================================== + 372 | + 372 | + 372 | + 372 | + 372 | + 372 | + 372 | + 372 | + 372 | + 372 | + +taos> select TIMEDIFF(ts, 1725095657) from ts_4893.meters order by ts limit 10 + timediff(ts, 1725095657) | +=========================== + -225095657000 | + -225092657000 | + -225089657000 | + -225086657000 | + -225083657000 | + -225080657000 | + -225077657000 | + -225074657000 | + -225071657000 | + -225068657000 | + +taos> select TIMEDIFF(1725095657, ts) from ts_4893.meters order by ts limit 10 + timediff(1725095657, ts) | +=========================== + 225095657000 | + 225092657000 | + 225089657000 | + 225086657000 | + 225083657000 | + 225080657000 | + 225077657000 | + 225074657000 | + 225071657000 | + 225068657000 | + +taos> select TIMEDIFF(ts, 1725095657, 1s) from ts_4893.meters order by ts limit 10 + timediff(ts, 1725095657, 1s) | +=============================== + -225095657 | + -225092657 | + -225089657 | + -225086657 | + -225083657 | + -225080657 | + -225077657 | + -225074657 | + -225071657 | + -225068657 | + +taos> select TIMEDIFF(1725095657, ts, 1s) from ts_4893.meters order by ts limit 10 + timediff(1725095657, ts, 1s) | +=============================== + 225095657 | + 225092657 | + 225089657 | + 225086657 | + 225083657 | + 225080657 | + 225077657 | + 225074657 | + 225071657 | + 225068657 | + +taos> select TIMEDIFF(ts, 1725095657, 1m) from ts_4893.meters order by ts limit 10 + timediff(ts, 1725095657, 1m) | +=============================== + -3751594 | + -3751544 | + -3751494 | + -3751444 | + -3751394 | + -3751344 | + -3751294 | + -3751244 | + -3751194 | + -3751144 | + +taos> select TIMEDIFF(1725095657, ts, 1m) from ts_4893.meters order by ts limit 10 + timediff(1725095657, ts, 1m) | +=============================== + 3751594 | + 3751544 | + 3751494 | + 3751444 | + 3751394 | + 3751344 | + 3751294 | + 3751244 | + 3751194 | + 3751144 | + +taos> select TIMEDIFF(ts, 1725095657, 1h) from ts_4893.meters order by ts limit 10 + timediff(ts, 1725095657, 1h) | +=============================== + -62526 | + -62525 | + -62524 | + -62524 | + -62523 | + -62522 | + -62521 | + -62520 | + -62519 | + -62519 | + +taos> select TIMEDIFF(1725095657, ts, 1h) from ts_4893.meters order by ts limit 10 + timediff(1725095657, ts, 1h) | +=============================== + 62526 | + 62525 | + 62524 | + 62524 | + 62523 | + 62522 | + 62521 | + 62520 | + 62519 | + 62519 | + +taos> select TIMEDIFF(ts, 1725095657, 1d) from ts_4893.meters order by ts limit 10 + timediff(ts, 1725095657, 1d) | +=============================== + -2605 | + -2605 | + -2605 | + -2605 | + -2605 | + -2605 | + -2605 | + -2605 | + -2604 | + -2604 | + +taos> select TIMEDIFF(1725095657, ts, 1d) from ts_4893.meters order by ts limit 10 + timediff(1725095657, ts, 1d) | +=============================== + 2605 | + 2605 | + 2605 | + 2605 | + 2605 | + 2605 | + 2605 | + 2605 | + 2604 | + 2604 | + +taos> select TIMEDIFF(ts, 1725095657, 1w) from ts_4893.meters order by ts limit 10 + timediff(ts, 1725095657, 1w) | +=============================== + -372 | + -372 | + -372 | + -372 | + -372 | + -372 | + -372 | + -372 | + -372 | + -372 | + +taos> select TIMEDIFF(1725095657, ts, 1w) from ts_4893.meters order by ts limit 10 + timediff(1725095657, ts, 1w) | +=============================== + 372 | + 372 | + 372 | + 372 | + 372 | + 372 | + 372 | + 372 | + 372 | + 372 | + +taos> select timediff('2022-01-01 08:00:00', '2022-01-01 08:00:10',1s) + timediff('2022-01-01 08:00:00', '2022-01-01 08:00:10',1s) | +============================================================ + -10 | + +taos> select timediff('2023-01-01 08:00:00', '2022-01-01 08:00:00',1s) + timediff('2023-01-01 08:00:00', '2022-01-01 08:00:00',1s) | +============================================================ + 31536000 | + +taos> select timediff('2022-01-01 08:00:03', '2022-01-01 08:00:00',1a) + timediff('2022-01-01 08:00:03', '2022-01-01 08:00:00',1a) | +============================================================ + 3000 | + +taos> select timediff('2022-01-31 08:00:00', '2022-01-01 08:00:00',1m) + timediff('2022-01-31 08:00:00', '2022-01-01 08:00:00',1m) | +============================================================ + 43200 | + +taos> select timediff('2022-01-31 08:00:00', '2022-01-01 08:00:00',1h) + timediff('2022-01-31 08:00:00', '2022-01-01 08:00:00',1h) | +============================================================ + 720 | + +taos> select timediff('2022-01-31 08:00:00', '2022-01-01 08:00:00',1d) + timediff('2022-01-31 08:00:00', '2022-01-01 08:00:00',1d) | +============================================================ + 30 | + +taos> select timediff('2022-01-31 08:00:00', '2022-01-01 08:00:00',1w) + timediff('2022-01-31 08:00:00', '2022-01-01 08:00:00',1w) | +============================================================ + 4 | + +taos> select timediff('2022-01-31 08:00:00', '2022-01-01 08:00:00') + timediff('2022-01-31 08:00:00', '2022-01-01 08:00:00') | +========================================================= + 2592000000 | + +taos> select timediff('2022-01-31 08:00:0', '2022-01-01 08:00:00',1s) + timediff('2022-01-31 08:00:0', '2022-01-01 08:00:00',1s) | +=========================================================== + 2592000 | + +taos> select timediff('2022-01-31', '2022-01-01',1s) + timediff('2022-01-31', '2022-01-01',1s) | +========================================== + 2592000 | + +taos> select timediff(1720769589, 1720769529, 1s) + timediff(1720769589, 1720769529, 1s) | +======================================= + 60 | + +taos> select timediff(1720769589, '2022-01-01 08:00:00', 1s) + timediff(1720769589, '2022-01-01 08:00:00', 1s) | +================================================== + 79774389 | + +taos> select timediff(1720769589123, 1720769529123, 1s) + timediff(1720769589123, 1720769529123, 1s) | +============================================= + 60 | + +taos> select timediff(1720769589231, '2022-01-01 08:00:00', 1s) + timediff(1720769589231, '2022-01-01 08:00:00', 1s) | +===================================================== + 79774389 | + +taos> select timediff('2022-01-01 08:00:00', 1720769589, 1s) + timediff('2022-01-01 08:00:00', 1720769589, 1s) | +================================================== + -79774389 | + +taos> select timediff('2022-01-01 08:00:00', 1720769589123, 1s) + timediff('2022-01-01 08:00:00', 1720769589123, 1s) | +===================================================== + -79774389 | + +taos> select timediff(ts, 1720769589123, 1a) from ts_4893.d0 order by ts limit 10 + timediff(ts, 1720769589123, 1a) | +================================== + -220769589123 | + -220766589123 | + -220763589123 | + -220760589123 | + -220757589123 | + -220754589123 | + -220751589123 | + -220748589123 | + -220745589123 | + -220742589123 | + +taos> select timediff(ts, 1720769589123, 1a) from ts_4893.meters order by ts limit 10 + timediff(ts, 1720769589123, 1a) | +================================== + -220769589123 | + -220766589123 | + -220763589123 | + -220760589123 | + -220757589123 | + -220754589123 | + -220751589123 | + -220748589123 | + -220745589123 | + -220742589123 | + +taos> select timediff(null, '2022-01-01 08:00:01', 1s) + timediff(null, '2022-01-01 08:00:01', 1s) | +============================================ + NULL | + +taos> select timediff('20220131', '20220101', 1s) + timediff('20220131', '20220101', 1s) | +======================================= + NULL | + +taos> select timediff('01/31/22', '01/01/22', 1s) + timediff('01/31/22', '01/01/22', 1s) | +======================================= + NULL | + +taos> select timediff('22/01/31', '22/01/01') + timediff('22/01/31', '22/01/01') | +=================================== + NULL | + +taos> select timediff('22/01/31', '22/01/01', 1s) + timediff('22/01/31', '22/01/01', 1s) | +======================================= + NULL | + +taos> select timediff('31-JAN-22', '01-JAN-22', 1s) + timediff('31-JAN-22', '01-JAN-22', 1s) | +========================================= + NULL | + +taos> select timediff('2022/01/31', '2022/01/01', 1s) + timediff('2022/01/31', '2022/01/01', 1s) | +=========================================== + NULL | + +taos> select timediff('2022-01-01 08:00:00', null, 1s) + timediff('2022-01-01 08:00:00', null, 1s) | +============================================ + NULL | + +taos> select timediff('www', 'ttt') + timediff('www', 'ttt') | +========================= + NULL | + +taos> select timediff(ts, ts) from ts_4893.meters limit 1 + timediff(ts, ts) | +======================== + 0 | + +taos> select timediff(ts, ts - 1d) from ts_4893.meters limit 1 + timediff(ts, ts - 1d) | +======================== + 86400000 | + +taos> select timediff(ts, '00:00:00') from ts_4893.meters limit 1 + timediff(ts, '00:00:00') | +=========================== + NULL | + +taos> select timediff(ts, null) from ts_4893.meters limit 1 + timediff(ts, null) | +======================== + NULL | + +taos> select timediff('25:61:61', ts) from ts_4893.meters limit 1 + timediff('25:61:61', ts) | +=========================== + NULL | + +taos> select timediff('invalid_format', ts) from ts_4893.meters limit 1 + timediff('invalid_format', ts) | +================================= + NULL | + +taos> select timediff(name, ts) from ts_4893.meters limit 2 + timediff(name, ts) | +======================== + NULL | + NULL | + +taos> select timediff('string_value', 'another_string') from ts_4893.meters limit 1 + timediff('string_value', 'another_string') | +============================================= + NULL | + diff --git a/tests/army/query/function/ans/trim.csv b/tests/army/query/function/ans/trim.csv index 01ed8a62c9..6e2efbda51 100644 --- a/tests/army/query/function/ans/trim.csv +++ b/tests/army/query/function/ans/trim.csv @@ -1,453 +1,1049 @@ -foo -bar -foobar -barfoo -bar -blank -bla nk -bla nk - bla nk -blank -aæa -中文测试 -中文测试 -中文测试 - 中文测试 -中文测试 -二中文测试 -二中文测试 -二中文测试一 -一二中文测试 -中文andEnglish测试Test -中文andEnglish测试Test -中文andEnglish测试Test - 中文andEnglish测试Test -中文andEngTes -中文andEngTes -中文andEngTes空格空格 -空格中文andEngTes -中文andEnglish测试Tes -中文andEnglish测试Tes -中文andEnglish测试Tesblankblankblank -blankblank中文andEnglish测试Tes -空格中Tes空格blank空 -空格中Tes空格blank空 -空格中Tes空格blank空 -空格blank空格中Tes空格blank空 -novel -abc一二三abc一二三abc -一二三abc -一二三四五六七八九十 -person -novel -abc一二三abc一二三abc -一二三abc -一二三四五六七八九十 -person -novel -abc一二三abc一二三abc -一二三abc -一二三四五六七八九十 -person -novel -abc一二三abc一二三abc -一二三abc -一二三四五六七八九十 -person -novel -一二三四五六七八九十 -update -prision -novel -novel -一二三四五六七八九十 -update -prision -novel -novel -一二三四五六七八九十 -update -prision -novel -novel -一二三四五六七八九十 -update -prision -novel -novel -novel -abc -123321三二一 -abc一二三abc一二三ab -novel -novel -abc -123321三二一 -abc一二三abc一二三ab -novel -novel -abc -123321三二一 -abc一二三abc一二三abc -novel -novel -一二三abc -一二三123321三二一 -abc一二三abc一二三ab -一二三四五六七八九十 -update -prision -novel -novel -一二三四五六七八九十 -update -prision -novel -novel -一二三四五六七八九十 -update -prision -novel -novel -一二三四五六七八九十 -update -prision -novel -novel -一二三abc -abc一二三abc一二三abc -bc一二三abc一二三abc -novel -update -一二三abc -abc一二三abc一二三abc -bc一二三abc一二三abc -novel -update -一二三abc -abc一二三abc一二三abc -bc一二三abc一二三abc -novel -update -一二三abc -abc一二三abc一二三abc -abc一二三abc一二三abc -novel -update -novel -person -novel -plate -一二三四五六七八九十 -novel -person -novel -plate -一二三四五六七八九十 -novel -person -novel -plate -一二三四五六七八九十 -novel -person -novel -plate -一二三四五六七八九十 -novel -plat -一二三abc -123321三二一 -abc一二三abc一二三ab -novel -plat -一二三abc -123321三二一 -abc一二三abc一二三ab -novel -plate -一二三abc -123321三二一 -abc一二三abc一二三abc -novel -plat -一二三abc -一二三123321三二一 -abc一二三abc一二三ab -person -novel -一二三四五六七八九十 -update -prision -person -novel -一二三四五六七八九十 -update -prision -person -novel -一二三四五六七八九十 -update -prision -person -novel -一二三四五六七八九十 -update -prision -二三四五六七八九十 -二三四五六七八九十 -abc一二三abc一二三abc -|| -二三123321三二 -二三四五六七八九十 -二三四五六七八九十 -abc一二三abc一二三abc -|| -二三123321三二 -二三四五六七八九十 -二三四五六七八九十 -abc一二三abc一二三abc -||一一一一 -二三123321三二一 -一二三四五六七八九十 -一二三四五六七八九十 -abc一二三abc一二三abc -一一一一一|| -一二三123321三二 -novel -update -prision -novel -novel -novel -update -prision -novel -novel -novel -update -prision -novel -novel -novel -update -prision -novel -novel -二三四五六七八九十 -二三abc -abc一二三abc一二三abc -二三123321三二 -|| -二三四五六七八九十 -二三abc -abc一二三abc一二三abc -二三123321三二 -|| -二三四五六七八九十 -二三abc -abc一二三abc一二三abc -二三123321三二一 -||一一一一 -一二三四五六七八九十 -一二三abc -abc一二三abc一二三abc -一二三123321三二 -一一一一一|| -novel -person -novel -plate -update -novel -person -novel -plate -update -novel -person -novel -plate -update -novel -person -novel -plate -update -三abbcfp三a -三abbcfp三a -三abbcfp三a -bbcfp -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -bbcfp -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -bbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -bbcfp -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三 -bbcfp -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三 -bbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三 -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -三abbcfp三a -A -涛思 -b bbb -aaa - aaa abab aaaa - abab aaaa -京涛思数据科技有限公司北 -bei京涛思数据科技有限公司北 - aaa abab aaaa -aaa abab - aaa abab -北京涛思数据科技有限公司 -北京涛思数据科技有限公司bei -aaa abab aaaa - aaa abab aaaa - abab -京涛思数据科技有限公司 -novel -一二三四五六七八九十 -update -prision -novel -novel -again -一二三四五六七八九十 -novel -again -novel -一二三四五六七八九十 -update -prision -novel -novel -again -一二三四五六七八九十 -novel -again -novel -person -novel -plate -一二三四五六七八九十 -update -prision -person -prision -plate -novel -person -novel -plate -一二三四五六七八九十 -update -prision -person -prision -plate -novel -一二三四五六七八九十 -update -prision -novel -novel -again -一二三四五六七八九十 -novel -again -novel -一二三四五六七八九十 -update -prision -novel -novel -again -一二三四五六七八九十 -novel -again -novel -person -novel -plat -一二三四五六七八九十 -update -prision -person -prision -plate -novel -person -novel -plat -一二三四五六七八九十 -update -prision -person -prision -plate + +taos> select trim('foo') + trim('foo') | +============== + foo | + +taos> select trim('foo' from 'foobarfoo') + trim('foo' from 'foobarfoo') | +=============================== + bar | + +taos> select trim(trailing 'foo' from 'foobarfoo') + trim(trailing 'foo' from 'foobarfoo') | +======================================== + foobar | + +taos> select trim(leading 'foo' from 'foobarfoo') + trim(leading 'foo' from 'foobarfoo') | +======================================= + barfoo | + +taos> select trim(both 'foo' from 'foobarfoo') + trim(both 'foo' from 'foobarfoo') | +==================================== + bar | + +taos> select trim(' blank ') + trim(' blank ') | +======================== + blank | + +taos> select trim(both ' ' from ' bla nk ') + trim(both ' ' from ' bla nk ') | +======================================== + bla nk | + +taos> select trim(leading ' ' from ' bla nk') + trim(leading ' ' from ' bla nk') | +====================================== + bla nk | + +taos> select trim(trailing ' ' from ' bla nk ') + trim(trailing ' ' from ' bla nk ') | +============================================ + bla nk | + +taos> select trim(' ' from ' blank ') + trim(' ' from ' blank ') | +================================= + blank | + +taos> select TRIM(BOTH 'å' FROM 'aæaå') + trim(both 'å' from 'aæaå') | +================================ + aæa | + +taos> select trim(' 中文测试 ') + trim(' 中文测试 ') | +=========================== + 中文测试 | + +taos> select trim(both ' ' from ' 中文测试 ') + trim(both ' ' from ' 中文测试 ') | +========================================= + 中文测试 | + +taos> select trim(leading ' ' from ' 中文测试') + trim(leading ' ' from ' 中文测试') | +========================================== + 中文测试 | + +taos> select trim(trailing ' ' from ' 中文测试 ') + trim(trailing ' ' from ' 中文测试 ') | +============================================= + 中文测试 | + +taos> select trim(' ' from ' 中文测试 ') + trim(' ' from ' 中文测试 ') | +==================================== + 中文测试 | + +taos> select trim('一' from '一二中文测试一') + trim('一' from '一二中文测试一') | +=========================================== + 二中文测试 | + +taos> select trim(both '一' from '一二中文测试一') + trim(both '一' from '一二中文测试一') | +================================================ + 二中文测试 | + +taos> select trim(leading '一' from '一二中文测试一') + trim(leading '一' from '一二中文测试一') | +=================================================== + 二中文测试一 | + +taos> select trim(trailing '一' from '一二中文测试一') + trim(trailing '一' from '一二中文测试一') | +==================================================== + 一二中文测试 | + +taos> select trim(' 中文andEnglish测试Test ') + trim(' 中文andEnglish测试Test ') | +=========================================== + 中文andEnglish测试Test | + +taos> select trim(both ' ' from ' 中文andEnglish测试Test ') + trim(both ' ' from ' 中文andEnglish测试Test ') | +========================================================= + 中文andEnglish测试Test | + +taos> select trim(leading ' ' from ' 中文andEnglish测试Test') + trim(leading ' ' from ' 中文andEnglish测试Test') | +========================================================= + 中文andEnglish测试Test | + +taos> select trim(trailing ' ' from ' 中文andEnglish测试Test ') + trim(trailing ' ' from ' 中文andEnglish测试Test ') | +============================================================= + 中文andEnglish测试Test | + +taos> select trim('空格' from '空格中文andEngTes空格空格') + trim('空格' from '空格中文andEngTes空格空格') | +========================================================== + 中文andEngTes | + +taos> select trim(both '空格' from '空格中文andEngTes空格空格') + trim(both '空格' from '空格中文andEngTes空格空格') | +=============================================================== + 中文andEngTes | + +taos> select trim(leading '空格' from '空格中文andEngTes空格空格') + trim(leading '空格' from '空格中文andEngTes空格空格') | +================================================================== + 中文andEngTes空格空格 | + +taos> select trim(trailing '空格' from '空格中文andEngTes空格空格') + trim(trailing '空格' from '空格中文andEngTes空格空格') | +=================================================================== + 空格中文andEngTes | + +taos> select trim('blank' from 'blankblank中文andEnglish测试Tesblankblankblank') + trim('blank' from 'blankblank中文andEnglish测试Tesblankblank | +=================================================================== + 中文andEnglish测试Tes | + +taos> select trim(both 'blank' from 'blankblank中文andEnglish测试Tesblankblankblank') + trim(both 'blank' from 'blankblank中文andEnglish测试Tesblank | +=================================================================== + 中文andEnglish测试Tes | + +taos> select trim(leading 'blank' from 'blankblank中文andEnglish测试Tesblankblankblank') + trim(leading 'blank' from 'blankblank中文andEnglish测试Tesbl | +=================================================================== + 中文andEnglish测试Tesblankblankblank | + +taos> select trim(trailing 'blank' from 'blankblank中文andEnglish测试Tesblankblankblank') + trim(trailing 'blank' from 'blankblank中文andEnglish测试Tesb | +=================================================================== + blankblank中文andEnglish测试Tes | + +taos> select trim('空格blank' from '空格blank空格中Tes空格blank空') + trim('空格blank' from '空格blank空格中Tes空格blank空') | +=================================================================== + 空格中Tes空格blank空 | + +taos> select trim(both '空格blank' from '空格blank空格中Tes空格blank空') + trim(both '空格blank' from '空格blank空格中Tes空格blank | +=================================================================== + 空格中Tes空格blank空 | + +taos> select trim(leading '空格blank' from '空格blank空格中Tes空格blank空') + trim(leading '空格blank' from '空格blank空格中Tes空格bl | +=================================================================== + 空格中Tes空格blank空 | + +taos> select trim(trailing '空格blank' from '空格blank空格中Tes空格blank空') + trim(trailing '空格blank' from '空格blank空格中Tes空格b | +=================================================================== + 空格blank空格中Tes空格blank空 | + +taos> select trim(nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) != 0 order by ts limit 5 + trim(nch2 from nch1) | +================================= + novel | + abc一二三abc一二三abc | + 一二三abc | + 一二三四五六七八九十 | + person | + +taos> select trim(both nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) != 0 order by ts limit 5 + trim(both nch2 from nch1) | +================================= + novel | + abc一二三abc一二三abc | + 一二三abc | + 一二三四五六七八九十 | + person | + +taos> select trim(leading nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) != 0 order by ts limit 5 + trim(leading nch2 from nch1) | +================================= + novel | + abc一二三abc一二三abc | + 一二三abc | + 一二三四五六七八九十 | + person | + +taos> select trim(trailing nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) != 0 order by ts limit 5 + trim(trailing nch2 from nch1) | +================================= + novel | + abc一二三abc一二三abc | + 一二三abc | + 一二三四五六七八九十 | + person | + +taos> select trim(nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) = 0 order by ts limit 5 + trim(nch2 from nch1) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novel | + +taos> select trim(both nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) = 0 order by ts limit 5 + trim(both nch2 from nch1) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novel | + +taos> select trim(leading nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) = 0 order by ts limit 5 + trim(leading nch2 from nch1) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novel | + +taos> select trim(trailing nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) = 0 order by ts limit 5 + trim(trailing nch2 from nch1) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novel | + +taos> select trim(var2 from nch1) from ts_4893.meters where position(var2 in nch1) != 0 order by ts limit 5 + trim(var2 from nch1) | +================================= + novel | + novel | + abc | + 123321三二一 | + abc一二三abc一二三ab | + +taos> select trim(both var2 from nch1) from ts_4893.meters where position(var2 in nch1) != 0 order by ts limit 5 + trim(both var2 from nch1) | +================================= + novel | + novel | + abc | + 123321三二一 | + abc一二三abc一二三ab | + +taos> select trim(leading var2 from nch1) from ts_4893.meters where position(var2 in nch1) != 0 order by ts limit 5 + trim(leading var2 from nch1) | +================================= + novel | + novel | + abc | + 123321三二一 | + abc一二三abc一二三abc | + +taos> select trim(trailing var2 from nch1) from ts_4893.meters where position(var2 in nch1) != 0 order by ts limit 5 + trim(trailing var2 from nch1) | +================================= + novel | + novel | + 一二三abc | + 一二三123321三二一 | + abc一二三abc一二三ab | + +taos> select trim(var2 from nch1) from ts_4893.meters where position(var2 in nch1) = 0 order by ts limit 5 + trim(var2 from nch1) | +================================= + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + +taos> select trim(both var2 from nch1) from ts_4893.meters where position(var2 in nch1) = 0 order by ts limit 5 + trim(both var2 from nch1) | +================================= + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + +taos> select trim(leading var2 from nch1) from ts_4893.meters where position(var2 in nch1) = 0 order by ts limit 5 + trim(leading var2 from nch1) | +================================= + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + +taos> select trim(trailing var2 from nch1) from ts_4893.meters where position(var2 in nch1) = 0 order by ts limit 5 + trim(trailing var2 from nch1) | +================================= + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + +taos> select trim(nch2 from var1) from ts_4893.meters where position(nch2 in var1) != 0 order by ts limit 5 + trim(nch2 from var1) | +================================= + 一二三abc | + abc一二三abc一二三abc | + bc一二三abc一二三abc | + novel | + update | + +taos> select trim(both nch2 from var1) from ts_4893.meters where position(nch2 in var1) != 0 order by ts limit 5 + trim(both nch2 from var1) | +================================= + 一二三abc | + abc一二三abc一二三abc | + bc一二三abc一二三abc | + novel | + update | + +taos> select trim(leading nch2 from var1) from ts_4893.meters where position(nch2 in var1) != 0 order by ts limit 5 + trim(leading nch2 from var1) | +================================= + 一二三abc | + abc一二三abc一二三abc | + bc一二三abc一二三abc | + novel | + update | + +taos> select trim(trailing nch2 from var1) from ts_4893.meters where position(nch2 in var1) != 0 order by ts limit 5 + trim(trailing nch2 from var1) | +================================= + 一二三abc | + abc一二三abc一二三abc | + abc一二三abc一二三abc | + novel | + update | + +taos> select trim(nch2 from var1) from ts_4893.meters where position(nch2 in var1) = 0 order by ts limit 5 + trim(nch2 from var1) | +================================= + novel | + person | + novel | + plate | + 一二三四五六七八九十 | + +taos> select trim(both nch2 from var1) from ts_4893.meters where position(nch2 in var1) = 0 order by ts limit 5 + trim(both nch2 from var1) | +================================= + novel | + person | + novel | + plate | + 一二三四五六七八九十 | + +taos> select trim(leading nch2 from var1) from ts_4893.meters where position(nch2 in var1) = 0 order by ts limit 5 + trim(leading nch2 from var1) | +================================= + novel | + person | + novel | + plate | + 一二三四五六七八九十 | + +taos> select trim(trailing nch2 from var1) from ts_4893.meters where position(nch2 in var1) = 0 order by ts limit 5 + trim(trailing nch2 from var1) | +================================= + novel | + person | + novel | + plate | + 一二三四五六七八九十 | + +taos> select trim(var2 from var1) from ts_4893.meters where position(var2 in var1) != 0 order by ts limit 5 + trim(var2 from var1) | +================================= + novel | + plat | + 一二三abc | + 123321三二一 | + abc一二三abc一二三ab | + +taos> select trim(both var2 from var1) from ts_4893.meters where position(var2 in var1) != 0 order by ts limit 5 + trim(both var2 from var1) | +================================= + novel | + plat | + 一二三abc | + 123321三二一 | + abc一二三abc一二三ab | + +taos> select trim(leading var2 from var1) from ts_4893.meters where position(var2 in var1) != 0 order by ts limit 5 + trim(leading var2 from var1) | +================================= + novel | + plate | + 一二三abc | + 123321三二一 | + abc一二三abc一二三abc | + +taos> select trim(trailing var2 from var1) from ts_4893.meters where position(var2 in var1) != 0 order by ts limit 5 + trim(trailing var2 from var1) | +================================= + novel | + plat | + 一二三abc | + 一二三123321三二一 | + abc一二三abc一二三ab | + +taos> select trim(var2 from var1) from ts_4893.meters where position(var2 in var1) = 0 order by ts limit 5 + trim(var2 from var1) | +================================= + person | + novel | + 一二三四五六七八九十 | + update | + prision | + +taos> select trim(both var2 from var1) from ts_4893.meters where position(var2 in var1) = 0 order by ts limit 5 + trim(both var2 from var1) | +================================= + person | + novel | + 一二三四五六七八九十 | + update | + prision | + +taos> select trim(leading var2 from var1) from ts_4893.meters where position(var2 in var1) = 0 order by ts limit 5 + trim(leading var2 from var1) | +================================= + person | + novel | + 一二三四五六七八九十 | + update | + prision | + +taos> select trim(trailing var2 from var1) from ts_4893.meters where position(var2 in var1) = 0 order by ts limit 5 + trim(trailing var2 from var1) | +================================= + person | + novel | + 一二三四五六七八九十 | + update | + prision | + +taos> select trim('一' from nch1) from ts_4893.meters where position('一' in nch1) != 0 order by ts limit 5 + trim('一' from nch1) | +================================= + 二三四五六七八九十 | + 二三四五六七八九十 | + abc一二三abc一二三abc | + || | + 二三123321三二 | + +taos> select trim(both '一' from nch1) from ts_4893.meters where position('一' in nch1) != 0 order by ts limit 5 + trim(both '一' from nch1) | +================================= + 二三四五六七八九十 | + 二三四五六七八九十 | + abc一二三abc一二三abc | + || | + 二三123321三二 | + +taos> select trim(leading '一' from nch1) from ts_4893.meters where position('一' in nch1) != 0 order by ts limit 5 + trim(leading '一' from nch1) | +================================= + 二三四五六七八九十 | + 二三四五六七八九十 | + abc一二三abc一二三abc | + ||一一一一 | + 二三123321三二一 | + +taos> select trim(trailing '一' from nch1) from ts_4893.meters where position('一' in nch1) != 0 order by ts limit 5 + trim(trailing '一' from nch1) | +================================= + 一二三四五六七八九十 | + 一二三四五六七八九十 | + abc一二三abc一二三abc | + 一一一一一|| | + 一二三123321三二 | + +taos> select trim('一' from nch1) from ts_4893.meters where position('一' in nch1) = 0 order by ts limit 5 + trim('一' from nch1) | +================================= + novel | + update | + prision | + novel | + novel | + +taos> select trim(both '一' from nch1) from ts_4893.meters where position('一' in nch1) = 0 order by ts limit 5 + trim(both '一' from nch1) | +================================= + novel | + update | + prision | + novel | + novel | + +taos> select trim(leading '一' from nch1) from ts_4893.meters where position('一' in nch1) = 0 order by ts limit 5 + trim(leading '一' from nch1) | +================================= + novel | + update | + prision | + novel | + novel | + +taos> select trim(trailing '一' from nch1) from ts_4893.meters where position('一' in nch1) = 0 order by ts limit 5 + trim(trailing '一' from nch1) | +================================= + novel | + update | + prision | + novel | + novel | + +taos> select trim('一' from var1) from ts_4893.meters where position('一' in var1) != 0 order by ts limit 5 + trim('一' from var1) | +================================= + 二三四五六七八九十 | + 二三abc | + abc一二三abc一二三abc | + 二三123321三二 | + || | + +taos> select trim(both '一' from var1) from ts_4893.meters where position('一' in var1) != 0 order by ts limit 5 + trim(both '一' from var1) | +================================= + 二三四五六七八九十 | + 二三abc | + abc一二三abc一二三abc | + 二三123321三二 | + || | + +taos> select trim(leading '一' from var1) from ts_4893.meters where position('一' in var1) != 0 order by ts limit 5 + trim(leading '一' from var1) | +================================= + 二三四五六七八九十 | + 二三abc | + abc一二三abc一二三abc | + 二三123321三二一 | + ||一一一一 | + +taos> select trim(trailing '一' from var1) from ts_4893.meters where position('一' in var1) != 0 order by ts limit 5 + trim(trailing '一' from var1) | +================================= + 一二三四五六七八九十 | + 一二三abc | + abc一二三abc一二三abc | + 一二三123321三二 | + 一一一一一|| | + +taos> select trim('一' from var1) from ts_4893.meters where position('一' in var1) = 0 order by ts limit 5 + trim('一' from var1) | +================================= + novel | + person | + novel | + plate | + update | + +taos> select trim(both '一' from var1) from ts_4893.meters where position('一' in var1) = 0 order by ts limit 5 + trim(both '一' from var1) | +================================= + novel | + person | + novel | + plate | + update | + +taos> select trim(leading '一' from var1) from ts_4893.meters where position('一' in var1) = 0 order by ts limit 5 + trim(leading '一' from var1) | +================================= + novel | + person | + novel | + plate | + update | + +taos> select trim(trailing '一' from var1) from ts_4893.meters where position('一' in var1) = 0 order by ts limit 5 + trim(trailing '一' from var1) | +================================= + novel | + person | + novel | + plate | + update | + +taos> select trim(nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') != 0 order by ts limit 5 + trim(nch2 from '三abbcfp三a') | +================================== + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + bbcfp | + 三abbcfp三a | + +taos> select trim(both nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') != 0 order by ts limit 5 + trim(both nch2 from '三abbcfp三a') | +======================================= + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + bbcfp | + 三abbcfp三a | + +taos> select trim(leading nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') != 0 order by ts limit 5 + trim(leading nch2 from '三abbcfp三a') | +========================================== + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + bbcfp三a | + 三abbcfp三a | + +taos> select trim(trailing nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') != 0 order by ts limit 5 + trim(trailing nch2 from '三abbcfp三a') | +=========================================== + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp | + 三abbcfp三a | + +taos> select trim(nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') = 0 order by ts limit 5 + trim(nch2 from '三abbcfp三a') | +================================== + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + +taos> select trim(both nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') = 0 order by ts limit 5 + trim(both nch2 from '三abbcfp三a') | +======================================= + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + +taos> select trim(leading nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') = 0 order by ts limit 5 + trim(leading nch2 from '三abbcfp三a') | +========================================== + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + +taos> select trim(trailing nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') = 0 order by ts limit 5 + trim(trailing nch2 from '三abbcfp三a') | +=========================================== + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + +taos> select trim(var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') != 0 order by ts limit 5 + trim(var2 from '三abbcfp三a') | +================================== + bbcfp | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三 | + +taos> select trim(both var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') != 0 order by ts limit 5 + trim(both var2 from '三abbcfp三a') | +======================================= + bbcfp | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三 | + +taos> select trim(leading var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') != 0 order by ts limit 5 + trim(leading var2 from '三abbcfp三a') | +========================================== + bbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + +taos> select trim(trailing var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') != 0 order by ts limit 5 + trim(trailing var2 from '三abbcfp三a') | +=========================================== + 三abbcfp | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三 | + +taos> select trim(var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') = 0 order by ts limit 5 + trim(var2 from '三abbcfp三a') | +================================== + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + +taos> select trim(both var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') = 0 order by ts limit 5 + trim(both var2 from '三abbcfp三a') | +======================================= + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + +taos> select trim(leading var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') = 0 order by ts limit 5 + trim(leading var2 from '三abbcfp三a') | +========================================== + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + +taos> select trim(trailing var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') = 0 order by ts limit 5 + trim(trailing var2 from '三abbcfp三a') | +=========================================== + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + 三abbcfp三a | + +taos> select trim(' A ') + trim(' A ') | +======================= + A | + +taos> select trim(' 涛思 ') + trim(' 涛思 ') | +============================ + 涛思 | + +taos> select trim('a' FROM 'aaab bbba') + trim('a' from 'aaab bbba') | +================================== + b bbb | + +taos> select trim(LEADING FROM ' aaa ') + trim(leading from ' aaa ') | +======================================= + aaa | + +taos> select trim(LEADING 'a' FROM ' aaa abab aaaa ') + trim(leading 'a' from ' aaa abab aaaa ') | +==================================================== + aaa abab aaaa | + +taos> select trim(LEADING 'a' FROM 'aaa abab aaaa ') + trim(leading 'a' from 'aaa abab aaaa ') | +================================================= + abab aaaa | + +taos> select trim(LEADING '北' FROM '北京涛思数据科技有限公司北') + trim(leading '北' from '北京涛思数据科技有限公司北 | +=================================================================== + 京涛思数据科技有限公司北 | + +taos> select trim(LEADING '北' FROM '北bei京涛思数据科技有限公司北') + trim(leading '北' from '北bei京涛思数据科技有限公司 | +=================================================================== + bei京涛思数据科技有限公司北 | + +taos> select trim(TRAILING FROM ' aaa abab aaaa ') + trim(trailing from ' aaa abab aaaa ') | +================================================= + aaa abab aaaa | + +taos> select trim(TRAILING 'a' FROM 'aaa abab aaaa') + trim(trailing 'a' from 'aaa abab aaaa') | +=============================================== + aaa abab | + +taos> select trim(TRAILING 'a' FROM ' aaa abab aaaa') + trim(trailing 'a' from ' aaa abab aaaa') | +================================================== + aaa abab | + +taos> select trim(TRAILING '北' FROM '北京涛思数据科技有限公司北') as sub + sub | +================================= + 北京涛思数据科技有限公司 | + +taos> select trim(TRAILING '北' FROM '北京涛思数据科技有限公司bei北') + trim(trailing '北' from '北京涛思数据科技有限公司be | +=================================================================== + 北京涛思数据科技有限公司bei | + +taos> select trim(BOTH FROM ' aaa abab aaaa ') + trim(both from ' aaa abab aaaa ') | +============================================= + aaa abab aaaa | + +taos> select trim(BOTH 'a' FROM ' aaa abab aaaa ') + trim(both 'a' from ' aaa abab aaaa ') | +================================================== + aaa abab aaaa | + +taos> select trim(BOTH 'a' FROM 'aaa abab aaaa') + trim(both 'a' from 'aaa abab aaaa') | +=========================================== + abab | + +taos> select trim(BOTH '北' FROM '北京涛思数据科技有限公司北') + trim(both '北' from '北京涛思数据科技有限公司北') | +================================================================== + 京涛思数据科技有限公司 | + +taos> select trim(nch2 from nch1) from ts_4893.d0 order by ts limit 10 + trim(nch2 from nch1) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + again | + 一二三四五六七八九十 | + novel | + again | + +taos> select trim(nch2 from nch1) from ts_4893.meters order by ts limit 10 + trim(nch2 from nch1) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + again | + 一二三四五六七八九十 | + novel | + again | + +taos> select trim(nch2 from var1) from ts_4893.d0 order by ts limit 10 + trim(nch2 from var1) | +================================= + novel | + person | + novel | + plate | + 一二三四五六七八九十 | + update | + prision | + person | + prision | + plate | + +taos> select trim(nch2 from var1) from ts_4893.meters order by ts limit 10 + trim(nch2 from var1) | +================================= + novel | + person | + novel | + plate | + 一二三四五六七八九十 | + update | + prision | + person | + prision | + plate | + +taos> select trim(var2 from nch1) from ts_4893.d0 order by ts limit 10 + trim(var2 from nch1) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + again | + 一二三四五六七八九十 | + novel | + again | + +taos> select trim(var2 from nch1) from ts_4893.meters order by ts limit 10 + trim(var2 from nch1) | +================================= + novel | + 一二三四五六七八九十 | + update | + prision | + novel | + novel | + again | + 一二三四五六七八九十 | + novel | + again | + +taos> select trim(var2 from var1) from ts_4893.d0 order by ts limit 10 + trim(var2 from var1) | +================================= + novel | + person | + novel | + plat | + 一二三四五六七八九十 | + update | + prision | + person | + prision | + plate | + +taos> select trim(var2 from var1) from ts_4893.meters order by ts limit 10 + trim(var2 from var1) | +================================= + novel | + person | + novel | + plat | + 一二三四五六七八九十 | + update | + prision | + person | + prision | + plate | + +taos> select trim(null) + trim(null) | +============= + NULL | + +taos> select trim('') + trim('') | +=========== + | + +taos> select trim(leading ' ' from ' hello') + trim(leading ' ' from ' hello') | +==================================== + hello | + +taos> select trim(trailing ' ' from 'hello ') + trim(trailing ' ' from 'hello ') | +===================================== + hello | + +taos> select trim('0' from '000123000') + trim('0' from '000123000') | +============================= + 123 | + +taos> select trim(' hello ') + trim(' hello ') | +==================== + hello | + +taos> select trim(' apple banana ') + trim(' apple banana ') | +============================= + apple banana | + +taos> select var2, trim('*' from var2) from ts_4893.meters limit 1 + var2 | trim('*' from var2) | +================================================================== + e | e | + +taos> select trim('x' from 'hello') + trim('x' from 'hello') | +========================= + hello | + +taos> select trim('longer' from 'short') + trim('longer' from 'short') | +============================== + short | + +taos> select trim('hello') + trim('hello') | +================ + hello | + +taos> select trim(' 12345 ') + trim(' 12345 ') | +====================== + 12345 | + +taos> select trim(concat(' hello', ' world ')) + trim(concat(' hello', ' world ')) | +========================================== + hello world | + +taos> select trim(upper(' hello world ')) + trim(upper(' hello world ')) | +================================= + HELLO WORLD | + +taos> select trim(substring(' hello world ', 4)) + trim(substring(' hello world ', 4)) | +========================================== + hello world | + +taos> select trim(replace(' hello world ', ' ', '-')) + trim(replace(' hello world ', ' ', '-')) | +=============================================== + ---hello-world--- | + +taos> select name, trim(name) from ts_4893.meters limit 1 + name | trim(name) | +================================================================== + lili | lili | + +taos> select var1, trim(trailing '!' from var1) from ts_4893.meters limit 1 + var1 | trim(trailing '!' from var1) | +================================================================== + novel | novel | + +taos> select nch1, trim(leading '-' from nch1) from ts_4893.meters limit 1 + nch1 | trim(leading '-' from nch1) | +================================================================== + novel | novel | + diff --git a/tests/army/query/function/ans/trunc.csv b/tests/army/query/function/ans/trunc.csv old mode 100755 new mode 100644 index ea735c1c7e..e553f3acb5 --- a/tests/army/query/function/ans/trunc.csv +++ b/tests/army/query/function/ans/trunc.csv @@ -1,129 +1,343 @@ -10.550000000000001 -10.550000000000001 -10.500000000000000 -10.000000000000000 -10.000000000000000 -0.000000000000000 --10.500000000000000 -99 -11.500000000000000 -1.231230000000000e+02 -1.200000000000000e+08 -8.765432100000000e+07 -8.765432109999999e+07 -8.765432112000000e+07 -8.765432112300000e+07 -8.765432112340000e+07 -8.765432112345000e+07 -8.765432112345600e+07 -8.765432112345670e+07 -8.765432112345679e+07 -8.765432112345679e+07 -10.0000000 -8.5000000 -9.7900000 -11.2329998 -10.7060003 -8.5080004 -9.5959997 -10.9619999 -11.2259998 -10.3369999 -10.6000004 -8.5000000 -9.6999998 -11.1999998 -10.6999998 -8.5000000 -9.5000000 -10.8999996 -11.1999998 -10.3000002 -10.550000000000001 -10.550000000000001 -10.500000000000000 -10.000000000000000 -10.000000000000000 -0.000000000000000 --10.500000000000000 -99 -11.500000000000000 -1.231230000000000e+02 -1.200000000000000e+08 -8.765432100000000e+07 -8.765432109999999e+07 -8.765432112000000e+07 -8.765432112300000e+07 -8.765432112340000e+07 -8.765432112345000e+07 -8.765432112345600e+07 -8.765432112345670e+07 -8.765432112345679e+07 -8.765432112345679e+07 -10.0000000 -8.5000000 -9.7900000 -11.2329998 -10.7060003 -8.5080004 -9.5959997 -10.9619999 -11.2259998 -10.3369999 -10.6000004 -8.5000000 -9.6999998 -11.1999998 -10.6999998 -8.5000000 -9.5000000 -10.8999996 -11.1999998 -10.3000002 -99.99 -99.99 -99.9 -99 -90 -0 -99 -10.6 -8.5 -9.7 -11.2 -10.7 -8.5 -9.5 -10.9 -11.2 -10.3 -10.6 -8.5 -9.7 -11.2 -10.7 -8.5 -9.5 -10.9 -11.2 -10.3 -10.6 -8.5 -9.7 -11.2 -10.7 -8.5 -9.5 -10.9 -11.2 -10.3 -10.6 -8.5 -9.7 -11.2 -10.7 -8.5 -9.5 -10.9 -11.2 -10.3 + +taos> select TRUNCATE(10.55, 3) + truncate(10.55, 3) | +============================ + 10.550000000000001 | + +taos> select TRUNCATE(10.55, 2) + truncate(10.55, 2) | +============================ + 10.550000000000001 | + +taos> select TRUNCATE(10.55, 1) + truncate(10.55, 1) | +============================ + 10.500000000000000 | + +taos> select TRUNCATE(10.55, 0) + truncate(10.55, 0) | +============================ + 10.000000000000000 | + +taos> select TRUNCATE(10.55, -1) + truncate(10.55, -1) | +============================ + 10.000000000000000 | + +taos> select TRUNCATE(10.55, -10) + truncate(10.55, -10) | +============================ + 0.000000000000000 | + +taos> select TRUNCATE(-10.55, 1) + truncate(-10.55, 1) | +============================ + -10.500000000000000 | + +taos> select TRUNCATE(99, 1) + truncate(99, 1) | +======================== + 99 | + +taos> select TRUNCATE(10.55, 1) + 1 + truncate(10.55, 1) + 1 | +============================ + 11.500000000000000 | + +taos> select TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(123.123456789, 9), 8), 7), 6), 5), 4), 3) + truncate(truncate(truncate(truncate(truncate(truncate(truncate(1 | +=================================================================== + 1.231230000000000e+02 | + +taos> select TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(123456789.123456789, -1), -2), -3), -4), -5), -6), -7) + truncate(truncate(truncate(truncate(truncate(truncate(truncate(1 | +=================================================================== + 1.200000000000000e+08 | + +taos> select TRUNCATE(87654321.123456789, id) from ts_4893.meters order by ts limit 10 + truncate(87654321.123456789, id) | +=================================== + 8.765432100000000e+07 | + 8.765432109999999e+07 | + 8.765432112000000e+07 | + 8.765432112300000e+07 | + 8.765432112340000e+07 | + 8.765432112345000e+07 | + 8.765432112345600e+07 | + 8.765432112345670e+07 | + 8.765432112345679e+07 | + 8.765432112345679e+07 | + +taos> select TRUNCATE(current, id) from ts_4893.meters order by ts limit 10 + truncate(current, id) | +======================== + 1.0000000e+01 | + 8.5000000e+00 | + 9.7900000e+00 | + 1.1233000e+01 | + 1.0706000e+01 | + 8.5080004e+00 | + 9.5959997e+00 | + 1.0962000e+01 | + 1.1226000e+01 | + 1.0337000e+01 | + +taos> select TRUNCATE(current, 1) from ts_4893.meters order by ts limit 10 + truncate(current, 1) | +======================= + 10.6000004 | + 8.5000000 | + 9.6999998 | + 11.1999998 | + 10.6999998 | + 8.5000000 | + 9.5000000 | + 10.8999996 | + 11.1999998 | + 10.3000002 | + +taos> select TRUNC(10.55, 3) + trunc(10.55, 3) | +============================ + 10.550000000000001 | + +taos> select TRUNC(10.55, 2) + trunc(10.55, 2) | +============================ + 10.550000000000001 | + +taos> select TRUNC(10.55, 1) + trunc(10.55, 1) | +============================ + 10.500000000000000 | + +taos> select TRUNC(10.55, 0) + trunc(10.55, 0) | +============================ + 10.000000000000000 | + +taos> select TRUNC(10.55, -1) + trunc(10.55, -1) | +============================ + 10.000000000000000 | + +taos> select TRUNC(10.55, -10) + trunc(10.55, -10) | +============================ + 0.000000000000000 | + +taos> select TRUNC(-10.55, 1) + trunc(-10.55, 1) | +============================ + -10.500000000000000 | + +taos> select TRUNC(99, 1) + trunc(99, 1) | +======================== + 99 | + +taos> select TRUNC(10.55, 1) + 1 + trunc(10.55, 1) + 1 | +============================ + 11.500000000000000 | + +taos> select TRUNC(TRUNC(TRUNC(TRUNC(TRUNC(TRUNC(TRUNC(123.123456789, 9), 8), 7), 6), 5), 4), 3) + trunc(trunc(trunc(trunc(trunc(trunc(trunc(123.123456789, 9), 8), | +=================================================================== + 1.231230000000000e+02 | + +taos> select TRUNC(TRUNC(TRUNC(TRUNC(TRUNC(TRUNC(TRUNC(123456789.123456789, -1), -2), -3), -4), -5), -6), -7) + trunc(trunc(trunc(trunc(trunc(trunc(trunc(123456789.123456789, - | +=================================================================== + 1.200000000000000e+08 | + +taos> select TRUNC(87654321.123456789, id) from ts_4893.meters order by ts limit 10 + trunc(87654321.123456789, id) | +================================ + 8.765432100000000e+07 | + 8.765432109999999e+07 | + 8.765432112000000e+07 | + 8.765432112300000e+07 | + 8.765432112340000e+07 | + 8.765432112345000e+07 | + 8.765432112345600e+07 | + 8.765432112345670e+07 | + 8.765432112345679e+07 | + 8.765432112345679e+07 | + +taos> select TRUNC(current, id) from ts_4893.meters order by ts limit 10 + trunc(current, id) | +======================= + 10.0000000 | + 8.5000000 | + 9.7900000 | + 11.2329998 | + 10.7060003 | + 8.5080004 | + 9.5959997 | + 10.9619999 | + 11.2259998 | + 10.3369999 | + +taos> select TRUNC(current, 1) from ts_4893.meters order by ts limit 10 + trunc(current, 1) | +======================= + 10.6000004 | + 8.5000000 | + 9.6999998 | + 11.1999998 | + 10.6999998 | + 8.5000000 | + 9.5000000 | + 10.8999996 | + 11.1999998 | + 10.3000002 | + +taos> select truncate(99.99, 3) + truncate(99.99, 3) | +============================ + 99.989999999999995 | + +taos> select truncate(99.99, 2) + truncate(99.99, 2) | +============================ + 99.989999999999995 | + +taos> select truncate(99.99, 1) + truncate(99.99, 1) | +============================ + 99.900000000000006 | + +taos> select truncate(99.99, 0) + truncate(99.99, 0) | +============================ + 99.000000000000000 | + +taos> select truncate(99.99, -1) + truncate(99.99, -1) | +============================ + 90.000000000000000 | + +taos> select truncate(99.99, -10) + truncate(99.99, -10) | +============================ + 0.000000000000000 | + +taos> select truncate(99, 1) + truncate(99, 1) | +======================== + 99 | + +taos> select truncate(current, 1) from ts_4893.d0 order by ts limit 10 + truncate(current, 1) | +======================= + 10.6000004 | + 8.5000000 | + 9.6999998 | + 11.1999998 | + 10.6999998 | + 8.5000000 | + 9.5000000 | + 10.8999996 | + 11.1999998 | + 10.3000002 | + +taos> select truncate(current, 1) from ts_4893.meters order by ts limit 10 + truncate(current, 1) | +======================= + 10.6000004 | + 8.5000000 | + 9.6999998 | + 11.1999998 | + 10.6999998 | + 8.5000000 | + 9.5000000 | + 10.8999996 | + 11.1999998 | + 10.3000002 | + +taos> select truncate(99.99, null) + truncate(99.99, null) | +============================ + NULL | + +taos> select truncate(null, 3) + truncate(null, 3) | +==================== + NULL | + +taos> select truncate(1.0001, 3) + truncate(1.0001, 3) | +============================ + 1.000000000000000 | + +taos> select truncate(2.71828, 4) + truncate(2.71828, 4) | +============================ + 2.718200000000000 | + +taos> select truncate(3.14159, 2) + truncate(3.14159, 2) | +============================ + 3.140000000000000 | + +taos> select truncate(100.9876, 2) + truncate(100.9876, 2) | +============================ + 100.980000000000004 | + +taos> select truncate(99999999999999.9999, 2) + truncate(99999999999999.9999, 2) | +=================================== + 1.000000000000000e+14 | + +taos> select truncate(-5.678, 2) + truncate(-5.678, 2) | +============================ + -5.670000000000000 | + +taos> select truncate(voltage, 2) from ts_4893.meters limit 1 + truncate(voltage, 2) | +======================= + 221 | + +taos> select truncate(current, 1) from ts_4893.meters limit 1 + truncate(current, 1) | +======================= + 10.6000004 | + +taos> select truncate(phase, 3) from ts_4893.meters limit 1 + truncate(phase, 3) | +======================= + 0.5080000 | + +taos> select truncate(voltage + current, 2) from ts_4893.meters limit 1 + truncate(voltage + current, 2) | +================================= + 2.316400000000000e+02 | + +taos> select truncate(voltage, -1) from ts_4893.meters limit 1 + truncate(voltage, -1) | +======================== + 220 | + +taos> select round(truncate(voltage, 1), 2) from ts_4893.meters limit 1 + round(truncate(voltage, 1), 2) | +================================= + 221 | + +taos> select truncate(abs(current), 1) from ts_4893.meters limit 1 + truncate(abs(current), 1) | +============================ + 1.0600000e+01 | + +taos> select truncate(exp(phase), 2) from ts_4893.meters limit 1 + truncate(exp(phase), 2) | +============================ + 1.660000000000000 | + +taos> select truncate(log(current), 1) from ts_4893.meters limit 1 + truncate(log(current), 1) | +============================ + 2.300000000000000 | + diff --git a/tests/army/query/function/ans/varpop.csv b/tests/army/query/function/ans/varpop.csv index d621d013fd..7cfb67dbea 100644 --- a/tests/army/query/function/ans/varpop.csv +++ b/tests/army/query/function/ans/varpop.csv @@ -1,37 +1,128 @@ -1.332500071133753 -0.702702307045610 -0.703315838252072 -0.705108647169672 -0.705108647169672 -0.706550935286583 -0.713306900568867 -0.716868311383919 -0.717430738826275 -0.717718552465788 -0.719483293517451 -8333333.250000000000000 -21.250000000000000 -70.000000000000000 -70.000000000000000 -70.000000000000000 -70.000000000000000 -65.250000000000000 -70.000000000000000 -70.000000000000000 -70.000000000000000 -70.000000000000000 -8165850.000000000000000 -21.250000000000000 -30.000000000000000 -65.250000000000000 -65.250000000000000 -65.250000000000000 -65.250000000000000 -65.250000000000000 -65.250000000000000 -65.250000000000000 -65.250000000000000 -8333333.250000000000000 -8333333.250000000000000 -1.332500071133751 -1.332500071133751 + +taos> select VAR_POP(current) from ts_4893.meters + var_pop(current) | +============================ + 1.332500071133751 | + +taos> select VAR_POP(current) from ts_4893.meters interval(1d) order by 1 limit 10 + var_pop(current) | +============================ + 0.702702307045612 | + 0.703315838252067 | + 0.705108647169666 | + 0.705108647169666 | + 0.706550935286586 | + 0.713306900568867 | + 0.716868311383919 | + 0.717430738826280 | + 0.717718552465783 | + 0.719483293517456 | + +taos> select VAR_POP(id) from ts_4893.meters + var_pop(id) | +============================ + 8333333.250000000000000 | + +taos> select VAR_POP(id) from ts_4893.meters interval(1d) limit 10 + var_pop(id) | +============================ + 21.250000000000000 | + 70.000000000000000 | + 70.000000000000000 | + 70.000000000000000 | + 70.000000000000000 | + 65.250000000000000 | + 70.000000000000000 | + 70.000000000000000 | + 70.000000000000000 | + 70.000000000000000 | + +taos> select VAR_POP(id) from ts_4893.meters where id > 100 + var_pop(id) | +============================ + 8165850.000000000000000 | + +taos> select VAR_POP(id) from ts_4893.meters interval(1d) order by 1 limit 10 + var_pop(id) | +============================ + 21.250000000000000 | + 30.000000000000000 | + 65.250000000000000 | + 65.250000000000000 | + 65.250000000000000 | + 65.250000000000000 | + 65.250000000000000 | + 65.250000000000000 | + 65.250000000000000 | + 65.250000000000000 | + +taos> select var_pop(null) from ts_4893.meters + var_pop(null) | +============================ + NULL | + +taos> select var_pop(id) from ts_4893.d0 + var_pop(id) | +============================ + 8333333.250000000000000 | + +taos> select var_pop(current) from ts_4893.d0 + var_pop(current) | +============================ + 1.332500071133751 | + +taos> select var_pop(voltage) from ts_4893.meters + var_pop(voltage) | +============================ + 8.274020439996093 | + +taos> select var_pop(voltage) from ts_4893.meters where voltage is not null + var_pop(voltage) | +============================ + 8.274020439996093 | + +taos> select var_pop(phase) from ts_4893.meters + var_pop(phase) | +============================ + 0.083287338468169 | + +taos> select var_pop(phase) from ts_4893.meters where ts between '2023-01-01 00:00:00' and '2023-12-31 23:59:59' + var_pop(phase) | +============================ + 0.082987411872200 | + +taos> select var_pop(total_voltage) from (select sum(voltage) as total_voltage from ts_4893.meters group by location) + var_pop(total_voltage) | +============================ + 0.000000000000000 | + +taos> select round(var_pop(current), 2) from ts_4893.meters + round(var_pop(current), 2) | +============================= + 1.330000000000000e+00 | + +taos> select pow(var_pop(current), 2) from ts_4893.meters + pow(var_pop(current), 2) | +============================ + 1.775556439571451 | + +taos> select log(var_pop(voltage) + 1) from ts_4893.meters + log(var_pop(voltage) + 1) | +============================ + 2.227216989977633 | + +taos> select groupid, var_pop(voltage) from ts_4893.meters group by groupid order by groupid + groupid | var_pop(voltage) | +====================================== + 1 | 8.274020439996093 | + +taos> select location, var_pop(current) from ts_4893.meters group by location order by location + location | var_pop(current) | +================================================= + beijing | 1.332500071133751 | + +taos> select location, var_pop(voltage) from ts_4893.meters group by location order by location + location | var_pop(voltage) | +================================================= + beijing | 8.274020439996093 | + diff --git a/tests/army/query/function/ans/week.csv b/tests/army/query/function/ans/week.csv index 3a127f2feb..650d4aacfc 100644 --- a/tests/army/query/function/ans/week.csv +++ b/tests/army/query/function/ans/week.csv @@ -1,174 +1,565 @@ -0 -0 -1 -52 -1 -1 -0 -1 -52 -0 -0 -0 -52 -53 -0 -0 -53 -52 -0 -0 -1 -52 -1 -0 -0 -53 -52 -52 -52 -53 -52 -53 -52 -52 -52 -52 -1 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -4 -3 -4 -3 -3 -3 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -0 -0 -0 -52 -52 -0 -0 -52 -52 -3 -52 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 + +taos> select WEEK('2020-01-01 00:00:00') + week('2020-01-01 00:00:00') | +============================== + 0 | + +taos> select WEEK('2020-01-01 00:00:00', 0) + week('2020-01-01 00:00:00', 0) | +================================= + 0 | + +taos> select WEEK('2020-01-01 00:00:00', 1) + week('2020-01-01 00:00:00', 1) | +================================= + 1 | + +taos> select WEEK('2020-01-01 00:00:00', 2) + week('2020-01-01 00:00:00', 2) | +================================= + 52 | + +taos> select WEEK('2020-01-01 00:00:00', 3) + week('2020-01-01 00:00:00', 3) | +================================= + 1 | + +taos> select WEEK('2020-01-01 00:00:00', 4) + week('2020-01-01 00:00:00', 4) | +================================= + 1 | + +taos> select WEEK('2020-01-01 00:00:00', 5) + week('2020-01-01 00:00:00', 5) | +================================= + 0 | + +taos> select WEEK('2020-01-01 00:00:00', 6) + week('2020-01-01 00:00:00', 6) | +================================= + 1 | + +taos> select WEEK('2020-01-01 00:00:00', 7) + week('2020-01-01 00:00:00', 7) | +================================= + 52 | + +taos> select WEEK('2021-01-01 00:00:00') + week('2021-01-01 00:00:00') | +============================== + 0 | + +taos> select WEEK('2021-01-01 00:00:00', 0) + week('2021-01-01 00:00:00', 0) | +================================= + 0 | + +taos> select WEEK('2021-01-01 00:00:00', 1) + week('2021-01-01 00:00:00', 1) | +================================= + 0 | + +taos> select WEEK('2021-01-01 00:00:00', 2) + week('2021-01-01 00:00:00', 2) | +================================= + 52 | + +taos> select WEEK('2021-01-01 00:00:00', 3) + week('2021-01-01 00:00:00', 3) | +================================= + 53 | + +taos> select WEEK('2021-01-01 00:00:00', 4) + week('2021-01-01 00:00:00', 4) | +================================= + 0 | + +taos> select WEEK('2021-01-01 00:00:00', 5) + week('2021-01-01 00:00:00', 5) | +================================= + 0 | + +taos> select WEEK('2021-01-01 00:00:00', 6) + week('2021-01-01 00:00:00', 6) | +================================= + 53 | + +taos> select WEEK('2021-01-01 00:00:00', 7) + week('2021-01-01 00:00:00', 7) | +================================= + 52 | + +taos> select WEEK('1998-01-01 00:00:00') + week('1998-01-01 00:00:00') | +============================== + 0 | + +taos> select WEEK('1998-01-01 00:00:00', 0) + week('1998-01-01 00:00:00', 0) | +================================= + 0 | + +taos> select WEEK('1998-01-01 00:00:00', 1) + week('1998-01-01 00:00:00', 1) | +================================= + 1 | + +taos> select WEEK('1998-01-01 00:00:00', 2) + week('1998-01-01 00:00:00', 2) | +================================= + 52 | + +taos> select WEEK('1998-01-01 00:00:00', 3) + week('1998-01-01 00:00:00', 3) | +================================= + 1 | + +taos> select WEEK('1998-01-01 00:00:00', 4) + week('1998-01-01 00:00:00', 4) | +================================= + 0 | + +taos> select WEEK('1998-01-01 00:00:00', 5) + week('1998-01-01 00:00:00', 5) | +================================= + 0 | + +taos> select WEEK('1998-01-01 00:00:00', 6) + week('1998-01-01 00:00:00', 6) | +================================= + 53 | + +taos> select WEEK('1998-01-01 00:00:00', 7) + week('1998-01-01 00:00:00', 7) | +================================= + 52 | + +taos> select WEEK('1998-12-31 00:00:00') + week('1998-12-31 00:00:00') | +============================== + 52 | + +taos> select WEEK('1998-12-31 00:00:00', 0) + week('1998-12-31 00:00:00', 0) | +================================= + 52 | + +taos> select WEEK('1998-12-31 00:00:00', 1) + week('1998-12-31 00:00:00', 1) | +================================= + 53 | + +taos> select WEEK('1998-12-31 00:00:00', 2) + week('1998-12-31 00:00:00', 2) | +================================= + 52 | + +taos> select WEEK('1998-12-31 00:00:00', 3) + week('1998-12-31 00:00:00', 3) | +================================= + 53 | + +taos> select WEEK('1998-12-31 00:00:00', 4) + week('1998-12-31 00:00:00', 4) | +================================= + 52 | + +taos> select WEEK('1998-12-31 00:00:00', 5) + week('1998-12-31 00:00:00', 5) | +================================= + 52 | + +taos> select WEEK('1998-12-31 00:00:00', 6) + week('1998-12-31 00:00:00', 6) | +================================= + 52 | + +taos> select WEEK('1998-12-31 00:00:00', 7) + week('1998-12-31 00:00:00', 7) | +================================= + 52 | + +taos> select WEEK('2000-01-06 00:00:00') + week('2000-01-06 00:00:00') | +============================== + 1 | + +taos> select WEEK('2000-01-06 00:00:00', 0) + week('2000-01-06 00:00:00', 0) | +================================= + 1 | + +taos> select WEEK('2000-01-06 00:00:00', 1) + week('2000-01-06 00:00:00', 1) | +================================= + 1 | + +taos> select WEEK('2000-01-06 00:00:00', 2) + week('2000-01-06 00:00:00', 2) | +================================= + 1 | + +taos> select WEEK('2000-01-06 00:00:00', 3) + week('2000-01-06 00:00:00', 3) | +================================= + 1 | + +taos> select WEEK('2000-01-06 00:00:00', 4) + week('2000-01-06 00:00:00', 4) | +================================= + 1 | + +taos> select WEEK('2000-01-06 00:00:00', 5) + week('2000-01-06 00:00:00', 5) | +================================= + 1 | + +taos> select WEEK('2000-01-06 00:00:00', 6) + week('2000-01-06 00:00:00', 6) | +================================= + 1 | + +taos> select WEEK('2000-01-06 00:00:00', 7) + week('2000-01-06 00:00:00', 7) | +================================= + 1 | + +taos> select WEEK(1725095657) + week(1725095657) | +======================== + 3 | + +taos> select WEEK(1725095657, 0) + week(1725095657, 0) | +======================== + 3 | + +taos> select WEEK(1725095657, 1) + week(1725095657, 1) | +======================== + 4 | + +taos> select WEEK(1725095657, 2) + week(1725095657, 2) | +======================== + 3 | + +taos> select WEEK(1725095657, 3) + week(1725095657, 3) | +======================== + 4 | + +taos> select WEEK(1725095657, 4) + week(1725095657, 4) | +======================== + 3 | + +taos> select WEEK(1725095657, 5) + week(1725095657, 5) | +======================== + 3 | + +taos> select WEEK(1725095657, 6) + week(1725095657, 6) | +======================== + 3 | + +taos> select WEEK(ts) from ts_4893.meters order by ts limit 10 + week(ts) | +======================== + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + +taos> select WEEK(ts, 0) from ts_4893.meters order by ts limit 10 + week(ts, 0) | +======================== + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + +taos> select WEEK(ts, 1) from ts_4893.meters order by ts limit 10 + week(ts, 1) | +======================== + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + +taos> select WEEK(ts, 2) from ts_4893.meters order by ts limit 10 + week(ts, 2) | +======================== + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + +taos> select WEEK(ts, 3) from ts_4893.meters order by ts limit 10 + week(ts, 3) | +======================== + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + +taos> select WEEK(ts, 4) from ts_4893.meters order by ts limit 10 + week(ts, 4) | +======================== + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + +taos> select WEEK(ts, 5) from ts_4893.meters order by ts limit 10 + week(ts, 5) | +======================== + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + +taos> select WEEK(ts, 6) from ts_4893.meters order by ts limit 10 + week(ts, 6) | +======================== + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + +taos> select WEEK(ts, 7) from ts_4893.meters order by ts limit 10 + week(ts, 7) | +======================== + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + +taos> select week(123) + week(123) | +======================== + 0 | + +taos> select week('2000-01-01',0) + week('2000-01-01',0) | +======================== + 0 | + +taos> select week('2000-01-01',1) + week('2000-01-01',1) | +======================== + 0 | + +taos> select week('2000-01-01',2) + week('2000-01-01',2) | +======================== + 52 | + +taos> select week('2000-01-01',3) + week('2000-01-01',3) | +======================== + 52 | + +taos> select week('2000-01-01',4) + week('2000-01-01',4) | +======================== + 0 | + +taos> select week('2000-01-01',5) + week('2000-01-01',5) | +======================== + 0 | + +taos> select week('2000-01-01',6) + week('2000-01-01',6) | +======================== + 52 | + +taos> select week('2000-01-01',7) + week('2000-01-01',7) | +======================== + 52 | + +taos> select week(1721020591,0) + week(1721020591,0) | +======================== + 3 | + +taos> select week('2020-01-01 00:00:00', 2) + week('2020-01-01 00:00:00', 2) | +================================= + 52 | + +taos> select week(ts) from ts_4893.d0 order by ts limit 10 + week(ts) | +======================== + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + +taos> select week(ts) from ts_4893.meters order by ts limit 10 + week(ts) | +======================== + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + +taos> select week(null, 0) + week(null, 0) | +======================== + NULL | + +taos> select week('abc') + week('abc') | +======================== + NULL | + +taos> select week('1721020591', 0) + week('1721020591', 0) | +======================== + NULL | + +taos> select week('1721020666229', 0) + week('1721020666229', 0) | +=========================== + NULL | + +taos> select week('20200101', 2) + week('20200101', 2) | +======================== + NULL | + +taos> select week('11/01/31', 2) + week('11/01/31', 2) | +======================== + NULL | + +taos> select week('20/01/01', 2) + week('20/01/01', 2) | +======================== + NULL | + +taos> select week('01/01/2020', 2) + week('01/01/2020', 2) | +======================== + NULL | + +taos> select week('01-JAN-20', 2) + week('01-JAN-20', 2) | +======================== + NULL | + +taos> select week('2023-09-25') + week('2023-09-25') | +======================== + 39 | + +taos> select week('9999-12-31') + week('9999-12-31') | +======================== + 52 | + +taos> select week('2024-02-29 00:00:00') + week('2024-02-29 00:00:00') | +============================== + 8 | + +taos> select week(ts) from ts_4893.meters limit 1 + week(ts) | +======================== + 28 | + +taos> select week(name) from ts_4893.meters limit 1 + week(name) | +======================== + NULL | + +taos> select week(ts), dayofweek(ts) from ts_4893.meters limit 1 + week(ts) | dayofweek(ts) | +================================================ + 28 | 6 | + +taos> select week(timediff(ts, '2024-10-10 09:36:50.172')) from ts_4893.meters limit 1 + week(timediff(ts, '2024-10-10 09:36:50.172')) | +================================================ + 39 | + +taos> select id, week(ts) from ts_4893.meters where id = 1 limit 1 + id | week(ts) | +====================================== + 1 | 28 | + +taos> select groupid, sum(week(ts)) from ts_4893.meters group by groupid order by groupid + groupid | sum(week(ts)) | +================================== + 1 | 2669490 | + diff --git a/tests/army/query/function/ans/weekday.csv b/tests/army/query/function/ans/weekday.csv index 39bec5315b..5b3dddebf6 100644 --- a/tests/army/query/function/ans/weekday.csv +++ b/tests/army/query/function/ans/weekday.csv @@ -1,100 +1,272 @@ -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -2 -2 -0 -2 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 + +taos> select WEEKDAY('2020-01-01 00:00:00') + weekday('2020-01-01 00:00:00') | +================================= + 2 | + +taos> select WEEKDAY('2020-01-01 00:00:00') from ts_4893.meters order by ts limit 10 + weekday('2020-01-01 00:00:00') | +================================= + 2 | + 2 | + 2 | + 2 | + 2 | + 2 | + 2 | + 2 | + 2 | + 2 | + +taos> select WEEKDAY('2021-01-01 00:00:00') + weekday('2021-01-01 00:00:00') | +================================= + 4 | + +taos> select WEEKDAY('2021-01-01 00:00:00') from ts_4893.meters order by ts limit 10 + weekday('2021-01-01 00:00:00') | +================================= + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + +taos> select WEEKDAY('1998-01-01 00:00:00') + weekday('1998-01-01 00:00:00') | +================================= + 3 | + +taos> select WEEKDAY('1998-01-01 00:00:00') from ts_4893.meters order by ts limit 10 + weekday('1998-01-01 00:00:00') | +================================= + 3 | + 3 | + 3 | + 3 | + 3 | + 3 | + 3 | + 3 | + 3 | + 3 | + +taos> select WEEKDAY('1998-12-31 00:00:00') + weekday('1998-12-31 00:00:00') | +================================= + 3 | + +taos> select WEEKDAY('1998-12-31 00:00:00') from ts_4893.meters order by ts limit 10 + weekday('1998-12-31 00:00:00') | +================================= + 3 | + 3 | + 3 | + 3 | + 3 | + 3 | + 3 | + 3 | + 3 | + 3 | + +taos> select WEEKDAY('2000-01-06 00:00:00') + weekday('2000-01-06 00:00:00') | +================================= + 3 | + +taos> select WEEKDAY('2000-01-06 00:00:00') from ts_4893.meters order by ts limit 10 + weekday('2000-01-06 00:00:00') | +================================= + 3 | + 3 | + 3 | + 3 | + 3 | + 3 | + 3 | + 3 | + 3 | + 3 | + +taos> select WEEKDAY(1725095657) + weekday(1725095657) | +======================== + 2 | + +taos> select WEEKDAY(1725095657) from ts_4893.meters order by ts limit 10 + weekday(1725095657) | +======================== + 2 | + 2 | + 2 | + 2 | + 2 | + 2 | + 2 | + 2 | + 2 | + 2 | + +taos> select WEEKDAY(ts) from ts_4893.meters order by ts limit 10 + weekday(ts) | +======================== + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + +taos> select weekday('2020-01-01') + weekday('2020-01-01') | +======================== + 2 | + +taos> select weekday(1721020591) + weekday(1721020591) | +======================== + 2 | + +taos> select weekday(1721020666229) + weekday(1721020666229) | +========================= + 0 | + +taos> select weekday('2020-01-01 00:00:00') + weekday('2020-01-01 00:00:00') | +================================= + 2 | + +taos> select weekday(ts) from ts_4893.d0 order by ts limit 10 + weekday(ts) | +======================== + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + +taos> select weekday(ts) from ts_4893.meters order by ts limit 10 + weekday(ts) | +======================== + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + +taos> select weekday(null) + weekday(null) | +======================== + NULL | + +taos> select weekday('abc') + weekday('abc') | +======================== + NULL | + +taos> select weekday('1721020591') + weekday('1721020591') | +======================== + NULL | + +taos> select weekday('1721020666229') + weekday('1721020666229') | +=========================== + NULL | + +taos> select weekday('01/01/2020') + weekday('01/01/2020') | +======================== + NULL | + +taos> select weekday('20200101') + weekday('20200101') | +======================== + NULL | + +taos> select weekday('20/01/01') + weekday('20/01/01') | +======================== + NULL | + +taos> select weekday('11/01/32') + weekday('11/01/32') | +======================== + NULL | + +taos> select weekday('01-JAN-20') + weekday('01-JAN-20') | +======================== + NULL | + +taos> select weekday('2024-02-29') + weekday('2024-02-29') | +======================== + 3 | + +taos> select weekday('2023-09-24') + weekday('2023-09-24') | +======================== + 6 | + +taos> select weekday('2023-09-25') + weekday('2023-09-25') | +======================== + 0 | + +taos> select weekday('9999-12-31') + weekday('9999-12-31') | +======================== + 4 | + +taos> select weekday(name) from ts_4893.meters limit 1 + weekday(name) | +======================== + NULL | + +taos> select weekday(ts), dayofweek(ts) from ts_4893.meters limit 1 + weekday(ts) | dayofweek(ts) | +================================================ + 4 | 6 | + +taos> select weekday(timediff(ts, '2024-10-10 09:36:50.172')) from ts_4893.meters limit 1 + weekday(timediff(ts, '2024-10-10 09:36:50.172')) | +=================================================== + 4 | + +taos> select weekday(ts) from ts_4893.meters limit 1 + weekday(ts) | +======================== + 4 | + +taos> select id, weekday(ts) from ts_4893.meters where id = 1 limit 1 + id | weekday(ts) | +====================================== + 1 | 4 | + +taos> select groupid, sum(weekday(ts)) from ts_4893.meters group by groupid order by groupid + groupid | sum(weekday(ts)) | +================================== + 1 | 300007 | + diff --git a/tests/army/query/function/ans/weekofyear.csv b/tests/army/query/function/ans/weekofyear.csv index 09c865e8b2..2d9697a4c5 100644 --- a/tests/army/query/function/ans/weekofyear.csv +++ b/tests/army/query/function/ans/weekofyear.csv @@ -1,99 +1,267 @@ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -53 -53 -53 -53 -53 -53 -53 -53 -53 -53 -53 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -53 -53 -53 -53 -53 -53 -53 -53 -53 -53 -53 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -1 -4 -29 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 -28 + +taos> select WEEKOFYEAR('2020-01-01 00:00:00') + weekofyear('2020-01-01 00:00:00') | +==================================== + 1 | + +taos> select WEEKOFYEAR('2020-01-01 00:00:00') from ts_4893.meters order by ts limit 10 + weekofyear('2020-01-01 00:00:00') | +==================================== + 1 | + 1 | + 1 | + 1 | + 1 | + 1 | + 1 | + 1 | + 1 | + 1 | + +taos> select WEEKOFYEAR('2021-01-01 00:00:00') + weekofyear('2021-01-01 00:00:00') | +==================================== + 53 | + +taos> select WEEKOFYEAR('2021-01-01 00:00:00') from ts_4893.meters order by ts limit 10 + weekofyear('2021-01-01 00:00:00') | +==================================== + 53 | + 53 | + 53 | + 53 | + 53 | + 53 | + 53 | + 53 | + 53 | + 53 | + +taos> select WEEKOFYEAR('1998-01-01 00:00:00') + weekofyear('1998-01-01 00:00:00') | +==================================== + 1 | + +taos> select WEEKOFYEAR('1998-01-01 00:00:00') from ts_4893.meters order by ts limit 10 + weekofyear('1998-01-01 00:00:00') | +==================================== + 1 | + 1 | + 1 | + 1 | + 1 | + 1 | + 1 | + 1 | + 1 | + 1 | + +taos> select WEEKOFYEAR('1998-12-31 00:00:00') + weekofyear('1998-12-31 00:00:00') | +==================================== + 53 | + +taos> select WEEKOFYEAR('1998-12-31 00:00:00') from ts_4893.meters order by ts limit 10 + weekofyear('1998-12-31 00:00:00') | +==================================== + 53 | + 53 | + 53 | + 53 | + 53 | + 53 | + 53 | + 53 | + 53 | + 53 | + +taos> select WEEKOFYEAR('2000-01-06 00:00:00') + weekofyear('2000-01-06 00:00:00') | +==================================== + 1 | + +taos> select WEEKOFYEAR('2000-01-06 00:00:00') from ts_4893.meters order by ts limit 10 + weekofyear('2000-01-06 00:00:00') | +==================================== + 1 | + 1 | + 1 | + 1 | + 1 | + 1 | + 1 | + 1 | + 1 | + 1 | + +taos> select WEEKOFYEAR(1725095657) + weekofyear(1725095657) | +========================= + 4 | + +taos> select WEEKOFYEAR(1725095657) from ts_4893.meters order by ts limit 10 + weekofyear(1725095657) | +========================= + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + 4 | + +taos> select WEEKOFYEAR(ts) from ts_4893.meters order by ts limit 10 + weekofyear(ts) | +======================== + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + +taos> select weekofyear('2020-01-01') + weekofyear('2020-01-01') | +=========================== + 1 | + +taos> select weekofyear(1721020666) + weekofyear(1721020666) | +========================= + 4 | + +taos> select weekofyear(1721020666229) + weekofyear(1721020666229) | +============================ + 29 | + +taos> select weekofyear(ts) from ts_4893.d0 order by ts limit 10 + weekofyear(ts) | +======================== + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + +taos> select weekofyear(ts) from ts_4893.meters order by ts limit 10 + weekofyear(ts) | +======================== + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + 28 | + +taos> select weekofyear(null) + weekofyear(null) | +======================== + NULL | + +taos> select weekofyear('1721020591') + weekofyear('1721020591') | +=========================== + NULL | + +taos> select weekofyear('1721020666229') + weekofyear('1721020666229') | +============================== + NULL | + +taos> select weekofyear('abc') + weekofyear('abc') | +======================== + NULL | + +taos> select weekofyear('01/01/2020') + weekofyear('01/01/2020') | +=========================== + NULL | + +taos> select weekofyear('20200101') + weekofyear('20200101') | +========================= + NULL | + +taos> select weekofyear('20/01/01') + weekofyear('20/01/01') | +========================= + NULL | + +taos> select weekofyear('11/01/31') + weekofyear('11/01/31') | +========================= + NULL | + +taos> select weekofyear('01-JAN-20') + weekofyear('01-JAN-20') | +========================== + NULL | + +taos> select weekofyear('2024-02-29') + weekofyear('2024-02-29') | +=========================== + 9 | + +taos> select weekofyear('2024-01-01') + weekofyear('2024-01-01') | +=========================== + 1 | + +taos> select weekofyear('2024-12-31') + weekofyear('2024-12-31') | +=========================== + 1 | + +taos> select weekofyear('9999-12-31') + weekofyear('9999-12-31') | +=========================== + 52 | + +taos> select weekofyear(name) from ts_4893.meters limit 1 + weekofyear(name) | +======================== + NULL | + +taos> select weekofyear(ts) from ts_4893.meters limit 1 + weekofyear(ts) | +======================== + 28 | + +taos> select weekofyear(ts), dayofweek(ts) from ts_4893.meters limit 1 + weekofyear(ts) | dayofweek(ts) | +================================================ + 28 | 6 | + +taos> select weekofyear(timediff(ts, '2024-10-10 09:36:50.172')) from ts_4893.meters limit 1 + weekofyear(timediff(ts, '2024-10-10 09:36:50.172')) | +====================================================== + 40 | + +taos> select id, weekofyear(ts) from ts_4893.meters where id = 1 limit 1 + id | weekofyear(ts) | +====================================== + 1 | 28 | + +taos> select groupid, sum(weekofyear(ts)) from ts_4893.meters group by groupid order by groupid + groupid | sum(weekofyear(ts)) | +================================== + 1 | 2720120 | + diff --git a/tests/army/query/function/in/ascii.in b/tests/army/query/function/in/ascii.in index 638fcd8d7c..dc4c229bd3 100644 --- a/tests/army/query/function/in/ascii.in +++ b/tests/army/query/function/in/ascii.in @@ -1,26 +1,43 @@ -select ASCII('hello'); -select ASCII('hello world'); -select ASCII('hello world!'); -select ASCII('hello,world.你好,世界。'); -select ASCII('北京涛思数据科技有限公司'); -select ASCII('hello') + 1; -select ASCII('hello') - 1; -select ASCII('hello') from ts_4893.meters limit 5; -select ASCII('hello') + 1 from ts_4893.meters limit 1; -select ASCII('hello') + ASCII('hello') from ts_4893.meters limit 1; -select ASCII(nch1) from ts_4893.meters order by ts limit 5; -select ASCII(var1) from ts_4893.meters order by ts limit 5; -select ASCII(concat(nch1,var1)) from ts_4893.meters order by ts limit 5; -select ASCII(cast(nch1 as varchar)) from ts_4893.meters order by ts limit 5; -select pow(ASCII(nch1), 2) from ts_4893.meters order by ts limit 5; -select sqrt(ASCII(nch1)) from ts_4893.meters order by ts limit 5; -select cast(ASCII(nch1) as int) from ts_4893.meters order by ts limit 5; -select ascii('taos'); -select ascii('t'); -select ascii('\''); -select ascii(name) from ts_4893.d0 order by ts limit 10; -select ascii(name) from ts_4893.meters order by ts limit 10; -select ascii(nch1) from ts_4893.d0 order by ts limit 10; -select ascii(nch1) from ts_4893.meters order by ts limit 10; -select ascii(var1) from ts_4893.d0 order by ts limit 10; -select ascii(var1) from ts_4893.meters order by ts limit 10; +select ASCII('hello') +select ASCII('hello world') +select ASCII('hello world!') +select ASCII('hello,world.你好,世界。') +select ASCII('北京涛思数据科技有限公司') +select ASCII('hello') + 1 +select ASCII('hello') - 1 +select ASCII('hello') from ts_4893.meters limit 5 +select ASCII('hello') + 1 from ts_4893.meters limit 1 +select ASCII('hello') + ASCII('hello') from ts_4893.meters limit 1 +select ASCII(nch1) from ts_4893.meters order by ts limit 5 +select ASCII(var1) from ts_4893.meters order by ts limit 5 +select ASCII(concat(nch1,var1)) from ts_4893.meters order by ts limit 5 +select ASCII(cast(nch1 as varchar)) from ts_4893.meters order by ts limit 5 +select pow(ASCII(nch1), 2) from ts_4893.meters order by ts limit 5 +select sqrt(ASCII(nch1)) from ts_4893.meters order by ts limit 5 +select cast(ASCII(nch1) as int) from ts_4893.meters order by ts limit 5 +select ascii('taos') +select ascii('t') +select ascii('\'') +select ascii(name) from ts_4893.d0 order by ts limit 10 +select ascii(name) from ts_4893.meters order by ts limit 10 +select ascii(nch1) from ts_4893.d0 order by ts limit 10 +select ascii(nch1) from ts_4893.meters order by ts limit 10 +select ascii(var1) from ts_4893.d0 order by ts limit 10 +select ascii(var1) from ts_4893.meters order by ts limit 10 +select ascii(null) +select ascii('0') +select ascii(' ') +select ascii('~') +select ascii('中') +select ascii('é') +select ascii('!@#') +select ascii('Hello') +select ascii('123abc') +select ascii(concat('A', 'B')) +select ascii(char(65)) +select ascii(upper('b')) +select ascii(trim(' A ')) +select name, ascii(name) from ts_4893.meters limit 1 +select name, ascii(substring(name, 1, 1)) from ts_4893.meters limit 1 +select nch1, ascii(nch1) from ts_4893.meters limit 1 +select var1, ascii(var1) from ts_4893.meters limit 1 diff --git a/tests/army/query/function/in/char.in b/tests/army/query/function/in/char.in index eb1d1b954e..9a0b2a284d 100644 --- a/tests/army/query/function/in/char.in +++ b/tests/army/query/function/in/char.in @@ -1,15 +1,20 @@ -select CHAR(77); -select CHAR(77.5); -select CHAR(100); -select CHAR(77) from ts_4893.meters limit 5; -select CHAR(77,78,79,80,81) from ts_4893.meters limit 5; -select CHAR(77*256+77) from ts_4893.meters limit 5; -select concat(CHAR(77),CHAR(78)) from ts_4893.meters limit 5; -select cast(CHAR(49) as int); -select CHAR(id + 77) from ts_4893.meters order by ts limit 5;; -select CONCAT(CHAR(id + 77),CHAR(id + 77),CHAR(id + 77)) from ts_4893.meters limit 5; -select CHAR(id+77, id+77, id+77, id+77, id+77) from ts_4893.meters limit 5; -select char(77); -select char(77 * 256 + 77); -select char('123'); -select char(77, NULL, '123'); +select CHAR(77) +select CHAR(77.5) +select CHAR(100) +select CHAR(77) from ts_4893.meters limit 5 +select CHAR(77,78,79,80,81) from ts_4893.meters limit 5 +select CHAR(77*256+77) from ts_4893.meters limit 5 +select concat(CHAR(77),CHAR(78)) from ts_4893.meters limit 5 +select cast(CHAR(49) as int) +select CHAR(id + 77) from ts_4893.meters order by ts limit 5; +select CONCAT(CHAR(id + 77),CHAR(id + 77),CHAR(id + 77)) from ts_4893.meters limit 5 +select CHAR(id+77, id+77, id+77, id+77, id+77) from ts_4893.meters limit 5 +select char(77) +select char(77 * 256 + 77) +select char('123') +select char(77, NULL, '123') +select char(null) +select char('ustc') +select char(65.99) +select char(65, 66, 67) +select char(72, 101, 108, 108, 111) diff --git a/tests/army/query/function/in/char_length.in b/tests/army/query/function/in/char_length.in index eb0e7424fc..31aafaea07 100644 --- a/tests/army/query/function/in/char_length.in +++ b/tests/army/query/function/in/char_length.in @@ -1,25 +1,38 @@ -select CHAR_LENGTH('hello'); -select CHAR_LENGTH('hello world'); -select CHAR_LENGTH('hello world!'); -select CHAR_LENGTH('hello,world.你好,世界。'); -select CHAR_LENGTH('北京涛思数据科技有限公司'); -select CHAR_LENGTH('hello') + 1; -select CHAR_LENGTH('hello') - 1; -select CHAR_LENGTH('hello') from ts_4893.meters limit 5; -select CHAR_LENGTH('hello') + 1 from ts_4893.meters limit 1; -select CHAR_LENGTH('hello') + CHAR_LENGTH('hello') from ts_4893.meters limit 1; -select CHAR_LENGTH(nch1) from ts_4893.meters order by ts limit 5; -select CHAR_LENGTH(var1) from ts_4893.meters order by ts limit 5; -select CHAR_LENGTH(concat(nch1,var1)) from ts_4893.meters order by ts limit 5; -select CHAR_LENGTH(cast(nch1 as varchar)) from ts_4893.meters order by ts limit 5; -select pow(CHAR_LENGTH(nch1), 2) from ts_4893.meters order by ts limit 5; -select sqrt(CHAR_LENGTH(nch1)) from ts_4893.meters order by ts limit 5; -select cast(CHAR_LENGTH(nch1) as int) from ts_4893.meters order by ts limit 5; -select char_length('taos'); -select char_length('涛思'); -select char_length('涛思taos'); -select char_length('tao\'s'); -select char_length(nch1) from ts_4893.d0 limit 10; -select char_length(nch1) from ts_4893.meters limit 10; -select char_length(var1) from ts_4893.d0 limit 10; -select char_length(var1) from ts_4893.meters limit 10; +select CHAR_LENGTH('hello') +select CHAR_LENGTH('hello world') +select CHAR_LENGTH('hello world!') +select CHAR_LENGTH('hello,world.你好,世界。') +select CHAR_LENGTH('北京涛思数据科技有限公司') +select CHAR_LENGTH('hello') + 1 +select CHAR_LENGTH('hello') - 1 +select CHAR_LENGTH('hello') from ts_4893.meters limit 5 +select CHAR_LENGTH('hello') + 1 from ts_4893.meters limit 1 +select CHAR_LENGTH('hello') + CHAR_LENGTH('hello') from ts_4893.meters limit 1 +select CHAR_LENGTH(nch1) from ts_4893.meters order by ts limit 5 +select CHAR_LENGTH(var1) from ts_4893.meters order by ts limit 5 +select CHAR_LENGTH(concat(nch1,var1)) from ts_4893.meters order by ts limit 5 +select CHAR_LENGTH(cast(nch1 as varchar)) from ts_4893.meters order by ts limit 5 +select pow(CHAR_LENGTH(nch1), 2) from ts_4893.meters order by ts limit 5 +select sqrt(CHAR_LENGTH(nch1)) from ts_4893.meters order by ts limit 5 +select cast(CHAR_LENGTH(nch1) as int) from ts_4893.meters order by ts limit 5 +select char_length('taos') +select char_length('涛思') +select char_length('涛思taos') +select char_length('tao\'s') +select char_length(nch1) from ts_4893.d0 limit 10 +select char_length(nch1) from ts_4893.meters limit 10 +select char_length(var1) from ts_4893.d0 limit 10 +select char_length(var1) from ts_4893.meters limit 10 +select char_length(null) +select char_length('') +select char_length('あいうえお') +select min(char_length(name)) from ts_4893.meters +select max(char_length(name)) from ts_4893.meters +select trim(name), char_length(trim(name)) from ts_4893.meters limit 1 +select upper(name), char_length(upper(name)) from ts_4893.meters limit 1 +select concat(name, ' - ', location), char_length(concat(name, ' - ', location)) from ts_4893.meters limit 1 +select substring(name, 1, 5), char_length(substring(name, 1, 5)) from ts_4893.meters limit 1 +select name, char_length(name) from ts_4893.meters limit 1 +select nch1, char_length(nch1) from ts_4893.meters limit 1 +select groupid, max(char_length(name)) from ts_4893.meters group by groupid order by ts +select location, avg(char_length(name)) from ts_4893.meters group by location order by location diff --git a/tests/army/query/function/in/dayofweek.in b/tests/army/query/function/in/dayofweek.in index 66d6599963..49be283860 100644 --- a/tests/army/query/function/in/dayofweek.in +++ b/tests/army/query/function/in/dayofweek.in @@ -1,18 +1,36 @@ -select DAYOFWEEK('2020-01-01 00:00:00'); -select DAYOFWEEK('2020-01-01 00:00:00') from ts_4893.meters order by ts limit 10; -select DAYOFWEEK('2021-01-01 00:00:00'); -select DAYOFWEEK('2021-01-01 00:00:00') from ts_4893.meters order by ts limit 10; -select DAYOFWEEK('1998-01-01 00:00:00'); -select DAYOFWEEK('1998-01-01 00:00:00') from ts_4893.meters order by ts limit 10; -select DAYOFWEEK('1998-12-31 00:00:00'); -select DAYOFWEEK('1998-12-31 00:00:00') from ts_4893.meters order by ts limit 10; -select DAYOFWEEK('2000-01-06 00:00:00'); -select DAYOFWEEK('2000-01-06 00:00:00') from ts_4893.meters order by ts limit 10; -select DAYOFWEEK(1725095657); -select DAYOFWEEK(1725095657) from ts_4893.meters order by ts limit 10; -select DAYOFWEEK(ts) from ts_4893.meters order by ts limit 10; -select dayofweek('2020-01-01'); -select dayofweek(1721020666); -select dayofweek(1721020666229); -select dayofweek(ts) from ts_4893.d0 order by ts limit 10; -select dayofweek(ts) from ts_4893.meters order by ts limit 10; +select DAYOFWEEK('2020-01-01 00:00:00') +select DAYOFWEEK('2020-01-01 00:00:00') from ts_4893.meters order by ts limit 10 +select DAYOFWEEK('2021-01-01 00:00:00') +select DAYOFWEEK('2021-01-01 00:00:00') from ts_4893.meters order by ts limit 10 +select DAYOFWEEK('1998-01-01 00:00:00') +select DAYOFWEEK('1998-01-01 00:00:00') from ts_4893.meters order by ts limit 10 +select DAYOFWEEK('1998-12-31 00:00:00') +select DAYOFWEEK('1998-12-31 00:00:00') from ts_4893.meters order by ts limit 10 +select DAYOFWEEK('2000-01-06 00:00:00') +select DAYOFWEEK('2000-01-06 00:00:00') from ts_4893.meters order by ts limit 10 +select DAYOFWEEK(1725095657) +select DAYOFWEEK(1725095657) from ts_4893.meters order by ts limit 10 +select DAYOFWEEK(ts) from ts_4893.meters order by ts limit 10 +select dayofweek(null) +select dayofweek('1721020591') +select dayofweek('1721020666229') +select dayofweek('abc') +select dayofweek('01/01/2020') +select dayofweek('20200101') +select dayofweek('20/01/01') +select dayofweek('11/01/31') +select dayofweek('01-JAN-20') +select dayofweek('2020-01-01') +select dayofweek(1721020666) +select dayofweek(1721020666229) +select dayofweek(ts) from ts_4893.d0 order by ts limit 10 +select dayofweek(ts) from ts_4893.meters order by ts limit 10 +select dayofweek('2024-02-29') +select dayofweek('2024-01-01') +select dayofweek('2024-12-31') +select dayofweek('9999-12-31') +select dayofweek(ts) from ts_4893.meters limit 1 +select dayofweek(name) from ts_4893.meters limit 1 +select dayofweek(timediff(ts, '2024-10-10 09:36:50.172')) from ts_4893.meters limit 1 +select id, dayofweek(ts) from ts_4893.meters where id = 1 limit 1 +select groupid, sum(dayofweek(ts)) from ts_4893.meters group by groupid order by groupid diff --git a/tests/army/query/function/in/degrees.in b/tests/army/query/function/in/degrees.in index 54672c0722..14c7d7eeb1 100644 --- a/tests/army/query/function/in/degrees.in +++ b/tests/army/query/function/in/degrees.in @@ -1,32 +1,47 @@ -select DEGREES(0); -select DEGREES(1); -select DEGREES(1.5); -select DEGREES(100); -select DEGREES(-1); -select DEGREES(-1.5); -select DEGREES(-100); -select DEGREES(1) + 1; -select DEGREES(1) - 1; -select DEGREES(1) * 1; -select DEGREES(1) / 1; -select DEGREES(1) from ts_4893.meters limit 5; -select DEGREES(1) + 1 from ts_4893.meters limit 1; -select DEGREES(1) - 1 from ts_4893.meters limit 1; -select DEGREES(1) * 2 from ts_4893.meters limit 1; -select DEGREES(1) / 2 from ts_4893.meters limit 1; -select DEGREES(2) + DEGREES(1) from ts_4893.meters limit 1; -select DEGREES(2) - DEGREES(1) from ts_4893.meters limit 1; -select DEGREES(2) * DEGREES(1) from ts_4893.meters limit 1; -select DEGREES(2) / DEGREES(1) from ts_4893.meters limit 1; -select DEGREES(1) + id from ts_4893.meters order by ts limit 5; -select DEGREES(id) + id from ts_4893.meters order by ts limit 5; -select DEGREES(abs(10)); -select DEGREES(PI()); -select abs(DEGREES(10)); -select pow(DEGREES(10), 2); -select sqrt(DEGREES(10)); -select cast(DEGREES(10) as int); -select DEGREES(sqrt(id)) from ts_4893.meters order by ts limit 5; -select degrees(pi()); -select degrees(current) from ts_4893.d0 order by ts limit 10; -select degrees(current) from ts_4893.meters order by ts limit 10; +select DEGREES(0) +select DEGREES(1) +select DEGREES(1.5) +select DEGREES(100) +select DEGREES(-1) +select DEGREES(-1.5) +select DEGREES(-100) +select DEGREES(1) + 1 +select DEGREES(1) - 1 +select DEGREES(1) * 1 +select DEGREES(1) / 1 +select DEGREES(1) from ts_4893.meters limit 5 +select DEGREES(1) + 1 from ts_4893.meters limit 1 +select DEGREES(1) - 1 from ts_4893.meters limit 1 +select DEGREES(1) * 2 from ts_4893.meters limit 1 +select DEGREES(1) / 2 from ts_4893.meters limit 1 +select DEGREES(2) + DEGREES(1) from ts_4893.meters limit 1 +select DEGREES(2) - DEGREES(1) from ts_4893.meters limit 1 +select DEGREES(2) * DEGREES(1) from ts_4893.meters limit 1 +select DEGREES(2) / DEGREES(1) from ts_4893.meters limit 1 +select DEGREES(1) + id from ts_4893.meters order by ts limit 5 +select DEGREES(id) + id from ts_4893.meters order by ts limit 5 +select DEGREES(abs(10)) +select DEGREES(PI()) +select abs(DEGREES(10)) +select pow(DEGREES(10), 2) +select sqrt(DEGREES(10)) +select cast(DEGREES(10) as int) +select DEGREES(sqrt(id)) from ts_4893.meters order by ts limit 5 +select degrees(pi()) +select degrees(current) from ts_4893.d0 order by ts limit 10 +select degrees(current) from ts_4893.meters order by ts limit 10 +select degrees(null) +select degrees(-5) +select degrees(3.14) +select degrees(2*pi()) +select degrees(pi()/2) +select degrees(-pi()/2) +select degrees(1000000) +select degrees(sin(1)) +select degrees(cos(1)) +select degrees(tan(1)) +select degrees(radians(90)) +select degrees(atan(1)) +select degrees(phase) from ts_4893.meters limit 1 +select degrees(current) from ts_4893.meters limit 1 +select degrees(voltage) from ts_4893.meters limit 1 diff --git a/tests/army/query/function/in/exp.in b/tests/army/query/function/in/exp.in index 1af149d9cc..e89e13fcb2 100755 --- a/tests/army/query/function/in/exp.in +++ b/tests/army/query/function/in/exp.in @@ -1,32 +1,45 @@ -select EXP(0); -select EXP(1); -select EXP(1.5); -select EXP(100); -select EXP(-1); -select EXP(-1.5); -select EXP(-100); -select EXP(1) + 1; -select EXP(1) - 1; -select EXP(1) * 1; -select EXP(1) / 1; -select exp(1) from ts_4893.meters limit 5; -select exp(1) + 1 from ts_4893.meters limit 1; -select exp(1) - 1 from ts_4893.meters limit 1; -select exp(1) * 2 from ts_4893.meters limit 1; -select exp(1) / 2 from ts_4893.meters limit 1; -select exp(2) + exp(1) from ts_4893.meters limit 1; -select exp(2) - exp(1) from ts_4893.meters limit 1; -select exp(2) * exp(1) from ts_4893.meters limit 1; -select exp(2) / exp(1) from ts_4893.meters limit 1; -select exp(1) + id from ts_4893.meters order by ts limit 5; -select exp(id) + id from ts_4893.meters order by ts limit 5; -select abs(EXP(10)); -select pow(EXP(10), 2); -select sqrt(EXP(10)); -select cast(EXP(10) as int); -select EXP(sqrt(id)) from ts_4893.meters order by ts limit 5; -select EXP(EXP(EXP(EXP(0)))); -select exp(2); -select exp(0.5); -select exp(current) from ts_4893.d0 order by ts limit 10; -select exp(current) from ts_4893.meters order by ts limit 10; +select EXP(0) +select EXP(1) +select EXP(1.5) +select EXP(100) +select EXP(-1) +select EXP(-1.5) +select EXP(-100) +select EXP(1) + 1 +select EXP(1) - 1 +select EXP(1) * 1 +select EXP(1) / 1 +select exp(1) from ts_4893.meters limit 5 +select exp(1) + 1 from ts_4893.meters limit 1 +select exp(1) - 1 from ts_4893.meters limit 1 +select exp(1) * 2 from ts_4893.meters limit 1 +select exp(1) / 2 from ts_4893.meters limit 1 +select exp(2) + exp(1) from ts_4893.meters limit 1 +select exp(2) - exp(1) from ts_4893.meters limit 1 +select exp(2) * exp(1) from ts_4893.meters limit 1 +select exp(2) / exp(1) from ts_4893.meters limit 1 +select exp(1) + id from ts_4893.meters order by ts limit 5 +select exp(id) + id from ts_4893.meters order by ts limit 5 +select abs(EXP(10)) +select pow(EXP(10), 2) +select sqrt(EXP(10)) +select cast(EXP(10) as int) +select EXP(sqrt(id)) from ts_4893.meters order by ts limit 5 +select EXP(EXP(EXP(EXP(0)))) +select exp(2) +select exp(0.5) +select exp(current) from ts_4893.d0 order by ts limit 10 +select exp(current) from ts_4893.meters order by ts limit 10 +select exp(null) +select exp(100000) +select exp(-1000) +select exp(-9999999999) +select exp(0.0001) +select exp(pi()) +select exp(voltage) from ts_4893.meters limit 1 +select exp(current) from ts_4893.meters limit 1 +select exp(phase) from ts_4893.meters limit 1 +select exp(voltage + current) from ts_4893.meters limit 1 +select exp(abs(current)) from ts_4893.meters limit 1 +select exp(log(voltage)) from ts_4893.meters limit 1 +select round(exp(voltage), 2) from ts_4893.meters limit 1 diff --git a/tests/army/query/function/in/ln.in b/tests/army/query/function/in/ln.in index eb3f3281d5..d0c5cc0744 100755 --- a/tests/army/query/function/in/ln.in +++ b/tests/army/query/function/in/ln.in @@ -1,29 +1,46 @@ -select LN(100); -select LN(1.5); -select LN(100); -select LN(100) + 1; -select LN(100) - 1; -select LN(100) * 1; -select LN(100) / 1; -select LN(100) from ts_4893.meters limit 5; -select LN(100) + 1 from ts_4893.meters limit 1; -select LN(100) - 1 from ts_4893.meters limit 1; -select LN(100) * 2 from ts_4893.meters limit 1; -select LN(100) / 2 from ts_4893.meters limit 1; -select LN(2) + LN(100) from ts_4893.meters limit 1; -select LN(2) - LN(100) from ts_4893.meters limit 1; -select LN(2) * LN(100) from ts_4893.meters limit 1; -select LN(2) / LN(100) from ts_4893.meters limit 1; -select LN(100) + id from ts_4893.meters order by ts limit 5; -select LN(id + 1) + id from ts_4893.meters order by ts limit 5; -select abs(LN(10)); -select pow(LN(10), 2); -select sqrt(LN(10)); -select cast(LN(10) as int); -select LN(sqrt(id) + 1) from ts_4893.meters order by ts limit 5; -select LN(LN(LN(LN(10000)))); -select LN(EXP(2)); -select ln(10); -select ln(pi()); -select ln(current) from ts_4893.d0 order by ts limit 10; -select ln(current) from ts_4893.meters order by ts limit 10; +select LN(100) +select LN(1.5) +select LN(100) +select LN(100) + 1 +select LN(100) - 1 +select LN(100) * 1 +select LN(100) / 1 +select LN(100) from ts_4893.meters limit 5 +select LN(100) + 1 from ts_4893.meters limit 1 +select LN(100) - 1 from ts_4893.meters limit 1 +select LN(100) * 2 from ts_4893.meters limit 1 +select LN(100) / 2 from ts_4893.meters limit 1 +select LN(2) + LN(100) from ts_4893.meters limit 1 +select LN(2) - LN(100) from ts_4893.meters limit 1 +select LN(2) * LN(100) from ts_4893.meters limit 1 +select LN(2) / LN(100) from ts_4893.meters limit 1 +select LN(100) + id from ts_4893.meters order by ts limit 5 +select LN(id + 1) + id from ts_4893.meters order by ts limit 5 +select ln(null) +select ln(0) +select ln(-5) +select abs(LN(10)) +select pow(LN(10), 2) +select sqrt(LN(10)) +select cast(LN(10) as int) +select LN(sqrt(id) + 1) from ts_4893.meters order by ts limit 5 +select LN(LN(LN(LN(10000)))) +select LN(EXP(2)) +select ln(10) +select ln(pi()) +select ln(current) from ts_4893.d0 order by ts limit 10 +select ln(current) from ts_4893.meters order by ts limit 10 +select ln(1) +select ln(20) +select ln(100) +select ln(99999999999999) +select ln(0.1) +select ln(2.718) +select ln(exp(1)) +select ln(voltage) from ts_4893.meters where voltage > 0 limit 1 +select ln(current) from ts_4893.meters where current > 0 limit 1 +select ln(phase) from ts_4893.meters where phase > 0 limit 1 +select ln(exp(voltage)) from ts_4893.meters where voltage > 0 limit 1 +select ln(abs(current)) from ts_4893.meters where current != 0 limit 1 +select ln(sqrt(phase)) from ts_4893.meters where phase >= 0 limit 1 +select ln(log(current)) from ts_4893.meters where current > 1 limit 1 diff --git a/tests/army/query/function/in/max.in b/tests/army/query/function/in/max.in index 8415983989..efd4620f7b 100644 --- a/tests/army/query/function/in/max.in +++ b/tests/army/query/function/in/max.in @@ -1,16 +1,28 @@ -select MAX(id) from ts_4893.meters; -select MAX(current) from ts_4893.meters; -select MAX(voltage) from ts_4893.meters; -select MAX(name) from ts_4893.meters; -select MAX(nch1) from ts_4893.meters; -select MAX(nch2) from ts_4893.meters; -select MAX(var1) from ts_4893.meters; -select MAX(var2) from ts_4893.meters; -select MAX(id) from ts_4893.meters interval(60d); -select MAX(current) from ts_4893.meters interval(60d); -select MAX(voltage) from ts_4893.meters interval(60d); -select MAX(name) from ts_4893.meters interval(60d); -select MAX(nch1) from ts_4893.meters interval(60d); -select MAX(nch2) from ts_4893.meters interval(60d); -select MAX(var1) from ts_4893.meters interval(60d); -select MAX(var2) from ts_4893.meters interval(60d); \ No newline at end of file +select MAX(current) from ts_4893.meters +select MAX(voltage) from ts_4893.meters +select MAX(name) from ts_4893.meters +select MAX(nch1) from ts_4893.meters +select MAX(nch2) from ts_4893.meters +select MAX(var1) from ts_4893.meters +select MAX(var2) from ts_4893.meters +select MAX(id) from ts_4893.meters interval(60d) +select MAX(current) from ts_4893.meters interval(60d) +select MAX(voltage) from ts_4893.meters interval(60d) +select MAX(name) from ts_4893.meters interval(60d) +select MAX(nch1) from ts_4893.meters interval(60d) +select MAX(nch2) from ts_4893.meters interval(60d) +select MAX(var1) from ts_4893.meters interval(60d) +select MAX(var2) from ts_4893.meters interval(60d) +select max(null) from ts_4893.meters +select max(id) from ts_4893.meters +select max(id) from ts_4893.meters where id > 0 +select max(id) from ts_4893.meters where id <= 0 +select max(phase) from ts_4893.meters where ts between '2023-01-01 00:00:00' and '2023-12-31 23:59:59' +select max(voltage) from ts_4893.meters where voltage is not null +select max(total_voltage) from (select sum(voltage) as total_voltage from ts_4893.meters group by location) +select round(max(current), 2) from ts_4893.meters +select pow(max(current), 2) from ts_4893.meters +select log(max(voltage) + 1) from ts_4893.meters +select groupid, max(voltage) from ts_4893.meters group by groupid order by groupid +select location, max(id) from ts_4893.meters group by location order by location +select location, max(current) from ts_4893.meters group by location order by location diff --git a/tests/army/query/function/in/min.in b/tests/army/query/function/in/min.in index 5f6c516bd7..910b8cc7bd 100644 --- a/tests/army/query/function/in/min.in +++ b/tests/army/query/function/in/min.in @@ -1,16 +1,28 @@ -select MIN(id) from ts_4893.meters; -select MIN(current) from ts_4893.meters; -select MIN(voltage) from ts_4893.meters; -select MIN(name) from ts_4893.meters; -select MIN(nch1) from ts_4893.meters; -select MIN(nch2) from ts_4893.meters; -select MIN(var1) from ts_4893.meters; -select MIN(var2) from ts_4893.meters; -select MIN(id) from ts_4893.meters interval(60d); -select MIN(current) from ts_4893.meters interval(60d); -select MIN(voltage) from ts_4893.meters interval(60d); -select MIN(name) from ts_4893.meters interval(60d); -select MIN(nch1) from ts_4893.meters interval(60d); -select MIN(nch2) from ts_4893.meters interval(60d); -select MIN(var1) from ts_4893.meters interval(60d); -select MIN(var2) from ts_4893.meters interval(60d); \ No newline at end of file +select MIN(id) from ts_4893.meters +select MIN(current) from ts_4893.meters +select MIN(voltage) from ts_4893.meters +select MIN(name) from ts_4893.meters +select MIN(nch1) from ts_4893.meters +select MIN(nch2) from ts_4893.meters +select MIN(var1) from ts_4893.meters +select MIN(var2) from ts_4893.meters +select MIN(id) from ts_4893.meters interval(60d) +select MIN(current) from ts_4893.meters interval(60d) +select MIN(voltage) from ts_4893.meters interval(60d) +select MIN(name) from ts_4893.meters interval(60d) +select MIN(nch1) from ts_4893.meters interval(60d) +select MIN(nch2) from ts_4893.meters interval(60d) +select MIN(var1) from ts_4893.meters interval(60d) +select MIN(var2) from ts_4893.meters interval(60d) +select min(null) from ts_4893.meters +select min(id) from ts_4893.meters where id > 0 +select min(id) from ts_4893.meters where id <= 0 +select min(phase) from ts_4893.meters where ts between '2023-01-01 00:00:00' and '2023-12-31 23:59:59' +select min(voltage) from ts_4893.meters where voltage is not null +select min(total_voltage) from (select sum(voltage) as total_voltage from ts_4893.meters group by location) +select round(min(current), 2) from ts_4893.meters +select pow(min(current), 2) from ts_4893.meters +select log(min(voltage) + 1) from ts_4893.meters +select groupid, min(voltage) from ts_4893.meters group by groupid order by groupid +select location, min(current) from ts_4893.meters group by location order by location +select location, min(id) from ts_4893.meters group by location order by location diff --git a/tests/army/query/function/in/mod.in b/tests/army/query/function/in/mod.in index d335573cf4..331940a46f 100755 --- a/tests/army/query/function/in/mod.in +++ b/tests/army/query/function/in/mod.in @@ -1,18 +1,36 @@ -select MOD(10.55, 3); -select MOD(10.55, 2); -select MOD(10.55, 1); -select MOD(10.55, -1); -select MOD(10.55, -10); -select MOD(-10.55, 1); -select MOD(99, 1); -select MOD(10.55, 1) + 1; -select MOD(MOD(MOD(MOD(MOD(MOD(MOD(123.123456789, 9), 8), 7), 6), 5), 4), 3); -select MOD(MOD(MOD(MOD(MOD(MOD(MOD(123456789.123456789, -1), -2), -3), -4), -5), -6), -7); -select MOD(87654321.123456789, id + 1) from ts_4893.meters order by ts limit 10; -select MOD(current, id + 1) from ts_4893.meters order by ts limit 10; -select MOD(current, 1) from ts_4893.meters order by ts limit 10; -select MOD(sqrt(current), abs(id + 1)) from ts_4893.meters order by ts limit 10; -select mod(10, -3); -select mod(10, 3); -select mod(id, 3) from ts_4893.d0 order by ts limit 10; -select mod(id, 3) from ts_4893.meters order by ts limit 10; +select MOD(10.55, 3) +select MOD(10.55, 2) +select MOD(10.55, 1) +select MOD(10.55, -1) +select MOD(10.55, -10) +select MOD(-10.55, 1) +select MOD(99, 1) +select MOD(10.55, 1) + 1 +select MOD(MOD(MOD(MOD(MOD(MOD(MOD(123.123456789, 9), 8), 7), 6), 5), 4), 3) +select MOD(MOD(MOD(MOD(MOD(MOD(MOD(123456789.123456789, -1), -2), -3), -4), -5), -6), -7) +select MOD(87654321.123456789, id + 1) from ts_4893.meters order by ts limit 10 +select MOD(current, id + 1) from ts_4893.meters order by ts limit 10 +select MOD(current, 1) from ts_4893.meters order by ts limit 10 +select MOD(sqrt(current), abs(id + 1)) from ts_4893.meters order by ts limit 10 +select mod(10, -3) +select mod(10, 3) +select mod(id, 3) from ts_4893.d0 order by ts limit 10 +select mod(id, 3) from ts_4893.meters order by ts limit 10 +select mod(null, 2) +select mod(10, null) +select mod(10, 0) +select mod(-10, 0) +select mod(5, 0) +select mod(0, 1) +select mod(1, 1) +select mod(5, 2) +select mod(5, -3) +select mod(15, 4) +select mod(-5, 3) +select mod(voltage, 2) from ts_4893.meters limit 1 +select mod(current, 10) from ts_4893.meters limit 1 +select mod(current, log(100)) from ts_4893.meters limit 1 +select mod(phase, 4) from ts_4893.meters limit 1 +select mod(abs(voltage), 3) from ts_4893.meters limit 1 +select mod(phase, sqrt(16)) from ts_4893.meters limit 1 +select mod(round(voltage), 5) from ts_4893.meters limit 1 diff --git a/tests/army/query/function/in/pi.in b/tests/army/query/function/in/pi.in index dc5d24b655..fd1e3953c6 100644 --- a/tests/army/query/function/in/pi.in +++ b/tests/army/query/function/in/pi.in @@ -19,3 +19,19 @@ select sqrt(pi()) select cast(pi() as int) select pi() select substring_index(null, '.', 2) +select pi() + null +select pi() * 0 +select pi() / 0 +select pi() * 0.5 +select pi() * -1 +select pi() * name from ts_4893.meters limit 1 +select pi() * voltage from ts_4893.meters limit 1 +select pi() * phase * 2 from ts_4893.meters limit 1 +select round(pi(), 6) +select round(pi() * phase, 2) from ts_4893.meters limit 1 +select sqrt(pi() * voltage) from ts_4893.meters limit 1 +select sqrt(current / pi()) from ts_4893.meters limit 1 +select abs(pi() * phase) from ts_4893.meters limit 1 +select log(pi() * voltage) from ts_4893.meters limit 1 +select voltage / pi() from ts_4893.meters limit 1 +select id, case when voltage > 100 then pi() else pi() / 2 end from ts_4893.meters limit 1 diff --git a/tests/army/query/function/in/position.in b/tests/army/query/function/in/position.in index 7c682c5c80..088cf6b24c 100644 --- a/tests/army/query/function/in/position.in +++ b/tests/army/query/function/in/position.in @@ -1,40 +1,62 @@ -select POSITION('北' IN '北京涛思'); -select POSITION('涛思' IN '北京涛思'); -select POSITION('a' IN 'abcd'); -select POSITION('e' IN 'abcd'); -select POSITION('好,' IN 'hello,world.你好,世界。'); -select POSITION(',你' IN 'hello,world.你好,世界。'); -select POSITION('world' IN 'hello,world.你好,世界。'); -select POSITION('aaa' IN 'aaaaaaaaa'); -select POSITION(CONCAT('a','b','c') IN CONCAT('abc','def','ghi')); -select POSITION(CONCAT('a','b','d') IN CONCAT('abc','def','ghi')); -select POSITION(nch2 IN nch1) from ts_4893.meters where POSITION(nch2 IN nch1) != 0 order by ts limit 5; -select POSITION(nch2 IN nch1) from ts_4893.meters order by ts limit 5; -select POSITION(var2 IN var1) from ts_4893.meters where POSITION(var2 IN var1) != 0 order by ts limit 5; -select POSITION(var2 IN var1) from ts_4893.meters order by ts limit 5; -select POSITION(var2 IN nch1) from ts_4893.meters where POSITION(var2 IN nch1) != 0 order by ts limit 5; -select POSITION(var2 IN nch1) from ts_4893.meters order by ts limit 5; -select POSITION(nch2 IN var1) from ts_4893.meters where POSITION(nch2 IN var1) != 0 order by ts limit 5; -select POSITION(nch2 IN var1) from ts_4893.meters order by ts limit 5; -select POSITION('a' IN nch1) from ts_4893.meters where POSITION('a' IN nch1) != 0 order by ts limit 5; -select POSITION('a' IN var1) from ts_4893.meters where POSITION('a' IN var1) != 0 order by ts limit 5; -select POSITION('一' IN nch1) from ts_4893.meters where POSITION('一' IN nch1) != 0 order by ts limit 5; -select POSITION('一' IN var1) from ts_4893.meters where POSITION('一' IN var1) != 0 order by ts limit 5; -select POSITION(nch2 IN 'abcdefghijklmn') from ts_4893.meters where POSITION(nch2 IN 'abcdefghijklmn') != 0 order by ts limit 5; -select POSITION(var2 IN 'abcdefghijklmn') from ts_4893.meters where POSITION(var2 IN 'abcdefghijklmn') != 0 order by ts limit 5; -select POSITION(nch2 IN '一二三四五六七八九十') from ts_4893.meters where POSITION(nch2 IN '一二三四五六七八九十') != 0 order by ts limit 5; -select POSITION(var2 IN '一二三四五六七八九十') from ts_4893.meters where POSITION(var2 IN '一二三四五六七八九十') != 0 order by ts limit 5; -select ABS(POSITION('aaa' IN 'aaaaaaaaa')); -select POW(POSITION('aaa' IN 'aaaaaaaaa'), 2); -select position('t' in 'taos'); -select position('ustc' in 'taos'); -select position('' in ''); -select position('' in 'taos'); -select position(nch2 in nch1) from ts_4893.d0 order by ts limit 10; -select position(nch2 in nch1) from ts_4893.meters order by ts limit 10; -select position(nch2 in var1) from ts_4893.d0 order by ts limit 10; -select position(nch2 in var1) from ts_4893.meters order by ts limit 10; -select position(var2 in nch1) from ts_4893.d0 order by ts limit 10; -select position(var2 in nch1) from ts_4893.meters order by ts limit 10; -select position(var2 in var1) from ts_4893.d0 order by ts limit 10; -select position(var2 in var1) from ts_4893.meters order by ts limit 10; +select POSITION('北' IN '北京涛思') +select POSITION('涛思' IN '北京涛思') +select POSITION('a' IN 'abcd') +select POSITION('e' IN 'abcd') +select POSITION('好,' IN 'hello,world.你好,世界。') +select POSITION(',你' IN 'hello,world.你好,世界。') +select POSITION('world' IN 'hello,world.你好,世界。') +select POSITION('aaa' IN 'aaaaaaaaa') +select POSITION(CONCAT('a','b','c') IN CONCAT('abc','def','ghi')) +select POSITION(CONCAT('a','b','d') IN CONCAT('abc','def','ghi')) +select POSITION(nch2 IN nch1) from ts_4893.meters where POSITION(nch2 IN nch1) != 0 order by ts limit 5 +select POSITION(nch2 IN nch1) from ts_4893.meters order by ts limit 5 +select POSITION(var2 IN var1) from ts_4893.meters where POSITION(var2 IN var1) != 0 order by ts limit 5 +select POSITION(var2 IN var1) from ts_4893.meters order by ts limit 5 +select POSITION(var2 IN nch1) from ts_4893.meters where POSITION(var2 IN nch1) != 0 order by ts limit 5 +select POSITION(var2 IN nch1) from ts_4893.meters order by ts limit 5 +select POSITION(nch2 IN var1) from ts_4893.meters where POSITION(nch2 IN var1) != 0 order by ts limit 5 +select POSITION(nch2 IN var1) from ts_4893.meters order by ts limit 5 +select POSITION('a' IN nch1) from ts_4893.meters where POSITION('a' IN nch1) != 0 order by ts limit 5 +select POSITION('a' IN var1) from ts_4893.meters where POSITION('a' IN var1) != 0 order by ts limit 5 +select POSITION('一' IN nch1) from ts_4893.meters where POSITION('一' IN nch1) != 0 order by ts limit 5 +select POSITION('一' IN var1) from ts_4893.meters where POSITION('一' IN var1) != 0 order by ts limit 5 +select POSITION(nch2 IN 'abcdefghijklmn') from ts_4893.meters where POSITION(nch2 IN 'abcdefghijklmn') != 0 order by ts limit 5 +select POSITION(var2 IN 'abcdefghijklmn') from ts_4893.meters where POSITION(var2 IN 'abcdefghijklmn') != 0 order by ts limit 5 +select POSITION(nch2 IN '一二三四五六七八九十') from ts_4893.meters where POSITION(nch2 IN '一二三四五六七八九十') != 0 order by ts limit 5 +select POSITION(var2 IN '一二三四五六七八九十') from ts_4893.meters where POSITION(var2 IN '一二三四五六七八九十') != 0 order by ts limit 5 +select ABS(POSITION('aaa' IN 'aaaaaaaaa')) +select POW(POSITION('aaa' IN 'aaaaaaaaa'), 2) +select position('t' in 'taos') +select position('ustc' in 'taos') +select position('' in '') +select position('' in 'taos') +select position(nch2 in nch1) from ts_4893.d0 order by ts limit 10 +select position(nch2 in nch1) from ts_4893.meters order by ts limit 10 +select position(nch2 in var1) from ts_4893.d0 order by ts limit 10 +select position(nch2 in var1) from ts_4893.meters order by ts limit 10 +select position(var2 in nch1) from ts_4893.d0 order by ts limit 10 +select position(var2 in nch1) from ts_4893.meters order by ts limit 10 +select position(var2 in var1) from ts_4893.d0 order by ts limit 10 +select position(var2 in var1) from ts_4893.meters order by ts limit 10 +select position('t' in null) +select position(null in 'taos') +select position('' in 'A') +select position('A' in 'A') +select position('A' in '') +select position('A' in null) +select position('Z' in 'ABC') +select position('l' in 'Hello') +select position('s' in 'meters') +select position('中' in '中国') +select position('e' in 'é') +select position('W' in 'Hello World') +select position('@' in '!@#') +select position('6' in '12345') +select position('A' in trim(' A ')) +select position('A' in upper('abc')) +select position('B' in concat('A', 'B')) +select position('x' in replace('Hello', 'l', 'x')) +select name, position('e' in name) from ts_4893.meters limit 1 +select name, position('a' in substring(name, 2, 5)) from ts_4893.meters limit 1 +select nch1, position('n' in nch1) from ts_4893.meters limit 1 +select var1, position('1' in var1) from ts_4893.meters limit 1 diff --git a/tests/army/query/function/in/radians.in b/tests/army/query/function/in/radians.in index 45ef75f0d2..0e41cce64b 100644 --- a/tests/army/query/function/in/radians.in +++ b/tests/army/query/function/in/radians.in @@ -1,32 +1,48 @@ -select RADIANS(0); -select RADIANS(1); -select RADIANS(1.5); -select RADIANS(100); -select RADIANS(-1); -select RADIANS(-1.5); -select RADIANS(-100); -select RADIANS(1) + 1; -select RADIANS(1) - 1; -select RADIANS(1) * 1; -select RADIANS(1) / 1; -select RADIANS(1) from ts_4893.meters limit 5; -select RADIANS(1) + 1 from ts_4893.meters limit 1; -select RADIANS(1) - 1 from ts_4893.meters limit 1; -select RADIANS(1) * 2 from ts_4893.meters limit 1; -select RADIANS(1) / 2 from ts_4893.meters limit 1; -select RADIANS(2) + RADIANS(1) from ts_4893.meters limit 1; -select RADIANS(2) - RADIANS(1) from ts_4893.meters limit 1; -select RADIANS(2) * RADIANS(1) from ts_4893.meters limit 1; -select RADIANS(2) / RADIANS(1) from ts_4893.meters limit 1; -select RADIANS(1) + id from ts_4893.meters order by ts limit 5; -select RADIANS(id) + id from ts_4893.meters order by ts limit 5; -select RADIANS(abs(10)); -select RADIANS(DEGREES(PI())); -select abs(RADIANS(10)); -select pow(RADIANS(10), 2); -select sqrt(RADIANS(10)); -select cast(RADIANS(10) as int); -select RADIANS(sqrt(id)) from ts_4893.meters order by ts limit 5; -select radians(180); -select radians(current) from ts_4893.d0 order by ts limit 10; -select radians(current) from ts_4893.meters order by ts limit 10; +select RADIANS(0) +select RADIANS(1) +select RADIANS(1.5) +select RADIANS(100) +select RADIANS(-1) +select RADIANS(-1.5) +select RADIANS(-100) +select RADIANS(1) + 1 +select RADIANS(1) - 1 +select RADIANS(1) * 1 +select RADIANS(1) / 1 +select RADIANS(1) from ts_4893.meters limit 5 +select RADIANS(1) + 1 from ts_4893.meters limit 1 +select RADIANS(1) - 1 from ts_4893.meters limit 1 +select RADIANS(1) * 2 from ts_4893.meters limit 1 +select RADIANS(1) / 2 from ts_4893.meters limit 1 +select RADIANS(2) + RADIANS(1) from ts_4893.meters limit 1 +select RADIANS(2) - RADIANS(1) from ts_4893.meters limit 1 +select RADIANS(2) * RADIANS(1) from ts_4893.meters limit 1 +select RADIANS(2) / RADIANS(1) from ts_4893.meters limit 1 +select RADIANS(1) + id from ts_4893.meters order by ts limit 5 +select RADIANS(id) + id from ts_4893.meters order by ts limit 5 +select RADIANS(abs(10)) +select RADIANS(DEGREES(PI())) +select abs(RADIANS(10)) +select pow(RADIANS(10), 2) +select sqrt(RADIANS(10)) +select cast(RADIANS(10) as int) +select RADIANS(sqrt(id)) from ts_4893.meters order by ts limit 5 +select radians(180) +select radians(current) from ts_4893.d0 order by ts limit 10 +select radians(current) from ts_4893.meters order by ts limit 10 +select radians(null) +select radians(0) +select radians(45) +select radians(-45) +select radians(90) +select radians(-90) +select radians(360) +select radians(1000000) +select radians(sin(1)) +select radians(cos(1)) +select radians(tan(1)) +select radians(degrees(90)) +select radians(atan(1)) +select radians(current) from ts_4893.meters limit 1 +select radians(voltage) from ts_4893.meters limit 1 +select radians(phase) from ts_4893.meters limit 1 diff --git a/tests/army/query/function/in/rand.in b/tests/army/query/function/in/rand.in index 185a76d6f9..42075c8067 100644 --- a/tests/army/query/function/in/rand.in +++ b/tests/army/query/function/in/rand.in @@ -1,3 +1,11 @@ -select RAND(1245); -select RAND(id) from ts_4893.d0 limit 10; -select RAND(id) from ts_4893.d0 order by id desc limit 10; \ No newline at end of file +select RAND(1245) +select RAND(id) from ts_4893.d0 limit 10 +select RAND(id) from ts_4893.d0 order by id desc limit 10 +select rand(0) +select rand(1) +select rand(-1) +select rand(12345678901234567890) +select rand(-12345678901234567890) +select rand(12345), rand(12345) +select rand(9999999999) where rand(9999999999) >= 0 and rand(9999999999) < 1 +select rand(id) from ts_4893.meters limit 100 diff --git a/tests/army/query/function/in/repeat.in b/tests/army/query/function/in/repeat.in index a0a74a96cc..4cc99e61be 100644 --- a/tests/army/query/function/in/repeat.in +++ b/tests/army/query/function/in/repeat.in @@ -1,31 +1,53 @@ -select repeat('hello', 1); -select repeat('hello', 20); -SELECT REPEAT('a', 2); -SELECT CONCAT('g',CONCAT(';',repeat('a',60), repeat('b',60), repeat('c',60), repeat ('d',100)),'h'); -SELECT CONCAT('g',CONCAT_WS(';',repeat('a',60), repeat('b',60), repeat('c',60), repeat ('d',100)),'h'); -SELECT CONCAT_WS('g',CONCAT_WS(';',repeat('a',60), repeat('b',60), repeat('c',60), repeat ('d',100)),'h'); -select length(concat(repeat("a",3200),repeat("a",3200))); -select length(replace("aaaaa","a",concat(repeat("a",10000),repeat("a",12)))); -select repeat('北京taos', 6); -select repeat(nch1, 6) from ts_4893.meters order by ts limit 5; -select repeat(var1, 6) from ts_4893.meters order by ts limit 5; -select position(nch1 in repeat(nch1,6)) from ts_4893.meters order by ts limit 5; -select position(var1 in repeat(var1,6)) from ts_4893.meters order by ts limit 5; -select position(nch1 in repeat(var1,6)) from ts_4893.meters where nch1 = var1 order by ts limit 5; -select position(var1 in repeat(nch1,6)) from ts_4893.meters where nch1 = var1 order by ts limit 5; -select repeat(nch1, id) from ts_4893.meters where id > 0 order by ts limit 5; -select repeat(var1, id) from ts_4893.meters where id > 0 order by ts limit 5; -select repeat('nch1', id) from ts_4893.meters where id > 0 order by ts limit 5; -select repeat('var1', id) from ts_4893.meters where id > 0 order by ts limit 5; -select repeat('taos', 1); -select repeat('taos', 2); -select repeat(name, 3) from ts_4893.d0 order by ts limit 10; -select repeat(name, 3) from ts_4893.meters order by ts limit 10; -select repeat(nch1, 3) from ts_4893.d0 order by ts limit 10; -select repeat(nch1, 3) from ts_4893.meters order by ts limit 10; -select repeat(var1, 3) from ts_4893.d0 order by ts limit 10; -select repeat(var1, 3) from ts_4893.meters order by ts limit 10; -select repeat(name, groupid) from ts_4893.d0 order by ts limit 10; -select repeat(name, groupid) from ts_4893.meters order by ts limit 10; -select repeat(nch1, groupid) from ts_4893.d0 order by ts limit 10; -select repeat(nch1, groupid) from ts_4893.meters order by ts limit 10; +select repeat('hello', 1) +select repeat('hello', 20) +SELECT REPEAT('a', 2) +SELECT CONCAT('g',CONCAT(';',repeat('a',60), repeat('b',60), repeat('c',60), repeat ('d',100)),'h') +SELECT CONCAT('g',CONCAT_WS(';',repeat('a',60), repeat('b',60), repeat('c',60), repeat ('d',100)),'h') +SELECT CONCAT_WS('g',CONCAT_WS(';',repeat('a',60), repeat('b',60), repeat('c',60), repeat ('d',100)),'h') +select length(concat(repeat("a",3200),repeat("a",3200))) +select length(replace("aaaaa","a",concat(repeat("a",10000),repeat("a",12)))) +select repeat('北京taos', 6) +select repeat(nch1, 6) from ts_4893.meters order by ts limit 5 +select repeat(var1, 6) from ts_4893.meters order by ts limit 5 +select position(nch1 in repeat(nch1,6)) from ts_4893.meters order by ts limit 5 +select position(var1 in repeat(var1,6)) from ts_4893.meters order by ts limit 5 +select position(nch1 in repeat(var1,6)) from ts_4893.meters where nch1 = var1 order by ts limit 5 +select position(var1 in repeat(nch1,6)) from ts_4893.meters where nch1 = var1 order by ts limit 5 +select repeat(nch1, id) from ts_4893.meters where id > 0 order by ts limit 5 +select repeat(var1, id) from ts_4893.meters where id > 0 order by ts limit 5 +select repeat('nch1', id) from ts_4893.meters where id > 0 order by ts limit 5 +select repeat('var1', id) from ts_4893.meters where id > 0 order by ts limit 5 +select repeat('taos', 1) +select repeat('taos', 2) +select repeat(name, 3) from ts_4893.d0 order by ts limit 10 +select repeat(name, 3) from ts_4893.meters order by ts limit 10 +select repeat(nch1, 3) from ts_4893.d0 order by ts limit 10 +select repeat(nch1, 3) from ts_4893.meters order by ts limit 10 +select repeat(var1, 3) from ts_4893.d0 order by ts limit 10 +select repeat(var1, 3) from ts_4893.meters order by ts limit 10 +select repeat(name, groupid) from ts_4893.d0 order by ts limit 10 +select repeat(name, groupid) from ts_4893.meters order by ts limit 10 +select repeat(nch1, groupid) from ts_4893.d0 order by ts limit 10 +select repeat(nch1, groupid) from ts_4893.meters order by ts limit 10 +select repeat(null, 3) +select repeat('taos', null) +select repeat('taos', 0) +select repeat('', 5) +select repeat('A', 0) +select repeat('A', 10) +select repeat('A B', 5) +select repeat('ABC', 1) +select repeat('Hello', 2) +select repeat('HelloWorld', 2) +select repeat('123', 5) +select repeat('12345', 3) +select repeat('!@#', 3) +select repeat('你好', 2) +select repeat('abc', length('abc')) +select repeat(concat('A', 'B', 'C'), 3) +select repeat(upper('abc'), 4) +select repeat(trim(' Hello '), 3) +select name, repeat(name, 3) from ts_4893.meters limit 1 +select name, repeat(substring(name, 1, 5), 2) from ts_4893.meters limit 1 +select var1, repeat(var1, 2) from ts_4893.meters limit 1 +select nch1, repeat(nch1, 4) from ts_4893.meters limit 1 diff --git a/tests/army/query/function/in/replace.in b/tests/army/query/function/in/replace.in index 619b10ced0..1a1b3ed02c 100644 --- a/tests/army/query/function/in/replace.in +++ b/tests/army/query/function/in/replace.in @@ -1,98 +1,120 @@ -select replace('aaaa','a','b'); -select replace('aaaa','aa','b'); -select replace('aaaa','a','bb'); -select replace('aaaa','','b'); -select replace('bbbb','a','c'); -select replace(concat(lower(concat('THIS',' ','IS',' ','A',' ')),upper('false'),' ','test'),'FALSE','REAL') ; -select replace('北京涛思','北京', ''); -select replace('北京涛思','涛思', ''); -select replace('北京涛思.com','思.', '北京'); -select replace('北京涛思.com','北com', '北京涛'); -select replace('北京涛思', char(ascii('北')), 'wrongans'); -select replace(nch1, 'a', 'b') from ts_4893.meters order by ts limit 5; -select replace(nch1, 'a', 'b') from ts_4893.meters where position('a' IN nch1) != 0 order by ts limit 5; -select replace(nch1, 'a', 'b') from ts_4893.meters where position('a' IN nch1) = 0 order by ts limit 5; -select replace(nch1, 'a', '啊') from ts_4893.meters order by ts limit 5; -select replace(nch1, 'a', '啊') from ts_4893.meters where position('a' IN nch1) != 0 order by ts limit 5; -select replace(nch1, 'a', '啊') from ts_4893.meters where position('a' IN nch1) = 0 order by ts limit 5; -select replace(nch1, '一', '壹') from ts_4893.meters order by ts limit 5; -select replace(nch1, '一', '壹') from ts_4893.meters where position('一' IN nch1) != 0 order by ts limit 5; -select replace(nch1, '一', '壹') from ts_4893.meters where position('一' IN nch1) = 0 order by ts limit 5; -select replace(nch1, '一', '1') from ts_4893.meters order by ts limit 5; -select replace(nch1, '一', '1') from ts_4893.meters where position('一' IN nch1) != 0 order by ts limit 5; -select replace(nch1, '一', '1') from ts_4893.meters where position('一' IN nch1) = 0 order by ts limit 5; -select replace(nch1, nch2, 'nch2') from ts_4893.meters order by ts limit 5; -select replace(nch1, nch2, 'nch2') from ts_4893.meters where position(nch2 IN nch1) != 0 order by ts limit 5; -select replace(nch1, nch2, 'nch2') from ts_4893.meters where position(nch2 IN nch1) = 0 order by ts limit 5; -select replace(nch1, var2, 'var2') from ts_4893.meters order by ts limit 5; -select replace(nch1, var2, 'var2') from ts_4893.meters where position(var2 IN nch1) != 0 order by ts limit 5; -select replace(nch1, var2, 'var2') from ts_4893.meters where position(var2 IN nch1) = 0 order by ts limit 5; -select replace(nch1, '三', nch2) from ts_4893.meters order by ts limit 5; -select replace(nch1, '三', nch2) from ts_4893.meters where position('三' IN nch1) != 0 order by ts limit 5; -select replace(nch1, '三', nch2) from ts_4893.meters where position('三' IN nch1) = 0 order by ts limit 5; -select replace(nch1, '三', var2) from ts_4893.meters order by ts limit 5; -select replace(nch1, '三', var2) from ts_4893.meters where position('三' IN nch1) != 0 order by ts limit 5; -select replace(nch1, '三', var2) from ts_4893.meters where position('三' IN nch1) = 0 order by ts limit 5; -select replace(nch1, nch2, var2) from ts_4893.meters order by ts limit 5; -select replace(nch1, nch2, var2) from ts_4893.meters where position(nch2 IN nch1) != 0 order by ts limit 5; -select replace(nch1, nch2, var2) from ts_4893.meters where position(nch2 IN nch1) = 0 order by ts limit 5; -select replace(nch1, var2, nch2) from ts_4893.meters order by ts limit 5; -select replace(nch1, var2, nch2) from ts_4893.meters where position(var2 IN nch1) != 0 order by ts limit 5; -select replace(nch1, var2, nch2) from ts_4893.meters where position(var2 IN nch1) = 0 order by ts limit 5; -select replace(var1, 'a', 'b') from ts_4893.meters order by ts limit 5; -select replace(var1, 'a', 'b') from ts_4893.meters where position('a' IN var1) != 0 order by ts limit 5; -select replace(var1, 'a', 'b') from ts_4893.meters where position('a' IN var1) = 0 order by ts limit 5; -select replace(var1, 'a', '啊') from ts_4893.meters order by ts limit 5; -select replace(var1, 'a', '啊') from ts_4893.meters where position('a' IN var1) != 0 order by ts limit 5; -select replace(var1, 'a', '啊') from ts_4893.meters where position('a' IN var1) = 0 order by ts limit 5; -select replace(var1, '一', '壹') from ts_4893.meters order by ts limit 5; -select replace(var1, '一', '壹') from ts_4893.meters where position('一' IN var1) != 0 order by ts limit 5; -select replace(var1, '一', '壹') from ts_4893.meters where position('一' IN var1) = 0 order by ts limit 5; -select replace(var1, '一', '1') from ts_4893.meters order by ts limit 5; -select replace(var1, '一', '1') from ts_4893.meters where position('一' IN var1) != 0 order by ts limit 5; -select replace(var1, '一', '1') from ts_4893.meters where position('一' IN var1) = 0 order by ts limit 5; -select replace(var1, nch2, 'nch2') from ts_4893.meters order by ts limit 5; -select replace(var1, nch2, 'nch2') from ts_4893.meters where position(nch2 IN var1) != 0 order by ts limit 5; -select replace(var1, nch2, 'nch2') from ts_4893.meters where position(nch2 IN var1) = 0 order by ts limit 5; -select replace(var1, var2, 'var2') from ts_4893.meters order by ts limit 5; -select replace(var1, var2, 'var2') from ts_4893.meters where position(var2 IN var1) != 0 order by ts limit 5; -select replace(var1, var2, 'var2') from ts_4893.meters where position(var2 IN var1) = 0 order by ts limit 5; -select replace(var1, '三', nch2) from ts_4893.meters order by ts limit 5; -select replace(var1, '三', nch2) from ts_4893.meters where position('三' IN var1) != 0 order by ts limit 5; -select replace(var1, '三', nch2) from ts_4893.meters where position('三' IN var1) = 0 order by ts limit 5; -select replace(var1, '三', var2) from ts_4893.meters order by ts limit 5; -select replace(var1, '三', var2) from ts_4893.meters where position('三' IN var1) != 0 order by ts limit 5; -select replace(var1, '三', var2) from ts_4893.meters where position('三' IN var1) = 0 order by ts limit 5; -select replace(var1, nch2, var2) from ts_4893.meters order by ts limit 5; -select replace(var1, nch2, var2) from ts_4893.meters where position(nch2 IN var1) != 0 order by ts limit 5; -select replace(var1, nch2, var2) from ts_4893.meters where position(nch2 IN var1) = 0 order by ts limit 5; -select replace(var1, var2, nch2) from ts_4893.meters order by ts limit 5; -select replace(var1, var2, nch2) from ts_4893.meters where position(var2 IN var1) != 0 order by ts limit 5; -select replace(var1, var2, nch2) from ts_4893.meters where position(var2 IN var1) = 0 order by ts limit 5; -select replace('一二三四五六七abcdefghijk213124123', nch2, 'nch2') from ts_4893.meters order by ts limit 5; -select replace('一二三四五六七abcdefghijk213124123', nch2, 'nch2') from ts_4893.meters where position(nch2 IN '一二三四五六七abcdefghijk213124123') != 0 order by ts limit 5; -select replace('一二三四五六七abcdefghijk213124123', nch2, 'nch2') from ts_4893.meters where position(nch2 IN '一二三四五六七abcdefghijk213124123') = 0 order by ts limit 5; -select replace('一二三四五六七abcdefghijk213124123', nch2, var2) from ts_4893.meters order by ts limit 5; -select replace('一二三四五六七abcdefghijk213124123', nch2, var2) from ts_4893.meters where position(nch2 IN '一二三四五六七abcdefghijk213124123') != 0 order by ts limit 5; -select replace('一二三四五六七abcdefghijk213124123', nch2, var2) from ts_4893.meters where position(nch2 IN '一二三四五六七abcdefghijk213124123') = 0 order by ts limit 5; -select replace('一二三四五六七abcdefghijk213124123', var2, 'var2') from ts_4893.meters order by ts limit 5; -select replace('一二三四五六七abcdefghijk213124123', var2, 'var2') from ts_4893.meters where position(var2 IN '一二三四五六七abcdefghijk213124123') != 0 order by ts limit 5; -select replace('一二三四五六七abcdefghijk213124123', var2, 'var2') from ts_4893.meters where position(var2 IN '一二三四五六七abcdefghijk213124123') = 0 order by ts limit 5; -select replace('一二三四五六七abcdefghijk213124123', var2, nch2) from ts_4893.meters order by ts limit 5; -select replace('一二三四五六七abcdefghijk213124123', var2, nch2) from ts_4893.meters where position(var2 IN '一二三四五六七abcdefghijk213124123') != 0 order by ts limit 5; -select replace('一二三四五六七abcdefghijk213124123', var2, nch2) from ts_4893.meters where position(var2 IN '一二三四五六七abcdefghijk213124123') = 0 order by ts limit 5; -select replace('aabbccdd','aa', 'ee'); -select replace('aabbccdd','AA', 'ee'); -select replace('北京','北' , '南'); -select replace('北京','京' , '南'); -select replace('北京taos','北' , '南'); -select replace(nch1, nch2, 't') from ts_4893.d0 order by ts limit 10; -select replace(nch1, nch2, 't') from ts_4893.meters order by ts limit 10; -select replace(nch1, var2, 't') from ts_4893.d0 order by ts limit 10; -select replace(nch1, var2, 't') from ts_4893.meters order by ts limit 10; -select replace(var1, nch2, 't') from ts_4893.d0 order by ts limit 10; -select replace(var1, nch2, 't') from ts_4893.meters order by ts limit 10; -select replace(var1, var2, 't') from ts_4893.d0 order by ts limit 10; -select replace(var1, var2, 't') from ts_4893.meters order by ts limit 10; -select replace(nch1, nch2, var1) from ts_4893.d0 order by ts limit 10; -select replace(nch1, nch2, var1) from ts_4893.meters order by ts limit 10; +select replace('aaaa','a','b') +select replace('aaaa','aa','b') +select replace('aaaa','a','bb') +select replace('aaaa','','b') +select replace('bbbb','a','c') +select replace(concat(lower(concat('THIS',' ','IS',' ','A',' ')),upper('false'),' ','test'),'FALSE','REAL') +select replace('北京涛思','北京', '') +select replace('北京涛思','涛思', '') +select replace('北京涛思.com','思.', '北京') +select replace('北京涛思.com','北com', '北京涛') +select replace('北京涛思', char(ascii('北')), 'wrongans') +select replace(nch1, 'a', 'b') from ts_4893.meters order by ts limit 5 +select replace(nch1, 'a', 'b') from ts_4893.meters where position('a' IN nch1) != 0 order by ts limit 5 +select replace(nch1, 'a', 'b') from ts_4893.meters where position('a' IN nch1) = 0 order by ts limit 5 +select replace(nch1, 'a', '啊') from ts_4893.meters order by ts limit 5 +select replace(nch1, 'a', '啊') from ts_4893.meters where position('a' IN nch1) != 0 order by ts limit 5 +select replace(nch1, 'a', '啊') from ts_4893.meters where position('a' IN nch1) = 0 order by ts limit 5 +select replace(nch1, '一', '壹') from ts_4893.meters order by ts limit 5 +select replace(nch1, '一', '壹') from ts_4893.meters where position('一' IN nch1) != 0 order by ts limit 5 +select replace(nch1, '一', '壹') from ts_4893.meters where position('一' IN nch1) = 0 order by ts limit 5 +select replace(nch1, '一', '1') from ts_4893.meters order by ts limit 5 +select replace(nch1, '一', '1') from ts_4893.meters where position('一' IN nch1) != 0 order by ts limit 5 +select replace(nch1, '一', '1') from ts_4893.meters where position('一' IN nch1) = 0 order by ts limit 5 +select replace(nch1, nch2, 'nch2') from ts_4893.meters order by ts limit 5 +select replace(nch1, nch2, 'nch2') from ts_4893.meters where position(nch2 IN nch1) != 0 order by ts limit 5 +select replace(nch1, nch2, 'nch2') from ts_4893.meters where position(nch2 IN nch1) = 0 order by ts limit 5 +select replace(nch1, var2, 'var2') from ts_4893.meters order by ts limit 5 +select replace(nch1, var2, 'var2') from ts_4893.meters where position(var2 IN nch1) != 0 order by ts limit 5 +select replace(nch1, var2, 'var2') from ts_4893.meters where position(var2 IN nch1) = 0 order by ts limit 5 +select replace(nch1, '三', nch2) from ts_4893.meters order by ts limit 5 +select replace(nch1, '三', nch2) from ts_4893.meters where position('三' IN nch1) != 0 order by ts limit 5 +select replace(nch1, '三', nch2) from ts_4893.meters where position('三' IN nch1) = 0 order by ts limit 5 +select replace(nch1, '三', var2) from ts_4893.meters order by ts limit 5 +select replace(nch1, '三', var2) from ts_4893.meters where position('三' IN nch1) != 0 order by ts limit 5 +select replace(nch1, '三', var2) from ts_4893.meters where position('三' IN nch1) = 0 order by ts limit 5 +select replace(nch1, nch2, var2) from ts_4893.meters order by ts limit 5 +select replace(nch1, nch2, var2) from ts_4893.meters where position(nch2 IN nch1) != 0 order by ts limit 5 +select replace(nch1, nch2, var2) from ts_4893.meters where position(nch2 IN nch1) = 0 order by ts limit 5 +select replace(nch1, var2, nch2) from ts_4893.meters order by ts limit 5 +select replace(nch1, var2, nch2) from ts_4893.meters where position(var2 IN nch1) != 0 order by ts limit 5 +select replace(nch1, var2, nch2) from ts_4893.meters where position(var2 IN nch1) = 0 order by ts limit 5 +select replace(var1, 'a', 'b') from ts_4893.meters order by ts limit 5 +select replace(var1, 'a', 'b') from ts_4893.meters where position('a' IN var1) != 0 order by ts limit 5 +select replace(var1, 'a', 'b') from ts_4893.meters where position('a' IN var1) = 0 order by ts limit 5 +select replace(var1, 'a', '啊') from ts_4893.meters order by ts limit 5 +select replace(var1, 'a', '啊') from ts_4893.meters where position('a' IN var1) != 0 order by ts limit 5 +select replace(var1, 'a', '啊') from ts_4893.meters where position('a' IN var1) = 0 order by ts limit 5 +select replace(var1, '一', '壹') from ts_4893.meters order by ts limit 5 +select replace(var1, '一', '壹') from ts_4893.meters where position('一' IN var1) != 0 order by ts limit 5 +select replace(var1, '一', '壹') from ts_4893.meters where position('一' IN var1) = 0 order by ts limit 5 +select replace(var1, '一', '1') from ts_4893.meters order by ts limit 5 +select replace(var1, '一', '1') from ts_4893.meters where position('一' IN var1) != 0 order by ts limit 5 +select replace(var1, '一', '1') from ts_4893.meters where position('一' IN var1) = 0 order by ts limit 5 +select replace(var1, nch2, 'nch2') from ts_4893.meters order by ts limit 5 +select replace(var1, nch2, 'nch2') from ts_4893.meters where position(nch2 IN var1) != 0 order by ts limit 5 +select replace(var1, nch2, 'nch2') from ts_4893.meters where position(nch2 IN var1) = 0 order by ts limit 5 +select replace(var1, var2, 'var2') from ts_4893.meters order by ts limit 5 +select replace(var1, var2, 'var2') from ts_4893.meters where position(var2 IN var1) != 0 order by ts limit 5 +select replace(var1, var2, 'var2') from ts_4893.meters where position(var2 IN var1) = 0 order by ts limit 5 +select replace(var1, '三', nch2) from ts_4893.meters order by ts limit 5 +select replace(var1, '三', nch2) from ts_4893.meters where position('三' IN var1) != 0 order by ts limit 5 +select replace(var1, '三', nch2) from ts_4893.meters where position('三' IN var1) = 0 order by ts limit 5 +select replace(var1, '三', var2) from ts_4893.meters order by ts limit 5 +select replace(var1, '三', var2) from ts_4893.meters where position('三' IN var1) != 0 order by ts limit 5 +select replace(var1, '三', var2) from ts_4893.meters where position('三' IN var1) = 0 order by ts limit 5 +select replace(var1, nch2, var2) from ts_4893.meters order by ts limit 5 +select replace(var1, nch2, var2) from ts_4893.meters where position(nch2 IN var1) != 0 order by ts limit 5 +select replace(var1, nch2, var2) from ts_4893.meters where position(nch2 IN var1) = 0 order by ts limit 5 +select replace(var1, var2, nch2) from ts_4893.meters order by ts limit 5 +select replace(var1, var2, nch2) from ts_4893.meters where position(var2 IN var1) != 0 order by ts limit 5 +select replace(var1, var2, nch2) from ts_4893.meters where position(var2 IN var1) = 0 order by ts limit 5 +select replace('一二三四五六七abcdefghijk213124123', nch2, 'nch2') from ts_4893.meters order by ts limit 5 +select replace('一二三四五六七abcdefghijk213124123', nch2, 'nch2') from ts_4893.meters where position(nch2 IN '一二三四五六七abcdefghijk213124123') != 0 order by ts limit 5 +select replace('一二三四五六七abcdefghijk213124123', nch2, 'nch2') from ts_4893.meters where position(nch2 IN '一二三四五六七abcdefghijk213124123') = 0 order by ts limit 5 +select replace('一二三四五六七abcdefghijk213124123', nch2, var2) from ts_4893.meters order by ts limit 5 +select replace('一二三四五六七abcdefghijk213124123', nch2, var2) from ts_4893.meters where position(nch2 IN '一二三四五六七abcdefghijk213124123') != 0 order by ts limit 5 +select replace('一二三四五六七abcdefghijk213124123', nch2, var2) from ts_4893.meters where position(nch2 IN '一二三四五六七abcdefghijk213124123') = 0 order by ts limit 5 +select replace('一二三四五六七abcdefghijk213124123', var2, 'var2') from ts_4893.meters order by ts limit 5 +select replace('一二三四五六七abcdefghijk213124123', var2, 'var2') from ts_4893.meters where position(var2 IN '一二三四五六七abcdefghijk213124123') != 0 order by ts limit 5 +select replace('一二三四五六七abcdefghijk213124123', var2, 'var2') from ts_4893.meters where position(var2 IN '一二三四五六七abcdefghijk213124123') = 0 order by ts limit 5 +select replace('一二三四五六七abcdefghijk213124123', var2, nch2) from ts_4893.meters order by ts limit 5 +select replace('一二三四五六七abcdefghijk213124123', var2, nch2) from ts_4893.meters where position(var2 IN '一二三四五六七abcdefghijk213124123') != 0 order by ts limit 5 +select replace('一二三四五六七abcdefghijk213124123', var2, nch2) from ts_4893.meters where position(var2 IN '一二三四五六七abcdefghijk213124123') = 0 order by ts limit 5 +select replace('aabbccdd','aa', 'ee') +select replace('aabbccdd','AA', 'ee') +select replace('北京','北' , '南') +select replace('北京','京' , '南') +select replace('北京taos','北' , '南') +select replace(nch1, nch2, 't') from ts_4893.d0 order by ts limit 10 +select replace(nch1, nch2, 't') from ts_4893.meters order by ts limit 10 +select replace(nch1, var2, 't') from ts_4893.d0 order by ts limit 10 +select replace(nch1, var2, 't') from ts_4893.meters order by ts limit 10 +select replace(var1, nch2, 't') from ts_4893.d0 order by ts limit 10 +select replace(var1, nch2, 't') from ts_4893.meters order by ts limit 10 +select replace(var1, var2, 't') from ts_4893.d0 order by ts limit 10 +select replace(var1, var2, 't') from ts_4893.meters order by ts limit 10 +select replace(nch1, nch2, var1) from ts_4893.d0 order by ts limit 10 +select replace(nch1, nch2, var1) from ts_4893.meters order by ts limit 10 +select replace(null, 'aa', 'ee') +select replace(null, 'A', 'B') +select replace('', '', 'B') +select replace('', 'A', 'B') +select replace('A', 'A', '') +select replace('aabbccdd', null, 'ee') +select replace('Hello', 'Z', 'X') +select replace('Hello World', ' ', '_') +select replace('Hello World', 'World', 'MySQL') +select replace('12345', '5', 'five') +select replace('中国', '中', '国') +select replace('é', 'e', 'a') +select replace('!@#', '@', '#') +select replace('123456', '7', 'eight') +select replace(concat('A', 'B', 'C'), 'B', 'Z') +select replace(upper('abc'), 'A', 'X') +select replace(trim(' Hello '), 'l', 'L') +select replace(lower('HELLO'), 'h', 'H') +select name, replace(substring(name, 1, 5), 'e', 'o') from ts_4893.meters limit 1 +select name, replace(name, 'a', 'o') from ts_4893.meters limit 1 +select var1, replace(var1, '1', 'one') from ts_4893.meters limit 1 +select nch1, replace(nch1, 'n', 'm') from ts_4893.meters limit 1 diff --git a/tests/army/query/function/in/round.in b/tests/army/query/function/in/round.in index f9be21ef04..bca293fc72 100644 --- a/tests/army/query/function/in/round.in +++ b/tests/army/query/function/in/round.in @@ -1,30 +1,49 @@ -select ROUND(10.55, 3); -select ROUND(10.55, 2); -select ROUND(10.55, 1); -select ROUND(10.55, 0); -select ROUND(10.55); -select ROUND(10.55, -1); -select ROUND(10.55, -10); -select ROUND(-10.55, 1); -select ROUND(99, 1); -select ROUND(111.1111); -select ROUND(111.5111); -select ROUND(10.55) + 1; -select ROUND(10.55, 1) + 1; -select ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(123.123456789, 9), 8), 7), 6), 5), 4)); -select ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(123456789.123456789, -1), -2), -3), -4), -5), -6)); -select ROUND(current) from ts_4893.meters order by ts limit 20; -select ROUND(87654321.123456789, id) from ts_4893.meters order by ts limit 10; -select ROUND(current, id) from ts_4893.meters order by ts limit 10; -select ROUND(current, 1) from ts_4893.meters order by ts limit 10; -select round(10.55, 3); -select round(10.55, 2); -select round(10.55, 1); -select round(10.55, 0); -select round(10.55); -select round(10.55, -1); -select round(10.55, -10); -select round(-10.55, 1); -select round(99, 1); -select round(current) from ts_4893.d0 order by ts limit 10; -select round(current) from ts_4893.meters order by ts limit 10; +select ROUND(10.55, 3) +select ROUND(10.55, 2) +select ROUND(10.55, 1) +select ROUND(10.55, 0) +select ROUND(10.55) +select ROUND(10.55, -1) +select ROUND(10.55, -10) +select ROUND(-10.55, 1) +select ROUND(99, 1) +select ROUND(111.1111) +select ROUND(111.5111) +select ROUND(10.55) + 1 +select ROUND(10.55, 1) + 1 +select ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(123.123456789, 9), 8), 7), 6), 5), 4)) +select ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(123456789.123456789, -1), -2), -3), -4), -5), -6)) +select ROUND(current) from ts_4893.meters order by ts limit 20 +select ROUND(87654321.123456789, id) from ts_4893.meters order by ts limit 10 +select ROUND(current, id) from ts_4893.meters order by ts limit 10 +select ROUND(current, 1) from ts_4893.meters order by ts limit 10 +select round(10.55, 3) +select round(10.55, 2) +select round(10.55, 1) +select round(10.55, 0) +select round(10.55) +select round(10.55, -1) +select round(10.55, -10) +select round(-10.55, 1) +select round(99, 1) +select round(current) from ts_4893.d0 order by ts limit 10 +select round(current) from ts_4893.meters order by ts limit 10 +select round(10, null) +select round(null, 2) +select round(123.456, null) +select round(100) +select round(0.00123, -2) +select round(123.456, 0) +select round(123.456, -5) +select round(12345.6789, -2) +select round(-123.456, 2) +select round(-1234.5678, 2) +select round(voltage, 0) from ts_4893.meters limit 1 +select round(current, 1) from ts_4893.meters limit 1 +select round(phase, 3) from ts_4893.meters limit 1 +select round(voltage, -1) from ts_4893.meters limit 1 +select round(current * voltage, 2) from ts_4893.meters limit 1 +select round(abs(voltage), 2) from ts_4893.meters limit 1 +select round(pi() * phase, 3) from ts_4893.meters limit 1 +select round(sqrt(voltage), 2) from ts_4893.meters limit 1 +select round(log(current), 2) from ts_4893.meters limit 1 diff --git a/tests/army/query/function/in/sign.in b/tests/army/query/function/in/sign.in index 1be6a3610c..436c884d36 100644 --- a/tests/army/query/function/in/sign.in +++ b/tests/army/query/function/in/sign.in @@ -1,36 +1,48 @@ -select SIGN(0); -select SIGN(1); -select SIGN(1.5); -select SIGN(100); -select SIGN(-1); -select SIGN(-1.5); -select SIGN(-100); -select SIGN(1) + 1; -select SIGN(1) - 1; -select SIGN(1) * 1; -select SIGN(1) / 1; -select SIGN(1) from ts_4893.meters limit 5; -select SIGN(1) + 1 from ts_4893.meters limit 1; -select SIGN(1) - 1 from ts_4893.meters limit 1; -select SIGN(1) * 2 from ts_4893.meters limit 1; -select SIGN(1) / 2 from ts_4893.meters limit 1; -select SIGN(2) + SIGN(1) from ts_4893.meters limit 1; -select SIGN(2) - SIGN(1) from ts_4893.meters limit 1; -select SIGN(2) * SIGN(1) from ts_4893.meters limit 1; -select SIGN(2) / SIGN(1) from ts_4893.meters limit 1; -select SIGN(1) + id from ts_4893.meters order by ts limit 5; -select SIGN(id) + id from ts_4893.meters order by ts limit 5; -select SIGN(abs(10)); -select SIGN(abs(-10)); -select abs(SIGN(10)); -select pow(SIGN(10), 2); -select sqrt(SIGN(10)); -select cast(SIGN(10) as int); -select SIGN(sqrt(id)) from ts_4893.meters order by ts limit 5; -select SIGN(SIGN(SIGN(SIGN(0)))); -select sign(1); -select sign(10); -select sign(-1); -select sign(-10); -select sign(current) from ts_4893.d0 order by ts limit 10; -select sign(current) from ts_4893.meters order by ts limit 10; +select SIGN(0) +select SIGN(1) +select SIGN(1.5) +select SIGN(100) +select SIGN(-1) +select SIGN(-1.5) +select SIGN(-100) +select SIGN(1) + 1 +select SIGN(1) - 1 +select SIGN(1) * 1 +select SIGN(1) / 1 +select SIGN(1) from ts_4893.meters limit 5 +select SIGN(1) + 1 from ts_4893.meters limit 1 +select SIGN(1) - 1 from ts_4893.meters limit 1 +select SIGN(1) * 2 from ts_4893.meters limit 1 +select SIGN(1) / 2 from ts_4893.meters limit 1 +select SIGN(2) + SIGN(1) from ts_4893.meters limit 1 +select SIGN(2) - SIGN(1) from ts_4893.meters limit 1 +select SIGN(2) * SIGN(1) from ts_4893.meters limit 1 +select SIGN(2) / SIGN(1) from ts_4893.meters limit 1 +select SIGN(1) + id from ts_4893.meters order by ts limit 5 +select SIGN(id) + id from ts_4893.meters order by ts limit 5 +select SIGN(abs(10)) +select SIGN(abs(-10)) +select abs(SIGN(10)) +select pow(SIGN(10), 2) +select sqrt(SIGN(10)) +select cast(SIGN(10) as int) +select SIGN(sqrt(id)) from ts_4893.meters order by ts limit 5 +select SIGN(SIGN(SIGN(SIGN(0)))) +select sign(1) +select sign(10) +select sign(-1) +select sign(-10) +select sign(current) from ts_4893.d0 order by ts limit 10 +select sign(current) from ts_4893.meters order by ts limit 10 +select sign(null) +select sign(25) +select sign(-10) +select sign(0.1) +select sign(-0.1) +select sign(current) from ts_4893.meters limit 1 +select sign(voltage) from ts_4893.meters limit 1 +select sign(phase) from ts_4893.meters limit 1 +select sign(abs(voltage)) from ts_4893.meters limit 1 +select sign(round(current)) from ts_4893.meters limit 1 +select sign(sqrt(voltage)) from ts_4893.meters limit 1 +select sign(log(current + 1)) from ts_4893.meters limit 1 diff --git a/tests/army/query/function/in/stddev.in b/tests/army/query/function/in/stddev.in index ef36a7da41..d3db1bb56b 100644 --- a/tests/army/query/function/in/stddev.in +++ b/tests/army/query/function/in/stddev.in @@ -1,10 +1,22 @@ -select STDDEV(current) from ts_4893.meters; -select STDDEV(current) from ts_4893.meters interval(1d) order by 1 limit 10; -select STDDEV(id) from ts_4893.meters; -select STDDEV(id) from ts_4893.meters interval(1d) limit 10; -select STDDEV(id) from ts_4893.meters where id > 100; -select STDDEV(id) from ts_4893.meters interval(1d) order by 1 limit 10; -select stddev_pop(id) from ts_4893.d0; -select stddev_pop(id) from ts_4893.meters; -select stddev_pop(current) from ts_4893.d0; -select stddev_pop(current) from ts_4893.meters; +select STDDEV(current) from ts_4893.meters +select STDDEV(current) from ts_4893.meters interval(1d) order by 1 limit 10 +select STDDEV(id) from ts_4893.meters +select STDDEV(id) from ts_4893.meters interval(1d) limit 10 +select STDDEV(id) from ts_4893.meters where id > 100 +select STDDEV(id) from ts_4893.meters interval(1d) order by 1 limit 10 +select stddev_pop(null) from ts_4893.meters +select stddev_pop(id) from ts_4893.d0 +select stddev_pop(id) from ts_4893.meters +select stddev_pop(current) from ts_4893.d0 +select stddev_pop(current) from ts_4893.meters +select stddev_pop(voltage) from ts_4893.meters +select stddev_pop(voltage) from ts_4893.meters where voltage is not null +select stddev_pop(phase) from ts_4893.meters +select stddev_pop(phase) from ts_4893.meters where ts between '2023-01-01 00:00:00' and '2023-12-31 23:59:59' +select stddev_pop(total_voltage) from (select sum(voltage) as total_voltage from ts_4893.meters group by location) +select round(stddev_pop(current), 2) from ts_4893.meters +select pow(stddev_pop(current), 2) from ts_4893.meters +select log(stddev_pop(voltage) + 1) from ts_4893.meters +select groupid, stddev_pop(voltage) from ts_4893.meters group by groupid order by groupid +select location, stddev_pop(current) from ts_4893.meters group by location order by location +select location, stddev_pop(voltage) from ts_4893.meters group by location order by location diff --git a/tests/army/query/function/in/substr.in b/tests/army/query/function/in/substr.in index e5a1ea0754..8975e360c9 100644 --- a/tests/army/query/function/in/substr.in +++ b/tests/army/query/function/in/substr.in @@ -1,139 +1,165 @@ -select SUBSTRING('Hello.World!', 1); -select SUBSTRING('Hello.World!', 1, 5); -select SUBSTRING('Hello.World!', 1, 20); -select SUBSTRING('Hello.World!' FROM 1); -select SUBSTRING('Hello.World!' FROM 1 FOR 5); -select SUBSTRING('Hello.World!' FROM 1 FOR 20); -select SUBSTRING('Hello.World!', -6); -select SUBSTRING('Hello.World!', -6, 5); -select SUBSTRING('Hello.World!', -6, 20); -select SUBSTRING('Hello.World!' FROM -6); -select SUBSTRING('Hello.World!' FROM -6 FOR 5); -select SUBSTRING('Hello.World!' FROM -6 FOR 20); -select SUBSTRING('北京涛思数据科技有限公司,tdengine.', 1); -select SUBSTRING('北京涛思数据科技有限公司,tdengine.', 1, 5); -select SUBSTRING('北京涛思数据科技有限公司,tdengine.', 1, 20); -select SUBSTRING('北京涛思数据科技有限公司,tdengine.' FROM 1); -select SUBSTRING('北京涛思数据科技有限公司,tdengine.' FROM 1 FOR 5); -select SUBSTRING('北京涛思数据科技有限公司,tdengine.' FROM 1 FOR 20); -select SUBSTRING('北京涛思数据科技有限公司,tdengine.', -6); -select SUBSTRING('北京涛思数据科技有限公司,tdengine.', -6, 5); -select SUBSTRING('北京涛思数据科技有限公司,tdengine.', -6, 20); -select SUBSTRING('北京涛思数据科技有限公司,tdengine.' FROM -6); -select SUBSTRING('北京涛思数据科技有限公司,tdengine.' FROM -6 FOR 5); -select SUBSTRING('北京涛思数据科技有限公司,tdengine.' FROM -6 FOR 20); -select SUBSTRING(nch1, 1) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTRING(nch1, 1, 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTRING(nch1, 1, 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTRING(nch1 FROM 1) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTRING(nch1 FROM 1 FOR 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTRING(nch1 FROM 1 FOR 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTRING(nch1, -6) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTRING(nch1, -6, 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTRING(nch1, -6, 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTRING(nch1 FROM -6) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTRING(nch1 FROM -6 FOR 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTRING(nch1 FROM -6 FOR 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTRING(var1, 1) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTRING(var1, 1, 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTRING(var1, 1, 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTRING(var1 FROM 1) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTRING(var1 FROM 1 FOR 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTRING(var1 FROM 1 FOR 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTRING(var1, -6) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTRING(var1, -6, 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTRING(var1, -6, 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTRING(var1 FROM -6) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTRING(var1 FROM -6 FOR 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTRING(var1 FROM -6 FOR 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTRING(nch1, sign(id), 1) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTRING(nch1, sign(id), 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTRING(nch1, sign(id), 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTRING(nch1 FROM sign(id)) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTRING(nch1 FROM sign(id) FOR 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTRING(nch1 FROM sign(id) FOR 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTRING(var1, sign(id), 1) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTRING(var1, sign(id), 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTRING(var1, sign(id), 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTRING(var1 FROM sign(id)) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTRING(var1 FROM sign(id) FOR 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTRING(var1 FROM sign(id) FOR 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTRING(nch1, 2, id) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTRING(nch1 FROM 2 FOR id) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTRING(var1, 2, id) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTRING(var1 FROM 2 FOR id) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTR('Hello.World!', 1); -select SUBSTR('Hello.World!', 1, 5); -select SUBSTR('Hello.World!', 1, 20); -select SUBSTR('Hello.World!' FROM 1); -select SUBSTR('Hello.World!' FROM 1 FOR 5); -select SUBSTR('Hello.World!' FROM 1 FOR 20); -select SUBSTR('Hello.World!', -6); -select SUBSTR('Hello.World!', -6, 5); -select SUBSTR('Hello.World!', -6, 20); -select SUBSTR('Hello.World!' FROM -6); -select SUBSTR('Hello.World!' FROM -6 FOR 5); -select SUBSTR('Hello.World!' FROM -6 FOR 20); -select SUBSTR('北京涛思数据科技有限公司,tdengine.', 1); -select SUBSTR('北京涛思数据科技有限公司,tdengine.', 1, 5); -select SUBSTR('北京涛思数据科技有限公司,tdengine.', 1, 20); -select SUBSTR('北京涛思数据科技有限公司,tdengine.' FROM 1); -select SUBSTR('北京涛思数据科技有限公司,tdengine.' FROM 1 FOR 5); -select SUBSTR('北京涛思数据科技有限公司,tdengine.' FROM 1 FOR 20); -select SUBSTR('北京涛思数据科技有限公司,tdengine.', -6); -select SUBSTR('北京涛思数据科技有限公司,tdengine.', -6, 5); -select SUBSTR('北京涛思数据科技有限公司,tdengine.', -6, 20); -select SUBSTR('北京涛思数据科技有限公司,tdengine.' FROM -6); -select SUBSTR('北京涛思数据科技有限公司,tdengine.' FROM -6 FOR 5); -select SUBSTR('北京涛思数据科技有限公司,tdengine.' FROM -6 FOR 20); -select SUBSTR(nch1, 1) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTR(nch1, 1, 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTR(nch1, 1, 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTR(nch1 FROM 1) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTR(nch1 FROM 1 FOR 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTR(nch1 FROM 1 FOR 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTR(nch1, -6) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTR(nch1, -6, 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTR(nch1, -6, 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTR(nch1 FROM -6) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTR(nch1 FROM -6 FOR 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTR(nch1 FROM -6 FOR 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTR(var1, 1) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTR(var1, 1, 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTR(var1, 1, 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTR(var1 FROM 1) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTR(var1 FROM 1 FOR 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTR(var1 FROM 1 FOR 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTR(var1, -6) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTR(var1, -6, 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTR(var1, -6, 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTR(var1 FROM -6) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTR(var1 FROM -6 FOR 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTR(var1 FROM -6 FOR 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTR(nch1, sign(id), 1) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTR(nch1, sign(id), 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTR(nch1, sign(id), 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTR(nch1 FROM sign(id)) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTR(nch1 FROM sign(id) FOR 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTR(nch1 FROM sign(id) FOR 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTR(var1, sign(id), 1) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTR(var1, sign(id), 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTR(var1, sign(id), 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTR(var1 FROM sign(id)) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTR(var1 FROM sign(id) FOR 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTR(var1 FROM sign(id) FOR 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTR(nch1, 2, id) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTR(nch1 FROM 2 FOR id) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5; -select SUBSTR(var1, 2, id) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select SUBSTR(var1 FROM 2 FOR id) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5; -select substring('tdengine', 2); -select substring('tdengine', 8); -select substring('tdengine', 1, 3); -select substring('tdengine', 2, 99); -select substring('tdengine', -1, 10); -select substring('中国', 1, 3); -select substring('中国tdengine', 1, 3); -select substring(var1, 1, 5) from ts_4893.d0 order by ts limit 10; -select substring(var1, 1, 5) from ts_4893.meters order by ts limit 10; -select substring(nch1, 1, 5) from ts_4893.d0 order by ts limit 10; -select substring(nch1, 1, 5) from ts_4893.meters order by ts limit 10; +select SUBSTRING('Hello.World!', 1) +select SUBSTRING('Hello.World!', 1, 5) +select SUBSTRING('Hello.World!', 1, 20) +select SUBSTRING('Hello.World!' FROM 1) +select SUBSTRING('Hello.World!' FROM 1 FOR 5) +select SUBSTRING('Hello.World!' FROM 1 FOR 20) +select SUBSTRING('Hello.World!', -6) +select SUBSTRING('Hello.World!', -6, 5) +select SUBSTRING('Hello.World!', -6, 20) +select SUBSTRING('Hello.World!' FROM -6) +select SUBSTRING('Hello.World!' FROM -6 FOR 5) +select SUBSTRING('Hello.World!' FROM -6 FOR 20) +select SUBSTRING('北京涛思数据科技有限公司,tdengine.', 1) +select SUBSTRING('北京涛思数据科技有限公司,tdengine.', 1, 5) +select SUBSTRING('北京涛思数据科技有限公司,tdengine.', 1, 20) +select SUBSTRING('北京涛思数据科技有限公司,tdengine.' FROM 1) +select SUBSTRING('北京涛思数据科技有限公司,tdengine.' FROM 1 FOR 5) +select SUBSTRING('北京涛思数据科技有限公司,tdengine.' FROM 1 FOR 20) +select SUBSTRING('北京涛思数据科技有限公司,tdengine.', -6) +select SUBSTRING('北京涛思数据科技有限公司,tdengine.', -6, 5) +select SUBSTRING('北京涛思数据科技有限公司,tdengine.', -6, 20) +select SUBSTRING('北京涛思数据科技有限公司,tdengine.' FROM -6) +select SUBSTRING('北京涛思数据科技有限公司,tdengine.' FROM -6 FOR 5) +select SUBSTRING('北京涛思数据科技有限公司,tdengine.' FROM -6 FOR 20) +select SUBSTRING(nch1, 1) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTRING(nch1, 1, 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTRING(nch1, 1, 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTRING(nch1 FROM 1) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTRING(nch1 FROM 1 FOR 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTRING(nch1 FROM 1 FOR 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTRING(nch1, -6) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTRING(nch1, -6, 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTRING(nch1, -6, 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTRING(nch1 FROM -6) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTRING(nch1 FROM -6 FOR 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTRING(nch1 FROM -6 FOR 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTRING(var1, 1) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTRING(var1, 1, 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTRING(var1, 1, 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTRING(var1 FROM 1) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTRING(var1 FROM 1 FOR 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTRING(var1 FROM 1 FOR 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTRING(var1, -6) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTRING(var1, -6, 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTRING(var1, -6, 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTRING(var1 FROM -6) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTRING(var1 FROM -6 FOR 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTRING(var1 FROM -6 FOR 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTRING(nch1, sign(id), 1) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTRING(nch1, sign(id), 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTRING(nch1, sign(id), 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTRING(nch1 FROM sign(id)) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTRING(nch1 FROM sign(id) FOR 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTRING(nch1 FROM sign(id) FOR 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTRING(var1, sign(id), 1) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTRING(var1, sign(id), 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTRING(var1, sign(id), 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTRING(var1 FROM sign(id)) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTRING(var1 FROM sign(id) FOR 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTRING(var1 FROM sign(id) FOR 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTRING(nch1, 2, id) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTRING(nch1 FROM 2 FOR id) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTRING(var1, 2, id) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTRING(var1 FROM 2 FOR id) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTR('Hello.World!', 1) +select SUBSTR('Hello.World!', 1, 5) +select SUBSTR('Hello.World!', 1, 20) +select SUBSTR('Hello.World!' FROM 1) +select SUBSTR('Hello.World!' FROM 1 FOR 5) +select SUBSTR('Hello.World!' FROM 1 FOR 20) +select SUBSTR('Hello.World!', -6) +select SUBSTR('Hello.World!', -6, 5) +select SUBSTR('Hello.World!', -6, 20) +select SUBSTR('Hello.World!' FROM -6) +select SUBSTR('Hello.World!' FROM -6 FOR 5) +select SUBSTR('Hello.World!' FROM -6 FOR 20) +select SUBSTR('北京涛思数据科技有限公司,tdengine.', 1) +select SUBSTR('北京涛思数据科技有限公司,tdengine.', 1, 5) +select SUBSTR('北京涛思数据科技有限公司,tdengine.', 1, 20) +select SUBSTR('北京涛思数据科技有限公司,tdengine.' FROM 1) +select SUBSTR('北京涛思数据科技有限公司,tdengine.' FROM 1 FOR 5) +select SUBSTR('北京涛思数据科技有限公司,tdengine.' FROM 1 FOR 20) +select SUBSTR('北京涛思数据科技有限公司,tdengine.', -6) +select SUBSTR('北京涛思数据科技有限公司,tdengine.', -6, 5) +select SUBSTR('北京涛思数据科技有限公司,tdengine.', -6, 20) +select SUBSTR('北京涛思数据科技有限公司,tdengine.' FROM -6) +select SUBSTR('北京涛思数据科技有限公司,tdengine.' FROM -6 FOR 5) +select SUBSTR('北京涛思数据科技有限公司,tdengine.' FROM -6 FOR 20) +select SUBSTR(nch1, 1) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTR(nch1, 1, 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTR(nch1, 1, 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTR(nch1 FROM 1) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTR(nch1 FROM 1 FOR 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTR(nch1 FROM 1 FOR 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTR(nch1, -6) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTR(nch1, -6, 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTR(nch1, -6, 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTR(nch1 FROM -6) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTR(nch1 FROM -6 FOR 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTR(nch1 FROM -6 FOR 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTR(var1, 1) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTR(var1, 1, 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTR(var1, 1, 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTR(var1 FROM 1) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTR(var1 FROM 1 FOR 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTR(var1 FROM 1 FOR 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTR(var1, -6) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTR(var1, -6, 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTR(var1, -6, 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTR(var1 FROM -6) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTR(var1 FROM -6 FOR 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTR(var1 FROM -6 FOR 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTR(nch1, sign(id), 1) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTR(nch1, sign(id), 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTR(nch1, sign(id), 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTR(nch1 FROM sign(id)) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTR(nch1 FROM sign(id) FOR 5) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTR(nch1 FROM sign(id) FOR 20) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTR(var1, sign(id), 1) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTR(var1, sign(id), 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTR(var1, sign(id), 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTR(var1 FROM sign(id)) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTR(var1 FROM sign(id) FOR 5) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTR(var1 FROM sign(id) FOR 20) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTR(nch1, 2, id) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTR(nch1 FROM 2 FOR id) from ts_4893.meters where char_length(nch1) > 6 order by ts limit 5 +select SUBSTR(var1, 2, id) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select SUBSTR(var1 FROM 2 FOR id) from ts_4893.meters where char_length(var1) > 6 order by ts limit 5 +select substring('tdengine', 2) +select substring('tdengine', 8) +select substring('tdengine', 1, 3) +select substring('tdengine', 2, 99) +select substring('tdengine', -1, 10) +select substring('中国', 1, 3) +select substring('中国tdengine', 1, 3) +select substring(var1, 1, 5) from ts_4893.d0 order by ts limit 10 +select substring(var1, 1, 5) from ts_4893.meters order by ts limit 10 +select substring(nch1, 1, 5) from ts_4893.d0 order by ts limit 10 +select substring(nch1, 1, 5) from ts_4893.meters order by ts limit 10 +select substring(null, 1, 3) +select substring('tdengine', null, 3) +select substring('tdengine', 0) +select substring('tdengine', 10) +select substring('tdengine', 1, null) +select substring('tdengine', 1, 0) +select substring('tdengine', 1, -1) +select substr(null, 1, 3) +select substr('Hello', 1, 3) +select substr('', 1, 5) +select substr('ABCDE', 0, 3) +select substr('ABCDEFG', -3, 2) +select substr('HelloWorld', 2, 5) +select substr('1234567890', -5, 5) +select substr('!@#$%^&*()', 2, 4) +select substr('你好世界', 3, 2) +select substr('ABCDEFG', 10, 5) +select substr('ABCDEFG', -1, 3) +select substr('1234567890', -15, 5) +select substr(concat('Hello', 'World'), 1, 5) +select substr('HelloWorld', 1, length('Hello')) +select substr(upper('helloworld'), 2, 4) +select substr(trim(' HelloWorld '), 1, 5) +select name, substr(name, 1, 3) from ts_4893.meters limit 1 +select var1, substr(var1, 1, 6) from ts_4893.meters limit 1 +select nch1, substr(nch1, 2, 4) from ts_4893.meters limit 1 diff --git a/tests/army/query/function/in/substr_idx.in b/tests/army/query/function/in/substr_idx.in index ae278f0a7a..c38171ee50 100644 --- a/tests/army/query/function/in/substr_idx.in +++ b/tests/army/query/function/in/substr_idx.in @@ -1,93 +1,119 @@ -select substring_index("1abcd;2abcd;3abcd;4abcd", ';', 2); -select substring_index("1abcd;2abcd;3abcd;4abcd", ';', -2); -select substring_index('www.taosdata.com','taos',1); -select substring_index('www.taosdata.com','taos',-1); -SELECT SUBSTRING_INDEX('www.taosdata.com', '.', 1); -SELECT SUBSTRING_INDEX('www.taosdata.com', '.', -1); -select substring_index('www.taosdata.com','.',-2); -SELECT SUBSTRING_INDEX('www.taosdata.com', '.', 100); -SELECT SUBSTRING_INDEX('www.taosdata.com', '.', -100); -SELECT SUBSTRING_INDEX('www.taosdata.com', '.', 2147483647); -SELECT SUBSTRING_INDEX('www.taosdata.com', '.', -2147483647); -SELECT SUBSTRING_INDEX('www.taosdata.com', '.', 2147483648); -SELECT SUBSTRING_INDEX('www.taosdata.com', '.', -2147483648); -SELECT SUBSTRING_INDEX('www.taosdata.com', '.', 2147483649); -SELECT SUBSTRING_INDEX('www.taosdata.com', '.', -2147483649); -select substring_index('.taosdata.com','.',-2); -select substring_index('.taosdata.com','.tcx',-1); -select substring_index('aaaaaaaaa1','aa',2); -select substring_index('aaaaaaaaa1','aa',3); -select substring_index('aaaaaaaaa1','aa',4); -select substring_index('aaaaaaaaa1','aa',5); -select substring_index('aaaaaaaaa1','aaa',2); -select substring_index('aaaaaaaaa1','aaa',3); -select substring_index('aaaaaaaaa1','aaa',4); -select substring_index('aaaaaaaaa1','aaaa',2); -select substring_index('aaaaaaaaa1','1',1); -select substring_index('aaaaaaaaa1','a',-1); -select substring_index('aaaaaaaaa1','aa',-1); -select substring_index('aaaaaaaaa1','aa',-2); -select substring_index('aaaaaaaaa1','aa',-3); -select substring_index('aaaaaaaaa1','aa',-4); -select substring_index('aaaaaaaaa1','aa',-5); -select substring_index('aaaaaaaaa1','aaa',-1); -select substring_index('aaaaaaaaa1','aaa',-2); -select substring_index('aaaaaaaaa1','aaa',-3); -select substring_index('aaaaaaaaa1','aaa',-4); -select substring_index('the king of thethe hill','the',-2); -select substring_index('the king of the the hill','the',-2); -select substring_index('the king of the the hill','the',-2); -select substring_index('the king of the the hill',' the ',-1); -select substring_index('the king of the the hill',' the ',-2); -select substring_index('the king of the the hill',' ',-1); -select substring_index('the king of the the hill',' ',-2); -select substring_index('the king of the the hill',' ',-3); -select substring_index('the king of the the hill',' ',-4); -select substring_index('the king of the the hill',' ',-5); -select substring_index('the king of the.the hill','the',-2); -select substring_index('the king of thethethe.the hill','the',-3); -select substring_index('the king of thethethe.the hill','the',-1); -select substring_index('the king of the the hill','the',2); -select substring_index('the king of the the hill','the',3); -select substring_index(nch1, nch2, 1) from ts_4893.meters where position(nch2 in nch1) > 1 order by ts limit 5; -select substring_index(nch1, nch2, 1) from ts_4893.meters where position(nch2 in nch1) = 0 order by ts limit 5; -select substring_index(nch1, nch2, -2) from ts_4893.meters where position(nch2 in nch1) != 0 order by ts limit 5; -select substring_index(nch1, nch2, -2) from ts_4893.meters where position(nch2 in nch1) = 0 order by ts limit 5; -select substring_index(var1, var2, 1) from ts_4893.meters where position(var2 in var1) > 1 order by ts limit 5; -select substring_index(var1, var2, 1) from ts_4893.meters where position(var2 in var1) = 0 order by ts limit 5; -select substring_index(var1, var2, -2) from ts_4893.meters where position(var2 in var1) != 0 order by ts limit 5; -select substring_index(var1, var2, -2) from ts_4893.meters where position(var2 in var1) = 0 order by ts limit 5; -select substring_index(nch1, var2, 1) from ts_4893.meters where position(var2 in nch1) > 1 order by ts limit 5; -select substring_index(nch1, var2, 1) from ts_4893.meters where position(var2 in nch1) = 0 order by ts limit 5; -select substring_index(nch1, var2, -2) from ts_4893.meters where position(var2 in nch1) != 0 order by ts limit 5; -select substring_index(nch1, var2, -2) from ts_4893.meters where position(var2 in nch1) = 0 order by ts limit 5; -select substring_index(var1, nch2, 1) from ts_4893.meters where position(nch2 in var1) > 1 order by ts limit 5; -select substring_index(var1, nch2, 1) from ts_4893.meters where position(nch2 in var1) = 0 order by ts limit 5; -select substring_index(var1, nch2, -2) from ts_4893.meters where position(nch2 in var1) != 0 order by ts limit 5; -select substring_index(var1, nch2, -2) from ts_4893.meters where position(nch2 in var1) = 0 order by ts limit 5; -select substring_index('a一二三a一二三bbcfp', nch2, 1) from ts_4893.meters where position(nch2 in 'a一二三a一二三bbcfp') > 1 order by ts limit 5; -select substring_index('a一二三a一二三bbcfp', nch2, -1) from ts_4893.meters where position(nch2 in 'a一二三a一二三bbcfp') > 1 order by ts limit 5; -select substring_index('a一二三a一二三bbcfp', nch2, cast(id + 1 as int)) from ts_4893.meters where position(nch2 in 'a一二三a一二三bbcfp') = 0 order by ts limit 5; -select substring_index('a一二三a一二三bbcfp', var2, 1) from ts_4893.meters where position(var2 in 'a一二三a一二三bbcfp') > 1 order by ts limit 5; -select substring_index('a一二三a一二三bbcfp', var2, -1) from ts_4893.meters where position(var2 in 'a一二三a一二三bbcfp') > 1 order by ts limit 5; -select substring_index('a一二三a一二三bbcfp', var2, cast(id + 1 as int)) from ts_4893.meters where position(var2 in 'a一二三a一二三bbcfp') = 0 order by ts limit 5; -select substring_index(nch1, '123', 1) from ts_4893.meters where position('123' in nch1) > 1 order by ts limit 5; -select substring_index(nch1, '123', -1) from ts_4893.meters where position('123' in nch1) > 1 order by ts limit 5; -select substring_index(nch1, '123', id) from ts_4893.meters where position('123' in nch1) > 1 order by ts limit 5; -select substring_index(var1, '123', 1) from ts_4893.meters where position('123' in var1) > 1 order by ts limit 5; -select substring_index(var1, '123', -1) from ts_4893.meters where position('123' in var1) > 1 order by ts limit 5; -select substring_index(var1, '123', id) from ts_4893.meters where position('123' in var1) > 1 order by ts limit 5; -select substring_index('www.taosdata.com', '.', 2); -select substring_index('www.taosdata.com', '.', -2); -select substring_index('中国.科学.www.taosdata.com', '.', 2); -select substring_index('北京。涛思。数据。科技', '。', 2); -select substring_index(nch1, 'a', 2) from ts_4893.d0 order by ts limit 10; -select substring_index(nch1, 'a', 2) from ts_4893.meters order by ts limit 10; -select substring_index(nch1, nch2, 2) from ts_4893.d0 order by ts limit 10; -select substring_index(nch1, nch2, 2) from ts_4893.meters order by ts limit 10; -select substring_index(nch1, var2, 2) from ts_4893.d0 order by ts limit 10; -select substring_index(nch1, var2, 2) from ts_4893.meters order by ts limit 10; -select substring_index(var1, nch2, 2) from ts_4893.d0 order by ts limit 10; -select substring_index(var1, nch2, 2) from ts_4893.meters order by ts limit 10; -select substring_index(var1, var2, 2) from ts_4893.d0 order by ts limit 10; -select substring_index(var1, var2, 2) from ts_4893.meters order by ts limit 10; +select substring_index("1abcd;2abcd;3abcd;4abcd", ';', 2) +select substring_index("1abcd;2abcd;3abcd;4abcd", ';', -2) +select substring_index('www.taosdata.com','taos',1) +select substring_index('www.taosdata.com','taos',-1) +SELECT SUBSTRING_INDEX('www.taosdata.com', '.', 1) +SELECT SUBSTRING_INDEX('www.taosdata.com', '.', -1) +select substring_index('www.taosdata.com','.',-2) +SELECT SUBSTRING_INDEX('www.taosdata.com', '.', 100) +SELECT SUBSTRING_INDEX('www.taosdata.com', '.', -100) +SELECT SUBSTRING_INDEX('www.taosdata.com', '.', 2147483647) +SELECT SUBSTRING_INDEX('www.taosdata.com', '.', -2147483647) +SELECT SUBSTRING_INDEX('www.taosdata.com', '.', 2147483648) +SELECT SUBSTRING_INDEX('www.taosdata.com', '.', -2147483648) +SELECT SUBSTRING_INDEX('www.taosdata.com', '.', 2147483649) +SELECT SUBSTRING_INDEX('www.taosdata.com', '.', -2147483649) +select substring_index('.taosdata.com','.',-2) +select substring_index('.taosdata.com','.tcx',-1) +select substring_index('aaaaaaaaa1','aa',2) +select substring_index('aaaaaaaaa1','aa',3) +select substring_index('aaaaaaaaa1','aa',4) +select substring_index('aaaaaaaaa1','aa',5) +select substring_index('aaaaaaaaa1','aaa',2) +select substring_index('aaaaaaaaa1','aaa',3) +select substring_index('aaaaaaaaa1','aaa',4) +select substring_index('aaaaaaaaa1','aaaa',2) +select substring_index('aaaaaaaaa1','1',1) +select substring_index('aaaaaaaaa1','a',-1) +select substring_index('aaaaaaaaa1','aa',-1) +select substring_index('aaaaaaaaa1','aa',-2) +select substring_index('aaaaaaaaa1','aa',-3) +select substring_index('aaaaaaaaa1','aa',-4) +select substring_index('aaaaaaaaa1','aa',-5) +select substring_index('aaaaaaaaa1','aaa',-1) +select substring_index('aaaaaaaaa1','aaa',-2) +select substring_index('aaaaaaaaa1','aaa',-3) +select substring_index('aaaaaaaaa1','aaa',-4) +select substring_index('the king of thethe hill','the',-2) +select substring_index('the king of the the hill','the',-2) +select substring_index('the king of the the hill','the',-2) +select substring_index('the king of the the hill',' the ',-1) +select substring_index('the king of the the hill',' the ',-2) +select substring_index('the king of the the hill',' ',-1) +select substring_index('the king of the the hill',' ',-2) +select substring_index('the king of the the hill',' ',-3) +select substring_index('the king of the the hill',' ',-4) +select substring_index('the king of the the hill',' ',-5) +select substring_index('the king of the.the hill','the',-2) +select substring_index('the king of thethethe.the hill','the',-3) +select substring_index('the king of thethethe.the hill','the',-1) +select substring_index('the king of the the hill','the',2) +select substring_index('the king of the the hill','the',3) +select substring_index(nch1, nch2, 1) from ts_4893.meters where position(nch2 in nch1) > 1 order by ts limit 5 +select substring_index(nch1, nch2, 1) from ts_4893.meters where position(nch2 in nch1) = 0 order by ts limit 5 +select substring_index(nch1, nch2, -2) from ts_4893.meters where position(nch2 in nch1) != 0 order by ts limit 5 +select substring_index(nch1, nch2, -2) from ts_4893.meters where position(nch2 in nch1) = 0 order by ts limit 5 +select substring_index(var1, var2, 1) from ts_4893.meters where position(var2 in var1) > 1 order by ts limit 5 +select substring_index(var1, var2, 1) from ts_4893.meters where position(var2 in var1) = 0 order by ts limit 5 +select substring_index(var1, var2, -2) from ts_4893.meters where position(var2 in var1) != 0 order by ts limit 5 +select substring_index(var1, var2, -2) from ts_4893.meters where position(var2 in var1) = 0 order by ts limit 5 +select substring_index(nch1, var2, 1) from ts_4893.meters where position(var2 in nch1) > 1 order by ts limit 5 +select substring_index(nch1, var2, 1) from ts_4893.meters where position(var2 in nch1) = 0 order by ts limit 5 +select substring_index(nch1, var2, -2) from ts_4893.meters where position(var2 in nch1) != 0 order by ts limit 5 +select substring_index(nch1, var2, -2) from ts_4893.meters where position(var2 in nch1) = 0 order by ts limit 5 +select substring_index(var1, nch2, 1) from ts_4893.meters where position(nch2 in var1) > 1 order by ts limit 5 +select substring_index(var1, nch2, 1) from ts_4893.meters where position(nch2 in var1) = 0 order by ts limit 5 +select substring_index(var1, nch2, -2) from ts_4893.meters where position(nch2 in var1) != 0 order by ts limit 5 +select substring_index(var1, nch2, -2) from ts_4893.meters where position(nch2 in var1) = 0 order by ts limit 5 +select substring_index('a一二三a一二三bbcfp', nch2, 1) from ts_4893.meters where position(nch2 in 'a一二三a一二三bbcfp') > 1 order by ts limit 5 +select substring_index('a一二三a一二三bbcfp', nch2, -1) from ts_4893.meters where position(nch2 in 'a一二三a一二三bbcfp') > 1 order by ts limit 5 +select substring_index('a一二三a一二三bbcfp', nch2, cast(id + 1 as int)) from ts_4893.meters where position(nch2 in 'a一二三a一二三bbcfp') = 0 order by ts limit 5 +select substring_index('a一二三a一二三bbcfp', var2, 1) from ts_4893.meters where position(var2 in 'a一二三a一二三bbcfp') > 1 order by ts limit 5 +select substring_index('a一二三a一二三bbcfp', var2, -1) from ts_4893.meters where position(var2 in 'a一二三a一二三bbcfp') > 1 order by ts limit 5 +select substring_index('a一二三a一二三bbcfp', var2, cast(id + 1 as int)) from ts_4893.meters where position(var2 in 'a一二三a一二三bbcfp') = 0 order by ts limit 5 +select substring_index(nch1, '123', 1) from ts_4893.meters where position('123' in nch1) > 1 order by ts limit 5 +select substring_index(nch1, '123', -1) from ts_4893.meters where position('123' in nch1) > 1 order by ts limit 5 +select substring_index(nch1, '123', id) from ts_4893.meters where position('123' in nch1) > 1 order by ts limit 5 +select substring_index(var1, '123', 1) from ts_4893.meters where position('123' in var1) > 1 order by ts limit 5 +select substring_index(var1, '123', -1) from ts_4893.meters where position('123' in var1) > 1 order by ts limit 5 +select substring_index(var1, '123', id) from ts_4893.meters where position('123' in var1) > 1 order by ts limit 5 +select substring_index('www.taosdata.com', '.', 2) +select substring_index('www.taosdata.com', '.', -2) +select substring_index('中国.科学.www.taosdata.com', '.', 2) +select substring_index('北京。涛思。数据。科技', '。', 2) +select substring_index(nch1, 'a', 2) from ts_4893.d0 order by ts limit 10 +select substring_index(nch1, 'a', 2) from ts_4893.meters order by ts limit 10 +select substring_index(nch1, nch2, 2) from ts_4893.d0 order by ts limit 10 +select substring_index(nch1, nch2, 2) from ts_4893.meters order by ts limit 10 +select substring_index(nch1, var2, 2) from ts_4893.d0 order by ts limit 10 +select substring_index(nch1, var2, 2) from ts_4893.meters order by ts limit 10 +select substring_index(var1, nch2, 2) from ts_4893.d0 order by ts limit 10 +select substring_index(var1, nch2, 2) from ts_4893.meters order by ts limit 10 +select substring_index(var1, var2, 2) from ts_4893.d0 order by ts limit 10 +select substring_index(var1, var2, 2) from ts_4893.meters order by ts limit 10 +select substring_index(null, '.', 2) +select substring_index('www.taosdata.com', null, 2) +select substring_index('www.taosdata.com', '.', 0) +select substring_index('www.taosdata.com', '.', null) +select substring_index('a.b.c', '.', 1) +select substring_index('a.b.c', '.', 2) +select substring_index('a.b.c', '.', -1) +select substring_index('', '.', 1) +select substring_index('apple.orange.banana', '.', 2) +select substring_index('192.168.1.1', '.', 3) +select substring_index('abc@xyz.com', '.', 5) +select substring_index('123456789', '.', 1) +select substring_index('abcdef', ' ', 2) +select substring_index('ABCDEFG', '-', -1) +select substring_index('apple', '.', -3) +select substring_index(concat('apple', '.', 'orange', '.', 'banana'), '.', 2) +select substring_index('apple.orange.banana', '.', length('apple')) +select substring_index(upper('apple.orange.banana'), '.', 2) +select substring_index(trim(' apple.orange.banana '), '.', 2) +select substring_index(concat('apple', '.', 'orange', '.', 'banana'), '.', 2) +select substring_index('apple.orange.banana', '.', length('apple')) +select substring_index(upper('apple.orange.banana'), '.', 2) +select substring_index(trim(' apple.orange.banana '), '.', 2) +select name, substring_index(name, ' ', 1) from ts_4893.meters limit 1 +select var1, substring_index(var1, '-', -1) from ts_4893.meters limit 1 +select nch1, substring_index(nch1, ',', 3) from ts_4893.meters limit 1 diff --git a/tests/army/query/function/in/timediff.in b/tests/army/query/function/in/timediff.in index 0367d94a1a..d365980e45 100644 --- a/tests/army/query/function/in/timediff.in +++ b/tests/army/query/function/in/timediff.in @@ -1,91 +1,108 @@ -select TIMEDIFF(1,2); -select TIMEDIFF(2,1); -select TIMEDIFF(1,2,1s); -select TIMEDIFF(2,1,1s); -select TIMEDIFF(1,10000000,1m); -select TIMEDIFF(10000000,1,1m); -select TIMEDIFF(1,10000000,1h); -select TIMEDIFF(10000000,1,1h); -select TIMEDIFF(1,10000000,1d); -select TIMEDIFF(10000000,1,1d); -select TIMEDIFF(1,10000000,1w); -select TIMEDIFF(10000000,1,1w); -select TIMEDIFF(1724404450,1725095657); -select TIMEDIFF(1725095657,1724404450); -select TIMEDIFF(1724404450,1725095657,1s); -select TIMEDIFF(1725095657,1724404450,1s); -select TIMEDIFF(1724404450,1725095657,1m); -select TIMEDIFF(1725095657,1724404450,1m); -select TIMEDIFF(1724404450,1725095657,1h); -select TIMEDIFF(1725095657,1724404450,1h); -select TIMEDIFF(1724404450,1725095657,1d); -select TIMEDIFF(1725095657,1724404450,1d); -select TIMEDIFF(1724404450,1725095657,1w); -select TIMEDIFF(1725095657,1724404450,1w); -select TIMEDIFF('2024-08-23 17:14:17', '2024-08-31 17:14:17'); -select TIMEDIFF('2024-08-31 17:14:17', '2024-08-23 17:14:17'); -select TIMEDIFF('2024-08-23 17:14:17', '2024-08-31 17:14:17', 1s); -select TIMEDIFF('2024-08-31 17:14:17', '2024-08-23 17:14:17', 1s); -select TIMEDIFF('2024-08-23 17:14:17', '2024-08-31 17:14:17', 1m); -select TIMEDIFF('2024-08-31 17:14:17', '2024-08-23 17:14:17', 1m); -select TIMEDIFF('2024-08-23 17:14:17', '2024-08-31 17:14:17', 1h); -select TIMEDIFF('2024-08-31 17:14:17', '2024-08-23 17:14:17', 1h); -select TIMEDIFF('2024-08-23 17:14:17', '2024-08-31 17:14:17', 1d); -select TIMEDIFF('2024-08-31 17:14:17', '2024-08-23 17:14:17', 1d); -select TIMEDIFF('2024-08-23 17:14:17', '2024-08-31 17:14:17', 1w); -select TIMEDIFF('2024-08-31 17:14:17', '2024-08-23 17:14:17', 1w); -select TIMEDIFF('2024-08-23 17:14:17', 1725095657); -select TIMEDIFF(1725095657, '2024-08-23 17:14:17'); -select TIMEDIFF('2024-08-23 17:14:17', 1725095657, 1s); -select TIMEDIFF(1725095657, '2024-08-23 17:14:17', 1s); -select TIMEDIFF('2024-08-23 17:14:17', 1725095657, 1m); -select TIMEDIFF(1725095657, '2024-08-23 17:14:17', 1m); -select TIMEDIFF('2024-08-23 17:14:17', 1725095657, 1h); -select TIMEDIFF(1725095657, '2024-08-23 17:14:17', 1h); -select TIMEDIFF('2024-08-23 17:14:17', 1725095657, 1d); -select TIMEDIFF(1725095657, '2024-08-23 17:14:17', 1d); -select TIMEDIFF('2024-08-23 17:14:17', 1725095657, 1w); -select TIMEDIFF(1725095657, '2024-08-23 17:14:17', 1w); -select TIMEDIFF(ts, ts) from ts_4893.meters order by ts limit 10; -select TIMEDIFF(ts, '2024-08-31 17:14:17') from ts_4893.meters order by ts limit 10; -select TIMEDIFF('2024-08-31 17:14:17', ts) from ts_4893.meters order by ts limit 10; -select TIMEDIFF(ts, '2024-08-31 17:14:17', 1s) from ts_4893.meters order by ts limit 10; -select TIMEDIFF('2024-08-31 17:14:17', ts, 1s) from ts_4893.meters order by ts limit 10; -select TIMEDIFF(ts, '2024-08-31 17:14:17', 1m) from ts_4893.meters order by ts limit 10; -select TIMEDIFF('2024-08-31 17:14:17', ts, 1m) from ts_4893.meters order by ts limit 10; -select TIMEDIFF(ts, '2024-08-31 17:14:17', 1h) from ts_4893.meters order by ts limit 10; -select TIMEDIFF('2024-08-31 17:14:17', ts, 1h) from ts_4893.meters order by ts limit 10; -select TIMEDIFF(ts, '2024-08-31 17:14:17', 1d) from ts_4893.meters order by ts limit 10; -select TIMEDIFF('2024-08-31 17:14:17', ts, 1d) from ts_4893.meters order by ts limit 10; -select TIMEDIFF(ts, '2024-08-31 17:14:17', 1w) from ts_4893.meters order by ts limit 10; -select TIMEDIFF('2024-08-31 17:14:17', ts, 1w) from ts_4893.meters order by ts limit 10; -select TIMEDIFF(ts, 1725095657) from ts_4893.meters order by ts limit 10; -select TIMEDIFF(1725095657, ts) from ts_4893.meters order by ts limit 10; -select TIMEDIFF(ts, 1725095657, 1s) from ts_4893.meters order by ts limit 10; -select TIMEDIFF(1725095657, ts, 1s) from ts_4893.meters order by ts limit 10; -select TIMEDIFF(ts, 1725095657, 1m) from ts_4893.meters order by ts limit 10; -select TIMEDIFF(1725095657, ts, 1m) from ts_4893.meters order by ts limit 10; -select TIMEDIFF(ts, 1725095657, 1h) from ts_4893.meters order by ts limit 10; -select TIMEDIFF(1725095657, ts, 1h) from ts_4893.meters order by ts limit 10; -select TIMEDIFF(ts, 1725095657, 1d) from ts_4893.meters order by ts limit 10; -select TIMEDIFF(1725095657, ts, 1d) from ts_4893.meters order by ts limit 10; -select TIMEDIFF(ts, 1725095657, 1w) from ts_4893.meters order by ts limit 10; -select TIMEDIFF(1725095657, ts, 1w) from ts_4893.meters order by ts limit 10; -select timediff('2022-01-01 08:00:00', '2022-01-01 08:00:10',1s); -select timediff('2023-01-01 08:00:00', '2022-01-01 08:00:00',1s); -select timediff('2022-01-01 08:00:03', '2022-01-01 08:00:00',1a); -select timediff('2022-01-31 08:00:00', '2022-01-01 08:00:00',1m); -select timediff('2022-01-31 08:00:00', '2022-01-01 08:00:00',1h); -select timediff('2022-01-31 08:00:00', '2022-01-01 08:00:00',1d); -select timediff('2022-01-31 08:00:00', '2022-01-01 08:00:00',1w); -select timediff('2022-01-31 08:00:00', '2022-01-01 08:00:00'); -select timediff('2022-01-31 08:00:0', '2022-01-01 08:00:00',1s); -select timediff('2022-01-31', '2022-01-01',1s); -select timediff(1720769589, 1720769529, 1s); -select timediff(1720769589123, 1720769529123, 1s); -select timediff(1720769589, '2022-01-01 08:00:00', 1s); -select timediff('2022-01-01 08:00:00', 1720769589, 1s); -select timediff(1720769589231, '2022-01-01 08:00:00', 1s); -select timediff('2022-01-01 08:00:00', 1720769589123, 1s); -select timediff(ts, 1720769589123, 1a) from ts_4893.d0 order by ts limit 10; -select timediff(ts, 1720769589123, 1a) from ts_4893.meters order by ts limit 10; +select TIMEDIFF(1,2) +select TIMEDIFF(2,1) +select TIMEDIFF(1,2,1s) +select TIMEDIFF(2,1,1s) +select TIMEDIFF(1,10000000,1m) +select TIMEDIFF(10000000,1,1m) +select TIMEDIFF(1,10000000,1h) +select TIMEDIFF(10000000,1,1h) +select TIMEDIFF(1,10000000,1d) +select TIMEDIFF(10000000,1,1d) +select TIMEDIFF(1,10000000,1w) +select TIMEDIFF(10000000,1,1w) +select TIMEDIFF(1724404450,1725095657) +select TIMEDIFF(1725095657,1724404450) +select TIMEDIFF(1724404450,1725095657,1s) +select TIMEDIFF(1725095657,1724404450,1s) +select TIMEDIFF(1724404450,1725095657,1m) +select TIMEDIFF(1725095657,1724404450,1m) +select TIMEDIFF(1724404450,1725095657,1h) +select TIMEDIFF(1725095657,1724404450,1h) +select TIMEDIFF(1724404450,1725095657,1d) +select TIMEDIFF(1725095657,1724404450,1d) +select TIMEDIFF(1724404450,1725095657,1w) +select TIMEDIFF(1725095657,1724404450,1w) +select TIMEDIFF('2024-08-23 17:14:17', '2024-08-31 17:14:17') +select TIMEDIFF('2024-08-31 17:14:17', '2024-08-23 17:14:17') +select TIMEDIFF('2024-08-23 17:14:17', '2024-08-31 17:14:17', 1s) +select TIMEDIFF('2024-08-31 17:14:17', '2024-08-23 17:14:17', 1s) +select TIMEDIFF('2024-08-23 17:14:17', '2024-08-31 17:14:17', 1m) +select TIMEDIFF('2024-08-31 17:14:17', '2024-08-23 17:14:17', 1m) +select TIMEDIFF('2024-08-23 17:14:17', '2024-08-31 17:14:17', 1h) +select TIMEDIFF('2024-08-31 17:14:17', '2024-08-23 17:14:17', 1h) +select TIMEDIFF('2024-08-23 17:14:17', '2024-08-31 17:14:17', 1d) +select TIMEDIFF('2024-08-31 17:14:17', '2024-08-23 17:14:17', 1d) +select TIMEDIFF('2024-08-23 17:14:17', '2024-08-31 17:14:17', 1w) +select TIMEDIFF('2024-08-31 17:14:17', '2024-08-23 17:14:17', 1w) +select TIMEDIFF('2024-08-23 17:14:17', 1725095657) +select TIMEDIFF(1725095657, '2024-08-23 17:14:17') +select TIMEDIFF('2024-08-23 17:14:17', 1725095657, 1s) +select TIMEDIFF(1725095657, '2024-08-23 17:14:17', 1s) +select TIMEDIFF('2024-08-23 17:14:17', 1725095657, 1m) +select TIMEDIFF(1725095657, '2024-08-23 17:14:17', 1m) +select TIMEDIFF('2024-08-23 17:14:17', 1725095657, 1h) +select TIMEDIFF(1725095657, '2024-08-23 17:14:17', 1h) +select TIMEDIFF('2024-08-23 17:14:17', 1725095657, 1d) +select TIMEDIFF(1725095657, '2024-08-23 17:14:17', 1d) +select TIMEDIFF('2024-08-23 17:14:17', 1725095657, 1w) +select TIMEDIFF(1725095657, '2024-08-23 17:14:17', 1w) +select TIMEDIFF(ts, ts) from ts_4893.meters order by ts limit 10 +select TIMEDIFF(ts, '2024-08-31 17:14:17') from ts_4893.meters order by ts limit 10 +select TIMEDIFF('2024-08-31 17:14:17', ts) from ts_4893.meters order by ts limit 10 +select TIMEDIFF(ts, '2024-08-31 17:14:17', 1s) from ts_4893.meters order by ts limit 10 +select TIMEDIFF('2024-08-31 17:14:17', ts, 1s) from ts_4893.meters order by ts limit 10 +select TIMEDIFF(ts, '2024-08-31 17:14:17', 1m) from ts_4893.meters order by ts limit 10 +select TIMEDIFF('2024-08-31 17:14:17', ts, 1m) from ts_4893.meters order by ts limit 10 +select TIMEDIFF(ts, '2024-08-31 17:14:17', 1h) from ts_4893.meters order by ts limit 10 +select TIMEDIFF('2024-08-31 17:14:17', ts, 1h) from ts_4893.meters order by ts limit 10 +select TIMEDIFF(ts, '2024-08-31 17:14:17', 1d) from ts_4893.meters order by ts limit 10 +select TIMEDIFF('2024-08-31 17:14:17', ts, 1d) from ts_4893.meters order by ts limit 10 +select TIMEDIFF(ts, '2024-08-31 17:14:17', 1w) from ts_4893.meters order by ts limit 10 +select TIMEDIFF('2024-08-31 17:14:17', ts, 1w) from ts_4893.meters order by ts limit 10 +select TIMEDIFF(ts, 1725095657) from ts_4893.meters order by ts limit 10 +select TIMEDIFF(1725095657, ts) from ts_4893.meters order by ts limit 10 +select TIMEDIFF(ts, 1725095657, 1s) from ts_4893.meters order by ts limit 10 +select TIMEDIFF(1725095657, ts, 1s) from ts_4893.meters order by ts limit 10 +select TIMEDIFF(ts, 1725095657, 1m) from ts_4893.meters order by ts limit 10 +select TIMEDIFF(1725095657, ts, 1m) from ts_4893.meters order by ts limit 10 +select TIMEDIFF(ts, 1725095657, 1h) from ts_4893.meters order by ts limit 10 +select TIMEDIFF(1725095657, ts, 1h) from ts_4893.meters order by ts limit 10 +select TIMEDIFF(ts, 1725095657, 1d) from ts_4893.meters order by ts limit 10 +select TIMEDIFF(1725095657, ts, 1d) from ts_4893.meters order by ts limit 10 +select TIMEDIFF(ts, 1725095657, 1w) from ts_4893.meters order by ts limit 10 +select TIMEDIFF(1725095657, ts, 1w) from ts_4893.meters order by ts limit 10 +select timediff('2022-01-01 08:00:00', '2022-01-01 08:00:10',1s) +select timediff('2023-01-01 08:00:00', '2022-01-01 08:00:00',1s) +select timediff('2022-01-01 08:00:03', '2022-01-01 08:00:00',1a) +select timediff('2022-01-31 08:00:00', '2022-01-01 08:00:00',1m) +select timediff('2022-01-31 08:00:00', '2022-01-01 08:00:00',1h) +select timediff('2022-01-31 08:00:00', '2022-01-01 08:00:00',1d) +select timediff('2022-01-31 08:00:00', '2022-01-01 08:00:00',1w) +select timediff('2022-01-31 08:00:00', '2022-01-01 08:00:00') +select timediff('2022-01-31 08:00:0', '2022-01-01 08:00:00',1s) +select timediff('2022-01-31', '2022-01-01',1s) +select timediff(1720769589, 1720769529, 1s) +select timediff(1720769589, '2022-01-01 08:00:00', 1s) +select timediff(1720769589123, 1720769529123, 1s) +select timediff(1720769589231, '2022-01-01 08:00:00', 1s) +select timediff('2022-01-01 08:00:00', 1720769589, 1s) +select timediff('2022-01-01 08:00:00', 1720769589123, 1s) +select timediff(ts, 1720769589123, 1a) from ts_4893.d0 order by ts limit 10 +select timediff(ts, 1720769589123, 1a) from ts_4893.meters order by ts limit 10 +select timediff(null, '2022-01-01 08:00:01', 1s) +select timediff('20220131', '20220101', 1s) +select timediff('01/31/22', '01/01/22', 1s) +select timediff('22/01/31', '22/01/01') +select timediff('22/01/31', '22/01/01', 1s) +select timediff('31-JAN-22', '01-JAN-22', 1s) +select timediff('2022/01/31', '2022/01/01', 1s) +select timediff('2022-01-01 08:00:00', null, 1s) +select timediff('www', 'ttt') +select timediff(ts, ts) from ts_4893.meters limit 1 +select timediff(ts, ts - 1d) from ts_4893.meters limit 1 +select timediff(ts, '00:00:00') from ts_4893.meters limit 1 +select timediff(ts, null) from ts_4893.meters limit 1 +select timediff('25:61:61', ts) from ts_4893.meters limit 1 +select timediff('invalid_format', ts) from ts_4893.meters limit 1 +select timediff(name, ts) from ts_4893.meters limit 2 +select timediff('string_value', 'another_string') from ts_4893.meters limit 1 diff --git a/tests/army/query/function/in/trim.in b/tests/army/query/function/in/trim.in index 6706dfd98a..a0ad54dd7c 100644 --- a/tests/army/query/function/in/trim.in +++ b/tests/army/query/function/in/trim.in @@ -1,125 +1,144 @@ -select trim('foo'); -select trim('foo' from 'foobarfoo'); -select trim(trailing 'foo' from 'foobarfoo'); -select trim(leading 'foo' from 'foobarfoo'); -select trim(both 'foo' from 'foobarfoo'); -select trim(' blank '); -select trim(both ' ' from ' bla nk '); -select trim(leading ' ' from ' bla nk'); -select trim(trailing ' ' from ' bla nk '); -select trim(' ' from ' blank '); -select TRIM(BOTH 'å' FROM 'aæaå'); -select trim(' 中文测试 '); -select trim(both ' ' from ' 中文测试 '); -select trim(leading ' ' from ' 中文测试'); -select trim(trailing ' ' from ' 中文测试 '); -select trim(' ' from ' 中文测试 '); -select trim('一' from '一二中文测试一'); -select trim(both '一' from '一二中文测试一'); -select trim(leading '一' from '一二中文测试一'); -select trim(trailing '一' from '一二中文测试一'); -select trim(' 中文andEnglish测试Test '); -select trim(both ' ' from ' 中文andEnglish测试Test '); -select trim(leading ' ' from ' 中文andEnglish测试Test'); -select trim(trailing ' ' from ' 中文andEnglish测试Test '); -select trim('空格' from '空格中文andEngTes空格空格'); -select trim(both '空格' from '空格中文andEngTes空格空格'); -select trim(leading '空格' from '空格中文andEngTes空格空格'); -select trim(trailing '空格' from '空格中文andEngTes空格空格'); -select trim('blank' from 'blankblank中文andEnglish测试Tesblankblankblank'); -select trim(both 'blank' from 'blankblank中文andEnglish测试Tesblankblankblank'); -select trim(leading 'blank' from 'blankblank中文andEnglish测试Tesblankblankblank'); -select trim(trailing 'blank' from 'blankblank中文andEnglish测试Tesblankblankblank'); -select trim('空格blank' from '空格blank空格中Tes空格blank空'); -select trim(both '空格blank' from '空格blank空格中Tes空格blank空'); -select trim(leading '空格blank' from '空格blank空格中Tes空格blank空'); -select trim(trailing '空格blank' from '空格blank空格中Tes空格blank空'); -select trim(nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) != 0 order by ts limit 5; -select trim(both nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) != 0 order by ts limit 5; -select trim(leading nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) != 0 order by ts limit 5; -select trim(trailing nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) != 0 order by ts limit 5; -select trim(nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) = 0 order by ts limit 5; -select trim(both nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) = 0 order by ts limit 5; -select trim(leading nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) = 0 order by ts limit 5; -select trim(trailing nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) = 0 order by ts limit 5; -select trim(var2 from nch1) from ts_4893.meters where position(var2 in nch1) != 0 order by ts limit 5; -select trim(both var2 from nch1) from ts_4893.meters where position(var2 in nch1) != 0 order by ts limit 5; -select trim(leading var2 from nch1) from ts_4893.meters where position(var2 in nch1) != 0 order by ts limit 5; -select trim(trailing var2 from nch1) from ts_4893.meters where position(var2 in nch1) != 0 order by ts limit 5; -select trim(var2 from nch1) from ts_4893.meters where position(var2 in nch1) = 0 order by ts limit 5; -select trim(both var2 from nch1) from ts_4893.meters where position(var2 in nch1) = 0 order by ts limit 5; -select trim(leading var2 from nch1) from ts_4893.meters where position(var2 in nch1) = 0 order by ts limit 5; -select trim(trailing var2 from nch1) from ts_4893.meters where position(var2 in nch1) = 0 order by ts limit 5; -select trim(nch2 from var1) from ts_4893.meters where position(nch2 in var1) != 0 order by ts limit 5; -select trim(both nch2 from var1) from ts_4893.meters where position(nch2 in var1) != 0 order by ts limit 5; -select trim(leading nch2 from var1) from ts_4893.meters where position(nch2 in var1) != 0 order by ts limit 5; -select trim(trailing nch2 from var1) from ts_4893.meters where position(nch2 in var1) != 0 order by ts limit 5; -select trim(nch2 from var1) from ts_4893.meters where position(nch2 in var1) = 0 order by ts limit 5; -select trim(both nch2 from var1) from ts_4893.meters where position(nch2 in var1) = 0 order by ts limit 5; -select trim(leading nch2 from var1) from ts_4893.meters where position(nch2 in var1) = 0 order by ts limit 5; -select trim(trailing nch2 from var1) from ts_4893.meters where position(nch2 in var1) = 0 order by ts limit 5; -select trim(var2 from var1) from ts_4893.meters where position(var2 in var1) != 0 order by ts limit 5; -select trim(both var2 from var1) from ts_4893.meters where position(var2 in var1) != 0 order by ts limit 5; -select trim(leading var2 from var1) from ts_4893.meters where position(var2 in var1) != 0 order by ts limit 5; -select trim(trailing var2 from var1) from ts_4893.meters where position(var2 in var1) != 0 order by ts limit 5; -select trim(var2 from var1) from ts_4893.meters where position(var2 in var1) = 0 order by ts limit 5; -select trim(both var2 from var1) from ts_4893.meters where position(var2 in var1) = 0 order by ts limit 5; -select trim(leading var2 from var1) from ts_4893.meters where position(var2 in var1) = 0 order by ts limit 5; -select trim(trailing var2 from var1) from ts_4893.meters where position(var2 in var1) = 0 order by ts limit 5; -select trim('一' from nch1) from ts_4893.meters where position('一' in nch1) != 0 order by ts limit 5; -select trim(both '一' from nch1) from ts_4893.meters where position('一' in nch1) != 0 order by ts limit 5; -select trim(leading '一' from nch1) from ts_4893.meters where position('一' in nch1) != 0 order by ts limit 5; -select trim(trailing '一' from nch1) from ts_4893.meters where position('一' in nch1) != 0 order by ts limit 5; -select trim('一' from nch1) from ts_4893.meters where position('一' in nch1) = 0 order by ts limit 5; -select trim(both '一' from nch1) from ts_4893.meters where position('一' in nch1) = 0 order by ts limit 5; -select trim(leading '一' from nch1) from ts_4893.meters where position('一' in nch1) = 0 order by ts limit 5; -select trim(trailing '一' from nch1) from ts_4893.meters where position('一' in nch1) = 0 order by ts limit 5; -select trim('一' from var1) from ts_4893.meters where position('一' in var1) != 0 order by ts limit 5; -select trim(both '一' from var1) from ts_4893.meters where position('一' in var1) != 0 order by ts limit 5; -select trim(leading '一' from var1) from ts_4893.meters where position('一' in var1) != 0 order by ts limit 5; -select trim(trailing '一' from var1) from ts_4893.meters where position('一' in var1) != 0 order by ts limit 5; -select trim('一' from var1) from ts_4893.meters where position('一' in var1) = 0 order by ts limit 5; -select trim(both '一' from var1) from ts_4893.meters where position('一' in var1) = 0 order by ts limit 5; -select trim(leading '一' from var1) from ts_4893.meters where position('一' in var1) = 0 order by ts limit 5; -select trim(trailing '一' from var1) from ts_4893.meters where position('一' in var1) = 0 order by ts limit 5; -select trim(nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') != 0 order by ts limit 5; -select trim(both nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') != 0 order by ts limit 5; -select trim(leading nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') != 0 order by ts limit 5; -select trim(trailing nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') != 0 order by ts limit 5; -select trim(nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') = 0 order by ts limit 5; -select trim(both nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') = 0 order by ts limit 5; -select trim(leading nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') = 0 order by ts limit 5; -select trim(trailing nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') = 0 order by ts limit 5; -select trim(var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') != 0 order by ts limit 5; -select trim(both var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') != 0 order by ts limit 5; -select trim(leading var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') != 0 order by ts limit 5; -select trim(trailing var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') != 0 order by ts limit 5; -select trim(var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') = 0 order by ts limit 5; -select trim(both var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') = 0 order by ts limit 5; -select trim(leading var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') = 0 order by ts limit 5; -select trim(trailing var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') = 0 order by ts limit 5; -select trim(' A '); -select trim(' 涛思 '); -select trim('a' FROM 'aaab bbba'); -select trim(LEADING FROM ' aaa '); -select trim(LEADING 'a' FROM ' aaa abab aaaa '); -select trim(LEADING 'a' FROM 'aaa abab aaaa '); -select trim(LEADING '北' FROM '北京涛思数据科技有限公司北'); -select trim(LEADING '北' FROM '北bei京涛思数据科技有限公司北'); -select trim(TRAILING FROM ' aaa abab aaaa '); -select trim(TRAILING 'a' FROM 'aaa abab aaaa'); -select trim(TRAILING 'a' FROM ' aaa abab aaaa'); -select trim(TRAILING '北' FROM '北京涛思数据科技有限公司北') as sub; -select trim(TRAILING '北' FROM '北京涛思数据科技有限公司bei北'); -select trim(BOTH FROM ' aaa abab aaaa '); -select trim(BOTH 'a' FROM ' aaa abab aaaa '); -select trim(BOTH 'a' FROM 'aaa abab aaaa'); -select trim(BOTH '北' FROM '北京涛思数据科技有限公司北'); -select trim(nch2 from nch1) from ts_4893.d0 order by ts limit 10; -select trim(nch2 from nch1) from ts_4893.meters order by ts limit 10; -select trim(nch2 from var1) from ts_4893.d0 order by ts limit 10; -select trim(nch2 from var1) from ts_4893.meters order by ts limit 10; -select trim(var2 from nch1) from ts_4893.d0 order by ts limit 10; -select trim(var2 from nch1) from ts_4893.meters order by ts limit 10; -select trim(var2 from var1) from ts_4893.d0 order by ts limit 10; -select trim(var2 from var1) from ts_4893.meters order by ts limit 10; +select trim('foo') +select trim('foo' from 'foobarfoo') +select trim(trailing 'foo' from 'foobarfoo') +select trim(leading 'foo' from 'foobarfoo') +select trim(both 'foo' from 'foobarfoo') +select trim(' blank ') +select trim(both ' ' from ' bla nk ') +select trim(leading ' ' from ' bla nk') +select trim(trailing ' ' from ' bla nk ') +select trim(' ' from ' blank ') +select TRIM(BOTH 'å' FROM 'aæaå') +select trim(' 中文测试 ') +select trim(both ' ' from ' 中文测试 ') +select trim(leading ' ' from ' 中文测试') +select trim(trailing ' ' from ' 中文测试 ') +select trim(' ' from ' 中文测试 ') +select trim('一' from '一二中文测试一') +select trim(both '一' from '一二中文测试一') +select trim(leading '一' from '一二中文测试一') +select trim(trailing '一' from '一二中文测试一') +select trim(' 中文andEnglish测试Test ') +select trim(both ' ' from ' 中文andEnglish测试Test ') +select trim(leading ' ' from ' 中文andEnglish测试Test') +select trim(trailing ' ' from ' 中文andEnglish测试Test ') +select trim('空格' from '空格中文andEngTes空格空格') +select trim(both '空格' from '空格中文andEngTes空格空格') +select trim(leading '空格' from '空格中文andEngTes空格空格') +select trim(trailing '空格' from '空格中文andEngTes空格空格') +select trim('blank' from 'blankblank中文andEnglish测试Tesblankblankblank') +select trim(both 'blank' from 'blankblank中文andEnglish测试Tesblankblankblank') +select trim(leading 'blank' from 'blankblank中文andEnglish测试Tesblankblankblank') +select trim(trailing 'blank' from 'blankblank中文andEnglish测试Tesblankblankblank') +select trim('空格blank' from '空格blank空格中Tes空格blank空') +select trim(both '空格blank' from '空格blank空格中Tes空格blank空') +select trim(leading '空格blank' from '空格blank空格中Tes空格blank空') +select trim(trailing '空格blank' from '空格blank空格中Tes空格blank空') +select trim(nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) != 0 order by ts limit 5 +select trim(both nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) != 0 order by ts limit 5 +select trim(leading nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) != 0 order by ts limit 5 +select trim(trailing nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) != 0 order by ts limit 5 +select trim(nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) = 0 order by ts limit 5 +select trim(both nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) = 0 order by ts limit 5 +select trim(leading nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) = 0 order by ts limit 5 +select trim(trailing nch2 from nch1) from ts_4893.meters where position(nch2 in nch1) = 0 order by ts limit 5 +select trim(var2 from nch1) from ts_4893.meters where position(var2 in nch1) != 0 order by ts limit 5 +select trim(both var2 from nch1) from ts_4893.meters where position(var2 in nch1) != 0 order by ts limit 5 +select trim(leading var2 from nch1) from ts_4893.meters where position(var2 in nch1) != 0 order by ts limit 5 +select trim(trailing var2 from nch1) from ts_4893.meters where position(var2 in nch1) != 0 order by ts limit 5 +select trim(var2 from nch1) from ts_4893.meters where position(var2 in nch1) = 0 order by ts limit 5 +select trim(both var2 from nch1) from ts_4893.meters where position(var2 in nch1) = 0 order by ts limit 5 +select trim(leading var2 from nch1) from ts_4893.meters where position(var2 in nch1) = 0 order by ts limit 5 +select trim(trailing var2 from nch1) from ts_4893.meters where position(var2 in nch1) = 0 order by ts limit 5 +select trim(nch2 from var1) from ts_4893.meters where position(nch2 in var1) != 0 order by ts limit 5 +select trim(both nch2 from var1) from ts_4893.meters where position(nch2 in var1) != 0 order by ts limit 5 +select trim(leading nch2 from var1) from ts_4893.meters where position(nch2 in var1) != 0 order by ts limit 5 +select trim(trailing nch2 from var1) from ts_4893.meters where position(nch2 in var1) != 0 order by ts limit 5 +select trim(nch2 from var1) from ts_4893.meters where position(nch2 in var1) = 0 order by ts limit 5 +select trim(both nch2 from var1) from ts_4893.meters where position(nch2 in var1) = 0 order by ts limit 5 +select trim(leading nch2 from var1) from ts_4893.meters where position(nch2 in var1) = 0 order by ts limit 5 +select trim(trailing nch2 from var1) from ts_4893.meters where position(nch2 in var1) = 0 order by ts limit 5 +select trim(var2 from var1) from ts_4893.meters where position(var2 in var1) != 0 order by ts limit 5 +select trim(both var2 from var1) from ts_4893.meters where position(var2 in var1) != 0 order by ts limit 5 +select trim(leading var2 from var1) from ts_4893.meters where position(var2 in var1) != 0 order by ts limit 5 +select trim(trailing var2 from var1) from ts_4893.meters where position(var2 in var1) != 0 order by ts limit 5 +select trim(var2 from var1) from ts_4893.meters where position(var2 in var1) = 0 order by ts limit 5 +select trim(both var2 from var1) from ts_4893.meters where position(var2 in var1) = 0 order by ts limit 5 +select trim(leading var2 from var1) from ts_4893.meters where position(var2 in var1) = 0 order by ts limit 5 +select trim(trailing var2 from var1) from ts_4893.meters where position(var2 in var1) = 0 order by ts limit 5 +select trim('一' from nch1) from ts_4893.meters where position('一' in nch1) != 0 order by ts limit 5 +select trim(both '一' from nch1) from ts_4893.meters where position('一' in nch1) != 0 order by ts limit 5 +select trim(leading '一' from nch1) from ts_4893.meters where position('一' in nch1) != 0 order by ts limit 5 +select trim(trailing '一' from nch1) from ts_4893.meters where position('一' in nch1) != 0 order by ts limit 5 +select trim('一' from nch1) from ts_4893.meters where position('一' in nch1) = 0 order by ts limit 5 +select trim(both '一' from nch1) from ts_4893.meters where position('一' in nch1) = 0 order by ts limit 5 +select trim(leading '一' from nch1) from ts_4893.meters where position('一' in nch1) = 0 order by ts limit 5 +select trim(trailing '一' from nch1) from ts_4893.meters where position('一' in nch1) = 0 order by ts limit 5 +select trim('一' from var1) from ts_4893.meters where position('一' in var1) != 0 order by ts limit 5 +select trim(both '一' from var1) from ts_4893.meters where position('一' in var1) != 0 order by ts limit 5 +select trim(leading '一' from var1) from ts_4893.meters where position('一' in var1) != 0 order by ts limit 5 +select trim(trailing '一' from var1) from ts_4893.meters where position('一' in var1) != 0 order by ts limit 5 +select trim('一' from var1) from ts_4893.meters where position('一' in var1) = 0 order by ts limit 5 +select trim(both '一' from var1) from ts_4893.meters where position('一' in var1) = 0 order by ts limit 5 +select trim(leading '一' from var1) from ts_4893.meters where position('一' in var1) = 0 order by ts limit 5 +select trim(trailing '一' from var1) from ts_4893.meters where position('一' in var1) = 0 order by ts limit 5 +select trim(nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') != 0 order by ts limit 5 +select trim(both nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') != 0 order by ts limit 5 +select trim(leading nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') != 0 order by ts limit 5 +select trim(trailing nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') != 0 order by ts limit 5 +select trim(nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') = 0 order by ts limit 5 +select trim(both nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') = 0 order by ts limit 5 +select trim(leading nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') = 0 order by ts limit 5 +select trim(trailing nch2 from '三abbcfp三a') from ts_4893.meters where position(nch2 in '三abbcfp三a') = 0 order by ts limit 5 +select trim(var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') != 0 order by ts limit 5 +select trim(both var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') != 0 order by ts limit 5 +select trim(leading var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') != 0 order by ts limit 5 +select trim(trailing var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') != 0 order by ts limit 5 +select trim(var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') = 0 order by ts limit 5 +select trim(both var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') = 0 order by ts limit 5 +select trim(leading var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') = 0 order by ts limit 5 +select trim(trailing var2 from '三abbcfp三a') from ts_4893.meters where position(var2 in '三abbcfp三a') = 0 order by ts limit 5 +select trim(' A ') +select trim(' 涛思 ') +select trim('a' FROM 'aaab bbba') +select trim(LEADING FROM ' aaa ') +select trim(LEADING 'a' FROM ' aaa abab aaaa ') +select trim(LEADING 'a' FROM 'aaa abab aaaa ') +select trim(LEADING '北' FROM '北京涛思数据科技有限公司北') +select trim(LEADING '北' FROM '北bei京涛思数据科技有限公司北') +select trim(TRAILING FROM ' aaa abab aaaa ') +select trim(TRAILING 'a' FROM 'aaa abab aaaa') +select trim(TRAILING 'a' FROM ' aaa abab aaaa') +select trim(TRAILING '北' FROM '北京涛思数据科技有限公司北') as sub +select trim(TRAILING '北' FROM '北京涛思数据科技有限公司bei北') +select trim(BOTH FROM ' aaa abab aaaa ') +select trim(BOTH 'a' FROM ' aaa abab aaaa ') +select trim(BOTH 'a' FROM 'aaa abab aaaa') +select trim(BOTH '北' FROM '北京涛思数据科技有限公司北') +select trim(nch2 from nch1) from ts_4893.d0 order by ts limit 10 +select trim(nch2 from nch1) from ts_4893.meters order by ts limit 10 +select trim(nch2 from var1) from ts_4893.d0 order by ts limit 10 +select trim(nch2 from var1) from ts_4893.meters order by ts limit 10 +select trim(var2 from nch1) from ts_4893.d0 order by ts limit 10 +select trim(var2 from nch1) from ts_4893.meters order by ts limit 10 +select trim(var2 from var1) from ts_4893.d0 order by ts limit 10 +select trim(var2 from var1) from ts_4893.meters order by ts limit 10 +select trim(null) +select trim('') +select trim(leading ' ' from ' hello') +select trim(trailing ' ' from 'hello ') +select trim('0' from '000123000') +select trim(' hello ') +select trim(' apple banana ') +select var2, trim('*' from var2) from ts_4893.meters limit 1 +select trim('x' from 'hello') +select trim('longer' from 'short') +select trim('hello') +select trim(' 12345 ') +select trim(concat(' hello', ' world ')) +select trim(upper(' hello world ')) +select trim(substring(' hello world ', 4)) +select trim(replace(' hello world ', ' ', '-')) +select name, trim(name) from ts_4893.meters limit 1 +select var1, trim(trailing '!' from var1) from ts_4893.meters limit 1 +select nch1, trim(leading '-' from nch1) from ts_4893.meters limit 1 diff --git a/tests/army/query/function/in/trunc.in b/tests/army/query/function/in/trunc.in index a341cde4b5..5d4da23a28 100755 --- a/tests/army/query/function/in/trunc.in +++ b/tests/army/query/function/in/trunc.in @@ -1,37 +1,54 @@ -select TRUNCATE(10.55, 3); -select TRUNCATE(10.55, 2); -select TRUNCATE(10.55, 1); -select TRUNCATE(10.55, 0); -select TRUNCATE(10.55, -1); -select TRUNCATE(10.55, -10); -select TRUNCATE(-10.55, 1); -select TRUNCATE(99, 1); -select TRUNCATE(10.55, 1) + 1; -select TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(123.123456789, 9), 8), 7), 6), 5), 4), 3); -select TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(123456789.123456789, -1), -2), -3), -4), -5), -6), -7); -select TRUNCATE(87654321.123456789, id) from ts_4893.meters order by ts limit 10; -select TRUNCATE(current, id) from ts_4893.meters order by ts limit 10; -select TRUNCATE(current, 1) from ts_4893.meters order by ts limit 10; -select TRUNC(10.55, 3); -select TRUNC(10.55, 2); -select TRUNC(10.55, 1); -select TRUNC(10.55, 0); -select TRUNC(10.55, -1); -select TRUNC(10.55, -10); -select TRUNC(-10.55, 1); -select TRUNC(99, 1); -select TRUNC(10.55, 1) + 1; -select TRUNC(TRUNC(TRUNC(TRUNC(TRUNC(TRUNC(TRUNC(123.123456789, 9), 8), 7), 6), 5), 4), 3); -select TRUNC(TRUNC(TRUNC(TRUNC(TRUNC(TRUNC(TRUNC(123456789.123456789, -1), -2), -3), -4), -5), -6), -7); -select TRUNC(87654321.123456789, id) from ts_4893.meters order by ts limit 10; -select TRUNC(current, id) from ts_4893.meters order by ts limit 10; -select TRUNC(current, 1) from ts_4893.meters order by ts limit 10; -select truncate(99.99, 3); -select truncate(99.99, 2); -select truncate(99.99, 1); -select truncate(99.99, 0); -select truncate(99.99, -1); -select truncate(99.99, -10); -select truncate(99, 1); -select truncate(current, 1) from ts_4893.d0 order by ts limit 10; -select truncate(current, 1) from ts_4893.meters order by ts limit 10; +select TRUNCATE(10.55, 3) +select TRUNCATE(10.55, 2) +select TRUNCATE(10.55, 1) +select TRUNCATE(10.55, 0) +select TRUNCATE(10.55, -1) +select TRUNCATE(10.55, -10) +select TRUNCATE(-10.55, 1) +select TRUNCATE(99, 1) +select TRUNCATE(10.55, 1) + 1 +select TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(123.123456789, 9), 8), 7), 6), 5), 4), 3) +select TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(TRUNCATE(123456789.123456789, -1), -2), -3), -4), -5), -6), -7) +select TRUNCATE(87654321.123456789, id) from ts_4893.meters order by ts limit 10 +select TRUNCATE(current, id) from ts_4893.meters order by ts limit 10 +select TRUNCATE(current, 1) from ts_4893.meters order by ts limit 10 +select TRUNC(10.55, 3) +select TRUNC(10.55, 2) +select TRUNC(10.55, 1) +select TRUNC(10.55, 0) +select TRUNC(10.55, -1) +select TRUNC(10.55, -10) +select TRUNC(-10.55, 1) +select TRUNC(99, 1) +select TRUNC(10.55, 1) + 1 +select TRUNC(TRUNC(TRUNC(TRUNC(TRUNC(TRUNC(TRUNC(123.123456789, 9), 8), 7), 6), 5), 4), 3) +select TRUNC(TRUNC(TRUNC(TRUNC(TRUNC(TRUNC(TRUNC(123456789.123456789, -1), -2), -3), -4), -5), -6), -7) +select TRUNC(87654321.123456789, id) from ts_4893.meters order by ts limit 10 +select TRUNC(current, id) from ts_4893.meters order by ts limit 10 +select TRUNC(current, 1) from ts_4893.meters order by ts limit 10 +select truncate(99.99, 3) +select truncate(99.99, 2) +select truncate(99.99, 1) +select truncate(99.99, 0) +select truncate(99.99, -1) +select truncate(99.99, -10) +select truncate(99, 1) +select truncate(current, 1) from ts_4893.d0 order by ts limit 10 +select truncate(current, 1) from ts_4893.meters order by ts limit 10 +select truncate(99.99, null) +select truncate(null, 3) +select truncate(1.0001, 3) +select truncate(2.71828, 4) +select truncate(3.14159, 2) +select truncate(100.9876, 2) +select truncate(99999999999999.9999, 2) +select truncate(-5.678, 2) +select truncate(voltage, 2) from ts_4893.meters limit 1 +select truncate(current, 1) from ts_4893.meters limit 1 +select truncate(phase, 3) from ts_4893.meters limit 1 +select truncate(voltage + current, 2) from ts_4893.meters limit 1 +select truncate(voltage, -1) from ts_4893.meters limit 1 +select round(truncate(voltage, 1), 2) from ts_4893.meters limit 1 +select truncate(abs(current), 1) from ts_4893.meters limit 1 +select truncate(exp(phase), 2) from ts_4893.meters limit 1 +select truncate(log(current), 1) from ts_4893.meters limit 1 diff --git a/tests/army/query/function/in/varpop.in b/tests/army/query/function/in/varpop.in index 1a8f5e6149..d828f268a3 100644 --- a/tests/army/query/function/in/varpop.in +++ b/tests/army/query/function/in/varpop.in @@ -1,10 +1,20 @@ -select VAR_POP(current) from ts_4893.meters; -select VAR_POP(current) from ts_4893.meters interval(1d) order by 1 limit 10; -select VAR_POP(id) from ts_4893.meters; -select VAR_POP(id) from ts_4893.meters interval(1d) limit 10; -select VAR_POP(id) from ts_4893.meters where id > 100; -select VAR_POP(id) from ts_4893.meters interval(1d) order by 1 limit 10; -select var_pop(id) from ts_4893.d0; -select var_pop(id) from ts_4893.meters; -select var_pop(current) from ts_4893.d0; -select var_pop(current) from ts_4893.meters; +select VAR_POP(current) from ts_4893.meters +select VAR_POP(current) from ts_4893.meters interval(1d) order by 1 limit 10 +select VAR_POP(id) from ts_4893.meters +select VAR_POP(id) from ts_4893.meters interval(1d) limit 10 +select VAR_POP(id) from ts_4893.meters where id > 100 +select VAR_POP(id) from ts_4893.meters interval(1d) order by 1 limit 10 +select var_pop(null) from ts_4893.meters +select var_pop(id) from ts_4893.d0 +select var_pop(current) from ts_4893.d0 +select var_pop(voltage) from ts_4893.meters +select var_pop(voltage) from ts_4893.meters where voltage is not null +select var_pop(phase) from ts_4893.meters +select var_pop(phase) from ts_4893.meters where ts between '2023-01-01 00:00:00' and '2023-12-31 23:59:59' +select var_pop(total_voltage) from (select sum(voltage) as total_voltage from ts_4893.meters group by location) +select round(var_pop(current), 2) from ts_4893.meters +select pow(var_pop(current), 2) from ts_4893.meters +select log(var_pop(voltage) + 1) from ts_4893.meters +select groupid, var_pop(voltage) from ts_4893.meters group by groupid order by groupid +select location, var_pop(current) from ts_4893.meters group by location order by location +select location, var_pop(voltage) from ts_4893.meters group by location order by location diff --git a/tests/army/query/function/in/week.in b/tests/army/query/function/in/week.in index a6b2bf161a..d449bf1e89 100644 --- a/tests/army/query/function/in/week.in +++ b/tests/army/query/function/in/week.in @@ -1,75 +1,93 @@ -select WEEK('2020-01-01 00:00:00'); -select WEEK('2020-01-01 00:00:00', 0); -select WEEK('2020-01-01 00:00:00', 1); -select WEEK('2020-01-01 00:00:00', 2); -select WEEK('2020-01-01 00:00:00', 3); -select WEEK('2020-01-01 00:00:00', 4); -select WEEK('2020-01-01 00:00:00', 5); -select WEEK('2020-01-01 00:00:00', 6); -select WEEK('2020-01-01 00:00:00', 7); -select WEEK('2021-01-01 00:00:00'); -select WEEK('2021-01-01 00:00:00', 0); -select WEEK('2021-01-01 00:00:00', 1); -select WEEK('2021-01-01 00:00:00', 2); -select WEEK('2021-01-01 00:00:00', 3); -select WEEK('2021-01-01 00:00:00', 4); -select WEEK('2021-01-01 00:00:00', 5); -select WEEK('2021-01-01 00:00:00', 6); -select WEEK('2021-01-01 00:00:00', 7); -select WEEK('1998-01-01 00:00:00'); -select WEEK('1998-01-01 00:00:00', 0); -select WEEK('1998-01-01 00:00:00', 1); -select WEEK('1998-01-01 00:00:00', 2); -select WEEK('1998-01-01 00:00:00', 3); -select WEEK('1998-01-01 00:00:00', 4); -select WEEK('1998-01-01 00:00:00', 5); -select WEEK('1998-01-01 00:00:00', 6); -select WEEK('1998-01-01 00:00:00', 7); -select WEEK('1998-12-31 00:00:00'); -select WEEK('1998-12-31 00:00:00', 0); -select WEEK('1998-12-31 00:00:00', 1); -select WEEK('1998-12-31 00:00:00', 2); -select WEEK('1998-12-31 00:00:00', 3); -select WEEK('1998-12-31 00:00:00', 4); -select WEEK('1998-12-31 00:00:00', 5); -select WEEK('1998-12-31 00:00:00', 6); -select WEEK('1998-12-31 00:00:00', 7); -select WEEK('2000-01-06 00:00:00'); -select WEEK('2000-01-06 00:00:00', 0); -select WEEK('2000-01-06 00:00:00', 1); -select WEEK('2000-01-06 00:00:00', 2); -select WEEK('2000-01-06 00:00:00', 3); -select WEEK('2000-01-06 00:00:00', 4); -select WEEK('2000-01-06 00:00:00', 5); -select WEEK('2000-01-06 00:00:00', 6); -select WEEK('2000-01-06 00:00:00', 7); -select WEEK(1725095657); -select WEEK(1725095657, 0); -select WEEK(1725095657, 1); -select WEEK(1725095657, 2); -select WEEK(1725095657, 3); -select WEEK(1725095657, 4); -select WEEK(1725095657, 5); -select WEEK(1725095657, 6); -select WEEK(ts) from ts_4893.meters order by ts limit 10; -select WEEK(ts, 0) from ts_4893.meters order by ts limit 10; -select WEEK(ts, 1) from ts_4893.meters order by ts limit 10; -select WEEK(ts, 2) from ts_4893.meters order by ts limit 10; -select WEEK(ts, 3) from ts_4893.meters order by ts limit 10; -select WEEK(ts, 4) from ts_4893.meters order by ts limit 10; -select WEEK(ts, 5) from ts_4893.meters order by ts limit 10; -select WEEK(ts, 6) from ts_4893.meters order by ts limit 10; -select WEEK(ts, 7) from ts_4893.meters order by ts limit 10; -select week(123); -select week('2000-01-01',0); -select week('2000-01-01',1); -select week('2000-01-01',2); -select week('2000-01-01',3); -select week('2000-01-01',4); -select week('2000-01-01',5); -select week('2000-01-01',6); -select week('2000-01-01',7); -select week(1721020591,0); -select week('2020-01-01 00:00:00', 2); -select week(ts) from ts_4893.d0 order by ts limit 10; -select week(ts) from ts_4893.meters order by ts limit 10; +select WEEK('2020-01-01 00:00:00') +select WEEK('2020-01-01 00:00:00', 0) +select WEEK('2020-01-01 00:00:00', 1) +select WEEK('2020-01-01 00:00:00', 2) +select WEEK('2020-01-01 00:00:00', 3) +select WEEK('2020-01-01 00:00:00', 4) +select WEEK('2020-01-01 00:00:00', 5) +select WEEK('2020-01-01 00:00:00', 6) +select WEEK('2020-01-01 00:00:00', 7) +select WEEK('2021-01-01 00:00:00') +select WEEK('2021-01-01 00:00:00', 0) +select WEEK('2021-01-01 00:00:00', 1) +select WEEK('2021-01-01 00:00:00', 2) +select WEEK('2021-01-01 00:00:00', 3) +select WEEK('2021-01-01 00:00:00', 4) +select WEEK('2021-01-01 00:00:00', 5) +select WEEK('2021-01-01 00:00:00', 6) +select WEEK('2021-01-01 00:00:00', 7) +select WEEK('1998-01-01 00:00:00') +select WEEK('1998-01-01 00:00:00', 0) +select WEEK('1998-01-01 00:00:00', 1) +select WEEK('1998-01-01 00:00:00', 2) +select WEEK('1998-01-01 00:00:00', 3) +select WEEK('1998-01-01 00:00:00', 4) +select WEEK('1998-01-01 00:00:00', 5) +select WEEK('1998-01-01 00:00:00', 6) +select WEEK('1998-01-01 00:00:00', 7) +select WEEK('1998-12-31 00:00:00') +select WEEK('1998-12-31 00:00:00', 0) +select WEEK('1998-12-31 00:00:00', 1) +select WEEK('1998-12-31 00:00:00', 2) +select WEEK('1998-12-31 00:00:00', 3) +select WEEK('1998-12-31 00:00:00', 4) +select WEEK('1998-12-31 00:00:00', 5) +select WEEK('1998-12-31 00:00:00', 6) +select WEEK('1998-12-31 00:00:00', 7) +select WEEK('2000-01-06 00:00:00') +select WEEK('2000-01-06 00:00:00', 0) +select WEEK('2000-01-06 00:00:00', 1) +select WEEK('2000-01-06 00:00:00', 2) +select WEEK('2000-01-06 00:00:00', 3) +select WEEK('2000-01-06 00:00:00', 4) +select WEEK('2000-01-06 00:00:00', 5) +select WEEK('2000-01-06 00:00:00', 6) +select WEEK('2000-01-06 00:00:00', 7) +select WEEK(1725095657) +select WEEK(1725095657, 0) +select WEEK(1725095657, 1) +select WEEK(1725095657, 2) +select WEEK(1725095657, 3) +select WEEK(1725095657, 4) +select WEEK(1725095657, 5) +select WEEK(1725095657, 6) +select WEEK(ts) from ts_4893.meters order by ts limit 10 +select WEEK(ts, 0) from ts_4893.meters order by ts limit 10 +select WEEK(ts, 1) from ts_4893.meters order by ts limit 10 +select WEEK(ts, 2) from ts_4893.meters order by ts limit 10 +select WEEK(ts, 3) from ts_4893.meters order by ts limit 10 +select WEEK(ts, 4) from ts_4893.meters order by ts limit 10 +select WEEK(ts, 5) from ts_4893.meters order by ts limit 10 +select WEEK(ts, 6) from ts_4893.meters order by ts limit 10 +select WEEK(ts, 7) from ts_4893.meters order by ts limit 10 +select week(123) +select week('2000-01-01',0) +select week('2000-01-01',1) +select week('2000-01-01',2) +select week('2000-01-01',3) +select week('2000-01-01',4) +select week('2000-01-01',5) +select week('2000-01-01',6) +select week('2000-01-01',7) +select week(1721020591,0) +select week('2020-01-01 00:00:00', 2) +select week(ts) from ts_4893.d0 order by ts limit 10 +select week(ts) from ts_4893.meters order by ts limit 10 +select week(null, 0) +select week('abc') +select week('1721020591', 0) +select week('1721020666229', 0) +select week('20200101', 2) +select week('11/01/31', 2) +select week('20/01/01', 2) +select week('01/01/2020', 2) +select week('01-JAN-20', 2) +select week('2023-09-25') +select week('9999-12-31') +select week('2024-02-29 00:00:00') +select week(ts) from ts_4893.meters limit 1 +select week(name) from ts_4893.meters limit 1 +select week(ts), dayofweek(ts) from ts_4893.meters limit 1 +select week(timediff(ts, '2024-10-10 09:36:50.172')) from ts_4893.meters limit 1 +select id, week(ts) from ts_4893.meters where id = 1 limit 1 +select groupid, sum(week(ts)) from ts_4893.meters group by groupid order by groupid diff --git a/tests/army/query/function/in/weekday.in b/tests/army/query/function/in/weekday.in index 7e73967047..b421fa3930 100644 --- a/tests/army/query/function/in/weekday.in +++ b/tests/army/query/function/in/weekday.in @@ -1,19 +1,38 @@ -select WEEKDAY('2020-01-01 00:00:00'); -select WEEKDAY('2020-01-01 00:00:00') from ts_4893.meters order by ts limit 10; -select WEEKDAY('2021-01-01 00:00:00'); -select WEEKDAY('2021-01-01 00:00:00') from ts_4893.meters order by ts limit 10; -select WEEKDAY('1998-01-01 00:00:00'); -select WEEKDAY('1998-01-01 00:00:00') from ts_4893.meters order by ts limit 10; -select WEEKDAY('1998-12-31 00:00:00'); -select WEEKDAY('1998-12-31 00:00:00') from ts_4893.meters order by ts limit 10; -select WEEKDAY('2000-01-06 00:00:00'); -select WEEKDAY('2000-01-06 00:00:00') from ts_4893.meters order by ts limit 10; -select WEEKDAY(1725095657); -select WEEKDAY(1725095657) from ts_4893.meters order by ts limit 10; -select WEEKDAY(ts) from ts_4893.meters order by ts limit 10; -select weekday('2020-01-01'); -select weekday(1721020591); -select weekday(1721020666229); -select weekday('2020-01-01 00:00:00'); -select weekday(ts) from ts_4893.d0 order by ts limit 10; -select weekday(ts) from ts_4893.meters order by ts limit 10; +select WEEKDAY('2020-01-01 00:00:00') +select WEEKDAY('2020-01-01 00:00:00') from ts_4893.meters order by ts limit 10 +select WEEKDAY('2021-01-01 00:00:00') +select WEEKDAY('2021-01-01 00:00:00') from ts_4893.meters order by ts limit 10 +select WEEKDAY('1998-01-01 00:00:00') +select WEEKDAY('1998-01-01 00:00:00') from ts_4893.meters order by ts limit 10 +select WEEKDAY('1998-12-31 00:00:00') +select WEEKDAY('1998-12-31 00:00:00') from ts_4893.meters order by ts limit 10 +select WEEKDAY('2000-01-06 00:00:00') +select WEEKDAY('2000-01-06 00:00:00') from ts_4893.meters order by ts limit 10 +select WEEKDAY(1725095657) +select WEEKDAY(1725095657) from ts_4893.meters order by ts limit 10 +select WEEKDAY(ts) from ts_4893.meters order by ts limit 10 +select weekday('2020-01-01') +select weekday(1721020591) +select weekday(1721020666229) +select weekday('2020-01-01 00:00:00') +select weekday(ts) from ts_4893.d0 order by ts limit 10 +select weekday(ts) from ts_4893.meters order by ts limit 10 +select weekday(null) +select weekday('abc') +select weekday('1721020591') +select weekday('1721020666229') +select weekday('01/01/2020') +select weekday('20200101') +select weekday('20/01/01') +select weekday('11/01/32') +select weekday('01-JAN-20') +select weekday('2024-02-29') +select weekday('2023-09-24') +select weekday('2023-09-25') +select weekday('9999-12-31') +select weekday(name) from ts_4893.meters limit 1 +select weekday(ts), dayofweek(ts) from ts_4893.meters limit 1 +select weekday(timediff(ts, '2024-10-10 09:36:50.172')) from ts_4893.meters limit 1 +select weekday(ts) from ts_4893.meters limit 1 +select id, weekday(ts) from ts_4893.meters where id = 1 limit 1 +select groupid, sum(weekday(ts)) from ts_4893.meters group by groupid order by groupid diff --git a/tests/army/query/function/in/weekofyear.in b/tests/army/query/function/in/weekofyear.in index 8ac1b745ab..ac201c37c6 100644 --- a/tests/army/query/function/in/weekofyear.in +++ b/tests/army/query/function/in/weekofyear.in @@ -1,18 +1,37 @@ -select WEEKOFYEAR('2020-01-01 00:00:00'); -select WEEKOFYEAR('2020-01-01 00:00:00') from ts_4893.meters order by ts limit 10; -select WEEKOFYEAR('2021-01-01 00:00:00'); -select WEEKOFYEAR('2021-01-01 00:00:00') from ts_4893.meters order by ts limit 10; -select WEEKOFYEAR('1998-01-01 00:00:00'); -select WEEKOFYEAR('1998-01-01 00:00:00') from ts_4893.meters order by ts limit 10; -select WEEKOFYEAR('1998-12-31 00:00:00'); -select WEEKOFYEAR('1998-12-31 00:00:00') from ts_4893.meters order by ts limit 10; -select WEEKOFYEAR('2000-01-06 00:00:00'); -select WEEKOFYEAR('2000-01-06 00:00:00') from ts_4893.meters order by ts limit 10; -select WEEKOFYEAR(1725095657); -select WEEKOFYEAR(1725095657) from ts_4893.meters order by ts limit 10; -select WEEKOFYEAR(ts) from ts_4893.meters order by ts limit 10; -select weekofyear('2020-01-01'); -select weekofyear(1721020666); -select weekofyear(1721020666229); -select weekofyear(ts) from ts_4893.d0 order by ts limit 10; -select weekofyear(ts) from ts_4893.meters order by ts limit 10; +select WEEKOFYEAR('2020-01-01 00:00:00') +select WEEKOFYEAR('2020-01-01 00:00:00') from ts_4893.meters order by ts limit 10 +select WEEKOFYEAR('2021-01-01 00:00:00') +select WEEKOFYEAR('2021-01-01 00:00:00') from ts_4893.meters order by ts limit 10 +select WEEKOFYEAR('1998-01-01 00:00:00') +select WEEKOFYEAR('1998-01-01 00:00:00') from ts_4893.meters order by ts limit 10 +select WEEKOFYEAR('1998-12-31 00:00:00') +select WEEKOFYEAR('1998-12-31 00:00:00') from ts_4893.meters order by ts limit 10 +select WEEKOFYEAR('2000-01-06 00:00:00') +select WEEKOFYEAR('2000-01-06 00:00:00') from ts_4893.meters order by ts limit 10 +select WEEKOFYEAR(1725095657) +select WEEKOFYEAR(1725095657) from ts_4893.meters order by ts limit 10 +select WEEKOFYEAR(ts) from ts_4893.meters order by ts limit 10 +select weekofyear('2020-01-01') +select weekofyear(1721020666) +select weekofyear(1721020666229) +select weekofyear(ts) from ts_4893.d0 order by ts limit 10 +select weekofyear(ts) from ts_4893.meters order by ts limit 10 +select weekofyear(null) +select weekofyear('1721020591') +select weekofyear('1721020666229') +select weekofyear('abc') +select weekofyear('01/01/2020') +select weekofyear('20200101') +select weekofyear('20/01/01') +select weekofyear('11/01/31') +select weekofyear('01-JAN-20') +select weekofyear('2024-02-29') +select weekofyear('2024-01-01') +select weekofyear('2024-12-31') +select weekofyear('9999-12-31') +select weekofyear(name) from ts_4893.meters limit 1 +select weekofyear(ts) from ts_4893.meters limit 1 +select weekofyear(ts), dayofweek(ts) from ts_4893.meters limit 1 +select weekofyear(timediff(ts, '2024-10-10 09:36:50.172')) from ts_4893.meters limit 1 +select id, weekofyear(ts) from ts_4893.meters where id = 1 limit 1 +select groupid, sum(weekofyear(ts)) from ts_4893.meters group by groupid order by groupid diff --git a/tests/army/query/function/test_function.py b/tests/army/query/function/test_function.py index aae0cf6eee..bf7cf49290 100644 --- a/tests/army/query/function/test_function.py +++ b/tests/army/query/function/test_function.py @@ -11,20 +11,12 @@ # -*- coding: utf-8 -*- -import sys -import time -import random - -import taos -import frame - +from frame import etool from frame.etool import * from frame.log import * from frame.cases import * from frame.sql import * from frame.caseBase import * - -from frame import etool from frame.common import * class TDTestCase(TBase): @@ -36,17 +28,16 @@ class TDTestCase(TBase): "queryBufferSize": 10240 } - def insertData(self): + def insert_data(self): tdLog.info(f"insert data.") - # taosBenchmark run datafile = etool.curFile(__file__, "data/d1001.data") tdSql.execute("create database ts_4893;") - tdSql.execute(f"use ts_4893;") + tdSql.execute("use ts_4893;") tdSql.execute("select database();") tdSql.execute("CREATE STABLE `meters` (`ts` TIMESTAMP, `current` FLOAT, `voltage` INT, `phase` FLOAT, " - "`id` INT, `name` VARCHAR(64), `nch1` NCHAR(50), `nch2` NCHAR(50), `var1` VARCHAR(50), " - "`var2` VARCHAR(50)) TAGS (`groupid` TINYINT, `location` VARCHAR(16));") + "`id` INT, `name` VARCHAR(64), `nch1` NCHAR(50), `nch2` NCHAR(50), `var1` VARCHAR(50), " + "`var2` VARCHAR(50)) TAGS (`groupid` TINYINT, `location` VARCHAR(16));") tdSql.execute("CREATE table d0 using meters tags(1, 'beijing')") tdSql.execute("insert into d0 file '%s'" % datafile) @@ -63,12 +54,9 @@ class TDTestCase(TBase): continue sql_statement += line.strip() - if sql_statement.endswith(';'): - # 去掉末尾的分号 sql_statement = sql_statement.rstrip(';') tdSql.checkDataCsvByLine(sql_statement, ansFile) - # 清空 sql_statement 以便处理下一条语句 sql_statement = '' err_file_path = etool.curFile(__file__, f"in/{testCase}.err") if not os.path.isfile(err_file_path): @@ -80,16 +68,15 @@ class TDTestCase(TBase): continue err_statement += line.strip() - if err_statement.endswith(';'): tdSql.error(err_statement) err_statement = '' def test_normal_query_new(self, testCase): # read sql from .sql file and execute - tdLog.info(f"test normal query.") + tdLog.info("test normal query.") self.sqlFile = etool.curFile(__file__, f"in/{testCase}.in") - self.ansFile = etool.curFile(__file__, f"ans/{testCase}_1.csv") + self.ansFile = etool.curFile(__file__, f"ans/{testCase}.csv") tdCom.compare_testcase_result(self.sqlFile, self.ansFile, testCase) @@ -97,531 +84,230 @@ class TDTestCase(TBase): self.test_normal_query_new("pi") def test_round(self): - self.test_normal_query("round") + self.test_normal_query_new("round") - tdSql.query("select round(10, null);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select round(null, 2);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) + tdSql.error("select round(name, 2) from ts_4893.meters limit 1;") def test_exp(self): - self.test_normal_query("exp") + self.test_normal_query_new("exp") - tdSql.query("select exp(null);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) + def test_truncate(self): + self.test_normal_query_new("trunc") - def test_trunc(self): - self.test_normal_query("trunc") - - tdSql.query("select truncate(99.99, null);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select truncate(null, 3);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) + tdSql.error("select truncate(0.999);") + tdSql.error("select truncate(-1.999);") + tdSql.error("select truncate(null);") + tdSql.error("select truncate(name, 1) from ts_4893.meters limit 1;") def test_ln(self): - self.test_normal_query("ln") + self.test_normal_query_new("ln") - tdSql.query("select ln(null);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) + tdSql.error("select ln(name) from ts_4893.meters limit 1;") def test_mod(self): - self.test_normal_query("mod") + self.test_normal_query_new("mod") - tdSql.query("select mod(null, 2);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select mod(10, null);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select mod(10, 0);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) + tdSql.error("select mod(name, 2) from ts_4893.meters limit 1;") def test_sign(self): - self.test_normal_query("sign") + self.test_normal_query_new("sign") - tdSql.query("select sign(null);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) + tdSql.error("select sign('');") + tdSql.error("select sign('abc');") + tdSql.error("select sign('123');") + tdSql.error("select sign('-456');") def test_degrees(self): - self.test_normal_query("degrees") + self.test_normal_query_new("degrees") - tdSql.query("select degrees(null);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) + tdSql.error("select degrees('');") + tdSql.error("select degrees('abc');") + tdSql.error("select degrees('1.57');") def test_radians(self): - self.test_normal_query("radians") + self.test_normal_query_new("radians") - tdSql.query("select radians(null);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) + tdSql.error("select radians('');") + tdSql.error("select radians('abc');") + tdSql.error("select radians('45');") def test_char_length(self): - self.test_normal_query("char_length") + self.test_normal_query_new("char_length") - tdSql.query("select char_length(null);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) + tdSql.error("select char_length(12345);") + tdSql.error("select char_length(true);") + tdSql.error("select char_length(repeat('a', 1000000));") + tdSql.error("select char_length(id) from ts_4893.meters;") def test_char(self): - self.test_normal_query("char") + self.test_normal_query_new("char") - tdSql.query("select char(null);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, '') + res = [[chr(0)], [chr(1)], [chr(2)], [chr(3)], [chr(4)], [chr(5)], [chr(6)], [chr(7)], [chr(8)], [chr(9)]] + tdSql.checkDataMem("select char(id) from ts_4893.d0 limit 10;", res) + tdSql.checkDataMem("select char(id) from ts_4893.meters limit 10;", res) - tdSql.query("select char('ustc');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, chr(0)) - - result1 = [[chr(0)], [chr(1)], [chr(2)], [chr(3)], [chr(4)], [chr(5)], [chr(6)], [chr(7)], [chr(8)], [chr(9)]] - tdSql.checkDataMem("select char(id) from ts_4893.d0 limit 10;", result1) - tdSql.checkDataMem("select char(id) from ts_4893.meters limit 10;", result1) - - result2 = [[chr(0)], [chr(0)], [chr(0)], [chr(0)], [chr(0)], [chr(0)], [chr(0)], [chr(0)], [chr(0)], [chr(0)]] - tdSql.checkDataMem("select char(nch1) from ts_4893.d0 limit 10;", result2) - tdSql.checkDataMem("select char(nch1) from ts_4893.meters limit 10;", result2) - - tdSql.checkDataMem("select char(var1) from ts_4893.d0 limit 10;", result2) - tdSql.checkDataMem("select char(var1) from ts_4893.meters limit 10;", result2) + res = [[chr(0)], [chr(0)], [chr(0)], [chr(0)], [chr(0)], [chr(0)], [chr(0)], [chr(0)], [chr(0)], [chr(0)]] + tdSql.checkDataMem("select char(nch1) from ts_4893.d0 limit 10;", res) + tdSql.checkDataMem("select char(nch1) from ts_4893.meters limit 10;", res) + tdSql.checkDataMem("select char(var1) from ts_4893.d0 limit 10;", res) + tdSql.checkDataMem("select char(var1) from ts_4893.meters limit 10;", res) def test_ascii(self): - self.test_normal_query("ascii") + self.test_normal_query_new("ascii") - tdSql.query("select ascii(null);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) + tdSql.error("select ascii(123);") def test_position(self): - self.test_normal_query("position") - - tdSql.query("select position('t' in null);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select position(null in 'taos');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) + self.test_normal_query_new("position") def test_replace(self): - self.test_normal_query("replace") - - tdSql.query("select replace(null, 'aa', 'ee');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select replace('aabbccdd', null, 'ee');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) + self.test_normal_query_new("replace") def test_repeat(self): - self.test_normal_query("repeat") - - tdSql.query("select repeat('taos', null);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select repeat(null, 3);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select repeat('taos', 0);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, '') + self.test_normal_query_new("repeat") def test_substr(self): - self.test_normal_query("substr") - - tdSql.query("select substring('tdengine', null, 3);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select substring(null, 1, 3);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select substring('tdengine', 1, null);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select substring('tdengine', 0);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, '') - - tdSql.query("select substring('tdengine', 10);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, '') - - tdSql.query("select substring('tdengine', 1, 0);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, '') - - tdSql.query("select substring('tdengine', 1, -1);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, '') + self.test_normal_query_new("substr") def test_substr_idx(self): - self.test_normal_query("substr_idx") - - tdSql.query("select substring_index(null, '.', 2);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select substring_index('www.taosdata.com', null, 2);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select substring_index('www.taosdata.com', '.', null);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select substring_index('www.taosdata.com', '.', 0);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, '') + self.test_normal_query_new("substr_idx") def test_trim(self): - self.test_normal_query("trim") - - tdSql.query("select trim(null);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) + self.test_normal_query_new("trim") def test_timediff(self): - self.test_normal_query("timediff") + self.test_normal_query_new("timediff") - tdSql.query("select timediff(null, '2022-01-01 08:00:01',1s);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select timediff('2022-01-01 08:00:00', null,1s);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select timediff('2022/01/31', '2022/01/01',1s);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select timediff('20220131', '20220101',1s);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select timediff('22/01/31', '22/01/01',1s);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select timediff('01/31/22', '01/01/22',1s);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select timediff('31-JAN-22', '01-JAN-22',1s);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select timediff('22/01/31', '22/01/01');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select timediff('www', 'ttt');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) + tdSql.error("select timediff(min(ts), '2023-01-01 00:00:00') from ts_4893.meters limit 1;") + tdSql.error("select timediff(max(ts), '2023-12-31 23:59:59') from ts_4893.meters limit 1;") + tdSql.error("select (select timediff(ts, (select max(ts) from ts_4893.meters)) from ts_4893.meters where id = m.id) from ts_4893.meters m;") def test_week(self): - self.test_normal_query("week") - - tdSql.query("select week(null, 0);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select week('abc');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select week('1721020591', 0);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select week('1721020666229', 0);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select week('01/01/2020', 2);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select week('20200101', 2);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select week('20/01/01', 2);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select week('11/01/31', 2);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select week('01-JAN-20', 2);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) + self.test_normal_query_new("week") def test_weekday(self): - self.test_normal_query("weekday") + self.test_normal_query_new("weekday") - tdSql.query("select weekday(null);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select weekday('1721020591');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select weekday('1721020666229');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select weekday('abc');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select weekday('01/01/2020');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select weekday('20200101');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select weekday('20/01/01');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select weekday('11/01/32');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select weekday('01-JAN-20');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) + tdSql.error("select weekday(hello) from ts_4893.meters limit 1;") def test_weekofyear(self): - self.test_normal_query("weekofyear") - - tdSql.query("select weekofyear(null);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select weekofyear('1721020591');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select weekofyear('1721020666229');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select weekofyear('abc');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select weekofyear('01/01/2020');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select weekofyear('20200101');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select weekofyear('20/01/01');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select weekofyear('11/01/31');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select weekofyear('01-JAN-20');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) + self.test_normal_query_new("weekofyear") def test_dayofweek(self): - self.test_normal_query("dayofweek") + self.test_normal_query_new("dayofweek") - tdSql.query("select dayofweek(null);") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) + def test_stddev_pop(self): + self.test_normal_query_new("stddev") - tdSql.query("select dayofweek('1721020591');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select dayofweek('1721020666229');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select dayofweek('abc');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select dayofweek('01/01/2020');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select dayofweek('20200101');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select dayofweek('20/01/01');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select dayofweek('11/01/31');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select dayofweek('01-JAN-20');") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - def test_stddev(self): - self.test_normal_query("stddev") - - tdSql.query("select stddev_pop(null) from ts_4893.d0;") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select stddev_pop(null) from ts_4893.meters;") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) + tdSql.error("select stddev_pop(var1) from ts_4893.meters;") + tdSql.error("select stddev_pop(current) from empty_ts_4893.meters;") + tdSql.error("select stddev_pop(name) from ts_4893.meters;") + tdSql.error("select stddev_pop(nonexistent_column) from ts_4893.meters;") def test_varpop(self): - self.test_normal_query("varpop") + self.test_normal_query_new("varpop") - tdSql.query("select var_pop(null) from ts_4893.d0;") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - - tdSql.query("select var_pop(null) from ts_4893.meters;") - tdSql.checkRows(1) - tdSql.checkData(0, 0, None) - def test_error(self): - tdSql.error( - "select * from (select to_iso8601(ts, timezone()), timezone() from meters order by ts desc) limit 1000;", - expectErrInfo="Not supported timzone format") # TS-5340 + tdSql.error("select var_pop(var1) from ts_4893.meters;") + tdSql.error("select var_pop(current) from empty_ts_4893.meters;") + tdSql.error("select var_pop(name) from ts_4893.meters;") + tdSql.error("select var_pop(nonexistent_column) from ts_4893.meters;") def test_rand(self): - self.test_normal_query("rand") + self.test_normal_query_new("rand") tdSql.query("select rand();") tdSql.checkRows(1) tdSql.checkCols(1) - self.check_result_in_range(0, 0) + res = tdSql.getData(0, 0) + self.check_rand_data_range(res, 0) tdSql.query("select rand(null);") tdSql.checkRows(1) tdSql.checkCols(1) - self.check_result_in_range(0, 0) + res = tdSql.getData(0, 0) + self.check_rand_data_range(res, 0) + + tdSql.query("select rand() where rand() >= 0;") + tdSql.checkRows(1) + tdSql.checkCols(1) + res = tdSql.getData(0, 0) + self.check_rand_data_range(res, 0) + + tdSql.query("select rand() where rand() < 1;") + tdSql.checkRows(1) + tdSql.checkCols(1) + res = tdSql.getData(0, 0) + self.check_rand_data_range(res, 0) + + tdSql.query("select rand() where rand() >= 0 and rand() < 1;") + tdSql.checkRows(1) + tdSql.checkCols(1) + res = tdSql.getData(0, 0) + self.check_rand_data_range(res, 0) tdSql.query("select rand() from (select 1) t limit 1;") tdSql.checkRows(1) tdSql.checkCols(1) - self.check_result_in_range(0, 0) + res = tdSql.getData(0, 0) + self.check_rand_data_range(res, 0) - tdSql.query("select rand(id) from ts_4893.d0 limit 100;") - tdSql.checkRows(100) + tdSql.query("select round(rand(), 3)") + tdSql.checkRows(1) tdSql.checkCols(1) - for i in range(len(tdSql.res)): - self.check_result_in_range(i, 0) + res = tdSql.getData(0, 0) + self.check_rand_data_range(res, 0) - tdSql.query("select rand(id) from ts_4893.meters limit 100;") - tdSql.checkRows(100) + tdSql.query("select pow(rand(), 2)") + tdSql.checkRows(1) tdSql.checkCols(1) - for i in range(len(tdSql.res)): - self.check_result_in_range(i, 0) + res = tdSql.getData(0, 0) + self.check_rand_data_range(res, 0) - tdSql.query("select rand(123), rand(123);") + tdSql.query("select rand(12345), rand(12345);") tdSql.checkRows(1) tdSql.checkCols(2) - if tdSql.res[0][0] != tdSql.res[0][1]: + res0 = tdSql.getData(0, 0) + res1 = tdSql.getData(0, 1) + if res0 != res1: caller = inspect.getframeinfo(inspect.stack()[1][0]) - args = (caller.filename, caller.lineno, tdSql.sql, tdSql.res[0][0], tdSql.res[0][1]) - tdLog.exit("%s(%d) failed: sql:%s data1:%s ne data2:%s" % args) + args = (caller.filename, caller.lineno, self.sql, 1, self.queryRows) + tdLog.exit("%s(%d) failed: sql:%s, row:%d is larger than queryRows:%d" % args) - def check_result_in_range(self, row, col): - res = tdSql.res[row][col] - if res < 0 or res >= 1: + tdSql.error("select rand(3.14);") + tdSql.error("select rand(-3.14);") + tdSql.error("select rand('');") + tdSql.error("select rand('hello');") + + def check_rand_data_range(self, data, row): + if data < 0 or data >= 1: caller = inspect.getframeinfo(inspect.stack()[1][0]) - args = (caller.filename, caller.lineno, tdSql.sql, row, col, res) - tdLog.exit("%s(%d) failed: sql:%s row:%s col:%s data:%s lt 0 or ge 1" % args) + args = (caller.filename, caller.lineno, self.sql, row+1, self.queryRows) + tdLog.exit("%s(%d) failed: sql:%s, row:%d is larger than queryRows:%d" % args) def test_max(self): - self.test_normal_query("max") + self.test_normal_query_new("max") - tdSql.query("select max(null) from ts_4893.meters;") - tdSql.checkRows(1) - tdSql.checkCols(1) - tdSql.checkData(0, 0, 'None') - - tdSql.query("select max(id) from ts_4893.meters;") - tdSql.checkRows(1) - - tdSql.query("select max(name) from ts_4893.meters;") - tdSql.checkRows(1) - - tdSql.query("select max(current) from ts_4893.meters;") - tdSql.checkRows(1) - - tdSql.query("select max(nch1) from ts_4893.meters;") - tdSql.checkRows(1) - - tdSql.query("select max(var1) from ts_4893.meters;") - tdSql.checkRows(1) + tdSql.error("select max(nonexistent_column) from ts_4893.meters;") def test_min(self): - self.test_normal_query("min") + self.test_normal_query_new("min") - tdSql.query("select min(null) from ts_4893.meters;") - tdSql.checkRows(1) - tdSql.checkCols(1) - tdSql.checkData(0, 0, 'None') + tdSql.error("select min(nonexistent_column) from ts_4893.meters;") - tdSql.query("select min(id) from ts_4893.meters;") - tdSql.checkRows(1) + def test_error(self): + tdSql.error("select * from (select to_iso8601(ts, timezone()), timezone() from ts_4893.meters \ + order by ts desc) limit 1000;", expectErrInfo="Not supported timzone format") # TS-5340 - tdSql.query("select min(name) from ts_4893.meters;") - tdSql.checkRows(1) - - tdSql.query("select min(current) from ts_4893.meters;") - tdSql.checkRows(1) - - tdSql.query("select min(nch1) from ts_4893.meters;") - tdSql.checkRows(1) - - tdSql.query("select min(var1) from ts_4893.meters;") - tdSql.checkRows(1) - - # run def run(self): tdLog.debug(f"start to excute {__file__}") - # insert data - self.insertData() + self.insert_data() # math function self.test_pi() self.test_round() self.test_exp() - self.test_trunc() + self.test_truncate() self.test_ln() self.test_mod() self.test_sign() @@ -648,7 +334,7 @@ class TDTestCase(TBase): self.test_dayofweek() # agg function - self.test_stddev() + self.test_stddev_pop() self.test_varpop() # select function diff --git a/tests/army/storage/blob/ablob.py b/tests/army/storage/blob/ablob.py new file mode 100644 index 0000000000..fae492a3df --- /dev/null +++ b/tests/army/storage/blob/ablob.py @@ -0,0 +1,344 @@ +################################################################### +# Copyright (c) 2016 by TAOS Technologies, Inc. +# All rights reserved. +# +# This file is proprietary and confidential to TAOS Technologies. +# No part of this file may be reproduced, stored, transmitted, +# disclosed or used in any form or by any means other than as +# expressly provided by the written permission from Jianhui Tao +# +################################################################### + +# -*- coding: utf-8 -*- + +import sys +import time +import random + +import taos +import frame +import frame.etool +import frame.eos +import frame.eutil + +from frame.log import * +from frame.cases import * +from frame.sql import * +from frame.caseBase import * +from frame.srvCtl import * +from frame import * +from frame.eos import * + + +class TDTestCase(TBase): + index = eutil.cpuRand(20) + 1 + bucketName = f"ci-bucket{index}" + updatecfgDict = { + "supportVnodes":"1000", + 's3EndPoint': 'https://.blob.core.windows.net', + 's3AccessKey': ':', + 's3BucketName': '', + 's3PageCacheSize': '10240', + "s3UploadDelaySec": "10", + 's3MigrateIntervalSec': '600', + 's3MigrateEnabled': '1' + } + + tdLog.info(f"assign bucketName is {bucketName}\n") + maxFileSize = (128 + 10) * 1014 * 1024 # add 10M buffer + + def insertData(self): + tdLog.info(f"insert data.") + # taosBenchmark run + json = etool.curFile(__file__, "s3Basic.json") + etool.benchMark(json=json) + + tdSql.execute(f"use {self.db}") + # come from s3_basic.json + self.childtable_count = 6 + self.insert_rows = 2000000 + self.timestamp_step = 100 + + def createStream(self, sname): + sql = f"create stream {sname} fill_history 1 into stm1 as select count(*) from {self.db}.{self.stb} interval(10s);" + tdSql.execute(sql) + + def migrateDbS3(self): + sql = f"s3migrate database {self.db}" + tdSql.execute(sql, show=True) + + def checkDataFile(self, lines, maxFileSize): + # ls -l + # -rwxrwxrwx 1 root root 41652224 Apr 17 14:47 vnode2/tsdb/v2f1974ver47.3.data + overCnt = 0 + for line in lines: + cols = line.split() + fileSize = int(cols[4]) + fileName = cols[8] + #print(f" filesize={fileSize} fileName={fileName} line={line}") + if fileSize > maxFileSize: + tdLog.info(f"error, {fileSize} over max size({maxFileSize}) {fileName}\n") + overCnt += 1 + else: + tdLog.info(f"{fileName}({fileSize}) check size passed.") + + return overCnt + + def checkUploadToS3(self): + rootPath = sc.clusterRootPath() + cmd = f"ls -l {rootPath}/dnode*/data/vnode/vnode*/tsdb/*.data" + tdLog.info(cmd) + loop = 0 + rets = [] + overCnt = 0 + while loop < 200: + time.sleep(3) + + # check upload to s3 + rets = eos.runRetList(cmd) + cnt = len(rets) + if cnt == 0: + overCnt = 0 + tdLog.info("All data file upload to server over.") + break + overCnt = self.checkDataFile(rets, self.maxFileSize) + if overCnt == 0: + uploadOK = True + tdLog.info(f"All data files({len(rets)}) size bellow {self.maxFileSize}, check upload to s3 ok.") + break + + tdLog.info(f"loop={loop} no upload {overCnt} data files wait 3s retry ...") + if loop == 3: + sc.dnodeStop(1) + time.sleep(2) + sc.dnodeStart(1) + loop += 1 + # migrate + self.migrateDbS3() + + # check can pass + if overCnt > 0: + tdLog.exit(f"s3 have {overCnt} files over size.") + + + def doAction(self): + tdLog.info(f"do action.") + + self.flushDb(show=True) + #self.compactDb(show=True) + + # sleep 70s + self.migrateDbS3() + + # check upload to s3 + self.checkUploadToS3() + + def checkStreamCorrect(self): + sql = f"select count(*) from {self.db}.stm1" + count = 0 + for i in range(120): + tdSql.query(sql) + count = tdSql.getData(0, 0) + if count == 100000 or count == 100001: + return True + time.sleep(1) + + tdLog.exit(f"stream count is not expect . expect = 100000 or 100001 real={count} . sql={sql}") + + + def checkCreateDb(self, keepLocal, chunkSize, compact): + # keyword + kw1 = kw2 = kw3 = "" + if keepLocal is not None: + kw1 = f"s3_keeplocal {keepLocal}" + if chunkSize is not None: + kw2 = f"s3_chunksize {chunkSize}" + if compact is not None: + kw3 = f"s3_compact {compact}" + + sql = f" create database db1 vgroups 1 duration 1h {kw1} {kw2} {kw3}" + tdSql.execute(sql, show=True) + #sql = f"select name,s3_keeplocal,s3_chunksize,s3_compact from information_schema.ins_databases where name='db1';" + sql = f"select * from information_schema.ins_databases where name='db1';" + tdSql.query(sql) + # 29 30 31 -> chunksize keeplocal compact + if chunkSize is not None: + tdSql.checkData(0, 29, chunkSize) + if keepLocal is not None: + keepLocalm = keepLocal * 24 * 60 + tdSql.checkData(0, 30, f"{keepLocalm}m") + if compact is not None: + tdSql.checkData(0, 31, compact) + sql = "drop database db1" + tdSql.execute(sql) + + def checkExcept(self): + # errors + sqls = [ + f"create database db2 s3_keeplocal -1", + f"create database db2 s3_keeplocal 0", + f"create database db2 s3_keeplocal 365001", + f"create database db2 s3_chunksize -1", + f"create database db2 s3_chunksize 0", + f"create database db2 s3_chunksize 900000000", + f"create database db2 s3_compact -1", + f"create database db2 s3_compact 100", + f"create database db2 duration 1d s3_keeplocal 1d" + ] + tdSql.errors(sqls) + + + def checkBasic(self): + # create db + keeps = [1, 256, 1024, 365000, None] + chunks = [131072, 600000, 820000, 1048576, None] + comps = [0, 1, None] + + for keep in keeps: + for chunk in chunks: + for comp in comps: + self.checkCreateDb(keep, chunk, comp) + + + # --checks3 + idx = 1 + taosd = sc.taosdFile(idx) + cfg = sc.dnodeCfgPath(idx) + cmd = f"{taosd} -c {cfg} --checks3" + + eos.exe(cmd) + #output, error = eos.run(cmd) + #print(lines) + + ''' + tips = [ + "put object s3test.txt: success", + "listing bucket ci-bucket: success", + "get object s3test.txt: success", + "delete object s3test.txt: success" + ] + pos = 0 + for tip in tips: + pos = output.find(tip, pos) + #if pos == -1: + # tdLog.exit(f"checks3 failed not found {tip}. cmd={cmd} output={output}") + ''' + + # except + self.checkExcept() + + # + def preDb(self, vgroups): + cnt = int(time.time())%2 + 1 + for i in range(cnt): + vg = eutil.cpuRand(9) + 1 + sql = f"create database predb vgroups {vg}" + tdSql.execute(sql, show=True) + sql = "drop database predb" + tdSql.execute(sql, show=True) + + # history + def insertHistory(self): + tdLog.info(f"insert history data.") + # taosBenchmark run + json = etool.curFile(__file__, "s3Basic1.json") + etool.benchMark(json=json) + + # come from s3_basic.json + self.insert_rows += self.insert_rows/4 + self.timestamp_step = 50 + + # delete + def checkDelete(self): + # del 1000 rows + start = 1600000000000 + drows = 200 + for i in range(1, drows, 2): + sql = f"from {self.db}.{self.stb} where ts = {start + i*500}" + tdSql.execute("delete " + sql, show=True) + tdSql.query("select * " + sql) + tdSql.checkRows(0) + + # delete all 500 step + self.flushDb() + self.compactDb() + self.insert_rows -= drows/2 + sql = f"select count(*) from {self.db}.{self.stb}" + tdSql.checkAgg(sql, self.insert_rows * self.childtable_count) + + # delete 10W rows from 100000 + drows = 100000 + sdel = start + 100000 * self.timestamp_step + edel = start + 100000 * self.timestamp_step + drows * self.timestamp_step + sql = f"from {self.db}.{self.stb} where ts >= {sdel} and ts < {edel}" + tdSql.execute("delete " + sql, show=True) + tdSql.query("select * " + sql) + tdSql.checkRows(0) + + self.insert_rows -= drows + sql = f"select count(*) from {self.db}.{self.stb}" + tdSql.checkAgg(sql, self.insert_rows * self.childtable_count) + + + # run + def run(self): + tdLog.debug(f"start to excute {__file__}") + self.sname = "stream1" + if eos.isArm64Cpu(): + tdLog.success(f"{__file__} arm64 ignore executed") + else: + + self.preDb(10) + + # insert data + self.insertData() + + # creat stream + self.createStream(self.sname) + + # check insert data correct + #self.checkInsertCorrect() + + # save + self.snapshotAgg() + + # do action + self.doAction() + + # check save agg result correct + self.checkAggCorrect() + + # check insert correct again + self.checkInsertCorrect() + + + # check stream correct and drop stream + #self.checkStreamCorrect() + + # drop stream + self.dropStream(self.sname) + + # insert history disorder data + self.insertHistory() + + # checkBasic + self.checkBasic() + + #self.checkInsertCorrect() + self.snapshotAgg() + self.doAction() + self.checkAggCorrect() + self.checkInsertCorrect(difCnt=self.childtable_count*1499999) + self.checkDelete() + self.doAction() + + # drop database and free s3 file + self.dropDb() + + + tdLog.success(f"{__file__} successfully executed") + + + +tdCases.addLinux(__file__, TDTestCase()) +tdCases.addWindows(__file__, TDTestCase()) diff --git a/tests/army/storage/blob/s3Basic.json b/tests/army/storage/blob/s3Basic.json new file mode 100644 index 0000000000..ee341b2096 --- /dev/null +++ b/tests/army/storage/blob/s3Basic.json @@ -0,0 +1,66 @@ +{ + "filetype": "insert", + "cfgdir": "/etc/taos", + "host": "127.0.0.1", + "port": 6030, + "user": "root", + "password": "taosdata", + "connection_pool_size": 8, + "num_of_records_per_req": 4000, + "prepared_rand": 500, + "thread_count": 4, + "create_table_thread_count": 1, + "confirm_parameter_prompt": "no", + "databases": [ + { + "dbinfo": { + "name": "db", + "drop": "yes", + "vgroups": 2, + "replica": 1, + "duration":"10d", + "s3_keeplocal":"30d", + "s3_chunksize":"131072", + "tsdb_pagesize":"1", + "s3_compact":"1", + "wal_retention_size":"1", + "wal_retention_period":"1", + "flush_each_batch":"no", + "keep": "3650d" + }, + "super_tables": [ + { + "name": "stb", + "child_table_exists": "no", + "childtable_count": 6, + "insert_rows": 2000000, + "childtable_prefix": "d", + "insert_mode": "taosc", + "timestamp_step": 100, + "start_timestamp": 1600000000000, + "columns": [ + { "type": "bool", "name": "bc"}, + { "type": "float", "name": "fc" }, + { "type": "double", "name": "dc"}, + { "type": "tinyint", "name": "ti"}, + { "type": "smallint", "name": "si" }, + { "type": "int", "name": "ic" ,"max": 1,"min": 1}, + { "type": "bigint", "name": "bi" }, + { "type": "utinyint", "name": "uti"}, + { "type": "usmallint", "name": "usi"}, + { "type": "uint", "name": "ui" }, + { "type": "ubigint", "name": "ubi"}, + { "type": "binary", "name": "bin", "len": 50}, + { "type": "nchar", "name": "nch", "len": 100} + ], + "tags": [ + {"type": "tinyint", "name": "groupid","max": 10,"min": 1}, + {"name": "location","type": "binary", "len": 16, "values": + ["San Francisco", "Los Angles", "San Diego", "San Jose", "Palo Alto", "Campbell", "Mountain View","Sunnyvale", "Santa Clara", "Cupertino"] + } + ] + } + ] + } + ] +} diff --git a/tests/army/storage/blob/s3Basic1.json b/tests/army/storage/blob/s3Basic1.json new file mode 100644 index 0000000000..02be308443 --- /dev/null +++ b/tests/army/storage/blob/s3Basic1.json @@ -0,0 +1,66 @@ +{ + "filetype": "insert", + "cfgdir": "/etc/taos", + "host": "127.0.0.1", + "port": 6030, + "user": "root", + "password": "taosdata", + "connection_pool_size": 8, + "num_of_records_per_req": 5000, + "prepared_rand": 500, + "thread_count": 4, + "create_table_thread_count": 1, + "confirm_parameter_prompt": "no", + "databases": [ + { + "dbinfo": { + "name": "db", + "drop": "no", + "vgroups": 2, + "replica": 1, + "duration":"10d", + "s3_keeplocal":"30d", + "s3_chunksize":"131072", + "tsdb_pagesize":"1", + "s3_compact":"1", + "wal_retention_size":"1", + "wal_retention_period":"1", + "flush_each_batch":"no", + "keep": "3650d" + }, + "super_tables": [ + { + "name": "stb", + "child_table_exists": "yes", + "childtable_count": 6, + "insert_rows": 1000000, + "childtable_prefix": "d", + "insert_mode": "taosc", + "timestamp_step": 50, + "start_timestamp": 1600000000000, + "columns": [ + { "type": "bool", "name": "bc"}, + { "type": "float", "name": "fc" }, + { "type": "double", "name": "dc"}, + { "type": "tinyint", "name": "ti"}, + { "type": "smallint", "name": "si" }, + { "type": "int", "name": "ic" ,"max": 1,"min": 1}, + { "type": "bigint", "name": "bi" }, + { "type": "utinyint", "name": "uti"}, + { "type": "usmallint", "name": "usi"}, + { "type": "uint", "name": "ui" }, + { "type": "ubigint", "name": "ubi"}, + { "type": "binary", "name": "bin", "len": 50}, + { "type": "nchar", "name": "nch", "len": 100} + ], + "tags": [ + {"type": "tinyint", "name": "groupid","max": 10,"min": 1}, + {"name": "location","type": "binary", "len": 16, "values": + ["San Francisco", "Los Angles", "San Diego", "San Jose", "Palo Alto", "Campbell", "Mountain View","Sunnyvale", "Santa Clara", "Cupertino"] + } + ] + } + ] + } + ] +} diff --git a/tests/ci/scan_file_path.py b/tests/ci/scan_file_path.py index 2d4e701012..9244d37456 100644 --- a/tests/ci/scan_file_path.py +++ b/tests/ci/scan_file_path.py @@ -129,7 +129,7 @@ def scan_files_path(source_file_path): def input_files(change_files): # scan_dir_list = ["source", "include", "docs/examples", "tests/script/api", "src/plugins"] scan_dir_list = ["source", "include", "docs/examples", "src/plugins"] - scan_skip_file_list = [f"{TD_project_path}/TDinternal/community/tools/taosws-rs/target/release/build/openssl-sys-7811e597b848e397/out/openssl-build/install/include/openssl", "/test/", "contrib", "debug", "deps", f"{TD_project_path}/TDinternal/community/source/libs/parser/src/sql.c", f"{TD_project_path}/TDinternal/community/source/client/jni/windows/win32/bridge/AccessBridgeCalls.c"] + scan_skip_file_list = ["tools/taosws-rs/target/release/build/openssl-sys-7811e597b848e397/out/openssl-build/install/include/openssl", "/test/", "contrib", "debug", "deps", "source/libs/parser/src/sql.c", "source/libs/azure", "source/client/jni/windows/win32/bridge/AccessBridgeCalls.c"] with open(change_files, 'r') as file: for line in file: file_name = line.strip() @@ -141,7 +141,7 @@ def input_files(change_files): tdc_file_path = os.path.join(TD_project_path, "community/") file_name = os.path.join(tdc_file_path, file_name) all_file_path.append(file_name) - # print(f"all_file_path:{all_file_path}") + print(f"all_file_path:{all_file_path}") logger.info("Found %s files" % len(all_file_path)) file_res_path = "" diff --git a/tests/develop-test/2-query/show_create_db.py b/tests/develop-test/2-query/show_create_db.py index d7d093aa78..b77e744df2 100644 --- a/tests/develop-test/2-query/show_create_db.py +++ b/tests/develop-test/2-query/show_create_db.py @@ -42,17 +42,17 @@ class TDTestCase: tdSql.query('show create database scd;') tdSql.checkRows(1) tdSql.checkData(0, 0, 'scd') - tdSql.checkData(0, 1, "CREATE DATABASE `scd` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 2 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKSIZE 262144 S3_KEEPLOCAL 5256000m S3_COMPACT 0") + tdSql.checkData(0, 1, "CREATE DATABASE `scd` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 2 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKSIZE 262144 S3_KEEPLOCAL 525600m S3_COMPACT 1") tdSql.query('show create database scd2;') tdSql.checkRows(1) tdSql.checkData(0, 0, 'scd2') - tdSql.checkData(0, 1, "CREATE DATABASE `scd2` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 3 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKSIZE 262144 S3_KEEPLOCAL 5256000m S3_COMPACT 0") + tdSql.checkData(0, 1, "CREATE DATABASE `scd2` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 3 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKSIZE 262144 S3_KEEPLOCAL 525600m S3_COMPACT 1") tdSql.query('show create database scd4') tdSql.checkRows(1) tdSql.checkData(0, 0, 'scd4') - tdSql.checkData(0, 1, "CREATE DATABASE `scd4` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 13 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKSIZE 262144 S3_KEEPLOCAL 5256000m S3_COMPACT 0") + tdSql.checkData(0, 1, "CREATE DATABASE `scd4` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 13 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKSIZE 262144 S3_KEEPLOCAL 525600m S3_COMPACT 1") self.restartTaosd(1, dbname='scd') @@ -60,16 +60,16 @@ class TDTestCase: tdSql.query('show create database scd;') tdSql.checkRows(1) tdSql.checkData(0, 0, 'scd') - tdSql.checkData(0, 1, "CREATE DATABASE `scd` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 2 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKSIZE 262144 S3_KEEPLOCAL 5256000m S3_COMPACT 0") + tdSql.checkData(0, 1, "CREATE DATABASE `scd` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 2 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKSIZE 262144 S3_KEEPLOCAL 525600m S3_COMPACT 1") tdSql.query('show create database scd2;') tdSql.checkRows(1) tdSql.checkData(0, 0, 'scd2') - tdSql.checkData(0, 1, "CREATE DATABASE `scd2` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 3 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKSIZE 262144 S3_KEEPLOCAL 5256000m S3_COMPACT 0") + tdSql.checkData(0, 1, "CREATE DATABASE `scd2` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 3 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKSIZE 262144 S3_KEEPLOCAL 525600m S3_COMPACT 1") tdSql.query('show create database scd4') tdSql.checkRows(1) tdSql.checkData(0, 0, 'scd4') - tdSql.checkData(0, 1, "CREATE DATABASE `scd4` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 13 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKSIZE 262144 S3_KEEPLOCAL 5256000m S3_COMPACT 0") + tdSql.checkData(0, 1, "CREATE DATABASE `scd4` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 13 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKSIZE 262144 S3_KEEPLOCAL 525600m S3_COMPACT 1") tdSql.execute('drop database scd') diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index cfe88138ef..09216add82 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -223,6 +223,7 @@ ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_group_NotReturnValue.py -Q 2 ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_group_NotReturnValue.py -Q 3 ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_group_NotReturnValue.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/td-32548.py ,,y,system-test,./pytest.sh python3 ./test.py -f 3-enterprise/restore/restoreDnode.py -N 5 -M 3 -i False ,,y,system-test,./pytest.sh python3 ./test.py -f 3-enterprise/restore/restoreVnode.py -N 5 -M 3 -i False @@ -1254,7 +1255,7 @@ ,,y,script,./test.sh -f tsim/query/unionall_as_table.sim ,,y,script,./test.sh -f tsim/query/multi_order_by.sim ,,y,script,./test.sh -f tsim/query/sys_tbname.sim -,,y,script,./test.sh -f tsim/query/sort-pre-cols.sim +,,y,script,./test.sh -f tsim/query/sort-pre-cols.sim ,,y,script,./test.sh -f tsim/query/groupby.sim ,,y,script,./test.sh -f tsim/query/groupby_distinct.sim ,,y,script,./test.sh -f tsim/query/event.sim @@ -1262,7 +1263,7 @@ ,,y,script,./test.sh -f tsim/query/emptyTsRange.sim ,,y,script,./test.sh -f tsim/query/emptyTsRange_scl.sim ,,y,script,./test.sh -f tsim/query/partitionby.sim -,,y,script,./test.sh -f tsim/query/tableCount.sim +,,y,script,./test.sh -f tsim/query/tableCount.sim ,,y,script,./test.sh -f tsim/query/show_db_table_kind.sim ,,y,script,./test.sh -f tsim/query/bi_star_table.sim ,,y,script,./test.sh -f tsim/query/bi_tag_scan.sim @@ -1532,8 +1533,8 @@ ,,n,script,./test.sh -f tsim/tagindex/sma_and_tag_index.sim ,,y,script,./test.sh -f tsim/tagindex/indexOverflow.sim ,,y,script,./test.sh -f tsim/view/view.sim -,,y,script,./test.sh -f tsim/query/cache_last.sim -,,y,script,./test.sh -f tsim/query/const.sim +,,y,script,./test.sh -f tsim/query/cache_last.sim +,,y,script,./test.sh -f tsim/query/const.sim ,,y,script,./test.sh -f tsim/query/nestedJoinView.sim @@ -1566,4 +1567,3 @@ ,,n,docs-examples-test,bash rust.sh ,,n,docs-examples-test,bash go.sh ,,n,docs-examples-test,bash test_R.sh - diff --git a/tests/pytest/util/sql.py b/tests/pytest/util/sql.py index 3bc784063e..1d3333264a 100644 --- a/tests/pytest/util/sql.py +++ b/tests/pytest/util/sql.py @@ -104,7 +104,7 @@ class TDSql: for k, v in kwargs.items(): s += f" {k} {v}" if "duration" not in kwargs: - s += " duration 300" + s += " duration 100" self.cursor.execute(s) s = f'use {dbname}' self.cursor.execute(s) diff --git a/tests/script/tsim/db/create_all_options.sim b/tests/script/tsim/db/create_all_options.sim index e402223d93..4b39829b24 100644 --- a/tests/script/tsim/db/create_all_options.sim +++ b/tests/script/tsim/db/create_all_options.sim @@ -128,6 +128,12 @@ endi if $data21_db != 3000 then # wal_fsync_period return -1 endi +if $data30_db != 525600m then # s3_keeplocal + return -1 +endi +if $data31_db != 1 then # s3_compact + return -1 +endi sql drop database db diff --git a/tests/script/tsim/insert/commit-merge0.sim b/tests/script/tsim/insert/commit-merge0.sim index da66560cbd..78dbb44d61 100644 --- a/tests/script/tsim/insert/commit-merge0.sim +++ b/tests/script/tsim/insert/commit-merge0.sim @@ -4,7 +4,7 @@ system sh/exec.sh -n dnode1 -s start sql connect print =============== create database -sql create database db duration 300 keep 365000d,365000d,365000d +sql create database db duration 120 keep 365000d,365000d,365000d sql select * from information_schema.ins_databases if $rows != 3 then return -1 diff --git a/tests/script/tsim/query/interval-offset.sim b/tests/script/tsim/query/interval-offset.sim index fe3e4c9844..50b3efdc39 100644 --- a/tests/script/tsim/query/interval-offset.sim +++ b/tests/script/tsim/query/interval-offset.sim @@ -4,7 +4,7 @@ system sh/exec.sh -n dnode1 -s start sql connect print =============== create database -sql create database d0 duration 300 +sql create database d0 duration 120 sql use d0 print =============== create super table and child table diff --git a/tests/script/tsim/scalar/caseWhen.sim b/tests/script/tsim/scalar/caseWhen.sim index c10413f23c..67c8ac3673 100644 --- a/tests/script/tsim/scalar/caseWhen.sim +++ b/tests/script/tsim/scalar/caseWhen.sim @@ -397,7 +397,7 @@ sql select case when f1 then f1 when f1 + 1 then f1 + 1 else f1 is null end from if $rows != 4 then return -1 endi -if $data00 != 1 then +if $data00 != 1.000000 then return -1 endi if $data10 != 1 then @@ -406,26 +406,26 @@ endi if $data20 != 5 then return -1 endi -if $data30 != 1 then +if $data30 != true then return -1 endi sql select case when f1 then 3 when ts then ts end from tba1; -if $rows != 4 then + if $rows != 4 then + return -1 + endi + if $data00 != 1664176501000 then return -1 -endi -if $data00 != 1664176501000 then - return -1 -endi -if $data10 != 3 then - return -1 -endi -if $data20 != 3 then - return -1 -endi -if $data30 != 1664176504000 then - return -1 -endi + endi + if $data10 != 3 then + return -1 + endi + if $data20 != 3 then + return -1 + endi + if $data30 != 1664176504000 then + return -1 + endi sql select case when 3 then f1 end from tba1; if $rows != 4 then @@ -601,7 +601,6 @@ endi if $data30 != 1.000000000 then return -1 endi - sql select sum(case f1 when f1 then f1 + 1 else f1 is null end + 1) from tba1; if $rows != 1 then return -1 @@ -660,10 +659,10 @@ endi if $data00 != 0 then return -1 endi -if $data10 != 10 then +if $data10 != 10.000000 then return -1 endi -if $data20 != 50 then +if $data20 != 50.000000 then return -1 endi if $data30 != -1 then @@ -890,19 +889,19 @@ endi if $data10 != 0 then return -1 endi -if $data11 != -99.000000000 then +if $data11 != -99.000000 then return -1 endi if $data20 != 1 then return -1 endi -if $data21 != 100.000000000 then +if $data21 != 100.000000 then return -1 endi if $data30 != 5 then return -1 endi -if $data31 != -94.000000000 then +if $data31 != -94.000000 then return -1 endi @@ -1029,13 +1028,13 @@ endi if $data00 != NULL then return -1 endi -if $data10 != -99.000000000 then +if $data10 != -99.000000 then return -1 endi -if $data20 != 1.000000000 then +if $data20 != 1 then return -1 endi -if $data30 != 5.000000000 then +if $data30 != 5 then return -1 endi @@ -1052,13 +1051,117 @@ endi if $data21 != NULL then return -1 endi -if $data31 != 101 then +if $data31 != 101.000000 then return -1 endi -if $data41 != 103 then +if $data41 != 103.000000 then return -1 endi sql_error select case when sum(f1) then sum(f1)-abs(f1) end from tba1; +sql drop database if exists test_db; +sql create database test_db vgroups 5; +sql use test_db; +sql create stable test_stable (ts TIMESTAMP,c_int INT,c_uint INT UNSIGNED, c_bigint BIGINT, c_ubigint BIGINT UNSIGNED, c_float FLOAT, c_double DOUBLE, c_binary BINARY(20), c_smallint SMALLINT, c_usmallint SMALLINT UNSIGNED, c_tinyint TINYINT,c_utinyint TINYINT UNSIGNED,c_bool BOOL,c_nchar NCHAR(20), c_varchar VARCHAR(20), c_varbinary VARBINARY(20), c_geometry GEOMETRY(50)) tags(tag_id JSON); +sql create table t_test using test_stable tags('{\"tag1\":5}'); +sql insert into t_test values ('2022-09-30 15:15:01',123,456,1234567890,9876543210,123.45,678.90,'binary_val',32767,65535,127,255,true,'涛思数据','varchar_val', '1101', 'point(10 10)'); + +sql select case when c_int > 100 then c_float else c_int end as result from t_test; +if $rows != 1 then + return -1 +endi +if $data00 != 123.449997 then + return -1 +endi + +sql select case when c_bigint > 100000 then c_double else c_bigint end as result from t_test; +if $rows != 1 then + return -1 +endi +if $data00 != 678.900000 then + return -1 +endi + +sql select case when c_bool then c_bool else c_utinyint end as result from t_test; +if $rows != 1 then + return -1 +endi +if $data00 != 1 then + return -1 +endi + +sql select case when c_smallint > 30000 then c_usmallint else c_smallint end as result from t_test; +if $rows != 1 then + return -1 +endi +if $data00 != 65535 then + return -1 +endi + +sql select case when c_binary = 'binary_val' then c_nchar else c_binary end as result from t_test; +if $rows != 1 then + return -1 +endi +if $data00 != 涛思数据 then + return -1 +endi + +sql select case when c_bool then c_int else c_bool end as result from t_test; +if $rows != 1 then + return -1 +endi +if $data00 != 123 then + return -1 +endi + +sql select case when ts > '2022-01-01 00:00:00' then c_bool else ts end as result from t_test; +if $data00 != 1 then + return -1 +endi + +sql select case when c_double > 100 then c_nchar else c_double end as result from t_test; +if $data00 != 涛思数据 then + return -1 +endi + +sql select case when c_double > 100 then c_varchar else c_double end as result from t_test; +if $data00 != varchar_val then + return -1 +endi + +sql select case when ts > '2022-01-01 00:00:00' then c_varchar else c_geometry end as result from t_test; +if $data00 != varchar_val then + return -1 +endi + +sql select case when ts > '2022-01-01 00:00:00' then c_bool else c_geometry end as result from t_test; +if $data00 != true then + return -1 +endi + +sql select case when 0 then tag_id else c_geometry end as result from t_test; +if $data00 != 16842773 then + return -1 +endi + +sql select case when 0 then tag_id else c_nchar end as result from t_test; +if $data00 != 涛思数据 then + return -1 +endi + +sql select case when 0 then tag_id else c_int end as result from t_test; +if $data00 != 123 then + return -1 +endi + +sql select case when 0 then tag_id else c_float end as result from t_test; +if $data00 != 123.449997 then + return -1 +endi + +sql_error select case when c_double > 100 then c_varbinary else c_geometry end as result from t_test; +sql_error select case when c_bool then c_double else c_varbinary end as result from t_test; +sql_error select case when c_bool then c_varbinary else c_varchar end as result from t_test; + system sh/exec.sh -n dnode1 -s stop -x SIGINT diff --git a/tests/script/tsim/sma/drop_sma.sim b/tests/script/tsim/sma/drop_sma.sim index 7121f402fa..b88fdc8955 100644 --- a/tests/script/tsim/sma/drop_sma.sim +++ b/tests/script/tsim/sma/drop_sma.sim @@ -126,21 +126,21 @@ sql drop table stb; print ========== step5 sql drop database if exists db; -sql create database db duration 300; +sql create database db duration 120; sql use db; sql create table stb1(ts timestamp, c_int int, c_bint bigint, c_sint smallint, c_tint tinyint, c_float float, c_double double, c_bool bool, c_binary binary(16), c_nchar nchar(32), c_ts timestamp, c_tint_un tinyint unsigned, c_sint_un smallint unsigned, c_int_un int unsigned, c_bint_un bigint unsigned) tags (t_int int); sql CREATE SMA INDEX sma_index_1 ON stb1 function(min(c_int), max(c_int)) interval(6m, 10s) sliding(6m) watermark 5s; print ========== step6 repeat sql drop database if exists db; -sql create database db duration 300; +sql create database db duration 120; sql use db; sql create table stb1(ts timestamp, c_int int, c_bint bigint ) tags (t_int int); sql CREATE SMA INDEX sma_index_1 ON stb1 function(min(c_int), max(c_int)) interval(6m, 10s) sliding(6m) watermark 5s; print ========== step7 sql drop database if exists db; -sql create database db duration 300; +sql create database db duration 120; sql use db; sql create table stb1(ts timestamp, c_int int, c_bint bigint, c_sint smallint, c_tint tinyint,c_float float, c_double double, c_bool bool,c_binary binary(16), c_nchar nchar(32), c_ts timestamp,c_tint_un tinyint unsigned, c_sint_un smallint unsigned,c_int_un int unsigned, c_bint_un bigint unsigned) tags (t_int int); @@ -160,7 +160,7 @@ sql DROP INDEX sma_index_3 ; print ========== step8 sql drop database if exists db; sleep 2000 -sql create database db duration 300; +sql create database db duration 120; sql use db; sql create table stb1(ts timestamp, c_int int, c_bint bigint, c_sint smallint, c_tint tinyint,c_float float, c_double double, c_bool bool,c_binary binary(16), c_nchar nchar(32), c_ts timestamp,c_tint_un tinyint unsigned, c_sint_un smallint unsigned,c_int_un int unsigned, c_bint_un bigint unsigned) tags (t_int int); diff --git a/tests/script/tsim/sma/sma_leak.sim b/tests/script/tsim/sma/sma_leak.sim index 4f2d1ebeb0..14f03541b5 100644 --- a/tests/script/tsim/sma/sma_leak.sim +++ b/tests/script/tsim/sma/sma_leak.sim @@ -98,21 +98,21 @@ sql drop table stb; print ========== step5 sql drop database if exists db; -sql create database db duration 300; +sql create database db duration 120; sql use db; sql create table stb1(ts timestamp, c_int int, c_bint bigint, c_sint smallint, c_tint tinyint, c_float float, c_double double, c_bool bool, c_binary binary(16), c_nchar nchar(32), c_ts timestamp, c_tint_un tinyint unsigned, c_sint_un smallint unsigned, c_int_un int unsigned, c_bint_un bigint unsigned) tags (t_int int); sql CREATE SMA INDEX sma_index_1 ON stb1 function(min(c_int), max(c_int)) interval(6m, 10s) sliding(6m) watermark 5s; print ========== step6 repeat sql drop database if exists db; -sql create database db duration 300; +sql create database db duration 120; sql use db; sql create table stb1(ts timestamp, c_int int, c_bint bigint ) tags (t_int int); sql CREATE SMA INDEX sma_index_1 ON stb1 function(min(c_int), max(c_int)) interval(6m, 10s) sliding(6m) watermark 5s; print ========== step7 sql drop database if exists db; -sql create database db duration 300; +sql create database db duration 120; sql use db; sql create table stb1(ts timestamp, c_int int, c_bint bigint, c_sint smallint, c_tint tinyint,c_float float, c_double double, c_bool bool,c_binary binary(16), c_nchar nchar(32), c_ts timestamp,c_tint_un tinyint unsigned, c_sint_un smallint unsigned,c_int_un int unsigned, c_bint_un bigint unsigned) tags (t_int int); @@ -131,7 +131,7 @@ sql DROP INDEX sma_index_3 ; print ========== step8 sql drop database if exists db; -sql create database db duration 300; +sql create database db duration 120; sql use db; sql create table stb1(ts timestamp, c_int int, c_bint bigint, c_sint smallint, c_tint tinyint,c_float float, c_double double, c_bool bool,c_binary binary(16), c_nchar nchar(32), c_ts timestamp,c_tint_un tinyint unsigned, c_sint_un smallint unsigned,c_int_un int unsigned, c_bint_un bigint unsigned) tags (t_int int); diff --git a/tests/system-test/0-others/compatibility.py b/tests/system-test/0-others/compatibility.py index 9ba3bd0d2f..7c3eb48fe1 100644 --- a/tests/system-test/0-others/compatibility.py +++ b/tests/system-test/0-others/compatibility.py @@ -32,7 +32,7 @@ class TDTestCase: self.replicaVar = int(replicaVar) tdLog.debug(f"start to excute {__file__}") tdSql.init(conn.cursor()) - self.deletedDataSql= '''drop database if exists deldata;create database deldata duration 300 stt_trigger 1; ;use deldata; + self.deletedDataSql= '''drop database if exists deldata;create database deldata duration 100 stt_trigger 1; ;use deldata; create table deldata.stb1 (ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp) tags (t1 int); create table deldata.ct1 using deldata.stb1 tags ( 1 ); insert into deldata.ct1 values ( now()-0s, 0, 0, 0, 0, 0.0, 0.0, 0, 'binary0', 'nchar0', now()+0a ) ( now()-10s, 1, 11111, 111, 11, 1.11, 11.11, 1, 'binary1', 'nchar1', now()+1a ) ( now()-20s, 2, 22222, 222, 22, 2.22, 22.22, 0, 'binary2', 'nchar2', now()+2a ) ( now()-30s, 3, 33333, 333, 33, 3.33, 33.33, 1, 'binary3', 'nchar3', now()+3a ); diff --git a/tests/system-test/0-others/compatibility_coverage.py b/tests/system-test/0-others/compatibility_coverage.py index 6eccf78c5a..bf76892777 100644 --- a/tests/system-test/0-others/compatibility_coverage.py +++ b/tests/system-test/0-others/compatibility_coverage.py @@ -30,7 +30,7 @@ class TDTestCase: self.replicaVar = int(replicaVar) tdLog.debug(f"start to excute {__file__}") tdSql.init(conn.cursor()) - self.deletedDataSql= '''drop database if exists deldata;create database deldata duration 300 stt_trigger 1; ;use deldata; + self.deletedDataSql= '''drop database if exists deldata;create database deldata duration 100 stt_trigger 1; ;use deldata; create table deldata.stb1 (ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp) tags (t1 int); create table deldata.ct1 using deldata.stb1 tags ( 1 ); insert into deldata.ct1 values ( now()-0s, 0, 0, 0, 0, 0.0, 0.0, 0, 'binary0', 'nchar0', now()+0a ) ( now()-10s, 1, 11111, 111, 11, 1.11, 11.11, 1, 'binary1', 'nchar1', now()+1a ) ( now()-20s, 2, 22222, 222, 22, 2.22, 22.22, 0, 'binary2', 'nchar2', now()+2a ) ( now()-30s, 3, 33333, 333, 33, 3.33, 33.33, 1, 'binary3', 'nchar3', now()+3a ); diff --git a/tests/system-test/0-others/udfTest.py b/tests/system-test/0-others/udfTest.py index 88d0d420f7..829a8aec27 100644 --- a/tests/system-test/0-others/udfTest.py +++ b/tests/system-test/0-others/udfTest.py @@ -61,7 +61,7 @@ class TDTestCase: def prepare_data(self): tdSql.execute("drop database if exists db ") - tdSql.execute("create database if not exists db duration 300") + tdSql.execute("create database if not exists db duration 100") tdSql.execute("use db") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/0-others/udf_cfg1.py b/tests/system-test/0-others/udf_cfg1.py index 913e5fcca1..a92f3bce31 100644 --- a/tests/system-test/0-others/udf_cfg1.py +++ b/tests/system-test/0-others/udf_cfg1.py @@ -63,7 +63,7 @@ class TDTestCase: def prepare_data(self): tdSql.execute("drop database if exists db ") - tdSql.execute("create database if not exists db duration 300") + tdSql.execute("create database if not exists db duration 100") tdSql.execute("use db") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/0-others/udf_cfg2.py b/tests/system-test/0-others/udf_cfg2.py index b535b4f626..89c4030977 100644 --- a/tests/system-test/0-others/udf_cfg2.py +++ b/tests/system-test/0-others/udf_cfg2.py @@ -63,7 +63,7 @@ class TDTestCase: def prepare_data(self): tdSql.execute("drop database if exists db ") - tdSql.execute("create database if not exists db duration 300") + tdSql.execute("create database if not exists db duration 100") tdSql.execute("use db") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/0-others/udf_cluster.py b/tests/system-test/0-others/udf_cluster.py index 9253be4ea3..c41412c10d 100644 --- a/tests/system-test/0-others/udf_cluster.py +++ b/tests/system-test/0-others/udf_cluster.py @@ -64,7 +64,7 @@ class TDTestCase: def prepare_data(self): tdSql.execute("drop database if exists db") - tdSql.execute("create database if not exists db replica 1 duration 300") + tdSql.execute("create database if not exists db replica 1 duration 100") tdSql.execute("use db") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/0-others/udf_create.py b/tests/system-test/0-others/udf_create.py index 6071561035..9038d99ff9 100644 --- a/tests/system-test/0-others/udf_create.py +++ b/tests/system-test/0-others/udf_create.py @@ -73,7 +73,7 @@ class TDTestCase: def prepare_data(self): tdSql.execute("drop database if exists db ") - tdSql.execute("create database if not exists db duration 300") + tdSql.execute("create database if not exists db duration 100") tdSql.execute("use db") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/0-others/udf_restart_taosd.py b/tests/system-test/0-others/udf_restart_taosd.py index 61b6a4ea68..c99e864e71 100644 --- a/tests/system-test/0-others/udf_restart_taosd.py +++ b/tests/system-test/0-others/udf_restart_taosd.py @@ -60,7 +60,7 @@ class TDTestCase: def prepare_data(self): tdSql.execute("drop database if exists db ") - tdSql.execute("create database if not exists db duration 300") + tdSql.execute("create database if not exists db duration 100") tdSql.execute("use db") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/2-query/abs.py b/tests/system-test/2-query/abs.py index 0eabd91535..db841af039 100644 --- a/tests/system-test/2-query/abs.py +++ b/tests/system-test/2-query/abs.py @@ -127,7 +127,7 @@ class TDTestCase: def prepare_tag_datas(self, dbname="testdb"): # prepare datas tdSql.execute( - f"create database if not exists {dbname} keep 3650 duration 1000 replica {self.replicaVar} ") + f"create database if not exists {dbname} keep 3650 duration 100 replica {self.replicaVar} ") tdSql.execute(" use testdb ") tdSql.execute( f'''create table {dbname}.stb1 diff --git a/tests/system-test/2-query/and_or_for_byte.py b/tests/system-test/2-query/and_or_for_byte.py index 5b2fb51998..ca9c1f2bef 100644 --- a/tests/system-test/2-query/and_or_for_byte.py +++ b/tests/system-test/2-query/and_or_for_byte.py @@ -128,7 +128,7 @@ class TDTestCase: def prepare_tag_datas(self, dbname="testdb"): # prepare datas tdSql.execute( - f"create database if not exists {dbname} keep 3650 duration 1000") + f"create database if not exists {dbname} keep 3650 duration 100") tdSql.execute(f" use {dbname} ") tdSql.execute( f'''create table {dbname}.stb1 diff --git a/tests/system-test/2-query/case_when.py b/tests/system-test/2-query/case_when.py index 1ccd2b5076..85fe43b487 100755 --- a/tests/system-test/2-query/case_when.py +++ b/tests/system-test/2-query/case_when.py @@ -231,12 +231,12 @@ class TDTestCase: 'first case when \'%d\' then \'b\' when null then %d end last' %(a1,a2) , #'first case when \'2\' then \'b\' when null then 0 end last' , 'first case when \'%d\' then \'b\' else null end last' %(a1), #'first case when \'0\' then \'b\' else null end last', 'first case when \'%d\' then \'b\' else %d end last' %(a1,a2), #'first case when \'0\' then \'b\' else 2 end last', - 'first case when q_int then q_int when q_int + (%d) then q_int + (%d) else q_int is null end last' %(a1,a2) , #'first case when q_int then q_int when q_int + 1 then q_int + 1 else q_int is null end last' , - 'first case when q_int then %d when ts then ts end last' %(a1), #'first case when q_int then 3 when ts then ts end last' , + 'first case when q_int then q_int when q_int + (%d) then cast(q_int + (%d) as int) else q_int is null end last' %(a1,a2) , #'first case when q_int then q_int when q_int + 1 then q_int + 1 else q_int is null end last' , + 'first case when q_int then %d when ts then cast(ts as int) end last' %(a1), #'first case when q_int then 3 when ts then ts end last' , 'first case when %d then q_int end last' %(a1), #'first case when 3 then q_int end last' , 'first case when q_int then %d when %d then %d end last' %(a1,a1,a3), #'first case when q_int then 3 when 1 then 2 end last' , 'first case when q_int < %d then %d when q_int >= %d then %d else %d end last' %(a1,a2,a1,a2,a3), #'first case when q_int < 3 then 1 when q_int >= 3 then 2 else 3 end last' , - 'first case when q_int is not null then case when q_int <= %d then q_int else q_int * (%d) end else -(%d) end last' %(a1,a1,a3), #'first case when q_int is not null then case when q_int <= 0 then q_int else q_int * 10 end else -1 end last' , + 'first case when q_int is not null then case when q_int <= %d then q_int else cast(q_int * (%d) as int) end else -(%d) end last' %(a1,a1,a3), #'first case when q_int is not null then case when q_int <= 0 then q_int else q_int * 10 end else -1 end last' , 'first case %d when %d then %d end last' %(a1,a2,a3), # 'first case 3 when 3 then 4 end last' , 'first case %d when %d then %d end last' %(a1,a2,a3), # 'first case 3 when 1 then 4 end last' , 'first case %d when %d then %d else %d end last' %(a1,a1,a2,a3), # 'first case 3 when 1 then 4 else 2 end last' , @@ -250,15 +250,15 @@ class TDTestCase: 'first case when \'a\' then \'b\' when null then %d end last' %(a1), # 'first case when \'a\' then \'b\' when null then 0 end last' , 'first case when \'%d\' then \'b\' when null then %d end last' %(a1,a2), # 'first case when \'2\' then \'b\' when null then 0 end last' , 'first case when %d then \'b\' else null end last' %(a1), # 'first case when 0 then \'b\' else null end last' , - 'first case when %d then \'b\' else %d+abs(%d) end last' %(a1,a2,a3), # 'first case when 0 then \'b\' else 2+abs(-2) end last' , + 'first case when %d then \'b\' else cast(%d+abs(%d) as int) end last' %(a1,a2,a3), # 'first case when 0 then \'b\' else 2+abs(-2) end last' , 'first case when %d then %d end last' %(a1,a2), # 'first case when 3 then 4 end last' , 'first case when %d then %d end last' %(a1,a2), # 'first case when 0 then 4 end last' , 'first case when null then %d end last' %(a1), # 'first case when null then 4 end last' , - #'first case when %d then %d+(%d) end last' %(a1,a2,a3), # 'first case when 1 then 4+1 end last' , + 'first case when %d then cast(%d+(%d) as int) end last' %(a1,a2,a3), # 'first case when 1 then 4+1 end last' , 'first case when %d-(%d) then %d end last' %(a1,a2,a3), # 'first case when 1-1 then 0 end last' , 'first case when %d+(%d) then %d end last' %(a1,a2,a3), # 'first case when 1+1 then 0 end last' , 'first case when abs(%d) then abs(%d) end last' %(a1,a2), # 'first case when abs(3) then abs(-1) end last' , - #'first case when abs(%d+(%d)) then abs(%d)+abs(%d) end last' %(a1,a2,a3,a1), # 'first case when abs(1+1) then abs(-1)+abs(3) end last' , + 'first case when abs(%d+(%d)) then cast(abs(%d)+abs(%d) as int) end last' %(a1,a2,a3,a1), # 'first case when abs(1+1) then abs(-1)+abs(3) end last' , 'first case when %d then %d else %d end last' %(a1,a2,a3), # 'first case when 0 then 1 else 3 end last' , 'first case when %d then %d when %d then %d else %d end last' %(a1,a2,a3,a1,a2), # 'first case when 0 then 1 when 1 then 0 else 3 end last' , 'first case when %d then %d when %d then %d when %d then %d end last' %(a1,a2,a3,a1,a2,a3), # 'first case when 0 then 1 when 1 then 0 when 2 then 3 end last' , diff --git a/tests/system-test/2-query/countAlwaysReturnValue.py b/tests/system-test/2-query/countAlwaysReturnValue.py index bced89456e..a6a064ddfd 100644 --- a/tests/system-test/2-query/countAlwaysReturnValue.py +++ b/tests/system-test/2-query/countAlwaysReturnValue.py @@ -18,7 +18,7 @@ class TDTestCase: def prepare_data(self, dbname="db"): tdSql.execute( - f"create database if not exists {dbname} keep 3650 duration 1000") + f"create database if not exists {dbname} keep 3650 duration 100") tdSql.execute(f"use {dbname} ") tdSql.execute( f"create table {dbname}.tb (ts timestamp, c0 int)" diff --git a/tests/system-test/2-query/db.py b/tests/system-test/2-query/db.py index 588609e524..cd7c5bd26e 100644 --- a/tests/system-test/2-query/db.py +++ b/tests/system-test/2-query/db.py @@ -57,11 +57,17 @@ class TDTestCase: tdSql.checkData(0, 2, 0) tdSql.query("show dnode 1 variables like '%debugFlag'") - tdSql.checkRows(23) + tdSql.checkRows(24) tdSql.query("show dnode 1 variables like '____debugFlag'") tdSql.checkRows(2) + tdSql.query("show dnode 1 variables like 's3MigrateEna%'") + tdSql.checkRows(1) + tdSql.checkData(0, 0, 1) + tdSql.checkData(0, 1, 's3MigrateEnabled') + tdSql.checkData(0, 2, 0) + def threadTest(self, threadID): print(f"Thread {threadID} starting...") tdsqln = tdCom.newTdSql() diff --git a/tests/system-test/2-query/distribute_agg_apercentile.py b/tests/system-test/2-query/distribute_agg_apercentile.py index 23ca0b9fae..0a2f7ce45f 100644 --- a/tests/system-test/2-query/distribute_agg_apercentile.py +++ b/tests/system-test/2-query/distribute_agg_apercentile.py @@ -18,7 +18,7 @@ class TDTestCase: def prepare_datas_of_distribute(self, dbname="testdb"): # prepate datas for 20 tables distributed at different vgroups - tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 1000 s3_keeplocal 3000 vgroups 5") + tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 100 s3_keeplocal 3000 vgroups 5") tdSql.execute(f" use {dbname} ") tdSql.execute( f'''create table {dbname}.stb1 diff --git a/tests/system-test/2-query/distribute_agg_avg.py b/tests/system-test/2-query/distribute_agg_avg.py index 1cd24103f8..497c3e9fac 100644 --- a/tests/system-test/2-query/distribute_agg_avg.py +++ b/tests/system-test/2-query/distribute_agg_avg.py @@ -35,7 +35,7 @@ class TDTestCase: def prepare_datas_of_distribute(self, dbname="testdb"): # prepate datas for 20 tables distributed at different vgroups - tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 1000 vgroups 5") + tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 100 vgroups 5") tdSql.execute(f" use {dbname} ") tdSql.execute( f'''create table {dbname}.stb1 diff --git a/tests/system-test/2-query/distribute_agg_count.py b/tests/system-test/2-query/distribute_agg_count.py index 7d131cd77d..fdcf270402 100644 --- a/tests/system-test/2-query/distribute_agg_count.py +++ b/tests/system-test/2-query/distribute_agg_count.py @@ -36,7 +36,7 @@ class TDTestCase: def prepare_datas_of_distribute(self, dbname="testdb"): # prepate datas for 20 tables distributed at different vgroups - tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 1000 vgroups 5") + tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 100 vgroups 5") tdSql.execute(f" use {dbname} ") tdSql.execute( f'''create table {dbname}.stb1 diff --git a/tests/system-test/2-query/distribute_agg_max.py b/tests/system-test/2-query/distribute_agg_max.py index fb91216c3e..53379ecbb3 100644 --- a/tests/system-test/2-query/distribute_agg_max.py +++ b/tests/system-test/2-query/distribute_agg_max.py @@ -38,7 +38,7 @@ class TDTestCase: def prepare_datas_of_distribute(self, dbname="testdb"): # prepate datas for 20 tables distributed at different vgroups - tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 1000 vgroups 5") + tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 100 vgroups 5") tdSql.execute(f" use {dbname} ") tdSql.execute( f'''create table {dbname}.stb1 diff --git a/tests/system-test/2-query/distribute_agg_min.py b/tests/system-test/2-query/distribute_agg_min.py index 2667798640..01bc3da4a0 100644 --- a/tests/system-test/2-query/distribute_agg_min.py +++ b/tests/system-test/2-query/distribute_agg_min.py @@ -37,7 +37,7 @@ class TDTestCase: def prepare_datas_of_distribute(self, dbname="testdb"): # prepate datas for 20 tables distributed at different vgroups - tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 1000 vgroups 5") + tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 100 vgroups 5") tdSql.execute(f" use {dbname} ") tdSql.execute( f'''create table {dbname}.stb1 diff --git a/tests/system-test/2-query/distribute_agg_spread.py b/tests/system-test/2-query/distribute_agg_spread.py index 0247a91861..8dc91f712a 100644 --- a/tests/system-test/2-query/distribute_agg_spread.py +++ b/tests/system-test/2-query/distribute_agg_spread.py @@ -37,7 +37,7 @@ class TDTestCase: def prepare_datas_of_distribute(self, dbname="testdb"): # prepate datas for 20 tables distributed at different vgroups - tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 1000 vgroups 5") + tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 100 vgroups 5") tdSql.execute(f" use {dbname}") tdSql.execute( f'''create table {dbname}.stb1 diff --git a/tests/system-test/2-query/distribute_agg_stddev.py b/tests/system-test/2-query/distribute_agg_stddev.py index 80bab3082d..f5383739ff 100644 --- a/tests/system-test/2-query/distribute_agg_stddev.py +++ b/tests/system-test/2-query/distribute_agg_stddev.py @@ -46,7 +46,7 @@ class TDTestCase: def prepare_datas_of_distribute(self, dbname="testdb"): # prepate datas for 20 tables distributed at different vgroups - tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 1000 vgroups 5") + tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 100 vgroups 5") tdSql.execute(f" use {dbname}") tdSql.execute( f'''create table {dbname}.stb1 diff --git a/tests/system-test/2-query/distribute_agg_sum.py b/tests/system-test/2-query/distribute_agg_sum.py index da26fd58f9..fbe0221dd6 100644 --- a/tests/system-test/2-query/distribute_agg_sum.py +++ b/tests/system-test/2-query/distribute_agg_sum.py @@ -35,7 +35,7 @@ class TDTestCase: def prepare_datas_of_distribute(self, dbname="testdb"): # prepate datas for 20 tables distributed at different vgroups - tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 1000 vgroups 5") + tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 100 vgroups 5") tdSql.execute(f" use {dbname}") tdSql.execute( f'''create table {dbname}.stb1 diff --git a/tests/system-test/2-query/fill_with_group.py b/tests/system-test/2-query/fill_with_group.py index 2139bbbfb3..3b98ec30ce 100644 --- a/tests/system-test/2-query/fill_with_group.py +++ b/tests/system-test/2-query/fill_with_group.py @@ -237,11 +237,123 @@ class TDTestCase: tdSql.checkData(12, 1, None) tdSql.checkData(13, 1, None) + def test_fill_with_complex_expr(self): + sql = "SELECT _wstart, _wstart + 1d, count(*), now, 1+1 FROM meters WHERE ts >= '2018-09-20 00:00:00.000' AND ts < '2018-09-20 01:00:00.000' INTERVAL(5m) FILL(NULL)" + tdSql.query(sql, queryTimes=1) + tdSql.checkRows(12) + for i in range(0, 12, 2): + tdSql.checkData(i, 2, 10) + for i in range(1, 12, 2): + tdSql.checkData(i, 2, None) + for i in range(0, 12): + firstCol = tdSql.getData(i, 0) + secondCol = tdSql.getData(i, 1) + tdLog.debug(f"firstCol: {firstCol}, secondCol: {secondCol}, secondCol - firstCol: {secondCol - firstCol}") + if secondCol - firstCol != timedelta(days=1): + tdLog.exit(f"query error: secondCol - firstCol: {secondCol - firstCol}") + nowCol = tdSql.getData(i, 3) + if nowCol is None: + tdLog.exit(f"query error: nowCol: {nowCol}") + constCol = tdSql.getData(i, 4) + if constCol != 2: + tdLog.exit(f"query error: constCol: {constCol}") + + sql = "SELECT _wstart + 1d, count(*), last(ts) + 1a, timediff(_wend, last(ts)) FROM meters WHERE ts >= '2018-09-20 00:00:00.000' AND ts < '2018-09-20 01:00:00.000' INTERVAL(5m) FILL(NULL)" + tdSql.query(sql, queryTimes=1) + tdSql.checkRows(12) + for i in range(0, 12, 2): + tdSql.checkData(i, 1, 10) + tdSql.checkData(i, 3, 300000) + for i in range(1, 12, 2): + tdSql.checkData(i, 1, None) + tdSql.checkData(i, 2, None) + tdSql.checkData(i, 3, None) + + sql = "SELECT count(*), tbname FROM meters WHERE ts >= '2018-09-20 00:00:00.000' AND ts < '2018-09-20 01:00:00.000' PARTITION BY tbname INTERVAL(5m) FILL(NULL)" + tdSql.query(sql, queryTimes=1) + tdSql.checkRows(120) + + sql = "SELECT * from (SELECT count(*), timediff(_wend, last(ts)) + t1, tbname FROM meters WHERE ts >= '2018-09-20 00:00:00.000' AND ts < '2018-09-20 01:00:00.000' PARTITION BY tbname, t1 INTERVAL(5m) FILL(NULL) LIMIT 1) order by tbname" + tdSql.query(sql, queryTimes=1) + tdSql.checkRows(10) + j = 0 + for i in range(0, 10): + tdSql.checkData(i, 1, 300000 + j) + j = j + 1 + if j == 5: + j = 0 + + sql = "SELECT count(*), timediff(_wend, last(ts)) + t1, tbname,t1 FROM meters WHERE ts >= '2018-09-20 00:00:00.000' AND ts < '2018-09-20 01:00:00.000' PARTITION BY tbname, t1 INTERVAL(5m) FILL(NULL) ORDER BY timediff(last(ts), _wstart)" + tdSql.query(sql, queryTimes=1) + tdSql.checkRows(120) + + sql = "SELECT 1+1, count(*), timediff(_wend, last(ts)) + t1 FROM meters WHERE ts >= '2018-09-20 00:00:00.000' AND ts < '2018-09-20 01:00:00.000' PARTITION BY tbname, t1 INTERVAL(5m) FILL(NULL) HAVING(timediff(last(ts), _wstart)+ t1 >= 1) ORDER BY timediff(last(ts), _wstart)" + tdSql.query(sql, queryTimes=1) + tdSql.checkRows(48) + + sql = "SELECT count(*), timediff(_wend, last(ts)) + t1, timediff('2018-09-20 01:00:00', _wstart) + t1, concat(to_char(_wstart, 'HH:MI:SS__'), tbname) FROM meters WHERE ts >= '2018-09-20 00:00:00.000' AND ts < '2018-09-20 01:00:00.000' PARTITION BY tbname, t1 INTERVAL(5m) FILL(NULL) HAVING(timediff(last(ts), _wstart) + t1 >= 1) ORDER BY timediff(last(ts), _wstart), tbname" + tdSql.query(sql, queryTimes=1) + tdSql.checkRows(48) + + sql = "SELECT count(*) FROM meters WHERE ts >= '2018-09-20 00:00:00.000' AND ts < '2018-09-20 01:00:00.000' PARTITION BY tbname, t1 INTERVAL(5m) FILL(NULL) HAVING(timediff(last(ts), _wstart) >= 0)" + tdSql.query(sql, queryTimes=1) + tdSql.checkRows(60) + + sql = "SELECT count(*) + 1 FROM meters WHERE ts >= '2018-09-20 00:00:00.000' AND ts < '2018-09-20 01:00:00.000' PARTITION BY tbname, t1 INTERVAL(5m) FILL(NULL) HAVING(count(*) > 1)" + tdSql.query(sql, queryTimes=1) + tdSql.checkRows(0) + + sql = "SELECT count(*), timediff(_wend, last(ts)) + t1, timediff('2018-09-20 01:00:00', _wstart) + t1, concat(to_char(_wstart, 'HH:MI:SS__'), tbname) FROM meters WHERE ts >= '2018-09-20 00:00:00.000' AND ts < '2018-09-20 01:00:00.000' PARTITION BY tbname, t1 INTERVAL(5m) FILL(value, 0, 0) HAVING(timediff(last(ts), _wstart) + t1 >= 1) ORDER BY timediff(last(ts), _wstart), tbname" + tdSql.query(sql, queryTimes=1) + tdSql.checkRows(48) + sql = "SELECT count(*), timediff(_wend, last(ts)) + t1, timediff('2018-09-20 01:00:00', _wstart) + t1, concat(to_char(_wstart, 'HH:MI:SS__'), tbname) FROM meters WHERE ts >= '2018-09-20 00:00:00.000' AND ts < '2018-09-20 01:00:00.000' PARTITION BY tbname, t1 INTERVAL(5m) FILL(value, 0, 0) HAVING(count(*) >= 0) ORDER BY timediff(last(ts), _wstart), tbname" + tdSql.query(sql, queryTimes=1) + tdSql.checkRows(120) + sql = "SELECT count(*), timediff(_wend, last(ts)) + t1, timediff('2018-09-20 01:00:00', _wstart) + t1, concat(to_char(_wstart, 'HH:MI:SS__'), tbname) FROM meters WHERE ts >= '2018-09-20 00:00:00.000' AND ts < '2018-09-20 01:00:00.000' PARTITION BY tbname, t1 INTERVAL(5m) FILL(value, 0, 0) HAVING(count(*) > 0) ORDER BY timediff(last(ts), _wstart), tbname" + tdSql.query(sql, queryTimes=1) + tdSql.checkRows(60) + sql = "SELECT count(*), timediff(_wend, last(ts)) + t1, timediff('2018-09-20 01:00:00', _wstart) + t1, concat(to_char(_wstart, 'HH:MI:SS__'), tbname) FROM meters WHERE ts >= '2018-09-20 00:00:00.000' AND ts < '2018-09-20 01:00:00.000' PARTITION BY tbname INTERVAL(5m) FILL(linear) HAVING(count(*) >= 0 and t1 <= 1) ORDER BY timediff(last(ts), _wstart), tbname, t1" + tdSql.query(sql, queryTimes=1) + tdSql.checkRows(44) + sql = "SELECT count(*), timediff(_wend, last(ts)) + t1, timediff('2018-09-20 01:00:00', _wstart) + t1, concat(to_char(_wstart, 'HH:MI:SS__'), tbname) FROM meters WHERE ts >= '2018-09-20 00:00:00.000' AND ts < '2018-09-20 01:00:00.000' PARTITION BY tbname INTERVAL(5m) FILL(prev) HAVING(count(*) >= 0 and t1 > 1) ORDER BY timediff(last(ts), _wstart), tbname, t1" + tdSql.query(sql, queryTimes=1) + tdSql.checkRows(72) + + sql = "SELECT 1+1, count(*), timediff(_wend, last(ts)) + t1, timediff('2018-09-20 01:00:00', _wstart) + t1, concat(to_char(_wstart, 'HH:MI:SS__'), tbname) FROM meters WHERE ts >= '2018-09-20 00:00:00.000' AND ts < '2018-09-20 01:00:00.000' PARTITION BY tbname INTERVAL(5m) FILL(linear) ORDER BY tbname, _wstart;" + tdSql.query(sql, queryTimes=1) + tdSql.checkRows(120) + for i in range(11, 120, 12): + tdSql.checkData(i, 1, None) + for i in range(0, 120): + tdSql.checkData(i, 0, 2) + + sql = "SELECT count(*), timediff(_wend, last(ts)) + t1, timediff('2018-09-20 01:00:00', _wstart) + t1, concat(to_char(_wstart, 'HH:MI:SS__'), tbname) FROM meters WHERE ts >= '2018-09-20 00:00:00.000' AND ts < '2018-09-20 01:00:00.000' PARTITION BY tbname INTERVAL(5m) FILL(linear) HAVING(count(*) >= 0) ORDER BY tbname;" + tdSql.query(sql, queryTimes=1) + tdSql.checkRows(110) + for i in range(0, 110, 11): + lastCol = tdSql.getData(i, 3) + tdLog.debug(f"lastCol: {lastCol}") + if lastCol[-1:] != str(i//11): + tdLog.exit(f"query error: lastCol: {lastCol}") + + sql = "SELECT 1+1, count(*), timediff(_wend, last(ts)) + t1, timediff('2018-09-20 01:00:00', _wstart) + t1,t1 FROM meters WHERE ts >= '2018-09-20 00:00:00.000' AND ts < '2018-09-20 01:00:00.000' PARTITION BY t1 INTERVAL(5m) FILL(linear) ORDER BY t1, _wstart;" + tdSql.query(sql, queryTimes=1) + tdSql.checkRows(60) + + sql = "SELECT 1+1, count(*), timediff(_wend, last(ts)) + t1, timediff('2018-09-20 01:00:00', _wstart) + t1,t1 FROM meters WHERE ts >= '2018-09-20 00:00:00.000' AND ts < '2018-09-20 01:00:00.000' PARTITION BY t1 INTERVAL(5m) FILL(linear) HAVING(count(*) > 0) ORDER BY t1, _wstart;" + tdSql.query(sql, queryTimes=1) + tdSql.checkRows(55) + + # TODO Fix Me! + sql = "explain SELECT count(*), timediff(_wend, last(ts)), timediff('2018-09-20 01:00:00', _wstart) FROM meters WHERE ts >= '2018-09-20 00:00:00.000' AND ts < '2018-09-20 01:00:00.000' PARTITION BY concat(tbname, 'asd') INTERVAL(5m) having(concat(tbname, 'asd') like '%asd');" + tdSql.error(sql, -2147473664) # Error: Planner internal error + def run(self): self.prepareTestEnv() self.test_partition_by_with_interval_fill_prev_new_group_fill_error() self.test_fill_with_order_by() self.test_fill_with_order_by2() + self.test_fill_with_complex_expr() def stop(self): tdSql.close() diff --git a/tests/system-test/2-query/function_null.py b/tests/system-test/2-query/function_null.py index e5056b7c56..712c98d48b 100644 --- a/tests/system-test/2-query/function_null.py +++ b/tests/system-test/2-query/function_null.py @@ -23,7 +23,7 @@ class TDTestCase: def prepare_tag_datas(self, dbname="testdb"): # prepare datas tdSql.execute( - f"create database if not exists {dbname} keep 3650 duration 1000") + f"create database if not exists {dbname} keep 3650 duration 100") tdSql.execute(f"use {dbname} ") tdSql.execute( f'''create table {dbname}.stb1 @@ -249,4 +249,4 @@ class TDTestCase: tdCases.addLinux(__file__, TDTestCase()) -tdCases.addWindows(__file__, TDTestCase()) \ No newline at end of file +tdCases.addWindows(__file__, TDTestCase()) diff --git a/tests/system-test/2-query/irate.py b/tests/system-test/2-query/irate.py index 82841541f0..69aa7f19fa 100644 --- a/tests/system-test/2-query/irate.py +++ b/tests/system-test/2-query/irate.py @@ -78,7 +78,7 @@ class TDTestCase: def prepare_tag_datas(self, dbname="testdb"): # prepare datas tdSql.execute( - f"create database if not exists {dbname} keep 3650 duration 1000") + f"create database if not exists {dbname} keep 3650 duration 100") tdSql.execute(f"use {dbname} ") tdSql.execute( f'''create table {dbname}.stb1 diff --git a/tests/system-test/2-query/join.py b/tests/system-test/2-query/join.py index c5c8f6c730..1c303b6d96 100644 --- a/tests/system-test/2-query/join.py +++ b/tests/system-test/2-query/join.py @@ -370,7 +370,7 @@ class TDTestCase: tdLog.printNoPrefix("==========step4:cross db check") dbname1 = "db1" - tdSql.execute(f"create database {dbname1} duration 432000m") + tdSql.execute(f"create database {dbname1} duration 172800m") tdSql.execute(f"use {dbname1}") self.__create_tb(dbname=dbname1) self.__insert_data(dbname=dbname1) diff --git a/tests/system-test/2-query/last_row.py b/tests/system-test/2-query/last_row.py index 395c754aa6..1534183056 100644 --- a/tests/system-test/2-query/last_row.py +++ b/tests/system-test/2-query/last_row.py @@ -61,7 +61,7 @@ class TDTestCase: def prepare_datas(self ,cache_value, dbname="db"): tdSql.execute(f"drop database if exists {dbname} ") - create_db_sql = f"create database if not exists {dbname} keep 3650 duration 1000 cachemodel {cache_value}" + create_db_sql = f"create database if not exists {dbname} keep 3650 duration 100 cachemodel {cache_value}" tdSql.execute(create_db_sql) tdSql.execute(f"use {dbname}") @@ -129,7 +129,7 @@ class TDTestCase: tdSql.execute(f"drop database if exists {dbname} ") # prepare datas - tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 1000 cachemodel {cache_value}") + tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 100 cachemodel {cache_value}") tdSql.execute(f"use {dbname} ") @@ -871,7 +871,7 @@ class TDTestCase: def initLastRowDelayTest(self, dbname="db"): tdSql.execute(f"drop database if exists {dbname} ") - create_db_sql = f"create database if not exists {dbname} keep 3650 duration 1000 cachemodel 'NONE' REPLICA 1" + create_db_sql = f"create database if not exists {dbname} keep 3650 duration 100 cachemodel 'NONE' REPLICA 1" tdSql.execute(create_db_sql) time.sleep(3) diff --git a/tests/system-test/2-query/max.py b/tests/system-test/2-query/max.py index ba6ab53fc7..5649055838 100644 --- a/tests/system-test/2-query/max.py +++ b/tests/system-test/2-query/max.py @@ -117,7 +117,7 @@ class TDTestCase: def support_distributed_aggregate(self, dbname="testdb"): # prepate datas for 20 tables distributed at different vgroups - tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 1000 vgroups 5") + tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 100 vgroups 5") tdSql.execute(f"use {dbname} ") tdSql.execute( f'''create table {dbname}.stb1 diff --git a/tests/system-test/2-query/sample.py b/tests/system-test/2-query/sample.py index a43c2e635e..efead7735b 100644 --- a/tests/system-test/2-query/sample.py +++ b/tests/system-test/2-query/sample.py @@ -611,7 +611,7 @@ class TDTestCase: def basic_sample_query(self, dbname="db"): tdSql.execute(f" drop database if exists {dbname} ") - tdSql.execute(f" create database if not exists {dbname} duration 300d ") + tdSql.execute(f" create database if not exists {dbname} duration 120d ") tdSql.execute( f'''create table {dbname}.stb1 (ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp) diff --git a/tests/system-test/2-query/td-32548.py b/tests/system-test/2-query/td-32548.py new file mode 100644 index 0000000000..45611b8372 --- /dev/null +++ b/tests/system-test/2-query/td-32548.py @@ -0,0 +1,32 @@ +from util.cases import * +from util.sql import * + +class TDTestCase: + def init(self, conn, logSql, replicaVar=1): + tdLog.debug("start to execute %s" % __file__) + tdSql.init(conn.cursor(), True) + + tdSql.execute("drop database if exists td_32548;") + tdSql.execute("create database td_32548 cachemodel 'last_row' keep 3650,3650,3650;") + + def run(self): + tdSql.execute("use td_32548;") + + tdSql.execute("create table ntb1 (ts timestamp, ival int);") + tdSql.execute("insert into ntb1 values ('2024-07-08 17:54:49.675', 54);") + + tdSql.execute("flush database td_32548;") + + tdSql.execute("insert into ntb1 values ('2024-07-08 17:53:49.675', 53);") + tdSql.execute("insert into ntb1 values ('2024-07-08 17:52:49.675', 52);") + tdSql.execute("delete from ntb1 where ts = '2024-07-08 17:54:49.675';") + + tdSql.query('select last_row(ts) from ntb1;') + tdSql.checkData(0, 0, '2024-07-08 17:53:49.675') + + def stop(self): + tdSql.close() + tdLog.success(f"{__file__} successfully executed") + +tdCases.addLinux(__file__, TDTestCase()) +tdCases.addWindows(__file__, TDTestCase()) diff --git a/tests/system-test/2-query/tsma.py b/tests/system-test/2-query/tsma.py index f05398600b..a1638ae4cb 100644 --- a/tests/system-test/2-query/tsma.py +++ b/tests/system-test/2-query/tsma.py @@ -693,7 +693,7 @@ class TDTestCase: "======== prepare test env include database, stable, ctables, and insert data: ") paraDict = {'dbName': db, 'dropFlag': 1, - 'vgroups': 2, + 'vgroups': 4, 'stbName': 'meters', 'colPrefix': 'c', 'tagPrefix': 't', @@ -1273,6 +1273,21 @@ class TDTestCase: else: tdLog.debug(f'wait query succeed: {sql} to return {expected_row_num}, got: {tdSql.getRows()}') + def wait_query_err(self, sql: str, timeout_in_seconds: float, err): + timeout = timeout_in_seconds + while timeout > 0: + try: + tdSql.query(sql, queryTimes=1) + time.sleep(1) + timeout = timeout - 1 + except: + tdSql.error(sql, err); + break + if timeout <= 0: + tdLog.exit(f'failed to wait query: {sql} to return error timeout: {timeout_in_seconds}s') + else: + tdLog.debug(f'wait query error succeed: {sql}') + def test_drop_tsma(self): function_name = sys._getframe().f_code.co_name tdLog.debug(f'-----{function_name}------') @@ -1338,15 +1353,15 @@ class TDTestCase: self.create_tsma('tsma1', 'test', 'meters', ['avg(c1)', 'avg(c2)'], '5m') tdSql.execute('alter table test.t0 ttl 2', queryTimes=1) tdSql.execute('flush database test') - self.wait_query('show test.tables like "%t0"', 0, wait_query_seconds) + res_tb = TSMAQCBuilder().md5('1.test.tsma1_t0') + self.wait_query_err(f'desc test.`{res_tb}`', wait_query_seconds, -2147473917) # test drop multi tables tdSql.execute('drop table test.t3, test.t4') - self.wait_query('show test.tables like "%t3"', 0, wait_query_seconds) - self.wait_query('show test.tables like "%t4"', 0, wait_query_seconds) - - tdSql.query('show test.tables like "%tsma%"') - tdSql.checkRows(0) + res_tb = TSMAQCBuilder().md5('1.test.tsma1_t3') + self.wait_query_err(f'desc test.`{res_tb}`', wait_query_seconds, -2147473917) + res_tb = TSMAQCBuilder().md5('1.test.tsma1_t4') + self.wait_query_err(f'desc test.`{res_tb}`', wait_query_seconds, -2147473917) # test drop stream tdSql.error('drop stream tsma1', -2147471088) ## TSMA must be dropped first diff --git a/tests/system-test/2-query/twa.py b/tests/system-test/2-query/twa.py index 16b9779fa8..ebd439fd09 100644 --- a/tests/system-test/2-query/twa.py +++ b/tests/system-test/2-query/twa.py @@ -22,7 +22,7 @@ class TDTestCase: def prepare_datas_of_distribute(self, dbname="testdb"): # prepate datas for 20 tables distributed at different vgroups - tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 1000 vgroups 5") + tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 100 vgroups 5") tdSql.execute( f'''create table {dbname}.stb1 (ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp,c11 int UNSIGNED, c12 bigint UNSIGNED, c13 smallint UNSIGNED, c14 tinyint UNSIGNED) diff --git a/tests/system-test/6-cluster/5dnode1mnode.py b/tests/system-test/6-cluster/5dnode1mnode.py index 61451f03b1..ae093ffb90 100644 --- a/tests/system-test/6-cluster/5dnode1mnode.py +++ b/tests/system-test/6-cluster/5dnode1mnode.py @@ -110,7 +110,7 @@ class TDTestCase: tdSql.error("drop mnode on dnode 1;") tdSql.execute("drop database if exists db") - tdSql.execute("create database if not exists db replica 1 duration 300") + tdSql.execute("create database if not exists db replica 1 duration 100") tdSql.execute("use db") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/5dnode2mnode.py b/tests/system-test/6-cluster/5dnode2mnode.py index ca7d6a58d5..aa9c3fc053 100644 --- a/tests/system-test/6-cluster/5dnode2mnode.py +++ b/tests/system-test/6-cluster/5dnode2mnode.py @@ -84,7 +84,7 @@ class TDTestCase: # fisrt add data : db\stable\childtable\general table tdSql.execute("drop database if exists db2") - tdSql.execute("create database if not exists db2 replica 1 duration 300") + tdSql.execute("create database if not exists db2 replica 1 duration 100") tdSql.execute("use db2") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/5dnode3mnodeAdd1Ddnoe.py b/tests/system-test/6-cluster/5dnode3mnodeAdd1Ddnoe.py index f0f9c95566..e2cf0d3dd3 100644 --- a/tests/system-test/6-cluster/5dnode3mnodeAdd1Ddnoe.py +++ b/tests/system-test/6-cluster/5dnode3mnodeAdd1Ddnoe.py @@ -73,8 +73,8 @@ class TDTestCase: for couti in range(countstart,countstop): tdLog.debug("drop database if exists db%d" %couti) tdSql.execute("drop database if exists db%d" %couti, 20) - print("create database if not exists db%d replica 1 duration 300" %couti) - tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti) + print("create database if not exists db%d replica 1 duration 100" %couti) + tdSql.execute("create database if not exists db%d replica 1 duration 100" %couti) tdSql.execute("use db%d" %couti) tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/5dnode3mnodeDrop.py b/tests/system-test/6-cluster/5dnode3mnodeDrop.py index aefa7a09f8..0ac28b2d16 100644 --- a/tests/system-test/6-cluster/5dnode3mnodeDrop.py +++ b/tests/system-test/6-cluster/5dnode3mnodeDrop.py @@ -58,7 +58,7 @@ class TDTestCase: # fisrt add data : db\stable\childtable\general table for couti in count: tdSql.execute("drop database if exists db%d" %couti) - tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti) + tdSql.execute("create database if not exists db%d replica 1 duration 100" %couti) tdSql.execute("use db%d" %couti) tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/5dnode3mnodeDropInsert.py b/tests/system-test/6-cluster/5dnode3mnodeDropInsert.py index db183d80c1..26ead3dc2b 100644 --- a/tests/system-test/6-cluster/5dnode3mnodeDropInsert.py +++ b/tests/system-test/6-cluster/5dnode3mnodeDropInsert.py @@ -78,8 +78,8 @@ class TDTestCase: for couti in range(dbcountStart,dbcountStop): tdLog.debug("drop database if exists db%d" %couti) tdSql.execute("drop database if exists db%d" %couti) - print("create database if not exists db%d replica 1 duration 300" %couti) - tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti) + print("create database if not exists db%d replica 1 duration 100" %couti) + tdSql.execute("create database if not exists db%d replica 1 duration 100" %couti) tdSql.execute("use db%d" %couti) tdSql.execute( '''create table %s diff --git a/tests/system-test/6-cluster/5dnode3mnodeRecreateMnode.py b/tests/system-test/6-cluster/5dnode3mnodeRecreateMnode.py index 7af5982dec..2941a643fd 100644 --- a/tests/system-test/6-cluster/5dnode3mnodeRecreateMnode.py +++ b/tests/system-test/6-cluster/5dnode3mnodeRecreateMnode.py @@ -72,8 +72,8 @@ class TDTestCase: for couti in range(countstart,countstop): tdLog.debug("drop database if exists db%d" %couti) tdSql.execute("drop database if exists db%d" %couti) - print("create database if not exists db%d replica 1 duration 300" %couti) - tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti) + print("create database if not exists db%d replica 1 duration 100" %couti) + tdSql.execute("create database if not exists db%d replica 1 duration 100" %couti) tdSql.execute("use db%d" %couti) tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/5dnode3mnodeRestartDnodeInsertData.py b/tests/system-test/6-cluster/5dnode3mnodeRestartDnodeInsertData.py index 1691603472..1d2644c65f 100644 --- a/tests/system-test/6-cluster/5dnode3mnodeRestartDnodeInsertData.py +++ b/tests/system-test/6-cluster/5dnode3mnodeRestartDnodeInsertData.py @@ -73,8 +73,8 @@ class TDTestCase: for couti in range(countstart,countstop): tdLog.debug("drop database if exists db%d" %couti) tdSql.execute("drop database if exists db%d" %couti) - print("create database if not exists db%d replica 1 duration 300" %couti) - tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti) + print("create database if not exists db%d replica 1 duration 100" %couti) + tdSql.execute("create database if not exists db%d replica 1 duration 100" %couti) tdSql.execute("use db%d" %couti) tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/5dnode3mnodeRoll.py b/tests/system-test/6-cluster/5dnode3mnodeRoll.py index 11a153c48f..4816f976c6 100644 --- a/tests/system-test/6-cluster/5dnode3mnodeRoll.py +++ b/tests/system-test/6-cluster/5dnode3mnodeRoll.py @@ -37,7 +37,7 @@ class TDTestCase: tdSql.init(conn.cursor()) self.host = socket.gethostname() self.replicaVar = int(replicaVar) - self.deletedDataSql= '''drop database if exists deldata;create database deldata duration 300;use deldata; + self.deletedDataSql= '''drop database if exists deldata;create database deldata duration 100;use deldata; create table deldata.stb1 (ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp) tags (t1 int); create table deldata.ct1 using deldata.stb1 tags ( 1 ); insert into deldata.ct1 values ( now()-0s, 0, 0, 0, 0, 0.0, 0.0, 0, 'binary0', 'nchar0', now()+0a ) ( now()-10s, 1, 11111, 111, 11, 1.11, 11.11, 1, 'binary1', 'nchar1', now()+1a ) ( now()-20s, 2, 22222, 222, 22, 2.22, 22.22, 0, 'binary2', 'nchar2', now()+2a ) ( now()-30s, 3, 33333, 333, 33, 3.33, 33.33, 1, 'binary3', 'nchar3', now()+3a ); @@ -140,8 +140,8 @@ class TDTestCase: for couti in range(countstart,countstop): tdLog.debug("drop database if exists db%d" %couti) tdSql.execute("drop database if exists db%d" %couti) - print("create database if not exists db%d replica 1 duration 300" %couti) - tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti) + print("create database if not exists db%d replica 1 duration 100" %couti) + tdSql.execute("create database if not exists db%d replica 1 duration 100" %couti) tdSql.execute("use db%d" %couti) tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateDb.py b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateDb.py index fb62110b14..e89285c327 100644 --- a/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateDb.py +++ b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateDb.py @@ -71,8 +71,8 @@ class TDTestCase: for couti in range(countstart,countstop): tdLog.debug("drop database if exists db%d" %couti) tdSql.execute("drop database if exists db%d" %couti) - print("create database if not exists db%d replica 1 duration 300" %couti) - tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti) + print("create database if not exists db%d replica 1 duration 100" %couti) + tdSql.execute("create database if not exists db%d replica 1 duration 100" %couti) tdSql.execute("use db%d" %couti) tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeInsertData.py b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeInsertData.py index 7eaf756737..77892a1700 100644 --- a/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeInsertData.py +++ b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeInsertData.py @@ -72,8 +72,8 @@ class TDTestCase: for couti in range(countstart,countstop): tdLog.debug("drop database if exists db%d" %couti) tdSql.execute("drop database if exists db%d" %couti) - print("create database if not exists db%d replica 1 duration 300" %couti) - tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti) + print("create database if not exists db%d replica 1 duration 100" %couti) + tdSql.execute("create database if not exists db%d replica 1 duration 100" %couti) tdSql.execute("use db%d" %couti) tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeRCreateDb.py b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeRCreateDb.py index 27b15d4c99..c7af2d162f 100644 --- a/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeRCreateDb.py +++ b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeRCreateDb.py @@ -71,8 +71,8 @@ class TDTestCase: for couti in range(countstart,countstop): tdLog.debug("drop database if exists db%d" %couti) tdSql.execute("drop database if exists db%d" %couti) - print("create database if not exists db%d replica 1 duration 300" %couti) - tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti) + print("create database if not exists db%d replica 1 duration 100" %couti) + tdSql.execute("create database if not exists db%d replica 1 duration 100" %couti) tdSql.execute("use db%d" %couti) tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateStb.py b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateStb.py index 9395dd2a2b..3e20721838 100644 --- a/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateStb.py +++ b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateStb.py @@ -71,8 +71,8 @@ class TDTestCase: for couti in range(countstart,countstop): tdLog.debug("drop database if exists db%d" %couti) tdSql.execute("drop database if exists db%d" %couti) - print("create database if not exists db%d replica 1 duration 300" %couti) - tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti) + print("create database if not exists db%d replica 1 duration 100" %couti) + tdSql.execute("create database if not exists db%d replica 1 duration 100" %couti) tdSql.execute("use db%d" %couti) tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopVnodeCreateStb.py b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopVnodeCreateStb.py index 2fb196635f..adc8e8a313 100644 --- a/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopVnodeCreateStb.py +++ b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopVnodeCreateStb.py @@ -71,8 +71,8 @@ class TDTestCase: for couti in range(countstart,countstop): tdLog.debug("drop database if exists db%d" %couti) tdSql.execute("drop database if exists db%d" %couti) - print("create database if not exists db%d replica 1 duration 300" %couti) - tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti) + print("create database if not exists db%d replica 1 duration 100" %couti) + tdSql.execute("create database if not exists db%d replica 1 duration 100" %couti) tdSql.execute("use db%d" %couti) tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/5dnode3mnodeSepVnodeStopDnodeCreateUser.py b/tests/system-test/6-cluster/5dnode3mnodeSepVnodeStopDnodeCreateUser.py index bcc7edf5cb..04526971d7 100644 --- a/tests/system-test/6-cluster/5dnode3mnodeSepVnodeStopDnodeCreateUser.py +++ b/tests/system-test/6-cluster/5dnode3mnodeSepVnodeStopDnodeCreateUser.py @@ -73,8 +73,8 @@ class TDTestCase: for couti in range(countstart,countstop): tdLog.debug("drop database if exists db%d" %couti) tdSql.execute("drop database if exists db%d" %couti) - print("create database if not exists db%d replica 1 duration 300" %couti) - tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti) + print("create database if not exists db%d replica 1 duration 100" %couti) + tdSql.execute("create database if not exists db%d replica 1 duration 100" %couti) tdSql.execute("use db%d" %couti) tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/5dnode3mnodeStopInsert.py b/tests/system-test/6-cluster/5dnode3mnodeStopInsert.py index 9d2430506f..374381dc18 100644 --- a/tests/system-test/6-cluster/5dnode3mnodeStopInsert.py +++ b/tests/system-test/6-cluster/5dnode3mnodeStopInsert.py @@ -77,8 +77,8 @@ class TDTestCase: for couti in range(countstart,countstop): tdLog.debug("drop database if exists db%d" %couti) tdSql.execute("drop database if exists db%d" %couti) - tdLog.debug("create database if not exists db%d replica 1 duration 300" %couti) - tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti) + tdLog.debug("create database if not exists db%d replica 1 duration 100" %couti) + tdSql.execute("create database if not exists db%d replica 1 duration 100" %couti) tdSql.execute("use db%d" %couti) tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/manually-test/6dnode3mnodeInsertDataRebootAlterRep1-3.py b/tests/system-test/6-cluster/manually-test/6dnode3mnodeInsertDataRebootAlterRep1-3.py index 0d3b920bb4..c583149ce6 100644 --- a/tests/system-test/6-cluster/manually-test/6dnode3mnodeInsertDataRebootAlterRep1-3.py +++ b/tests/system-test/6-cluster/manually-test/6dnode3mnodeInsertDataRebootAlterRep1-3.py @@ -70,8 +70,8 @@ class TDTestCase: for couti in range(countstart,countstop): tdLog.debug("drop database if exists db%d" %couti) tdSql.execute("drop database if exists db%d" %couti) - print("create database if not exists db%d replica 1 duration 300" %couti) - tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti) + print("create database if not exists db%d replica 1 duration 100" %couti) + tdSql.execute("create database if not exists db%d replica 1 duration 100" %couti) tdSql.execute("use db%d" %couti) tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/manually-test/6dnode3mnodeInsertDatarRebootAlterRep1-3.py b/tests/system-test/6-cluster/manually-test/6dnode3mnodeInsertDatarRebootAlterRep1-3.py index 0d3b920bb4..c583149ce6 100644 --- a/tests/system-test/6-cluster/manually-test/6dnode3mnodeInsertDatarRebootAlterRep1-3.py +++ b/tests/system-test/6-cluster/manually-test/6dnode3mnodeInsertDatarRebootAlterRep1-3.py @@ -70,8 +70,8 @@ class TDTestCase: for couti in range(countstart,countstop): tdLog.debug("drop database if exists db%d" %couti) tdSql.execute("drop database if exists db%d" %couti) - print("create database if not exists db%d replica 1 duration 300" %couti) - tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti) + print("create database if not exists db%d replica 1 duration 100" %couti) + tdSql.execute("create database if not exists db%d replica 1 duration 100" %couti) tdSql.execute("use db%d" %couti) tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/manually-test/6dnode3mnodeInsertLessDataAlterRep3to1to3.py b/tests/system-test/6-cluster/manually-test/6dnode3mnodeInsertLessDataAlterRep3to1to3.py index 9ab47764c8..c817756edc 100644 --- a/tests/system-test/6-cluster/manually-test/6dnode3mnodeInsertLessDataAlterRep3to1to3.py +++ b/tests/system-test/6-cluster/manually-test/6dnode3mnodeInsertLessDataAlterRep3to1to3.py @@ -70,8 +70,8 @@ class TDTestCase: for couti in range(countstart,countstop): tdLog.debug("drop database if exists db%d" %couti) tdSql.execute("drop database if exists db%d" %couti) - print("create database if not exists db%d replica 1 duration 300" %couti) - tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti) + print("create database if not exists db%d replica 1 duration 100" %couti) + tdSql.execute("create database if not exists db%d replica 1 duration 100" %couti) tdSql.execute("use db%d" %couti) tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_createDb_replica1.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_createDb_replica1.py index 52d675208b..fb00fc0846 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_createDb_replica1.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_createDb_replica1.py @@ -83,7 +83,7 @@ class TDTestCase: def create_db_check_vgroups(self): tdSql.execute("drop database if exists test") - tdSql.execute("create database if not exists test replica 1 duration 300") + tdSql.execute("create database if not exists test replica 1 duration 100") tdSql.execute("use test") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas.py index 9cc97543ad..51923f56a9 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas.py @@ -88,7 +88,7 @@ class TDTestCase: def create_db_check_vgroups(self): tdSql.execute("drop database if exists test") - tdSql.execute("create database if not exists test replica 1 duration 300") + tdSql.execute("create database if not exists test replica 1 duration 100") tdSql.execute("use test") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas_querys.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas_querys.py index 4ea00ff2e2..6567b1024c 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas_querys.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas_querys.py @@ -89,7 +89,7 @@ class TDTestCase: def create_db_check_vgroups(self): tdSql.execute("drop database if exists test") - tdSql.execute("create database if not exists test replica 1 duration 300") + tdSql.execute("create database if not exists test replica 1 duration 100") tdSql.execute("use test") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas.py index 51da6fc723..db45582c3b 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas.py @@ -88,7 +88,7 @@ class TDTestCase: def create_db_check_vgroups(self): tdSql.execute("drop database if exists test") - tdSql.execute("create database if not exists test replica 1 duration 300") + tdSql.execute("create database if not exists test replica 1 duration 100") tdSql.execute("use test") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys.py index a111e0bab5..64809a269b 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys.py @@ -89,7 +89,7 @@ class TDTestCase: def create_db_check_vgroups(self): tdSql.execute("drop database if exists test") - tdSql.execute("create database if not exists test replica 1 duration 300") + tdSql.execute("create database if not exists test replica 1 duration 100") tdSql.execute("use test") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_all_vnode.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_all_vnode.py index 66eca7143d..3d061d4f63 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_all_vnode.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_all_vnode.py @@ -91,7 +91,7 @@ class TDTestCase: def create_db_check_vgroups(self): tdSql.execute("drop database if exists test") - tdSql.execute("create database if not exists test replica 1 duration 300") + tdSql.execute("create database if not exists test replica 1 duration 100") tdSql.execute("use test") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_follower.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_follower.py index db9139dca2..b573d8eafa 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_follower.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_follower.py @@ -91,7 +91,7 @@ class TDTestCase: def create_db_check_vgroups(self): tdSql.execute("drop database if exists test") - tdSql.execute("create database if not exists test replica 1 duration 300") + tdSql.execute("create database if not exists test replica 1 duration 100") time.sleep(3) tdSql.execute("use test") tdSql.execute( diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_leader.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_leader.py index 4fc4507c3f..049464b539 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_leader.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_leader.py @@ -91,7 +91,7 @@ class TDTestCase: def create_db_check_vgroups(self): tdSql.execute("drop database if exists test") - tdSql.execute("create database if not exists test replica 1 duration 300") + tdSql.execute("create database if not exists test replica 1 duration 100") tdSql.execute("use test") time.sleep(3) tdSql.execute( diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_sync.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_sync.py index eb77c6d003..b5db868e68 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_sync.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_sync.py @@ -97,7 +97,7 @@ class TDTestCase: def create_db_check_vgroups(self): tdSql.execute("drop database if exists test") - tdSql.execute("create database if not exists test replica 1 duration 300") + tdSql.execute("create database if not exists test replica 1 duration 100") tdSql.execute("use test") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync.py index 9079bedb7c..31b8fd2326 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync.py @@ -97,7 +97,7 @@ class TDTestCase: def create_db_check_vgroups(self): tdSql.execute("drop database if exists test") - tdSql.execute("create database if not exists test replica 1 duration 300") + tdSql.execute("create database if not exists test replica 1 duration 100") tdSql.execute("use test") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync_force_stop.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync_force_stop.py index 35cbceb268..d7a161263e 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync_force_stop.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync_force_stop.py @@ -97,7 +97,7 @@ class TDTestCase: def create_db_check_vgroups(self): tdSql.execute("drop database if exists test") - tdSql.execute("create database if not exists test replica 1 duration 300") + tdSql.execute("create database if not exists test replica 1 duration 100") tdSql.execute("use test") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_leader_forece_stop.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_leader_forece_stop.py index bf2ebadd06..82c9dbf86c 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_leader_forece_stop.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_leader_forece_stop.py @@ -180,7 +180,7 @@ class TDTestCase: def create_db_check_vgroups(self): tdSql.execute("drop database if exists test") - tdSql.execute("create database if not exists test replica 1 duration 300") + tdSql.execute("create database if not exists test replica 1 duration 100") tdSql.execute("use test") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_mnode3_insertdatas_querys.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_mnode3_insertdatas_querys.py index 25aba29235..7f8c75fa03 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_mnode3_insertdatas_querys.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_mnode3_insertdatas_querys.py @@ -89,7 +89,7 @@ class TDTestCase: def create_db_check_vgroups(self): tdSql.execute("drop database if exists test") - tdSql.execute("create database if not exists test replica 1 duration 300") + tdSql.execute("create database if not exists test replica 1 duration 100") tdSql.execute("use test") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups.py index 45ceb73059..4f3b2e2def 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups.py @@ -88,7 +88,7 @@ class TDTestCase: def create_db_check_vgroups(self): tdSql.execute("drop database if exists test") - tdSql.execute("create database if not exists test replica 1 duration 300") + tdSql.execute("create database if not exists test replica 1 duration 100") tdSql.execute("use test") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups_stopOne.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups_stopOne.py index 3f72f33951..e136517a4f 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups_stopOne.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups_stopOne.py @@ -91,7 +91,7 @@ class TDTestCase: def create_db_check_vgroups(self): tdSql.execute("drop database if exists test") - tdSql.execute("create database if not exists test replica 1 duration 300") + tdSql.execute("create database if not exists test replica 1 duration 100") tdSql.execute("use test") tdSql.execute( '''create table stb1 diff --git a/tests/system-test/test.py b/tests/system-test/test.py index 9defcd083a..fb3357a2b9 100644 --- a/tests/system-test/test.py +++ b/tests/system-test/test.py @@ -24,6 +24,8 @@ import platform import socket import threading import importlib +print(f"Python version: {sys.version}") +print(f"Version info: {sys.version_info}") import toml sys.path.append("../pytest") @@ -687,6 +689,6 @@ if __name__ == "__main__": if conn is not None: conn.close() if asan: - # tdDnodes.StopAllSigint() + #tdDnodes.StopAllSigint() tdLog.info("Address sanitizer mode finished") sys.exit(0) diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 29aacd6bce..5e93be695d 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -1,21 +1,23 @@ -IF (TD_WEBSOCKET) - IF (TD_LINUX) +IF(TD_WEBSOCKET) + IF(TD_LINUX) SET(websocket_lib_file "libtaosws.so") - ELSEIF (TD_DARWIN) + ELSEIF(TD_DARWIN) SET(websocket_lib_file "libtaosws.dylib") - ENDIF () + ENDIF() + MESSAGE("${Green} use libtaos-ws${ColourReset}") - IF (TD_ALPINE) + + IF(TD_ALPINE) include(ExternalProject) ExternalProject_Add(taosws-rs - PREFIX "taosws-rs" - SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/taosws-rs - BUILD_ALWAYS off - DEPENDS taos - BUILD_IN_SOURCE 1 + PREFIX "taosws-rs" + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/taosws-rs + BUILD_ALWAYS off + DEPENDS taos + BUILD_IN_SOURCE 1 CONFIGURE_COMMAND cmake -E echo "taosws-rs no need cmake to config" PATCH_COMMAND - COMMAND git clean -f -d + COMMAND git clean -f -d BUILD_COMMAND COMMAND cargo update COMMAND RUSTFLAGS=-Ctarget-feature=-crt-static cargo build --release -p taos-ws-sys --features rustls @@ -23,18 +25,18 @@ IF (TD_WEBSOCKET) COMMAND cp target/release/${websocket_lib_file} ${CMAKE_BINARY_DIR}/build/lib COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/build/include COMMAND cmake -E copy target/release/taosws.h ${CMAKE_BINARY_DIR}/build/include - ) - ELSEIF (TD_WINDOWS) + ) + ELSEIF(TD_WINDOWS) include(ExternalProject) ExternalProject_Add(taosws-rs - PREFIX "taosws-rs" - SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/taosws-rs - BUILD_ALWAYS off - DEPENDS taos - BUILD_IN_SOURCE 1 + PREFIX "taosws-rs" + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/taosws-rs + BUILD_ALWAYS off + DEPENDS taos + BUILD_IN_SOURCE 1 CONFIGURE_COMMAND cmake -E echo "taosws-rs no need cmake to config" PATCH_COMMAND - COMMAND git clean -f -d + COMMAND git clean -f -d BUILD_COMMAND COMMAND cargo update COMMAND cargo build --release -p taos-ws-sys --features rustls @@ -43,18 +45,18 @@ IF (TD_WEBSOCKET) COMMAND cp target/release/taosws.dll.lib ${CMAKE_BINARY_DIR}/build/lib/taosws.lib COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/build/include COMMAND cmake -E copy target/release/taosws.h ${CMAKE_BINARY_DIR}/build/include - ) + ) ELSE() include(ExternalProject) ExternalProject_Add(taosws-rs - PREFIX "taosws-rs" - SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/taosws-rs - BUILD_ALWAYS off - DEPENDS taos - BUILD_IN_SOURCE 1 + PREFIX "taosws-rs" + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/taosws-rs + BUILD_ALWAYS off + DEPENDS taos + BUILD_IN_SOURCE 1 CONFIGURE_COMMAND cmake -E echo "taosws-rs no need cmake to config" PATCH_COMMAND - COMMAND git clean -f -d + COMMAND git clean -f -d BUILD_COMMAND COMMAND cargo update COMMAND cargo build --release -p taos-ws-sys --features rustls @@ -62,11 +64,11 @@ IF (TD_WEBSOCKET) COMMAND cp target/release/${websocket_lib_file} ${CMAKE_BINARY_DIR}/build/lib COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/build/include COMMAND cmake -E copy target/release/taosws.h ${CMAKE_BINARY_DIR}/build/include - ) - ENDIF () -ENDIF () + ) + ENDIF() +ENDIF() -IF (TD_TAOS_TOOLS) +IF(TD_TAOS_TOOLS) INCLUDE_DIRECTORIES(${TD_SOURCE_DIR}/tools/taos_tools/deps/avro/lang/c/src) INCLUDE_DIRECTORIES(${TD_SOURCE_DIR}/include/client) INCLUDE_DIRECTORIES(${TD_SOURCE_DIR}/include/common) @@ -74,69 +76,74 @@ IF (TD_TAOS_TOOLS) INCLUDE_DIRECTORIES(${TD_SOURCE_DIR}/include/os) INCLUDE_DIRECTORIES(${TD_SOURCE_DIR}/include/libs/transport) ADD_SUBDIRECTORY(taos-tools) -ENDIF () +ENDIF() add_subdirectory(shell) -IF (TD_BUILD_HTTP) + +IF(TD_BUILD_HTTP) MESSAGE("") MESSAGE("${Yellow} use original embedded httpd ${ColourReset}") MESSAGE("") - # ADD_SUBDIRECTORY(http) + +# ADD_SUBDIRECTORY(http) ELSEIF(TD_BUILD_TAOSA_INTERNAL) MESSAGE("${Yellow} use taosa internal as httpd ${ColourReset}") -ELSE () +ELSE() MESSAGE("") MESSAGE("${Green} use taosadapter as httpd, platform is ${PLATFORM_ARCH_STR} ${ColourReset}") EXECUTE_PROCESS( - COMMAND git rev-parse --abbrev-ref HEAD - RESULT_VARIABLE result_taos_version - OUTPUT_VARIABLE taos_version + COMMAND git rev-parse --abbrev-ref HEAD + RESULT_VARIABLE result_taos_version + OUTPUT_VARIABLE taos_version ) STRING(FIND ${taos_version} release is_release_branch) - IF ("${is_release_branch}" STREQUAL "0") + IF("${is_release_branch}" STREQUAL "0") STRING(SUBSTRING "${taos_version}" 12 -1 taos_version) STRING(STRIP "${taos_version}" taos_version) - ELSE () + ELSE() STRING(CONCAT taos_version "_branch_" "${taos_version}") STRING(STRIP "${taos_version}" taos_version) - ENDIF () + ENDIF() + EXECUTE_PROCESS( - COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR}/taosadapter + COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR}/taosadapter ) EXECUTE_PROCESS( - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/taosadapter - COMMAND git rev-parse HEAD - RESULT_VARIABLE commit_sha1 - OUTPUT_VARIABLE taosadapter_commit_sha1 + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/taosadapter + COMMAND git rev-parse HEAD + RESULT_VARIABLE commit_sha1 + OUTPUT_VARIABLE taosadapter_commit_sha1 ) - IF ("${taosadapter_commit_sha1}" STREQUAL "") + + IF("${taosadapter_commit_sha1}" STREQUAL "") SET(taosadapter_commit_sha1 "unknown") - ELSE () -# STRING(SUBSTRING "${taosadapter_commit_sha1}" 0 7 taosadapter_commit_sha1) + ELSE() + # STRING(SUBSTRING "${taosadapter_commit_sha1}" 0 7 taosadapter_commit_sha1) STRING(STRIP "${taosadapter_commit_sha1}" taosadapter_commit_sha1) - ENDIF () + ENDIF() + SET(taos_version ${TD_VER_NUMBER}) MESSAGE("${Green} taosAdapter will use ${taos_version} and commit ${taosadapter_commit_sha1} as version ${ColourReset}") EXECUTE_PROCESS( - COMMAND cd .. + COMMAND cd .. ) MESSAGE("CURRENT SOURCE DIR ${CMAKE_CURRENT_SOURCE_DIR}") - IF (TD_WINDOWS) + IF(TD_WINDOWS) MESSAGE("Building taosAdapter on Windows") INCLUDE(ExternalProject) ExternalProject_Add(taosadapter - PREFIX "taosadapter" - SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/taosadapter - BUILD_ALWAYS off - DEPENDS taos - BUILD_IN_SOURCE 1 + PREFIX "taosadapter" + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/taosadapter + BUILD_ALWAYS off + DEPENDS taos + BUILD_IN_SOURCE 1 CONFIGURE_COMMAND cmake -E echo "taosadapter no need cmake to config" PATCH_COMMAND - COMMAND git clean -f -d + COMMAND git clean -f -d BUILD_COMMAND COMMAND set CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client COMMAND set CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib @@ -153,61 +160,64 @@ ELSE () COMMAND cmake -E copy ./example/config/taosadapter.toml ${CMAKE_BINARY_DIR}/test/cfg/ COMMAND cmake -E echo "Copy taosadapter-debug.exe" COMMAND cmake -E copy taosadapter-debug.exe ${CMAKE_BINARY_DIR}/build/bin - ) - ELSEIF (TD_DARWIN) + ) + ELSEIF(TD_DARWIN) MESSAGE("Building taosAdapter on MACOS") INCLUDE(ExternalProject) ExternalProject_Add(taosadapter - PREFIX "taosadapter" - SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/taosadapter - BUILD_ALWAYS off - DEPENDS taos - BUILD_IN_SOURCE 1 - CONFIGURE_COMMAND cmake -E echo "taosadapter no need cmake to config" - PATCH_COMMAND - COMMAND git clean -f -d - BUILD_COMMAND - COMMAND CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib go build -a -ldflags "-s -w -X 'github.com/taosdata/taosadapter/v3/version.Version=${taos_version}' -X 'github.com/taosdata/taosadapter/v3/version.CommitID=${taosadapter_commit_sha1}' -X 'github.com/taosdata/taosadapter/v3/version.BuildInfo=${TD_VER_OSTYPE}-${TD_VER_CPUTYPE} ${TD_VER_DATE}'" - COMMAND CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib go build -a -o taosadapter-debug -ldflags "-X 'github.com/taosdata/taosadapter/v3/version.Version=${taos_version}' -X 'github.com/taosdata/taosadapter/v3/version.CommitID=${taosadapter_commit_sha1}' -X 'github.com/taosdata/taosadapter/v3/version.BuildInfo=${TD_VER_OSTYPE}-${TD_VER_CPUTYPE} ${TD_VER_DATE}'" - INSTALL_COMMAND - COMMAND cmake -E echo "Copy taosadapter" - COMMAND cmake -E copy taosadapter ${CMAKE_BINARY_DIR}/build/bin - COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/test/cfg/ - COMMAND cmake -E echo "Copy taosadapter.toml" - COMMAND cmake -E copy ./example/config/taosadapter.toml ${CMAKE_BINARY_DIR}/test/cfg/ - COMMAND cmake -E copy ./taosadapter.service ${CMAKE_BINARY_DIR}/test/cfg/ - COMMAND cmake -E echo "Copy taosadapter-debug" - COMMAND cmake -E copy taosadapter-debug ${CMAKE_BINARY_DIR}/build/bin - ) - ELSE () - MESSAGE("Building taosAdapter on non-Windows") - INCLUDE(ExternalProject) - ExternalProject_Add(taosadapter - PREFIX "taosadapter" - SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/taosadapter - BUILD_ALWAYS off - DEPENDS taos - BUILD_IN_SOURCE 1 + PREFIX "taosadapter" + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/taosadapter + BUILD_ALWAYS off + DEPENDS taos + BUILD_IN_SOURCE 1 CONFIGURE_COMMAND cmake -E echo "taosadapter no need cmake to config" PATCH_COMMAND - COMMAND git clean -f -d + COMMAND git clean -f -d BUILD_COMMAND - COMMAND CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib go build -a -ldflags "-X 'github.com/taosdata/taosadapter/v3/version.Version=${taos_version}' -X 'github.com/taosdata/taosadapter/v3/version.CommitID=${taosadapter_commit_sha1}' -X 'github.com/taosdata/taosadapter/v3/version.BuildInfo=${TD_VER_OSTYPE}-${TD_VER_CPUTYPE} ${TD_VER_DATE}'" -# COMMAND CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib go build -a -o taosadapter-debug -ldflags "-X 'github.com/taosdata/taosadapter/v3/version.Version=${taos_version}' -X 'github.com/taosdata/taosadapter/v3/version.CommitID=${taosadapter_commit_sha1}' -X 'github.com/taosdata/taosadapter/v3/version.BuildInfo=${TD_VER_OSTYPE}-${TD_VER_CPUTYPE} ${TD_VER_DATE}'" + COMMAND CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib go build -a -ldflags "-s -w -X 'github.com/taosdata/taosadapter/v3/version.Version=${taos_version}' -X 'github.com/taosdata/taosadapter/v3/version.CommitID=${taosadapter_commit_sha1}' -X 'github.com/taosdata/taosadapter/v3/version.BuildInfo=${TD_VER_OSTYPE}-${TD_VER_CPUTYPE} ${TD_VER_DATE}'" + COMMAND CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib go build -a -o taosadapter-debug -ldflags "-X 'github.com/taosdata/taosadapter/v3/version.Version=${taos_version}' -X 'github.com/taosdata/taosadapter/v3/version.CommitID=${taosadapter_commit_sha1}' -X 'github.com/taosdata/taosadapter/v3/version.BuildInfo=${TD_VER_OSTYPE}-${TD_VER_CPUTYPE} ${TD_VER_DATE}'" INSTALL_COMMAND -# COMMAND cmake -E echo "Comparessing taosadapter.exe" -# COMMAND upx taosadapter || : COMMAND cmake -E echo "Copy taosadapter" COMMAND cmake -E copy taosadapter ${CMAKE_BINARY_DIR}/build/bin COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/test/cfg/ COMMAND cmake -E echo "Copy taosadapter.toml" COMMAND cmake -E copy ./example/config/taosadapter.toml ${CMAKE_BINARY_DIR}/test/cfg/ COMMAND cmake -E copy ./taosadapter.service ${CMAKE_BINARY_DIR}/test/cfg/ -# COMMAND cmake -E echo "Copy taosadapter-debug" -# COMMAND cmake -E copy taosadapter-debug ${CMAKE_BINARY_DIR}/build/bin - ) - ENDIF () -ENDIF () + COMMAND cmake -E echo "Copy taosadapter-debug" + COMMAND cmake -E copy taosadapter-debug ${CMAKE_BINARY_DIR}/build/bin + ) + ELSE() + MESSAGE("Building taosAdapter on non-Windows") + INCLUDE(ExternalProject) + ExternalProject_Add(taosadapter + PREFIX "taosadapter" + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/taosadapter + BUILD_ALWAYS off + DEPENDS taos + BUILD_IN_SOURCE 1 + CONFIGURE_COMMAND cmake -E echo "taosadapter no need cmake to config" + PATCH_COMMAND + COMMAND git clean -f -d + BUILD_COMMAND + COMMAND CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib go build -a -ldflags "-X 'github.com/taosdata/taosadapter/v3/version.Version=${taos_version}' -X 'github.com/taosdata/taosadapter/v3/version.CommitID=${taosadapter_commit_sha1}' -X 'github.com/taosdata/taosadapter/v3/version.BuildInfo=${TD_VER_OSTYPE}-${TD_VER_CPUTYPE} ${TD_VER_DATE}'" + + # COMMAND CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib go build -a -o taosadapter-debug -ldflags "-X 'github.com/taosdata/taosadapter/v3/version.Version=${taos_version}' -X 'github.com/taosdata/taosadapter/v3/version.CommitID=${taosadapter_commit_sha1}' -X 'github.com/taosdata/taosadapter/v3/version.BuildInfo=${TD_VER_OSTYPE}-${TD_VER_CPUTYPE} ${TD_VER_DATE}'" + INSTALL_COMMAND + + # COMMAND cmake -E echo "Comparessing taosadapter.exe" + # COMMAND upx taosadapter || : + COMMAND cmake -E echo "Copy taosadapter" + COMMAND cmake -E copy taosadapter ${CMAKE_BINARY_DIR}/build/bin + COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/test/cfg/ + COMMAND cmake -E echo "Copy taosadapter.toml" + COMMAND cmake -E copy ./example/config/taosadapter.toml ${CMAKE_BINARY_DIR}/test/cfg/ + COMMAND cmake -E copy ./taosadapter.service ${CMAKE_BINARY_DIR}/test/cfg/ + + # COMMAND cmake -E echo "Copy taosadapter-debug" + # COMMAND cmake -E copy taosadapter-debug ${CMAKE_BINARY_DIR}/build/bin + ) + ENDIF() +ENDIF() IF(TD_BUILD_KEEPER) MESSAGE("") diff --git a/tools/shell/CMakeLists.txt b/tools/shell/CMakeLists.txt index 0ce181808f..fd46870ac5 100644 --- a/tools/shell/CMakeLists.txt +++ b/tools/shell/CMakeLists.txt @@ -2,41 +2,41 @@ aux_source_directory(src SHELL_SRC) add_executable(shell ${SHELL_SRC}) -IF (TD_LINUX_64 AND JEMALLOC_ENABLED) +IF(TD_LINUX_64 AND JEMALLOC_ENABLED) ADD_DEFINITIONS(-DTD_JEMALLOC_ENABLED -I${CMAKE_BINARY_DIR}/build/include -L${CMAKE_BINARY_DIR}/build/lib -Wl,-rpath,${CMAKE_BINARY_DIR}/build/lib -ljemalloc) SET(LINK_JEMALLOC "-L${CMAKE_BINARY_DIR}/build/lib -ljemalloc") ADD_DEPENDENCIES(shell jemalloc) -ELSE () +ELSE() SET(LINK_JEMALLOC "") -ENDIF () +ENDIF() -IF (TD_LINUX AND TD_WEBSOCKET) +IF(TD_LINUX AND TD_WEBSOCKET) ADD_DEFINITIONS(-DWEBSOCKET -I${CMAKE_BINARY_DIR}/build/include -ltaosws) SET(LINK_WEBSOCKET "-L${CMAKE_BINARY_DIR}/build/lib -ltaosws") ADD_DEPENDENCIES(shell taosws-rs) -ELSEIF (TD_DARWIN AND TD_WEBSOCKET) +ELSEIF(TD_DARWIN AND TD_WEBSOCKET) ADD_DEFINITIONS(-DWEBSOCKET -I${CMAKE_BINARY_DIR}/build/include) SET(LINK_WEBSOCKET "${CMAKE_BINARY_DIR}/build/lib/libtaosws.dylib") ADD_DEPENDENCIES(shell taosws-rs) -ELSEIF (TD_WINDOWS AND TD_WEBSOCKET) +ELSEIF(TD_WINDOWS AND TD_WEBSOCKET) ADD_DEFINITIONS(-DWEBSOCKET -I${CMAKE_BINARY_DIR}/build/include) SET(LINK_WEBSOCKET "${CMAKE_BINARY_DIR}/build/lib/taosws.lib") ADD_DEPENDENCIES(shell taosws-rs) -ELSE () +ELSE() SET(LINK_WEBSOCKET "") -ENDIF () +ENDIF() -IF (TD_LINUX AND TD_ALPINE) +IF(TD_LINUX AND TD_ALPINE) SET(LINK_ARGP "/usr/lib/libargp.a") -ELSE () +ELSE() SET(LINK_ARGP "") -ENDIF () +ENDIF() if(TD_WINDOWS) target_link_libraries(shell PUBLIC taos_static ${LINK_WEBSOCKET}) else() target_link_libraries(shell PUBLIC taos ${LINK_WEBSOCKET} ${LINK_JEMALLOC} ${LINK_ARGP}) -endif () +endif() target_link_libraries( shell diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt index 6f0c3b5247..9872a9dc55 100644 --- a/utils/CMakeLists.txt +++ b/utils/CMakeLists.txt @@ -1,8 +1,8 @@ -#ADD_SUBDIRECTORY(examples/c) +# ADD_SUBDIRECTORY(examples/c) ADD_SUBDIRECTORY(tsim) ADD_SUBDIRECTORY(test/c) -#ADD_SUBDIRECTORY(comparisonTest/tdengine) -IF (NOT "${TSZ_ENABLED}" MATCHES "false") +# ADD_SUBDIRECTORY(comparisonTest/tdengine) +IF(NOT "${TSZ_ENABLED}" MATCHES "false") ADD_SUBDIRECTORY(TSZ) ENDIF() \ No newline at end of file diff --git a/utils/TSZ/CMakeLists.txt b/utils/TSZ/CMakeLists.txt index e3f4dce3c9..ba335fe769 100644 --- a/utils/TSZ/CMakeLists.txt +++ b/utils/TSZ/CMakeLists.txt @@ -6,22 +6,20 @@ INCLUDE_DIRECTORIES(sz/inc) INCLUDE_DIRECTORIES(zstd/) INCLUDE_DIRECTORIES(zstd/common/) - # source -AUX_SOURCE_DIRECTORY(sz/src SRC1) +AUX_SOURCE_DIRECTORY(sz/src SRC1) AUX_SOURCE_DIRECTORY(zstd/dictBuilder SRC2) -AUX_SOURCE_DIRECTORY(zstd/common SRC3) -AUX_SOURCE_DIRECTORY(zstd/compress SRC4) -AUX_SOURCE_DIRECTORY(zstd/decompress SRC5) -AUX_SOURCE_DIRECTORY(zstd/deprecated SRC6) -AUX_SOURCE_DIRECTORY(zstd/legacy SRC7) - +AUX_SOURCE_DIRECTORY(zstd/common SRC3) +AUX_SOURCE_DIRECTORY(zstd/compress SRC4) +AUX_SOURCE_DIRECTORY(zstd/decompress SRC5) +AUX_SOURCE_DIRECTORY(zstd/deprecated SRC6) +AUX_SOURCE_DIRECTORY(zstd/legacy SRC7) # archive ADD_LIBRARY(TSZ STATIC ${SRC1} ${SRC2} ${SRC3} ${SRC4} ${SRC5} ${SRC6} ${SRC7}) TARGET_INCLUDE_DIRECTORIES(TSZ PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/sz/inc ${TD_SOURCE_DIR}/include) # windows ignore warning -IF (TD_WINDOWS) - SET_TARGET_PROPERTIES(TSZ PROPERTIES COMPILE_FLAGS -w) -ENDIF () +IF(TD_WINDOWS) + SET_TARGET_PROPERTIES(TSZ PROPERTIES COMPILE_FLAGS -w) +ENDIF() diff --git a/utils/test/c/CMakeLists.txt b/utils/test/c/CMakeLists.txt index 8701f208bb..7589d11840 100644 --- a/utils/test/c/CMakeLists.txt +++ b/utils/test/c/CMakeLists.txt @@ -17,7 +17,7 @@ add_executable(varbinary_test varbinary_test.c) add_executable(replay_test replay_test.c) if(${TD_LINUX}) -add_executable(tsz_test tsz_test.c) + add_executable(tsz_test tsz_test.c) endif(${TD_LINUX}) target_link_libraries( @@ -124,7 +124,6 @@ target_link_libraries( PUBLIC common PUBLIC os PUBLIC geometry - ) target_link_libraries( @@ -144,11 +143,11 @@ target_link_libraries( ) if(${TD_LINUX}) -target_link_libraries( - tsz_test - PUBLIC taos - PUBLIC util - PUBLIC common - PUBLIC os -) + target_link_libraries( + tsz_test + PUBLIC taos + PUBLIC util + PUBLIC common + PUBLIC os + ) endif(${TD_LINUX}) \ No newline at end of file